terraconstructs 0.1.7 → 0.1.9

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 (297) hide show
  1. package/.jsii +1602 -1223
  2. package/go.mod +83 -77
  3. package/go.sum +175 -159
  4. package/lib/asset-staging.js +1 -1
  5. package/lib/aws/arn.js +1 -1
  6. package/lib/aws/aws-asset-manager.js +1 -1
  7. package/lib/aws/aws-construct.js +1 -1
  8. package/lib/aws/aws-stack.js +1 -1
  9. package/lib/aws/aws-tags.js +2 -2
  10. package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
  11. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  12. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  13. package/lib/aws/cloudwatch/actions/sns.js +1 -1
  14. package/lib/aws/cloudwatch/actions/ssm.js +2 -2
  15. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  16. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  17. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  18. package/lib/aws/cloudwatch/alarm.js +9 -8
  19. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  20. package/lib/aws/cloudwatch/dashboard.js +1 -1
  21. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  22. package/lib/aws/cloudwatch/graph.js +8 -8
  23. package/lib/aws/cloudwatch/layout.js +3 -3
  24. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  25. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  26. package/lib/aws/cloudwatch/log-group.js +1 -1
  27. package/lib/aws/cloudwatch/log-query.js +1 -1
  28. package/lib/aws/cloudwatch/log-stream.js +1 -1
  29. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  30. package/lib/aws/cloudwatch/metric.js +2 -2
  31. package/lib/aws/cloudwatch/pattern.js +3 -3
  32. package/lib/aws/cloudwatch/policy.js +1 -1
  33. package/lib/aws/cloudwatch/query-definition.js +2 -2
  34. package/lib/aws/cloudwatch/stats.js +1 -1
  35. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  36. package/lib/aws/cloudwatch/text.js +1 -1
  37. package/lib/aws/cloudwatch/variable.js +3 -3
  38. package/lib/aws/cloudwatch/widget.js +1 -1
  39. package/lib/aws/compute/access-log.js +9 -7
  40. package/lib/aws/compute/activity.js +1 -1
  41. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  42. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  43. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  44. package/lib/aws/compute/alb/application-listener.js +1 -1
  45. package/lib/aws/compute/alb/application-load-balancer.js +1 -1
  46. package/lib/aws/compute/alb/application-target-group.js +1 -1
  47. package/lib/aws/compute/alb/conditions.js +1 -1
  48. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  49. package/lib/aws/compute/alb/trust-store.js +1 -1
  50. package/lib/aws/compute/api-definition.d.ts +1 -1
  51. package/lib/aws/compute/api-definition.js +11 -16
  52. package/lib/aws/compute/api-key.js +7 -8
  53. package/lib/aws/compute/apigateway-util.js +10 -21
  54. package/lib/aws/compute/architecture.js +1 -1
  55. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  56. package/lib/aws/compute/authorizer.js +1 -1
  57. package/lib/aws/compute/authorizers/identity-source.js +4 -5
  58. package/lib/aws/compute/authorizers/lambda.js +8 -11
  59. package/lib/aws/compute/autoscaling-common/interval-utils.js +7 -11
  60. package/lib/aws/compute/base-path-mapping.js +6 -8
  61. package/lib/aws/compute/base-scalable-attribute.js +1 -1
  62. package/lib/aws/compute/bastion-host.js +1 -1
  63. package/lib/aws/compute/chain.js +1 -1
  64. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  65. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  66. package/lib/aws/compute/client-vpn-route.js +2 -2
  67. package/lib/aws/compute/code.js +23 -40
  68. package/lib/aws/compute/condition.js +1 -1
  69. package/lib/aws/compute/connections.js +1 -1
  70. package/lib/aws/compute/cors.js +1 -1
  71. package/lib/aws/compute/deployment.js +1 -1
  72. package/lib/aws/compute/domain-name.js +9 -8
  73. package/lib/aws/compute/event-invoke-config.js +1 -1
  74. package/lib/aws/compute/event-source-filter.js +2 -2
  75. package/lib/aws/compute/event-source-mapping.js +1 -1
  76. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  77. package/lib/aws/compute/event-sources/s3.js +1 -1
  78. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  79. package/lib/aws/compute/event-sources/sqs.js +1 -1
  80. package/lib/aws/compute/fields.js +4 -4
  81. package/lib/aws/compute/function-alias.js +1 -1
  82. package/lib/aws/compute/function-base.js +12 -12
  83. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  84. package/lib/aws/compute/function-destinations/function.js +1 -1
  85. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  86. package/lib/aws/compute/function-nodejs/function.js +1 -1
  87. package/lib/aws/compute/function-url.js +1 -1
  88. package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
  89. package/lib/aws/compute/function-vpc-config.generated.js +1 -1
  90. package/lib/aws/compute/function.js +4 -3
  91. package/lib/aws/compute/gateway-response.js +2 -2
  92. package/lib/aws/compute/handler.js +1 -1
  93. package/lib/aws/compute/instance-types.js +1 -1
  94. package/lib/aws/compute/instance.js +1 -1
  95. package/lib/aws/compute/integration.js +10 -16
  96. package/lib/aws/compute/integrations/aws.js +4 -4
  97. package/lib/aws/compute/integrations/http.js +1 -1
  98. package/lib/aws/compute/integrations/lambda.js +1 -1
  99. package/lib/aws/compute/integrations/mock.js +1 -1
  100. package/lib/aws/compute/integrations/stepfunctions.js +4 -5
  101. package/lib/aws/compute/ip-addresses.js +2 -2
  102. package/lib/aws/compute/ipam.js +1 -1
  103. package/lib/aws/compute/key-pair.js +1 -1
  104. package/lib/aws/compute/lambda-api.js +7 -10
  105. package/lib/aws/compute/launch-template.js +2 -2
  106. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  107. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  108. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  109. package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +37 -31
  110. package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +1 -1
  111. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +10 -4
  112. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +1 -1
  113. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  114. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  115. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  116. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  117. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  118. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  119. package/lib/aws/compute/load-balancer.js +3 -3
  120. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  121. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  122. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  123. package/lib/aws/compute/machine-image/common.js +1 -1
  124. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  125. package/lib/aws/compute/method.js +1 -1
  126. package/lib/aws/compute/model.js +3 -3
  127. package/lib/aws/compute/nat.js +5 -5
  128. package/lib/aws/compute/network-acl-types.js +2 -2
  129. package/lib/aws/compute/network-acl.js +3 -3
  130. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  131. package/lib/aws/compute/nlb/network-listener.js +1 -1
  132. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  133. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  134. package/lib/aws/compute/peer.js +1 -1
  135. package/lib/aws/compute/placement-group.js +1 -1
  136. package/lib/aws/compute/port.js +1 -1
  137. package/lib/aws/compute/prefix-list.js +1 -1
  138. package/lib/aws/compute/requestvalidator.js +1 -1
  139. package/lib/aws/compute/resource.js +3 -3
  140. package/lib/aws/compute/restapi.js +9 -10
  141. package/lib/aws/compute/route.js +10 -10
  142. package/lib/aws/compute/runtime.d.ts +8 -0
  143. package/lib/aws/compute/runtime.js +20 -7
  144. package/lib/aws/compute/scalable-target.js +1 -1
  145. package/lib/aws/compute/schedule.js +6 -12
  146. package/lib/aws/compute/security-group.js +1 -1
  147. package/lib/aws/compute/stage.js +8 -11
  148. package/lib/aws/compute/state-graph.js +1 -1
  149. package/lib/aws/compute/state-machine-fragment.js +1 -1
  150. package/lib/aws/compute/state-machine.js +4 -4
  151. package/lib/aws/compute/states/choice.js +1 -1
  152. package/lib/aws/compute/states/custom-state.js +1 -1
  153. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  154. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  155. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  156. package/lib/aws/compute/states/distributed-map.js +1 -1
  157. package/lib/aws/compute/states/fail.js +1 -1
  158. package/lib/aws/compute/states/map-base.js +1 -1
  159. package/lib/aws/compute/states/map.js +1 -1
  160. package/lib/aws/compute/states/parallel.js +1 -1
  161. package/lib/aws/compute/states/pass.js +2 -2
  162. package/lib/aws/compute/states/state.js +1 -1
  163. package/lib/aws/compute/states/succeed.js +1 -1
  164. package/lib/aws/compute/states/task-base.js +2 -2
  165. package/lib/aws/compute/states/task.js +1 -1
  166. package/lib/aws/compute/states/wait.js +2 -2
  167. package/lib/aws/compute/step-scaling-action.js +1 -1
  168. package/lib/aws/compute/step-scaling-policy.js +9 -14
  169. package/lib/aws/compute/stepfunctions-api.js +5 -6
  170. package/lib/aws/compute/subnet-v2.js +2 -2
  171. package/lib/aws/compute/subnet.js +1 -1
  172. package/lib/aws/compute/target-tracking-scaling-policy.js +9 -12
  173. package/lib/aws/compute/task-credentials.js +1 -1
  174. package/lib/aws/compute/task-input.js +1 -1
  175. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  176. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  177. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  178. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  179. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  180. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  181. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  182. package/lib/aws/compute/types.js +1 -1
  183. package/lib/aws/compute/usage-plan.js +1 -1
  184. package/lib/aws/compute/user-data.js +3 -3
  185. package/lib/aws/compute/volume.js +2 -2
  186. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  187. package/lib/aws/compute/vpc-endpoint.js +6 -6
  188. package/lib/aws/compute/vpc-flow-logs.js +8 -6
  189. package/lib/aws/compute/vpc-link.js +1 -1
  190. package/lib/aws/compute/vpc-v2-base.js +1 -1
  191. package/lib/aws/compute/vpc-v2.js +2 -2
  192. package/lib/aws/compute/vpc.js +4 -4
  193. package/lib/aws/compute/vpn.js +3 -3
  194. package/lib/aws/edge/certificate.js +1 -1
  195. package/lib/aws/edge/distribution.js +3 -3
  196. package/lib/aws/edge/dns-alias-record-targets.js +6 -6
  197. package/lib/aws/edge/dns-record.js +13 -13
  198. package/lib/aws/edge/dns-zone.d.ts +1 -1
  199. package/lib/aws/edge/dns-zone.js +8 -7
  200. package/lib/aws/edge/function.js +2 -2
  201. package/lib/aws/edge/key-value-store.js +4 -4
  202. package/lib/aws/edge/origin.js +3 -3
  203. package/lib/aws/edge/response-headers-policy.js +1 -1
  204. package/lib/aws/encryption/alias.js +1 -1
  205. package/lib/aws/encryption/key.js +1 -1
  206. package/lib/aws/encryption/via-service-principal.js +1 -1
  207. package/lib/aws/iam/grant.js +2 -2
  208. package/lib/aws/iam/group.js +1 -1
  209. package/lib/aws/iam/instance-profile.js +1 -1
  210. package/lib/aws/iam/managed-policy.js +1 -1
  211. package/lib/aws/iam/oidc-provider.js +1 -1
  212. package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
  213. package/lib/aws/iam/policy-document-config.generated.js +1 -1
  214. package/lib/aws/iam/policy-document.js +1 -1
  215. package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
  216. package/lib/aws/iam/policy-statement-props.generated.js +1 -1
  217. package/lib/aws/iam/policy-statement.js +1 -1
  218. package/lib/aws/iam/policy.js +1 -1
  219. package/lib/aws/iam/principals.js +20 -20
  220. package/lib/aws/iam/role.js +1 -1
  221. package/lib/aws/iam/saml-provider.js +2 -2
  222. package/lib/aws/iam/unknown-principal.js +1 -1
  223. package/lib/aws/iam/user.js +1 -1
  224. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  225. package/lib/aws/network/subnet-group.js +3 -3
  226. package/lib/aws/network/subnet.js +4 -4
  227. package/lib/aws/notify/archive.js +1 -1
  228. package/lib/aws/notify/connection.js +3 -3
  229. package/lib/aws/notify/event-bus.d.ts +19 -0
  230. package/lib/aws/notify/event-bus.js +22 -26
  231. package/lib/aws/notify/event-pattern.js +1 -1
  232. package/lib/aws/notify/input.js +2 -2
  233. package/lib/aws/notify/kinesis-stream.js +1 -1
  234. package/lib/aws/notify/notification-rule.js +1 -1
  235. package/lib/aws/notify/policy.js +1 -1
  236. package/lib/aws/notify/queue-config.generated.d.ts +18 -12
  237. package/lib/aws/notify/queue-config.generated.js +1 -1
  238. package/lib/aws/notify/queue-policy.js +1 -1
  239. package/lib/aws/notify/queue.js +1 -1
  240. package/lib/aws/notify/resource-policy.js +1 -1
  241. package/lib/aws/notify/rule.js +1 -1
  242. package/lib/aws/notify/schedule.js +1 -1
  243. package/lib/aws/notify/subscription-filter.js +7 -8
  244. package/lib/aws/notify/subscription.js +23 -25
  245. package/lib/aws/notify/subscriptions/email.js +1 -1
  246. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  247. package/lib/aws/notify/subscriptions/sms.js +1 -1
  248. package/lib/aws/notify/subscriptions/sqs.js +1 -1
  249. package/lib/aws/notify/subscriptions/url.js +1 -1
  250. package/lib/aws/notify/targets/event-bus.js +1 -1
  251. package/lib/aws/notify/targets/function.js +1 -1
  252. package/lib/aws/notify/targets/log-group.js +2 -2
  253. package/lib/aws/notify/targets/sqs.js +1 -1
  254. package/lib/aws/notify/targets/state-machine.js +1 -1
  255. package/lib/aws/notify/topic-base.js +4 -4
  256. package/lib/aws/notify/topic.js +1 -1
  257. package/lib/aws/provider-config.generated.d.ts +41 -33
  258. package/lib/aws/provider-config.generated.js +1 -1
  259. package/lib/aws/storage/assets/image-asset.js +8 -12
  260. package/lib/aws/storage/assets/s3.js +4 -4
  261. package/lib/aws/storage/auth-token.js +2 -2
  262. package/lib/aws/storage/billing.js +1 -1
  263. package/lib/aws/storage/bucket-notifications.js +1 -1
  264. package/lib/aws/storage/bucket-policy.js +1 -1
  265. package/lib/aws/storage/bucket-source.js +1 -1
  266. package/lib/aws/storage/bucket.js +2 -2
  267. package/lib/aws/storage/capacity.js +1 -1
  268. package/lib/aws/storage/cors-config.generated.d.ts +9 -3
  269. package/lib/aws/storage/cors-config.generated.js +1 -1
  270. package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
  271. package/lib/aws/storage/cors-rule-config.generated.js +1 -1
  272. package/lib/aws/storage/ecr-repository.js +19 -32
  273. package/lib/aws/storage/encryption.js +1 -1
  274. package/lib/aws/storage/lifecycle-config.generated.d.ts +7 -7
  275. package/lib/aws/storage/lifecycle-config.generated.js +1 -1
  276. package/lib/aws/storage/notification-targets/function.js +1 -1
  277. package/lib/aws/storage/notification-targets/queue.js +1 -1
  278. package/lib/aws/storage/origin-access-identity.js +1 -1
  279. package/lib/aws/storage/parameter.js +2 -2
  280. package/lib/aws/storage/table.js +50 -101
  281. package/lib/aws/storage/website-config.generated.d.ts +11 -5
  282. package/lib/aws/storage/website-config.generated.js +1 -1
  283. package/lib/bundling.js +7 -6
  284. package/lib/construct-base.js +2 -2
  285. package/lib/duration.js +1 -1
  286. package/lib/errors.js +5 -3
  287. package/lib/expiration.js +1 -1
  288. package/lib/fs/ignore.js +4 -4
  289. package/lib/fs/index.js +1 -1
  290. package/lib/index.d.ts +1 -0
  291. package/lib/index.js +2 -1
  292. package/lib/private/asset-staging.js +3 -2
  293. package/lib/size.js +1 -1
  294. package/lib/stack-base.js +1 -1
  295. package/lib/terra-func.js +1 -1
  296. package/lib/time-zone.js +1 -1
  297. package/package.json +3 -3
@@ -8,6 +8,7 @@ const path_1 = require("path");
8
8
  const provider_archive_1 = require("@cdktf/provider-archive");
9
9
  const cdktf = require("cdktf");
10
10
  const bundling_1 = require("../../bundling");
11
+ const errors_1 = require("../../errors");
11
12
  const helpers_internal_1 = require("../../helpers-internal");
12
13
  const aws_stack_1 = require("../aws-stack");
13
14
  const iam = require("../iam");
@@ -15,13 +16,6 @@ const iam = require("../iam");
15
16
  const runtime_1 = require("./runtime");
16
17
  const ecr_assets = require("../storage/assets/image-asset");
17
18
  const s3_assets = require("../storage/assets/s3");
18
- // TODO: Adopt UnscopedValidationError
19
- // - https://github.com/aws/aws-cdk/pull/33382/
20
- // - https://github.com/aws/aws-cdk/pull/33045
21
- // import {
22
- // UnscopedValidationError,
23
- // ValidationError,
24
- // } from "../../core/lib/errors";
25
19
  /**
26
20
  * Represents the Lambda Handler Code.
27
21
  */
