aws-cdk 2.1005.0 → 2.1007.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 (178) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_LICENSES +86 -86
  3. package/build-info.json +2 -2
  4. package/db.json.gz +0 -0
  5. package/lib/api/aws-auth/awscli-compatible.js +9 -10
  6. package/lib/api/aws-auth/credential-plugins.js +6 -7
  7. package/lib/api/aws-auth/sdk-logger.js +3 -4
  8. package/lib/api/aws-auth/sdk-provider.js +11 -13
  9. package/lib/api/aws-auth/sdk.js +8 -9
  10. package/lib/api/aws-auth/tracing.js +3 -4
  11. package/lib/api/aws-auth/user-agent.js +4 -5
  12. package/lib/api/bootstrap/bootstrap-environment.d.ts +1 -1
  13. package/lib/api/bootstrap/bootstrap-environment.js +42 -46
  14. package/lib/api/bootstrap/bootstrap-props.d.ts +1 -1
  15. package/lib/api/bootstrap/bootstrap-props.js +1 -1
  16. package/lib/api/bootstrap/deploy-bootstrap.d.ts +1 -1
  17. package/lib/api/bootstrap/deploy-bootstrap.js +11 -14
  18. package/lib/api/{evaluate-cloudformation-template.d.ts → cloudformation/evaluate-cloudformation-template.d.ts} +4 -8
  19. package/lib/api/{evaluate-cloudformation-template.js → cloudformation/evaluate-cloudformation-template.js} +16 -25
  20. package/lib/api/cloudformation/index.d.ts +4 -0
  21. package/lib/api/cloudformation/index.js +21 -0
  22. package/lib/api/{deployments → cloudformation}/nested-stack-helpers.d.ts +3 -9
  23. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  24. package/lib/api/cloudformation/stack-helpers.d.ts +88 -0
  25. package/lib/api/cloudformation/stack-helpers.js +158 -0
  26. package/lib/api/{util → cloudformation}/template-body-parameter.d.ts +3 -2
  27. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  28. package/lib/api/context.js +3 -3
  29. package/lib/api/cxapp/cloud-assembly.d.ts +6 -4
  30. package/lib/api/cxapp/cloud-assembly.js +25 -26
  31. package/lib/api/cxapp/cloud-executable.d.ts +5 -0
  32. package/lib/api/cxapp/cloud-executable.js +9 -10
  33. package/lib/api/cxapp/environments.js +4 -4
  34. package/lib/api/cxapp/exec.d.ts +5 -4
  35. package/lib/api/cxapp/exec.js +76 -72
  36. package/lib/api/deployments/asset-publishing.d.ts +0 -2
  37. package/lib/api/deployments/asset-publishing.js +24 -31
  38. package/lib/api/deployments/assets.d.ts +1 -1
  39. package/lib/api/deployments/assets.js +12 -13
  40. package/lib/api/deployments/{cloudformation.d.ts → cfn-api.d.ts} +5 -102
  41. package/lib/api/deployments/cfn-api.js +438 -0
  42. package/lib/api/deployments/checks.d.ts +1 -1
  43. package/lib/api/deployments/checks.js +12 -13
  44. package/lib/api/deployments/deploy-stack.d.ts +2 -3
  45. package/lib/api/deployments/deploy-stack.js +34 -45
  46. package/lib/api/deployments/deployment-result.js +3 -3
  47. package/lib/api/deployments/deployments.d.ts +3 -3
  48. package/lib/api/deployments/deployments.js +35 -42
  49. package/lib/api/deployments/hotswap-deployments.d.ts +2 -2
  50. package/lib/api/deployments/hotswap-deployments.js +122 -69
  51. package/lib/api/deployments/index.d.ts +1 -2
  52. package/lib/api/deployments/index.js +2 -3
  53. package/lib/api/environment/environment-access.d.ts +2 -2
  54. package/lib/api/environment/environment-access.js +18 -20
  55. package/lib/api/environment/environment-resources.d.ts +1 -1
  56. package/lib/api/environment/environment-resources.js +17 -19
  57. package/lib/api/environment/index.d.ts +1 -0
  58. package/lib/api/environment/index.js +2 -1
  59. package/lib/api/environment/placeholders.js +23 -0
  60. package/lib/api/garbage-collection/garbage-collector.d.ts +1 -1
  61. package/lib/api/garbage-collection/garbage-collector.js +56 -66
  62. package/lib/api/garbage-collection/progress-printer.d.ts +1 -1
  63. package/lib/api/garbage-collection/progress-printer.js +7 -7
  64. package/lib/api/garbage-collection/stack-refresh.d.ts +1 -1
  65. package/lib/api/garbage-collection/stack-refresh.js +12 -15
  66. package/lib/api/hotswap/appsync-mapping-templates.d.ts +3 -3
  67. package/lib/api/hotswap/appsync-mapping-templates.js +25 -22
  68. package/lib/api/hotswap/code-build-projects.d.ts +3 -3
  69. package/lib/api/hotswap/code-build-projects.js +12 -7
  70. package/lib/api/hotswap/common.d.ts +13 -61
  71. package/lib/api/hotswap/common.js +40 -70
  72. package/lib/api/hotswap/ecs-services.d.ts +4 -4
  73. package/lib/api/hotswap/ecs-services.js +38 -21
  74. package/lib/api/hotswap/lambda-functions.d.ts +3 -3
  75. package/lib/api/hotswap/lambda-functions.js +23 -19
  76. package/lib/api/hotswap/s3-bucket-deployments.d.ts +3 -3
  77. package/lib/api/hotswap/s3-bucket-deployments.js +11 -7
  78. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +3 -3
  79. package/lib/api/hotswap/stepfunctions-state-machines.js +8 -4
  80. package/lib/api/logs/find-cloudwatch-logs.js +6 -7
  81. package/lib/api/logs/logs-monitor.js +5 -8
  82. package/lib/api/plugin/plugin.js +6 -10
  83. package/lib/api/resource-import/importer.d.ts +8 -8
  84. package/lib/api/resource-import/importer.js +27 -42
  85. package/lib/api/resource-import/migrator.d.ts +3 -3
  86. package/lib/api/resource-import/migrator.js +6 -6
  87. package/lib/api/settings.d.ts +0 -3
  88. package/lib/api/settings.js +4 -40
  89. package/lib/api/stack-events/stack-activity-monitor.d.ts +1 -1
  90. package/lib/api/stack-events/stack-activity-monitor.js +12 -15
  91. package/lib/api/stack-events/stack-event-poller.js +9 -10
  92. package/lib/api/toolkit-info.d.ts +2 -2
  93. package/lib/api/toolkit-info.js +20 -24
  94. package/lib/{tree.d.ts → api/tree.d.ts} +2 -2
  95. package/lib/api/tree.js +37 -0
  96. package/lib/api/util/rwlock.js +4 -4
  97. package/lib/api/work-graph/work-graph-builder.js +4 -4
  98. package/lib/api/work-graph/work-graph.d.ts +1 -1
  99. package/lib/api/work-graph/work-graph.js +13 -15
  100. package/lib/cli/activity-printer/base.d.ts +2 -2
  101. package/lib/cli/activity-printer/base.js +6 -8
  102. package/lib/cli/activity-printer/current.js +7 -11
  103. package/lib/cli/activity-printer/history.js +2 -3
  104. package/lib/cli/cdk-toolkit.d.ts +16 -19
  105. package/lib/cli/cdk-toolkit.js +118 -74
  106. package/lib/cli/ci-systems.js +2 -3
  107. package/lib/cli/cli-config.js +4 -4
  108. package/lib/cli/cli.js +49 -50
  109. package/lib/cli/convert-to-user-input.js +110 -111
  110. package/lib/{toolkit → cli/io-host}/cli-io-host.d.ts +6 -2
  111. package/lib/cli/io-host/cli-io-host.js +356 -0
  112. package/lib/cli/io-host/index.d.ts +1 -0
  113. package/lib/{toolkit/error.js → cli/io-host/index.js} +2 -2
  114. package/lib/cli/messages.d.ts +1 -1
  115. package/lib/cli/messages.js +2 -3
  116. package/lib/cli/pretty-print-error.d.ts +1 -0
  117. package/lib/cli/pretty-print-error.js +35 -0
  118. package/lib/cli/root-dir.js +4 -4
  119. package/lib/cli/user-configuration.js +57 -14
  120. package/lib/cli/util/npm.js +3 -3
  121. package/lib/cli/util/yargs-helpers.d.ts +1 -1
  122. package/lib/cli/util/yargs-helpers.js +3 -3
  123. package/lib/cli/version.js +4 -4
  124. package/lib/commands/context.js +7 -8
  125. package/lib/commands/diff.d.ts +1 -0
  126. package/lib/commands/diff.js +7 -0
  127. package/lib/commands/init/index.d.ts +1 -0
  128. package/lib/commands/init/index.js +18 -0
  129. package/lib/commands/init/init-hooks.js +63 -0
  130. package/lib/commands/init/init.js +435 -0
  131. package/lib/{os.js → commands/init/os.js} +4 -4
  132. package/lib/{list-stacks.d.ts → commands/list-stacks.d.ts} +1 -1
  133. package/lib/{list-stacks.js → commands/list-stacks.js} +2 -2
  134. package/lib/commands/migrate.js +29 -32
  135. package/lib/context-providers/ami.d.ts +3 -1
  136. package/lib/context-providers/ami.js +8 -8
  137. package/lib/context-providers/availability-zones.d.ts +3 -1
  138. package/lib/context-providers/availability-zones.js +4 -4
  139. package/lib/context-providers/cc-api-provider.d.ts +8 -12
  140. package/lib/context-providers/cc-api-provider.js +94 -66
  141. package/lib/context-providers/endpoint-service-availability-zones.d.ts +3 -1
  142. package/lib/context-providers/endpoint-service-availability-zones.js +6 -6
  143. package/lib/context-providers/hosted-zones.d.ts +3 -1
  144. package/lib/context-providers/hosted-zones.js +11 -11
  145. package/lib/context-providers/index.d.ts +19 -5
  146. package/lib/context-providers/index.js +35 -17
  147. package/lib/context-providers/keys.d.ts +3 -1
  148. package/lib/context-providers/keys.js +8 -8
  149. package/lib/context-providers/load-balancers.js +15 -18
  150. package/lib/context-providers/security-groups.js +10 -12
  151. package/lib/context-providers/ssm-parameters.d.ts +3 -1
  152. package/lib/context-providers/ssm-parameters.js +7 -7
  153. package/lib/context-providers/vpcs.d.ts +3 -1
  154. package/lib/context-providers/vpcs.js +14 -15
  155. package/lib/index.js +124098 -123198
  156. package/lib/init-templates/.init-version.json +1 -1
  157. package/lib/init-templates/.recommended-feature-flags.json +3 -1
  158. package/lib/legacy-exports-source.d.ts +4 -5
  159. package/lib/legacy-exports-source.js +6 -7
  160. package/lib/logging.js +2 -2
  161. package/lib/notices.d.ts +1 -1
  162. package/lib/notices.js +26 -32
  163. package/package.json +29 -29
  164. package/lib/api/deployments/cloudformation.js +0 -597
  165. package/lib/api/deployments/nested-stack-helpers.js +0 -88
  166. package/lib/api/util/placeholders.js +0 -24
  167. package/lib/api/util/template-body-parameter.js +0 -103
  168. package/lib/diff.d.ts +0 -28
  169. package/lib/diff.js +0 -165
  170. package/lib/init-hooks.js +0 -63
  171. package/lib/init.js +0 -437
  172. package/lib/toolkit/cli-io-host.js +0 -353
  173. package/lib/toolkit/error.d.ts +0 -1
  174. package/lib/tree.js +0 -40
  175. /package/lib/api/{util → environment}/placeholders.d.ts +0 -0
  176. /package/lib/{init-hooks.d.ts → commands/init/init-hooks.d.ts} +0 -0
  177. /package/lib/{init.d.ts → commands/init/init.d.ts} +0 -0
  178. /package/lib/{os.d.ts → commands/init/os.d.ts} +0 -0
@@ -1 +1 @@
1
- {"aws-cdk-lib": "2.181.1", "constructs": "^10.0.0"}
1
+ {"aws-cdk-lib": "2.186.0", "constructs": "^10.0.0"}
@@ -65,5 +65,7 @@
65
65
  "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": true,
66
66
  "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": true,
67
67
  "@aws-cdk/core:enableAdditionalMetadataCollection": true,
68
- "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": true
68
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": true,
69
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": true,
70
+ "@aws-cdk/aws-events:requireEventBusPolicySid": true
69
71
  }
@@ -1,5 +1,5 @@
1
1
  export * from './legacy-logging-source';
2
- export { deepClone, flatten, ifDefined, isArray, isEmpty, numberFromBool, partition, padLeft as leftPad, contentHash, deepMerge } from './util';
2
+ export { deepClone, flatten, ifDefined, isArray, isEmpty, numberFromBool, partition, padLeft as leftPad, contentHash, deepMerge, lowerCaseFirstCharacter } from './util';
3
3
  export { deployStack } from './api/deployments/deploy-stack';
4
4
  export { cli, exec } from './cli/cli';
5
5
  export { SdkProvider } from './api/aws-auth';
@@ -9,16 +9,15 @@ export { Settings } from './api/settings';
9
9
  export { Bootstrapper } from './api/bootstrap';
10
10
  export { CloudExecutable } from './api/cxapp/cloud-executable';
11
11
  export { execProgram } from './api/cxapp/exec';
12
- export { RequireApproval } from './diff';
12
+ export { RequireApproval } from './commands/diff';
13
13
  export { formatAsBanner } from './cli/util/console-formatters';
14
14
  export { setSdkTracing as enableTracing } from './api/aws-auth/tracing';
15
15
  export { aliases, command, describe } from './commands/docs';
16
- export { lowerCaseFirstCharacter } from './api/hotswap/common';
17
16
  export { Deployments } from './api/deployments';
18
17
  export { cliRootDir as rootDir } from './cli/root-dir';
19
18
  export { latestVersionIfHigher, versionNumber } from './cli/version';
20
- export { availableInitTemplates } from './init';
19
+ export { availableInitTemplates } from './commands/init';
21
20
  export { cached } from './api/aws-auth/cached';
22
- export { CfnEvaluationException } from './api/evaluate-cloudformation-template';
21
+ export { CfnEvaluationException } from './api/cloudformation/evaluate-cloudformation-template';
23
22
  export { CredentialPlugins } from './api/aws-auth/credential-plugins';
24
23
  export { AwsCliCompatible } from './api/aws-auth/awscli-compatible';
@@ -18,7 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.AwsCliCompatible = exports.CredentialPlugins = exports.CfnEvaluationException = exports.cached = exports.availableInitTemplates = exports.versionNumber = exports.latestVersionIfHigher = exports.rootDir = exports.Deployments = exports.lowerCaseFirstCharacter = exports.describe = exports.command = exports.aliases = exports.enableTracing = exports.formatAsBanner = exports.RequireApproval = exports.execProgram = exports.CloudExecutable = exports.Bootstrapper = exports.Settings = exports.PROJECT_CONTEXT = exports.Configuration = exports.Command = exports.PluginHost = exports.SdkProvider = exports.exec = exports.cli = exports.deployStack = exports.deepMerge = exports.contentHash = exports.leftPad = exports.partition = exports.numberFromBool = exports.isEmpty = exports.isArray = exports.ifDefined = exports.flatten = exports.deepClone = void 0;
21
+ exports.AwsCliCompatible = exports.CredentialPlugins = exports.CfnEvaluationException = exports.cached = exports.availableInitTemplates = exports.versionNumber = exports.latestVersionIfHigher = exports.rootDir = exports.Deployments = exports.describe = exports.command = exports.aliases = exports.enableTracing = exports.formatAsBanner = exports.RequireApproval = exports.execProgram = exports.CloudExecutable = exports.Bootstrapper = exports.Settings = exports.PROJECT_CONTEXT = exports.Configuration = exports.Command = exports.PluginHost = exports.SdkProvider = exports.exec = exports.cli = exports.deployStack = exports.lowerCaseFirstCharacter = exports.deepMerge = exports.contentHash = exports.leftPad = exports.partition = exports.numberFromBool = exports.isEmpty = exports.isArray = exports.ifDefined = exports.flatten = exports.deepClone = void 0;
22
22
  // Note: All type exports are in `legacy-exports.ts`
23
23
  __exportStar(require("./legacy-logging-source"), exports);
24
24
  var util_1 = require("./util");