@@ -87,8 +81,7 @@ class Code {
87
81
  */
88
82
  static fromCustomCommand(output, command, options) {
89
83
  if (command.length === 0) {
90
- // throw new UnscopedValidationError(
91
- throw new Error('command must contain at least one argument. For example, ["node", "buildFile.js"].');
84
+ throw new errors_1.UnscopedValidationError('command must contain at least one argument. For example, ["node", "buildFile.js"].');
92
85
  }
93
86
  const cmd = command[0];
94
87
  const commandArguments = command.splice(1);
@@ -96,12 +89,10 @@ class Code {
96
89
  ? (0, child_process_1.spawnSync)(cmd, commandArguments) // use the default spawnSyncOptions
97
90
  : (0, child_process_1.spawnSync)(cmd, commandArguments, options.commandOptions);
98
91
  if (proc.error) {
99
- // throw new UnscopedValidationError(
100
- throw new Error(`Failed to execute custom command: ${proc.error}`);
92
+ throw new errors_1.UnscopedValidationError(`Failed to execute custom command: ${proc.error}`);
101
93
  }
102
94
  if (proc.status !== 0) {
103
- // throw new UnscopedValidationError(
104
- throw new Error(`${command.join(" ")} exited with status: ${proc.status}\n\nstdout: ${proc.stdout?.toString().trim()}\n\nstderr: ${proc.stderr?.toString().trim()}`);
95
+ throw new errors_1.UnscopedValidationError(`${command.join(" ")} exited with status: ${proc.status}\n\nstdout: ${proc.stdout?.toString().trim()}\n\nstderr: ${proc.stderr?.toString().trim()}`);
105
96
  }
106
97
  return new AssetCode(output, options);
107
98
  }
@@ -168,7 +159,7 @@ class Code {
168
159
  }
169
160
  exports.Code = Code;
170
161
  _a = JSII_RTTI_SYMBOL_1;
171
- Code[_a] = { fqn: "terraconstructs.aws.compute.Code", version: "0.1.7" };
162
+ Code[_a] = { fqn: "terraconstructs.aws.compute.Code", version: "0.1.9" };
172
163
  /**
173
164
  * Lambda code from an S3 archive.
174
165
  */
@@ -179,8 +170,7 @@ class S3Code extends Code {
179
170
  this.objectVersion = objectVersion;
180
171
  this.isInline = false;
181
172
  if (!bucket.bucketName) {
182
- // throw new ValidationError(
183
- throw new Error("bucketName is undefined for the provided bucket");
173
+ throw new errors_1.ValidationError("bucketName is undefined for the provided bucket", bucket);
184
174
  }
185
175
  this.bucketName = bucket.bucketName;
186
176
  }
@@ -196,7 +186,7 @@ class S3Code extends Code {
196
186
  }
197
187
  exports.S3Code = S3Code;
198
188
  _b = JSII_RTTI_SYMBOL_1;
199
- S3Code[_b] = { fqn: "terraconstructs.aws.compute.S3Code", version: "0.1.7" };
189
+ S3Code[_b] = { fqn: "terraconstructs.aws.compute.S3Code", version: "0.1.9" };
200
190
  /**
201
191
  * Lambda code from an S3 archive. With option to set KMSKey for encryption.
202
192
  */
@@ -207,8 +197,7 @@ class S3CodeV2 extends Code {
207
197
  this.options = options;
208
198
  this.isInline = false;
209
199
  if (!bucket.bucketName) {
210
- // throw new ValidationError(
211
- throw new Error("bucketName is undefined for the provided bucket");
200
+ throw new errors_1.ValidationError("bucketName is undefined for the provided bucket", bucket);
212
201
  }
213
202
  this.bucketName = bucket.bucketName;
214
203
  }
@@ -225,7 +214,7 @@ class S3CodeV2 extends Code {
225
214
  }
226
215
  exports.S3CodeV2 = S3CodeV2;
227
216
  _c = JSII_RTTI_SYMBOL_1;
228
- S3CodeV2[_c] = { fqn: "terraconstructs.aws.compute.S3CodeV2", version: "0.1.7" };
217
+ S3CodeV2[_c] = { fqn: "terraconstructs.aws.compute.S3CodeV2", version: "0.1.9" };
229
218
  /**
230
219
  * Get the file extension for inline code based on the runtime family
231
220
  */
@@ -261,8 +250,7 @@ class InlineCode extends Code {
261
250
  this.code = code;
262
251
  this.isInline = true;
263
252
  if (code.length === 0) {
264
- // throw new UnscopedValidationError(
265
- throw new Error("Lambda inline code cannot be empty");
253
+ throw new errors_1.UnscopedValidationError("Lambda inline code cannot be empty");
266
254
  }
267
255
  }
268
256
  bind(scope) {
@@ -315,7 +303,7 @@ class InlineCode extends Code {
315
303
  }
316
304
  exports.InlineCode = InlineCode;
317
305
  _d = JSII_RTTI_SYMBOL_1;
318
- InlineCode[_d] = { fqn: "terraconstructs.aws.compute.InlineCode", version: "0.1.7" };
306
+ InlineCode[_d] = { fqn: "terraconstructs.aws.compute.InlineCode", version: "0.1.9" };
319
307
  /**
320
308
  * Lambda code from a local directory.
321
309
  */
@@ -339,13 +327,11 @@ class AssetCode extends Code {
339
327
  });
340
328
  }
341
329
  else if (aws_stack_1.AwsStack.ofAwsConstruct(this.asset) !== aws_stack_1.AwsStack.ofAwsConstruct(scope)) {
342
- // throw new ValidationError(
343
- throw new Error(`Asset is already associated with another stack '${aws_stack_1.AwsStack.ofAwsConstruct(this.asset).gridUUID}'. ` +
344
- "Create a new Code instance for every stack.");
330
+ throw new errors_1.ValidationError(`Asset is already associated with another stack '${aws_stack_1.AwsStack.ofAwsConstruct(this.asset).gridUUID}'. ` +
331
+ "Create a new Code instance for every stack.", scope);
345
332
  }
346
333
  if (!this.asset.isZipArchive) {
347
- // throw new ValidationError(
348
- throw new Error(`Asset must be a .zip file or a directory (${this.path})`);
334
+ throw new errors_1.ValidationError(`Asset must be a .zip file or a directory (${this.path})`, scope);
349
335
  }
350
336
  return {
351
337
  s3Location: {
@@ -358,7 +344,7 @@ class AssetCode extends Code {
358
344
  }
359
345
  exports.AssetCode = AssetCode;
360
346
  _e = JSII_RTTI_SYMBOL_1;
361
- AssetCode[_e] = { fqn: "terraconstructs.aws.compute.AssetCode", version: "0.1.7" };
347
+ AssetCode[_e] = { fqn: "terraconstructs.aws.compute.AssetCode", version: "0.1.9" };
362
348
  /**
363
349
  * Lambda code defined using 2 Terraform variables.
364
350
  * Useful when you don't have access to the code of your Lambda from your CDK code, so you can't use Assets,
@@ -414,8 +400,7 @@ class TerraformVariablesCode extends Code {
414
400
  return this._bucketNameVar.fqn;
415
401
  }
416
402
  else {
417
- // throw new UnscopedValidationError(
418
- throw new Error("Pass TerraformVariablesCode to a Lambda Function before accessing the bucketNameVar property");
403
+ throw new errors_1.UnscopedValidationError("Pass TerraformVariablesCode to a Lambda Function before accessing the bucketNameVar property");
419
404
  }
420
405
  }
421
406
  get objectKeyVar() {
@@ -423,14 +408,13 @@ class TerraformVariablesCode extends Code {
423
408
  return this._objectKeyVar.fqn;
424
409
  }
425
410
  else {
426
- // throw new UnscopedValidationError(
427
- throw new Error("Pass TerraformVariablesCode to a Lambda Function before accessing the objectKeyVar property");
411
+ throw new errors_1.UnscopedValidationError("Pass TerraformVariablesCode to a Lambda Function before accessing the objectKeyVar property");
428
412
  }
429
413
  }
430
414
  }
431
415
  exports.TerraformVariablesCode = TerraformVariablesCode;
432
416
  _f = JSII_RTTI_SYMBOL_1;
433
- TerraformVariablesCode[_f] = { fqn: "terraconstructs.aws.compute.TerraformVariablesCode", version: "0.1.7" };
417
+ TerraformVariablesCode[_f] = { fqn: "terraconstructs.aws.compute.TerraformVariablesCode", version: "0.1.9" };
434
418
  /**
435
419
  * Represents a Docker image in ECR that can be bound as Lambda Code.
436
420
  */
@@ -455,7 +439,7 @@ class EcrImageCode extends Code {
455
439
  }
456
440
  exports.EcrImageCode = EcrImageCode;
457
441
  _g = JSII_RTTI_SYMBOL_1;
458
- EcrImageCode[_g] = { fqn: "terraconstructs.aws.compute.EcrImageCode", version: "0.1.7" };
442
+ EcrImageCode[_g] = { fqn: "terraconstructs.aws.compute.EcrImageCode", version: "0.1.9" };
459
443
  /**
460
444
  * Represents an ECR image that will be constructed from the specified asset and can be bound as Lambda code.
461
445
  */
@@ -476,9 +460,8 @@ class AssetImageCode extends Code {
476
460
  this.asset.repository.grantPull(new iam.ServicePrincipal("lambda.amazonaws.com"));
477
461
  }
478
462
  else if (aws_stack_1.AwsStack.ofAwsConstruct(this.asset) !== aws_stack_1.AwsStack.ofAwsConstruct(scope)) {
479
- // throw new ValidationError(
480
- throw new Error(`Asset is already associated with another stack '${aws_stack_1.AwsStack.ofAwsConstruct(this.asset).gridUUID}'. ` +
481
- "Create a new Code instance for every stack.");
463
+ throw new errors_1.ValidationError(`Asset is already associated with another stack '${aws_stack_1.AwsStack.ofAwsConstruct(this.asset).gridUUID}'. ` +
464
+ "Create a new Code instance for every stack.", scope);
482
465
  }
483
466
  return {
484
467
  image: {
@@ -492,5 +475,5 @@ class AssetImageCode extends Code {
492
475
  }
493
476
  exports.AssetImageCode = AssetImageCode;
494
477
  _h = JSII_RTTI_SYMBOL_1;
495
- AssetImageCode[_h] = { fqn: "terraconstructs.aws.compute.AssetImageCode", version: "0.1.7" };
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvY29tcHV0ZS9jb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBQTBDO0FBQzFDLCtCQUF5QztBQUN6Qyw4REFBMEQ7QUFDMUQsK0JBQStCO0FBRS9CLDZDQUFpRTtBQUNqRSw2REFBaUQ7QUFDakQsNENBQXdDO0FBRXhDLDhCQUE4QjtBQUU5QixvREFBb0Q7QUFDcEQsdUNBQW1EO0FBQ25ELDREQUE0RDtBQUM1RCxrREFBa0Q7QUFDbEQsc0NBQXNDO0FBQ3RDLCtDQUErQztBQUMvQyw4Q0FBOEM7QUFDOUMsV0FBVztBQUNYLDZCQUE2QjtBQUM3QixxQkFBcUI7QUFDckIsa0NBQWtDO0FBRWxDOztHQUVHO0FBQ0gsTUFBc0IsSUFBSTtJQUN4Qjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQ3RCLE1BQXVCLEVBQ3ZCLEdBQVcsRUFDWCxhQUFzQjtRQUV0QixPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUN4QixNQUF1QixFQUN2QixHQUFXLEVBQ1gsT0FBdUI7UUFFdkIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUNsQixNQUF1QixFQUN2QixHQUFXLEVBQ1gsYUFBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVk7UUFDbkMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FB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QzdCLE1BQU0sSUFBSSxLQUFLLENBQ2IsbURBQW1ELG9CQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEtBQUs7Z0JBQ2xHLDZDQUE2QyxDQUVoRCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtnQkFDakMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDbkIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7YUFDOUM7U0FDRixDQUFDO0lBQ0osQ0FBQzs7QUF4Q0gsd0NBeURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGpvaW4gYXMgcGF0aHRKb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGRhdGFBcmNoaXZlRmlsZSB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXJjaGl2ZVwiO1xuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2UsIERvY2tlckJ1aWxkT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9idW5kbGluZ1wiO1xuaW1wb3J0IHsgbWQ1aGFzaCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzLWludGVybmFsXCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IElLZXkgfSBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcbmltcG9ydCAqIGFzIHN0b3JhZ2UgZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbi8vIGltcG9ydCB7IElBd3NDb25zdHJ1Y3QgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgUnVudGltZSwgUnVudGltZUZhbWlseSB9IGZyb20gXCIuL3J1bnRpbWVcIjtcbmltcG9ydCAqIGFzIGVjcl9hc3NldHMgZnJvbSBcIi4uL3N0b3JhZ2UvYXNzZXRzL2ltYWdlLWFzc2V0XCI7XG5pbXBvcnQgKiBhcyBzM19hc3NldHMgZnJvbSBcIi4uL3N0b3JhZ2UvYXNzZXRzL3MzXCI7XG4vLyBUT0RPOiBBZG9wdCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvclxuLy8gLSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8zMzM4Mi9cbi8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3B1bGwvMzMwNDVcbi8vIGltcG9ydCB7XG4vLyAgIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLFxuLy8gICBWYWxpZGF0aW9uRXJyb3IsXG4vLyB9IGZyb20gXCIuLi8uLi9jb3JlL2xpYi9lcnJvcnNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBMYW1iZGEgSGFuZGxlciBDb2RlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29kZSB7XG4gIC8qKlxuICAgKiBMYW1iZGEgaGFuZGxlciBjb2RlIGFzIGFuIFMzIG9iamVjdC5cbiAgICogQHBhcmFtIGJ1Y2tldCBUaGUgUzMgYnVja2V0XG4gICAqIEBwYXJhbSBrZXkgVGhlIG9iamVjdCBrZXlcbiAgICogQHBhcmFtIG9iamVjdFZlcnNpb24gT3B0aW9uYWwgUzMgb2JqZWN0IHZlcnNpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJ1Y2tldChcbiAgICBidWNrZXQ6IHN0b3JhZ2UuSUJ1Y2tldCxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvYmplY3RWZXJzaW9uPzogc3RyaW5nLFxuICApOiBTM0NvZGUge1xuICAgIHJldHVybiBuZXcgUzNDb2RlKGJ1Y2tldCwga2V5LCBvYmplY3RWZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYW1iZGEgaGFuZGxlciBjb2RlIGFzIGFuIFMzIG9iamVjdC5cbiAgICogQHBhcmFtIGJ1Y2tldCBUaGUgUzMgYnVja2V0XG4gICAqIEBwYXJhbSBrZXkgVGhlIG9iamVjdCBrZXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2V0dGluZyB0aGUgY29kZSwgY3VycmVudCBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHNldCBoZXJlIGFyZVxuICAgKiAxLiBgb2JqZWN0VmVyc2lvbmAgdG8gc2V0IFMzIG9iamVjdCB2ZXJzaW9uXG4gICAqIDIuIGBzb3VyY2VLTVNLZXlgIHRvIHNldCBLTVMgS2V5IGZvciBlbmNyeXB0aW9uIG9mIGNvZGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJ1Y2tldFYyKFxuICAgIGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0LFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBCdWNrZXRPcHRpb25zLFxuICApOiBTM0NvZGVWMiB7XG4gICAgcmV0dXJuIG5ldyBTM0NvZGVWMihidWNrZXQsIGtleSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogREVQUkVDQVRFRFxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGZyb21CdWNrZXRgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1Y2tldChcbiAgICBidWNrZXQ6IHN0b3JhZ2UuSUJ1Y2tldCxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvYmplY3RWZXJzaW9uPzogc3RyaW5nLFxuICApOiBTM0NvZGUge1xuICAgIHJldHVybiB0aGlzLmZyb21CdWNrZXQoYnVja2V0LCBrZXksIG9iamVjdFZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIElubGluZSBjb2RlIGZvciBMYW1iZGEgaGFuZGxlclxuICAgKiBAcmV0dXJucyBgTGFtYmRhSW5saW5lQ29kZWAgd2l0aCBpbmxpbmUgY29kZS5cbiAgICogQHBhcmFtIGNvZGUgVGhlIGFjdHVhbCBoYW5kbGVyIGNvZGUgKHRoZSByZXN1bHRpbmcgemlwIGZpbGUgY2Fubm90IGV4Y2VlZCA0TUIpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbmxpbmUoY29kZTogc3RyaW5nKTogSW5saW5lQ29kZSB7XG4gICAgcmV0dXJuIG5ldyBJbmxpbmVDb2RlKGNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERFUFJFQ0FURURcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBmcm9tSW5saW5lYFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpbmxpbmUoY29kZTogc3RyaW5nKTogSW5saW5lQ29kZSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUlubGluZShjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgZnVuY3Rpb24gY29kZSBmcm9tIGEgbG9jYWwgZGlzayBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBFaXRoZXIgYSBkaXJlY3Rvcnkgd2l0aCB0aGUgTGFtYmRhIGNvZGUgYnVuZGxlIG9yIGEgLnppcCBmaWxlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Bc3NldChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHMzX2Fzc2V0cy5Bc3NldE9wdGlvbnMsXG4gICk6IEFzc2V0Q29kZSB7XG4gICAgcmV0dXJuIG5ldyBBc3NldENvZGUocGF0aCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNvbW1hbmQgdG8gYnVpbGQgdGhlIGNvZGUgYXNzZXQgdGhhdCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEBwYXJhbSBvdXRwdXQgV2hlcmUgdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCB3aWxsIGJlIGRpcmVjdGVkLCBlaXRoZXIgYSBkaXJlY3Rvcnkgb3IgYSAuemlwIGZpbGUgd2l0aCB0aGUgb3V0cHV0IExhbWJkYSBjb2RlIGJ1bmRsZVxuICAgKiAqIEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIHRoZSBjb21tYW5kIHRvIHJ1biBhIGJ1aWxkIHNjcmlwdCAoZS5nLiwgWyAnbm9kZScsICdidW5kbGVfY29kZS5qcycgXSksIGFuZCB0aGUgYnVpbGQgc2NyaXB0IGdlbmVyYXRlcyBhIGRpcmVjdG9yeSBgL215L2xhbWJkYS9jb2RlYFxuICAgKiBjb250YWluaW5nIGNvZGUgdGhhdCBzaG91bGQgYmUgcmFuIGluIGEgTGFtYmRhIGZ1bmN0aW9uLCB0aGVuIG91dHB1dCBzaG91bGQgYmUgc2V0IHRvIGAvbXkvbGFtYmRhL2NvZGVgXG4gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgdG8gZ2VuZXJhdGUgdGhlIG91dHB1dCwgZm9yIGV4YW1wbGUsIFsgJ25vZGUnLCAnYnVuZGxlX2NvZGUuanMnIF1cbiAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9ucyBmb3IgdGhlIGN1c3RvbSBjb21tYW5kLCBhbmQgb3RoZXIgYXNzZXQgb3B0aW9ucyAtLSBidXQgYnVuZGxpbmcgb3B0aW9ucyBhcmUgbm90IGFsbG93ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21DdXN0b21Db21tYW5kKFxuICAgIG91dHB1dDogc3RyaW5nLFxuICAgIGNvbW1hbmQ6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiBDdXN0b21Db21tYW5kT3B0aW9ucyxcbiAgKTogQXNzZXRDb2RlIHtcbiAgICBpZiAoY29tbWFuZC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2NvbW1hbmQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBhcmd1bWVudC4gRm9yIGV4YW1wbGUsIFtcIm5vZGVcIiwgXCJidWlsZEZpbGUuanNcIl0uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kID0gY29tbWFuZFswXTtcbiAgICBjb25zdCBjb21tYW5kQXJndW1lbnRzID0gY29tbWFuZC5zcGxpY2UoMSk7XG5cbiAgICBjb25zdCBwcm9jID1cbiAgICAgIG9wdGlvbnM/LmNvbW1hbmRPcHRpb25zID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzcGF3blN5bmMoY21kLCBjb21tYW5kQXJndW1lbnRzKSAvLyB1c2UgdGhlIGRlZmF1bHQgc3Bhd25TeW5jT3B0aW9uc1xuICAgICAgICA6IHNwYXduU3luYyhjbWQsIGNvbW1hbmRBcmd1bWVudHMsIG9wdGlvbnMuY29tbWFuZE9wdGlvbnMpO1xuXG4gICAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICAgIC8vIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgY3VzdG9tIGNvbW1hbmQ6ICR7cHJvYy5lcnJvcn1gKTtcbiAgICB9XG4gICAgaWYgKHByb2Muc3RhdHVzICE9PSAwKSB7XG4gICAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke2NvbW1hbmQuam9pbihcIiBcIil9IGV4aXRlZCB3aXRoIHN0YXR1czogJHtwcm9jLnN0YXR1c31cXG5cXG5zdGRvdXQ6ICR7cHJvYy5zdGRvdXQ/LnRvU3RyaW5nKCkudHJpbSgpfVxcblxcbnN0ZGVycjogJHtwcm9jLnN0ZGVycj8udG9TdHJpbmcoKS50cmltKCl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NldENvZGUob3V0cHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgZnVuY3Rpb24gY29kZSBmcm9tIGFuIGFzc2V0IGNyZWF0ZWQgYnkgYSBEb2NrZXIgYnVpbGQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBhc3NldCBpcyBleHBlY3RlZCB0byBiZSBsb2NhdGVkIGF0IGAvYXNzZXRgIGluIHRoZVxuICAgKiBpbWFnZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBEb2NrZXIgZmlsZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBEb2NrZXIgYnVpbGQgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRG9ja2VyQnVpbGQoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERvY2tlckJ1aWxkQXNzZXRPcHRpb25zID0ge30sXG4gICk6IEFzc2V0Q29kZSB7XG4gICAgbGV0IGltYWdlUGF0aCA9IG9wdGlvbnMuaW1hZ2VQYXRoID8/IFwiL2Fzc2V0Ly5cIjtcblxuICAgIC8vIGVuc3VyZSBpbWFnZVBhdGggZW5kcyB3aXRoIC8uIHRvIGNvcHkgdGhlICoqY29udGVudCoqIGF0IHRoaXMgcGF0aFxuICAgIGlmIChpbWFnZVBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICBpbWFnZVBhdGggPSBgJHtpbWFnZVBhdGh9LmA7XG4gICAgfSBlbHNlIGlmICghaW1hZ2VQYXRoLmVuZHNXaXRoKFwiLy5cIikpIHtcbiAgICAgIGltYWdlUGF0aCA9IGAke2ltYWdlUGF0aH0vLmA7XG4gICAgfVxuXG4gICAgY29uc3QgYXNzZXRQYXRoID0gRG9ja2VySW1hZ2UuZnJvbUJ1aWxkKHBhdGgsIG9wdGlvbnMpLmNwKFxuICAgICAgaW1hZ2VQYXRoLFxuICAgICAgb3B0aW9ucy5vdXRwdXRQYXRoLFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IEFzc2V0Q29kZShhc3NldFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERFUFJFQ0FURURcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBmcm9tQXNzZXRgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzc2V0KHBhdGg6IHN0cmluZyk6IEFzc2V0Q29kZSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUFzc2V0KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTGFtYmRhIHNvdXJjZSBkZWZpbmVkIHVzaW5nIFRlcnJhZm9ybSB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIGBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlYFxuICAgKiBAcGFyYW0gcHJvcHMgb3B0aW9uYWwgY29uc3RydWN0aW9uIHByb3BlcnRpZXMgb2YgYFRlcnJhZm9ybVZhcmlhYmxlc0NvZGVgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UZXJyYWZvcm1WYXJpYWJsZXMoXG4gICAgcHJvcHM/OiBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlUHJvcHMsXG4gICk6IFRlcnJhZm9ybVZhcmlhYmxlc0NvZGUge1xuICAgIHJldHVybiBuZXcgVGVycmFmb3JtVmFyaWFibGVzQ29kZShwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogREVQUkVDQVRFRFxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGZyb21UZXJyYWZvcm1WYXJpYWJsZXNgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRlcnJhZm9ybVZhcmlhYmxlcyhcbiAgICBwcm9wcz86IFRlcnJhZm9ybVZhcmlhYmxlc0NvZGVQcm9wcyxcbiAgKTogVGVycmFmb3JtVmFyaWFibGVzQ29kZSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVRlcnJhZm9ybVZhcmlhYmxlcyhwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGFuIGV4aXN0aW5nIEVDUiBpbWFnZSBhcyB0aGUgTGFtYmRhIGNvZGUuXG4gICAqIEBwYXJhbSByZXBvc2l0b3J5IHRoZSBFQ1IgcmVwb3NpdG9yeSB0aGF0IHRoZSBpbWFnZSBpcyBpblxuICAgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyB0byBmdXJ0aGVyIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgaW1hZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUVjckltYWdlKFxuICAgIHJlcG9zaXRvcnk6IHN0b3JhZ2UuSVJlcG9zaXRvcnksXG4gICAgcHJvcHM/OiBFY3JJbWFnZUNvZGVQcm9wcyxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBFY3JJbWFnZUNvZGUocmVwb3NpdG9yeSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFQ1IgaW1hZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGFzc2V0IGFuZCBiaW5kIGl0IGFzIHRoZSBMYW1iZGEgY29kZS5cbiAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhlIGFzc2V0IG11c3QgYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyB0byBmdXJ0aGVyIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgaW1hZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUFzc2V0SW1hZ2UoXG4gICAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gICAgcHJvcHM6IEFzc2V0SW1hZ2VDb2RlUHJvcHMgPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBBc3NldEltYWdlQ29kZShkaXJlY3RvcnksIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBDb2RlIGlzIGlubGluZSBjb2RlIG9yIG5vdC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdGhpcyB2YWx1ZSBpcyBpZ25vcmVkIHNpbmNlIGlubGluZSBpcyBub3cgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGVcbiAgICogdGhlIGBpbmxpbmVDb2RlYCBmaWVsZCBvZiBgQ29kZUNvbmZpZ2AgcmV0dXJuZWQgZnJvbSBgYmluZCgpYC5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBpc0lubGluZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGxhbWJkYSBvciBsYXllciBpcyBpbml0aWFsaXplZCB0byBhbGxvdyB0aGlzIG9iamVjdCB0byBiaW5kXG4gICAqIHRvIHRoZSBzdGFjaywgYWRkIHJlc291cmNlcyBhbmQgaGF2ZSBmdW4uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgYmluZGluZyBzY29wZS4gRG9uJ3QgYmUgc21hcnQgYWJvdXQgdHJ5aW5nIHRvIGRvd24tY2FzdCBvclxuICAgKiBhc3N1bWUgaXQncyBpbml0aWFsaXplZC4gWW91IG1heSBqdXN0IHVzZSBpdCBhcyBhIGNvbnN0cnVjdCBzY29wZS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnO1xuXG4gIC8vIFRPRE86IHBlbmRpbmcgY3VzdG9tIENMSSB0byBtb2NrIExhbWJkYSBmdW5jdGlvbiBpbnZvY2F0aW9ucyBsb2NhbGx5XG4gIC8vIC8qKlxuICAvLyAgKiBDYWxsZWQgYWZ0ZXIgdGhlIHRlcnJhZm9ybSBwcm92aWRlciBmdW5jdGlvbiByZXNvdXJjZSBoYXMgYmVlbiBjcmVhdGVkIHRvIGFsbG93IHRoZSBjb2RlXG4gIC8vICAqIGNsYXNzIHRvIGJpbmQgdG8gaXQuIFNwZWNpZmljYWxseSBpdCdzIHJlcXVpcmVkIHRvIGFsbG93IGFzc2V0cyB0byBhZGRcbiAgLy8gICogbWV0YWRhdGEgZm9yIHRvb2xpbmcgbGlrZSBTQU0gQ0xJIHRvIGJlIGFibGUgdG8gZmluZCB0aGVpciBvcmlnaW5zLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIGJpbmRUb1Jlc291cmNlKFxuICAvLyAgIF9yZXNvdXJjZTogSUF3c0NvbnN0cnVjdCxcbiAgLy8gICBfb3B0aW9ucz86IFJlc291cmNlQmluZE9wdGlvbnMsXG4gIC8vICkge1xuICAvLyAgIHJldHVybjtcbiAgLy8gfVxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBiaW5kaW5nIGBDb2RlYCBpbnRvIGEgYEZ1bmN0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29kZSBpbiBTMyAobXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGlubGluZUNvZGVgIGFuZCBgaW1hZ2VgKS5cbiAgICogQGRlZmF1bHQgLSBjb2RlIGlzIG5vdCBhbiBzMyBsb2NhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgczNMb2NhdGlvbj86IHN0b3JhZ2UuUzNMb2NhdGlvbjtcblxuICAvKipcbiAgICogSW5saW5lIGNvZGUgKG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBzM0xvY2F0aW9uYCBhbmQgYGltYWdlYCkuXG4gICAqIEBkZWZhdWx0IC0gY29kZSBpcyBub3QgaW5saW5lIGNvZGVcbiAgICovXG4gIHJlYWRvbmx5IGlubGluZUNvZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBjb25maWd1cmF0aW9uIChtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgczNMb2NhdGlvbmAgYW5kIGBpbmxpbmVDb2RlYCkuXG4gICAqIEBkZWZhdWx0IC0gY29kZSBpcyBub3QgYW4gRUNSIGNvbnRhaW5lciBpbWFnZVxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2U/OiBDb2RlSW1hZ2VDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBoYW5kbGVyIGNvZGUuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIEFtYXpvbiBTMyBtYW5hZ2VkIGtleXMoU1NFLVMzKSBrZXkgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlS01TS2V5QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGhhc2ggb2YgdGhlIHNvdXJjZSBjb2RlLCB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29kZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUNvZGVIYXNoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB0aGUgYmluZCB3aGVuIGFuIEVDUiBpbWFnZSBpcyB1c2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbWFnZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBVUkkgdG8gdGhlIERvY2tlciBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlVXJpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIENNRCBvbiB0aGUgc3BlY2lmaWVkIERvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKiBUaGlzIG5lZWRzIHRvIGJlIGluIHRoZSAnZXhlYyBmb3JtJywgdml6LiwgYFsgJ2V4ZWN1dGFibGUnLCAncGFyYW0xJywgJ3BhcmFtMicgXWAuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9idWlsZGVyLyNjbWRcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIENNRCBzcGVjaWZpZWQgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgY21kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIEVOVFJZUE9JTlQgb24gdGhlIHNwZWNpZmllZCBEb2NrZXIgaW1hZ2Ugb3IgRG9ja2VyZmlsZS5cbiAgICogQW4gRU5UUllQT0lOVCBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSBhIGNvbnRhaW5lciB0aGF0IHdpbGwgcnVuIGFzIGFuIGV4ZWN1dGFibGUuXG4gICAqIFRoaXMgbmVlZHMgdG8gYmUgaW4gdGhlICdleGVjIGZvcm0nLCB2aXouLCBgWyAnZXhlY3V0YWJsZScsICdwYXJhbTEnLCAncGFyYW0yJyBdYC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI2VudHJ5cG9pbnRcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIEVOVFJZUE9JTlQgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG9yIG92ZXJyaWRlIHRoZSBXT1JLRElSIG9uIHRoZSBzcGVjaWZpZWQgRG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqIEEgV09SS0RJUiBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgdGhlIGNvbnRhaW5lciB3aWxsIHVzZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI3dvcmtkaXJcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIFdPUktESVIgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMYW1iZGEgY29kZSBmcm9tIGFuIFMzIGFyY2hpdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTM0NvZGUgZXh0ZW5kcyBDb2RlIHtcbiAgcHVibGljIHJlYWRvbmx5IGlzSW5saW5lID0gZmFsc2U7XG4gIHByaXZhdGUgYnVja2V0TmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0LFxuICAgIHByaXZhdGUga2V5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBvYmplY3RWZXJzaW9uPzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKCFidWNrZXQuYnVja2V0TmFtZSkge1xuICAgICAgLy8gdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJidWNrZXROYW1lIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHByb3ZpZGVkIGJ1Y2tldFwiLFxuICAgICAgICAvLyBidWNrZXQsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYnVja2V0TmFtZSA9IGJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgczNMb2NhdGlvbjoge1xuICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5rZXksXG4gICAgICAgIG9iamVjdFZlcnNpb246IHRoaXMub2JqZWN0VmVyc2lvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIExhbWJkYSBjb2RlIGZyb20gYW4gUzMgYXJjaGl2ZS4gV2l0aCBvcHRpb24gdG8gc2V0IEtNU0tleSBmb3IgZW5jcnlwdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzQ29kZVYyIGV4dGVuZHMgQ29kZSB7XG4gIHB1YmxpYyByZWFkb25seSBpc0lubGluZSA9IGZhbHNlO1xuICBwcml2YXRlIGJ1Y2tldE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWNrZXQ6IHN0b3JhZ2UuSUJ1Y2tldCxcbiAgICBwcml2YXRlIGtleTogc3RyaW5nLFxuICAgIHByaXZhdGUgb3B0aW9ucz86IEJ1Y2tldE9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCFidWNrZXQuYnVja2V0TmFtZSkge1xuICAgICAgLy8gdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJidWNrZXROYW1lIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHByb3ZpZGVkIGJ1Y2tldFwiLFxuICAgICAgICAvLyBidWNrZXQsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYnVja2V0TmFtZSA9IGJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgczNMb2NhdGlvbjoge1xuICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5rZXksXG4gICAgICAgIG9iamVjdFZlcnNpb246IHRoaXMub3B0aW9ucz8ub2JqZWN0VmVyc2lvbixcbiAgICAgIH0sXG4gICAgICBzb3VyY2VLTVNLZXlBcm46IHRoaXMub3B0aW9ucz8uc291cmNlS01TS2V5Py5rZXlBcm4sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGlubGluZSBjb2RlIGJhc2VkIG9uIHRoZSBydW50aW1lIGZhbWlseVxuICovXG5mdW5jdGlvbiBnZXRJbmxpbmVDb2RlRmlsZUV4dGVuc2lvbihydW50aW1lPzogUnVudGltZSk6IHN0cmluZyB7XG4gIGlmICghcnVudGltZSkge1xuICAgIC8vIERlZmF1bHQgdG8gLmpzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHJldHVybiBcIi5qc1wiO1xuICB9XG5cbiAgc3dpdGNoIChydW50aW1lLmZhbWlseSkge1xuICAgIGNhc2UgUnVudGltZUZhbWlseS5OT0RFSlM6XG4gICAgICByZXR1cm4gXCIuanNcIjtcbiAgICBjYXNlIFJ1bnRpbWVGYW1pbHkuUFlUSE9OOlxuICAgICAgcmV0dXJuIFwiLnB5XCI7XG4gICAgY2FzZSBSdW50aW1lRmFtaWx5LkpBVkE6XG4gICAgICByZXR1cm4gXCIuamF2YVwiO1xuICAgIGNhc2UgUnVudGltZUZhbWlseS5ET1RORVRfQ09SRTpcbiAgICAgIHJldHVybiBcIi5jc1wiO1xuICAgIGNhc2UgUnVudGltZUZhbWlseS5HTzpcbiAgICAgIHJldHVybiBcIi5nb1wiO1xuICAgIGNhc2UgUnVudGltZUZhbWlseS5SVUJZOlxuICAgICAgcmV0dXJuIFwiLnJiXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIERlZmF1bHQgdG8gLmpzIGZvciB1bmtub3duIHJ1bnRpbWVzXG4gICAgICByZXR1cm4gXCIuanNcIjtcbiAgfVxufVxuXG4vKipcbiAqIExhbWJkYSBjb2RlIGZyb20gYW4gaW5saW5lIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIElubGluZUNvZGUgZXh0ZW5kcyBDb2RlIHtcbiAgcHVibGljIHJlYWRvbmx5IGlzSW5saW5lID0gdHJ1ZTtcbiAgcHJpdmF0ZSBkYXRhQXJjaGl2ZT86IGRhdGFBcmNoaXZlRmlsZS5EYXRhQXJjaGl2ZUZpbGU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb2RlOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKGNvZGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMYW1iZGEgaW5saW5lIGNvZGUgY2Fubm90IGJlIGVtcHR5XCIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnIHtcbiAgICB0aGlzLmVuc3VyZURhdGFBcmNoaXZlKHNjb3BlKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5saW5lQ29kZTogdGhpcy5kYXRhQXJjaGl2ZSEub3V0cHV0UGF0aCxcbiAgICAgIHNvdXJjZUNvZGVIYXNoOiB0aGlzLmRhdGFBcmNoaXZlIS5vdXRwdXRCYXNlNjRTaGEyNTYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVZ2x5IGhhY2sgdG8gc3VwcG9ydCBpbmxpbmUgY29kZSB3aXRoIFRlcnJhZm9ybS5cbiAgICpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2lzc3Vlcy85Nzc0I2lzc3VlY29tbWVudC02NjkzNTY3ODZcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZURhdGFBcmNoaXZlKHNjb3BlOiBDb25zdHJ1Y3QpIHtcbiAgICBpZiAodGhpcy5kYXRhQXJjaGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXQgdGhlIHByb3ZpZGVyIHNpbmdsZXRvblxuICAgIGNvbnN0IHByb3ZpZGVyID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpLmFyY2hpdmVQcm92aWRlcjtcbiAgICAvLyBlbnN1cmUgdGhlIGNvZGUgaXMgaGFzaGVkIGZvciBjb25zaXN0ZW5jeVxuICAgIGNvbnN0IGlkID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpLnVuaXF1ZVJlc291cmNlTmFtZShcbiAgICAgIG5ldyBjZGt0Zi5UZXJyYWZvcm1FbGVtZW50KHNjb3BlLCBtZDVoYXNoKHRoaXMuY29kZSkpLFxuICAgICAge1xuICAgICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IFwiLV9cIixcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyBjb25zdCBpZCA9IG1kNWhhc2godGhpcy5jb2RlKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHNjb3BlLm5vZGUudHJ5RmluZENoaWxkKGlkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHRoaXMuZGF0YUFyY2hpdmUgPSBleGlzdGluZyBhcyBkYXRhQXJjaGl2ZUZpbGUuRGF0YUFyY2hpdmVGaWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIGZpbGUgZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBydW50aW1lXG4gICAgICAvLyBUaGUgc2NvcGUgc2hvdWxkIGJlIGEgTGFtYmRhRnVuY3Rpb24gd2hlbiBiaW5kIGlzIGNhbGxlZFxuICAgICAgbGV0IHJ1bnRpbWU6IFJ1bnRpbWUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoXCJydW50aW1lXCIgaW4gc2NvcGUgJiYgc2NvcGUucnVudGltZSBpbnN0YW5jZW9mIFJ1bnRpbWUpIHtcbiAgICAgICAgcnVudGltZSA9IHNjb3BlLnJ1bnRpbWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBnZXRJbmxpbmVDb2RlRmlsZUV4dGVuc2lvbihydW50aW1lKTtcblxuICAgICAgdGhpcy5kYXRhQXJjaGl2ZSA9IG5ldyBkYXRhQXJjaGl2ZUZpbGUuRGF0YUFyY2hpdmVGaWxlKHNjb3BlLCBpZCwge1xuICAgICAgICBvdXRwdXRQYXRoOiBwYXRodEpvaW4oXG4gICAgICAgICAgY2RrdGYuVG9rZW4uYXNTdHJpbmcoY2RrdGYucmVmKFwicGF0aC5yb290XCIpKSxcbiAgICAgICAgICBcIi5hcmNoaXZlX2ZpbGVzXCIsXG4gICAgICAgICAgYCR7aWR9LnppcGAsXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IFwiemlwXCIsXG4gICAgICAgIHNvdXJjZUNvbnRlbnQ6IHRoaXMuY29kZSxcbiAgICAgICAgc291cmNlQ29udGVudEZpbGVuYW1lOiBgaW5kZXgke2V4dGVuc2lvbn1gLFxuICAgICAgICBwcm92aWRlcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIExhbWJkYSBjb2RlIGZyb20gYSBsb2NhbCBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3NldENvZGUgZXh0ZW5kcyBDb2RlIHtcbiAgcHVibGljIHJlYWRvbmx5IGlzSW5saW5lID0gZmFsc2U7XG4gIHByaXZhdGUgYXNzZXQ/OiBzM19hc3NldHMuQXNzZXQ7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBhc3NldCBmaWxlIG9yIGRpcmVjdG9yeS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBzM19hc3NldHMuQXNzZXRPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0KTogQ29kZUNvbmZpZyB7XG4gICAgLy8gSWYgdGhlIHNhbWUgQXNzZXRDb2RlIGlzIHVzZWQgbXVsdGlwbGUgdGltZXMsIHJldGFpbiBvbmx5IHRoZSBmaXJzdCBpbnN0YW50aWF0aW9uLlxuICAgIGlmICghdGhpcy5hc3NldCkge1xuICAgICAgdGhpcy5hc3NldCA9IG5ldyBzM19hc3NldHMuQXNzZXQoc2NvcGUsIFwiQ29kZVwiLCB7XG4gICAgICAgIHBhdGg6IHRoaXMucGF0aCxcbiAgICAgICAgZGVwbG95VGltZTogdHJ1ZSxcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHRoaXMuYXNzZXQpICE9PSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSlcbiAgICApIHtcbiAgICAgIC8vIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBc3NldCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIHN0YWNrICcke0F3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHRoaXMuYXNzZXQpLmdyaWRVVUlEfScuIGAgK1xuICAgICAgICAgIFwiQ3JlYXRlIGEgbmV3IENvZGUgaW5zdGFuY2UgZm9yIGV2ZXJ5IHN0YWNrLlwiLFxuICAgICAgICAvLyBzY29wZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFzc2V0LmlzWmlwQXJjaGl2ZSkge1xuICAgICAgLy8gdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFzc2V0IG11c3QgYmUgYSAuemlwIGZpbGUgb3IgYSBkaXJlY3RvcnkgKCR7dGhpcy5wYXRofSlgLFxuICAgICAgICAvLyBzY29wZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHMzTG9jYXRpb246IHtcbiAgICAgICAgYnVja2V0TmFtZTogdGhpcy5hc3NldC5zM0J1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5hc3NldC5zM09iamVjdEtleSxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VLTVNLZXlBcm46IHRoaXMub3B0aW9ucy5zb3VyY2VLTVNLZXk/LmtleUFybixcbiAgICB9O1xuICB9XG5cbiAgLy8gcHVibGljIGJpbmRUb1Jlc291cmNlKFxuICAvLyAgIHJlc291cmNlOiBJQXdzQ29uc3RydWN0LFxuICAvLyAgIG9wdGlvbnM6IFJlc291cmNlQmluZE9wdGlvbnMgPSB7fSxcbiAgLy8gKSB7XG4gIC8vICAgaWYgKCF0aGlzLmFzc2V0KSB7XG4gIC8vICAgICAvLyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAvLyAgICAgICBcImJpbmRUb1Jlc291cmNlKCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYmluZCgpXCIsXG4gIC8vICAgICAgIC8vIHJlc291cmNlLFxuICAvLyAgICAgKTtcbiAgLy8gICB9XG5cbiAgLy8gICBjb25zdCByZXNvdXJjZVByb3BlcnR5ID0gb3B0aW9ucy5yZXNvdXJjZVByb3BlcnR5IHx8IFwiQ29kZVwiO1xuICAvLyAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTQzMlxuICAvLyAgIHRoaXMuYXNzZXQuYWRkUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZSwgcmVzb3VyY2VQcm9wZXJ0eSk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUJpbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBhbm5vdGF0ZSB3aXRoIGFzc2V0IG1ldGFkYXRhLlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTQzMlxuICAgKiBAZGVmYXVsdCBDb2RlXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZVByb3BlcnR5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdGlvbiBwcm9wZXJ0aWVzIGZvciBgVGVycmFmb3JtVmFyaWFibGVzQ29kZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVycmFmb3JtVmFyaWFibGVzQ29kZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBUZXJyYWZvcm0gdmFyaWFibGUgdGhhdCByZXByZXNlbnRzIHRoZSBuYW1lIG9mIHRoZSBTMyBCdWNrZXRcbiAgICogd2hlcmUgdGhlIExhbWJkYSBjb2RlIHdpbGwgYmUgbG9jYXRlZCBpbi5cbiAgICogTXVzdCBiZSBvZiB0eXBlICdTdHJpbmcnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhIG5ldyB2YXJpYWJsZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWVWYXI/OiBjZGt0Zi5UZXJyYWZvcm1WYXJpYWJsZTtcblxuICAvKipcbiAgICogVGhlIFRlcnJhZm9ybSB2YXJpYWJsZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGggaW5zaWRlIHRoZSBTMyBCdWNrZXRcbiAgICogd2hlcmUgdGhlIExhbWJkYSBjb2RlIHdpbGwgYmUgbG9jYXRlZCBhdC5cbiAgICogTXVzdCBiZSBvZiB0eXBlICdTdHJpbmcnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhIG5ldyB2YXJpYWJsZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG9iamVjdEtleVZhcj86IGNka3RmLlRlcnJhZm9ybVZhcmlhYmxlO1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgS01TIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIGhhbmRsZXIgY29kZS5cbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggQW1hem9uIFMzIG1hbmFnZWQga2V5cyhTU0UtUzMpIGtleSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VLTVNLZXk/OiBJS2V5O1xufVxuXG4vKipcbiAqIExhbWJkYSBjb2RlIGRlZmluZWQgdXNpbmcgMiBUZXJyYWZvcm0gdmFyaWFibGVzLlxuICogVXNlZnVsIHdoZW4geW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBjb2RlIG9mIHlvdXIgTGFtYmRhIGZyb20geW91ciBDREsgY29kZSwgc28geW91IGNhbid0IHVzZSBBc3NldHMsXG4gKiBhbmQgeW91IHdhbnQgdG8gZGVwbG95IHRoZSBMYW1iZGEgaW4gYSBwaXBlbGluZSwgZHVyaW5nIFRlcnJhZm9ybSBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlIGV4dGVuZHMgQ29kZSB7XG4gIHB1YmxpYyByZWFkb25seSBpc0lubGluZSA9IGZhbHNlO1xuICBwcml2YXRlIF9idWNrZXROYW1lVmFyPzogY2RrdGYuVGVycmFmb3JtVmFyaWFibGU7XG4gIHByaXZhdGUgX29iamVjdEtleVZhcj86IGNka3RmLlRlcnJhZm9ybVZhcmlhYmxlO1xuICBwcml2YXRlIF9zb3VyY2VLTVNLZXk/OiBJS2V5O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9idWNrZXROYW1lVmFyID0gcHJvcHMuYnVja2V0TmFtZVZhcjtcbiAgICB0aGlzLl9vYmplY3RLZXlWYXIgPSBwcm9wcy5vYmplY3RLZXlWYXI7XG4gICAgdGhpcy5fc291cmNlS01TS2V5ID0gcHJvcHMuc291cmNlS01TS2V5O1xuICB9XG5cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCk6IENvZGVDb25maWcge1xuICAgIGlmICghdGhpcy5fYnVja2V0TmFtZVZhcikge1xuICAgICAgdGhpcy5fYnVja2V0TmFtZVZhciA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1WYXJpYWJsZShcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIFwiTGFtYmRhU291cmNlQnVja2V0TmFtZVBhcmFtZXRlclwiLFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9vYmplY3RLZXlWYXIpIHtcbiAgICAgIHRoaXMuX29iamVjdEtleVZhciA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1WYXJpYWJsZShcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIFwiTGFtYmRhU291cmNlT2JqZWN0S2V5UGFyYW1ldGVyXCIsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgczNMb2NhdGlvbjoge1xuICAgICAgICBidWNrZXROYW1lOiB0aGlzLl9idWNrZXROYW1lVmFyLnN0cmluZ1ZhbHVlLFxuICAgICAgICBvYmplY3RLZXk6IHRoaXMuX29iamVjdEtleVZhci5zdHJpbmdWYWx1ZSxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VLTVNLZXlBcm46IHRoaXMuX3NvdXJjZUtNU0tleT8ua2V5QXJuLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcGFyYW1ldGVycyBtYXAgZnJvbSB0aGlzIGluc3RhbmNlJ3MgVGVycmFmb3JtIHZhcmlhYmxlcy5cbiAgICpcbiAgICogSXQgcmV0dXJucyBhIG1hcCB3aXRoIDIga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gdGhpcyBMYW1iZGEgY29kZSxcbiAgICogYW5kIGFzIHZhbHVlcyBpdCBjb250YWlucyB0aGUgYXBwcm9wcmlhdGUgZXhwcmVzc2lvbnMgcG9pbnRpbmcgYXQgdGhlIHByb3ZpZGVkIFMzIGxvY2F0aW9uXG4gICAqIChtb3N0IGxpa2VseSwgb2J0YWluZWQgZnJvbSBhIENvZGVQaXBlbGluZSBBcnRpZmFjdCBieSBjYWxsaW5nIHRoZSBgYXJ0aWZhY3QuczNMb2NhdGlvbmAgbWV0aG9kKS5cbiAgICogVGhlIHJlc3VsdCBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIENsb3VkRm9ybWF0aW9uIEFjdGlvblxuICAgKiB0aGF0IGlzIGRlcGxveWluZyB0aGUgU3RhY2sgdGhhdCB0aGUgTGFtYmRhIHdpdGggdGhpcyBjb2RlIGlzIHBhcnQgb2YsXG4gICAqIGluIHRoZSBgcGFyYW1ldGVyT3ZlcnJpZGVzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgb2JqZWN0IGluIFMzIHRoYXQgcmVwcmVzZW50cyB0aGUgTGFtYmRhIGNvZGVcbiAgICovXG4gIHB1YmxpYyBhc3NpZ24obG9jYXRpb246IHN0b3JhZ2UuUzNMb2NhdGlvbik6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCByZXQ6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgcmV0W3RoaXMuYnVja2V0TmFtZVZhcl0gPSBsb2NhdGlvbi5idWNrZXROYW1lO1xuICAgIHJldFt0aGlzLm9iamVjdEtleVZhcl0gPSBsb2NhdGlvbi5vYmplY3RLZXk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYnVja2V0TmFtZVZhcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9idWNrZXROYW1lVmFyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYnVja2V0TmFtZVZhci5mcW47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQYXNzIFRlcnJhZm9ybVZhcmlhYmxlc0NvZGUgdG8gYSBMYW1iZGEgRnVuY3Rpb24gYmVmb3JlIGFjY2Vzc2luZyB0aGUgYnVja2V0TmFtZVZhciBwcm9wZXJ0eVwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdEtleVZhcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9vYmplY3RLZXlWYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmplY3RLZXlWYXIuZnFuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiUGFzcyBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlIHRvIGEgTGFtYmRhIEZ1bmN0aW9uIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIG9iamVjdEtleVZhciBwcm9wZXJ0eVwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgYSBuZXcgRWNySW1hZ2VDb2RlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNySW1hZ2VDb2RlUHJvcHMge1xuICAvKipcbiAgICogU3BlY2lmeSBvciBvdmVycmlkZSB0aGUgQ01EIG9uIHRoZSBzcGVjaWZpZWQgRG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqIFRoaXMgbmVlZHMgdG8gYmUgaW4gdGhlICdleGVjIGZvcm0nLCB2aXouLCBgWyAnZXhlY3V0YWJsZScsICdwYXJhbTEnLCAncGFyYW0yJyBdYC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI2NtZFxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgQ01EIHNwZWNpZmllZCBpbiB0aGUgZG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqL1xuICByZWFkb25seSBjbWQ/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmeSBvciBvdmVycmlkZSB0aGUgRU5UUllQT0lOVCBvbiB0aGUgc3BlY2lmaWVkIERvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKiBBbiBFTlRSWVBPSU5UIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIGEgY29udGFpbmVyIHRoYXQgd2lsbCBydW4gYXMgYW4gZXhlY3V0YWJsZS5cbiAgICogVGhpcyBuZWVkcyB0byBiZSBpbiB0aGUgJ2V4ZWMgZm9ybScsIHZpei4sIGBbICdleGVjdXRhYmxlJywgJ3BhcmFtMScsICdwYXJhbTInIF1gLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvYnVpbGRlci8jZW50cnlwb2ludFxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgRU5UUllQT0lOVCBpbiB0aGUgZG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIFdPUktESVIgb24gdGhlIHNwZWNpZmllZCBEb2NrZXIgaW1hZ2Ugb3IgRG9ja2VyZmlsZS5cbiAgICogQSBXT1JLRElSIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0aGUgY29udGFpbmVyIHdpbGwgdXNlLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvYnVpbGRlci8jd29ya2RpclxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgV09SS0RJUiBpbiB0aGUgZG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgdGFnIHRvIHVzZSB3aGVuIHB1bGxpbmcgdGhlIGltYWdlIGZyb20gRUNSLlxuICAgKiBAZGVmYXVsdCAnbGF0ZXN0J1xuICAgKiBAZGVwcmVjYXRlZCB1c2UgYHRhZ09yRGlnZXN0YFxuICAgKi9cbiAgcmVhZG9ubHkgdGFnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgdGFnIG9yIGRpZ2VzdCB0byB1c2Ugd2hlbiBwdWxsaW5nIHRoZSBpbWFnZSBmcm9tIEVDUiAoZGlnZXN0cyBtdXN0IHN0YXJ0IHdpdGggYHNoYTI1NjpgKS5cbiAgICogQGRlZmF1bHQgJ2xhdGVzdCdcbiAgICovXG4gIHJlYWRvbmx5IHRhZ09yRGlnZXN0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBEb2NrZXIgaW1hZ2UgaW4gRUNSIHRoYXQgY2FuIGJlIGJvdW5kIGFzIExhbWJkYSBDb2RlLlxuICovXG5leHBvcnQgY2xhc3MgRWNySW1hZ2VDb2RlIGV4dGVuZHMgQ29kZSB7XG4gIHB1YmxpYyByZWFkb25seSBpc0lubGluZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVwb3NpdG9yeTogc3RvcmFnZS5JUmVwb3NpdG9yeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBFY3JJbWFnZUNvZGVQcm9wcyA9IHt9LFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnIHtcbiAgICB0aGlzLnJlcG9zaXRvcnkuZ3JhbnRQdWxsKG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImxhbWJkYS5hbWF6b25hd3MuY29tXCIpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbWFnZToge1xuICAgICAgICBpbWFnZVVyaTogdGhpcy5yZXBvc2l0b3J5LnJlcG9zaXRvcnlVcmlGb3JUYWdPckRpZ2VzdChcbiAgICAgICAgICB0aGlzLnByb3BzPy50YWdPckRpZ2VzdCA/PyB0aGlzLnByb3BzPy50YWcgPz8gXCJsYXRlc3RcIixcbiAgICAgICAgKSxcbiAgICAgICAgY21kOiB0aGlzLnByb3BzLmNtZCxcbiAgICAgICAgZW50cnlwb2ludDogdGhpcy5wcm9wcy5lbnRyeXBvaW50LFxuICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiB0aGlzLnByb3BzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgYSBuZXcgQXNzZXRJbWFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SW1hZ2VDb2RlUHJvcHNcbiAgZXh0ZW5kcyBlY3JfYXNzZXRzLkRvY2tlckltYWdlQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIENNRCBvbiB0aGUgc3BlY2lmaWVkIERvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKiBUaGlzIG5lZWRzIHRvIGJlIGluIHRoZSAnZXhlYyBmb3JtJywgdml6LiwgYFsgJ2V4ZWN1dGFibGUnLCAncGFyYW0xJywgJ3BhcmFtMicgXWAuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9idWlsZGVyLyNjbWRcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIENNRCBzcGVjaWZpZWQgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgY21kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIEVOVFJZUE9JTlQgb24gdGhlIHNwZWNpZmllZCBEb2NrZXIgaW1hZ2Ugb3IgRG9ja2VyZmlsZS5cbiAgICogQW4gRU5UUllQT0lOVCBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSBhIGNvbnRhaW5lciB0aGF0IHdpbGwgcnVuIGFzIGFuIGV4ZWN1dGFibGUuXG4gICAqIFRoaXMgbmVlZHMgdG8gYmUgaW4gdGhlICdleGVjIGZvcm0nLCB2aXouLCBgWyAnZXhlY3V0YWJsZScsICdwYXJhbTEnLCAncGFyYW0yJyBdYC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI2VudHJ5cG9pbnRcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIEVOVFJZUE9JTlQgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG9yIG92ZXJyaWRlIHRoZSBXT1JLRElSIG9uIHRoZSBzcGVjaWZpZWQgRG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqIEEgV09SS0RJUiBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgdGhlIGNvbnRhaW5lciB3aWxsIHVzZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI3dvcmtkaXJcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIFdPUktESVIgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEVDUiBpbWFnZSB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGFzc2V0IGFuZCBjYW4gYmUgYm91bmQgYXMgTGFtYmRhIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3NldEltYWdlQ29kZSBleHRlbmRzIENvZGUge1xuICBwdWJsaWMgcmVhZG9ubHkgaXNJbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBhc3NldD86IGVjcl9hc3NldHMuRG9ja2VySW1hZ2VBc3NldDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFzc2V0SW1hZ2VDb2RlUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0KTogQ29kZUNvbmZpZyB7XG4gICAgLy8gSWYgdGhlIHNhbWUgQXNzZXRJbWFnZUNvZGUgaXMgdXNlZCBtdWx0aXBsZSB0aW1lcywgcmV0YWluIG9ubHkgdGhlIGZpcnN0IGluc3RhbnRpYXRpb24uXG4gICAgaWYgKCF0aGlzLmFzc2V0KSB7XG4gICAgICB0aGlzLmFzc2V0ID0gbmV3IGVjcl9hc3NldHMuRG9ja2VySW1hZ2VBc3NldChzY29wZSwgXCJBc3NldEltYWdlXCIsIHtcbiAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgLi4udGhpcy5wcm9wcyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hc3NldC5yZXBvc2l0b3J5LmdyYW50UHVsbChcbiAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwibGFtYmRhLmFtYXpvbmF3cy5jb21cIiksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdCh0aGlzLmFzc2V0KSAhPT0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpXG4gICAgKSB7XG4gICAgICAvLyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXNzZXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBzdGFjayAnJHtBd3NTdGFjay5vZkF3c0NvbnN0cnVjdCh0aGlzLmFzc2V0KS5ncmlkVVVJRH0nLiBgICtcbiAgICAgICAgICBcIkNyZWF0ZSBhIG5ldyBDb2RlIGluc3RhbmNlIGZvciBldmVyeSBzdGFjay5cIixcbiAgICAgICAgLy8gc2NvcGUsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbWFnZToge1xuICAgICAgICBpbWFnZVVyaTogdGhpcy5hc3NldC5pbWFnZVVyaSxcbiAgICAgICAgZW50cnlwb2ludDogdGhpcy5wcm9wcy5lbnRyeXBvaW50LFxuICAgICAgICBjbWQ6IHRoaXMucHJvcHMuY21kLFxuICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiB0aGlzLnByb3BzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyAvLyBUT0RPOiBwZW5kaW5nIGN1c3RvbSBDTEkgdG8gbW9jayBMYW1iZGEgZnVuY3Rpb24gaW52b2NhdGlvbnMgbG9jYWxseVxuICAvLyBwdWJsaWMgYmluZFRvUmVzb3VyY2UoXG4gIC8vICAgcmVzb3VyY2U6IElBd3NDb25zdHJ1Y3QsXG4gIC8vICAgb3B0aW9uczogUmVzb3VyY2VCaW5kT3B0aW9ucyA9IHt9LFxuICAvLyApIHtcbiAgLy8gICBpZiAoIXRoaXMuYXNzZXQpIHtcbiAgLy8gICAgIC8vIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiaW5kVG9SZXNvdXJjZSgpIG11c3QgYmUgY2FsbGVkIGFmdGVyIGJpbmQoKVwiKTsgLy8sIHJlc291cmNlKTtcbiAgLy8gICB9XG5cbiAgLy8gICAvLyBjb25zdCByZXNvdXJjZVByb3BlcnR5ID0gX29wdGlvbnMucmVzb3VyY2VQcm9wZXJ0eSB8fCBcIkNvZGUuSW1hZ2VVcmlcIjtcblxuICAvLyAgIC8vIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTQ1OTNcbiAgLy8gICAvLyB0aGlzLmFzc2V0LmFkZFJlc291cmNlTWV0YWRhdGEoX3Jlc291cmNlLCByZXNvdXJjZVByb3BlcnR5KTtcbiAgLy8gfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgd2hlbiBjcmVhdGluZyBhbiBhc3NldCBmcm9tIGEgRG9ja2VyIGJ1aWxkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlckJ1aWxkQXNzZXRPcHRpb25zIGV4dGVuZHMgRG9ja2VyQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIGluIHRoZSBEb2NrZXIgaW1hZ2Ugd2hlcmUgdGhlIGFzc2V0IGlzIGxvY2F0ZWQgYWZ0ZXIgdGhlIGJ1aWxkXG4gICAqIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgL2Fzc2V0XG4gICAqL1xuICByZWFkb25seSBpbWFnZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHdoZXJlIHRoZSBhc3NldCB3aWxsIGJlIGNvcGllZFxuICAgKiB1c2luZyBgZG9ja2VyIGNwYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnlcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYEFzc2V0Q29kZWAgd2l0aCBhIGN1c3RvbSBjb21tYW5kLCBzdWNoIGFzIHJ1bm5pbmcgYSBidWlsZGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ29tbWFuZE9wdGlvbnMgZXh0ZW5kcyBzM19hc3NldHMuQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MsIHdoaWNoIGRldGVybWluZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBzcGF3bmVkIHByb2Nlc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0OiBzZWUgYGNoaWxkX3Byb2Nlc3MuU3Bhd25TeW5jT3B0aW9uc2AgKGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2hpbGRfcHJvY2Vzcy5odG1sI2NoaWxkX3Byb2Nlc3NzcGF3bnN5bmNjb21tYW5kLWFyZ3Mtb3B0aW9ucykuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kT3B0aW9ucz86IHsgW29wdGlvbnM6IHN0cmluZ106IGFueSB9O1xufVxuXG4vKipcbiAqIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGNyZWF0aW5nIGNvZGUgdXNpbmcgYnVja2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBTMyBvYmplY3QgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgb2JqZWN0VmVyc2lvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBoYW5kbGVyIGNvZGUuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIEFtYXpvbiBTMyBtYW5hZ2VkIGtleXMoU1NFLVMzKSBrZXkgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlS01TS2V5PzogSUtleTtcbn1cbiJdfQ==
478
+ AssetImageCode[_h] = { fqn: "terraconstructs.aws.compute.AssetImageCode", version: "0.1.9" };
479
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvY29tcHV0ZS9jb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBQTBDO0FBQzFDLCtCQUF5QztBQUN6Qyw4REFBMEQ7QUFDMUQsK0JBQStCO0FBRS9CLDZDQUFpRTtBQUNqRSx5Q0FBd0U7QUFDeEUsNkRBQWlEO0FBQ2pELDRDQUF3QztBQUV4Qyw4QkFBOEI7QUFFOUIsb0RBQW9EO0FBQ3BELHVDQUFtRDtBQUNuRCw0REFBNEQ7QUFDNUQsa0RBQWtEO0FBRWxEOztHQUVHO0FBQ0gsTUFBc0IsSUFBSTtJQUN4Qjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQ3RCLE1BQXVCLEVBQ3ZCLEdBQVcsRUFDWCxhQUFzQjtRQUV0QixPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUN4QixNQUF1QixFQUN2QixHQUFXLEVBQ1gsT0FBdUI7UUFFdkIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUNsQixNQUF1QixFQUN2QixHQUFXLEVBQ1gsYUFBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVk7UUFDbkMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQy9CLE9BQU8sSUFBSSxDQUFD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LEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtnQkFDakMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDbkIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7YUFDOUM7U0FDRixDQUFDO0lBQ0osQ0FBQzs7QUF2Q0gsd0NBdURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGpvaW4gYXMgcGF0aHRKb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGRhdGFBcmNoaXZlRmlsZSB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXJjaGl2ZVwiO1xuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2UsIERvY2tlckJ1aWxkT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9idW5kbGluZ1wiO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB7IG1kNWhhc2ggfSBmcm9tIFwiLi4vLi4vaGVscGVycy1pbnRlcm5hbFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBJS2V5IH0gZnJvbSBcIi4uL2VuY3J5cHRpb25cIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgKiBhcyBzdG9yYWdlIGZyb20gXCIuLi9zdG9yYWdlXCI7XG4vLyBpbXBvcnQgeyBJQXdzQ29uc3RydWN0IH0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IFJ1bnRpbWUsIFJ1bnRpbWVGYW1pbHkgfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5pbXBvcnQgKiBhcyBlY3JfYXNzZXRzIGZyb20gXCIuLi9zdG9yYWdlL2Fzc2V0cy9pbWFnZS1hc3NldFwiO1xuaW1wb3J0ICogYXMgczNfYXNzZXRzIGZyb20gXCIuLi9zdG9yYWdlL2Fzc2V0cy9zM1wiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIExhbWJkYSBIYW5kbGVyIENvZGUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb2RlIHtcbiAgLyoqXG4gICAqIExhbWJkYSBoYW5kbGVyIGNvZGUgYXMgYW4gUzMgb2JqZWN0LlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBidWNrZXRcbiAgICogQHBhcmFtIGtleSBUaGUgb2JqZWN0IGtleVxuICAgKiBAcGFyYW0gb2JqZWN0VmVyc2lvbiBPcHRpb25hbCBTMyBvYmplY3QgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnVja2V0KFxuICAgIGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0LFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9iamVjdFZlcnNpb24/OiBzdHJpbmcsXG4gICk6IFMzQ29kZSB7XG4gICAgcmV0dXJuIG5ldyBTM0NvZGUoYnVja2V0LCBrZXksIG9iamVjdFZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIExhbWJkYSBoYW5kbGVyIGNvZGUgYXMgYW4gUzMgb2JqZWN0LlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBidWNrZXRcbiAgICogQHBhcmFtIGtleSBUaGUgb2JqZWN0IGtleVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXR0aW5nIHRoZSBjb2RlLCBjdXJyZW50IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gc2V0IGhlcmUgYXJlXG4gICAqIDEuIGBvYmplY3RWZXJzaW9uYCB0byBzZXQgUzMgb2JqZWN0IHZlcnNpb25cbiAgICogMi4gYHNvdXJjZUtNU0tleWAgdG8gc2V0IEtNUyBLZXkgZm9yIGVuY3J5cHRpb24gb2YgY29kZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnVja2V0VjIoXG4gICAgYnVja2V0OiBzdG9yYWdlLklCdWNrZXQsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEJ1Y2tldE9wdGlvbnMsXG4gICk6IFMzQ29kZVYyIHtcbiAgICByZXR1cm4gbmV3IFMzQ29kZVYyKGJ1Y2tldCwga2V5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBERVBSRUNBVEVEXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgZnJvbUJ1Y2tldGBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYnVja2V0KFxuICAgIGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0LFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9iamVjdFZlcnNpb24/OiBzdHJpbmcsXG4gICk6IFMzQ29kZSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUJ1Y2tldChidWNrZXQsIGtleSwgb2JqZWN0VmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogSW5saW5lIGNvZGUgZm9yIExhbWJkYSBoYW5kbGVyXG4gICAqIEByZXR1cm5zIGBMYW1iZGFJbmxpbmVDb2RlYCB3aXRoIGlubGluZSBjb2RlLlxuICAgKiBAcGFyYW0gY29kZSBUaGUgYWN0dWFsIGhhbmRsZXIgY29kZSAodGhlIHJlc3VsdGluZyB6aXAgZmlsZSBjYW5ub3QgZXhjZWVkIDRNQilcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUlubGluZShjb2RlOiBzdHJpbmcpOiBJbmxpbmVDb2RlIHtcbiAgICByZXR1cm4gbmV3IElubGluZUNvZGUoY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogREVQUkVDQVRFRFxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGZyb21JbmxpbmVgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlubGluZShjb2RlOiBzdHJpbmcpOiBJbmxpbmVDb2RlIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tSW5saW5lKGNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBmdW5jdGlvbiBjb2RlIGZyb20gYSBsb2NhbCBkaXNrIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIEVpdGhlciBhIGRpcmVjdG9yeSB3aXRoIHRoZSBMYW1iZGEgY29kZSBidW5kbGUgb3IgYSAuemlwIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUFzc2V0KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogczNfYXNzZXRzLkFzc2V0T3B0aW9ucyxcbiAgKTogQXNzZXRDb2RlIHtcbiAgICByZXR1cm4gbmV3IEFzc2V0Q29kZShwYXRoLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY29tbWFuZCB0byBidWlsZCB0aGUgY29kZSBhc3NldCB0aGF0IHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dCBXaGVyZSB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIHdpbGwgYmUgZGlyZWN0ZWQsIGVpdGhlciBhIGRpcmVjdG9yeSBvciBhIC56aXAgZmlsZSB3aXRoIHRoZSBvdXRwdXQgTGFtYmRhIGNvZGUgYnVuZGxlXG4gICAqICogRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgdGhlIGNvbW1hbmQgdG8gcnVuIGEgYnVpbGQgc2NyaXB0IChlLmcuLCBbICdub2RlJywgJ2J1bmRsZV9jb2RlLmpzJyBdKSwgYW5kIHRoZSBidWlsZCBzY3JpcHQgZ2VuZXJhdGVzIGEgZGlyZWN0b3J5IGAvbXkvbGFtYmRhL2NvZGVgXG4gICAqIGNvbnRhaW5pbmcgY29kZSB0aGF0IHNob3VsZCBiZSByYW4gaW4gYSBMYW1iZGEgZnVuY3Rpb24sIHRoZW4gb3V0cHV0IHNob3VsZCBiZSBzZXQgdG8gYC9teS9sYW1iZGEvY29kZWBcbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCB0byBnZW5lcmF0ZSB0aGUgb3V0cHV0LCBmb3IgZXhhbXBsZSwgWyAnbm9kZScsICdidW5kbGVfY29kZS5qcycgXVxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgY3VzdG9tIGNvbW1hbmQsIGFuZCBvdGhlciBhc3NldCBvcHRpb25zIC0tIGJ1dCBidW5kbGluZyBvcHRpb25zIGFyZSBub3QgYWxsb3dlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUN1c3RvbUNvbW1hbmQoXG4gICAgb3V0cHV0OiBzdHJpbmcsXG4gICAgY29tbWFuZDogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IEN1c3RvbUNvbW1hbmRPcHRpb25zLFxuICApOiBBc3NldENvZGUge1xuICAgIGlmIChjb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAnY29tbWFuZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGFyZ3VtZW50LiBGb3IgZXhhbXBsZSwgW1wibm9kZVwiLCBcImJ1aWxkRmlsZS5qc1wiXS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWQgPSBjb21tYW5kWzBdO1xuICAgIGNvbnN0IGNvbW1hbmRBcmd1bWVudHMgPSBjb21tYW5kLnNwbGljZSgxKTtcblxuICAgIGNvbnN0IHByb2MgPVxuICAgICAgb3B0aW9ucz8uY29tbWFuZE9wdGlvbnMgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNwYXduU3luYyhjbWQsIGNvbW1hbmRBcmd1bWVudHMpIC8vIHVzZSB0aGUgZGVmYXVsdCBzcGF3blN5bmNPcHRpb25zXG4gICAgICAgIDogc3Bhd25TeW5jKGNtZCwgY29tbWFuZEFyZ3VtZW50cywgb3B0aW9ucy5jb21tYW5kT3B0aW9ucyk7XG5cbiAgICBpZiAocHJvYy5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgY3VzdG9tIGNvbW1hbmQ6ICR7cHJvYy5lcnJvcn1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb2Muc3RhdHVzICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGAke2NvbW1hbmQuam9pbihcIiBcIil9IGV4aXRlZCB3aXRoIHN0YXR1czogJHtwcm9jLnN0YXR1c31cXG5cXG5zdGRvdXQ6ICR7cHJvYy5zdGRvdXQ/LnRvU3RyaW5nKCkudHJpbSgpfVxcblxcbnN0ZGVycjogJHtwcm9jLnN0ZGVycj8udG9TdHJpbmcoKS50cmltKCl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NldENvZGUob3V0cHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgZnVuY3Rpb24gY29kZSBmcm9tIGFuIGFzc2V0IGNyZWF0ZWQgYnkgYSBEb2NrZXIgYnVpbGQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBhc3NldCBpcyBleHBlY3RlZCB0byBiZSBsb2NhdGVkIGF0IGAvYXNzZXRgIGluIHRoZVxuICAgKiBpbWFnZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBEb2NrZXIgZmlsZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBEb2NrZXIgYnVpbGQgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRG9ja2VyQnVpbGQoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERvY2tlckJ1aWxkQXNzZXRPcHRpb25zID0ge30sXG4gICk6IEFzc2V0Q29kZSB7XG4gICAgbGV0IGltYWdlUGF0aCA9IG9wdGlvbnMuaW1hZ2VQYXRoID8/IFwiL2Fzc2V0Ly5cIjtcblxuICAgIC8vIGVuc3VyZSBpbWFnZVBhdGggZW5kcyB3aXRoIC8uIHRvIGNvcHkgdGhlICoqY29udGVudCoqIGF0IHRoaXMgcGF0aFxuICAgIGlmIChpbWFnZVBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICBpbWFnZVBhdGggPSBgJHtpbWFnZVBhdGh9LmA7XG4gICAgfSBlbHNlIGlmICghaW1hZ2VQYXRoLmVuZHNXaXRoKFwiLy5cIikpIHtcbiAgICAgIGltYWdlUGF0aCA9IGAke2ltYWdlUGF0aH0vLmA7XG4gICAgfVxuXG4gICAgY29uc3QgYXNzZXRQYXRoID0gRG9ja2VySW1hZ2UuZnJvbUJ1aWxkKHBhdGgsIG9wdGlvbnMpLmNwKFxuICAgICAgaW1hZ2VQYXRoLFxuICAgICAgb3B0aW9ucy5vdXRwdXRQYXRoLFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IEFzc2V0Q29kZShhc3NldFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERFUFJFQ0FURURcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBmcm9tQXNzZXRgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzc2V0KHBhdGg6IHN0cmluZyk6IEFzc2V0Q29kZSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUFzc2V0KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTGFtYmRhIHNvdXJjZSBkZWZpbmVkIHVzaW5nIFRlcnJhZm9ybSB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIGBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlYFxuICAgKiBAcGFyYW0gcHJvcHMgb3B0aW9uYWwgY29uc3RydWN0aW9uIHByb3BlcnRpZXMgb2YgYFRlcnJhZm9ybVZhcmlhYmxlc0NvZGVgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UZXJyYWZvcm1WYXJpYWJsZXMoXG4gICAgcHJvcHM/OiBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlUHJvcHMsXG4gICk6IFRlcnJhZm9ybVZhcmlhYmxlc0NvZGUge1xuICAgIHJldHVybiBuZXcgVGVycmFmb3JtVmFyaWFibGVzQ29kZShwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogREVQUkVDQVRFRFxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGZyb21UZXJyYWZvcm1WYXJpYWJsZXNgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRlcnJhZm9ybVZhcmlhYmxlcyhcbiAgICBwcm9wcz86IFRlcnJhZm9ybVZhcmlhYmxlc0NvZGVQcm9wcyxcbiAgKTogVGVycmFmb3JtVmFyaWFibGVzQ29kZSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVRlcnJhZm9ybVZhcmlhYmxlcyhwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGFuIGV4aXN0aW5nIEVDUiBpbWFnZSBhcyB0aGUgTGFtYmRhIGNvZGUuXG4gICAqIEBwYXJhbSByZXBvc2l0b3J5IHRoZSBFQ1IgcmVwb3NpdG9yeSB0aGF0IHRoZSBpbWFnZSBpcyBpblxuICAgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyB0byBmdXJ0aGVyIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgaW1hZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUVjckltYWdlKFxuICAgIHJlcG9zaXRvcnk6IHN0b3JhZ2UuSVJlcG9zaXRvcnksXG4gICAgcHJvcHM/OiBFY3JJbWFnZUNvZGVQcm9wcyxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBFY3JJbWFnZUNvZGUocmVwb3NpdG9yeSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFQ1IgaW1hZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGFzc2V0IGFuZCBiaW5kIGl0IGFzIHRoZSBMYW1iZGEgY29kZS5cbiAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhlIGFzc2V0IG11c3QgYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyB0byBmdXJ0aGVyIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgaW1hZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUFzc2V0SW1hZ2UoXG4gICAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gICAgcHJvcHM6IEFzc2V0SW1hZ2VDb2RlUHJvcHMgPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBBc3NldEltYWdlQ29kZShkaXJlY3RvcnksIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBDb2RlIGlzIGlubGluZSBjb2RlIG9yIG5vdC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdGhpcyB2YWx1ZSBpcyBpZ25vcmVkIHNpbmNlIGlubGluZSBpcyBub3cgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGVcbiAgICogdGhlIGBpbmxpbmVDb2RlYCBmaWVsZCBvZiBgQ29kZUNvbmZpZ2AgcmV0dXJuZWQgZnJvbSBgYmluZCgpYC5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBpc0lubGluZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGxhbWJkYSBvciBsYXllciBpcyBpbml0aWFsaXplZCB0byBhbGxvdyB0aGlzIG9iamVjdCB0byBiaW5kXG4gICAqIHRvIHRoZSBzdGFjaywgYWRkIHJlc291cmNlcyBhbmQgaGF2ZSBmdW4uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgYmluZGluZyBzY29wZS4gRG9uJ3QgYmUgc21hcnQgYWJvdXQgdHJ5aW5nIHRvIGRvd24tY2FzdCBvclxuICAgKiBhc3N1bWUgaXQncyBpbml0aWFsaXplZC4gWW91IG1heSBqdXN0IHVzZSBpdCBhcyBhIGNvbnN0cnVjdCBzY29wZS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnO1xuXG4gIC8vIFRPRE86IHBlbmRpbmcgY3VzdG9tIENMSSB0byBtb2NrIExhbWJkYSBmdW5jdGlvbiBpbnZvY2F0aW9ucyBsb2NhbGx5XG4gIC8vIC8qKlxuICAvLyAgKiBDYWxsZWQgYWZ0ZXIgdGhlIHRlcnJhZm9ybSBwcm92aWRlciBmdW5jdGlvbiByZXNvdXJjZSBoYXMgYmVlbiBjcmVhdGVkIHRvIGFsbG93IHRoZSBjb2RlXG4gIC8vICAqIGNsYXNzIHRvIGJpbmQgdG8gaXQuIFNwZWNpZmljYWxseSBpdCdzIHJlcXVpcmVkIHRvIGFsbG93IGFzc2V0cyB0byBhZGRcbiAgLy8gICogbWV0YWRhdGEgZm9yIHRvb2xpbmcgbGlrZSBTQU0gQ0xJIHRvIGJlIGFibGUgdG8gZmluZCB0aGVpciBvcmlnaW5zLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIGJpbmRUb1Jlc291cmNlKFxuICAvLyAgIF9yZXNvdXJjZTogSUF3c0NvbnN0cnVjdCxcbiAgLy8gICBfb3B0aW9ucz86IFJlc291cmNlQmluZE9wdGlvbnMsXG4gIC8vICkge1xuICAvLyAgIHJldHVybjtcbiAgLy8gfVxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBiaW5kaW5nIGBDb2RlYCBpbnRvIGEgYEZ1bmN0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29kZSBpbiBTMyAobXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGlubGluZUNvZGVgIGFuZCBgaW1hZ2VgKS5cbiAgICogQGRlZmF1bHQgLSBjb2RlIGlzIG5vdCBhbiBzMyBsb2NhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgczNMb2NhdGlvbj86IHN0b3JhZ2UuUzNMb2NhdGlvbjtcblxuICAvKipcbiAgICogSW5saW5lIGNvZGUgKG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBzM0xvY2F0aW9uYCBhbmQgYGltYWdlYCkuXG4gICAqIEBkZWZhdWx0IC0gY29kZSBpcyBub3QgaW5saW5lIGNvZGVcbiAgICovXG4gIHJlYWRvbmx5IGlubGluZUNvZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBjb25maWd1cmF0aW9uIChtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgczNMb2NhdGlvbmAgYW5kIGBpbmxpbmVDb2RlYCkuXG4gICAqIEBkZWZhdWx0IC0gY29kZSBpcyBub3QgYW4gRUNSIGNvbnRhaW5lciBpbWFnZVxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2U/OiBDb2RlSW1hZ2VDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBoYW5kbGVyIGNvZGUuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIEFtYXpvbiBTMyBtYW5hZ2VkIGtleXMoU1NFLVMzKSBrZXkgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlS01TS2V5QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGhhc2ggb2YgdGhlIHNvdXJjZSBjb2RlLCB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29kZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUNvZGVIYXNoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB0aGUgYmluZCB3aGVuIGFuIEVDUiBpbWFnZSBpcyB1c2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbWFnZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBVUkkgdG8gdGhlIERvY2tlciBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlVXJpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIENNRCBvbiB0aGUgc3BlY2lmaWVkIERvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKiBUaGlzIG5lZWRzIHRvIGJlIGluIHRoZSAnZXhlYyBmb3JtJywgdml6LiwgYFsgJ2V4ZWN1dGFibGUnLCAncGFyYW0xJywgJ3BhcmFtMicgXWAuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9idWlsZGVyLyNjbWRcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIENNRCBzcGVjaWZpZWQgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgY21kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIEVOVFJZUE9JTlQgb24gdGhlIHNwZWNpZmllZCBEb2NrZXIgaW1hZ2Ugb3IgRG9ja2VyZmlsZS5cbiAgICogQW4gRU5UUllQT0lOVCBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSBhIGNvbnRhaW5lciB0aGF0IHdpbGwgcnVuIGFzIGFuIGV4ZWN1dGFibGUuXG4gICAqIFRoaXMgbmVlZHMgdG8gYmUgaW4gdGhlICdleGVjIGZvcm0nLCB2aXouLCBgWyAnZXhlY3V0YWJsZScsICdwYXJhbTEnLCAncGFyYW0yJyBdYC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI2VudHJ5cG9pbnRcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIEVOVFJZUE9JTlQgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG9yIG92ZXJyaWRlIHRoZSBXT1JLRElSIG9uIHRoZSBzcGVjaWZpZWQgRG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqIEEgV09SS0RJUiBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgdGhlIGNvbnRhaW5lciB3aWxsIHVzZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI3dvcmtkaXJcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIFdPUktESVIgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMYW1iZGEgY29kZSBmcm9tIGFuIFMzIGFyY2hpdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTM0NvZGUgZXh0ZW5kcyBDb2RlIHtcbiAgcHVibGljIHJlYWRvbmx5IGlzSW5saW5lID0gZmFsc2U7XG4gIHByaXZhdGUgYnVja2V0TmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0LFxuICAgIHByaXZhdGUga2V5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBvYmplY3RWZXJzaW9uPzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKCFidWNrZXQuYnVja2V0TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJidWNrZXROYW1lIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHByb3ZpZGVkIGJ1Y2tldFwiLFxuICAgICAgICBidWNrZXQsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYnVja2V0TmFtZSA9IGJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgczNMb2NhdGlvbjoge1xuICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5rZXksXG4gICAgICAgIG9iamVjdFZlcnNpb246IHRoaXMub2JqZWN0VmVyc2lvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIExhbWJkYSBjb2RlIGZyb20gYW4gUzMgYXJjaGl2ZS4gV2l0aCBvcHRpb24gdG8gc2V0IEtNU0tleSBmb3IgZW5jcnlwdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzQ29kZVYyIGV4dGVuZHMgQ29kZSB7XG4gIHB1YmxpYyByZWFkb25seSBpc0lubGluZSA9IGZhbHNlO1xuICBwcml2YXRlIGJ1Y2tldE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWNrZXQ6IHN0b3JhZ2UuSUJ1Y2tldCxcbiAgICBwcml2YXRlIGtleTogc3RyaW5nLFxuICAgIHByaXZhdGUgb3B0aW9ucz86IEJ1Y2tldE9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCFidWNrZXQuYnVja2V0TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJidWNrZXROYW1lIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHByb3ZpZGVkIGJ1Y2tldFwiLFxuICAgICAgICBidWNrZXQsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYnVja2V0TmFtZSA9IGJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgczNMb2NhdGlvbjoge1xuICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5rZXksXG4gICAgICAgIG9iamVjdFZlcnNpb246IHRoaXMub3B0aW9ucz8ub2JqZWN0VmVyc2lvbixcbiAgICAgIH0sXG4gICAgICBzb3VyY2VLTVNLZXlBcm46IHRoaXMub3B0aW9ucz8uc291cmNlS01TS2V5Py5rZXlBcm4sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGlubGluZSBjb2RlIGJhc2VkIG9uIHRoZSBydW50aW1lIGZhbWlseVxuICovXG5mdW5jdGlvbiBnZXRJbmxpbmVDb2RlRmlsZUV4dGVuc2lvbihydW50aW1lPzogUnVudGltZSk6IHN0cmluZyB7XG4gIGlmICghcnVudGltZSkge1xuICAgIC8vIERlZmF1bHQgdG8gLmpzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHJldHVybiBcIi5qc1wiO1xuICB9XG5cbiAgc3dpdGNoIChydW50aW1lLmZhbWlseSkge1xuICAgIGNhc2UgUnVudGltZUZhbWlseS5OT0RFSlM6XG4gICAgICByZXR1cm4gXCIuanNcIjtcbiAgICBjYXNlIFJ1bnRpbWVGYW1pbHkuUFlUSE9OOlxuICAgICAgcmV0dXJuIFwiLnB5XCI7XG4gICAgY2FzZSBSdW50aW1lRmFtaWx5LkpBVkE6XG4gICAgICByZXR1cm4gXCIuamF2YVwiO1xuICAgIGNhc2UgUnVudGltZUZhbWlseS5ET1RORVRfQ09SRTpcbiAgICAgIHJldHVybiBcIi5jc1wiO1xuICAgIGNhc2UgUnVudGltZUZhbWlseS5HTzpcbiAgICAgIHJldHVybiBcIi5nb1wiO1xuICAgIGNhc2UgUnVudGltZUZhbWlseS5SVUJZOlxuICAgICAgcmV0dXJuIFwiLnJiXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIERlZmF1bHQgdG8gLmpzIGZvciB1bmtub3duIHJ1bnRpbWVzXG4gICAgICByZXR1cm4gXCIuanNcIjtcbiAgfVxufVxuXG4vKipcbiAqIExhbWJkYSBjb2RlIGZyb20gYW4gaW5saW5lIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIElubGluZUNvZGUgZXh0ZW5kcyBDb2RlIHtcbiAgcHVibGljIHJlYWRvbmx5IGlzSW5saW5lID0gdHJ1ZTtcbiAgcHJpdmF0ZSBkYXRhQXJjaGl2ZT86IGRhdGFBcmNoaXZlRmlsZS5EYXRhQXJjaGl2ZUZpbGU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb2RlOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKGNvZGUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXCJMYW1iZGEgaW5saW5lIGNvZGUgY2Fubm90IGJlIGVtcHR5XCIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnIHtcbiAgICB0aGlzLmVuc3VyZURhdGFBcmNoaXZlKHNjb3BlKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5saW5lQ29kZTogdGhpcy5kYXRhQXJjaGl2ZSEub3V0cHV0UGF0aCxcbiAgICAgIHNvdXJjZUNvZGVIYXNoOiB0aGlzLmRhdGFBcmNoaXZlIS5vdXRwdXRCYXNlNjRTaGEyNTYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVZ2x5IGhhY2sgdG8gc3VwcG9ydCBpbmxpbmUgY29kZSB3aXRoIFRlcnJhZm9ybS5cbiAgICpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2lzc3Vlcy85Nzc0I2lzc3VlY29tbWVudC02NjkzNTY3ODZcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZURhdGFBcmNoaXZlKHNjb3BlOiBDb25zdHJ1Y3QpIHtcbiAgICBpZiAodGhpcy5kYXRhQXJjaGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXQgdGhlIHByb3ZpZGVyIHNpbmdsZXRvblxuICAgIGNvbnN0IHByb3ZpZGVyID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpLmFyY2hpdmVQcm92aWRlcjtcbiAgICAvLyBlbnN1cmUgdGhlIGNvZGUgaXMgaGFzaGVkIGZvciBjb25zaXN0ZW5jeVxuICAgIGNvbnN0IGlkID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpLnVuaXF1ZVJlc291cmNlTmFtZShcbiAgICAgIG5ldyBjZGt0Zi5UZXJyYWZvcm1FbGVtZW50KHNjb3BlLCBtZDVoYXNoKHRoaXMuY29kZSkpLFxuICAgICAge1xuICAgICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IFwiLV9cIixcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyBjb25zdCBpZCA9IG1kNWhhc2godGhpcy5jb2RlKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHNjb3BlLm5vZGUudHJ5RmluZENoaWxkKGlkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHRoaXMuZGF0YUFyY2hpdmUgPSBleGlzdGluZyBhcyBkYXRhQXJjaGl2ZUZpbGUuRGF0YUFyY2hpdmVGaWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIGZpbGUgZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBydW50aW1lXG4gICAgICAvLyBUaGUgc2NvcGUgc2hvdWxkIGJlIGEgTGFtYmRhRnVuY3Rpb24gd2hlbiBiaW5kIGlzIGNhbGxlZFxuICAgICAgbGV0IHJ1bnRpbWU6IFJ1bnRpbWUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoXCJydW50aW1lXCIgaW4gc2NvcGUgJiYgc2NvcGUucnVudGltZSBpbnN0YW5jZW9mIFJ1bnRpbWUpIHtcbiAgICAgICAgcnVudGltZSA9IHNjb3BlLnJ1bnRpbWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBnZXRJbmxpbmVDb2RlRmlsZUV4dGVuc2lvbihydW50aW1lKTtcblxuICAgICAgdGhpcy5kYXRhQXJjaGl2ZSA9IG5ldyBkYXRhQXJjaGl2ZUZpbGUuRGF0YUFyY2hpdmVGaWxlKHNjb3BlLCBpZCwge1xuICAgICAgICBvdXRwdXRQYXRoOiBwYXRodEpvaW4oXG4gICAgICAgICAgY2RrdGYuVG9rZW4uYXNTdHJpbmcoY2RrdGYucmVmKFwicGF0aC5yb290XCIpKSxcbiAgICAgICAgICBcIi5hcmNoaXZlX2ZpbGVzXCIsXG4gICAgICAgICAgYCR7aWR9LnppcGAsXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IFwiemlwXCIsXG4gICAgICAgIHNvdXJjZUNvbnRlbnQ6IHRoaXMuY29kZSxcbiAgICAgICAgc291cmNlQ29udGVudEZpbGVuYW1lOiBgaW5kZXgke2V4dGVuc2lvbn1gLFxuICAgICAgICBwcm92aWRlcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIExhbWJkYSBjb2RlIGZyb20gYSBsb2NhbCBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3NldENvZGUgZXh0ZW5kcyBDb2RlIHtcbiAgcHVibGljIHJlYWRvbmx5IGlzSW5saW5lID0gZmFsc2U7XG4gIHByaXZhdGUgYXNzZXQ/OiBzM19hc3NldHMuQXNzZXQ7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBhc3NldCBmaWxlIG9yIGRpcmVjdG9yeS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBzM19hc3NldHMuQXNzZXRPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0KTogQ29kZUNvbmZpZyB7XG4gICAgLy8gSWYgdGhlIHNhbWUgQXNzZXRDb2RlIGlzIHVzZWQgbXVsdGlwbGUgdGltZXMsIHJldGFpbiBvbmx5IHRoZSBmaXJzdCBpbnN0YW50aWF0aW9uLlxuICAgIGlmICghdGhpcy5hc3NldCkge1xuICAgICAgdGhpcy5hc3NldCA9IG5ldyBzM19hc3NldHMuQXNzZXQoc2NvcGUsIFwiQ29kZVwiLCB7XG4gICAgICAgIHBhdGg6IHRoaXMucGF0aCxcbiAgICAgICAgZGVwbG95VGltZTogdHJ1ZSxcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHRoaXMuYXNzZXQpICE9PSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBBc3NldCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIHN0YWNrICcke0F3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHRoaXMuYXNzZXQpLmdyaWRVVUlEfScuIGAgK1xuICAgICAgICAgIFwiQ3JlYXRlIGEgbmV3IENvZGUgaW5zdGFuY2UgZm9yIGV2ZXJ5IHN0YWNrLlwiLFxuICAgICAgICBzY29wZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFzc2V0LmlzWmlwQXJjaGl2ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYEFzc2V0IG11c3QgYmUgYSAuemlwIGZpbGUgb3IgYSBkaXJlY3RvcnkgKCR7dGhpcy5wYXRofSlgLFxuICAgICAgICBzY29wZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHMzTG9jYXRpb246IHtcbiAgICAgICAgYnVja2V0TmFtZTogdGhpcy5hc3NldC5zM0J1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5hc3NldC5zM09iamVjdEtleSxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VLTVNLZXlBcm46IHRoaXMub3B0aW9ucy5zb3VyY2VLTVNLZXk/LmtleUFybixcbiAgICB9O1xuICB9XG5cbiAgLy8gcHVibGljIGJpbmRUb1Jlc291cmNlKFxuICAvLyAgIHJlc291cmNlOiBJQXdzQ29uc3RydWN0LFxuICAvLyAgIG9wdGlvbnM6IFJlc291cmNlQmluZE9wdGlvbnMgPSB7fSxcbiAgLy8gKSB7XG4gIC8vICAgaWYgKCF0aGlzLmFzc2V0KSB7XG4gIC8vICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAvLyAgICAgICBcImJpbmRUb1Jlc291cmNlKCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYmluZCgpXCIsXG4gIC8vICAgICAgIHJlc291cmNlLFxuICAvLyAgICAgKTtcbiAgLy8gICB9XG5cbiAgLy8gICBjb25zdCByZXNvdXJjZVByb3BlcnR5ID0gb3B0aW9ucy5yZXNvdXJjZVByb3BlcnR5IHx8IFwiQ29kZVwiO1xuICAvLyAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTQzMlxuICAvLyAgIHRoaXMuYXNzZXQuYWRkUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZSwgcmVzb3VyY2VQcm9wZXJ0eSk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUJpbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBhbm5vdGF0ZSB3aXRoIGFzc2V0IG1ldGFkYXRhLlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTQzMlxuICAgKiBAZGVmYXVsdCBDb2RlXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZVByb3BlcnR5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdGlvbiBwcm9wZXJ0aWVzIGZvciBgVGVycmFmb3JtVmFyaWFibGVzQ29kZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVycmFmb3JtVmFyaWFibGVzQ29kZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBUZXJyYWZvcm0gdmFyaWFibGUgdGhhdCByZXByZXNlbnRzIHRoZSBuYW1lIG9mIHRoZSBTMyBCdWNrZXRcbiAgICogd2hlcmUgdGhlIExhbWJkYSBjb2RlIHdpbGwgYmUgbG9jYXRlZCBpbi5cbiAgICogTXVzdCBiZSBvZiB0eXBlICdTdHJpbmcnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhIG5ldyB2YXJpYWJsZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWVWYXI/OiBjZGt0Zi5UZXJyYWZvcm1WYXJpYWJsZTtcblxuICAvKipcbiAgICogVGhlIFRlcnJhZm9ybSB2YXJpYWJsZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGggaW5zaWRlIHRoZSBTMyBCdWNrZXRcbiAgICogd2hlcmUgdGhlIExhbWJkYSBjb2RlIHdpbGwgYmUgbG9jYXRlZCBhdC5cbiAgICogTXVzdCBiZSBvZiB0eXBlICdTdHJpbmcnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhIG5ldyB2YXJpYWJsZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG9iamVjdEtleVZhcj86IGNka3RmLlRlcnJhZm9ybVZhcmlhYmxlO1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgS01TIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIGhhbmRsZXIgY29kZS5cbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggQW1hem9uIFMzIG1hbmFnZWQga2V5cyhTU0UtUzMpIGtleSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VLTVNLZXk/OiBJS2V5O1xufVxuXG4vKipcbiAqIExhbWJkYSBjb2RlIGRlZmluZWQgdXNpbmcgMiBUZXJyYWZvcm0gdmFyaWFibGVzLlxuICogVXNlZnVsIHdoZW4geW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBjb2RlIG9mIHlvdXIgTGFtYmRhIGZyb20geW91ciBDREsgY29kZSwgc28geW91IGNhbid0IHVzZSBBc3NldHMsXG4gKiBhbmQgeW91IHdhbnQgdG8gZGVwbG95IHRoZSBMYW1iZGEgaW4gYSBwaXBlbGluZSwgZHVyaW5nIFRlcnJhZm9ybSBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlIGV4dGVuZHMgQ29kZSB7XG4gIHB1YmxpYyByZWFkb25seSBpc0lubGluZSA9IGZhbHNlO1xuICBwcml2YXRlIF9idWNrZXROYW1lVmFyPzogY2RrdGYuVGVycmFmb3JtVmFyaWFibGU7XG4gIHByaXZhdGUgX29iamVjdEtleVZhcj86IGNka3RmLlRlcnJhZm9ybVZhcmlhYmxlO1xuICBwcml2YXRlIF9zb3VyY2VLTVNLZXk/OiBJS2V5O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9idWNrZXROYW1lVmFyID0gcHJvcHMuYnVja2V0TmFtZVZhcjtcbiAgICB0aGlzLl9vYmplY3RLZXlWYXIgPSBwcm9wcy5vYmplY3RLZXlWYXI7XG4gICAgdGhpcy5fc291cmNlS01TS2V5ID0gcHJvcHMuc291cmNlS01TS2V5O1xuICB9XG5cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCk6IENvZGVDb25maWcge1xuICAgIGlmICghdGhpcy5fYnVja2V0TmFtZVZhcikge1xuICAgICAgdGhpcy5fYnVja2V0TmFtZVZhciA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1WYXJpYWJsZShcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIFwiTGFtYmRhU291cmNlQnVja2V0TmFtZVBhcmFtZXRlclwiLFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9vYmplY3RLZXlWYXIpIHtcbiAgICAgIHRoaXMuX29iamVjdEtleVZhciA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1WYXJpYWJsZShcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIFwiTGFtYmRhU291cmNlT2JqZWN0S2V5UGFyYW1ldGVyXCIsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgczNMb2NhdGlvbjoge1xuICAgICAgICBidWNrZXROYW1lOiB0aGlzLl9idWNrZXROYW1lVmFyLnN0cmluZ1ZhbHVlLFxuICAgICAgICBvYmplY3RLZXk6IHRoaXMuX29iamVjdEtleVZhci5zdHJpbmdWYWx1ZSxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VLTVNLZXlBcm46IHRoaXMuX3NvdXJjZUtNU0tleT8ua2V5QXJuLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcGFyYW1ldGVycyBtYXAgZnJvbSB0aGlzIGluc3RhbmNlJ3MgVGVycmFmb3JtIHZhcmlhYmxlcy5cbiAgICpcbiAgICogSXQgcmV0dXJucyBhIG1hcCB3aXRoIDIga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gdGhpcyBMYW1iZGEgY29kZSxcbiAgICogYW5kIGFzIHZhbHVlcyBpdCBjb250YWlucyB0aGUgYXBwcm9wcmlhdGUgZXhwcmVzc2lvbnMgcG9pbnRpbmcgYXQgdGhlIHByb3ZpZGVkIFMzIGxvY2F0aW9uXG4gICAqIChtb3N0IGxpa2VseSwgb2J0YWluZWQgZnJvbSBhIENvZGVQaXBlbGluZSBBcnRpZmFjdCBieSBjYWxsaW5nIHRoZSBgYXJ0aWZhY3QuczNMb2NhdGlvbmAgbWV0aG9kKS5cbiAgICogVGhlIHJlc3VsdCBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIENsb3VkRm9ybWF0aW9uIEFjdGlvblxuICAgKiB0aGF0IGlzIGRlcGxveWluZyB0aGUgU3RhY2sgdGhhdCB0aGUgTGFtYmRhIHdpdGggdGhpcyBjb2RlIGlzIHBhcnQgb2YsXG4gICAqIGluIHRoZSBgcGFyYW1ldGVyT3ZlcnJpZGVzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgb2JqZWN0IGluIFMzIHRoYXQgcmVwcmVzZW50cyB0aGUgTGFtYmRhIGNvZGVcbiAgICovXG4gIHB1YmxpYyBhc3NpZ24obG9jYXRpb246IHN0b3JhZ2UuUzNMb2NhdGlvbik6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCByZXQ6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgcmV0W3RoaXMuYnVja2V0TmFtZVZhcl0gPSBsb2NhdGlvbi5idWNrZXROYW1lO1xuICAgIHJldFt0aGlzLm9iamVjdEtleVZhcl0gPSBsb2NhdGlvbi5vYmplY3RLZXk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYnVja2V0TmFtZVZhcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9idWNrZXROYW1lVmFyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYnVja2V0TmFtZVZhci5mcW47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJQYXNzIFRlcnJhZm9ybVZhcmlhYmxlc0NvZGUgdG8gYSBMYW1iZGEgRnVuY3Rpb24gYmVmb3JlIGFjY2Vzc2luZyB0aGUgYnVja2V0TmFtZVZhciBwcm9wZXJ0eVwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdEtleVZhcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9vYmplY3RLZXlWYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmplY3RLZXlWYXIuZnFuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiUGFzcyBUZXJyYWZvcm1WYXJpYWJsZXNDb2RlIHRvIGEgTGFtYmRhIEZ1bmN0aW9uIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIG9iamVjdEtleVZhciBwcm9wZXJ0eVwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgYSBuZXcgRWNySW1hZ2VDb2RlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNySW1hZ2VDb2RlUHJvcHMge1xuICAvKipcbiAgICogU3BlY2lmeSBvciBvdmVycmlkZSB0aGUgQ01EIG9uIHRoZSBzcGVjaWZpZWQgRG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqIFRoaXMgbmVlZHMgdG8gYmUgaW4gdGhlICdleGVjIGZvcm0nLCB2aXouLCBgWyAnZXhlY3V0YWJsZScsICdwYXJhbTEnLCAncGFyYW0yJyBdYC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI2NtZFxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgQ01EIHNwZWNpZmllZCBpbiB0aGUgZG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqL1xuICByZWFkb25seSBjbWQ/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmeSBvciBvdmVycmlkZSB0aGUgRU5UUllQT0lOVCBvbiB0aGUgc3BlY2lmaWVkIERvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKiBBbiBFTlRSWVBPSU5UIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIGEgY29udGFpbmVyIHRoYXQgd2lsbCBydW4gYXMgYW4gZXhlY3V0YWJsZS5cbiAgICogVGhpcyBuZWVkcyB0byBiZSBpbiB0aGUgJ2V4ZWMgZm9ybScsIHZpei4sIGBbICdleGVjdXRhYmxlJywgJ3BhcmFtMScsICdwYXJhbTInIF1gLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvYnVpbGRlci8jZW50cnlwb2ludFxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgRU5UUllQT0lOVCBpbiB0aGUgZG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIFdPUktESVIgb24gdGhlIHNwZWNpZmllZCBEb2NrZXIgaW1hZ2Ugb3IgRG9ja2VyZmlsZS5cbiAgICogQSBXT1JLRElSIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0aGUgY29udGFpbmVyIHdpbGwgdXNlLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvYnVpbGRlci8jd29ya2RpclxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgV09SS0RJUiBpbiB0aGUgZG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgdGFnIHRvIHVzZSB3aGVuIHB1bGxpbmcgdGhlIGltYWdlIGZyb20gRUNSLlxuICAgKiBAZGVmYXVsdCAnbGF0ZXN0J1xuICAgKiBAZGVwcmVjYXRlZCB1c2UgYHRhZ09yRGlnZXN0YFxuICAgKi9cbiAgcmVhZG9ubHkgdGFnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgdGFnIG9yIGRpZ2VzdCB0byB1c2Ugd2hlbiBwdWxsaW5nIHRoZSBpbWFnZSBmcm9tIEVDUiAoZGlnZXN0cyBtdXN0IHN0YXJ0IHdpdGggYHNoYTI1NjpgKS5cbiAgICogQGRlZmF1bHQgJ2xhdGVzdCdcbiAgICovXG4gIHJlYWRvbmx5IHRhZ09yRGlnZXN0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBEb2NrZXIgaW1hZ2UgaW4gRUNSIHRoYXQgY2FuIGJlIGJvdW5kIGFzIExhbWJkYSBDb2RlLlxuICovXG5leHBvcnQgY2xhc3MgRWNySW1hZ2VDb2RlIGV4dGVuZHMgQ29kZSB7XG4gIHB1YmxpYyByZWFkb25seSBpc0lubGluZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVwb3NpdG9yeTogc3RvcmFnZS5JUmVwb3NpdG9yeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBFY3JJbWFnZUNvZGVQcm9wcyA9IHt9LFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDb2RlQ29uZmlnIHtcbiAgICB0aGlzLnJlcG9zaXRvcnkuZ3JhbnRQdWxsKG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImxhbWJkYS5hbWF6b25hd3MuY29tXCIpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbWFnZToge1xuICAgICAgICBpbWFnZVVyaTogdGhpcy5yZXBvc2l0b3J5LnJlcG9zaXRvcnlVcmlGb3JUYWdPckRpZ2VzdChcbiAgICAgICAgICB0aGlzLnByb3BzPy50YWdPckRpZ2VzdCA/PyB0aGlzLnByb3BzPy50YWcgPz8gXCJsYXRlc3RcIixcbiAgICAgICAgKSxcbiAgICAgICAgY21kOiB0aGlzLnByb3BzLmNtZCxcbiAgICAgICAgZW50cnlwb2ludDogdGhpcy5wcm9wcy5lbnRyeXBvaW50LFxuICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiB0aGlzLnByb3BzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgYSBuZXcgQXNzZXRJbWFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SW1hZ2VDb2RlUHJvcHNcbiAgZXh0ZW5kcyBlY3JfYXNzZXRzLkRvY2tlckltYWdlQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIENNRCBvbiB0aGUgc3BlY2lmaWVkIERvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKiBUaGlzIG5lZWRzIHRvIGJlIGluIHRoZSAnZXhlYyBmb3JtJywgdml6LiwgYFsgJ2V4ZWN1dGFibGUnLCAncGFyYW0xJywgJ3BhcmFtMicgXWAuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9idWlsZGVyLyNjbWRcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIENNRCBzcGVjaWZpZWQgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgY21kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgb3Igb3ZlcnJpZGUgdGhlIEVOVFJZUE9JTlQgb24gdGhlIHNwZWNpZmllZCBEb2NrZXIgaW1hZ2Ugb3IgRG9ja2VyZmlsZS5cbiAgICogQW4gRU5UUllQT0lOVCBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSBhIGNvbnRhaW5lciB0aGF0IHdpbGwgcnVuIGFzIGFuIGV4ZWN1dGFibGUuXG4gICAqIFRoaXMgbmVlZHMgdG8gYmUgaW4gdGhlICdleGVjIGZvcm0nLCB2aXouLCBgWyAnZXhlY3V0YWJsZScsICdwYXJhbTEnLCAncGFyYW0yJyBdYC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI2VudHJ5cG9pbnRcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIEVOVFJZUE9JTlQgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG9yIG92ZXJyaWRlIHRoZSBXT1JLRElSIG9uIHRoZSBzcGVjaWZpZWQgRG9ja2VyIGltYWdlIG9yIERvY2tlcmZpbGUuXG4gICAqIEEgV09SS0RJUiBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgdGhlIGNvbnRhaW5lciB3aWxsIHVzZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI3dvcmtkaXJcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIFdPUktESVIgaW4gdGhlIGRvY2tlciBpbWFnZSBvciBEb2NrZXJmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEVDUiBpbWFnZSB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGFzc2V0IGFuZCBjYW4gYmUgYm91bmQgYXMgTGFtYmRhIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3NldEltYWdlQ29kZSBleHRlbmRzIENvZGUge1xuICBwdWJsaWMgcmVhZG9ubHkgaXNJbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBhc3NldD86IGVjcl9hc3NldHMuRG9ja2VySW1hZ2VBc3NldDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFzc2V0SW1hZ2VDb2RlUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0KTogQ29kZUNvbmZpZyB7XG4gICAgLy8gSWYgdGhlIHNhbWUgQXNzZXRJbWFnZUNvZGUgaXMgdXNlZCBtdWx0aXBsZSB0aW1lcywgcmV0YWluIG9ubHkgdGhlIGZpcnN0IGluc3RhbnRpYXRpb24uXG4gICAgaWYgKCF0aGlzLmFzc2V0KSB7XG4gICAgICB0aGlzLmFzc2V0ID0gbmV3IGVjcl9hc3NldHMuRG9ja2VySW1hZ2VBc3NldChzY29wZSwgXCJBc3NldEltYWdlXCIsIHtcbiAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgLi4udGhpcy5wcm9wcyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hc3NldC5yZXBvc2l0b3J5LmdyYW50UHVsbChcbiAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwibGFtYmRhLmFtYXpvbmF3cy5jb21cIiksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdCh0aGlzLmFzc2V0KSAhPT0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgQXNzZXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBzdGFjayAnJHtBd3NTdGFjay5vZkF3c0NvbnN0cnVjdCh0aGlzLmFzc2V0KS5ncmlkVVVJRH0nLiBgICtcbiAgICAgICAgICBcIkNyZWF0ZSBhIG5ldyBDb2RlIGluc3RhbmNlIGZvciBldmVyeSBzdGFjay5cIixcbiAgICAgICAgc2NvcGUsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbWFnZToge1xuICAgICAgICBpbWFnZVVyaTogdGhpcy5hc3NldC5pbWFnZVVyaSxcbiAgICAgICAgZW50cnlwb2ludDogdGhpcy5wcm9wcy5lbnRyeXBvaW50LFxuICAgICAgICBjbWQ6IHRoaXMucHJvcHMuY21kLFxuICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiB0aGlzLnByb3BzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyAvLyBUT0RPOiBwZW5kaW5nIGN1c3RvbSBDTEkgdG8gbW9jayBMYW1iZGEgZnVuY3Rpb24gaW52b2NhdGlvbnMgbG9jYWxseVxuICAvLyBwdWJsaWMgYmluZFRvUmVzb3VyY2UoXG4gIC8vICAgcmVzb3VyY2U6IElBd3NDb25zdHJ1Y3QsXG4gIC8vICAgb3B0aW9uczogUmVzb3VyY2VCaW5kT3B0aW9ucyA9IHt9LFxuICAvLyApIHtcbiAgLy8gICBpZiAoIXRoaXMuYXNzZXQpIHtcbiAgLy8gICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJiaW5kVG9SZXNvdXJjZSgpIG11c3QgYmUgY2FsbGVkIGFmdGVyIGJpbmQoKVwiLCByZXNvdXJjZSk7XG4gIC8vICAgfVxuXG4gIC8vICAgLy8gY29uc3QgcmVzb3VyY2VQcm9wZXJ0eSA9IF9vcHRpb25zLnJlc291cmNlUHJvcGVydHkgfHwgXCJDb2RlLkltYWdlVXJpXCI7XG5cbiAgLy8gICAvLyAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE0NTkzXG4gIC8vICAgLy8gdGhpcy5hc3NldC5hZGRSZXNvdXJjZU1ldGFkYXRhKF9yZXNvdXJjZSwgcmVzb3VyY2VQcm9wZXJ0eSk7XG4gIC8vIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIHdoZW4gY3JlYXRpbmcgYW4gYXNzZXQgZnJvbSBhIERvY2tlciBidWlsZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJCdWlsZEFzc2V0T3B0aW9ucyBleHRlbmRzIERvY2tlckJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBpbiB0aGUgRG9ja2VyIGltYWdlIHdoZXJlIHRoZSBhc3NldCBpcyBsb2NhdGVkIGFmdGVyIHRoZSBidWlsZFxuICAgKiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC9hc3NldFxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvbiB0aGUgbG9jYWwgZmlsZXN5c3RlbSB3aGVyZSB0aGUgYXNzZXQgd2lsbCBiZSBjb3BpZWRcbiAgICogdXNpbmcgYGRvY2tlciBjcGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSB1bmlxdWUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB0aGUgc3lzdGVtIHRlbXAgZGlyZWN0b3J5XG4gICAqL1xuICByZWFkb25seSBvdXRwdXRQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGBBc3NldENvZGVgIHdpdGggYSBjdXN0b20gY29tbWFuZCwgc3VjaCBhcyBydW5uaW5nIGEgYnVpbGRmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUNvbW1hbmRPcHRpb25zIGV4dGVuZHMgczNfYXNzZXRzLkFzc2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgc3Bhd25lZCBwcm9jZXNzLCB3aGljaCBkZXRlcm1pbmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgc3Bhd25lZCBwcm9jZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdDogc2VlIGBjaGlsZF9wcm9jZXNzLlNwYXduU3luY09wdGlvbnNgIChodHRwczovL25vZGVqcy5vcmcvYXBpL2NoaWxkX3Byb2Nlc3MuaHRtbCNjaGlsZF9wcm9jZXNzc3Bhd25zeW5jY29tbWFuZC1hcmdzLW9wdGlvbnMpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZE9wdGlvbnM/OiB7IFtvcHRpb25zOiBzdHJpbmddOiBhbnkgfTtcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBjcmVhdGluZyBjb2RlIHVzaW5nIGJ1Y2tldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldE9wdGlvbnMge1xuICAvKipcbiAgICogT3B0aW9uYWwgUzMgb2JqZWN0IHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG9iamVjdFZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBLTVMga2V5IHVzZWQgdG8gZW5jcnlwdCB0aGUgaGFuZGxlciBjb2RlLlxuICAgKiBAZGVmYXVsdCAtIHRoZSBkZWZhdWx0IHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBBbWF6b24gUzMgbWFuYWdlZCBrZXlzKFNTRS1TMykga2V5IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUtNU0tleT86IElLZXk7XG59XG4iXX0=
@@ -300,7 +300,7 @@ class Condition {
300
300
  }
301
301
  exports.Condition = Condition;
302
302
  _a = JSII_RTTI_SYMBOL_1;
303
- Condition[_a] = { fqn: "terraconstructs.aws.compute.Condition", version: "0.1.7" };
303
+ Condition[_a] = { fqn: "terraconstructs.aws.compute.Condition", version: "0.1.9" };
304
304
  /**
305
305
  * Comparison Operator types
306
306
  */
@@ -178,7 +178,7 @@ class Connections {
178
178
  }
179
179
  exports.Connections = Connections;
180
180
  _a = JSII_RTTI_SYMBOL_1;
181
- Connections[_a] = { fqn: "terraconstructs.aws.compute.Connections", version: "0.1.7" };
181
+ Connections[_a] = { fqn: "terraconstructs.aws.compute.Connections", version: "0.1.9" };
182
182
  class ReactiveList {
183
183
  constructor() {
184
184
  this.elements = new Array();
@@ -10,7 +10,7 @@ class Cors {
10
10
  }
11
11
  exports.Cors = Cors;
12
12
  _a = JSII_RTTI_SYMBOL_1;
13
- Cors[_a] = { fqn: "terraconstructs.aws.compute.Cors", version: "0.1.7" };
13
+ Cors[_a] = { fqn: "terraconstructs.aws.compute.Cors", version: "0.1.9" };
14
14
  /**
15
15
  * All HTTP methods.
16
16
  */
@@ -153,5 +153,5 @@ class Deployment extends aws_construct_1.AwsConstructBase {
153
153
  }
154
154
  exports.Deployment = Deployment;
155
155
  _a = JSII_RTTI_SYMBOL_1;
156
- Deployment[_a] = { fqn: "terraconstructs.aws.compute.Deployment", version: "0.1.7" };
156
+ Deployment[_a] = { fqn: "terraconstructs.aws.compute.Deployment", version: "0.1.9" };
157
157
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvY29tcHV0ZS9kZXBsb3ltZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBSzZCO0FBQzdCLGlDQUE2QjtBQUc3Qix1Q0FBd0U7QUFDeEUseUNBQXlDO0FBQ3pDLDZEQUFpRDtBQUNqRCxvREFBdUU7QUFxQ3ZFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFhLFVBQVcsU0FBUSxnQ0FBZ0I7SUFhOUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUhULHNCQUFpQixHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7UUFLcEQsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBRXJCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLG1DQUFvQixDQUFDLG9CQUFvQixDQUNyRSxJQUFJLEVBQ0osVUFBVSxFQUNWO1lBQ0UsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUztZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsbUZBQW1GO1lBQ25GLFNBQVMsRUFBRTtnQkFDVCxtQkFBbUIsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLG1CQUFtQixJQUFJLElBQUksRUFBRSxrQkFBa0I7Z0JBQ3JGLEdBQUcsS0FBSyxDQUFDLFNBQVM7YUFDbkI7U0FDRixDQUNGLENBQUM7UUFFRixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FDakMsVUFBVSxFQUNWLFlBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1NBQ3hDLENBQUMsQ0FDSCxDQUFDO1FBRUYsMkVBQTJFO1FBQzNFLGlDQUFpQztRQUNqQyx1REFBdUQ7UUFDdkQsNkJBQTZCO1FBQzdCLFFBQVE7UUFDUixJQUFJO1FBRUosSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBRS9DLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksOEJBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtnQkFDdEUsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUztnQkFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO2dCQUN4QyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztvQkFDNUIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsUUFBUTtvQkFDOUIsQ0FBQyxDQUFDLFNBQVM7YUFDZCxDQUFDLENBQUM7WUFDSCw0RUFBNEU7WUFDNUUsK0VBQStFO1FBQ2pGLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLFlBQVkscUJBQVcsRUFBRSxDQUFDO1lBQ3JDLDBHQUEwRztZQUMxRyxrRkFBa0Y7WUFDakYsS0FBSyxDQUFDLEdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU3QyxvQ0FBb0M7UUFDcEMsSUFBSSxJQUFJLENBQUMsR0FBRyxZQUFZLGlCQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsWUFBWSxxQkFBVyxFQUFFLENBQUM7WUFDbkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO2lCQUM5QixZQUFtRCxDQUFDO1lBQ3ZELGtGQUFrRjtZQUNsRixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELGdFQUFnRTtRQUNoRSxpRkFBaUY7UUFDakYsTUFBTSxRQUFRLEdBQUcsSUFBQSwwQkFBTyxFQUN0QixRQUFRO2FBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDN0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUNaLENBQUM7UUFDRix3RUFBd0U7UUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUVsQyxpRkFBaUY7UUFDakYsNkRBQTZEO1FBQzdELCtCQUErQjtRQUMvQiw2RUFBNkU7UUFDN0UsNEZBQTRGO1FBQzVGLDBCQUEwQjtRQUMxQiw0QkFBNEI7UUFDNUIsbUVBQW1FO1FBQ25FLGtEQUFrRDtRQUNsRCx5QkFBeUI7UUFDekIsY0FBYztRQUNkLDRDQUE0QztRQUM1QyxXQUFXO1FBQ1gsaUJBQWlCO0lBQ25CLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksYUFBYSxDQUFDLElBQVM7UUFDNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQ2IsaUVBQWlFLENBQ2xFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CLENBQUMsTUFBYztRQUN4QywwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLHFFQUFxRTtRQUNyRSxxRUFBcUU7UUFDckUseURBQXlEO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQWlELENBQzlELENBQUM7SUFDSixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU87WUFDTCxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVM7U0FDOUMsQ0FBQztJQUNKLENBQUM7O0FBekpILGdDQTBKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFwaUdhdGV3YXlEZXBsb3ltZW50LFxuICBhcGlHYXRld2F5TWV0aG9kLFxuICBhcGlHYXRld2F5UmVzdEFwaSxcbiAgYXBpR2F0ZXdheVN0YWdlLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgTGF6eSB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IE1ldGhvZCB9IGZyb20gXCIuL21ldGhvZFwiO1xuaW1wb3J0IHsgSVJlc3RBcGksIFJlc3RBcGksIFJlc3RBcGlCYXNlLCBTcGVjUmVzdEFwaSB9IGZyb20gXCIuL3Jlc3RhcGlcIjtcbi8vIGltcG9ydCB7IEZuIH0gZnJvbSBcIi4uLy4uL3RlcnJhLWZ1bmNcIjtcbmltcG9ydCB7IG1kNWhhc2ggfSBmcm9tIFwiLi4vLi4vaGVscGVycy1pbnRlcm5hbFwiO1xuaW1wb3J0IHsgQXdzQ29uc3RydWN0QmFzZSwgQXdzQ29uc3RydWN0UHJvcHMgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRQcm9wcyBleHRlbmRzIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBSZXN0IEFQSSB0byBkZXBsb3kuXG4gICAqL1xuICByZWFkb25seSBhcGk6IElSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwdXJwb3NlIG9mIHRoZSBBUEkgR2F0ZXdheSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8gLy8gVE9ETzogSW1wbGVtZW50IFJlbW92YWxQb2xpY3kuUkVUQUlOIHRocm91Z2ggcmVtb3ZlZCBibG9jayBpbiBUZXJyYWZvcm0uXG4gIC8vIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0vaXNzdWVzLzI3MDM1I2lzc3VlY29tbWVudC0yMzQwMzQ4ODAxXG4gIC8vIC8vIHJlZjogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvcmVzb3VyY2VzL3N5bnRheCNyZW1vdmluZy1yZXNvdXJjZXNcbiAgLy8gLyoqXG4gIC8vICAqIFdoZW4gYW4gQVBJIEdhdGV3YXkgbW9kZWwgaXMgdXBkYXRlZCwgYSBuZXcgZGVwbG95bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY3JlYXRlZC5cbiAgLy8gICogSWYgdGhpcyBpcyB0cnVlLCB0aGUgb2xkIEFQSSBHYXRld2F5IERlcGxveW1lbnQgcmVzb3VyY2Ugd2lsbCBub3QgYmUgZGVsZXRlZC5cbiAgLy8gICogVGhpcyB3aWxsIGFsbG93IG1hbnVhbGx5IHJldmVydGluZyBiYWNrIHRvIGEgcHJldmlvdXMgZGVwbG95bWVudCBpbiBjYXNlIGZvciBleGFtcGxlXG4gIC8vICAqXG4gIC8vICAqIEBkZWZhdWx0IGZhbHNlXG4gIC8vICAqL1xuICAvLyByZWFkb25seSByZXRhaW5EZXBsb3ltZW50cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzdGFnZSB0aGUgQVBJIEdhdGV3YXkgZGVwbG95bWVudCBkZXBsb3lzIHRvLlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCBhbmQgYSBzdGFnZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWUgZG9lcyBub3QgZXhpc3QsXG4gICAqIGEgbmV3IHN0YWdlIHJlc291cmNlIHdpbGwgYmUgY3JlYXRlZCBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzdGFnZSBpcyBjcmVhdGVkIG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlcGxveW1lbnQuXG4gICAqL1xuICByZWFkb25seSBzdGFnZU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBEZXBsb3ltZW50IG9mIGEgUkVTVCBBUEkuXG4gKlxuICogQW4gaW1tdXRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgUmVzdEFwaSByZXNvdXJjZSB0aGF0IGNhbiBiZSBjYWxsZWQgYnkgdXNlcnNcbiAqIHVzaW5nIFN0YWdlcy4gQSBkZXBsb3ltZW50IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgU3RhZ2UgZm9yIGl0IHRvIGJlXG4gKiBjYWxsYWJsZSBvdmVyIHRoZSBJbnRlcm5ldC5cbiAqXG4gKiBOb3JtYWxseSwgeW91IGRvbid0IG5lZWQgdG8gZGVmaW5lIGRlcGxveW1lbnRzIG1hbnVhbGx5LiBUaGUgUmVzdEFwaVxuICogY29uc3RydWN0IG1hbmFnZXMgYSBEZXBsb3ltZW50IHJlc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgbGF0ZXN0IG1vZGVsLiBJdFxuICogY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggYHJlc3RBcGkubGF0ZXN0RGVwbG95bWVudGAgKHVubGVzcyBgZGVwbG95OiBmYWxzZWAgaXNcbiAqIHNldCB3aGVuIGRlZmluaW5nIHRoZSBgUmVzdEFwaWApLlxuICpcbiAqIElmIHlvdSBtYW51YWxseSBkZWZpbmUgdGhpcyByZXNvdXJjZSwgeW91IHdpbGwgbmVlZCB0byBrbm93IHRoYXQgc2luY2VcbiAqIGRlcGxveW1lbnRzIGFyZSBpbW11dGFibGUsIHRoZWlyIHByb3BlcnRpZXMgd2lsbCBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLlxuICogVG8gcmVmbGVjdCBBUEkgbW9kZWwgY2hhbmdlcywgYSBuZXcgZGVwbG95bWVudCBtdXN0IGJlIGNyZWF0ZWQuIFRoaXMgaXMgdHlwaWNhbGx5XG4gKiBhY2hpZXZlZCBieSBjaGFuZ2luZyB0aGUgYHRyaWdnZXJzYCBwcm9wZXJ0eSBvZiB0aGUgYEFwaUdhdGV3YXlEZXBsb3ltZW50YCByZXNvdXJjZS5cbiAqXG4gKiBUaGUgYGFkZFRvVHJpZ2dlcnNgIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhdWdtZW50IHRoZSBzZXQgb2YgdHJpZ2dlcnMgZm9yIHRoaXNcbiAqIGRlcGxveW1lbnQuIFRoaXMgZW5zdXJlcyB0aGF0IGlmIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBBUEkgbW9kZWwgY2hhbmdlIChlLmcuLCBhIE1ldGhvZCdzIGNvbmZpZ3VyYXRpb24pLFxuICogYSBuZXcgZGVwbG95bWVudCBpcyB0cmlnZ2VyZWQuIFRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGZvciB0aGUgYHJlc3RBcGkubGF0ZXN0RGVwbG95bWVudGAgZGVwbG95bWVudC5cbiAqXG4gKiBGdXJ0aGVybW9yZSwgYSBkZXBsb3ltZW50IHNob3VsZCBkZXBlbmQgb24gYWxsIEFQSSBHYXRld2F5IHJlc291cmNlcyAoTWV0aG9kcywgUmVzb3VyY2VzLCBldGMuKVxuICogdGhhdCBkZWZpbmUgdGhlIEFQSS4gVXNlIHRoZSBgX2FkZE1ldGhvZERlcGVuZGVuY3lgIG9yIGRpcmVjdGx5IGFkZCBkZXBlbmRlbmNpZXMgdG8gZW5zdXJlIGNvcnJlY3RcbiAqIHByb3Zpc2lvbmluZyBvcmRlci4gVGhpcyBpcyBhbHNvIGhhbmRsZWQgZm9yIGByZXN0QXBpLmxhdGVzdERlcGxveW1lbnRgLlxuICovXG5leHBvcnQgY2xhc3MgRGVwbG95bWVudCBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgZGVwbG95bWVudElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBhcGk6IElSZXN0QXBpO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHN0YWdlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlcGxveW1lbnQsIGlmIGBzdGFnZU5hbWVgIHdhcyBwcm92aWRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGFnZU5hbWU/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3ltZW50UmVzb3VyY2U6IGFwaUdhdGV3YXlEZXBsb3ltZW50LkFwaUdhdGV3YXlEZXBsb3ltZW50O1xuICBwcml2YXRlIHN0YWdlUmVzb3VyY2U/OiBhcGlHYXRld2F5U3RhZ2UuQXBpR2F0ZXdheVN0YWdlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdHJpZ2dlckNvbXBvbmVudHMgPSBuZXcgQXJyYXk8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEZXBsb3ltZW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuYXBpID0gcHJvcHMuYXBpO1xuXG4gICAgdGhpcy5kZXBsb3ltZW50UmVzb3VyY2UgPSBuZXcgYXBpR2F0ZXdheURlcGxveW1lbnQuQXBpR2F0ZXdheURlcGxveW1lbnQoXG4gICAgICB0aGlzLFxuICAgICAgXCJSZXNvdXJjZVwiLFxuICAgICAge1xuICAgICAgICByZXN0QXBpSWQ6IHByb3BzLmFwaS5yZXN0QXBpSWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgLy8gZW5zdXJlIGxpZmVjeWNsZSBjcmVhdGUgYmVmb3JlIGRlc3Ryb3kgaXMgZW5hYmxlZCB1bmxlc3MgZXhwbGljaXRseSBzZXQgdG8gZmFsc2VcbiAgICAgICAgbGlmZWN5Y2xlOiB7XG4gICAgICAgICAgY3JlYXRlQmVmb3JlRGVzdHJveTogcHJvcHMubGlmZWN5Y2xlPy5jcmVhdGVCZWZvcmVEZXN0cm95ID8/IHRydWUsIC8vIGRlZmF1bHQgdG8gdHJ1ZVxuICAgICAgICAgIC4uLnByb3BzLmxpZmVjeWNsZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFkZCB0cmlnZ2VycyBmb3IgcmVkcGxveW1lbnQgb24gY2hlY2tzdW0gY2hhbmdlcy5cbiAgICB0aGlzLmRlcGxveW1lbnRSZXNvdXJjZS5hZGRPdmVycmlkZShcbiAgICAgIFwidHJpZ2dlcnNcIixcbiAgICAgIExhenkuYW55VmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLmNhbGN1bGF0ZVRyaWdnZXJzKCksXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IFJlbW92YWxQb2xpY3kuUkVUQUlOIHRocm91Z2ggcmVtb3ZlZCBibG9jayBpbiBUZXJyYWZvcm0uXG4gICAgLy8gaWYgKHByb3BzLnJldGFpbkRlcGxveW1lbnRzKSB7XG4gICAgLy8gICB0aGlzLmRlcGxveW1lbnRSZXNvdXJjZS5hZGRPdmVycmlkZShcImxpZmVjeWNsZVwiLCB7XG4gICAgLy8gICAgIHByZXZlbnRfZGVzdHJveTogdHJ1ZSxcbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cblxuICAgIHRoaXMuZGVwbG95bWVudElkID0gdGhpcy5kZXBsb3ltZW50UmVzb3VyY2UuaWQ7XG5cbiAgICBpZiAocHJvcHMuc3RhZ2VOYW1lKSB7XG4gICAgICB0aGlzLnN0YWdlTmFtZSA9IHByb3BzLnN0YWdlTmFtZTtcbiAgICAgIHRoaXMuc3RhZ2VSZXNvdXJjZSA9IG5ldyBhcGlHYXRld2F5U3RhZ2UuQXBpR2F0ZXdheVN0YWdlKHRoaXMsIFwiU3RhZ2VcIiwge1xuICAgICAgICByZXN0QXBpSWQ6IHByb3BzLmFwaS5yZXN0QXBpSWQsXG4gICAgICAgIGRlcGxveW1lbnRJZDogdGhpcy5kZXBsb3ltZW50UmVzb3VyY2UuaWQsXG4gICAgICAgIHN0YWdlTmFtZTogcHJvcHMuc3RhZ2VOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb25cbiAgICAgICAgICA/IGAke3Byb3BzLmRlc2NyaXB0aW9ufSBTdGFnZWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgLy8gRGVwZW5kZW5jaWVzIG9uIG1ldGhvZHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBkZXBsb3ltZW50UmVzb3VyY2UgaXRzZWxmLlxuICAgICAgLy8gVGhlIHN0YWdlUmVzb3VyY2UgaW1wbGljaXRseSBkZXBlbmRzIG9uIGRlcGxveW1lbnRSZXNvdXJjZSB2aWEgZGVwbG95bWVudElkLlxuICAgIH1cblxuICAgIGlmIChwcm9wcy5hcGkgaW5zdGFuY2VvZiBSZXN0QXBpQmFzZSkge1xuICAgICAgLy8gVGhlIG1ldGhvZCBfYXR0YWNoRGVwbG95bWVudCBtaWdodCBuZWVkIHRvIGJlIGFkYXB0ZWQgb3IgbWlnaHQgbm90IGV4aXN0IGluIFRlcnJhQ29uc3RydWN0cyBSZXN0QXBpQmFzZVxuICAgICAgLy8gVGhpcyBpcyBzcGVjaWZpYyB0byBob3cgYGxhdGVzdERlcGxveW1lbnRgIGlzIG1hbmFnZWQgYnkgdGhlIFJlc3RBcGkgY29uc3RydWN0LlxuICAgICAgKHByb3BzLmFwaSBhcyBhbnkpLl9hdHRhY2hEZXBsb3ltZW50Py4odGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVUcmlnZ2VycygpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IFsuLi50aGlzLnRyaWdnZXJDb21wb25lbnRzXTtcblxuICAgIC8vIElnbm9yZSBJUmVzdEFwaSB0aGF0IGFyZSBpbXBvcnRlZFxuICAgIGlmICh0aGlzLmFwaSBpbnN0YW5jZW9mIFJlc3RBcGkgfHwgdGhpcy5hcGkgaW5zdGFuY2VvZiBTcGVjUmVzdEFwaSkge1xuICAgICAgY29uc3QgYXBpSW50ZXJuYWwgPSB0aGlzLmFwaS5ub2RlXG4gICAgICAgIC5kZWZhdWx0Q2hpbGQgYXMgYXBpR2F0ZXdheVJlc3RBcGkuQXBpR2F0ZXdheVJlc3RBcGk7XG4gICAgICAvLyBUT0RPOiBBV1NDREsgVHJpZ2dlcnMgcmVkZXBsb3ltZW50IG9uIGFueSBjaGFuZ2VzIChub3QganVzdCB0aGUgYm9keSBwcm9wZXJ0eSkuXG4gICAgICBjb25zdCB0ZlJlc3RBUEkgPSBhcGlJbnRlcm5hbC50b1RlcnJhZm9ybSgpO1xuICAgICAgdHJpZ2dlcnMucHVzaCh0ZlJlc3RBUEkucmVzb3VyY2UuYXdzX2FwaV9nYXRld2F5X3Jlc3RfYXBpKTtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBBV1NDREsgY2FsY3VsYXRlcyBjaGVja3N1bSBhZ2FpbnN0IGZ1bmN0aW9uIHByb3BlcnRpZXMuXG4gICAgLy8gVGVycmFmb3JtIGFsbG93cyB1c2UgdG8gaW5jbHVkZSB0aGUgZW50aXJlIG9iamVjdCwgc28gd2UgdXNlIHRoYXQgZm9yIGNsYXJpdHkuXG4gICAgY29uc3QgY2hlY2tzdW0gPSBtZDVoYXNoKFxuICAgICAgdHJpZ2dlcnNcbiAgICAgICAgLm1hcCgoeCkgPT4gdGhpcy5zdGFjay5yZXNvbHZlKHgpKVxuICAgICAgICAubWFwKChjKSA9PiBKU09OLnN0cmluZ2lmeShjKSlcbiAgICAgICAgLmpvaW4oXCJcIiksXG4gICAgKTtcbiAgICAvLyB0cmlnZ2VycyBoYXMgdG8gYmUgUmVjb3JkPHN0cmluZywgc3RyaW5nPiBmb3IgVGVycmFmb3JtIHRvIGFjY2VwdCBpdC5cbiAgICByZXR1cm4geyByZWRlcGxveW1lbnQ6IGNoZWNrc3VtIH07XG5cbiAgICAvLyAvLyBOT1RFOiBjb25zaWRlciBjaGVja3N1bSB0b28gY29uZnVzaW5nIGFuZCB1c2UgZnVsbCB0cmlnZ2VyIG9iamVjdHMgaW5zdGVhZD9cbiAgICAvLyAvLyBUT0RPOiBUaGlzIGNhdXNlcyBcIm1pc3NpbmcgYXR0cmlidXRlciBzZXBhcmF0b3JcIiBlcnJvcnNcbiAgICAvLyByZXR1cm4gdHJpZ2dlcnMubGVuZ3RoICE9PSAwXG4gICAgLy8gICA/IHsgcmVkZXBsb3ltZW50OiBGbi5zaGExKEZuLmpzb25lbmNvZGUodGhpcy5zdGFjay5yZXNvbHZlKHRyaWdnZXJzKSkpIH1cbiAgICAvLyAgIDogLy8gVE9ETzogV3JhcCBlYWNoIHRyaWdnZXIgaW4gc2hhIGluc3RlYWQ/IHsgcmVkZXBsb3ltZW50OiBGbi5zaGExKEZuLmpzb25lbmNvZGUoKSkgfVxuICAgIC8vICAgICAvLyB0cmlnZ2Vycy5yZWR1Y2UoXG4gICAgLy8gICAgIC8vICAgKGFjYywgY3VycikgPT4ge1xuICAgIC8vICAgICAvLyAgICAgY29uc3Qga2V5ID0gYHRyaWdnZXItJHtPYmplY3Qua2V5cyhhY2MpLmxlbmd0aCArIDF9YDtcbiAgICAvLyAgICAgLy8gICAgIGFjY1trZXldID0gdGhpcy5zdGFjay5yZXNvbHZlKGN1cnIpO1xuICAgIC8vICAgICAvLyAgICAgcmV0dXJuIGFjYztcbiAgICAvLyAgICAgLy8gICB9LFxuICAgIC8vICAgICAvLyAgIHt9IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgLy8gICAgIC8vIClcbiAgICAvLyAgICAgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb21wb25lbnQgdG8gdGhlIHNldCBvZiB0cmlnZ2VycyB0aGF0IGRldGVybWluZSBpZiBhIG5ldyBkZXBsb3ltZW50IHNob3VsZCBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBUcmlnZ2VycyBzaG91bGQgYmUgcHJlZmVycmVkIG92ZXIgRGVwZW5kZW5jaWVzLCBzaW5jZSBEZXBlbmRlbmNpZXMgY2FuIG9ubHkgY2FwdHVyZSBkZXBlbmRlbmN5XG4gICAqIG9yZGVyaW5nIGFuZCB3aWxsIG5vdCBjYXVzZSB0aGUgcmVzb3VyY2UgdG8gcmVjcmVhdGUgKHJlZGVwbG95IHRoZSBSRVNUIEFQSSkgd2l0aCB1cHN0cmVhbVxuICAgKiBjb25maWd1cmF0aW9uIGNoYW5nZXMuXG4gICAqXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBjb25zdHJ1Y3RzIG9mIHRoZSBBUEkgR2F0ZXdheSBtb2RlbCB0aGF0IHdhbnQgdG9cbiAgICogaW52YWxpZGF0ZSB0aGUgZGVwbG95bWVudCB3aGVuIHRoZWlyIHNldHRpbmdzIGNoYW5nZS4gVGhlIGNvbXBvbmVudCB3aWxsXG4gICAqIGJlIHJlc29sdmVkIGR1cmluZyBzeW50aGVzaXMgc28gdG9rZW5zIGFyZSB3ZWxjb21lLlxuICAgKi9cbiAgcHVibGljIGFkZFRvVHJpZ2dlcnMoZGF0YTogYW55KSB7XG4gICAgaWYgKHRoaXMubm9kZS5sb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgbW9kaWZ5IGRlcGxveW1lbnQgdHJpZ2dlcnMgd2hlbiB0aGUgY29uc3RydWN0IGlzIGxvY2tlZC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckNvbXBvbmVudHMucHVzaChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgZGVwZW5kZW5jeSBmcm9tIHRoaXMgRGVwbG95bWVudCB0byBhbiBBUEkgR2F0ZXdheSBNZXRob2QuXG4gICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtZXRob2QgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgVGhlIE1ldGhvZCBjb25zdHJ1Y3QgdG8gYWRkIGFzIGEgZGVwZW5kZW5jeS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FkZE1ldGhvZERlcGVuZGVuY3kobWV0aG9kOiBNZXRob2QpIHtcbiAgICAvLyBhZGRpbmcgYSBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIGNvbnN0cnVjdHMgdXNpbmcgYG5vZGUuYWRkRGVwZW5kZW5jeSgpYFxuICAgIC8vIHdpbGwgY3JlYXRlIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gYGF3c19hcGlfZ2F0ZXdheV9kZXBsb3ltZW50YFxuICAgIC8vIGFuZCB0aGUgYGF3c19sYW1iZGFfcGVybWlzc2lvbmAgcmVzb3VyY2VzIChjaGlsZHJlbiB1bmRlciBNZXRob2QpLFxuICAgIC8vIGNhdXNpbmcgY3ljbGljIGRlcGVuZGVuY3kgZXJyb3JzLiBIZW5jZSwgZmFsbGluZyBiYWNrIHRvIGRlY2xhcmluZ1xuICAgIC8vIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSB1bmRlcmx5aW5nIFRlcnJhZm9ybUVsZW1lbnRzLlxuICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KFxuICAgICAgbWV0aG9kLm5vZGUuZGVmYXVsdENoaWxkIGFzIGFwaUdhdGV3YXlNZXRob2QuQXBpR2F0ZXdheU1ldGhvZCxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBsb3ltZW50SWQ6IHRoaXMuZGVwbG95bWVudElkLFxuICAgICAgc3RhZ2VOYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSW52b2tlVXJsOiB0aGlzLnN0YWdlUmVzb3VyY2U/Lmludm9rZVVybCxcbiAgICB9O1xuICB9XG59XG4iXX0=