@@ -32,6 +32,7 @@ Object.defineProperty(exports, "partition", { enumerable: true, get: function ()
32
32
  Object.defineProperty(exports, "leftPad", { enumerable: true, get: function () { return util_1.padLeft; } });
33
33
  Object.defineProperty(exports, "contentHash", { enumerable: true, get: function () { return util_1.contentHash; } });
34
34
  Object.defineProperty(exports, "deepMerge", { enumerable: true, get: function () { return util_1.deepMerge; } });
35
+ Object.defineProperty(exports, "lowerCaseFirstCharacter", { enumerable: true, get: function () { return util_1.lowerCaseFirstCharacter; } });
35
36
  var deploy_stack_1 = require("./api/deployments/deploy-stack");
36
37
  Object.defineProperty(exports, "deployStack", { enumerable: true, get: function () { return deploy_stack_1.deployStack; } });
37
38
  var cli_1 = require("./cli/cli");
@@ -53,7 +54,7 @@ var cloud_executable_1 = require("./api/cxapp/cloud-executable");
53
54
  Object.defineProperty(exports, "CloudExecutable", { enumerable: true, get: function () { return cloud_executable_1.CloudExecutable; } });
54
55
  var exec_1 = require("./api/cxapp/exec");
55
56
  Object.defineProperty(exports, "execProgram", { enumerable: true, get: function () { return exec_1.execProgram; } });
56
- var diff_1 = require("./diff");
57
+ var diff_1 = require("./commands/diff");
57
58
  Object.defineProperty(exports, "RequireApproval", { enumerable: true, get: function () { return diff_1.RequireApproval; } });
58
59
  var console_formatters_1 = require("./cli/util/console-formatters");
59
60
  Object.defineProperty(exports, "formatAsBanner", { enumerable: true, get: function () { return console_formatters_1.formatAsBanner; } });
@@ -63,8 +64,6 @@ var docs_1 = require("./commands/docs");
63
64
  Object.defineProperty(exports, "aliases", { enumerable: true, get: function () { return docs_1.aliases; } });
64
65
  Object.defineProperty(exports, "command", { enumerable: true, get: function () { return docs_1.command; } });
65
66
  Object.defineProperty(exports, "describe", { enumerable: true, get: function () { return docs_1.describe; } });
66
- var common_1 = require("./api/hotswap/common");
67
- Object.defineProperty(exports, "lowerCaseFirstCharacter", { enumerable: true, get: function () { return common_1.lowerCaseFirstCharacter; } });
68
67
  var deployments_1 = require("./api/deployments");
69
68
  Object.defineProperty(exports, "Deployments", { enumerable: true, get: function () { return deployments_1.Deployments; } });
70
69
  var root_dir_1 = require("./cli/root-dir");
@@ -72,14 +71,14 @@ Object.defineProperty(exports, "rootDir", { enumerable: true, get: function () {
72
71
  var version_1 = require("./cli/version");
73
72
  Object.defineProperty(exports, "latestVersionIfHigher", { enumerable: true, get: function () { return version_1.latestVersionIfHigher; } });
74
73
  Object.defineProperty(exports, "versionNumber", { enumerable: true, get: function () { return version_1.versionNumber; } });
75
- var init_1 = require("./init");
74
+ var init_1 = require("./commands/init");
76
75
  Object.defineProperty(exports, "availableInitTemplates", { enumerable: true, get: function () { return init_1.availableInitTemplates; } });
77
76
  var cached_1 = require("./api/aws-auth/cached");
78
77
  Object.defineProperty(exports, "cached", { enumerable: true, get: function () { return cached_1.cached; } });
79
- var evaluate_cloudformation_template_1 = require("./api/evaluate-cloudformation-template");
78
+ var evaluate_cloudformation_template_1 = require("./api/cloudformation/evaluate-cloudformation-template");
80
79
  Object.defineProperty(exports, "CfnEvaluationException", { enumerable: true, get: function () { return evaluate_cloudformation_template_1.CfnEvaluationException; } });
81
80
  var credential_plugins_1 = require("./api/aws-auth/credential-plugins");
82
81
  Object.defineProperty(exports, "CredentialPlugins", { enumerable: true, get: function () { return credential_plugins_1.CredentialPlugins; } });
83
82
  var awscli_compatible_1 = require("./api/aws-auth/awscli-compatible");
84
83
  Object.defineProperty(exports, "AwsCliCompatible", { enumerable: true, get: function () { return awscli_compatible_1.AwsCliCompatible; } });
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnYWN5LWV4cG9ydHMtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGVnYWN5LWV4cG9ydHMtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw0R0FBNEc7QUFDNUcsMkVBQTJFO0FBQzNFLDBIQUEwSDtBQUMxSCxzRUFBc0U7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXRFLG9EQUFvRDtBQUNwRCwwREFBd0M7QUFDeEMsK0JBQWdKO0FBQXZJLGlHQUFBLFNBQVMsT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBQTtBQUFFLGlHQUFBLFNBQVMsT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBQTtBQUFFLHNHQUFBLGNBQWMsT0FBQTtBQUFFLGlHQUFBLFNBQVMsT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBVztBQUFFLG1HQUFBLFdBQVcsT0FBQTtBQUFFLGlHQUFBLFNBQVMsT0FBQTtBQUMvSCwrREFBNkQ7QUFBcEQsMkdBQUEsV0FBVyxPQUFBO0FBQ3BCLGlDQUFzQztBQUE3QiwwRkFBQSxHQUFHLE9BQUE7QUFBRSwyRkFBQSxJQUFJLE9BQUE7QUFDbEIsMkNBQTZDO0FBQXBDLHVHQUFBLFdBQVcsT0FBQTtBQUNwQix1Q0FBMEM7QUFBakMsb0dBQUEsVUFBVSxPQUFBO0FBQ25CLCtEQUFtRjtBQUExRSw2R0FBQSxPQUFPLE9BQUE7QUFBRSxtSEFBQSxhQUFhLE9BQUE7QUFBRSxxSEFBQSxlQUFlLE9BQUE7QUFDaEQsMkNBQTBDO0FBQWpDLG9HQUFBLFFBQVEsT0FBQTtBQUNqQiw2Q0FBK0M7QUFBdEMseUdBQUEsWUFBWSxPQUFBO0FBQ3JCLGlFQUErRDtBQUF0RCxtSEFBQSxlQUFlLE9BQUE7QUFDeEIseUNBQStDO0FBQXRDLG1HQUFBLFdBQVcsT0FBQTtBQUNwQiwrQkFBeUM7QUFBaEMsdUdBQUEsZUFBZSxPQUFBO0FBQ3hCLG9FQUErRDtBQUF0RCxvSEFBQSxjQUFjLE9BQUE7QUFDdkIsa0RBQXdFO0FBQS9ELHdHQUFBLGFBQWEsT0FBaUI7QUFDdkMsd0NBQTZEO0FBQXBELCtGQUFBLE9BQU8sT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBQTtBQUFFLGdHQUFBLFFBQVEsT0FBQTtBQUNuQywrQ0FBK0Q7QUFBdEQsaUhBQUEsdUJBQXVCLE9BQUE7QUFDaEMsaURBQWdEO0FBQXZDLDBHQUFBLFdBQVcsT0FBQTtBQUNwQiwyQ0FBdUQ7QUFBOUMsbUdBQUEsVUFBVSxPQUFXO0FBQzlCLHlDQUFxRTtBQUE1RCxnSEFBQSxxQkFBcUIsT0FBQTtBQUFFLHdHQUFBLGFBQWEsT0FBQTtBQUM3QywrQkFBZ0Q7QUFBdkMsOEdBQUEsc0JBQXNCLE9BQUE7QUFDL0IsZ0RBQStDO0FBQXRDLGdHQUFBLE1BQU0sT0FBQTtBQUNmLDJGQUFnRjtBQUF2RSwwSUFBQSxzQkFBc0IsT0FBQTtBQUMvQix3RUFBc0U7QUFBN0QsdUhBQUEsaUJBQWlCLE9BQUE7QUFDMUIsc0VBQW9FO0FBQTNELHFIQUFBLGdCQUFnQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBpcyBhIGJhcnJlbCBleHBvcnQgZmlsZSwgb2YgYWxsIGtub3duIHN5bWJvbHMgdGhhdCBhcmUgaW1wb3J0ZWQgYnkgdXNlcnMgZnJvbSB0aGUgYGF3cy1jZGtgIHBhY2thZ2UuXG4vLyBJbXBvcnRpbmcgdGhlc2Ugc3ltYm9scyB3YXMgbmV2ZXIgb2ZmaWNpYWxseSBzdXBwb3J0ZWQsIGJ1dCBoZXJlIHdlIGFyZS5cbi8vIEluIG9yZGVyIHRvIHByZXNlcnZlciBiYWNrd2FyZHMtY29tcGF0aWJseSBmb3IgdGhlc2UgdXNlcnMsIHdlIHJlLWV4cG9ydCBhbmQgcHJlc2VydmUgdGhlbSBhcyBleHBsaWNpdCBzdWJwYXRoIGV4cG9ydHMuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3B1bGwvMzMwMjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbi8vIE5vdGU6IEFsbCB0eXBlIGV4cG9ydHMgYXJlIGluIGBsZWdhY3ktZXhwb3J0cy50c2BcbmV4cG9ydCAqIGZyb20gJy4vbGVnYWN5LWxvZ2dpbmctc291cmNlJztcbmV4cG9ydCB7IGRlZXBDbG9uZSwgZmxhdHRlbiwgaWZEZWZpbmVkLCBpc0FycmF5LCBpc0VtcHR5LCBudW1iZXJGcm9tQm9vbCwgcGFydGl0aW9uLCBwYWRMZWZ0IGFzIGxlZnRQYWQsIGNvbnRlbnRIYXNoLCBkZWVwTWVyZ2UgfSBmcm9tICcuL3V0aWwnO1xuZXhwb3J0IHsgZGVwbG95U3RhY2sgfSBmcm9tICcuL2FwaS9kZXBsb3ltZW50cy9kZXBsb3ktc3RhY2snO1xuZXhwb3J0IHsgY2xpLCBleGVjIH0gZnJvbSAnLi9jbGkvY2xpJztcbmV4cG9ydCB7IFNka1Byb3ZpZGVyIH0gZnJvbSAnLi9hcGkvYXdzLWF1dGgnO1xuZXhwb3J0IHsgUGx1Z2luSG9zdCB9IGZyb20gJy4vYXBpL3BsdWdpbic7XG5leHBvcnQgeyBDb21tYW5kLCBDb25maWd1cmF0aW9uLCBQUk9KRUNUX0NPTlRFWFQgfSBmcm9tICcuL2NsaS91c2VyLWNvbmZpZ3VyYXRpb24nO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL2FwaS9zZXR0aW5ncyc7XG5leHBvcnQgeyBCb290c3RyYXBwZXIgfSBmcm9tICcuL2FwaS9ib290c3RyYXAnO1xuZXhwb3J0IHsgQ2xvdWRFeGVjdXRhYmxlIH0gZnJvbSAnLi9hcGkvY3hhcHAvY2xvdWQtZXhlY3V0YWJsZSc7XG5leHBvcnQgeyBleGVjUHJvZ3JhbSB9IGZyb20gJy4vYXBpL2N4YXBwL2V4ZWMnO1xuZXhwb3J0IHsgUmVxdWlyZUFwcHJvdmFsIH0gZnJvbSAnLi9kaWZmJztcbmV4cG9ydCB7IGZvcm1hdEFzQmFubmVyIH0gZnJvbSAnLi9jbGkvdXRpbC9jb25zb2xlLWZvcm1hdHRlcnMnO1xuZXhwb3J0IHsgc2V0U2RrVHJhY2luZyBhcyBlbmFibGVUcmFjaW5nIH0gZnJvbSAnLi9hcGkvYXdzLWF1dGgvdHJhY2luZyc7XG5leHBvcnQgeyBhbGlhc2VzLCBjb21tYW5kLCBkZXNjcmliZSB9IGZyb20gJy4vY29tbWFuZHMvZG9jcyc7XG5leHBvcnQgeyBsb3dlckNhc2VGaXJzdENoYXJhY3RlciB9IGZyb20gJy4vYXBpL2hvdHN3YXAvY29tbW9uJztcbmV4cG9ydCB7IERlcGxveW1lbnRzIH0gZnJvbSAnLi9hcGkvZGVwbG95bWVudHMnO1xuZXhwb3J0IHsgY2xpUm9vdERpciBhcyByb290RGlyIH0gZnJvbSAnLi9jbGkvcm9vdC1kaXInO1xuZXhwb3J0IHsgbGF0ZXN0VmVyc2lvbklmSGlnaGVyLCB2ZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9jbGkvdmVyc2lvbic7XG5leHBvcnQgeyBhdmFpbGFibGVJbml0VGVtcGxhdGVzIH0gZnJvbSAnLi9pbml0JztcbmV4cG9ydCB7IGNhY2hlZCB9IGZyb20gJy4vYXBpL2F3cy1hdXRoL2NhY2hlZCc7XG5leHBvcnQgeyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uIH0gZnJvbSAnLi9hcGkvZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUnO1xuZXhwb3J0IHsgQ3JlZGVudGlhbFBsdWdpbnMgfSBmcm9tICcuL2FwaS9hd3MtYXV0aC9jcmVkZW50aWFsLXBsdWdpbnMnO1xuZXhwb3J0IHsgQXdzQ2xpQ29tcGF0aWJsZSB9IGZyb20gJy4vYXBpL2F3cy1hdXRoL2F3c2NsaS1jb21wYXRpYmxlJztcbiJdfQ==
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnYWN5LWV4cG9ydHMtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGVnYWN5LWV4cG9ydHMtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw0R0FBNEc7QUFDNUcsMkVBQTJFO0FBQzNFLDBIQUEwSDtBQUMxSCxzRUFBc0U7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXRFLG9EQUFvRDtBQUNwRCwwREFBd0M7QUFDeEMsK0JBQXlLO0FBQWhLLGlHQUFBLFNBQVMsT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBQTtBQUFFLGlHQUFBLFNBQVMsT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBQTtBQUFFLHNHQUFBLGNBQWMsT0FBQTtBQUFFLGlHQUFBLFNBQVMsT0FBQTtBQUFFLCtGQUFBLE9BQU8sT0FBVztBQUFFLG1HQUFBLFdBQVcsT0FBQTtBQUFFLGlHQUFBLFNBQVMsT0FBQTtBQUFFLCtHQUFBLHVCQUF1QixPQUFBO0FBQ3hKLCtEQUE2RDtBQUFwRCwyR0FBQSxXQUFXLE9BQUE7QUFDcEIsaUNBQXNDO0FBQTdCLDBGQUFBLEdBQUcsT0FBQTtBQUFFLDJGQUFBLElBQUksT0FBQTtBQUNsQiwyQ0FBNkM7QUFBcEMsdUdBQUEsV0FBVyxPQUFBO0FBQ3BCLHVDQUEwQztBQUFqQyxvR0FBQSxVQUFVLE9BQUE7QUFDbkIsK0RBQW1GO0FBQTFFLDZHQUFBLE9BQU8sT0FBQTtBQUFFLG1IQUFBLGFBQWEsT0FBQTtBQUFFLHFIQUFBLGVBQWUsT0FBQTtBQUNoRCwyQ0FBMEM7QUFBakMsb0dBQUEsUUFBUSxPQUFBO0FBQ2pCLDZDQUErQztBQUF0Qyx5R0FBQSxZQUFZLE9BQUE7QUFDckIsaUVBQStEO0FBQXRELG1IQUFBLGVBQWUsT0FBQTtBQUN4Qix5Q0FBK0M7QUFBdEMsbUdBQUEsV0FBVyxPQUFBO0FBQ3BCLHdDQUFrRDtBQUF6Qyx1R0FBQSxlQUFlLE9BQUE7QUFDeEIsb0VBQStEO0FBQXRELG9IQUFBLGNBQWMsT0FBQTtBQUN2QixrREFBd0U7QUFBL0Qsd0dBQUEsYUFBYSxPQUFpQjtBQUN2Qyx3Q0FBNkQ7QUFBcEQsK0ZBQUEsT0FBTyxPQUFBO0FBQUUsK0ZBQUEsT0FBTyxPQUFBO0FBQUUsZ0dBQUEsUUFBUSxPQUFBO0FBQ25DLGlEQUFnRDtBQUF2QywwR0FBQSxXQUFXLE9BQUE7QUFDcEIsMkNBQXVEO0FBQTlDLG1HQUFBLFVBQVUsT0FBVztBQUM5Qix5Q0FBcUU7QUFBNUQsZ0hBQUEscUJBQXFCLE9BQUE7QUFBRSx3R0FBQSxhQUFhLE9BQUE7QUFDN0Msd0NBQXlEO0FBQWhELDhHQUFBLHNCQUFzQixPQUFBO0FBQy9CLGdEQUErQztBQUF0QyxnR0FBQSxNQUFNLE9BQUE7QUFDZiwwR0FBK0Y7QUFBdEYsMElBQUEsc0JBQXNCLE9BQUE7QUFDL0Isd0VBQXNFO0FBQTdELHVIQUFBLGlCQUFpQixPQUFBO0FBQzFCLHNFQUFvRTtBQUEzRCxxSEFBQSxnQkFBZ0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgaXMgYSBiYXJyZWwgZXhwb3J0IGZpbGUsIG9mIGFsbCBrbm93biBzeW1ib2xzIHRoYXQgYXJlIGltcG9ydGVkIGJ5IHVzZXJzIGZyb20gdGhlIGBhd3MtY2RrYCBwYWNrYWdlLlxuLy8gSW1wb3J0aW5nIHRoZXNlIHN5bWJvbHMgd2FzIG5ldmVyIG9mZmljaWFsbHkgc3VwcG9ydGVkLCBidXQgaGVyZSB3ZSBhcmUuXG4vLyBJbiBvcmRlciB0byBwcmVzZXJ2ZXIgYmFja3dhcmRzLWNvbXBhdGlibHkgZm9yIHRoZXNlIHVzZXJzLCB3ZSByZS1leHBvcnQgYW5kIHByZXNlcnZlIHRoZW0gYXMgZXhwbGljaXQgc3VicGF0aCBleHBvcnRzLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzMzMDIxIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4vLyBOb3RlOiBBbGwgdHlwZSBleHBvcnRzIGFyZSBpbiBgbGVnYWN5LWV4cG9ydHMudHNgXG5leHBvcnQgKiBmcm9tICcuL2xlZ2FjeS1sb2dnaW5nLXNvdXJjZSc7XG5leHBvcnQgeyBkZWVwQ2xvbmUsIGZsYXR0ZW4sIGlmRGVmaW5lZCwgaXNBcnJheSwgaXNFbXB0eSwgbnVtYmVyRnJvbUJvb2wsIHBhcnRpdGlvbiwgcGFkTGVmdCBhcyBsZWZ0UGFkLCBjb250ZW50SGFzaCwgZGVlcE1lcmdlLCBsb3dlckNhc2VGaXJzdENoYXJhY3RlciB9IGZyb20gJy4vdXRpbCc7XG5leHBvcnQgeyBkZXBsb3lTdGFjayB9IGZyb20gJy4vYXBpL2RlcGxveW1lbnRzL2RlcGxveS1zdGFjayc7XG5leHBvcnQgeyBjbGksIGV4ZWMgfSBmcm9tICcuL2NsaS9jbGknO1xuZXhwb3J0IHsgU2RrUHJvdmlkZXIgfSBmcm9tICcuL2FwaS9hd3MtYXV0aCc7XG5leHBvcnQgeyBQbHVnaW5Ib3N0IH0gZnJvbSAnLi9hcGkvcGx1Z2luJztcbmV4cG9ydCB7IENvbW1hbmQsIENvbmZpZ3VyYXRpb24sIFBST0pFQ1RfQ09OVEVYVCB9IGZyb20gJy4vY2xpL3VzZXItY29uZmlndXJhdGlvbic7XG5leHBvcnQgeyBTZXR0aW5ncyB9IGZyb20gJy4vYXBpL3NldHRpbmdzJztcbmV4cG9ydCB7IEJvb3RzdHJhcHBlciB9IGZyb20gJy4vYXBpL2Jvb3RzdHJhcCc7XG5leHBvcnQgeyBDbG91ZEV4ZWN1dGFibGUgfSBmcm9tICcuL2FwaS9jeGFwcC9jbG91ZC1leGVjdXRhYmxlJztcbmV4cG9ydCB7IGV4ZWNQcm9ncmFtIH0gZnJvbSAnLi9hcGkvY3hhcHAvZXhlYyc7XG5leHBvcnQgeyBSZXF1aXJlQXBwcm92YWwgfSBmcm9tICcuL2NvbW1hbmRzL2RpZmYnO1xuZXhwb3J0IHsgZm9ybWF0QXNCYW5uZXIgfSBmcm9tICcuL2NsaS91dGlsL2NvbnNvbGUtZm9ybWF0dGVycyc7XG5leHBvcnQgeyBzZXRTZGtUcmFjaW5nIGFzIGVuYWJsZVRyYWNpbmcgfSBmcm9tICcuL2FwaS9hd3MtYXV0aC90cmFjaW5nJztcbmV4cG9ydCB7IGFsaWFzZXMsIGNvbW1hbmQsIGRlc2NyaWJlIH0gZnJvbSAnLi9jb21tYW5kcy9kb2NzJztcbmV4cG9ydCB7IERlcGxveW1lbnRzIH0gZnJvbSAnLi9hcGkvZGVwbG95bWVudHMnO1xuZXhwb3J0IHsgY2xpUm9vdERpciBhcyByb290RGlyIH0gZnJvbSAnLi9jbGkvcm9vdC1kaXInO1xuZXhwb3J0IHsgbGF0ZXN0VmVyc2lvbklmSGlnaGVyLCB2ZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9jbGkvdmVyc2lvbic7XG5leHBvcnQgeyBhdmFpbGFibGVJbml0VGVtcGxhdGVzIH0gZnJvbSAnLi9jb21tYW5kcy9pbml0JztcbmV4cG9ydCB7IGNhY2hlZCB9IGZyb20gJy4vYXBpL2F3cy1hdXRoL2NhY2hlZCc7XG5leHBvcnQgeyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uIH0gZnJvbSAnLi9hcGkvY2xvdWRmb3JtYXRpb24vZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUnO1xuZXhwb3J0IHsgQ3JlZGVudGlhbFBsdWdpbnMgfSBmcm9tICcuL2FwaS9hd3MtYXV0aC9jcmVkZW50aWFsLXBsdWdpbnMnO1xuZXhwb3J0IHsgQXdzQ2xpQ29tcGF0aWJsZSB9IGZyb20gJy4vYXBpL2F3cy1hdXRoL2F3c2NsaS1jb21wYXRpYmxlJztcbiJdfQ==
package/lib/logging.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.highlight = exports.success = exports.trace = exports.debug = exports.result = exports.info = exports.warning = exports.error = void 0;
4
4
  const chalk = require("chalk");
5
- const cli_io_host_1 = require("./toolkit/cli-io-host");
5
+ const cli_io_host_1 = require("./cli/io-host/cli-io-host");
6
6
  const private_1 = require("../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private");
7
7
  /**
8
8
  * Logs messages to the global CliIoHost
@@ -159,4 +159,4 @@ function chalkInput(i, style) {
159
159
  message: style(i.message),
160
160
  };
161
161
  }
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBRS9CLHVEQUFrRDtBQUNsRCxtRkFBc0c7QUFNdEc7Ozs7OztHQU1HO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBcUIsRUFDckIsS0FBNEIsRUFDNUIsR0FBRyxJQUFlO0lBRWxCLE1BQU0sYUFBYSxHQUFHLHVCQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsbURBQW1EO0lBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUEsb0JBQVUsRUFBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLGFBQW9CLENBQUMsQ0FBQztJQUU3RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksMkJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ2hCLEtBQUs7WUFDTCxHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQWlCRCx5R0FBeUc7QUFDekcsK0JBQStCO0FBRS9COzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQW9CLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtJQUNoRSxPQUFPLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0RCxDQUFDLENBQUM7QUFGVyxRQUFBLEtBQUssU0FFaEI7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0ksTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUU7SUFDbEUsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRlcsUUFBQSxPQUFPLFdBRWxCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQy9ELE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUZXLFFBQUEsSUFBSSxRQUVmO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ2pFLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3ZELENBQUMsQ0FBQztBQUZXLFFBQUEsTUFBTSxVQUVqQjtBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQW9CLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtJQUNoRSxPQUFPLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0RCxDQUFDLENBQUM7QUFGVyxRQUFBLEtBQUssU0FFaEI7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0ksTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUU7SUFDaEUsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBRlcsUUFBQSxLQUFLLFNBRWhCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ2xFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDOUUsQ0FBQyxDQUFDO0FBRlcsUUFBQSxPQUFPLFdBRWxCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ3BFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0UsQ0FBQyxDQUFDO0FBRlcsUUFBQSxTQUFTLGFBRXBCO0FBRUYsU0FBUyxVQUFVLENBQTBCLENBQUksRUFBRSxLQUE4QjtJQUMvRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxDQUFRO1FBQ1gsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0tBQzFCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBJb01lc3NhZ2VMZXZlbCB9IGZyb20gJy4vdG9vbGtpdC9jbGktaW8taG9zdCc7XG5pbXBvcnQgeyBDbGlJb0hvc3QgfSBmcm9tICcuL3Rvb2xraXQvY2xpLWlvLWhvc3QnO1xuaW1wb3J0IHsgYXNJb0hlbHBlciwgSW9EZWZhdWx0TWVzc2FnZXMgfSBmcm9tICcuLi8uLi9AYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzL3NyYy9hcGkvaW8vcHJpdmF0ZSc7XG5cbmV4cG9ydCB0eXBlIElvTWVzc2FnZUNvZGVDYXRlZ29yeSA9ICdUT09MS0lUJyB8ICdTREsnIHwgJ0FTU0VUUyc7XG5leHBvcnQgdHlwZSBJb0NvZGVMZXZlbCA9ICdFJyB8ICdXJyB8ICdJJztcbmV4cG9ydCB0eXBlIElvTWVzc2FnZVNwZWNpZmljQ29kZTxMIGV4dGVuZHMgSW9Db2RlTGV2ZWw+ID0gYENES18ke0lvTWVzc2FnZUNvZGVDYXRlZ29yeX1fJHtMfSR7bnVtYmVyfSR7bnVtYmVyfSR7bnVtYmVyfSR7bnVtYmVyfWA7XG5cbi8qKlxuICogTG9ncyBtZXNzYWdlcyB0byB0aGUgZ2xvYmFsIENsaUlvSG9zdFxuICpcbiAqIEludGVybmFsIGhlbHBlciB0aGF0IHByb2Nlc3NlcyBsb2cgaW5wdXRzIGludG8gYSBjb25zaXN0ZW50IGZvcm1hdC5cbiAqIEhhbmRsZXMgc3RyaW5nIGludGVycG9sYXRpb24sIGZvcm1hdCBzdHJpbmdzLCBhbmQgb2JqZWN0IHBhcmFtZXRlciBzdHlsZXMuXG4gKiBBcHBsaWVzIG9wdGlvbmFsIHN0eWxpbmcgYW5kIHNlbmRzIHRoZSBtZXNzYWdlIHRvIHRoZSBJb0hvc3QuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2VBbmRMb2coXG4gIGxldmVsOiBJb01lc3NhZ2VMZXZlbCxcbiAgaW5wdXQ6IExvZ0lucHV0PElvQ29kZUxldmVsPixcbiAgLi4uYXJnczogdW5rbm93bltdXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2luZ2xldG9uSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSgpO1xuICAvLyBBTEFSTTogZm9yY2luZyBhIENsaUFjdGlvbiBpbnRvIGEgVG9vbGtpdEFjdGlvbi5cbiAgY29uc3QgaGVscGVyID0gYXNJb0hlbHBlcihzaW5nbGV0b25Ib3N0LCBzaW5nbGV0b25Ib3N0LmN1cnJlbnRBY3Rpb24gYXMgYW55KTtcblxuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gbmV3IElvRGVmYXVsdE1lc3NhZ2VzKGhlbHBlcik7XG4gICAgbWVzc2FnZXNbbGV2ZWxdKGlucHV0LCAuLi5hcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2b2lkIGhlbHBlci5ub3RpZnkoe1xuICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgIGxldmVsLFxuICAgICAgLi4uaW5wdXQsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gVHlwZSBmb3IgdGhlIG9iamVjdCBwYXJhbWV0ZXIgc3R5bGVcbmludGVyZmFjZSBMb2dQYXJhbXM8TCBleHRlbmRzIElvQ29kZUxldmVsPiB7XG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvZGVcbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IElvTWVzc2FnZVNwZWNpZmljQ29kZTxMPjtcbiAgLyoqXG4gICAqIE1lc3NhZ2VcbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLy8gVHlwZSBmb3IgdGhlIGV4cG9ydGVkIGxvZyBmdW5jdGlvbiBhcmd1bWVudHNcbnR5cGUgTG9nSW5wdXQ8TCBleHRlbmRzIElvQ29kZUxldmVsPiA9IHN0cmluZyB8IExvZ1BhcmFtczxMPjtcblxuLy8gRXhwb3J0ZWQgbG9nZ2luZyBmdW5jdGlvbnMuIElmIGFueSBhZGRpdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eSBpcyByZXF1aXJlZCwgaXQgc2hvdWxkIGJlIGFkZGVkIGFzXG4vLyBhIG5ldyBsb2dnaW5nIGZ1bmN0aW9uIGhlcmUuXG5cbi8qKlxuICogTG9ncyBhbiBlcnJvciBsZXZlbCBtZXNzYWdlLlxuICpcbiAqIENhbiBiZSB1c2VkIGluIG11bHRpcGxlIHdheXM6XG4gKiBgYGB0c1xuICogZXJyb3IoYG9wZXJhdGlvbiBmYWlsZWQ6ICR7ZX1gKSAvLyBpbmZlcnMgZGVmYXVsdCBlcnJvciBjb2RlIGBDREtfVE9PTEtJVF9FMDAwYFxuICogZXJyb3IoJ29wZXJhdGlvbiBmYWlsZWQ6ICVzJywgZSkgLy8gaW5mZXJzIGRlZmF1bHQgZXJyb3IgY29kZSBgQ0RLX1RPT0xLSVRfRTAwMGBcbiAqIGVycm9yKHsgbWVzc2FnZTogJ29wZXJhdGlvbiBmYWlsZWQnLCBjb2RlOiAnQ0RLX1NES19FMDAxJyB9KSAvLyBzcGVjaWZpZXMgZXJyb3IgY29kZSBgQ0RLX1NES19FMDAxYFxuICogZXJyb3IoeyBtZXNzYWdlOiAnb3BlcmF0aW9uIGZhaWxlZDogJXMnLCBjb2RlOiAnQ0RLX1NES19FMDAxJyB9LCBlKSAvLyBzcGVjaWZpZXMgZXJyb3IgY29kZSBgQ0RLX1NES19FMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBlcnJvciA9IChpbnB1dDogTG9nSW5wdXQ8J0UnPiwgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gIHJldHVybiBmb3JtYXRNZXNzYWdlQW5kTG9nKCdlcnJvcicsIGlucHV0LCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyBhbiB3YXJuaW5nIGxldmVsIG1lc3NhZ2UuXG4gKlxuICogQ2FuIGJlIHVzZWQgaW4gbXVsdGlwbGUgd2F5czpcbiAqIGBgYHRzXG4gKiB3YXJuaW5nKGBkZXByZWN0ZWQgZmVhdHVyZTogJHttZXNzYWdlfWApIC8vIGluZmVycyBkZWZhdWx0IHdhcm5pbmcgY29kZSBgQ0RLX1RPT0xLSVRfVzAwMGBcbiAqIHdhcm5pbmcoJ2RlcHJlY3RlZCBmZWF0dXJlOiAlcycsIG1lc3NhZ2UpIC8vIGluZmVycyBkZWZhdWx0IHdhcm5pbmcgY29kZSBgQ0RLX1RPT0xLSVRfVzAwMGBcbiAqIHdhcm5pbmcoeyBtZXNzYWdlOiAnZGVwcmVjdGVkIGZlYXR1cmUnLCBjb2RlOiAnQ0RLX1NES19XMDAxJyB9KSAvLyBzcGVjaWZpZXMgd2FybmluZyBjb2RlIGBDREtfU0RLX1cwMDFgXG4gKiB3YXJuaW5nKHsgbWVzc2FnZTogJ2RlcHJlY3RlZCBmZWF0dXJlOiAlcycsIGNvZGU6ICdDREtfU0RLX1cwMDEnIH0sIG1lc3NhZ2UpIC8vIHNwZWNpZmllcyB3YXJuaW5nIGNvZGUgYENES19TREtfVzAwMWBcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2FybmluZyA9IChpbnB1dDogTG9nSW5wdXQ8J1cnPiwgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gIHJldHVybiBmb3JtYXRNZXNzYWdlQW5kTG9nKCd3YXJuJywgaW5wdXQsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBMb2dzIGFuIGluZm8gbGV2ZWwgbWVzc2FnZS5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIGluZm8oYHByb2Nlc3Npbmc6ICR7bWVzc2FnZX1gKSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiBpbmZvKCdwcm9jZXNzaW5nOiAlcycsIG1lc3NhZ2UpIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIGluZm8oeyBtZXNzYWdlOiAncHJvY2Vzc2luZycsIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAxJyB9KSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogaW5mbyh7IG1lc3NhZ2U6ICdwcm9jZXNzaW5nOiAlcycsIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAxJyB9LCBtZXNzYWdlKSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBpbmZvID0gKGlucHV0OiBMb2dJbnB1dDwnSSc+LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2VBbmRMb2coJ2luZm8nLCBpbnB1dCwgLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIExvZ3MgYW4gcmVzdWx0LiBJbiB0aGUgQ0xJLCB0aGlzIGFsd2F5cyBnb2VzIHRvIHN0ZG91dC5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIHJlc3VsdChgJHtKU09OLnN0cmluZ2lmeShzdGF0cyl9YCkgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogcmVzdWx0KCd7XCJjb3VudFwiOiAlZH0nLCBjb3VudCkgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogcmVzdWx0KHsgbWVzc2FnZTogJ3N0YXRzOiAlaicsIGNvZGU6ICdDREtfREFUQV9JMDAxJyB9KSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfREFUQV9JMDAxYFxuICogcmVzdWx0KHsgbWVzc2FnZTogJ3N0YXRzOiAlaicsIGNvZGU6ICdDREtfREFUQV9JMDAxJyB9LCBzdGF0cykgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX0RBVEFfSTAwMWBcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgcmVzdWx0ID0gKGlucHV0OiBMb2dJbnB1dDwnSSc+LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2VBbmRMb2coJ3Jlc3VsdCcsIGlucHV0LCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyBhIGRlYnVnIGxldmVsIG1lc3NhZ2UuXG4gKlxuICogQ2FuIGJlIHVzZWQgaW4gbXVsdGlwbGUgd2F5czpcbiAqIGBgYHRzXG4gKiBkZWJ1Zyhgc3RhdGU6ICR7SlNPTi5zdHJpbmdpZnkoc3RhdGUpfWApIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIGRlYnVnKCdjYWNoZSBoaXQgcmF0aW86ICVkJSUnLCByYXRpbykgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogZGVidWcoeyBtZXNzYWdlOiAnc3RhdGUgdXBkYXRlJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0pIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBkZWJ1Zyh7IG1lc3NhZ2U6ICdyYXRpbzogJWQlJScsIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAxJyB9LCByYXRpbykgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgZGVidWcgPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygnZGVidWcnLCBpbnB1dCwgLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIExvZ3MgYSB0cmFjZSBsZXZlbCBtZXNzYWdlLlxuICpcbiAqIENhbiBiZSB1c2VkIGluIG11bHRpcGxlIHdheXM6XG4gKiBgYGB0c1xuICogdHJhY2UoYGVudGVyZWQgJHtuYW1lfSB3aXRoICR7YXJnc31gKSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiB0cmFjZSgnbWV0aG9kOiAlcywgYXJnczogJWonLCBuYW1lLCBhcmdzKSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiB0cmFjZSh7IG1lc3NhZ2U6ICdlbnRlcmVkJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0pIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiB0cmFjZSh7IG1lc3NhZ2U6ICdtZXRob2Q6ICVzJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0sIG5hbWUpIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHRyYWNlID0gKGlucHV0OiBMb2dJbnB1dDwnSSc+LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2VBbmRMb2coJ3RyYWNlJywgaW5wdXQsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBMb2dzIGFuIGluZm8gbGV2ZWwgc3VjY2VzcyBtZXNzYWdlIGluIGdyZWVuIHRleHQuXG4gKlxuICogQ2FuIGJlIHVzZWQgaW4gbXVsdGlwbGUgd2F5czpcbiAqIGBgYHRzXG4gKiBzdWNjZXNzKGBkZXBsb3ltZW50IGNvbXBsZXRlZDogJHtuYW1lfWApIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIHN1Y2Nlc3MoJ3Byb2Nlc3NlZCAlZCBpdGVtcycsIGNvdW50KSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiBzdWNjZXNzKHsgbWVzc2FnZTogJ2NvbXBsZXRlZCcsIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAxJyB9KSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogc3VjY2Vzcyh7IG1lc3NhZ2U6ICdpdGVtczogJWQnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSwgY291bnQpIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHN1Y2Nlc3MgPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygnaW5mbycsIGNoYWxrSW5wdXQoaW5wdXQsIGNoYWxrLmdyZWVuKSwgLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIExvZ3MgYW4gaW5mbyBsZXZlbCBtZXNzYWdlIGluIGJvbGQgdGV4dC5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIGhpZ2hsaWdodChgaW1wb3J0YW50OiAke21zZ31gKSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiBoaWdobGlnaHQoJ2F0dGVudGlvbiByZXF1aXJlZDogJXMnLCByZWFzb24pIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIGhpZ2hsaWdodCh7IG1lc3NhZ2U6ICdub3RpY2UnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGhpZ2hsaWdodCh7IG1lc3NhZ2U6ICdub3RpY2U6ICVzJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0sIG1zZykgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgaGlnaGxpZ2h0ID0gKGlucHV0OiBMb2dJbnB1dDwnSSc+LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2VBbmRMb2coJ2luZm8nLCBjaGFsa0lucHV0KGlucHV0LCBjaGFsay5ib2xkKSwgLi4uYXJncyk7XG59O1xuXG5mdW5jdGlvbiBjaGFsa0lucHV0PEEgZXh0ZW5kcyBMb2dJbnB1dDxhbnk+PihpOiBBLCBzdHlsZTogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpOiBBIHtcbiAgaWYgKHR5cGVvZiBpID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHlsZShpKSBhcyBBO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5pIGFzIGFueSxcbiAgICBtZXNzYWdlOiBzdHlsZShpLm1lc3NhZ2UpLFxuICB9O1xufVxuIl19
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBRS9CLDJEQUFzRDtBQUN0RCxtRkFBc0c7QUFNdEc7Ozs7OztHQU1HO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBcUIsRUFDckIsS0FBNEIsRUFDNUIsR0FBRyxJQUFlO0lBRWxCLE1BQU0sYUFBYSxHQUFHLHVCQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsbURBQW1EO0lBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUEsb0JBQVUsRUFBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLGFBQW9CLENBQUMsQ0FBQztJQUU3RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksMkJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ2hCLEtBQUs7WUFDTCxHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQWlCRCx5R0FBeUc7QUFDekcsK0JBQStCO0FBRS9COzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQW9CLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtJQUNoRSxPQUFPLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0RCxDQUFDLENBQUM7QUFGVyxRQUFBLEtBQUssU0FFaEI7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0ksTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUU7SUFDbEUsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRlcsUUFBQSxPQUFPLFdBRWxCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQy9ELE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUZXLFFBQUEsSUFBSSxRQUVmO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ2pFLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3ZELENBQUMsQ0FBQztBQUZXLFFBQUEsTUFBTSxVQUVqQjtBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQW9CLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtJQUNoRSxPQUFPLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0RCxDQUFDLENBQUM7QUFGVyxRQUFBLEtBQUssU0FFaEI7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0ksTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUU7SUFDaEUsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBRlcsUUFBQSxLQUFLLFNBRWhCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ2xFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDOUUsQ0FBQyxDQUFDO0FBRlcsUUFBQSxPQUFPLFdBRWxCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ3BFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0UsQ0FBQyxDQUFDO0FBRlcsUUFBQSxTQUFTLGFBRXBCO0FBRUYsU0FBUyxVQUFVLENBQTBCLENBQUksRUFBRSxLQUE4QjtJQUMvRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxDQUFRO1FBQ1gsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0tBQzFCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBJb01lc3NhZ2VMZXZlbCB9IGZyb20gJy4vY2xpL2lvLWhvc3QvY2xpLWlvLWhvc3QnO1xuaW1wb3J0IHsgQ2xpSW9Ib3N0IH0gZnJvbSAnLi9jbGkvaW8taG9zdC9jbGktaW8taG9zdCc7XG5pbXBvcnQgeyBhc0lvSGVscGVyLCBJb0RlZmF1bHRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9pby9wcml2YXRlJztcblxuZXhwb3J0IHR5cGUgSW9NZXNzYWdlQ29kZUNhdGVnb3J5ID0gJ1RPT0xLSVQnIHwgJ1NESycgfCAnQVNTRVRTJztcbmV4cG9ydCB0eXBlIElvQ29kZUxldmVsID0gJ0UnIHwgJ1cnIHwgJ0knO1xuZXhwb3J0IHR5cGUgSW9NZXNzYWdlU3BlY2lmaWNDb2RlPEwgZXh0ZW5kcyBJb0NvZGVMZXZlbD4gPSBgQ0RLXyR7SW9NZXNzYWdlQ29kZUNhdGVnb3J5fV8ke0x9JHtudW1iZXJ9JHtudW1iZXJ9JHtudW1iZXJ9JHtudW1iZXJ9YDtcblxuLyoqXG4gKiBMb2dzIG1lc3NhZ2VzIHRvIHRoZSBnbG9iYWwgQ2xpSW9Ib3N0XG4gKlxuICogSW50ZXJuYWwgaGVscGVyIHRoYXQgcHJvY2Vzc2VzIGxvZyBpbnB1dHMgaW50byBhIGNvbnNpc3RlbnQgZm9ybWF0LlxuICogSGFuZGxlcyBzdHJpbmcgaW50ZXJwb2xhdGlvbiwgZm9ybWF0IHN0cmluZ3MsIGFuZCBvYmplY3QgcGFyYW1ldGVyIHN0eWxlcy5cbiAqIEFwcGxpZXMgb3B0aW9uYWwgc3R5bGluZyBhbmQgc2VuZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIElvSG9zdC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0TWVzc2FnZUFuZExvZyhcbiAgbGV2ZWw6IElvTWVzc2FnZUxldmVsLFxuICBpbnB1dDogTG9nSW5wdXQ8SW9Db2RlTGV2ZWw+LFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IHZvaWQge1xuICBjb25zdCBzaW5nbGV0b25Ib3N0ID0gQ2xpSW9Ib3N0Lmluc3RhbmNlKCk7XG4gIC8vIEFMQVJNOiBmb3JjaW5nIGEgQ2xpQWN0aW9uIGludG8gYSBUb29sa2l0QWN0aW9uLlxuICBjb25zdCBoZWxwZXIgPSBhc0lvSGVscGVyKHNpbmdsZXRvbkhvc3QsIHNpbmdsZXRvbkhvc3QuY3VycmVudEFjdGlvbiBhcyBhbnkpO1xuXG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBuZXcgSW9EZWZhdWx0TWVzc2FnZXMoaGVscGVyKTtcbiAgICBtZXNzYWdlc1tsZXZlbF0oaW5wdXQsIC4uLmFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZvaWQgaGVscGVyLm5vdGlmeSh7XG4gICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgbGV2ZWwsXG4gICAgICAuLi5pbnB1dCxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBUeXBlIGZvciB0aGUgb2JqZWN0IHBhcmFtZXRlciBzdHlsZVxuaW50ZXJmYWNlIExvZ1BhcmFtczxMIGV4dGVuZHMgSW9Db2RlTGV2ZWw+IHtcbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29kZVxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogSW9NZXNzYWdlU3BlY2lmaWNDb2RlPEw+O1xuICAvKipcbiAgICogTWVzc2FnZVxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vLyBUeXBlIGZvciB0aGUgZXhwb3J0ZWQgbG9nIGZ1bmN0aW9uIGFyZ3VtZW50c1xudHlwZSBMb2dJbnB1dDxMIGV4dGVuZHMgSW9Db2RlTGV2ZWw+ID0gc3RyaW5nIHwgTG9nUGFyYW1zPEw+O1xuXG4vLyBFeHBvcnRlZCBsb2dnaW5nIGZ1bmN0aW9ucy4gSWYgYW55IGFkZGl0aW9uYWwgbG9nZ2luZyBmdW5jdGlvbmFsaXR5IGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgYmUgYWRkZWQgYXNcbi8vIGEgbmV3IGxvZ2dpbmcgZnVuY3Rpb24gaGVyZS5cblxuLyoqXG4gKiBMb2dzIGFuIGVycm9yIGxldmVsIG1lc3NhZ2UuXG4gKlxuICogQ2FuIGJlIHVzZWQgaW4gbXVsdGlwbGUgd2F5czpcbiAqIGBgYHRzXG4gKiBlcnJvcihgb3BlcmF0aW9uIGZhaWxlZDogJHtlfWApIC8vIGluZmVycyBkZWZhdWx0IGVycm9yIGNvZGUgYENES19UT09MS0lUX0UwMDBgXG4gKiBlcnJvcignb3BlcmF0aW9uIGZhaWxlZDogJXMnLCBlKSAvLyBpbmZlcnMgZGVmYXVsdCBlcnJvciBjb2RlIGBDREtfVE9PTEtJVF9FMDAwYFxuICogZXJyb3IoeyBtZXNzYWdlOiAnb3BlcmF0aW9uIGZhaWxlZCcsIGNvZGU6ICdDREtfU0RLX0UwMDEnIH0pIC8vIHNwZWNpZmllcyBlcnJvciBjb2RlIGBDREtfU0RLX0UwMDFgXG4gKiBlcnJvcih7IG1lc3NhZ2U6ICdvcGVyYXRpb24gZmFpbGVkOiAlcycsIGNvZGU6ICdDREtfU0RLX0UwMDEnIH0sIGUpIC8vIHNwZWNpZmllcyBlcnJvciBjb2RlIGBDREtfU0RLX0UwMDFgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGVycm9yID0gKGlucHV0OiBMb2dJbnB1dDwnRSc+LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2VBbmRMb2coJ2Vycm9yJywgaW5wdXQsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBMb2dzIGFuIHdhcm5pbmcgbGV2ZWwgbWVzc2FnZS5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIHdhcm5pbmcoYGRlcHJlY3RlZCBmZWF0dXJlOiAke21lc3NhZ2V9YCkgLy8gaW5mZXJzIGRlZmF1bHQgd2FybmluZyBjb2RlIGBDREtfVE9PTEtJVF9XMDAwYFxuICogd2FybmluZygnZGVwcmVjdGVkIGZlYXR1cmU6ICVzJywgbWVzc2FnZSkgLy8gaW5mZXJzIGRlZmF1bHQgd2FybmluZyBjb2RlIGBDREtfVE9PTEtJVF9XMDAwYFxuICogd2FybmluZyh7IG1lc3NhZ2U6ICdkZXByZWN0ZWQgZmVhdHVyZScsIGNvZGU6ICdDREtfU0RLX1cwMDEnIH0pIC8vIHNwZWNpZmllcyB3YXJuaW5nIGNvZGUgYENES19TREtfVzAwMWBcbiAqIHdhcm5pbmcoeyBtZXNzYWdlOiAnZGVwcmVjdGVkIGZlYXR1cmU6ICVzJywgY29kZTogJ0NES19TREtfVzAwMScgfSwgbWVzc2FnZSkgLy8gc3BlY2lmaWVzIHdhcm5pbmcgY29kZSBgQ0RLX1NES19XMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3YXJuaW5nID0gKGlucHV0OiBMb2dJbnB1dDwnVyc+LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2VBbmRMb2coJ3dhcm4nLCBpbnB1dCwgLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIExvZ3MgYW4gaW5mbyBsZXZlbCBtZXNzYWdlLlxuICpcbiAqIENhbiBiZSB1c2VkIGluIG11bHRpcGxlIHdheXM6XG4gKiBgYGB0c1xuICogaW5mbyhgcHJvY2Vzc2luZzogJHttZXNzYWdlfWApIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIGluZm8oJ3Byb2Nlc3Npbmc6ICVzJywgbWVzc2FnZSkgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogaW5mbyh7IG1lc3NhZ2U6ICdwcm9jZXNzaW5nJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0pIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBpbmZvKHsgbWVzc2FnZTogJ3Byb2Nlc3Npbmc6ICVzJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0sIG1lc3NhZ2UpIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGluZm8gPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygnaW5mbycsIGlucHV0LCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyBhbiByZXN1bHQuIEluIHRoZSBDTEksIHRoaXMgYWx3YXlzIGdvZXMgdG8gc3Rkb3V0LlxuICpcbiAqIENhbiBiZSB1c2VkIGluIG11bHRpcGxlIHdheXM6XG4gKiBgYGB0c1xuICogcmVzdWx0KGAke0pTT04uc3RyaW5naWZ5KHN0YXRzKX1gKSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiByZXN1bHQoJ3tcImNvdW50XCI6ICVkfScsIGNvdW50KSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiByZXN1bHQoeyBtZXNzYWdlOiAnc3RhdHM6ICVqJywgY29kZTogJ0NES19EQVRBX0kwMDEnIH0pIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19EQVRBX0kwMDFgXG4gKiByZXN1bHQoeyBtZXNzYWdlOiAnc3RhdHM6ICVqJywgY29kZTogJ0NES19EQVRBX0kwMDEnIH0sIHN0YXRzKSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfREFUQV9JMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCByZXN1bHQgPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygncmVzdWx0JywgaW5wdXQsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBMb2dzIGEgZGVidWcgbGV2ZWwgbWVzc2FnZS5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIGRlYnVnKGBzdGF0ZTogJHtKU09OLnN0cmluZ2lmeShzdGF0ZSl9YCkgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogZGVidWcoJ2NhY2hlIGhpdCByYXRpbzogJWQlJScsIHJhdGlvKSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiBkZWJ1Zyh7IG1lc3NhZ2U6ICdzdGF0ZSB1cGRhdGUnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGRlYnVnKHsgbWVzc2FnZTogJ3JhdGlvOiAlZCUlJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0sIHJhdGlvKSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBkZWJ1ZyA9IChpbnB1dDogTG9nSW5wdXQ8J0knPiwgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gIHJldHVybiBmb3JtYXRNZXNzYWdlQW5kTG9nKCdkZWJ1ZycsIGlucHV0LCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyBhIHRyYWNlIGxldmVsIG1lc3NhZ2UuXG4gKlxuICogQ2FuIGJlIHVzZWQgaW4gbXVsdGlwbGUgd2F5czpcbiAqIGBgYHRzXG4gKiB0cmFjZShgZW50ZXJlZCAke25hbWV9IHdpdGggJHthcmdzfWApIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIHRyYWNlKCdtZXRob2Q6ICVzLCBhcmdzOiAlaicsIG5hbWUsIGFyZ3MpIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIHRyYWNlKHsgbWVzc2FnZTogJ2VudGVyZWQnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIHRyYWNlKHsgbWVzc2FnZTogJ21ldGhvZDogJXMnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSwgbmFtZSkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHJhY2UgPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygndHJhY2UnLCBpbnB1dCwgLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIExvZ3MgYW4gaW5mbyBsZXZlbCBzdWNjZXNzIG1lc3NhZ2UgaW4gZ3JlZW4gdGV4dC5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIHN1Y2Nlc3MoYGRlcGxveW1lbnQgY29tcGxldGVkOiAke25hbWV9YCkgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogc3VjY2VzcygncHJvY2Vzc2VkICVkIGl0ZW1zJywgY291bnQpIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIHN1Y2Nlc3MoeyBtZXNzYWdlOiAnY29tcGxldGVkJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0pIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBzdWNjZXNzKHsgbWVzc2FnZTogJ2l0ZW1zOiAlZCcsIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAxJyB9LCBjb3VudCkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc3VjY2VzcyA9IChpbnB1dDogTG9nSW5wdXQ8J0knPiwgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gIHJldHVybiBmb3JtYXRNZXNzYWdlQW5kTG9nKCdpbmZvJywgY2hhbGtJbnB1dChpbnB1dCwgY2hhbGsuZ3JlZW4pLCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyBhbiBpbmZvIGxldmVsIG1lc3NhZ2UgaW4gYm9sZCB0ZXh0LlxuICpcbiAqIENhbiBiZSB1c2VkIGluIG11bHRpcGxlIHdheXM6XG4gKiBgYGB0c1xuICogaGlnaGxpZ2h0KGBpbXBvcnRhbnQ6ICR7bXNnfWApIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIGhpZ2hsaWdodCgnYXR0ZW50aW9uIHJlcXVpcmVkOiAlcycsIHJlYXNvbikgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogaGlnaGxpZ2h0KHsgbWVzc2FnZTogJ25vdGljZScsIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAxJyB9KSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogaGlnaGxpZ2h0KHsgbWVzc2FnZTogJ25vdGljZTogJXMnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSwgbXNnKSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBoaWdobGlnaHQgPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygnaW5mbycsIGNoYWxrSW5wdXQoaW5wdXQsIGNoYWxrLmJvbGQpLCAuLi5hcmdzKTtcbn07XG5cbmZ1bmN0aW9uIGNoYWxrSW5wdXQ8QSBleHRlbmRzIExvZ0lucHV0PGFueT4+KGk6IEEsIHN0eWxlOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZyk6IEEge1xuICBpZiAodHlwZW9mIGkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0eWxlKGkpIGFzIEE7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmkgYXMgYW55LFxuICAgIG1lc3NhZ2U6IHN0eWxlKGkubWVzc2FnZSksXG4gIH07XG59XG4iXX0=
package/lib/notices.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { Environment } from '@aws-cdk/cx-api';
2
2
  import type { SdkHttpOptions } from './api';
3
3
  import type { Context } from './api/context';
4
- import type { IIoHost } from './toolkit/cli-io-host';
4
+ import type { IIoHost } from './cli/io-host';
5
5
  import { IoDefaultMessages } from '../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
6
6
  export interface NoticesProps {
7
7
  /**
package/lib/notices.js CHANGED
@@ -6,10 +6,10 @@ const path = require("path");
6
6
  const fs = require("fs-extra");
7
7
  const semver = require("semver");
8
8
  const awscli_compatible_1 = require("./api/aws-auth/awscli-compatible");
9
+ const tree_1 = require("./api/tree");
9
10
  const version_1 = require("./cli/version");
10
- const error_1 = require("./toolkit/error");
11
- const tree_1 = require("./tree");
12
11
  const util_1 = require("./util");
12
+ const api_1 = require("../../@aws-cdk/tmp-toolkit-helpers/src/api");
13
13
  const private_1 = require("../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private");
14
14
  const CACHE_FILE_PATH = path.join((0, util_1.cdkCacheDir)(), 'notices.json');
15
15
  class NoticesFilter {
@@ -93,12 +93,11 @@ class NoticesFilter {
93
93
  * by a comma.
94
94
  */
95
95
  addDynamicValues(comps, notice) {
96
- var _a, _b;
97
96
  const dynamicValues = {};
98
97
  for (const comp of comps) {
99
98
  if (comp.dynamicName) {
100
- dynamicValues[comp.dynamicName] = (_a = dynamicValues[comp.dynamicName]) !== null && _a !== void 0 ? _a : [];
101
- dynamicValues[comp.dynamicName].push((_b = comp.dynamicValue) !== null && _b !== void 0 ? _b : comp.version);
99
+ dynamicValues[comp.dynamicName] = dynamicValues[comp.dynamicName] ?? [];
100
+ dynamicValues[comp.dynamicName].push(comp.dynamicValue ?? comp.version);
102
101
  }
103
102
  }
104
103
  for (const [key, values] of Object.entries(dynamicValues)) {
@@ -127,7 +126,7 @@ class NoticesFilter {
127
126
  * Load the construct tree from the given directory and return its components
128
127
  */
129
128
  constructTreeComponents(manifestDir) {
130
- const tree = (0, tree_1.loadTreeFromDir)(manifestDir);
129
+ const tree = (0, tree_1.loadTreeFromDir)(manifestDir, (msg) => void this.ioMessages.notify(private_1.IO.DEFAULT_ASSEMBLY_TRACE.msg(msg)));
131
130
  if (!tree) {
132
131
  return [];
133
132
  }
@@ -135,14 +134,13 @@ class NoticesFilter {
135
134
  recurse(tree);
136
135
  return ret;
137
136
  function recurse(x) {
138
- var _a, _b, _c, _d, _e;
139
- if (((_a = x.constructInfo) === null || _a === void 0 ? void 0 : _a.fqn) && ((_b = x.constructInfo) === null || _b === void 0 ? void 0 : _b.version)) {
137
+ if (x.constructInfo?.fqn && x.constructInfo?.version) {
140
138
  ret.push({
141
- name: (_c = x.constructInfo) === null || _c === void 0 ? void 0 : _c.fqn,
142
- version: (_d = x.constructInfo) === null || _d === void 0 ? void 0 : _d.version,
139
+ name: x.constructInfo?.fqn,
140
+ version: x.constructInfo?.version,
143
141
  });
144
142
  }
145
- for (const child of Object.values((_e = x.children) !== null && _e !== void 0 ? _e : {})) {
143
+ for (const child of Object.values(x.children ?? {})) {
146
144
  recurse(child);
147
145
  }
148
146
  }
@@ -167,15 +165,14 @@ class Notices {
167
165
  return this._instance;
168
166
  }
169
167
  constructor(props) {
170
- var _a, _b, _c, _d;
171
168
  this.data = new Set();
172
169
  // sets don't deduplicate interfaces, so we use a map.
173
170
  this.bootstrappedEnvironments = new Map();
174
171
  this.context = props.context;
175
- this.acknowledgedIssueNumbers = new Set((_a = this.context.get('acknowledged-issue-numbers')) !== null && _a !== void 0 ? _a : []);
176
- this.includeAcknowlegded = (_b = props.includeAcknowledged) !== null && _b !== void 0 ? _b : false;
177
- this.output = (_c = props.output) !== null && _c !== void 0 ? _c : 'cdk.out';
178
- this.httpOptions = (_d = props.httpOptions) !== null && _d !== void 0 ? _d : {};
172
+ this.acknowledgedIssueNumbers = new Set(this.context.get('acknowledged-issue-numbers') ?? []);
173
+ this.includeAcknowlegded = props.includeAcknowledged ?? false;
174
+ this.output = props.output ?? 'cdk.out';
175
+ this.httpOptions = props.httpOptions ?? {};
179
176
  this.ioMessages = new private_1.IoDefaultMessages((0, private_1.asIoHelper)(props.ioHost, 'notices' /* forcing a CliAction to a ToolkitAction */));
180
177
  }
181
178
  /**
@@ -199,10 +196,9 @@ class Notices {
199
196
  * If context is configured to not display notices, this will no-op.
200
197
  */
201
198
  async refresh(options = {}) {
202
- var _a, _b;
203
199
  try {
204
- const underlyingDataSource = (_a = options.dataSource) !== null && _a !== void 0 ? _a : new WebsiteNoticeDataSource(this.ioMessages, this.httpOptions);
205
- const dataSource = new CachedDataSource(this.ioMessages, CACHE_FILE_PATH, underlyingDataSource, (_b = options.force) !== null && _b !== void 0 ? _b : false);
200
+ const underlyingDataSource = options.dataSource ?? new WebsiteNoticeDataSource(this.ioMessages, this.httpOptions);
201
+ const dataSource = new CachedDataSource(this.ioMessages, CACHE_FILE_PATH, underlyingDataSource, options.force ?? false);
206
202
  const notices = await dataSource.fetch();
207
203
  this.data = new Set(this.includeAcknowlegded ? notices : notices.filter(n => !this.acknowledgedIssueNumbers.has(n.issueNumber)));
208
204
  }
@@ -214,7 +210,6 @@ class Notices {
214
210
  * Display the relevant notices (unless context dictates we shouldn't).
215
211
  */
216
212
  display(options = {}) {
217
- var _a;
218
213
  const filteredNotices = new NoticesFilter(this.ioMessages).filter({
219
214
  data: Array.from(this.data),
220
215
  cliVersion: (0, version_1.versionNumber)(),
@@ -243,7 +238,7 @@ class Notices {
243
238
  }
244
239
  void this.ioMessages.notify(private_1.IO.CDK_TOOLKIT_I0100.msg(`If you don’t want to see a notice anymore, use "cdk acknowledge <id>". For example, "cdk acknowledge ${filteredNotices[0].notice.issueNumber}".`));
245
240
  }
246
- if ((_a = options.showTotal) !== null && _a !== void 0 ? _a : false) {
241
+ if (options.showTotal ?? false) {
247
242
  void this.ioMessages.notify(private_1.IO.CDK_TOOLKIT_I0100.msg(`\nThere are ${filteredNotices.length} unacknowledged notice(s).`));
248
243
  }
249
244
  }
@@ -290,7 +285,7 @@ class FilteredNotice {
290
285
  }
291
286
  resolveDynamicValues(input) {
292
287
  const pattern = new RegExp(Object.keys(this.dynamicValues).join('|'), 'g');
293
- return input.replace(pattern, (matched) => { var _a; return (_a = this.dynamicValues[matched]) !== null && _a !== void 0 ? _a : matched; });
288
+ return input.replace(pattern, (matched) => this.dynamicValues[matched] ?? matched);
294
289
  }
295
290
  }
296
291
  exports.FilteredNotice = FilteredNotice;
@@ -305,7 +300,7 @@ class WebsiteNoticeDataSource {
305
300
  let req;
306
301
  let timer = setTimeout(() => {
307
302
  if (req) {
308
- req.destroy(new error_1.ToolkitError('Request timed out'));
303
+ req.destroy(new api_1.ToolkitError('Request timed out'));
309
304
  }
310
305
  }, timeout);
311
306
  timer.unref();
@@ -324,27 +319,27 @@ class WebsiteNoticeDataSource {
324
319
  try {
325
320
  const data = JSON.parse(rawData).notices;
326
321
  if (!data) {
327
- throw new error_1.ToolkitError("'notices' key is missing");
322
+ throw new api_1.ToolkitError("'notices' key is missing");
328
323
  }
329
324
  this.ioMessages.debug('Notices refreshed');
330
- resolve(data !== null && data !== void 0 ? data : []);
325
+ resolve(data ?? []);
331
326
  }
332
327
  catch (e) {
333
- reject(new error_1.ToolkitError(`Failed to parse notices: ${(0, util_1.formatErrorMessage)(e)}`));
328
+ reject(new api_1.ToolkitError(`Failed to parse notices: ${(0, util_1.formatErrorMessage)(e)}`));
334
329
  }
335
330
  });
336
331
  res.on('error', e => {
337
- reject(new error_1.ToolkitError(`Failed to fetch notices: ${(0, util_1.formatErrorMessage)(e)}`));
332
+ reject(new api_1.ToolkitError(`Failed to fetch notices: ${(0, util_1.formatErrorMessage)(e)}`));
338
333
  });
339
334
  }
340
335
  else {
341
- reject(new error_1.ToolkitError(`Failed to fetch notices. Status code: ${res.statusCode}`));
336
+ reject(new api_1.ToolkitError(`Failed to fetch notices. Status code: ${res.statusCode}`));
342
337
  }
343
338
  });
344
339
  req.on('error', reject);
345
340
  }
346
341
  catch (e) {
347
- reject(new error_1.ToolkitError(`HTTPS 'get' call threw an error: ${(0, util_1.formatErrorMessage)(e)}`));
342
+ reject(new api_1.ToolkitError(`HTTPS 'get' call threw an error: ${(0, util_1.formatErrorMessage)(e)}`));
348
343
  }
349
344
  });
350
345
  }
@@ -360,10 +355,9 @@ class CachedDataSource {
360
355
  this.skipCache = skipCache;
361
356
  }
362
357
  async fetch() {
363
- var _a;
364
358
  const cachedData = await this.load();
365
359
  const data = cachedData.notices;
366
- const expiration = (_a = cachedData.expiration) !== null && _a !== void 0 ? _a : 0;
360
+ const expiration = cachedData.expiration ?? 0;
367
361
  if (Date.now() > expiration || this.skipCache) {
368
362
  const freshData = await this.fetchInner();
369
363
  await this.save(freshData);
@@ -414,4 +408,4 @@ class CachedDataSource {
414
408
  }
415
409
  }
416
410
  exports.CachedDataSource = CachedDataSource;
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5vdGljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsb0NBQW9DO0FBQ3BDLDZCQUE2QjtBQUU3QiwrQkFBK0I7QUFDL0IsaUNBQWlDO0FBRWpDLHdFQUFvRTtBQUVwRSwyQ0FBOEM7QUFFOUMsMkNBQStDO0FBRS9DLGlDQUF5QztBQUN6QyxpQ0FBeUQ7QUFDekQsbUZBQTBHO0FBRTFHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSxrQkFBVyxHQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFrRWpFLE1BQWEsYUFBYTtJQUN4QixZQUE2QixVQUE2QjtRQUE3QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtJQUMxRCxDQUFDO0lBRU0sTUFBTSxDQUFDLE9BQW1DO1FBQy9DLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDL0MsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztTQUNqQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsT0FBbUM7UUFDekQsT0FBTztZQUNMLE1BQU07WUFDTjtnQkFDRSxJQUFJLEVBQUUsS0FBSztnQkFDWCxPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVU7YUFDNUI7WUFFRCxlQUFlO1lBQ2Y7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSx5QkFBeUI7Z0JBQ3JFLFdBQVcsRUFBRSxNQUFNO2FBQ3BCO1lBRUQseUJBQXlCO1lBQ3pCLEdBQUcsT0FBTyxDQUFDLHdCQUF3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QUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMseUNBQXlDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTdERCw0Q0E2REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENsaWVudFJlcXVlc3QgfSBmcm9tICdodHRwJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdodHRwcyc7XG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tICdub2RlOmh0dHBzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IEVudmlyb25tZW50IH0gZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHR5cGUgeyBTZGtIdHRwT3B0aW9ucyB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEF3c0NsaUNvbXBhdGlibGUgfSBmcm9tICcuL2FwaS9hd3MtYXV0aC9hd3NjbGktY29tcGF0aWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICcuL2FwaS9jb250ZXh0JztcbmltcG9ydCB7IHZlcnNpb25OdW1iZXIgfSBmcm9tICcuL2NsaS92ZXJzaW9uJztcbmltcG9ydCB0eXBlIHsgSUlvSG9zdCB9IGZyb20gJy4vdG9vbGtpdC9jbGktaW8taG9zdCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuL3Rvb2xraXQvZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RUcmVlTm9kZSB9IGZyb20gJy4vdHJlZSc7XG5pbXBvcnQgeyBsb2FkVHJlZUZyb21EaXIgfSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0IHsgY2RrQ2FjaGVEaXIsIGZvcm1hdEVycm9yTWVzc2FnZSB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBJTywgYXNJb0hlbHBlciwgSW9EZWZhdWx0TWVzc2FnZXMgfSBmcm9tICcuLi8uLi9AYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzL3NyYy9hcGkvaW8vcHJpdmF0ZSc7XG5cbmNvbnN0IENBQ0hFX0ZJTEVfUEFUSCA9IHBhdGguam9pbihjZGtDYWNoZURpcigpLCAnbm90aWNlcy5qc29uJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWNlc1Byb3BzIHtcbiAgLyoqXG4gICAqIENESyBjb250ZXh0XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIG5vdGljZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhY2tub3dsZWRnZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlQWNrbm93bGVkZ2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogR2xvYmFsIENMSSBvcHRpb24gZm9yIG91dHB1dCBkaXJlY3RvcnkgZm9yIHN5bnRoZXNpemVkIGNsb3VkIGFzc2VtYmx5XG4gICAqXG4gICAqIEBkZWZhdWx0ICdjZGsub3V0J1xuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciB0aGUgSFRUUCByZXF1ZXN0XG4gICAqL1xuICByZWFkb25seSBodHRwT3B0aW9ucz86IFNka0h0dHBPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXaGVyZSBtZXNzYWdlcyBhcmUgZ29pbmcgdG8gYmUgc2VudFxuICAgKi9cbiAgcmVhZG9ubHkgaW9Ib3N0OiBJSW9Ib3N0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGljZXNQcmludE9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFwcGVuZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVuYWNrbm93bGVkZ2VkIG5vdGljZXMgdG8gdGhlIGRpc3BsYXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzaG93VG90YWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGljZXNSZWZyZXNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIGEgY2FjaGUgcmVmcmVzaCByZWdhcmRsZXNzIG9mIGV4cGlyYXRpb24gdGltZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGF0YSBzb3VyY2UgZm9yIGZldGNoIG5vdGljZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBXZWJzaXRlTm90aWNlRGF0YVNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YVNvdXJjZT86IE5vdGljZURhdGFTb3VyY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWNlc0ZpbHRlckZpbHRlck9wdGlvbnMge1xuICByZWFkb25seSBkYXRhOiBOb3RpY2VbXTtcbiAgcmVhZG9ubHkgY2xpVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBvdXREaXI6IHN0cmluZztcbiAgcmVhZG9ubHkgYm9vdHN0cmFwcGVkRW52aXJvbm1lbnRzOiBCb290c3RyYXBwZWRFbnZpcm9ubWVudFtdO1xufVxuXG5leHBvcnQgY2xhc3MgTm90aWNlc0ZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW9NZXNzYWdlczogSW9EZWZhdWx0TWVzc2FnZXMpIHtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXIob3B0aW9uczogTm90aWNlc0ZpbHRlckZpbHRlck9wdGlvbnMpOiBGaWx0ZXJlZE5vdGljZVtdIHtcbiAgICBjb25zdCBjb21wb25lbnRzID0gW1xuICAgICAgLi4udGhpcy5jb25zdHJ1Y3RUcmVlQ29tcG9uZW50cyhvcHRpb25zLm91dERpciksXG4gICAgICAuLi50aGlzLm90aGVyQ29tcG9uZW50cyhvcHRpb25zKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluZEZvck5hbWVkQ29tcG9uZW50cyhvcHRpb25zLmRhdGEsIGNvbXBvbmVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyb20gYSBzZXQgb2YgaW5wdXQgb3B0aW9ucywgcmV0dXJuIHRoZSBub3RpY2VzIGNvbXBvbmVudHMgd2UgYXJlIHNlYXJjaGluZyBmb3JcbiAgICovXG4gIHByaXZhdGUgb3RoZXJDb21wb25lbnRzKG9wdGlvbnM6IE5vdGljZXNGaWx0ZXJGaWx0ZXJPcHRpb25zKTogQWN0dWFsQ29tcG9uZW50W10ge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBDTElcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NsaScsXG4gICAgICAgIHZlcnNpb246IG9wdGlvbnMuY2xpVmVyc2lvbixcbiAgICAgIH0sXG5cbiAgICAgIC8vIE5vZGUgdmVyc2lvblxuICAgICAge1xuICAgICAgICBuYW1lOiAnbm9kZScsXG4gICAgICAgIHZlcnNpb246IHByb2Nlc3MudmVyc2lvbi5yZXBsYWNlKC9edi8sICcnKSwgLy8gcmVtb3ZlIHRoZSAndicgcHJlZml4LlxuICAgICAgICBkeW5hbWljTmFtZTogJ25vZGUnLFxuICAgICAgfSxcblxuICAgICAgLy8gQm9vdHN0cmFwIGVudmlyb25tZW50c1xuICAgICAgLi4ub3B0aW9ucy5ib290c3RyYXBwZWRFbnZpcm9ubWVudHMuZmxhdE1hcChlbnYgPT4ge1xuICAgICAgICBjb25zdCBzZW12ZXJCb290c3RyYXBWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShlbnYuYm9vdHN0cmFwU3RhY2tWZXJzaW9uKTtcbiAgICAgICAgaWYgKCFzZW12ZXJCb290c3RyYXBWZXJzaW9uKSB7XG4gICAgICAgICAgLy8gd2UgZG9uJ3QgdGhyb3cgYmVjYXVzZSBub3RpY2VzIHNob3VsZCBuZXZlciBjcmFzaCB0aGUgY2xpLlxuICAgICAgICAgIHRoaXMuaW9NZXNzYWdlcy53YXJuaW5nKGBXaGlsZSBmaWx0ZXJpbmcgbm90aWNlcywgY291bGQgbm90IGNvZXJjZSBib290c3RyYXAgdmVyc2lvbiAnJHtlbnYuYm9vdHN0cmFwU3RhY2tWZXJzaW9ufScgaW50byBzZW12ZXJgKTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICBuYW1lOiAnYm9vdHN0cmFwJyxcbiAgICAgICAgICB2ZXJzaW9uOiBgJHtzZW12ZXJCb290c3RyYXBWZXJzaW9ufWAsXG4gICAgICAgICAgZHluYW1pY05hbWU6ICdFTlZJUk9OTUVOVFMnLFxuICAgICAgICAgIGR5bmFtaWNWYWx1ZTogZW52LmVudmlyb25tZW50Lm5hbWUsXG4gICAgICAgIH1dO1xuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXNlZCBvbiBhIHNldCBvZiBjb21wb25lbnQgbmFtZXMsIGZpbmQgYWxsIG5vdGljZXMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIGdpdmVuIGNvbXBvbmVudHNcbiAgICovXG4gIHByaXZhdGUgZmluZEZvck5hbWVkQ29tcG9uZW50cyhkYXRhOiBOb3RpY2VbXSwgYWN0dWFsQ29tcG9uZW50czogQWN0dWFsQ29tcG9uZW50W10pOiBGaWx0ZXJlZE5vdGljZVtdIHtcbiAgICByZXR1cm4gZGF0YS5mbGF0TWFwKG5vdGljZSA9PiB7XG4gICAgICBjb25zdCBvcnMgPSB0aGlzLnJlc29sdmVBbGlhc2VzKG5vcm1hbGl6ZUNvbXBvbmVudHMobm90aWNlLmNvbXBvbmVudHMpKTtcblxuICAgICAgLy8gRmluZCB0aGUgZmlyc3Qgc2V0IG9mIHRoZSBkaXNqdW5jdGlvbnMgb2Ygd2hpY2ggYWxsIGNvbXBvbmVudHMgbWF0Y2ggYWdhaW5zdCB0aGUgYWN0dWFsIGNvbXBvbmVudHMuXG4gICAgICAvLyBSZXR1cm4gdGhlIGFjdHVhbCBjb21wb25lbnRzIHdlIGZvdW5kIHNvIHRoYXQgd2UgY2FuIGluamVjdCB0aGVpciBkeW5hbWljIHZhbHVlcy4gQSBzaW5nbGUgZmlsdGVyXG4gICAgICAvLyBjb21wb25lbnQgY2FuIG1hdGNoIG1vcmUgdGhhbiBvbmUgYWN0dWFsIGNvbXBvbmVudFxuICAgICAgZm9yIChjb25zdCBhbmRzIG9mIG9ycykge1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gYW5kcy5tYXAoYWZmZWN0ZWQgPT4gYWN0dWFsQ29tcG9uZW50cy5maWx0ZXIoYWN0dWFsID0+XG4gICAgICAgICAgdGhpcy5jb21wb25lbnROYW1lTWF0Y2hlcyhhZmZlY3RlZCwgYWN0dWFsKSAmJiBzZW12ZXIuc2F0aXNmaWVzKGFjdHVhbC52ZXJzaW9uLCBhZmZlY3RlZC52ZXJzaW9uLCB7IGluY2x1ZGVQcmVyZWxlYXNlOiB0cnVlIH0pKSk7XG5cbiAgICAgICAgLy8gRm9yIGV2ZXJ5IGNsYXVzZSBpbiB0aGUgZmlsdGVyIHdlIG1hdGNoZWQgb25lIG9yIG1vcmUgY29tcG9uZW50c1xuICAgICAgICBpZiAobWF0Y2hlZC5ldmVyeSh4cyA9PiB4cy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgIGNvbnN0IHJldCA9IG5ldyBGaWx0ZXJlZE5vdGljZShub3RpY2UpO1xuICAgICAgICAgIHRoaXMuYWRkRHluYW1pY1ZhbHVlcyhtYXRjaGVkLmZsYXRNYXAoeCA9PiB4KSwgcmV0KTtcbiAgICAgICAgICByZXR1cm4gW3JldF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGdpdmVuIFwiYWZmZWN0ZWQgY29tcG9uZW50XCIgbmFtZSBhcHBsaWVzIHRvIHRoZSBnaXZlbiBhY3R1YWwgY29tcG9uZW50IG5hbWUuXG4gICAqXG4gICAqIFRoZSBuYW1lIG1hdGNoZXMgaWYgdGhlIG5hbWUgaXMgZXhhY3RseSB0aGUgc2FtZSwgb3IgdGhlIG5hbWUgaW4gdGhlIG5vdGljZVxuICAgKiBpcyBhIHByZWZpeCBvZiB0aGUgbm9kZSBuYW1lIHdoZW4gdGhlIHF1ZXJ5IGVuZHMgaW4gJy4nLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wb25lbnROYW1lTWF0Y2hlcyhwYXR0ZXJuOiBDb21wb25lbnQsIGFjdHVhbDogQWN0dWFsQ29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhdHRlcm4ubmFtZS5lbmRzV2l0aCgnLicpID8gYWN0dWFsLm5hbWUuc3RhcnRzV2l0aChwYXR0ZXJuLm5hbWUpIDogcGF0dGVybi5uYW1lID09PSBhY3R1YWwubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGR5bmFtaWMgdmFsdWVzIGZyb20gdGhlIGdpdmVuIEFjdHVhbENvbXBvbmVudHNcbiAgICpcbiAgICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvbXBvbmVudHMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIG5hbWUsIHRoZXkgYXJlIGpvaW5lZFxuICAgKiBieSBhIGNvbW1hLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGREeW5hbWljVmFsdWVzKGNvbXBzOiBBY3R1YWxDb21wb25lbnRbXSwgbm90aWNlOiBGaWx0ZXJlZE5vdGljZSkge1xuICAgIGNvbnN0IGR5bmFtaWNWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wcykge1xuICAgICAgaWYgKGNvbXAuZHluYW1pY05hbWUpIHtcbiAgICAgICAgZHluYW1pY1ZhbHVlc1tjb21wLmR5bmFtaWNOYW1lXSA9IGR5bmFtaWNWYWx1ZXNbY29tcC5keW5hbWljTmFtZV0gPz8gW107XG4gICAgICAgIGR5bmFtaWNWYWx1ZXNbY29tcC5keW5hbWljTmFtZV0ucHVzaChjb21wLmR5bmFtaWNWYWx1ZSA/PyBjb21wLnZlcnNpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMoZHluYW1pY1ZhbHVlcykpIHtcbiAgICAgIG5vdGljZS5hZGREeW5hbWljVmFsdWUoa2V5LCB2YWx1ZXMuam9pbignLCcpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJlYXQgJ2ZyYW1ld29yaycgYXMgYW4gYWxpYXMgZm9yIGVpdGhlciBgYXdzLWNkay1saWIuYCBvciBgQGF3cy1jZGsvY29yZS5gLlxuICAgKlxuICAgKiBCZWNhdXNlIGl0J3MgRUlUSEVSIGBhd3MtY2RrLWxpYmAgb3IgYEBhd3MtY2RrL2NvcmVgLCB3ZSBuZWVkIHRvIGFkZCBtdWx0aXBsZVxuICAgKiBhcnJheXMgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUFsaWFzZXMob3JzOiBDb21wb25lbnRbXVtdKTogQ29tcG9uZW50W11bXSB7XG4gICAgcmV0dXJuIG9ycy5mbGF0TWFwKGFuZHMgPT4ge1xuICAgICAgY29uc3QgaGFzRnJhbWV3b3JrID0gYW5kcy5maW5kKGMgPT4gYy5uYW1lID09PSAnZnJhbWV3b3JrJyk7XG4gICAgICBpZiAoIWhhc0ZyYW1ld29yaykge1xuICAgICAgICByZXR1cm4gW2FuZHNdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW1xuICAgICAgICBhbmRzLm1hcChjID0+IGMubmFtZSA9PT0gJ2ZyYW1ld29yaycgPyB7IC4uLmMsIG5hbWU6ICdAYXdzLWNkay9jb3JlLicgfSA6IGMpLFxuICAgICAgICBhbmRzLm1hcChjID0+IGMubmFtZSA9PT0gJ2ZyYW1ld29yaycgPyB7IC4uLmMsIG5hbWU6ICdhd3MtY2RrLWxpYi4nIH0gOiBjKSxcbiAgICAgIF07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgY29uc3RydWN0IHRyZWUgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGFuZCByZXR1cm4gaXRzIGNvbXBvbmVudHNcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0VHJlZUNvbXBvbmVudHMobWFuaWZlc3REaXI6IHN0cmluZyk6IEFjdHVhbENvbXBvbmVudFtdIHtcbiAgICBjb25zdCB0cmVlID0gbG9hZFRyZWVGcm9tRGlyKG1hbmlmZXN0RGlyKTtcbiAgICBpZiAoIXRyZWUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQ6IEFjdHVhbENvbXBvbmVudFtdID0gW107XG4gICAgcmVjdXJzZSh0cmVlKTtcbiAgICByZXR1cm4gcmV0O1xuXG4gICAgZnVuY3Rpb24gcmVjdXJzZSh4OiBDb25zdHJ1Y3RUcmVlTm9kZSkge1xuICAgICAgaWYgKHguY29uc3RydWN0SW5mbz8uZnFuICYmIHguY29uc3RydWN0SW5mbz8udmVyc2lvbikge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgbmFtZTogeC5jb25zdHJ1Y3RJbmZvPy5mcW4sXG4gICAgICAgICAgdmVyc2lvbjogeC5jb25zdHJ1Y3RJbmZvPy52ZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHguY2hpbGRyZW4gPz8ge30pKSB7XG4gICAgICAgIHJlY3Vyc2UoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgQWN0dWFsQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBjb21wb25lbnRcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogSWYgbWF0Y2hlZCwgdW5kZXIgd2hhdCBuYW1lIHNob3VsZCBpdCBiZSBhZGRlZCB0byB0aGUgc2V0IG9mIGR5bmFtaWMgdmFsdWVzXG4gICAqXG4gICAqIFRoZXNlIHdpbGwgYmUgdXNlZCB0byBzdWJzdGl0dXRlIHBsYWNlaG9sZGVycyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcsIHdoZXJlXG4gICAqIHBsYWNlaG9sZGVycyBsb29rIGxpa2UgYHtyZXNvbHZlOlhZWn1gLlxuICAgKlxuICAgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbmFtZSwgdGhleSBhcmVcbiAgICogam9pbmVkIGJ5ICcsJy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBEb24ndCBhZGQgdG8gdGhlIHNldCBvZiBkeW5hbWljIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGR5bmFtaWNOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBtYXRjaGVkLCB3aGF0IHdlIHNob3VsZCBwdXQgaW4gdGhlIHNldCBvZiBkeW5hbWljIHZhbHVlcyBpbnNzdGVhZCBvZiB0aGUgdmVyc2lvbi5cbiAgICpcbiAgICogT25seSB1c2VkIGlmIGBkeW5hbWljTmFtZWAgaXMgc2V0OyBieSBkZWZhdWx0IHdlIHdpbGwgYWRkIHRoZSBhY3R1YWwgdmVyc2lvblxuICAgKiBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZHluYW1pY1ZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgYm9vdHN0cmFwcGVkIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcHBlZEVudmlyb25tZW50IHtcbiAgcmVhZG9ubHkgYm9vdHN0cmFwU3RhY2tWZXJzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhY2Nlc3MgdG8gbm90aWNlcyB0aGUgQ0xJIGNhbiBkaXNwbGF5LlxuICovXG5leHBvcnQgY2xhc3MgTm90aWNlcyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIHJlcGxhY2VzIHRoZSBzaW5nbGV0b24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShwcm9wczogTm90aWNlc1Byb3BzKTogTm90aWNlcyB7XG4gICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgTm90aWNlcyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlLiBNYXkgcmV0dXJuIGB1bmRlZmluZWRgIGlmIGBjcmVhdGVgIGhhcyBub3QgYmVlbiBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCgpOiBOb3RpY2VzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IE5vdGljZXMgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xuICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGFja25vd2xlZGdlZElzc3VlTnVtYmVyczogU2V0PE51bWJlcj47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5jbHVkZUFja25vd2xlZ2RlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBodHRwT3B0aW9uczogU2RrSHR0cE9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW9NZXNzYWdlczogSW9EZWZhdWx0TWVzc2FnZXM7XG5cbiAgcHJpdmF0ZSBkYXRhOiBTZXQ8Tm90aWNlPiA9IG5ldyBTZXQoKTtcblxuICAvLyBzZXRzIGRvbid0IGRlZHVwbGljYXRlIGludGVyZmFjZXMsIHNvIHdlIHVzZSBhIG1hcC5cbiAgcHJpdmF0ZSByZWFkb25seSBib290c3RyYXBwZWRFbnZpcm9ubWVudHM6IE1hcDxzdHJpbmcsIEJvb3RzdHJhcHBlZEVudmlyb25tZW50PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3BzOiBOb3RpY2VzUHJvcHMpIHtcbiAgICB0aGlzLmNvbnRleHQgPSBwcm9wcy5jb250ZXh0O1xuICAgIHRoaXMuYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzID0gbmV3IFNldCh0aGlzLmNvbnRleHQuZ2V0KCdhY2tub3dsZWRnZWQtaXNzdWUtbnVtYmVycycpID8/IFtdKTtcbiAgICB0aGlzLmluY2x1ZGVBY2tub3dsZWdkZWQgPSBwcm9wcy5pbmNsdWRlQWNrbm93bGVkZ2VkID8/IGZhbHNlO1xuICAgIHRoaXMub3V0cHV0ID0gcHJvcHMub3V0cHV0ID8/ICdjZGsub3V0JztcbiAgICB0aGlzLmh0dHBPcHRpb25zID0gcHJvcHMuaHR0cE9wdGlvbnMgPz8ge307XG4gICAgdGhpcy5pb01lc3NhZ2VzID0gbmV3IElvRGVmYXVsdE1lc3NhZ2VzKGFzSW9IZWxwZXIocHJvcHMuaW9Ib3N0LCAnbm90aWNlcycgYXMgYW55IC8qIGZvcmNpbmcgYSBDbGlBY3Rpb24gdG8gYSBUb29sa2l0QWN0aW9uICovKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgYm9vdHN0cmFwIGluZm9ybWF0aW9uIHRvIGZpbHRlciBvbi4gQ2FuIGhhdmUgbXVsdGlwbGUgdmFsdWVzXG4gICAqIGluIGNhc2Ugb2YgbXVsdGktZW52aXJvbm1lbnQgZGVwbG95bWVudHMuXG4gICAqL1xuICBwdWJsaWMgYWRkQm9vdHN0cmFwcGVkRW52aXJvbm1lbnQoYm9vdHN0cmFwcGVkOiBCb290c3RyYXBwZWRFbnZpcm9ubWVudCkge1xuICAgIGNvbnN0IGtleSA9IFtcbiAgICAgIGJvb3RzdHJhcHBlZC5ib290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICBib290c3RyYXBwZWQuZW52aXJvbm1lbnQuYWNjb3VudCxcbiAgICAgIGJvb3RzdHJhcHBlZC5lbnZpcm9ubWVudC5yZWdpb24sXG4gICAgICBib290c3RyYXBwZWQuZW52aXJvbm1lbnQubmFtZSxcbiAgICBdLmpvaW4oJzonKTtcbiAgICB0aGlzLmJvb3RzdHJhcHBlZEVudmlyb25tZW50cy5zZXQoa2V5LCBib290c3RyYXBwZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIGxpc3Qgb2Ygbm90aWNlcyB0aGlzIGluc3RhbmNlIGlzIGF3YXJlIG9mLlxuICAgKiBUbyBtYWtlIHN1cmUgdGhpcyBuZXZlciBjcmFzaGVzIHRoZSBDTEkgcHJvY2VzcywgYWxsIGZhaWx1cmVzIGFyZSBjYXVnaHQgYW5kXG4gICAqIHNpbGVudGx5IGxvZ2dlZC5cbiAgICpcbiAgICogSWYgY29udGV4dCBpcyBjb25maWd1cmVkIHRvIG5vdCBkaXNwbGF5IG5vdGljZXMsIHRoaXMgd2lsbCBuby1vcC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoKG9wdGlvbnM6IE5vdGljZXNSZWZyZXNoT3B0aW9ucyA9IHt9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVuZGVybHlpbmdEYXRhU291cmNlID0gb3B0aW9ucy5kYXRhU291cmNlID8/IG5ldyBXZWJzaXRlTm90aWNlRGF0YVNvdXJjZSh0aGlzLmlvTWVzc2FnZXMsIHRoaXMuaHR0cE9wdGlvbnMpO1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBDYWNoZWREYXRhU291cmNlKHRoaXMuaW9NZXNzYWdlcywgQ0FDSEVfRklMRV9QQVRILCB1bmRlcmx5aW5nRGF0YVNvdXJjZSwgb3B0aW9ucy5mb3JjZSA/PyBmYWxzZSk7XG4gICAgICBjb25zdCBub3RpY2VzID0gYXdhaXQgZGF0YVNvdXJjZS5mZXRjaCgpO1xuICAgICAgdGhpcy5kYXRhID0gbmV3IFNldCh0aGlzLmluY2x1ZGVBY2tub3dsZWdkZWQgPyBub3RpY2VzIDogbm90aWNlcy5maWx0ZXIobiA9PiAhdGhpcy5hY2tub3dsZWRnZWRJc3N1ZU51bWJlcnMuaGFzKG4uaXNzdWVOdW1iZXIpKSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aGlzLmlvTWVzc2FnZXMuZGVidWcoYENvdWxkIG5vdCByZWZyZXNoIG5vdGljZXM6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSB0aGUgcmVsZXZhbnQgbm90aWNlcyAodW5sZXNzIGNvbnRleHQgZGljdGF0ZXMgd2Ugc2hvdWxkbid0KS5cbiAgICovXG4gIHB1YmxpYyBkaXNwbGF5KG9wdGlvbnM6IE5vdGljZXNQcmludE9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGZpbHRlcmVkTm90aWNlcyA9IG5ldyBOb3RpY2VzRmlsdGVyKHRoaXMuaW9NZXNzYWdlcykuZmlsdGVyKHtcbiAgICAgIGRhdGE6IEFycmF5LmZyb20odGhpcy5kYXRhKSxcbiAgICAgIGNsaVZlcnNpb246IHZlcnNpb25OdW1iZXIoKSxcbiAgICAgIG91dERpcjogdGhpcy5vdXRwdXQsXG4gICAgICBib290c3RyYXBwZWRFbnZpcm9ubWVudHM6IEFycmF5LmZyb20odGhpcy5ib290c3RyYXBwZWRFbnZpcm9ubWVudHMudmFsdWVzKCkpLFxuICAgIH0pO1xuXG4gICAgaWYgKGZpbHRlcmVkTm90aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICB2b2lkIHRoaXMuaW9NZXNzYWdlcy5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTAxMDAubXNnKFtcbiAgICAgICAgJycsXG4gICAgICAgICdOT1RJQ0VTICAgICAgICAgKFdoYXRcXCdzIHRoaXM/IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay93aWtpL0NMSS1Ob3RpY2VzKScsXG4gICAgICAgICcnLFxuICAgICAgXS5qb2luKCdcXG4nKSkpO1xuICAgICAgZm9yIChjb25zdCBmaWx0ZXJlZCBvZiBmaWx0ZXJlZE5vdGljZXMpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gZmlsdGVyZWQuZm9ybWF0KCkgKyAnXFxuJztcbiAgICAgICAgc3dpdGNoIChmaWx0ZXJlZC5ub3RpY2Uuc2V2ZXJpdHkpIHtcbiAgICAgICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgICAgIHZvaWQgdGhpcy5pb01lc3NhZ2VzLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XMDEwMS5tc2coZm9ybWF0dGVkKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICB2b2lkIHRoaXMuaW9NZXNzYWdlcy5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTAxMDEubXNnKGZvcm1hdHRlZCkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZvaWQgdGhpcy5pb01lc3NhZ2VzLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMDEwMS5tc2coZm9ybWF0dGVkKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm9pZCB0aGlzLmlvTWVzc2FnZXMubm90aWZ5KElPLkNES19UT09MS0lUX0kwMTAwLm1zZyhcbiAgICAgICAgYElmIHlvdSBkb27igJl0IHdhbnQgdG8gc2VlIGEgbm90aWNlIGFueW1vcmUsIHVzZSBcImNkayBhY2tub3dsZWRnZSA8aWQ+XCIuIEZvciBleGFtcGxlLCBcImNkayBhY2tub3dsZWRnZSAke2ZpbHRlcmVkTm90aWNlc1swXS5ub3RpY2UuaXNzdWVOdW1iZXJ9XCIuYCxcbiAgICAgICkpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3dUb3RhbCA/PyBmYWxzZSkge1xuICAgICAgdm9pZCB0aGlzLmlvTWVzc2FnZXMubm90aWZ5KElPLkNES19UT09MS0lUX0kwMTAwLm1zZyhcbiAgICAgICAgYFxcblRoZXJlIGFyZSAke2ZpbHRlcmVkTm90aWNlcy5sZW5ndGh9IHVuYWNrbm93bGVkZ2VkIG5vdGljZShzKS5gLFxuICAgICAgKSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmFuZ2Ugb2YgYWZmZWN0ZWQgdmVyc2lvbnNcbiAgICovXG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3RpY2Uge1xuICB0aXRsZTogc3RyaW5nO1xuICBpc3N1ZU51bWJlcjogbnVtYmVyO1xuICBvdmVydmlldzogc3RyaW5nO1xuICAvKipcbiAgICogQSBzZXQgb2YgYWZmZWN0ZWQgY29tcG9uZW50c1xuICAgKlxuICAgKiBUaGUgY2Fub25pY2FsIGZvcm0gb2YgYSBsaXN0IG9mIGNvbXBvbmVudHMgaXMgaW4gRGlzanVuY3RpdmUgTm9ybWFsIEZvcm1cbiAgICogKGkuZS4sIGFuIE9SIG9mIEFORHMpLiBUaGlzIGlzIHRoZSBmb3JtIHdoZW4gdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBpcyBhXG4gICAqIGRvdWJseSBuZXN0ZWQgYXJyYXk6IHRoZSBub3RpY2UgbWF0Y2hlcyBpZiBhbGwgY29tcG9uZW50cyBvZiBhdCBsZWFzdCBvbmVcbiAgICogb2YgdGhlIHRvcC1sZXZlbCBhcnJheSBtYXRjaGVzLlxuICAgKlxuICAgKiBJZiB0aGUgYGNvbXBvbmVudHNgIGlzIGEgc2luZ2xlLWxldmVsIGFycmF5LCBpdCBpcyBldmFsdWF0ZWQgYXMgYW4gT1I7IGl0XG4gICAqIG1hdGNoZXMgaWYgYW55IG9mIHRoZSBjb21wb25lbnRzIG1hdGNoZXMuXG4gICAqL1xuICBjb21wb25lbnRzOiBBcnJheTxDb21wb25lbnQgfCBDb21wb25lbnRbXT47XG4gIHNjaGVtYVZlcnNpb246IHN0cmluZztcbiAgc2V2ZXJpdHk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gY29tcG9uZW50cyBzdHJ1Y3R1cmUgaW50byBETkYgZm9ybVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnRzKHhzOiBBcnJheTxDb21wb25lbnQgfCBDb21wb25lbnRbXT4pOiBDb21wb25lbnRbXVtdIHtcbiAgcmV0dXJuIHhzLm1hcCh4ID0+IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogW3hdKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ29uanVuY3Rpb24oeHM6IENvbXBvbmVudFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHhzLm1hcChjID0+IGAke2MubmFtZX06ICR7Yy52ZXJzaW9ufWApLmpvaW4oJyBBTkQgJyk7XG59XG5cbi8qKlxuICogTm90aWNlIGFmdGVyIHBhc3NpbmcgdGhlIGZpbHRlci4gQSBmaWx0ZXIgY2FuIGF1Z21lbnQgYSBub3RpY2Ugd2l0aFxuICogZHluYW1pYyB2YWx1ZXMgYXMgaXQgaGFzIGFjY2VzcyB0byB0aGUgZHluYW1pYyBtYXRjaGluZyBkYXRhLlxuICovXG5leHBvcnQgY2xhc3MgRmlsdGVyZWROb3RpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGR5bmFtaWNWYWx1ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG5vdGljZTogTm90aWNlKSB7XG4gIH1cblxuICBwdWJsaWMgYWRkRHluYW1pY1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5keW5hbWljVmFsdWVzW2B7cmVzb2x2ZToke2tleX19YF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21wb25lbnRzVmFsdWUgPSBub3JtYWxpemVDb21wb25lbnRzKHRoaXMubm90aWNlLmNvbXBvbmVudHMpLm1hcChyZW5kZXJDb25qdW5jdGlvbikuam9pbignLCAnKTtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlRHluYW1pY1ZhbHVlcyhbXG4gICAgICBgJHt0aGlzLm5vdGljZS5pc3N1ZU51bWJlcn1cXHQke3RoaXMubm90aWNlLnRpdGxlfWAsXG4gICAgICB0aGlzLmZvcm1hdE92ZXJ2aWV3KCksXG4gICAgICBgXFx0QWZmZWN0ZWQgdmVyc2lvbnM6ICR7Y29tcG9uZW50c1ZhbHVlfWAsXG4gICAgICBgXFx0TW9yZSBpbmZvcm1hdGlvbiBhdDogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8ke3RoaXMubm90aWNlLmlzc3VlTnVtYmVyfWAsXG4gICAgXS5qb2luKCdcXG5cXG4nKSArICdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0T3ZlcnZpZXcoKSB7XG4gICAgY29uc3Qgd3JhcCA9IChzOiBzdHJpbmcpID0+IHMucmVwbGFjZSgvKD8hW15cXG5dezEsNjB9JCkoW15cXG5dezEsNjB9KVxccy9nLCAnJDFcXG4nKTtcblxuICAgIGNvbnN0IGhlYWRpbmcgPSAnT3ZlcnZpZXc6ICc7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gYFxcblxcdCR7JyAnLnJlcGVhdChoZWFkaW5nLmxlbmd0aCl9YDtcbiAgICBjb25zdCBjb250ZW50ID0gd3JhcCh0aGlzLm5vdGljZS5vdmVydmlldylcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5qb2luKHNlcGFyYXRvcik7XG5cbiAgICByZXR1cm4gJ1xcdCcgKyBoZWFkaW5nICsgY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUR5bmFtaWNWYWx1ZXMoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXModGhpcy5keW5hbWljVmFsdWVzKS5qb2luKCd8JyksICdnJyk7XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocGF0dGVybiwgKG1hdGNoZWQpID0+IHRoaXMuZHluYW1pY1ZhbHVlc1ttYXRjaGVkXSA/PyBtYXRjaGVkKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGljZURhdGFTb3VyY2Uge1xuICBmZXRjaCgpOiBQcm9taXNlPE5vdGljZVtdPjtcbn1cblxuZXhwb3J0IGNsYXNzIFdlYnNpdGVOb3RpY2VEYXRhU291cmNlIGltcGxlbWVudHMgTm90aWNlRGF0YVNvdXJjZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU2RrSHR0cE9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpb01lc3NhZ2VzOiBJb0RlZmF1bHRNZXNzYWdlcywgb3B0aW9uczogU2RrSHR0cE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBmZXRjaCgpOiBQcm9taXNlPE5vdGljZVtdPiB7XG4gICAgY29uc3QgdGltZW91dCA9IDMwMDA7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCByZXE6IENsaWVudFJlcXVlc3QgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAocmVxKSB7XG4gICAgICAgICAgcmVxLmRlc3Ryb3kobmV3IFRvb2xraXRFcnJvcignUmVxdWVzdCB0aW1lZCBvdXQnKSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICB0aW1lci51bnJlZigpO1xuXG4gICAgICBjb25zdCBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgYWdlbnQ6IEF3c0NsaUNvbXBhdGlibGUucHJveHlBZ2VudCh0aGlzLm9wdGlvbnMpLFxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxID0gaHR0cHMuZ2V0KCdodHRwczovL2NsaS5jZGsuZGV2LXRvb2xzLmF3cy5kZXYvbm90aWNlcy5qc29uJyxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgICAgICAgICByZXMuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgbGV0IHJhd0RhdGEgPSAnJztcbiAgICAgICAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgcmF3RGF0YSArPSBjaHVuaztcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJlcy5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyYXdEYXRhKS5ub3RpY2VzIGFzIE5vdGljZVtdO1xuICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXCInbm90aWNlcycga2V5IGlzIG1pc3NpbmdcIik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aGlzLmlvTWVzc2FnZXMuZGVidWcoJ05vdGljZXMgcmVmcmVzaGVkJyk7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEgPz8gW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUb29sa2l0RXJyb3IoYEZhaWxlZCB0byBwYXJzZSBub3RpY2VzOiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmVzLm9uKCdlcnJvcicsIGUgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggbm90aWNlczogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggbm90aWNlcy4gU3RhdHVzIGNvZGU6ICR7cmVzLnN0YXR1c0NvZGV9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICByZWplY3QobmV3IFRvb2xraXRFcnJvcihgSFRUUFMgJ2dldCcgY2FsbCB0aHJldyBhbiBlcnJvcjogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmludGVyZmFjZSBDYWNoZWROb3RpY2VzIHtcbiAgZXhwaXJhdGlvbjogbnVtYmVyO1xuICBub3RpY2VzOiBOb3RpY2VbXTtcbn1cblxuY29uc3QgVElNRV9UT19MSVZFX1NVQ0NFU1MgPSA2MCAqIDYwICogMTAwMDsgLy8gMSBob3VyXG5jb25zdCBUSU1FX1RPX0xJVkVfRVJST1IgPSAxICogNjAgKiAxMDAwOyAvLyAxIG1pbnV0ZVxuXG5leHBvcnQgY2xhc3MgQ2FjaGVkRGF0YVNvdXJjZSBpbXBsZW1lbnRzIE5vdGljZURhdGFTb3VyY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlvTWVzc2FnZXM6IElvRGVmYXVsdE1lc3NhZ2VzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2U6IE5vdGljZURhdGFTb3VyY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBza2lwQ2FjaGU/OiBib29sZWFuKSB7XG4gIH1cblxuICBhc3luYyBmZXRjaCgpOiBQcm9taXNlPE5vdGljZVtdPiB7XG4gICAgY29uc3QgY2FjaGVkRGF0YSA9IGF3YWl0IHRoaXMubG9hZCgpO1xuICAgIGNvbnN0IGRhdGEgPSBjYWNoZWREYXRhLm5vdGljZXM7XG4gICAgY29uc3QgZXhwaXJhdGlvbiA9IGNhY2hlZERhdGEuZXhwaXJhdGlvbiA/PyAwO1xuXG4gICAgaWYgKERhdGUubm93KCkgPiBleHBpcmF0aW9uIHx8IHRoaXMuc2tpcENhY2hlKSB7XG4gICAgICBjb25zdCBmcmVzaERhdGEgPSBhd2FpdCB0aGlzLmZldGNoSW5uZXIoKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShmcmVzaERhdGEpO1xuICAgICAgcmV0dXJuIGZyZXNoRGF0YS5ub3RpY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlvTWVzc2FnZXMuZGVidWcoYFJlYWRpbmcgY2FjaGVkIG5vdGljZXMgZnJvbSAke3RoaXMuZmlsZU5hbWV9YCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoSW5uZXIoKTogUHJvbWlzZTxDYWNoZWROb3RpY2VzPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4cGlyYXRpb246IERhdGUubm93KCkgKyBUSU1FX1RPX0xJVkVfU1VDQ0VTUyxcbiAgICAgICAgbm90aWNlczogYXdhaXQgdGhpcy5kYXRhU291cmNlLmZldGNoKCksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuaW9NZXNzYWdlcy5kZWJ1ZyhgQ291bGQgbm90IHJlZnJlc2ggbm90aWNlczogJHtlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhwaXJhdGlvbjogRGF0ZS5ub3coKSArIFRJTUVfVE9fTElWRV9FUlJPUixcbiAgICAgICAgbm90aWNlczogW10sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZCgpOiBQcm9taXNlPENhY2hlZE5vdGljZXM+IHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB7XG4gICAgICBleHBpcmF0aW9uOiAwLFxuICAgICAgbm90aWNlczogW10sXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0aGlzLmZpbGVOYW1lKVxuICAgICAgICA/IGF3YWl0IGZzLnJlYWRKU09OKHRoaXMuZmlsZU5hbWUpIGFzIENhY2hlZE5vdGljZXNcbiAgICAgICAgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5pb01lc3NhZ2VzLmRlYnVnKGBGYWlsZWQgdG8gbG9hZCBub3RpY2VzIGZyb20gY2FjaGU6ICR7ZX1gKTtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlKGNhY2hlZDogQ2FjaGVkTm90aWNlcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUpTT04odGhpcy5maWxlTmFtZSwgY2FjaGVkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmlvTWVzc2FnZXMuZGVidWcoYEZhaWxlZCB0byBzdG9yZSBub3RpY2VzIGluIHRoZSBjYWNoZTogJHtlfWApO1xuICAgIH1cbiAgfVxufVxuIl19
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5vdGljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsb0NBQW9DO0FBQ3BDLDZCQUE2QjtBQUU3QiwrQkFBK0I7QUFDL0IsaUNBQWlDO0FBRWpDLHdFQUFvRTtBQUdwRSxxQ0FBNkM7QUFFN0MsMkNBQThDO0FBQzlDLGlDQUF5RDtBQUN6RCxvRUFBMEU7QUFDMUUsbUZBQTBHO0FBRTFHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSxrQkFBVyxHQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFrRWpFLE1BQWEsYUFBYTtJQUN4QixZQUE2QixVQUE2QjtRQUE3QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtJQUMxRCxDQUFDO0lBRU0sTUFBTSxDQUFDLE9BQW1DO1FBQy9DLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDL0MsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztTQUNqQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsT0FBbUM7UUFDekQsT0FBTztZQUNMLE1BQU07WUFDTjtnQkFDRSxJQUFJLEVBQUUsS0FBSztnQkFDWCxPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVU7YUFDNUI7WUFFRCxlQUFlO1lBQ2Y7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSx5QkFBeUI7Z0JBQ3JFLFdBQVcsRUFBRSxNQUFNO2FBQ3BCO1lBRUQseUJBQXlCO1lBQ3pCLEdBQUcsT0FBTyxDQUFDLHdCQUF3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QUFNLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE3REQsNENBNkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbGllbnRSZXF1ZXN0IH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnaHR0cHMnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnbm9kZTpodHRwcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudCB9IGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB0eXBlIHsgU2RrSHR0cE9wdGlvbnMgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBBd3NDbGlDb21wYXRpYmxlIH0gZnJvbSAnLi9hcGkvYXdzLWF1dGgvYXdzY2xpLWNvbXBhdGlibGUnO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSAnLi9hcGkvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdFRyZWVOb2RlIH0gZnJvbSAnLi9hcGkvdHJlZSc7XG5pbXBvcnQgeyBsb2FkVHJlZUZyb21EaXIgfSBmcm9tICcuL2FwaS90cmVlJztcbmltcG9ydCB0eXBlIHsgSUlvSG9zdCB9IGZyb20gJy4vY2xpL2lvLWhvc3QnO1xuaW1wb3J0IHsgdmVyc2lvbk51bWJlciB9IGZyb20gJy4vY2xpL3ZlcnNpb24nO1xuaW1wb3J0IHsgY2RrQ2FjaGVEaXIsIGZvcm1hdEVycm9yTWVzc2FnZSB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi9AYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzL3NyYy9hcGknO1xuaW1wb3J0IHsgSU8sIGFzSW9IZWxwZXIsIElvRGVmYXVsdE1lc3NhZ2VzIH0gZnJvbSAnLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpL2lvL3ByaXZhdGUnO1xuXG5jb25zdCBDQUNIRV9GSUxFX1BBVEggPSBwYXRoLmpvaW4oY2RrQ2FjaGVEaXIoKSwgJ25vdGljZXMuanNvbicpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGljZXNQcm9wcyB7XG4gIC8qKlxuICAgKiBDREsgY29udGV4dFxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dDtcblxuICAvKipcbiAgICogSW5jbHVkZSBub3RpY2VzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWNrbm93bGVkZ2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUFja25vd2xlZGdlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEdsb2JhbCBDTEkgb3B0aW9uIGZvciBvdXRwdXQgZGlyZWN0b3J5IGZvciBzeW50aGVzaXplZCBjbG91ZCBhc3NlbWJseVxuICAgKlxuICAgKiBAZGVmYXVsdCAnY2RrLm91dCdcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dD86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdGhlIEhUVFAgcmVxdWVzdFxuICAgKi9cbiAgcmVhZG9ubHkgaHR0cE9wdGlvbnM/OiBTZGtIdHRwT3B0aW9ucztcblxuICAvKipcbiAgICogV2hlcmUgbWVzc2FnZXMgYXJlIGdvaW5nIHRvIGJlIHNlbnRcbiAgICovXG4gIHJlYWRvbmx5IGlvSG9zdDogSUlvSG9zdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3RpY2VzUHJpbnRPcHRpb25zIHtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhcHBlbmQgdGhlIHRvdGFsIG51bWJlciBvZiB1bmFja25vd2xlZGdlZCBub3RpY2VzIHRvIHRoZSBkaXNwbGF5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1RvdGFsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3RpY2VzUmVmcmVzaE9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBhIGNhY2hlIHJlZnJlc2ggcmVnYXJkbGVzcyBvZiBleHBpcmF0aW9uIHRpbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERhdGEgc291cmNlIGZvciBmZXRjaCBub3RpY2VzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gV2Vic2l0ZU5vdGljZURhdGFTb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFTb3VyY2U/OiBOb3RpY2VEYXRhU291cmNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGljZXNGaWx0ZXJGaWx0ZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZGF0YTogTm90aWNlW107XG4gIHJlYWRvbmx5IGNsaVZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0RGlyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJvb3RzdHJhcHBlZEVudmlyb25tZW50czogQm9vdHN0cmFwcGVkRW52aXJvbm1lbnRbXTtcbn1cblxuZXhwb3J0IGNsYXNzIE5vdGljZXNGaWx0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGlvTWVzc2FnZXM6IElvRGVmYXVsdE1lc3NhZ2VzKSB7XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyKG9wdGlvbnM6IE5vdGljZXNGaWx0ZXJGaWx0ZXJPcHRpb25zKTogRmlsdGVyZWROb3RpY2VbXSB7XG4gICAgY29uc3QgY29tcG9uZW50cyA9IFtcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0VHJlZUNvbXBvbmVudHMob3B0aW9ucy5vdXREaXIpLFxuICAgICAgLi4udGhpcy5vdGhlckNvbXBvbmVudHMob3B0aW9ucyksXG4gICAgXTtcblxuICAgIHJldHVybiB0aGlzLmZpbmRGb3JOYW1lZENvbXBvbmVudHMob3B0aW9ucy5kYXRhLCBjb21wb25lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcm9tIGEgc2V0IG9mIGlucHV0IG9wdGlvbnMsIHJldHVybiB0aGUgbm90aWNlcyBjb21wb25lbnRzIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gICAqL1xuICBwcml2YXRlIG90aGVyQ29tcG9uZW50cyhvcHRpb25zOiBOb3RpY2VzRmlsdGVyRmlsdGVyT3B0aW9ucyk6IEFjdHVhbENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gQ0xJXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjbGknLFxuICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLmNsaVZlcnNpb24sXG4gICAgICB9LFxuXG4gICAgICAvLyBOb2RlIHZlcnNpb25cbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ25vZGUnLFxuICAgICAgICB2ZXJzaW9uOiBwcm9jZXNzLnZlcnNpb24ucmVwbGFjZSgvXnYvLCAnJyksIC8vIHJlbW92ZSB0aGUgJ3YnIHByZWZpeC5cbiAgICAgICAgZHluYW1pY05hbWU6ICdub2RlJyxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEJvb3RzdHJhcCBlbnZpcm9ubWVudHNcbiAgICAgIC4uLm9wdGlvbnMuYm9vdHN0cmFwcGVkRW52aXJvbm1lbnRzLmZsYXRNYXAoZW52ID0+IHtcbiAgICAgICAgY29uc3Qgc2VtdmVyQm9vdHN0cmFwVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UoZW52LmJvb3RzdHJhcFN0YWNrVmVyc2lvbik7XG4gICAgICAgIGlmICghc2VtdmVyQm9vdHN0cmFwVmVyc2lvbikge1xuICAgICAgICAgIC8vIHdlIGRvbid0IHRocm93IGJlY2F1c2Ugbm90aWNlcyBzaG91bGQgbmV2ZXIgY3Jhc2ggdGhlIGNsaS5cbiAgICAgICAgICB0aGlzLmlvTWVzc2FnZXMud2FybmluZyhgV2hpbGUgZmlsdGVyaW5nIG5vdGljZXMsIGNvdWxkIG5vdCBjb2VyY2UgYm9vdHN0cmFwIHZlcnNpb24gJyR7ZW52LmJvb3RzdHJhcFN0YWNrVmVyc2lvbn0nIGludG8gc2VtdmVyYCk7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgbmFtZTogJ2Jvb3RzdHJhcCcsXG4gICAgICAgICAgdmVyc2lvbjogYCR7c2VtdmVyQm9vdHN0cmFwVmVyc2lvbn1gLFxuICAgICAgICAgIGR5bmFtaWNOYW1lOiAnRU5WSVJPTk1FTlRTJyxcbiAgICAgICAgICBkeW5hbWljVmFsdWU6IGVudi5lbnZpcm9ubWVudC5uYW1lLFxuICAgICAgICB9XTtcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQmFzZWQgb24gYSBzZXQgb2YgY29tcG9uZW50IG5hbWVzLCBmaW5kIGFsbCBub3RpY2VzIHRoYXQgbWF0Y2ggb25lIG9mIHRoZSBnaXZlbiBjb21wb25lbnRzXG4gICAqL1xuICBwcml2YXRlIGZpbmRGb3JOYW1lZENvbXBvbmVudHMoZGF0YTogTm90aWNlW10sIGFjdHVhbENvbXBvbmVudHM6IEFjdHVhbENvbXBvbmVudFtdKTogRmlsdGVyZWROb3RpY2VbXSB7XG4gICAgcmV0dXJuIGRhdGEuZmxhdE1hcChub3RpY2UgPT4ge1xuICAgICAgY29uc3Qgb3JzID0gdGhpcy5yZXNvbHZlQWxpYXNlcyhub3JtYWxpemVDb21wb25lbnRzKG5vdGljZS5jb21wb25lbnRzKSk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IHNldCBvZiB0aGUgZGlzanVuY3Rpb25zIG9mIHdoaWNoIGFsbCBjb21wb25lbnRzIG1hdGNoIGFnYWluc3QgdGhlIGFjdHVhbCBjb21wb25lbnRzLlxuICAgICAgLy8gUmV0dXJuIHRoZSBhY3R1YWwgY29tcG9uZW50cyB3ZSBmb3VuZCBzbyB0aGF0IHdlIGNhbiBpbmplY3QgdGhlaXIgZHluYW1pYyB2YWx1ZXMuIEEgc2luZ2xlIGZpbHRlclxuICAgICAgLy8gY29tcG9uZW50IGNhbiBtYXRjaCBtb3JlIHRoYW4gb25lIGFjdHVhbCBjb21wb25lbnRcbiAgICAgIGZvciAoY29uc3QgYW5kcyBvZiBvcnMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZCA9IGFuZHMubWFwKGFmZmVjdGVkID0+IGFjdHVhbENvbXBvbmVudHMuZmlsdGVyKGFjdHVhbCA9PlxuICAgICAgICAgIHRoaXMuY29tcG9uZW50TmFtZU1hdGNoZXMoYWZmZWN0ZWQsIGFjdHVhbCkgJiYgc2VtdmVyLnNhdGlzZmllcyhhY3R1YWwudmVyc2lvbiwgYWZmZWN0ZWQudmVyc2lvbiwgeyBpbmNsdWRlUHJlcmVsZWFzZTogdHJ1ZSB9KSkpO1xuXG4gICAgICAgIC8vIEZvciBldmVyeSBjbGF1c2UgaW4gdGhlIGZpbHRlciB3ZSBtYXRjaGVkIG9uZSBvciBtb3JlIGNvbXBvbmVudHNcbiAgICAgICAgaWYgKG1hdGNoZWQuZXZlcnkoeHMgPT4geHMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICBjb25zdCByZXQgPSBuZXcgRmlsdGVyZWROb3RpY2Uobm90aWNlKTtcbiAgICAgICAgICB0aGlzLmFkZER5bmFtaWNWYWx1ZXMobWF0Y2hlZC5mbGF0TWFwKHggPT4geCksIHJldCk7XG4gICAgICAgICAgcmV0dXJuIFtyZXRdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBnaXZlbiBcImFmZmVjdGVkIGNvbXBvbmVudFwiIG5hbWUgYXBwbGllcyB0byB0aGUgZ2l2ZW4gYWN0dWFsIGNvbXBvbmVudCBuYW1lLlxuICAgKlxuICAgKiBUaGUgbmFtZSBtYXRjaGVzIGlmIHRoZSBuYW1lIGlzIGV4YWN0bHkgdGhlIHNhbWUsIG9yIHRoZSBuYW1lIGluIHRoZSBub3RpY2VcbiAgICogaXMgYSBwcmVmaXggb2YgdGhlIG5vZGUgbmFtZSB3aGVuIHRoZSBxdWVyeSBlbmRzIGluICcuJy5cbiAgICovXG4gIHByaXZhdGUgY29tcG9uZW50TmFtZU1hdGNoZXMocGF0dGVybjogQ29tcG9uZW50LCBhY3R1YWw6IEFjdHVhbENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXR0ZXJuLm5hbWUuZW5kc1dpdGgoJy4nKSA/IGFjdHVhbC5uYW1lLnN0YXJ0c1dpdGgocGF0dGVybi5uYW1lKSA6IHBhdHRlcm4ubmFtZSA9PT0gYWN0dWFsLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBkeW5hbWljIHZhbHVlcyBmcm9tIHRoZSBnaXZlbiBBY3R1YWxDb21wb25lbnRzXG4gICAqXG4gICAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb21wb25lbnRzIHdpdGggdGhlIHNhbWUgZHluYW1pYyBuYW1lLCB0aGV5IGFyZSBqb2luZWRcbiAgICogYnkgYSBjb21tYS5cbiAgICovXG4gIHByaXZhdGUgYWRkRHluYW1pY1ZhbHVlcyhjb21wczogQWN0dWFsQ29tcG9uZW50W10sIG5vdGljZTogRmlsdGVyZWROb3RpY2UpIHtcbiAgICBjb25zdCBkeW5hbWljVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgY29tcHMpIHtcbiAgICAgIGlmIChjb21wLmR5bmFtaWNOYW1lKSB7XG4gICAgICAgIGR5bmFtaWNWYWx1ZXNbY29tcC5keW5hbWljTmFtZV0gPSBkeW5hbWljVmFsdWVzW2NvbXAuZHluYW1pY05hbWVdID8/IFtdO1xuICAgICAgICBkeW5hbWljVmFsdWVzW2NvbXAuZHluYW1pY05hbWVdLnB1c2goY29tcC5keW5hbWljVmFsdWUgPz8gY29tcC52ZXJzaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKGR5bmFtaWNWYWx1ZXMpKSB7XG4gICAgICBub3RpY2UuYWRkRHluYW1pY1ZhbHVlKGtleSwgdmFsdWVzLmpvaW4oJywnKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyZWF0ICdmcmFtZXdvcmsnIGFzIGFuIGFsaWFzIGZvciBlaXRoZXIgYGF3cy1jZGstbGliLmAgb3IgYEBhd3MtY2RrL2NvcmUuYC5cbiAgICpcbiAgICogQmVjYXVzZSBpdCdzIEVJVEhFUiBgYXdzLWNkay1saWJgIG9yIGBAYXdzLWNkay9jb3JlYCwgd2UgbmVlZCB0byBhZGQgbXVsdGlwbGVcbiAgICogYXJyYXlzIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVBbGlhc2VzKG9yczogQ29tcG9uZW50W11bXSk6IENvbXBvbmVudFtdW10ge1xuICAgIHJldHVybiBvcnMuZmxhdE1hcChhbmRzID0+IHtcbiAgICAgIGNvbnN0IGhhc0ZyYW1ld29yayA9IGFuZHMuZmluZChjID0+IGMubmFtZSA9PT0gJ2ZyYW1ld29yaycpO1xuICAgICAgaWYgKCFoYXNGcmFtZXdvcmspIHtcbiAgICAgICAgcmV0dXJuIFthbmRzXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgYW5kcy5tYXAoYyA9PiBjLm5hbWUgPT09ICdmcmFtZXdvcmsnID8geyAuLi5jLCBuYW1lOiAnQGF3cy1jZGsvY29yZS4nIH0gOiBjKSxcbiAgICAgICAgYW5kcy5tYXAoYyA9PiBjLm5hbWUgPT09ICdmcmFtZXdvcmsnID8geyAuLi5jLCBuYW1lOiAnYXdzLWNkay1saWIuJyB9IDogYyksXG4gICAgICBdO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIGNvbnN0cnVjdCB0cmVlIGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQgcmV0dXJuIGl0cyBjb21wb25lbnRzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdFRyZWVDb21wb25lbnRzKG1hbmlmZXN0RGlyOiBzdHJpbmcpOiBBY3R1YWxDb21wb25lbnRbXSB7XG4gICAgY29uc3QgdHJlZSA9IGxvYWRUcmVlRnJvbURpcihtYW5pZmVzdERpciwgKG1zZzogc3RyaW5nKSA9PiB2b2lkIHRoaXMuaW9NZXNzYWdlcy5ub3RpZnkoSU8uREVGQVVMVF9BU1NFTUJMWV9UUkFDRS5tc2cobXNnKSkpO1xuICAgIGlmICghdHJlZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJldDogQWN0dWFsQ29tcG9uZW50W10gPSBbXTtcbiAgICByZWN1cnNlKHRyZWUpO1xuICAgIHJldHVybiByZXQ7XG5cbiAgICBmdW5jdGlvbiByZWN1cnNlKHg6IENvbnN0cnVjdFRyZWVOb2RlKSB7XG4gICAgICBpZiAoeC5jb25zdHJ1Y3RJbmZvPy5mcW4gJiYgeC5jb25zdHJ1Y3RJbmZvPy52ZXJzaW9uKSB7XG4gICAgICAgIHJldC5wdXNoKHtcbiAgICAgICAgICBuYW1lOiB4LmNvbnN0cnVjdEluZm8/LmZxbixcbiAgICAgICAgICB2ZXJzaW9uOiB4LmNvbnN0cnVjdEluZm8/LnZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXMoeC5jaGlsZHJlbiA/PyB7fSkpIHtcbiAgICAgICAgcmVjdXJzZShjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBBY3R1YWxDb21wb25lbnQge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBtYXRjaGVkLCB1bmRlciB3aGF0IG5hbWUgc2hvdWxkIGl0IGJlIGFkZGVkIHRvIHRoZSBzZXQgb2YgZHluYW1pYyB2YWx1ZXNcbiAgICpcbiAgICogVGhlc2Ugd2lsbCBiZSB1c2VkIHRvIHN1YnN0aXR1dGUgcGxhY2Vob2xkZXJzIGluIHRoZSBtZXNzYWdlIHN0cmluZywgd2hlcmVcbiAgICogcGxhY2Vob2xkZXJzIGxvb2sgbGlrZSBge3Jlc29sdmU6WFlafWAuXG4gICAqXG4gICAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgZHluYW1pYyBuYW1lLCB0aGV5IGFyZVxuICAgKiBqb2luZWQgYnkgJywnLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERvbid0IGFkZCB0byB0aGUgc2V0IG9mIGR5bmFtaWMgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZHluYW1pY05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIG1hdGNoZWQsIHdoYXQgd2Ugc2hvdWxkIHB1dCBpbiB0aGUgc2V0IG9mIGR5bmFtaWMgdmFsdWVzIGluc3N0ZWFkIG9mIHRoZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaWYgYGR5bmFtaWNOYW1lYCBpcyBzZXQ7IGJ5IGRlZmF1bHQgd2Ugd2lsbCBhZGQgdGhlIGFjdHVhbCB2ZXJzaW9uXG4gICAqIG9mIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBkeW5hbWljVmFsdWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYSBib290c3RyYXBwZWQgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwcGVkRW52aXJvbm1lbnQge1xuICByZWFkb25seSBib290c3RyYXBTdGFja1ZlcnNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byBub3RpY2VzIHRoZSBDTEkgY2FuIGRpc3BsYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RpY2VzIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgcmVwbGFjZXMgdGhlIHNpbmdsZXRvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKHByb3BzOiBOb3RpY2VzUHJvcHMpOiBOb3RpY2VzIHtcbiAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBOb3RpY2VzKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuIE1heSByZXR1cm4gYHVuZGVmaW5lZGAgaWYgYGNyZWF0ZWAgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0KCk6IE5vdGljZXMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogTm90aWNlcyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IENvbnRleHQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzOiBTZXQ8TnVtYmVyPjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmNsdWRlQWNrbm93bGVnZGVkOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGh0dHBPcHRpb25zOiBTZGtIdHRwT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBpb01lc3NhZ2VzOiBJb0RlZmF1bHRNZXNzYWdlcztcblxuICBwcml2YXRlIGRhdGE6IFNldDxOb3RpY2U+ID0gbmV3IFNldCgpO1xuXG4gIC8vIHNldHMgZG9uJ3QgZGVkdXBsaWNhdGUgaW50ZXJmYWNlcywgc28gd2UgdXNlIGEgbWFwLlxuICBwcml2YXRlIHJlYWRvbmx5IGJvb3RzdHJhcHBlZEVudmlyb25tZW50czogTWFwPHN0cmluZywgQm9vdHN0cmFwcGVkRW52aXJvbm1lbnQ+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IE5vdGljZXNQcm9wcykge1xuICAgIHRoaXMuY29udGV4dCA9IHByb3BzLmNvbnRleHQ7XG4gICAgdGhpcy5hY2tub3dsZWRnZWRJc3N1ZU51bWJlcnMgPSBuZXcgU2V0KHRoaXMuY29udGV4dC5nZXQoJ2Fja25vd2xlZGdlZC1pc3N1ZS1udW1iZXJzJykgPz8gW10pO1xuICAgIHRoaXMuaW5jbHVkZUFja25vd2xlZ2RlZCA9IHByb3BzLmluY2x1ZGVBY2tub3dsZWRnZWQgPz8gZmFsc2U7XG4gICAgdGhpcy5vdXRwdXQgPSBwcm9wcy5vdXRwdXQgPz8gJ2Nkay5vdXQnO1xuICAgIHRoaXMuaHR0cE9wdGlvbnMgPSBwcm9wcy5odHRwT3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLmlvTWVzc2FnZXMgPSBuZXcgSW9EZWZhdWx0TWVzc2FnZXMoYXNJb0hlbHBlcihwcm9wcy5pb0hvc3QsICdub3RpY2VzJyBhcyBhbnkgLyogZm9yY2luZyBhIENsaUFjdGlvbiB0byBhIFRvb2xraXRBY3Rpb24gKi8pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBib290c3RyYXAgaW5mb3JtYXRpb24gdG8gZmlsdGVyIG9uLiBDYW4gaGF2ZSBtdWx0aXBsZSB2YWx1ZXNcbiAgICogaW4gY2FzZSBvZiBtdWx0aS1lbnZpcm9ubWVudCBkZXBsb3ltZW50cy5cbiAgICovXG4gIHB1YmxpYyBhZGRCb290c3RyYXBwZWRFbnZpcm9ubWVudChib290c3RyYXBwZWQ6IEJvb3RzdHJhcHBlZEVudmlyb25tZW50KSB7XG4gICAgY29uc3Qga2V5ID0gW1xuICAgICAgYm9vdHN0cmFwcGVkLmJvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgIGJvb3RzdHJhcHBlZC5lbnZpcm9ubWVudC5hY2NvdW50LFxuICAgICAgYm9vdHN0cmFwcGVkLmVudmlyb25tZW50LnJlZ2lvbixcbiAgICAgIGJvb3RzdHJhcHBlZC5lbnZpcm9ubWVudC5uYW1lLFxuICAgIF0uam9pbignOicpO1xuICAgIHRoaXMuYm9vdHN0cmFwcGVkRW52aXJvbm1lbnRzLnNldChrZXksIGJvb3RzdHJhcHBlZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0aGUgbGlzdCBvZiBub3RpY2VzIHRoaXMgaW5zdGFuY2UgaXMgYXdhcmUgb2YuXG4gICAqIFRvIG1ha2Ugc3VyZSB0aGlzIG5ldmVyIGNyYXNoZXMgdGhlIENMSSBwcm9jZXNzLCBhbGwgZmFpbHVyZXMgYXJlIGNhdWdodCBhbmRcbiAgICogc2lsZW50bHkgbG9nZ2VkLlxuICAgKlxuICAgKiBJZiBjb250ZXh0IGlzIGNvbmZpZ3VyZWQgdG8gbm90IGRpc3BsYXkgbm90aWNlcywgdGhpcyB3aWxsIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZnJlc2gob3B0aW9uczogTm90aWNlc1JlZnJlc2hPcHRpb25zID0ge30pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFTb3VyY2UgPSBvcHRpb25zLmRhdGFTb3VyY2UgPz8gbmV3IFdlYnNpdGVOb3RpY2VEYXRhU291cmNlKHRoaXMuaW9NZXNzYWdlcywgdGhpcy5odHRwT3B0aW9ucyk7XG4gICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IENhY2hlZERhdGFTb3VyY2UodGhpcy5pb01lc3NhZ2VzLCBDQUNIRV9GSUxFX1BBVEgsIHVuZGVybHlpbmdEYXRhU291cmNlLCBvcHRpb25zLmZvcmNlID8/IGZhbHNlKTtcbiAgICAgIGNvbnN0IG5vdGljZXMgPSBhd2FpdCBkYXRhU291cmNlLmZldGNoKCk7XG4gICAgICB0aGlzLmRhdGEgPSBuZXcgU2V0KHRoaXMuaW5jbHVkZUFja25vd2xlZ2RlZCA/IG5vdGljZXMgOiBub3RpY2VzLmZpbHRlcihuID0+ICF0aGlzLmFja25vd2xlZGdlZElzc3VlTnVtYmVycy5oYXMobi5pc3N1ZU51bWJlcikpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRoaXMuaW9NZXNzYWdlcy5kZWJ1ZyhgQ291bGQgbm90IHJlZnJlc2ggbm90aWNlczogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSByZWxldmFudCBub3RpY2VzICh1bmxlc3MgY29udGV4dCBkaWN0YXRlcyB3ZSBzaG91bGRuJ3QpLlxuICAgKi9cbiAgcHVibGljIGRpc3BsYXkob3B0aW9uczogTm90aWNlc1ByaW50T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZmlsdGVyZWROb3RpY2VzID0gbmV3IE5vdGljZXNGaWx0ZXIodGhpcy5pb01lc3NhZ2VzKS5maWx0ZXIoe1xuICAgICAgZGF0YTogQXJyYXkuZnJvbSh0aGlzLmRhdGEpLFxuICAgICAgY2xpVmVyc2lvbjogdmVyc2lvbk51bWJlcigpLFxuICAgICAgb3V0RGlyOiB0aGlzLm91dHB1dCxcbiAgICAgIGJvb3RzdHJhcHBlZEVudmlyb25tZW50czogQXJyYXkuZnJvbSh0aGlzLmJvb3RzdHJhcHBlZEVudmlyb25tZW50cy52YWx1ZXMoKSksXG4gICAgfSk7XG5cbiAgICBpZiAoZmlsdGVyZWROb3RpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvaWQgdGhpcy5pb01lc3NhZ2VzLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMDEwMC5tc2coW1xuICAgICAgICAnJyxcbiAgICAgICAgJ05PVElDRVMgICAgICAgICAoV2hhdFxcJ3MgdGhpcz8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3dpa2kvQ0xJLU5vdGljZXMpJyxcbiAgICAgICAgJycsXG4gICAgICBdLmpvaW4oJ1xcbicpKSk7XG4gICAgICBmb3IgKGNvbnN0IGZpbHRlcmVkIG9mIGZpbHRlcmVkTm90aWNlcykge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSBmaWx0ZXJlZC5mb3JtYXQoKSArICdcXG4nO1xuICAgICAgICBzd2l0Y2ggKGZpbHRlcmVkLm5vdGljZS5zZXZlcml0eSkge1xuICAgICAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICAgICAgdm9pZCB0aGlzLmlvTWVzc2FnZXMubm90aWZ5KElPLkNES19UT09MS0lUX1cwMTAxLm1zZyhmb3JtYXR0ZWQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIHZvaWQgdGhpcy5pb01lc3NhZ2VzLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FMDEwMS5tc2coZm9ybWF0dGVkKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdm9pZCB0aGlzLmlvTWVzc2FnZXMubm90aWZ5KElPLkNES19UT09MS0lUX0kwMTAxLm1zZyhmb3JtYXR0ZWQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2b2lkIHRoaXMuaW9NZXNzYWdlcy5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTAxMDAubXNnKFxuICAgICAgICBgSWYgeW91IGRvbuKAmXQgd2FudCB0byBzZWUgYSBub3RpY2UgYW55bW9yZSwgdXNlIFwiY2RrIGFja25vd2xlZGdlIDxpZD5cIi4gRm9yIGV4YW1wbGUsIFwiY2RrIGFja25vd2xlZGdlICR7ZmlsdGVyZWROb3RpY2VzWzBdLm5vdGljZS5pc3N1ZU51bWJlcn1cIi5gLFxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2hvd1RvdGFsID8/IGZhbHNlKSB7XG4gICAgICB2b2lkIHRoaXMuaW9NZXNzYWdlcy5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTAxMDAubXNnKFxuICAgICAgICBgXFxuVGhlcmUgYXJlICR7ZmlsdGVyZWROb3RpY2VzLmxlbmd0aH0gdW5hY2tub3dsZWRnZWQgbm90aWNlKHMpLmAsXG4gICAgICApKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnQge1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByYW5nZSBvZiBhZmZlY3RlZCB2ZXJzaW9uc1xuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGljZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGlzc3VlTnVtYmVyOiBudW1iZXI7XG4gIG92ZXJ2aWV3OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHNldCBvZiBhZmZlY3RlZCBjb21wb25lbnRzXG4gICAqXG4gICAqIFRoZSBjYW5vbmljYWwgZm9ybSBvZiBhIGxpc3Qgb2YgY29tcG9uZW50cyBpcyBpbiBEaXNqdW5jdGl2ZSBOb3JtYWwgRm9ybVxuICAgKiAoaS5lLiwgYW4gT1Igb2YgQU5EcykuIFRoaXMgaXMgdGhlIGZvcm0gd2hlbiB0aGUgbGlzdCBvZiBjb21wb25lbnRzIGlzIGFcbiAgICogZG91Ymx5IG5lc3RlZCBhcnJheTogdGhlIG5vdGljZSBtYXRjaGVzIGlmIGFsbCBjb21wb25lbnRzIG9mIGF0IGxlYXN0IG9uZVxuICAgKiBvZiB0aGUgdG9wLWxldmVsIGFycmF5IG1hdGNoZXMuXG4gICAqXG4gICAqIElmIHRoZSBgY29tcG9uZW50c2AgaXMgYSBzaW5nbGUtbGV2ZWwgYXJyYXksIGl0IGlzIGV2YWx1YXRlZCBhcyBhbiBPUjsgaXRcbiAgICogbWF0Y2hlcyBpZiBhbnkgb2YgdGhlIGNvbXBvbmVudHMgbWF0Y2hlcy5cbiAgICovXG4gIGNvbXBvbmVudHM6IEFycmF5PENvbXBvbmVudCB8IENvbXBvbmVudFtdPjtcbiAgc2NoZW1hVmVyc2lvbjogc3RyaW5nO1xuICBzZXZlcml0eT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBnaXZlbiBjb21wb25lbnRzIHN0cnVjdHVyZSBpbnRvIERORiBmb3JtXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudHMoeHM6IEFycmF5PENvbXBvbmVudCB8IENvbXBvbmVudFtdPik6IENvbXBvbmVudFtdW10ge1xuICByZXR1cm4geHMubWFwKHggPT4gQXJyYXkuaXNBcnJheSh4KSA/IHggOiBbeF0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDb25qdW5jdGlvbih4czogQ29tcG9uZW50W10pOiBzdHJpbmcge1xuICByZXR1cm4geHMubWFwKGMgPT4gYCR7Yy5uYW1lfTogJHtjLnZlcnNpb259YCkuam9pbignIEFORCAnKTtcbn1cblxuLyoqXG4gKiBOb3RpY2UgYWZ0ZXIgcGFzc2luZyB0aGUgZmlsdGVyLiBBIGZpbHRlciBjYW4gYXVnbWVudCBhIG5vdGljZSB3aXRoXG4gKiBkeW5hbWljIHZhbHVlcyBhcyBpdCBoYXMgYWNjZXNzIHRvIHRoZSBkeW5hbWljIG1hdGNoaW5nIGRhdGEuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWx0ZXJlZE5vdGljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY1ZhbHVlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbm90aWNlOiBOb3RpY2UpIHtcbiAgfVxuXG4gIHB1YmxpYyBhZGREeW5hbWljVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmR5bmFtaWNWYWx1ZXNbYHtyZXNvbHZlOiR7a2V5fX1gXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBvbmVudHNWYWx1ZSA9IG5vcm1hbGl6ZUNvbXBvbmVudHModGhpcy5ub3RpY2UuY29tcG9uZW50cykubWFwKHJlbmRlckNvbmp1bmN0aW9uKS5qb2luKCcsICcpO1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVEeW5hbWljVmFsdWVzKFtcbiAgICAgIGAke3RoaXMubm90aWNlLmlzc3VlTnVtYmVyfVxcdCR7dGhpcy5ub3RpY2UudGl0bGV9YCxcbiAgICAgIHRoaXMuZm9ybWF0T3ZlcnZpZXcoKSxcbiAgICAgIGBcXHRBZmZlY3RlZCB2ZXJzaW9uczogJHtjb21wb25lbnRzVmFsdWV9YCxcbiAgICAgIGBcXHRNb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLyR7dGhpcy5ub3RpY2UuaXNzdWVOdW1iZXJ9YCxcbiAgICBdLmpvaW4oJ1xcblxcbicpICsgJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRPdmVydmlldygpIHtcbiAgICBjb25zdCB3cmFwID0gKHM6IHN0cmluZykgPT4gcy5yZXBsYWNlKC8oPyFbXlxcbl17MSw2MH0kKShbXlxcbl17MSw2MH0pXFxzL2csICckMVxcbicpO1xuXG4gICAgY29uc3QgaGVhZGluZyA9ICdPdmVydmlldzogJztcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBgXFxuXFx0JHsnICcucmVwZWF0KGhlYWRpbmcubGVuZ3RoKX1gO1xuICAgIGNvbnN0IGNvbnRlbnQgPSB3cmFwKHRoaXMubm90aWNlLm92ZXJ2aWV3KVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmpvaW4oc2VwYXJhdG9yKTtcblxuICAgIHJldHVybiAnXFx0JyArIGhlYWRpbmcgKyBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRHluYW1pY1ZhbHVlcyhpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0aGlzLmR5bmFtaWNWYWx1ZXMpLmpvaW4oJ3wnKSwgJ2cnKTtcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4gdGhpcy5keW5hbWljVmFsdWVzW21hdGNoZWRdID8/IG1hdGNoZWQpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWNlRGF0YVNvdXJjZSB7XG4gIGZldGNoKCk6IFByb21pc2U8Tm90aWNlW10+O1xufVxuXG5leHBvcnQgY2xhc3MgV2Vic2l0ZU5vdGljZURhdGFTb3VyY2UgaW1wbGVtZW50cyBOb3RpY2VEYXRhU291cmNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTZGtIdHRwT3B0aW9ucztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGlvTWVzc2FnZXM6IElvRGVmYXVsdE1lc3NhZ2VzLCBvcHRpb25zOiBTZGtIdHRwT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGZldGNoKCk6IFByb21pc2U8Tm90aWNlW10+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gMzAwMDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHJlcTogQ2xpZW50UmVxdWVzdCB8IHVuZGVmaW5lZDtcblxuICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChyZXEpIHtcbiAgICAgICAgICByZXEuZGVzdHJveShuZXcgVG9vbGtpdEVycm9yKCdSZXF1ZXN0IHRpbWVkIG91dCcpKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgIHRpbWVyLnVucmVmKCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBhZ2VudDogQXdzQ2xpQ29tcGF0aWJsZS5wcm94eUFnZW50KHRoaXMub3B0aW9ucyksXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXEgPSBodHRwcy5nZXQoJ2h0dHBzOi8vY2xpLmNkay5kZXYtdG9vbHMuYXdzLmRldi9ub3RpY2VzLmpzb24nLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgIHJlcy5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICAgICAgICBsZXQgcmF3RGF0YSA9ICcnO1xuICAgICAgICAgICAgICByZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgICByYXdEYXRhICs9IGNodW5rO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0RhdGEpLm5vdGljZXMgYXMgTm90aWNlW107XG4gICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcIidub3RpY2VzJyBrZXkgaXMgbWlzc2luZ1wiKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuaW9NZXNzYWdlcy5kZWJ1ZygnTm90aWNlcyByZWZyZXNoZWQnKTtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSA/PyBbXSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICByZWplY3QobmV3IFRvb2xraXRFcnJvcihgRmFpbGVkIHRvIHBhcnNlIG5vdGljZXM6ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXMub24oJ2Vycm9yJywgZSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUb29sa2l0RXJyb3IoYEZhaWxlZCB0byBmZXRjaCBub3RpY2VzOiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUb29sa2l0RXJyb3IoYEZhaWxlZCB0byBmZXRjaCBub3RpY2VzLiBTdGF0dXMgY29kZTogJHtyZXMuc3RhdHVzQ29kZX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJlcS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHJlamVjdChuZXcgVG9vbGtpdEVycm9yKGBIVFRQUyAnZ2V0JyBjYWxsIHRocmV3IGFuIGVycm9yOiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENhY2hlZE5vdGljZXMge1xuICBleHBpcmF0aW9uOiBudW1iZXI7XG4gIG5vdGljZXM6IE5vdGljZVtdO1xufVxuXG5jb25zdCBUSU1FX1RPX0xJVkVfU1VDQ0VTUyA9IDYwICogNjAgKiAxMDAwOyAvLyAxIGhvdXJcbmNvbnN0IFRJTUVfVE9fTElWRV9FUlJPUiA9IDEgKiA2MCAqIDEwMDA7IC8vIDEgbWludXRlXG5cbmV4cG9ydCBjbGFzcyBDYWNoZWREYXRhU291cmNlIGltcGxlbWVudHMgTm90aWNlRGF0YVNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW9NZXNzYWdlczogSW9EZWZhdWx0TWVzc2FnZXMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogTm90aWNlRGF0YVNvdXJjZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNraXBDYWNoZT86IGJvb2xlYW4pIHtcbiAgfVxuXG4gIGFzeW5jIGZldGNoKCk6IFByb21pc2U8Tm90aWNlW10+IHtcbiAgICBjb25zdCBjYWNoZWREYXRhID0gYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgY29uc3QgZGF0YSA9IGNhY2hlZERhdGEubm90aWNlcztcbiAgICBjb25zdCBleHBpcmF0aW9uID0gY2FjaGVkRGF0YS5leHBpcmF0aW9uID8/IDA7XG5cbiAgICBpZiAoRGF0ZS5ub3coKSA+IGV4cGlyYXRpb24gfHwgdGhpcy5za2lwQ2FjaGUpIHtcbiAgICAgIGNvbnN0IGZyZXNoRGF0YSA9IGF3YWl0IHRoaXMuZmV0Y2hJbm5lcigpO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKGZyZXNoRGF0YSk7XG4gICAgICByZXR1cm4gZnJlc2hEYXRhLm5vdGljZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW9NZXNzYWdlcy5kZWJ1ZyhgUmVhZGluZyBjYWNoZWQgbm90aWNlcyBmcm9tICR7dGhpcy5maWxlTmFtZX1gKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hJbm5lcigpOiBQcm9taXNlPENhY2hlZE5vdGljZXM+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhwaXJhdGlvbjogRGF0ZS5ub3coKSArIFRJTUVfVE9fTElWRV9TVUNDRVNTLFxuICAgICAgICBub3RpY2VzOiBhd2FpdCB0aGlzLmRhdGFTb3VyY2UuZmV0Y2goKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5pb01lc3NhZ2VzLmRlYnVnKGBDb3VsZCBub3QgcmVmcmVzaCBub3RpY2VzOiAke2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleHBpcmF0aW9uOiBEYXRlLm5vdygpICsgVElNRV9UT19MSVZFX0VSUk9SLFxuICAgICAgICBub3RpY2VzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKCk6IFByb21pc2U8Q2FjaGVkTm90aWNlcz4ge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHtcbiAgICAgIGV4cGlyYXRpb246IDAsXG4gICAgICBub3RpY2VzOiBbXSxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHRoaXMuZmlsZU5hbWUpXG4gICAgICAgID8gYXdhaXQgZnMucmVhZEpTT04odGhpcy5maWxlTmFtZSkgYXMgQ2FjaGVkTm90aWNlc1xuICAgICAgICA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmlvTWVzc2FnZXMuZGVidWcoYEZhaWxlZCB0byBsb2FkIG5vdGljZXMgZnJvbSBjYWNoZTogJHtlfWApO1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmUoY2FjaGVkOiBDYWNoZWROb3RpY2VzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlSlNPTih0aGlzLmZpbGVOYW1lLCBjYWNoZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuaW9NZXNzYWdlcy5kZWJ1ZyhgRmFpbGVkIHRvIHN0b3JlIG5vdGljZXMgaW4gdGhlIGNhY2hlOiAke2V9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=