terraconstructs 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/.jsii +1081 -229
  2. package/lib/asset-staging.js +1 -1
  3. package/lib/aws/arn.js +1 -1
  4. package/lib/aws/aws-asset-manager.js +1 -1
  5. package/lib/aws/aws-construct.js +1 -1
  6. package/lib/aws/aws-stack.js +1 -1
  7. package/lib/aws/aws-tags.js +2 -2
  8. package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
  9. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  10. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  11. package/lib/aws/cloudwatch/actions/sns.js +1 -1
  12. package/lib/aws/cloudwatch/actions/ssm.js +2 -2
  13. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  14. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  15. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  16. package/lib/aws/cloudwatch/alarm.js +1 -1
  17. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  18. package/lib/aws/cloudwatch/dashboard.js +1 -1
  19. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  20. package/lib/aws/cloudwatch/graph.js +8 -8
  21. package/lib/aws/cloudwatch/layout.js +3 -3
  22. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  23. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  24. package/lib/aws/cloudwatch/log-group.js +1 -1
  25. package/lib/aws/cloudwatch/log-query.js +1 -1
  26. package/lib/aws/cloudwatch/log-stream.js +1 -1
  27. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  28. package/lib/aws/cloudwatch/metric.js +2 -2
  29. package/lib/aws/cloudwatch/pattern.js +3 -3
  30. package/lib/aws/cloudwatch/policy.js +1 -1
  31. package/lib/aws/cloudwatch/query-definition.js +2 -2
  32. package/lib/aws/cloudwatch/stats.js +1 -1
  33. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  34. package/lib/aws/cloudwatch/text.js +1 -1
  35. package/lib/aws/cloudwatch/variable.js +3 -3
  36. package/lib/aws/cloudwatch/widget.js +1 -1
  37. package/lib/aws/compute/access-log.js +4 -4
  38. package/lib/aws/compute/activity.js +1 -1
  39. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  40. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  41. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  42. package/lib/aws/compute/alb/application-listener.js +1 -1
  43. package/lib/aws/compute/alb/application-load-balancer.js +1 -1
  44. package/lib/aws/compute/alb/application-target-group.js +1 -1
  45. package/lib/aws/compute/alb/conditions.js +1 -1
  46. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  47. package/lib/aws/compute/alb/trust-store.js +1 -1
  48. package/lib/aws/compute/api-definition.js +3 -3
  49. package/lib/aws/compute/api-key.js +2 -2
  50. package/lib/aws/compute/architecture.js +1 -1
  51. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  52. package/lib/aws/compute/authorizer.js +1 -1
  53. package/lib/aws/compute/authorizers/identity-source.js +1 -1
  54. package/lib/aws/compute/authorizers/lambda.js +2 -2
  55. package/lib/aws/compute/base-path-mapping.js +1 -1
  56. package/lib/aws/compute/base-scalable-attribute.js +1 -1
  57. package/lib/aws/compute/bastion-host.js +1 -1
  58. package/lib/aws/compute/chain.js +1 -1
  59. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  60. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  61. package/lib/aws/compute/client-vpn-route.js +2 -2
  62. package/lib/aws/compute/code.js +8 -8
  63. package/lib/aws/compute/condition.js +1 -1
  64. package/lib/aws/compute/connections.js +1 -1
  65. package/lib/aws/compute/cors.js +1 -1
  66. package/lib/aws/compute/deployment.js +1 -1
  67. package/lib/aws/compute/domain-name.js +1 -1
  68. package/lib/aws/compute/event-invoke-config.js +1 -1
  69. package/lib/aws/compute/event-source-filter.js +2 -2
  70. package/lib/aws/compute/event-source-mapping.js +1 -1
  71. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  72. package/lib/aws/compute/event-sources/s3.js +1 -1
  73. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  74. package/lib/aws/compute/event-sources/sqs.js +1 -1
  75. package/lib/aws/compute/fields.js +4 -4
  76. package/lib/aws/compute/function-alias.js +1 -1
  77. package/lib/aws/compute/function-base.js +2 -2
  78. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  79. package/lib/aws/compute/function-destinations/function.js +1 -1
  80. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  81. package/lib/aws/compute/function-nodejs/function.js +1 -1
  82. package/lib/aws/compute/function-url.js +1 -1
  83. package/lib/aws/compute/function.js +1 -1
  84. package/lib/aws/compute/gateway-response.js +2 -2
  85. package/lib/aws/compute/handler.js +1 -1
  86. package/lib/aws/compute/instance-types.js +1 -1
  87. package/lib/aws/compute/instance.js +1 -1
  88. package/lib/aws/compute/integration.js +1 -1
  89. package/lib/aws/compute/integrations/aws.js +1 -1
  90. package/lib/aws/compute/integrations/http.js +1 -1
  91. package/lib/aws/compute/integrations/lambda.js +1 -1
  92. package/lib/aws/compute/integrations/mock.js +1 -1
  93. package/lib/aws/compute/integrations/stepfunctions.js +1 -1
  94. package/lib/aws/compute/ip-addresses.js +2 -2
  95. package/lib/aws/compute/ipam.js +1 -1
  96. package/lib/aws/compute/key-pair.js +1 -1
  97. package/lib/aws/compute/lambda-api.js +1 -1
  98. package/lib/aws/compute/launch-template.js +2 -2
  99. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  100. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  101. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  102. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  103. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  104. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  105. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  106. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  107. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  108. package/lib/aws/compute/load-balancer.js +3 -3
  109. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  110. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  111. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  112. package/lib/aws/compute/machine-image/common.js +1 -1
  113. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  114. package/lib/aws/compute/method.js +1 -1
  115. package/lib/aws/compute/model.js +3 -3
  116. package/lib/aws/compute/nat.js +5 -5
  117. package/lib/aws/compute/network-acl-types.js +2 -2
  118. package/lib/aws/compute/network-acl.js +3 -3
  119. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  120. package/lib/aws/compute/nlb/network-listener.js +1 -1
  121. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  122. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  123. package/lib/aws/compute/peer.js +1 -1
  124. package/lib/aws/compute/placement-group.js +1 -1
  125. package/lib/aws/compute/port.js +1 -1
  126. package/lib/aws/compute/prefix-list.js +1 -1
  127. package/lib/aws/compute/requestvalidator.js +1 -1
  128. package/lib/aws/compute/resource.js +3 -3
  129. package/lib/aws/compute/restapi.js +3 -3
  130. package/lib/aws/compute/route.js +8 -8
  131. package/lib/aws/compute/runtime.js +1 -1
  132. package/lib/aws/compute/scalable-target.js +1 -1
  133. package/lib/aws/compute/schedule.js +1 -1
  134. package/lib/aws/compute/security-group.js +1 -1
  135. package/lib/aws/compute/stage.js +2 -2
  136. package/lib/aws/compute/state-graph.js +1 -1
  137. package/lib/aws/compute/state-machine-fragment.js +1 -1
  138. package/lib/aws/compute/state-machine.js +4 -4
  139. package/lib/aws/compute/states/choice.js +1 -1
  140. package/lib/aws/compute/states/custom-state.js +1 -1
  141. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  142. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  143. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  144. package/lib/aws/compute/states/distributed-map.js +1 -1
  145. package/lib/aws/compute/states/fail.js +1 -1
  146. package/lib/aws/compute/states/map-base.js +1 -1
  147. package/lib/aws/compute/states/map.js +1 -1
  148. package/lib/aws/compute/states/parallel.js +1 -1
  149. package/lib/aws/compute/states/pass.js +2 -2
  150. package/lib/aws/compute/states/state.js +1 -1
  151. package/lib/aws/compute/states/succeed.js +1 -1
  152. package/lib/aws/compute/states/task-base.js +2 -2
  153. package/lib/aws/compute/states/task.js +1 -1
  154. package/lib/aws/compute/states/wait.js +2 -2
  155. package/lib/aws/compute/step-scaling-action.js +1 -1
  156. package/lib/aws/compute/step-scaling-policy.js +1 -1
  157. package/lib/aws/compute/stepfunctions-api.js +1 -1
  158. package/lib/aws/compute/subnet-v2.js +2 -2
  159. package/lib/aws/compute/subnet.js +1 -1
  160. package/lib/aws/compute/target-tracking-scaling-policy.js +1 -1
  161. package/lib/aws/compute/task-credentials.js +1 -1
  162. package/lib/aws/compute/task-input.js +1 -1
  163. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  164. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  165. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  166. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  167. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  168. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  169. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  170. package/lib/aws/compute/types.js +1 -1
  171. package/lib/aws/compute/usage-plan.js +1 -1
  172. package/lib/aws/compute/user-data.js +3 -3
  173. package/lib/aws/compute/volume.js +2 -2
  174. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  175. package/lib/aws/compute/vpc-endpoint.js +6 -6
  176. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  177. package/lib/aws/compute/vpc-link.js +1 -1
  178. package/lib/aws/compute/vpc-v2-base.js +1 -1
  179. package/lib/aws/compute/vpc-v2.js +2 -2
  180. package/lib/aws/compute/vpc.js +4 -4
  181. package/lib/aws/compute/vpn.js +3 -3
  182. package/lib/aws/edge/certificate.js +1 -1
  183. package/lib/aws/edge/distribution.js +3 -3
  184. package/lib/aws/edge/dns-alias-record-targets.js +6 -6
  185. package/lib/aws/edge/dns-record.js +13 -13
  186. package/lib/aws/edge/dns-zone.js +1 -1
  187. package/lib/aws/edge/function.js +2 -2
  188. package/lib/aws/edge/key-value-store.js +4 -4
  189. package/lib/aws/edge/origin.js +3 -3
  190. package/lib/aws/edge/response-headers-policy.js +1 -1
  191. package/lib/aws/encryption/alias.js +1 -1
  192. package/lib/aws/encryption/key.js +1 -1
  193. package/lib/aws/encryption/via-service-principal.js +1 -1
  194. package/lib/aws/iam/grant.js +3 -3
  195. package/lib/aws/iam/group.js +1 -1
  196. package/lib/aws/iam/instance-profile.js +1 -1
  197. package/lib/aws/iam/managed-policy.js +1 -1
  198. package/lib/aws/iam/oidc-provider.js +1 -1
  199. package/lib/aws/iam/policy-document.js +1 -1
  200. package/lib/aws/iam/policy-statement.js +1 -1
  201. package/lib/aws/iam/policy.js +1 -1
  202. package/lib/aws/iam/principals.js +20 -20
  203. package/lib/aws/iam/role.js +14 -5
  204. package/lib/aws/iam/saml-provider.js +2 -2
  205. package/lib/aws/iam/unknown-principal.js +1 -1
  206. package/lib/aws/iam/user.js +1 -1
  207. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  208. package/lib/aws/network/subnet-group.js +3 -3
  209. package/lib/aws/network/subnet.js +4 -4
  210. package/lib/aws/notify/archive.js +1 -1
  211. package/lib/aws/notify/connection.js +3 -3
  212. package/lib/aws/notify/event-bus.js +3 -3
  213. package/lib/aws/notify/event-pattern.js +1 -1
  214. package/lib/aws/notify/input.js +2 -2
  215. package/lib/aws/notify/kinesis-stream.js +1 -1
  216. package/lib/aws/notify/notification-rule.js +1 -1
  217. package/lib/aws/notify/policy.js +1 -1
  218. package/lib/aws/notify/queue-base.js +1 -1
  219. package/lib/aws/notify/queue-policy.js +1 -1
  220. package/lib/aws/notify/queue.js +1 -1
  221. package/lib/aws/notify/resource-policy.js +1 -1
  222. package/lib/aws/notify/rule.js +1 -1
  223. package/lib/aws/notify/schedule.js +1 -1
  224. package/lib/aws/notify/sqs-grants.generated.js +1 -1
  225. package/lib/aws/notify/subscription-filter.js +1 -1
  226. package/lib/aws/notify/subscription.js +4 -4
  227. package/lib/aws/notify/subscriptions/email.js +1 -1
  228. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  229. package/lib/aws/notify/subscriptions/sms.js +1 -1
  230. package/lib/aws/notify/subscriptions/sqs.js +1 -1
  231. package/lib/aws/notify/subscriptions/url.js +1 -1
  232. package/lib/aws/notify/targets/event-bus.js +1 -1
  233. package/lib/aws/notify/targets/function.js +1 -1
  234. package/lib/aws/notify/targets/log-group.js +2 -2
  235. package/lib/aws/notify/targets/sqs.js +1 -1
  236. package/lib/aws/notify/targets/state-machine.js +1 -1
  237. package/lib/aws/notify/topic-base.js +1 -1
  238. package/lib/aws/notify/topic.js +1 -1
  239. package/lib/aws/storage/assets/image-asset.js +3 -3
  240. package/lib/aws/storage/assets/s3.js +1 -1
  241. package/lib/aws/storage/auth-token.js +2 -2
  242. package/lib/aws/storage/billing.js +1 -1
  243. package/lib/aws/storage/bucket-notifications.js +1 -1
  244. package/lib/aws/storage/bucket-policy.js +1 -1
  245. package/lib/aws/storage/bucket-source.js +1 -1
  246. package/lib/aws/storage/bucket.js +2 -2
  247. package/lib/aws/storage/capacity.js +1 -1
  248. package/lib/aws/storage/dynamodb-perms.d.ts +2 -2
  249. package/lib/aws/storage/dynamodb-perms.js +9 -16
  250. package/lib/aws/storage/ecr-repository.js +3 -3
  251. package/lib/aws/storage/encryption.js +1 -1
  252. package/lib/aws/storage/index.d.ts +2 -0
  253. package/lib/aws/storage/index.js +3 -1
  254. package/lib/aws/storage/notification-targets/function.js +1 -1
  255. package/lib/aws/storage/notification-targets/queue.js +1 -1
  256. package/lib/aws/storage/origin-access-identity.js +1 -1
  257. package/lib/aws/storage/parameter.js +2 -2
  258. package/lib/aws/storage/shared.d.ts +31 -2
  259. package/lib/aws/storage/shared.js +29 -2
  260. package/lib/aws/storage/stream-grants.d.ts +61 -0
  261. package/lib/aws/storage/stream-grants.js +72 -0
  262. package/lib/aws/storage/table-grants.d.ts +98 -0
  263. package/lib/aws/storage/table-grants.js +137 -0
  264. package/lib/aws/storage/table.d.ts +280 -8
  265. package/lib/aws/storage/table.js +350 -148
  266. package/lib/bundling.js +3 -3
  267. package/lib/construct-base.js +2 -2
  268. package/lib/duration.js +1 -1
  269. package/lib/errors.js +1 -1
  270. package/lib/expiration.js +1 -1
  271. package/lib/fs/ignore.js +4 -4
  272. package/lib/fs/index.js +1 -1
  273. package/lib/size.js +1 -1
  274. package/lib/stack-base.js +1 -1
  275. package/lib/terra-func.js +1 -1
  276. package/lib/time-zone.js +1 -1
  277. package/package.json +1 -1
@@ -8,19 +8,18 @@ const provider_aws_1 = require("@cdktf/provider-aws");
8
8
  const cdktf_1 = require("cdktf");
9
9
  const __1 = require("..");
10
10
  const dynamodb_canned_metrics_generated_1 = require("./dynamodb-canned-metrics.generated");
11
- const perms = require("./dynamodb-perms");
12
11
  const scalable_table_attribute_1 = require("./scalable-table-attribute");
13
12
  const shared_1 = require("./shared");
13
+ const stream_grants_1 = require("./stream-grants");
14
+ const table_grants_1 = require("./table-grants");
14
15
  const errors_1 = require("../../errors");
15
16
  const cloudwatch = require("../cloudwatch");
16
17
  const appscaling = require("../compute");
17
18
  const kms = require("../encryption");
18
19
  const iam = require("../iam");
19
- // Missing in Terraform DynamoDb Replica Configuration block
20
- // https://registry.terraform.io/providers/hashicorp/aws/5.88.0/docs/resources/dynamodb_table#replica
21
- // import { Duration } from "../../duration";
22
20
  const HASH_KEY_TYPE = "HASH";
23
21
  const RANGE_KEY_TYPE = "RANGE";
22
+ // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-secondary-indexes
24
23
  const MAX_LOCAL_SECONDARY_INDEX_COUNT = 5;
25
24
  /**
26
25
  * Type of compression to use for imported data.
@@ -72,6 +71,9 @@ class InputFormat {
72
71
  * CSV format.
73
72
  */
74
73
  static csv(options) {
74
+ // We are using the .length property to check the length of the delimiter.
75
+ // Note that .length may not return the expected result for multi-codepoint characters like full-width characters or emojis,
76
+ // but such characters are not expected to be used as delimiters in this context.
75
77
  if (options?.delimiter &&
76
78
  (!this.validCsvDelimiters.includes(options.delimiter) ||
77
79
  options.delimiter.length !== 1)) {
@@ -100,7 +102,12 @@ class InputFormat {
100
102
  }
101
103
  exports.InputFormat = InputFormat;
102
104
  _a = JSII_RTTI_SYMBOL_1;
103
- InputFormat[_a] = { fqn: "terraconstructs.aws.storage.InputFormat", version: "0.2.1" };
105
+ InputFormat[_a] = { fqn: "terraconstructs.aws.storage.InputFormat", version: "0.2.2" };
106
+ /**
107
+ * Valid CSV delimiters.
108
+ *
109
+ * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-csv.html#cfn-dynamodb-table-csv-delimiter
110
+ */
104
111
  InputFormat.validCsvDelimiters = [",", "\t", ":", ";", "|", " "];
105
112
  InputFormat.readableValidCsvDelimiters = [
106
113
  "comma (,)",
@@ -129,8 +136,16 @@ var ApproximateCreationDateTimePrecision;
129
136
  class TableBase extends __1.AwsConstructBase {
130
137
  constructor() {
131
138
  super(...arguments);
139
+ /**
140
+ * @deprecated This member is still filled but it is not read
141
+ */
132
142
  this.regionalArns = new Array();
133
143
  }
144
+ grantOnKey(grantee, ...actions) {
145
+ return {
146
+ grant: this.encryptionKey?.grant(grantee, ...actions),
147
+ };
148
+ }
134
149
  get outputs() {
135
150
  return {
136
151
  tableArn: this.tableArn,
@@ -138,100 +153,127 @@ class TableBase extends __1.AwsConstructBase {
138
153
  tableStreamArn: this.tableStreamArn,
139
154
  };
140
155
  }
141
- grant(grantee, ...actions) {
142
- const resources = [
143
- this.tableArn,
144
- cdktf_1.Lazy.stringValue({
145
- produce: () => (this.hasIndex ? `${this.tableArn}/index/*` : undefined),
146
- }),
147
- ...this.regionalArns,
148
- ...this.regionalArns.map((arn) => cdktf_1.Lazy.stringValue({
149
- produce: () => (this.hasIndex ? `${arn}/index/*` : undefined),
150
- })),
151
- ];
152
- return iam.Grant.addToPrincipalOrResource({
153
- grantee,
154
- actions,
155
- resourceArns: resources.filter((r) => r !== undefined),
156
- resource: this, // Grant will take the principal from the grantee
156
+ /**
157
+ * Grant a predefined set of permissions on this Table.
158
+ */
159
+ get grants() {
160
+ return new table_grants_1.TableGrants({
161
+ table: this,
162
+ encryptedResource: this,
163
+ policyResource: this,
164
+ regions: this.regions,
165
+ hasIndex: this.hasIndex,
157
166
  });
158
167
  }
159
- grantStream(grantee, ...actions) {
168
+ /**
169
+ * Grant a predefined set of permissions on this Table's Stream, if present.
170
+ *
171
+ * Will throw if the Table has not been configured for streaming.
172
+ */
173
+ get streamGrants() {
160
174
  if (!this.tableStreamArn) {
161
175
  throw new errors_1.ValidationError(`DynamoDB Streams must be enabled on the table ${this.node.path}`, this);
162
176
  }
163
- return iam.Grant.addToPrincipal({
164
- grantee,
165
- actions,
166
- resourceArns: [this.tableStreamArn],
167
- scope: this,
177
+ return new stream_grants_1.StreamGrants({
178
+ table: this,
179
+ tableStreamArn: this.tableStreamArn,
180
+ encryptionKey: this.encryptionKey,
168
181
  });
169
182
  }
183
+ /**
184
+ * Adds an IAM policy statement associated with this table to an IAM
185
+ * principal's policy.
186
+ *
187
+ * If `encryptionKey` is present, appropriate grants to the key needs to be added
188
+ * separately using the `table.encryptionKey.grant*` methods.
189
+ *
190
+ * @param grantee The principal (no-op if undefined)
191
+ * @param actions The set of actions to allow (i.e. "dynamodb:PutItem", "dynamodb:GetItem", ...)
192
+ */
193
+ grant(grantee, ...actions) {
194
+ return this.grants.actions(grantee, ...actions);
195
+ }
196
+ /**
197
+ * Adds an IAM policy statement associated with this table's stream to an
198
+ * IAM principal's policy.
199
+ *
200
+ * If `encryptionKey` is present, appropriate grants to the key needs to be added
201
+ * separately using the `table.encryptionKey.grant*` methods.
202
+ *
203
+ * @param grantee The principal (no-op if undefined)
204
+ * @param actions The set of actions to allow (i.e. "dynamodb:DescribeStream", "dynamodb:GetRecords", ...)
205
+ */
206
+ grantStream(grantee, ...actions) {
207
+ return this.streamGrants.actions(grantee, ...actions);
208
+ }
209
+ /**
210
+ * Permits an IAM principal all data read operations from this table:
211
+ * BatchGetItem, GetRecords, GetShardIterator, Query, GetItem, Scan, DescribeTable.
212
+ *
213
+ * Appropriate grants will also be added to the customer-managed KMS key
214
+ * if one was configured.
215
+ *
216
+ * @param grantee The principal to grant access to
217
+ */
170
218
  grantReadData(grantee) {
171
- const tableActions = perms.READ_DATA_ACTIONS_TABLE_SAFE.concat(perms.DESCRIBE_TABLE);
172
- // If streams are available, also grant stream-specific actions
173
- if (this.tableStreamArn) {
174
- return this.combinedGrant(grantee, {
175
- keyActions: perms.KEY_READ_ACTIONS,
176
- tableActions,
177
- streamActions: perms.READ_DATA_ACTIONS_STREAM_ONLY,
178
- });
179
- }
180
- return this.combinedGrant(grantee, {
181
- keyActions: perms.KEY_READ_ACTIONS,
182
- tableActions,
183
- });
219
+ return this.grants.readData(grantee);
184
220
  }
221
+ /**
222
+ * Permits an IAM Principal to list streams attached to current dynamodb table.
223
+ *
224
+ * @param grantee The principal (no-op if undefined)
225
+ */
185
226
  grantTableListStreams(grantee) {
186
- if (!this.tableStreamArn) {
187
- throw new errors_1.ValidationError(`DynamoDB Streams must be enabled on the table ${this.node.path}`, this);
188
- }
189
- return iam.Grant.addToPrincipal({
190
- grantee,
191
- actions: ["dynamodb:ListStreams"],
192
- resourceArns: ["*"],
193
- });
227
+ return this.streamGrants.list(grantee);
194
228
  }
229
+ /**
230
+ * Permits an IAM principal all stream data read operations for this
231
+ * table's stream:
232
+ * DescribeStream, GetRecords, GetShardIterator, ListStreams.
233
+ *
234
+ * Appropriate grants will also be added to the customer-managed KMS key
235
+ * if one was configured.
236
+ *
237
+ * @param grantee The principal to grant access to
238
+ */
195
239
  grantStreamRead(grantee) {
196
- this.grantTableListStreams(grantee);
197
- return this.combinedGrant(grantee, {
198
- keyActions: perms.KEY_READ_ACTIONS,
199
- streamActions: perms.READ_STREAM_DATA_ACTIONS,
200
- });
240
+ return this.streamGrants.read(grantee);
201
241
  }
242
+ /**
243
+ * Permits an IAM principal all data write operations to this table:
244
+ * BatchWriteItem, PutItem, UpdateItem, DeleteItem, DescribeTable.
245
+ *
246
+ * Appropriate grants will also be added to the customer-managed KMS key
247
+ * if one was configured.
248
+ *
249
+ * @param grantee The principal to grant access to
250
+ */
202
251
  grantWriteData(grantee) {
203
- const tableActions = perms.WRITE_DATA_ACTIONS.concat(perms.DESCRIBE_TABLE);
204
- const keyActions = perms.KEY_READ_ACTIONS.concat(perms.KEY_WRITE_ACTIONS);
205
- return this.combinedGrant(grantee, { keyActions, tableActions });
252
+ return this.grants.writeData(grantee);
206
253
  }
254
+ /**
255
+ * Permits an IAM principal to all data read/write operations to this table.
256
+ * BatchGetItem, GetRecords, GetShardIterator, Query, GetItem, Scan,
257
+ * BatchWriteItem, PutItem, UpdateItem, DeleteItem, DescribeTable
258
+ *
259
+ * Appropriate grants will also be added to the customer-managed KMS key
260
+ * if one was configured.
261
+ *
262
+ * @param grantee The principal to grant access to
263
+ */
207
264
  grantReadWriteData(grantee) {
208
- const tableActions = perms.READ_DATA_ACTIONS.concat(perms.WRITE_DATA_ACTIONS).concat(perms.DESCRIBE_TABLE);
209
- const keyActions = perms.KEY_READ_ACTIONS.concat(perms.KEY_WRITE_ACTIONS);
210
- return this.combinedGrant(grantee, { keyActions, tableActions });
265
+ return this.grants.readWriteData(grantee);
211
266
  }
267
+ /**
268
+ * Permits all DynamoDB operations ("dynamodb:*") to an IAM principal.
269
+ *
270
+ * Appropriate grants will also be added to the customer-managed KMS key
271
+ * if one was configured.
272
+ *
273
+ * @param grantee The principal to grant access to
274
+ */
212
275
  grantFullAccess(grantee) {
213
- const keyActions = perms.KEY_READ_ACTIONS.concat(perms.KEY_WRITE_ACTIONS);
214
- return this.combinedGrant(grantee, {
215
- keyActions,
216
- tableActions: ["dynamodb:*"],
217
- });
218
- }
219
- addToResourcePolicy(statement) {
220
- if (!this.resourcePolicy) {
221
- // ensure a policy exists and is associated with the table
222
- this.resourcePolicy = new iam.PolicyDocument(this, "Policy", {
223
- statement: [],
224
- });
225
- new provider_aws_1.dynamodbResourcePolicy.DynamodbResourcePolicy(this, "PolicyAttachment", {
226
- policy: this.resourcePolicy.json,
227
- resourceArn: this.tableArn,
228
- });
229
- }
230
- this.resourcePolicy.addStatements(statement);
231
- return {
232
- statementAdded: true,
233
- policyDependable: this,
234
- };
276
+ return this.grants.fullAccess(grantee);
235
277
  }
236
278
  metric(metricName, props) {
237
279
  return new cloudwatch.Metric({
@@ -243,9 +285,21 @@ class TableBase extends __1.AwsConstructBase {
243
285
  ...props,
244
286
  }).attachTo(this);
245
287
  }
288
+ /**
289
+ * Metric for the consumed read capacity units this table
290
+ *
291
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
292
+ * You can customize this by using the `statistic` and `period` properties.
293
+ */
246
294
  metricConsumedReadCapacityUnits(props) {
247
295
  return this.cannedMetric(dynamodb_canned_metrics_generated_1.DynamoDBMetrics.consumedReadCapacityUnitsSum, props);
248
296
  }
297
+ /**
298
+ * Metric for the consumed write capacity units this table
299
+ *
300
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
301
+ * You can customize this by using the `statistic` and `period` properties.
302
+ */
249
303
  metricConsumedWriteCapacityUnits(props) {
250
304
  return this.cannedMetric(dynamodb_canned_metrics_generated_1.DynamoDBMetrics.consumedWriteCapacityUnitsSum, props);
251
305
  }
@@ -265,16 +319,31 @@ class TableBase extends __1.AwsConstructBase {
265
319
  dimensionsMap,
266
320
  });
267
321
  }
322
+ /**
323
+ * Metric for the user errors. Note that this metric reports user errors across all
324
+ * the tables in the account and region the table resides in.
325
+ *
326
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
327
+ * You can customize this by using the `statistic` and `period` properties.
328
+ */
268
329
  metricUserErrors(props) {
269
330
  if (props?.dimensionsMap) {
270
331
  throw new errors_1.ValidationError("'dimensionsMap' is not supported for the 'UserErrors' metric", this);
271
332
  }
333
+ // overriding 'dimensions' here because this metric is an account metric.
334
+ // see 'UserErrors' in https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/metrics-dimensions.html
272
335
  return this.metric("UserErrors", {
273
336
  statistic: "sum",
274
337
  ...props,
275
338
  dimensionsMap: {},
276
339
  });
277
340
  }
341
+ /**
342
+ * Metric for the conditional check failed requests this table
343
+ *
344
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
345
+ * You can customize this by using the `statistic` and `period` properties.
346
+ */
278
347
  metricConditionalCheckFailedRequests(props) {
279
348
  return this.metric("ConditionalCheckFailedRequests", {
280
349
  statistic: "sum",
@@ -285,6 +354,12 @@ class TableBase extends __1.AwsConstructBase {
285
354
  metricThrottledRequests(props) {
286
355
  return this.metric("ThrottledRequests", { statistic: "sum", ...props });
287
356
  }
357
+ /**
358
+ * Metric for the successful request latency this table.
359
+ *
360
+ * By default, the metric will be calculated as an average over a period of 5 minutes.
361
+ * You can customize this by using the `statistic` and `period` properties.
362
+ */
288
363
  metricSuccessfulRequestLatency(props) {
289
364
  if (!props?.dimensionsMap?.Operation) {
290
365
  throw new errors_1.ValidationError("'Operation' dimension must be passed for the 'SuccessfulRequestLatency' metric.", this);
@@ -299,6 +374,11 @@ class TableBase extends __1.AwsConstructBase {
299
374
  dimensionsMap,
300
375
  }).attachTo(this);
301
376
  }
377
+ /**
378
+ * How many requests are throttled on this table, for the given operation
379
+ *
380
+ * Default: sum over 5 minutes
381
+ */
302
382
  metricThrottledRequestsForOperation(operation, props) {
303
383
  return new cloudwatch.Metric({
304
384
  ...dynamodb_canned_metrics_generated_1.DynamoDBMetrics.throttledRequestsSum({
@@ -308,12 +388,33 @@ class TableBase extends __1.AwsConstructBase {
308
388
  ...props,
309
389
  }).attachTo(this);
310
390
  }
391
+ /**
392
+ * How many requests are throttled on this table.
393
+ *
394
+ * This will sum errors across all possible operations.
395
+ * Note that by default, each individual metric will be calculated as a sum over a period of 5 minutes.
396
+ * You can customize this by using the `statistic` and `period` properties.
397
+ */
311
398
  metricThrottledRequestsForOperations(props) {
312
399
  return this.sumMetricsForOperations("ThrottledRequests", "Sum of throttled requests across all operations", props);
313
400
  }
401
+ /**
402
+ * Metric for the system errors this table.
403
+ *
404
+ * This will sum errors across all possible operations.
405
+ * Note that by default, each individual metric will be calculated as a sum over a period of 5 minutes.
406
+ * You can customize this by using the `statistic` and `period` properties.
407
+ */
314
408
  metricSystemErrorsForOperations(props) {
315
409
  return this.sumMetricsForOperations("SystemErrors", "Sum of errors across all operations", props);
316
410
  }
411
+ /**
412
+ * Create a math expression for operations.
413
+ *
414
+ * @param metricName The metric name.
415
+ * @param expressionLabel Label for expression
416
+ * @param props operation list
417
+ */
317
418
  sumMetricsForOperations(metricName, expressionLabel, props) {
318
419
  if (props?.dimensionsMap?.Operation) {
319
420
  throw new errors_1.ValidationError("The Operation dimension is not supported. Use the 'operations' property.", this);
@@ -323,14 +424,26 @@ class TableBase extends __1.AwsConstructBase {
323
424
  statistic: "sum",
324
425
  ...props,
325
426
  });
326
- return new cloudwatch.MathExpression({
427
+ const sum = new cloudwatch.MathExpression({
327
428
  expression: `${Object.keys(values).join(" + ")}`,
328
429
  usingMetrics: { ...values },
329
430
  color: props?.color,
330
431
  label: expressionLabel,
331
432
  period: props?.period,
332
433
  });
434
+ return sum;
333
435
  }
436
+ /**
437
+ * Create a map of metrics that can be used in a math expression.
438
+ *
439
+ * Using the return value of this function as the `usingMetrics` property in `cloudwatch.MathExpression` allows you to
440
+ * use the keys of this map as metric names inside you expression.
441
+ *
442
+ * @param metricName The metric name.
443
+ * @param operations The list of operations to create metrics for.
444
+ * @param props Properties for the individual metrics.
445
+ * @param metricNameMapper Mapper function to allow controlling the individual metric name per operation.
446
+ */
334
447
  createMetricsForOperations(metricName, operations, props, metricNameMapper) {
335
448
  const metrics = {};
336
449
  const mapper = metricNameMapper ?? ((op) => op.toLowerCase());
@@ -356,43 +469,6 @@ class TableBase extends __1.AwsConstructBase {
356
469
  }
357
470
  return metrics;
358
471
  }
359
- combinedGrant(grantee, opts) {
360
- if (this.encryptionKey && opts.keyActions) {
361
- this.encryptionKey.grant(grantee, ...opts.keyActions);
362
- }
363
- if (opts.tableActions) {
364
- const resources = [
365
- this.tableArn,
366
- cdktf_1.Lazy.stringValue({
367
- produce: () => this.hasIndex ? `${this.tableArn}/index/*` : undefined,
368
- }),
369
- ...this.regionalArns,
370
- ...this.regionalArns.map((arn) => cdktf_1.Lazy.stringValue({
371
- produce: () => (this.hasIndex ? `${arn}/index/*` : undefined),
372
- })),
373
- ];
374
- const ret = iam.Grant.addToPrincipalOrResource({
375
- grantee,
376
- actions: opts.tableActions,
377
- resourceArns: resources.filter((r) => r !== undefined),
378
- resource: this,
379
- });
380
- return ret;
381
- }
382
- if (opts.streamActions) {
383
- if (!this.tableStreamArn) {
384
- throw new errors_1.ValidationError(`DynamoDB Streams must be enabled on the table ${this.node.path}`, this);
385
- }
386
- const ret = iam.Grant.addToPrincipalOrResource({
387
- grantee,
388
- actions: opts.streamActions,
389
- resourceArns: [this.tableStreamArn],
390
- resource: this,
391
- });
392
- return ret;
393
- }
394
- throw new errors_1.ValidationError(`Unexpected grant combination, actions must be provided for table or stream.`, this);
395
- }
396
472
  cannedMetric(fn, props) {
397
473
  return new cloudwatch.Metric({
398
474
  ...fn({ TableName: this.tableName }),
@@ -402,7 +478,7 @@ class TableBase extends __1.AwsConstructBase {
402
478
  }
403
479
  exports.TableBase = TableBase;
404
480
  _b = JSII_RTTI_SYMBOL_1;
405
- TableBase[_b] = { fqn: "terraconstructs.aws.storage.TableBase", version: "0.2.1" };
481
+ TableBase[_b] = { fqn: "terraconstructs.aws.storage.TableBase", version: "0.2.2" };
406
482
  /**
407
483
  * Provides a DynamoDB table.
408
484
  */
@@ -453,11 +529,16 @@ class Table extends TableBase {
453
529
  this.hasIndex = (attrs.grantIndexPermissions ?? false) ||
454
530
  (attrs.globalIndexes ?? []).length > 0 ||
455
531
  (attrs.localIndexes ?? []).length > 0;
532
+ this.regions = [];
456
533
  this.tableArn = _tableArn;
457
534
  this.tableName = tableName;
458
535
  this.tableStreamArn = tableStreamArn;
459
536
  this.encryptionKey = attrs.encryptionKey;
460
537
  }
538
+ addToResourcePolicy(_statement) {
539
+ // Imported tables cannot have resource policies modified
540
+ return { statementAdded: false };
541
+ }
461
542
  }
462
543
  let name;
463
544
  let arn;
@@ -495,6 +576,7 @@ class Table extends TableBase {
495
576
  this.nonKeyAttributes = new Set();
496
577
  this.tableScaling = {};
497
578
  this.indexScaling = new Map();
579
+ this.regions = new Array();
498
580
  const physicalTableName = props.tableName ?? this.stack.uniqueResourceName(this);
499
581
  const { sseSpecification, encryptionKey } = this.parseEncryption(props);
500
582
  this.encryptionKey = encryptionKey;
@@ -509,11 +591,11 @@ class Table extends TableBase {
509
591
  if (props.stream && props.stream !== shared_1.StreamViewType.NEW_AND_OLD_IMAGES) {
510
592
  throw new errors_1.ValidationError("`stream` must be set to `NEW_AND_OLD_IMAGES` when specifying `replicationRegions`", this);
511
593
  }
512
- this.billingMode = props.billingMode ?? shared_1.BillingMode.PAY_PER_REQUEST;
513
594
  streamSpecification = {
514
595
  streamEnabled: true,
515
596
  streamViewType: shared_1.StreamViewType.NEW_AND_OLD_IMAGES,
516
597
  };
598
+ this.billingMode = props.billingMode ?? shared_1.BillingMode.PAY_PER_REQUEST;
517
599
  }
518
600
  else {
519
601
  this.billingMode = props.billingMode ?? shared_1.BillingMode.PROVISIONED;
@@ -533,14 +615,16 @@ class Table extends TableBase {
533
615
  }
534
616
  this._replicas = this.renderReplicas(props.replicationRegions, props.replicaSpecification);
535
617
  if (this._replicas && this._replicas.length > 0) {
536
- this._replicas.forEach((r) =>
537
- // Save regional arns for grantXxx() methods
538
- this.regionalArns.push(this.stack.formatArn({
539
- region: r.regionName,
540
- service: "dynamodb",
541
- resource: "table",
542
- resourceName: physicalTableName,
543
- })));
618
+ this._replicas.forEach((r) => {
619
+ // Save regional arns for grantXxx() methods
620
+ this.regions?.push(r.regionName);
621
+ this.regionalArns.push(this.stack.formatArn({
622
+ region: r.regionName,
623
+ service: "dynamodb",
624
+ resource: "table",
625
+ resourceName: physicalTableName,
626
+ }));
627
+ });
544
628
  }
545
629
  this._resource = new provider_aws_1.dynamodbTable.DynamodbTable(this, "Resource", {
546
630
  name: physicalTableName,
@@ -579,8 +663,7 @@ class Table extends TableBase {
579
663
  importTable: this.renderImportSourceSpecification(props.importSource),
580
664
  replica: this._replicas,
581
665
  // resourcePolicy: props.resourcePolicy ? { policyDocument: this.stack.toJsonString(props.resourcePolicy.toJSON()) } : undefined, // Not in TF resource
582
- // TODO: https://github.com/hashicorp/terraform-provider-aws/issues/43142
583
- // warmThroughput: props.warmThroughput ?? undefined, // Not in TF resource
666
+ warmThroughput: props.warmThroughput,
584
667
  });
585
668
  this.tableArn = this._resource.arn;
586
669
  this.tableName = this._resource.name;
@@ -603,19 +686,42 @@ class Table extends TableBase {
603
686
  }),
604
687
  });
605
688
  }
606
- if (props.contributorInsightsEnabled) {
607
- // TODO: Generate conntributor insights per Global Secondary Index
608
- // this.globalSecondaryIndexesInternal
689
+ const contributorInsightsSpecification = this.renderContributorInsights(props);
690
+ if (contributorInsightsSpecification?.enabled) {
609
691
  new provider_aws_1.dynamodbContributorInsights.DynamodbContributorInsights(this, "ContributorInsights", {
610
692
  tableName: this.tableName,
611
- // TODO: use for each on gli iterator
612
- // indexName: iterator.value,
693
+ mode: contributorInsightsSpecification.mode,
613
694
  });
614
695
  }
615
696
  // Commenting out scalingRole initialization - let Terraform auto-create service-linked role
616
697
  // this.scalingRole = this.makeScalingRole();
617
698
  this.node.addValidation({ validate: () => this.validateTable() });
618
699
  }
700
+ /**
701
+ * Adds a statement to the resource policy associated with this table.
702
+ * A resource policy will be automatically created upon the first call to `addToResourcePolicy`.
703
+ *
704
+ * Note that this does not work with imported tables.
705
+ *
706
+ * @param statement The policy statement to add
707
+ */
708
+ addToResourcePolicy(statement) {
709
+ if (!this.resourcePolicy) {
710
+ // ensure a policy exists and is associated with the table
711
+ this.resourcePolicy = new iam.PolicyDocument(this, "Policy", {
712
+ statement: [],
713
+ });
714
+ new provider_aws_1.dynamodbResourcePolicy.DynamodbResourcePolicy(this, "PolicyAttachment", {
715
+ policy: this.resourcePolicy.json,
716
+ resourceArn: this.tableArn,
717
+ });
718
+ }
719
+ this.resourcePolicy.addStatements(statement);
720
+ return {
721
+ statementAdded: true,
722
+ policyDependable: this,
723
+ };
724
+ }
619
725
  addGlobalSecondaryIndex(props) {
620
726
  this.validateProvisioningGSI(props);
621
727
  this.validateIndexName(props.indexName);
@@ -643,8 +749,8 @@ class Table extends TableBase {
643
749
  maxWriteRequestUnits: props.maxWriteRequestUnits,
644
750
  }
645
751
  : undefined,
646
- // contributorInsightsEnabled: props.contributorInsightsEnabled, // Not in TF GSI block
647
- // warmThroughput: props.warmThroughput, // Not in TF GSI block
752
+ contributorInsightsSpecification: props.contributorInsightsSpecification, // Not in TF GSI block
753
+ warmThroughput: props.warmThroughput,
648
754
  });
649
755
  this.secondaryIndexSchemas.set(props.indexName, {
650
756
  partitionKey: props.partitionKey,
@@ -652,7 +758,13 @@ class Table extends TableBase {
652
758
  });
653
759
  this.indexScaling.set(props.indexName, {});
654
760
  }
761
+ /**
762
+ * Add a local secondary index of table.
763
+ *
764
+ * @param props the property of local secondary index
765
+ */
655
766
  addLocalSecondaryIndex(props) {
767
+ // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-secondary-indexes
656
768
  if (this.localSecondaryIndexesInternal.length >=
657
769
  MAX_LOCAL_SECONDARY_INDEX_COUNT) {
658
770
  throw new RangeError(`A maximum number of local secondary index per table is ${MAX_LOCAL_SECONDARY_INDEX_COUNT}`);
@@ -675,6 +787,11 @@ class Table extends TableBase {
675
787
  sortKey: props.sortKey,
676
788
  });
677
789
  }
790
+ /**
791
+ * Enable read capacity scaling for this table
792
+ *
793
+ * @returns An object to configure additional AutoScaling settings
794
+ */
678
795
  autoScaleReadCapacity(props) {
679
796
  if (this.tableScaling.scalableReadAttribute) {
680
797
  throw new errors_1.ValidationError("Read AutoScaling already enabled for this table", this);
@@ -691,6 +808,11 @@ class Table extends TableBase {
691
808
  ...props,
692
809
  }));
693
810
  }
811
+ /**
812
+ * Enable write capacity scaling for this table
813
+ *
814
+ * @returns An object to configure additional AutoScaling settings for this attribute
815
+ */
694
816
  autoScaleWriteCapacity(props) {
695
817
  if (this.tableScaling.scalableWriteAttribute) {
696
818
  throw new errors_1.ValidationError("Write AutoScaling already enabled for this table", this);
@@ -710,6 +832,11 @@ class Table extends TableBase {
710
832
  // For TF, this dependency is implicit if the provider handles it, or might need explicit dependsOn if issues arise.
711
833
  return this.tableScaling.scalableWriteAttribute;
712
834
  }
835
+ /**
836
+ * Enable read capacity scaling for the given GSI
837
+ *
838
+ * @returns An object to configure additional AutoScaling settings for this attribute
839
+ */
713
840
  autoScaleGlobalSecondaryIndexReadCapacity(indexName, props) {
714
841
  if (this.billingMode === shared_1.BillingMode.PAY_PER_REQUEST) {
715
842
  throw new errors_1.ValidationError("AutoScaling is not available for tables with PAY_PER_REQUEST billing mode", this);
@@ -729,6 +856,11 @@ class Table extends TableBase {
729
856
  ...props,
730
857
  }));
731
858
  }
859
+ /**
860
+ * Enable write capacity scaling for the given GSI
861
+ *
862
+ * @returns An object to configure additional AutoScaling settings for this attribute
863
+ */
732
864
  autoScaleGlobalSecondaryIndexWriteCapacity(indexName, props) {
733
865
  if (this.billingMode === shared_1.BillingMode.PAY_PER_REQUEST) {
734
866
  throw new errors_1.ValidationError("AutoScaling is not available for tables with PAY_PER_REQUEST billing mode", this);
@@ -748,6 +880,11 @@ class Table extends TableBase {
748
880
  ...props,
749
881
  }));
750
882
  }
883
+ /**
884
+ * Get schema attributes of table or index.
885
+ *
886
+ * @returns Schema of table or index.
887
+ */
751
888
  schema(indexName) {
752
889
  if (!indexName) {
753
890
  return {
@@ -761,6 +898,11 @@ class Table extends TableBase {
761
898
  }
762
899
  return schema;
763
900
  }
901
+ /**
902
+ * Validate the table construct.
903
+ *
904
+ * @returns an array of validation error message
905
+ */
764
906
  validateTable() {
765
907
  const errors = new Array();
766
908
  if (!this.tablePartitionKey) {
@@ -784,6 +926,11 @@ class Table extends TableBase {
784
926
  }
785
927
  return errors;
786
928
  }
929
+ /**
930
+ * Validate read and write capacity are not specified for on-demand tables (billing mode PAY_PER_REQUEST).
931
+ *
932
+ * @param props read and write capacity properties
933
+ */
787
934
  validateProvisioning(props) {
788
935
  if (this.billingMode === shared_1.BillingMode.PAY_PER_REQUEST) {
789
936
  if (props.readCapacity !== undefined ||
@@ -800,15 +947,27 @@ class Table extends TableBase {
800
947
  }
801
948
  }
802
949
  }
950
+ /**
951
+ * Validate index name to check if a duplicate name already exists.
952
+ *
953
+ * @param indexName a name of global or local secondary index
954
+ */
803
955
  validateIndexName(indexName) {
804
956
  if (this.secondaryIndexSchemas.has(indexName)) {
805
957
  throw new errors_1.ValidationError(`A duplicate index name, ${indexName}, is not allowed`, this);
806
958
  }
807
959
  }
960
+ /**
961
+ * Validate non-key attributes by checking limits within secondary index, which may vary in future.
962
+ *
963
+ * @param nonKeyAttributes a list of non-key attribute names
964
+ */
808
965
  validateNonKeyAttributes(nonKeyAttributes) {
809
966
  if (this.nonKeyAttributes.size + nonKeyAttributes.length > 100) {
967
+ // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-secondary-indexes
810
968
  throw new RangeError("A maximum number of nonKeyAttributes across all of secondary indexes is 100");
811
969
  }
970
+ // store all non-key attributes
812
971
  nonKeyAttributes.forEach((att) => this.nonKeyAttributes.add(att));
813
972
  }
814
973
  renderPointInTimeRecovery(props) {
@@ -817,18 +976,26 @@ class Table extends TableBase {
817
976
  throw new errors_1.ValidationError("`pointInTimeRecoverySpecification` and `pointInTimeRecovery` are set. Use `pointInTimeRecoverySpecification` only.", this);
818
977
  }
819
978
  const spec = props.pointInTimeRecoverySpecification;
820
- if (spec?.recoveryPeriodInDays) {
821
- // TODO: Upgrade provider to 5.98.0 to support recoveryPeriodInDays
822
- cdktf_1.Annotations.of(this).addWarning("Warning: recoveryPeriodInDays is not supported until provider aws is upgraded to 5.98.0 and will be ignored.");
979
+ const recoveryPeriodInDays = spec?.recoveryPeriodInDays;
980
+ if (!spec?.pointInTimeRecoveryEnabled && recoveryPeriodInDays) {
981
+ throw new errors_1.ValidationError("Cannot set `recoveryPeriodInDays` while `pointInTimeRecoveryEnabled` is set to false.", this);
982
+ }
983
+ if (recoveryPeriodInDays !== undefined &&
984
+ (recoveryPeriodInDays < 1 || recoveryPeriodInDays > 35)) {
985
+ throw new errors_1.ValidationError("`recoveryPeriodInDays` must be a value between `1` and `35`.", this);
823
986
  }
824
987
  const enabled = spec?.pointInTimeRecoveryEnabled ?? props.pointInTimeRecovery;
825
988
  if (enabled === undefined)
826
989
  return undefined;
827
- return { enabled };
990
+ return { enabled, recoveryPeriodInDays };
991
+ }
992
+ renderContributorInsights(props) {
993
+ return (0, shared_1.validateContributorInsights)(props.contributorInsightsEnabled, props.contributorInsightsSpecification, "contributorInsightsEnabled", this);
828
994
  }
829
995
  buildIndexProjection(props) {
830
996
  if (props.projectionType === shared_1.ProjectionType.INCLUDE &&
831
997
  !props.nonKeyAttributes) {
998
+ // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-projectionobject.html
832
999
  throw new errors_1.ValidationError(`Non-key attributes should be specified when using ${shared_1.ProjectionType.INCLUDE} projection type`, this);
833
1000
  }
834
1001
  if (props.projectionType !== shared_1.ProjectionType.INCLUDE &&
@@ -858,6 +1025,11 @@ class Table extends TableBase {
858
1025
  // For the main table, hashKey and rangeKey are set directly on the resource.
859
1026
  // For GSIs/LSIs, they are part of their respective blocks.
860
1027
  }
1028
+ /**
1029
+ * Register the key attribute of table or secondary index to assemble attribute definitions of TableResourceProps.
1030
+ *
1031
+ * @param attribute the key attribute of table or secondary index
1032
+ */
861
1033
  registerAttribute(attribute) {
862
1034
  const existingDef = this.attributeDefinitionsInternal.find((def) => def.name === attribute.name);
863
1035
  if (existingDef && existingDef.type !== attribute.type) {
@@ -918,11 +1090,18 @@ class Table extends TableBase {
918
1090
  regionName: region,
919
1091
  }));
920
1092
  }
1093
+ /**
1094
+ * Whether this table has indexes
1095
+ */
921
1096
  get hasIndex() {
922
1097
  return (this.globalSecondaryIndexesInternal.length +
923
1098
  this.localSecondaryIndexesInternal.length >
924
1099
  0);
925
1100
  }
1101
+ /**
1102
+ * Set up key properties and return the Table encryption property from the
1103
+ * user's configuration.
1104
+ */
926
1105
  parseEncryption(props) {
927
1106
  let encryptionType = props.encryption;
928
1107
  if (encryptionType != null && props.serverSideEncryption != null) {
@@ -934,10 +1113,12 @@ class Table extends TableBase {
934
1113
  if (encryptionType === undefined) {
935
1114
  encryptionType =
936
1115
  props.encryptionKey != null
937
- ? shared_1.TableEncryption.CUSTOMER_MANAGED
938
- : props.serverSideEncryption
939
- ? shared_1.TableEncryption.AWS_MANAGED
940
- : undefined;
1116
+ ? // If there is a configured encryptionKey, the encryption is implicitly CUSTOMER_MANAGED
1117
+ shared_1.TableEncryption.CUSTOMER_MANAGED
1118
+ : // Otherwise, if severSideEncryption is enabled, it's AWS_MANAGED; else undefined (do not set anything)
1119
+ props.serverSideEncryption
1120
+ ? shared_1.TableEncryption.AWS_MANAGED
1121
+ : undefined;
941
1122
  }
942
1123
  if (encryptionType !== shared_1.TableEncryption.CUSTOMER_MANAGED &&
943
1124
  props.encryptionKey) {
@@ -996,8 +1177,29 @@ class Table extends TableBase {
996
1177
  },
997
1178
  };
998
1179
  }
1180
+ /**
1181
+ * Adds resource to the Terraform JSON output at Synth time.
1182
+ *
1183
+ * called by TerraformStack.prepareStack()
1184
+ */
1185
+ toTerraform() {
1186
+ /**
1187
+ * A preparing resolve might add new resources to the stack
1188
+ */
1189
+ for (const gsi of this.globalSecondaryIndexesInternal) {
1190
+ if (gsi.contributorInsightsSpecification?.enabled) {
1191
+ new provider_aws_1.dynamodbContributorInsights.DynamodbContributorInsights(this, "ContributorInsights", {
1192
+ tableName: this.tableName,
1193
+ indexName: gsi.name,
1194
+ mode: gsi.contributorInsightsSpecification?.mode,
1195
+ });
1196
+ delete gsi.contributorInsightsSpecification;
1197
+ }
1198
+ }
1199
+ return {};
1200
+ }
999
1201
  }
1000
1202
  exports.Table = Table;
1001
1203
  _c = JSII_RTTI_SYMBOL_1;
1002
- Table[_c] = { fqn: "terraconstructs.aws.storage.Table", version: "0.2.1" };
1003
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL3N0b3JhZ2UvdGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RkFBOEY7QUFFOUYsc0RBSzZCO0FBQzdCLGlDQUFpRDtBQUdqRCwwQkFBOEU7QUFDOUUsMkZBQXNFO0FBQ3RFLDBDQUEwQztBQUsxQyx5RUFBb0U7QUFDcEUscUNBY2tCO0FBQ2xCLHlDQUF3RTtBQUN4RSw0Q0FBNEM7QUFDNUMseUNBQXlDO0FBQ3pDLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFFOUIsNERBQTREO0FBQzVELHFHQUFxRztBQUNyRyw2Q0FBNkM7QUFFN0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBQzdCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUUvQixNQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQW1CMUM7O0dBRUc7QUFDSCxJQUFZLG9CQWVYO0FBZkQsV0FBWSxvQkFBb0I7SUFDOUI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQWZXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBZS9CO0FBZ0NEOztHQUVHO0FBQ0gsTUFBc0IsV0FBVztJQUMvQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEtBQU0sU0FBUSxXQUFXO1lBQzVCLE9BQU87Z0JBSVosT0FBTztvQkFDTCxXQUFXLEVBQUUsZUFBZTtpQkFDN0IsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxHQUFHO1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFdBQVc7WUFDNUIsT0FBTztnQkFJWixPQUFPO29CQUNMLFdBQVcsRUFBRSxLQUFLO2lCQUNu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QixDQUFDLGtCQUFrQjtZQUMxRCxvQkFBb0IsRUFBRSxZQUFZLENBQUMsZUFBZTtZQUNsRCxjQUFjLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDdEMsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7YUFDbEM7U0FDRixDQUFDO0lBQ0osQ0FBQzs7QUFsN0JILHNCQW03QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xODYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtZHluYW1vZGIvbGliL3RhYmxlLnRzXG5cbmltcG9ydCB7XG4gIGR5bmFtb2RiQ29udHJpYnV0b3JJbnNpZ2h0cyxcbiAgZHluYW1vZGJLaW5lc2lzU3RyZWFtaW5nRGVzdGluYXRpb24sXG4gIGR5bmFtb2RiUmVzb3VyY2VQb2xpY3ksXG4gIGR5bmFtb2RiVGFibGUsXG59IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBUb2tlbiwgTGF6eSwgQW5ub3RhdGlvbnMgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBzdG9yYWdlIGZyb20gXCIuXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQsIEF3c0NvbnN0cnVjdEJhc2UsIEF3c0NvbnN0cnVjdFByb3BzLCBBd3NTdGFjayB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgRHluYW1vREJNZXRyaWNzIH0gZnJvbSBcIi4vZHluYW1vZGItY2FubmVkLW1ldHJpY3MuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgKiBhcyBwZXJtcyBmcm9tIFwiLi9keW5hbW9kYi1wZXJtc1wiO1xuaW1wb3J0IHtcbiAgRW5hYmxlU2NhbGluZ1Byb3BzLFxuICBJU2NhbGFibGVUYWJsZUF0dHJpYnV0ZSxcbn0gZnJvbSBcIi4vc2NhbGFibGUtYXR0cmlidXRlLWFwaVwiO1xuaW1wb3J0IHsgU2NhbGFibGVUYWJsZUF0dHJpYnV0ZSB9IGZyb20gXCIuL3NjYWxhYmxlLXRhYmxlLWF0dHJpYnV0ZVwiO1xuaW1wb3J0IHtcbiAgT3BlcmF0aW9uLFxuICBPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgU3lzdGVtRXJyb3JzRm9yT3BlcmF0aW9uc01ldHJpY09wdGlvbnMsXG4gIEF0dHJpYnV0ZSxcbiAgQmlsbGluZ01vZGUsXG4gIFByb2plY3Rpb25UeXBlLFxuICBJVGFibGUsXG4gIFNlY29uZGFyeUluZGV4UHJvcHMsXG4gIFRhYmxlQ2xhc3MsXG4gIExvY2FsU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgVGFibGVFbmNyeXB0aW9uLFxuICBTdHJlYW1WaWV3VHlwZSxcbiAgUG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb24sXG59IGZyb20gXCIuL3NoYXJlZFwiO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSBcIi4uL2Nsb3Vkd2F0Y2hcIjtcbmltcG9ydCAqIGFzIGFwcHNjYWxpbmcgZnJvbSBcIi4uL2NvbXB1dGVcIjtcbmltcG9ydCAqIGFzIGttcyBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcbmltcG9ydCAqIGFzIGtpbmVzaXMgZnJvbSBcIi4uL25vdGlmeVwiO1xuLy8gTWlzc2luZyBpbiBUZXJyYWZvcm0gRHluYW1vRGIgUmVwbGljYSBDb25maWd1cmF0aW9uIGJsb2NrXG4vLyBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg4LjAvZG9jcy9yZXNvdXJjZXMvZHluYW1vZGJfdGFibGUjcmVwbGljYVxuLy8gaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiLi4vLi4vZHVyYXRpb25cIjtcblxuY29uc3QgSEFTSF9LRVlfVFlQRSA9IFwiSEFTSFwiO1xuY29uc3QgUkFOR0VfS0VZX1RZUEUgPSBcIlJBTkdFXCI7XG5cbmNvbnN0IE1BWF9MT0NBTF9TRUNPTkRBUllfSU5ERVhfQ09VTlQgPSA1O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHRhYmxlIHNjaGVtYSBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYU9wdGlvbnMge1xuICAvKipcbiAgICogUGFydGl0aW9uIGtleSBhdHRyaWJ1dGUgZGVmaW5pdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbktleTogQXR0cmlidXRlO1xuXG4gIC8qKlxuICAgKiBTb3J0IGtleSBhdHRyaWJ1dGUgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgbm8gc29ydCBrZXlcbiAgICovXG4gIHJlYWRvbmx5IHNvcnRLZXk/OiBBdHRyaWJ1dGU7XG59XG5cbi8qKlxuICogVHlwZSBvZiBjb21wcmVzc2lvbiB0byB1c2UgZm9yIGltcG9ydGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBlbnVtIElucHV0Q29tcHJlc3Npb25UeXBlIHtcbiAgLyoqXG4gICAqIEdaSVAgY29tcHJlc3Npb24uXG4gICAqL1xuICBHWklQID0gXCJHWklQXCIsXG5cbiAgLyoqXG4gICAqIFpTVEQgY29tcHJlc3Npb24uXG4gICAqL1xuICBaU1REID0gXCJaU1REXCIsXG5cbiAgLyoqXG4gICAqIE5vIGNvbXByZXNzaW9uLlxuICAgKi9cbiAgTk9ORSA9IFwiTk9ORVwiLFxufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciBpbXBvcnRlZCBzb3VyY2UgZmlsZXMgaW4gQ1NWIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDc3ZPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkZWxpbWl0ZXIgdXNlZCBmb3Igc2VwYXJhdGluZyBpdGVtcyBpbiB0aGUgQ1NWIGZpbGUgYmVpbmcgaW1wb3J0ZWQuXG4gICAqXG4gICAqIFZhbGlkIGRlbGltaXRlcnMgYXJlIGFzIGZvbGxvd3M6XG4gICAqIC0gY29tbWEgKGAsYClcbiAgICogLSB0YWIgKGBcXHRgKVxuICAgKiAtIGNvbG9uIChgOmApXG4gICAqIC0gc2VtaWNvbG9uIChgO2ApXG4gICAqIC0gcGlwZSAoYHxgKVxuICAgKiAtIHNwYWNlIChgIGApXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGNvbW1hIGFzIGEgZGVsaW1pdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVsaW1pdGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBoZWFkZXJzIHVzZWQgdG8gc3BlY2lmeSBhIGNvbW1vbiBoZWFkZXIgZm9yIGFsbCBzb3VyY2UgQ1NWIGZpbGVzIGJlaW5nIGltcG9ydGVkLlxuICAgKlxuICAgKiAqKk5PVEUqKjogSWYgdGhpcyBmaWVsZCBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgbGluZSBvZiBlYWNoIENTViBmaWxlIGlzIHRyZWF0ZWQgYXMgZGF0YSBpbnN0ZWFkIG9mIHRoZSBoZWFkZXIuXG4gICAqIElmIHRoaXMgZmllbGQgaXMgbm90IHNwZWNpZmllZCB0aGUgdGhlIGZpcnN0IGxpbmUgb2YgZWFjaCBDU1YgZmlsZSBpcyB0cmVhdGVkIGFzIHRoZSBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIENTViBmaWxlIGlzIHRyZWF0ZWQgYXMgdGhlIGhlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyTGlzdD86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBmb3JtYXQgb2YgdGhlIHNvdXJjZSBkYXRhLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5wdXRGb3JtYXQge1xuICAvKipcbiAgICogRHluYW1vREIgSlNPTiBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGR5bmFtb0RCSnNvbigpOiBJbnB1dEZvcm1hdCB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnB1dEZvcm1hdCB7XG4gICAgICBwdWJsaWMgX3JlbmRlcigpOiBQaWNrPFxuICAgICAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICAgICAgXCJpbnB1dEZvcm1hdFwiIHwgXCJpbnB1dEZvcm1hdE9wdGlvbnNcIlxuICAgICAgPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXRGb3JtYXQ6IFwiRFlOQU1PREJfSlNPTlwiLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICAvKipcbiAgICogQW1hem9uIElvbiBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlvbigpOiBJbnB1dEZvcm1hdCB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnB1dEZvcm1hdCB7XG4gICAgICBwdWJsaWMgX3JlbmRlcigpOiBQaWNrPFxuICAgICAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICAgICAgXCJpbnB1dEZvcm1hdFwiIHwgXCJpbnB1dEZvcm1hdE9wdGlvbnNcIlxuICAgICAgPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXRGb3JtYXQ6IFwiSU9OXCIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU1YgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjc3Yob3B0aW9ucz86IENzdk9wdGlvbnMpOiBJbnB1dEZvcm1hdCB7XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucz8uZGVsaW1pdGVyICYmXG4gICAgICAoIXRoaXMudmFsaWRDc3ZEZWxpbWl0ZXJzLmluY2x1ZGVzKG9wdGlvbnMuZGVsaW1pdGVyKSB8fFxuICAgICAgICBvcHRpb25zLmRlbGltaXRlci5sZW5ndGggIT09IDEpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICBcIkRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlciBhbmQgb25lIG9mIHRoZSBmb2xsb3dpbmc6XCIsXG4gICAgICAgICAgYCR7dGhpcy5yZWFkYWJsZVZhbGlkQ3N2RGVsaW1pdGVycy5qb2luKFwiLCBcIil9LGAsXG4gICAgICAgICAgYGdvdCAnJHtvcHRpb25zLmRlbGltaXRlcn0nYCxcbiAgICAgICAgXS5qb2luKFwiIFwiKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnB1dEZvcm1hdCB7XG4gICAgICBwdWJsaWMgX3JlbmRlcigpOiBQaWNrPFxuICAgICAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICAgICAgXCJpbnB1dEZvcm1hdFwiIHwgXCJpbnB1dEZvcm1hdE9wdGlvbnNcIlxuICAgICAgPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXRGb3JtYXQ6IFwiQ1NWXCIsXG4gICAgICAgICAgaW5wdXRGb3JtYXRPcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBjc3Y6IHtcbiAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjogb3B0aW9ucz8uZGVsaW1pdGVyLFxuICAgICAgICAgICAgICAgICAgaGVhZGVyTGlzdDogb3B0aW9ucz8uaGVhZGVyTGlzdCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRDc3ZEZWxpbWl0ZXJzID0gW1wiLFwiLCBcIlxcdFwiLCBcIjpcIiwgXCI7XCIsIFwifFwiLCBcIiBcIl07XG4gIHByaXZhdGUgc3RhdGljIHJlYWRhYmxlVmFsaWRDc3ZEZWxpbWl0ZXJzID0gW1xuICAgIFwiY29tbWEgKCwpXCIsXG4gICAgXCJ0YWIgKFxcXFx0KVwiLFxuICAgIFwiY29sb24gKDopXCIsXG4gICAgXCJzZW1pY29sb24gKDspXCIsXG4gICAgXCJwaXBlICh8KVwiLFxuICAgIFwic3BhY2UgKCApXCIsXG4gIF07XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9yZW5kZXIoKTogUGljazxcbiAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICBcImlucHV0Rm9ybWF0XCIgfCBcImlucHV0Rm9ybWF0T3B0aW9uc1wiXG4gID47XG59XG5cbi8qKlxuICogIFByb3BlcnRpZXMgZm9yIGltcG9ydGluZyBkYXRhIGZyb20gdGhlIFMzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFNvdXJjZVNwZWNpZmljYXRpb24ge1xuICAvKipcbiAgICogVGhlIGNvbXByZXNzaW9uIHR5cGUgb2YgdGhlIGltcG9ydGVkIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IElucHV0Q29tcHJlc3Npb25UeXBlLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXByZXNzaW9uVHlwZT86IElucHV0Q29tcHJlc3Npb25UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBpbXBvcnRlZCBkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRGb3JtYXQ6IElucHV0Rm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHRoYXQgaXMgYmVpbmcgaW1wb3J0ZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIFMzIGJ1Y2tldCB0aGF0IGlzIGJlaW5nIGltcG9ydGVkIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE93bmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHByZWZpeCBzaGFyZWQgYnkgYWxsIFMzIE9iamVjdHMgdGhhdCBhcmUgYmVpbmcgaW1wb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGtleVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcHJlY2lzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgRHluYW1vREIgd3JpdGUgdGltZXN0YW1wcyB0aGF0IHdpbGwgYmUgcmVwbGljYXRlZCB0byBLaW5lc2lzLlxuICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgcmVjb3JkIHRpbWVzdGFtcCBwcmVjaXNpb24gaXMgbWljcm9zZWNvbmRzLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHNldHRpbmcgYXQgYW55IHRpbWUuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLWtpbmVzaXNzdHJlYW1zcGVjaWZpY2F0aW9uLmh0bWwjYXdzLXByb3BlcnRpZXMtZHluYW1vZGItdGFibGUta2luZXNpc3N0cmVhbXNwZWNpZmljYXRpb24tcHJvcGVydGllc1xuICovXG5leHBvcnQgZW51bSBBcHByb3hpbWF0ZUNyZWF0aW9uRGF0ZVRpbWVQcmVjaXNpb24ge1xuICAvKipcbiAgICogTWlsbGlzZWNvbmQgcHJlY2lzaW9uXG4gICAqL1xuICBNSUxMSVNFQ09ORCA9IFwiTUlMTElTRUNPTkRcIixcblxuICAvKipcbiAgICogTWljcm9zZWNvbmQgcHJlY2lzaW9uXG4gICAqL1xuICBNSUNST1NFQ09ORCA9IFwiTUlDUk9TRUNPTkRcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbW9kYlRhYmxlUmVwbGljYSB7XG4gIC8qKiAoT3B0aW9uYWwpIEFSTiBvZiB0aGUgQ01LIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBBV1MgS01TIGVuY3J5cHRpb24uIFRoaXMgYXJndW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUga2V5IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IEtNUy1tYW5hZ2VkIER5bmFtb0RCIGtleSwgYGFsaWFzL2F3cy9keW5hbW9kYmAuICoqTm90ZToqKiBUaGlzIGF0dHJpYnV0ZSB3aWxsIF9ub3RfIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBBUk4gb2YgX2RlZmF1bHRfIGtleXMuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcbiAgLyoqIChPcHRpb25hbCkgV2hldGhlciB0byBlbmFibGUgUG9pbnQgSW4gVGltZSBSZWNvdmVyeSBmb3IgdGhlIHJlcGxpY2EuIERlZmF1bHQgaXMgYGZhbHNlYC4gKi9cbiAgcmVhZG9ubHkgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIC8qKiAoT3B0aW9uYWwpIFdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSBnbG9iYWwgdGFibGUncyB0YWdzIHRvIGEgcmVwbGljYS4gRGVmYXVsdCBpcyBgZmFsc2VgLiBDaGFuZ2VzIHRvIHRhZ3Mgb25seSBtb3ZlIGluIG9uZSBkaXJlY3Rpb246IGZyb20gZ2xvYmFsIChzb3VyY2UpIHRvIHJlcGxpY2EuIEluIG90aGVyIHdvcmRzLCB0YWcgZHJpZnQgb24gYSByZXBsaWNhIHdpbGwgbm90IHRyaWdnZXIgYW4gdXBkYXRlLiBUYWcgb3IgcmVwbGljYSBjaGFuZ2VzIG9uIHRoZSBnbG9iYWwgdGFibGUsIHdoZXRoZXIgZnJvbSBkcmlmdCBvciBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFyZSBwcm9wYWdhdGVkIHRvIHJlcGxpY2FzLiBDaGFuZ2luZyBmcm9tIGB0cnVlYCB0byBgZmFsc2VgIG9uIGEgc3Vic2VxdWVudCBgYXBwbHlgIG1lYW5zIHJlcGxpY2EgdGFncyBhcmUgbGVmdCBhcyB0aGV5IHdlcmUsIHVubWFuYWdlZCwgbm90IGRlbGV0ZWQuICovXG4gIHJlYWRvbmx5IHByb3BhZ2F0ZVRhZ3M/OiBib29sZWFuO1xuICAvKiogKFJlcXVpcmVkKSBSZWdpb24gbmFtZSBvZiB0aGUgcmVwbGljYS4gKi9cbiAgcmVhZG9ubHkgcmVnaW9uTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBEeW5hbW9EQiBUYWJsZVxuICpcbiAqIFVzZSBgVGFibGVQcm9wc2AgZm9yIGFsbCB0YWJsZSBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVPcHRpb25zIGV4dGVuZHMgU2NoZW1hT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgcmVhZCBjYXBhY2l0eSBmb3IgdGhlIHRhYmxlLiBDYXJlZnVsIGlmIHlvdSBhZGQgR2xvYmFsIFNlY29uZGFyeSBJbmRleGVzLCBhc1xuICAgKiB0aG9zZSB3aWxsIHNoYXJlIHRoZSB0YWJsZSdzIHByb3Zpc2lvbmVkIHRocm91Z2hwdXQuXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIGJpbGxpbmdNb2RlIGlzIFByb3Zpc2lvbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgd3JpdGUgY2FwYWNpdHkgZm9yIHRoZSB0YWJsZS4gQ2FyZWZ1bCBpZiB5b3UgYWRkIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhlcywgYXNcbiAgICogdGhvc2Ugd2lsbCBzaGFyZSB0aGUgdGFibGUncyBwcm92aXNpb25lZCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBDYW4gb25seSBiZSBwcm92aWRlZCBpZiBiaWxsaW5nTW9kZSBpcyBQcm92aXNpb25lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gcmVhZCByZXF1ZXN0IHVuaXRzIGZvciB0aGUgdGFibGUuIENhcmVmdWwgaWYgeW91IGFkZCBHbG9iYWwgU2Vjb25kYXJ5IEluZGV4ZXMsIGFzXG4gICAqIHRob3NlIHdpbGwgc2hhcmUgdGhlIHRhYmxlJ3MgbWF4aW11bSBvbi1kZW1hbmQgdGhyb3VnaHB1dC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhSZWFkUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHdyaXRlIHJlcXVlc3QgdW5pdHMgZm9yIHRoZSB0YWJsZS4gQ2FyZWZ1bCBpZiB5b3UgYWRkIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhlcywgYXNcbiAgICogdGhvc2Ugd2lsbCBzaGFyZSB0aGUgdGFibGUncyBtYXhpbXVtIG9uLWRlbWFuZCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBDYW4gb25seSBiZSBwcm92aWRlZCBpZiBiaWxsaW5nTW9kZSBpcyBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gb24tZGVtYW5kIHRocm91Z2hwdXQgaXMgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IG1heFdyaXRlUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGhvdyB5b3UgYXJlIGNoYXJnZWQgZm9yIHJlYWQgYW5kIHdyaXRlIHRocm91Z2hwdXQgYW5kIGhvdyB5b3UgbWFuYWdlIGNhcGFjaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBQUk9WSVNJT05FRCBpZiBgcmVwbGljYXRpb25SZWdpb25zYCBpcyBub3Qgc3BlY2lmaWVkLCBQQVlfUEVSX1JFUVVFU1Qgb3RoZXJ3aXNlXG4gICAqL1xuICByZWFkb25seSBiaWxsaW5nTW9kZT86IEJpbGxpbmdNb2RlO1xuXG4gIC8vIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9pc3N1ZXMvNDMxNDJcbiAgLy8gcmVhZG9ubHkgd2FybVRocm91Z2hwdXQ/OiBXYXJtVGhyb3VnaHB1dDtcblxuICAvKipcbiAgICogV2hldGhlciBwb2ludC1pbi10aW1lIHJlY292ZXJ5IGlzIGVuYWJsZWQuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgcG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb25gIGluc3RlYWRcbiAgICogQGRlZmF1bHQgZmFsc2UgLSBwb2ludCBpbiB0aW1lIHJlY292ZXJ5IGlzIG5vdCBlbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcG9pbnQtaW4tdGltZSByZWNvdmVyeSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBvaW50IGluIHRpbWUgcmVjb3ZlcnkgaXMgbm90IGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbj86IFBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhbiBBV1MgbWFuYWdlZCBjdXN0b21lciBtYXN0ZXIga2V5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHNldCBpZiBgZW5jcnlwdGlvbmAgYW5kL29yIGBlbmNyeXB0aW9uS2V5YCBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHRhYmxlIGlzIGVuY3J5cHRlZCB3aXRoIGFuIGVuY3J5cHRpb24ga2V5IG1hbmFnZWQgYnkgRHluYW1vREIsIGFuZCB5b3UgYXJlIG5vdCBjaGFyZ2VkIGFueSBmZWUgZm9yIHVzaW5nIGl0LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIEluIG9yZGVyIHRvIG9idGFpbiB0aGUgc2FtZSBiZWhhdmlvciBhc1xuICAgKiBlbmFibGluZyB0aGlzLCBzZXQgdGhlIGBlbmNyeXB0aW9uYCBwcm9wZXJ0eSB0byBgVGFibGVFbmNyeXB0aW9uLkFXU19NQU5BR0VEYCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyU2lkZUVuY3J5cHRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB0YWJsZSBjbGFzcy5cbiAgICogQGRlZmF1bHQgU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQ2xhc3M/OiBUYWJsZUNsYXNzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhbiBBV1MgbWFuYWdlZCBjdXN0b21lciBtYXN0ZXIga2V5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHNldCBpZiBgc2VydmVyU2lkZUVuY3J5cHRpb25gIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgdGFibGUgaXMgZW5jcnlwdGVkIHdpdGggYW4gZW5jcnlwdGlvbiBrZXkgbWFuYWdlZCBieSBEeW5hbW9EQiwgYW5kIHlvdSBhcmUgbm90IGNoYXJnZWQgYW55IGZlZSBmb3IgdXNpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogVGFibGVFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgdGFibGUgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBzZXQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRURgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIGBlbmNyeXB0aW9uYCBpcyBzZXQgdG8gYFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEYCBhbmQgdGhpc1xuICAgKiBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsIGEgbmV3IEtNUyBrZXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWJsZS5cbiAgICogSWYgYGVuY3J5cHRpb25gIGFuZCB0aGlzIHByb3BlcnR5IGFyZSBib3RoIHVuZGVmaW5lZCwgdGhlbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkIHdpdGhcbiAgICogYW4gZW5jcnlwdGlvbiBrZXkgbWFuYWdlZCBieSBEeW5hbW9EQiwgYW5kIHlvdSBhcmUgbm90IGNoYXJnZWQgYW55IGZlZSBmb3IgdXNpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIFRUTCBhdHRyaWJ1dGUuXG4gICAqIEBkZWZhdWx0IC0gVFRMIGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSB0aW1lVG9MaXZlQXR0cmlidXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGFuIGl0ZW0gaW4gdGhlIHRhYmxlIGlzIG1vZGlmaWVkLCBTdHJlYW1WaWV3VHlwZSBkZXRlcm1pbmVzIHdoYXQgaW5mb3JtYXRpb25cbiAgICogaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN0cmVhbXMgYXJlIGRpc2FibGVkIHVubGVzcyBgcmVwbGljYXRpb25SZWdpb25zYCBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbT86IFN0cmVhbVZpZXdUeXBlO1xuXG4gIC8qKlxuICAgKiBSZWdpb25zIHdoZXJlIHJlcGxpY2EgdGFibGVzIHdpbGwgYmUgY3JlYXRlZFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgcmVwbGljYVNwZWNpZmljYXRpb24gaW5zdGVhZFxuICAgKiBAZGVmYXVsdCAtIG5vIHJlcGxpY2EgdGFibGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhdGlvblJlZ2lvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHNwZWNpZmljYXRpb24gZm9yIHJlcGxpY2EgdGFibGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGljYVNwZWNpZmljYXRpb24/OiBEeW5hbW9kYlRhYmxlUmVwbGljYVtdO1xuXG4gIC8vIHJlYWRvbmx5IHJlcGxpY2F0aW9uVGltZW91dD86IER1cmF0aW9uOyAvLyBOb3QgZGlyZWN0bHkgYXBwbGljYWJsZSB0byBURidzIHJlcGxpY2EgYmxvY2sgY29uZmlndXJhdGlvblxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIENsb3VkV2F0Y2ggY29udHJpYnV0b3IgaW5zaWdodHMgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dG9ySW5zaWdodHNFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBkZWxldGlvbiBwcm90ZWN0aW9uIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWxldGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiBkYXRhIGJlaW5nIGltcG9ydGVkIGZyb20gdGhlIFMzIGJ1Y2tldCBzb3VyY2UgdG8gdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRhdGEgaW1wb3J0IGZyb20gdGhlIFMzIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0U291cmNlPzogSW1wb3J0U291cmNlU3BlY2lmaWNhdGlvbjtcblxuICAvKipcbiAgICogUmVzb3VyY2UgcG9saWN5IHRvIGFzc2lnbiB0byB0YWJsZS5cbiAgICogTm90ZTogYGF3c19keW5hbW9kYl90YWJsZWAgZG9lcyBub3QgZGlyZWN0bHkgc3VwcG9ydCBhIHJlc291cmNlIHBvbGljeSBwcm9wZXJ0eS5cbiAgICogVGhpcyBwb2xpY3kgd291bGQgbmVlZCB0byBiZSBtYW5hZ2VkIGFuZCBhcHBsaWVkIHNlcGFyYXRlbHksIGUuZy4sIHZpYSBgYXdzX2lhbV9wb2xpY3lgIGF0dGFjaGVkIHRvIHByaW5jaXBhbHMuXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVzb3VyY2UgcG9saWN5IHN0YXRlbWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBEeW5hbW9EQiBUYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlUHJvcHMgZXh0ZW5kcyBUYWJsZU9wdGlvbnMsIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIEVuZm9yY2VzIGEgcGFydGljdWxhciBwaHlzaWNhbCB0YWJsZSBuYW1lLlxuICAgKiBAZGVmYXVsdCA8Z2VuZXJhdGVkPlxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLaW5lc2lzIERhdGEgU3RyZWFtIHRvIGNhcHR1cmUgaXRlbS1sZXZlbCBjaGFuZ2VzIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gS2luZXNpcyBEYXRhIFN0cmVhbVxuICAgKi9cbiAgcmVhZG9ubHkga2luZXNpc1N0cmVhbT86IGtpbmVzaXMuSVN0cmVhbTtcblxuICAvKipcbiAgICogS2luZXNpcyBEYXRhIFN0cmVhbSBhcHByb3hpbWF0ZSBjcmVhdGlvbiB0aW1lc3RhbXAgcHJlY2lzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IEFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbi5NSUNST1NFQ09ORFxuICAgKi9cbiAgcmVhZG9ubHkga2luZXNpc1ByZWNpc2lvblRpbWVzdGFtcD86IEFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxTZWNvbmRhcnlJbmRleFByb3BzXG4gIGV4dGVuZHMgU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgICBTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSByZWFkIGNhcGFjaXR5IGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUHJvdmlzaW9uZWQgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZSBjYXBhY2l0eSBmb3IgdGhlIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXguXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIHRhYmxlIGJpbGxpbmdNb2RlIGlzIFByb3Zpc2lvbmVkIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gcmVhZCByZXF1ZXN0IHVuaXRzIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhSZWFkUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB3cml0ZSByZXF1ZXN0IHVuaXRzIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhXcml0ZVJlcXVlc3RVbml0cz86IG51bWJlcjtcblxuICAvLyBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1wcm92aWRlci1hd3MvaXNzdWVzLzQzMTQyXG4gIC8vIHJlYWRvbmx5IHdhcm1UaHJvdWdocHV0PzogV2FybVRocm91Z2hwdXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQ2xvdWRXYXRjaCBjb250cmlidXRvciBpbnNpZ2h0cyBpcyBlbmFibGVkIGZvciB0aGUgc3BlY2lmaWVkIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXguXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvckluc2lnaHRzRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgZHluYW1vZGIgdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGR5bmFtb2RiIHRhYmxlLlxuICAgKiBPbmUgb2YgdGhpcywgb3IgYHRhYmxlTmFtZWAsIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhYmxlIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZSBuYW1lIG9mIHRoZSBkeW5hbW9kYiB0YWJsZS5cbiAgICogT25lIG9mIHRoaXMsIG9yIGB0YWJsZUFybmAsIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhYmxlIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgdGFibGUncyBzdHJlYW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdGFibGUgc3RyZWFtXG4gICAqL1xuICByZWFkb25seSB0YWJsZVN0cmVhbUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogS01TIGVuY3J5cHRpb24ga2V5LCBpZiB0aGlzIHRhYmxlIHVzZXMgYSBjdXN0b21lci1tYW5hZ2VkIGVuY3J5cHRpb24ga2V5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGtleVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2xvYmFsIGluZGV4ZXMgc2V0IGZvciB0aGlzIFRhYmxlLlxuICAgKiBOb3RlIHRoYXQgeW91IG5lZWQgdG8gc2V0IGVpdGhlciB0aGlzIHByb3BlcnR5LFxuICAgKiBvciBgbG9jYWxJbmRleGVzYCxcbiAgICogaWYgeW91IHdhbnQgbWV0aG9kcyBsaWtlIGdyYW50UmVhZERhdGEoKVxuICAgKiB0byBncmFudCBwZXJtaXNzaW9ucyBmb3IgaW5kZXhlcyBhcyB3ZWxsIGFzIHRoZSB0YWJsZSBpdHNlbGYuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZ2xvYmFsIGluZGV4ZXNcbiAgICovXG4gIHJlYWRvbmx5IGdsb2JhbEluZGV4ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGxvY2FsIGluZGV4ZXMgc2V0IGZvciB0aGlzIFRhYmxlLlxuICAgKiBOb3RlIHRoYXQgeW91IG5lZWQgdG8gc2V0IGVpdGhlciB0aGlzIHByb3BlcnR5LFxuICAgKiBvciBgZ2xvYmFsSW5kZXhlc2AsXG4gICAqIGlmIHlvdSB3YW50IG1ldGhvZHMgbGlrZSBncmFudFJlYWREYXRhKClcbiAgICogdG8gZ3JhbnQgcGVybWlzc2lvbnMgZm9yIGluZGV4ZXMgYXMgd2VsbCBhcyB0aGUgdGFibGUgaXRzZWxmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxvY2FsIGluZGV4ZXNcbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsSW5kZXhlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZ3JhbnQgbWV0aG9kcyBhbHdheXMgZ3JhbnQgcGVybWlzc2lvbnMgZm9yIGFsbCBpbmRleGVzLlxuICAgKiBJZiBmYWxzZSBpcyBwcm92aWRlZCwgZ3JhbnQgbWV0aG9kcyBncmFudCB0aGUgcGVybWlzc2lvbnNcbiAgICogb25seSB3aGVuIGBnbG9iYWxJbmRleGVzYCBvciBgbG9jYWxJbmRleGVzYCBpcyBzcGVjaWZpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGdyYW50SW5kZXhQZXJtaXNzaW9ucz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZUJhc2VcbiAgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlXG4gIGltcGxlbWVudHMgSVRhYmxlLCBpYW0uSUF3c0NvbnN0cnVjdFdpdGhQb2xpY3lcbntcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlU3RyZWFtQXJuPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICBwdWJsaWMgYWJzdHJhY3QgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2lvbmFsQXJucyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0YWJsZUFybjogdGhpcy50YWJsZUFybixcbiAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICB0YWJsZVN0cmVhbUFybjogdGhpcy50YWJsZVN0cmVhbUFybixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gW1xuICAgICAgdGhpcy50YWJsZUFybixcbiAgICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiAodGhpcy5oYXNJbmRleCA/IGAke3RoaXMudGFibGVBcm59L2luZGV4LypgIDogdW5kZWZpbmVkKSxcbiAgICAgIH0pLFxuICAgICAgLi4udGhpcy5yZWdpb25hbEFybnMsXG4gICAgICAuLi50aGlzLnJlZ2lvbmFsQXJucy5tYXAoKGFybikgPT5cbiAgICAgICAgTGF6eS5zdHJpbmdWYWx1ZSh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT4gKHRoaXMuaGFzSW5kZXggPyBgJHthcm59L2luZGV4LypgIDogdW5kZWZpbmVkKSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIF07XG5cbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogcmVzb3VyY2VzLmZpbHRlcigocikgPT4gciAhPT0gdW5kZWZpbmVkKSxcbiAgICAgIHJlc291cmNlOiB0aGlzLCAvLyBHcmFudCB3aWxsIHRha2UgdGhlIHByaW5jaXBhbCBmcm9tIHRoZSBncmFudGVlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRTdHJlYW0oZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50IHtcbiAgICBpZiAoIXRoaXMudGFibGVTdHJlYW1Bcm4pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEeW5hbW9EQiBTdHJlYW1zIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgdGFibGUgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbdGhpcy50YWJsZVN0cmVhbUFybl0sXG4gICAgICBzY29wZTogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFJlYWREYXRhKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBjb25zdCB0YWJsZUFjdGlvbnMgPSBwZXJtcy5SRUFEX0RBVEFfQUNUSU9OU19UQUJMRV9TQUZFLmNvbmNhdChcbiAgICAgIHBlcm1zLkRFU0NSSUJFX1RBQkxFLFxuICAgICk7XG5cbiAgICAvLyBJZiBzdHJlYW1zIGFyZSBhdmFpbGFibGUsIGFsc28gZ3JhbnQgc3RyZWFtLXNwZWNpZmljIGFjdGlvbnNcbiAgICBpZiAodGhpcy50YWJsZVN0cmVhbUFybikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRHcmFudChncmFudGVlLCB7XG4gICAgICAgIGtleUFjdGlvbnM6IHBlcm1zLktFWV9SRUFEX0FDVElPTlMsXG4gICAgICAgIHRhYmxlQWN0aW9ucyxcbiAgICAgICAgc3RyZWFtQWN0aW9uczogcGVybXMuUkVBRF9EQVRBX0FDVElPTlNfU1RSRUFNX09OTFksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZEdyYW50KGdyYW50ZWUsIHtcbiAgICAgIGtleUFjdGlvbnM6IHBlcm1zLktFWV9SRUFEX0FDVElPTlMsXG4gICAgICB0YWJsZUFjdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRUYWJsZUxpc3RTdHJlYW1zKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBpZiAoIXRoaXMudGFibGVTdHJlYW1Bcm4pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEeW5hbW9EQiBTdHJlYW1zIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgdGFibGUgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBbXCJkeW5hbW9kYjpMaXN0U3RyZWFtc1wiXSxcbiAgICAgIHJlc291cmNlQXJuczogW1wiKlwiXSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHRoaXMuZ3JhbnRUYWJsZUxpc3RTdHJlYW1zKGdyYW50ZWUpO1xuICAgIHJldHVybiB0aGlzLmNvbWJpbmVkR3JhbnQoZ3JhbnRlZSwge1xuICAgICAga2V5QWN0aW9uczogcGVybXMuS0VZX1JFQURfQUNUSU9OUyxcbiAgICAgIHN0cmVhbUFjdGlvbnM6IHBlcm1zLlJFQURfU1RSRUFNX0RBVEFfQUNUSU9OUyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFdyaXRlRGF0YShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgdGFibGVBY3Rpb25zID0gcGVybXMuV1JJVEVfREFUQV9BQ1RJT05TLmNvbmNhdChwZXJtcy5ERVNDUklCRV9UQUJMRSk7XG4gICAgY29uc3Qga2V5QWN0aW9ucyA9IHBlcm1zLktFWV9SRUFEX0FDVElPTlMuY29uY2F0KHBlcm1zLktFWV9XUklURV9BQ1RJT05TKTtcbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZEdyYW50KGdyYW50ZWUsIHsga2V5QWN0aW9ucywgdGFibGVBY3Rpb25zIH0pO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlRGF0YShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgdGFibGVBY3Rpb25zID0gcGVybXMuUkVBRF9EQVRBX0FDVElPTlMuY29uY2F0KFxuICAgICAgcGVybXMuV1JJVEVfREFUQV9BQ1RJT05TLFxuICAgICkuY29uY2F0KHBlcm1zLkRFU0NSSUJFX1RBQkxFKTtcbiAgICBjb25zdCBrZXlBY3Rpb25zID0gcGVybXMuS0VZX1JFQURfQUNUSU9OUy5jb25jYXQocGVybXMuS0VZX1dSSVRFX0FDVElPTlMpO1xuICAgIHJldHVybiB0aGlzLmNvbWJpbmVkR3JhbnQoZ3JhbnRlZSwgeyBrZXlBY3Rpb25zLCB0YWJsZUFjdGlvbnMgfSk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRGdWxsQWNjZXNzKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKSB7XG4gICAgY29uc3Qga2V5QWN0aW9ucyA9IHBlcm1zLktFWV9SRUFEX0FDVElPTlMuY29uY2F0KHBlcm1zLktFWV9XUklURV9BQ1RJT05TKTtcbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZEdyYW50KGdyYW50ZWUsIHtcbiAgICAgIGtleUFjdGlvbnMsXG4gICAgICB0YWJsZUFjdGlvbnM6IFtcImR5bmFtb2RiOipcIl0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQsXG4gICk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICBpZiAoIXRoaXMucmVzb3VyY2VQb2xpY3kpIHtcbiAgICAgIC8vIGVuc3VyZSBhIHBvbGljeSBleGlzdHMgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFibGVcbiAgICAgIHRoaXMucmVzb3VyY2VQb2xpY3kgPSBuZXcgaWFtLlBvbGljeURvY3VtZW50KHRoaXMsIFwiUG9saWN5XCIsIHtcbiAgICAgICAgc3RhdGVtZW50OiBbXSxcbiAgICAgIH0pO1xuICAgICAgbmV3IGR5bmFtb2RiUmVzb3VyY2VQb2xpY3kuRHluYW1vZGJSZXNvdXJjZVBvbGljeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJQb2xpY3lBdHRhY2htZW50XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBwb2xpY3k6IHRoaXMucmVzb3VyY2VQb2xpY3kuanNvbixcbiAgICAgICAgICByZXNvdXJjZUFybjogdGhpcy50YWJsZUFybixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVzb3VyY2VQb2xpY3kuYWRkU3RhdGVtZW50cyhzdGF0ZW1lbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZW1lbnRBZGRlZDogdHJ1ZSxcbiAgICAgIHBvbGljeURlcGVuZGFibGU6IHRoaXMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWMoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBuYW1lc3BhY2U6IFwiQVdTL0R5bmFtb0RCXCIsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLmF0dGFjaFRvKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0NvbnN1bWVkUmVhZENhcGFjaXR5VW5pdHMoXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5jYW5uZWRNZXRyaWMoXG4gICAgICBEeW5hbW9EQk1ldHJpY3MuY29uc3VtZWRSZWFkQ2FwYWNpdHlVbml0c1N1bSxcbiAgICAgIHByb3BzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljQ29uc3VtZWRXcml0ZUNhcGFjaXR5VW5pdHMoXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5jYW5uZWRNZXRyaWMoXG4gICAgICBEeW5hbW9EQk1ldHJpY3MuY29uc3VtZWRXcml0ZUNhcGFjaXR5VW5pdHNTdW0sXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBgbWV0cmljU3lzdGVtRXJyb3JzRm9yT3BlcmF0aW9uc2AuICovXG4gIHB1YmxpYyBtZXRyaWNTeXN0ZW1FcnJvcnMoXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICBpZiAoIXByb3BzPy5kaW1lbnNpb25zTWFwPy5PcGVyYXRpb24pIHtcbiAgICAgIC8vICdPcGVyYXRpb24nIG11c3QgYmUgcGFzc2VkIGJlY2F1c2UgaXRzIGFuIG9wZXJhdGlvbmFsIG1ldHJpYy5cbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiJ09wZXJhdGlvbicgZGltZW5zaW9uIG11c3QgYmUgcGFzc2VkIGZvciB0aGUgJ1N5c3RlbUVycm9ycycgbWV0cmljLlwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb25zTWFwID0ge1xuICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIC4uLnByb3BzPy5kaW1lbnNpb25zTWFwLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJTeXN0ZW1FcnJvcnNcIiwge1xuICAgICAgc3RhdGlzdGljOiBcInN1bVwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1VzZXJFcnJvcnMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgaWYgKHByb3BzPy5kaW1lbnNpb25zTWFwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIidkaW1lbnNpb25zTWFwJyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgJ1VzZXJFcnJvcnMnIG1ldHJpY1wiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVXNlckVycm9yc1wiLCB7XG4gICAgICBzdGF0aXN0aWM6IFwic3VtXCIsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHt9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0NvbmRpdGlvbmFsQ2hlY2tGYWlsZWRSZXF1ZXN0cyhcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRSZXF1ZXN0c1wiLCB7XG4gICAgICBzdGF0aXN0aWM6IFwic3VtXCIsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24uIEl0IHJldHVybnMgYW4gaW52YWxpZCBtZXRyaWMuIFVzZSBgbWV0cmljVGhyb3R0bGVkUmVxdWVzdHNGb3JPcGVyYXRpb25gIGluc3RlYWQuICovXG4gIHB1YmxpYyBtZXRyaWNUaHJvdHRsZWRSZXF1ZXN0cyhcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlRocm90dGxlZFJlcXVlc3RzXCIsIHsgc3RhdGlzdGljOiBcInN1bVwiLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNTdWNjZXNzZnVsUmVxdWVzdExhdGVuY3koXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICBpZiAoIXByb3BzPy5kaW1lbnNpb25zTWFwPy5PcGVyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiJ09wZXJhdGlvbicgZGltZW5zaW9uIG11c3QgYmUgcGFzc2VkIGZvciB0aGUgJ1N1Y2Nlc3NmdWxSZXF1ZXN0TGF0ZW5jeScgbWV0cmljLlwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb25zTWFwID0ge1xuICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIE9wZXJhdGlvbjogcHJvcHMuZGltZW5zaW9uc01hcC5PcGVyYXRpb24sXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgLi4uRHluYW1vREJNZXRyaWNzLnN1Y2Nlc3NmdWxSZXF1ZXN0TGF0ZW5jeUF2ZXJhZ2UoZGltZW5zaW9uc01hcCksXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRpbWVuc2lvbnNNYXAsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljVGhyb3R0bGVkUmVxdWVzdHNGb3JPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIC4uLkR5bmFtb0RCTWV0cmljcy50aHJvdHRsZWRSZXF1ZXN0c1N1bSh7XG4gICAgICAgIE9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgfSksXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNUaHJvdHRsZWRSZXF1ZXN0c0Zvck9wZXJhdGlvbnMoXG4gICAgcHJvcHM/OiBPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5JTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5zdW1NZXRyaWNzRm9yT3BlcmF0aW9ucyhcbiAgICAgIFwiVGhyb3R0bGVkUmVxdWVzdHNcIixcbiAgICAgIFwiU3VtIG9mIHRocm90dGxlZCByZXF1ZXN0cyBhY3Jvc3MgYWxsIG9wZXJhdGlvbnNcIixcbiAgICAgIHByb3BzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljU3lzdGVtRXJyb3JzRm9yT3BlcmF0aW9ucyhcbiAgICBwcm9wcz86IFN5c3RlbUVycm9yc0Zvck9wZXJhdGlvbnNNZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLklNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLnN1bU1ldHJpY3NGb3JPcGVyYXRpb25zKFxuICAgICAgXCJTeXN0ZW1FcnJvcnNcIixcbiAgICAgIFwiU3VtIG9mIGVycm9ycyBhY3Jvc3MgYWxsIG9wZXJhdGlvbnNcIixcbiAgICAgIHByb3BzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN1bU1ldHJpY3NGb3JPcGVyYXRpb25zKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBleHByZXNzaW9uTGFiZWw6IHN0cmluZyxcbiAgICBwcm9wcz86IE9wZXJhdGlvbnNNZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLklNZXRyaWMge1xuICAgIGlmIChwcm9wcz8uZGltZW5zaW9uc01hcD8uT3BlcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlRoZSBPcGVyYXRpb24gZGltZW5zaW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSB0aGUgJ29wZXJhdGlvbnMnIHByb3BlcnR5LlwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVyYXRpb25zID0gcHJvcHM/Lm9wZXJhdGlvbnMgPz8gT2JqZWN0LnZhbHVlcyhPcGVyYXRpb24pO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuY3JlYXRlTWV0cmljc0Zvck9wZXJhdGlvbnMobWV0cmljTmFtZSwgb3BlcmF0aW9ucywge1xuICAgICAgc3RhdGlzdGljOiBcInN1bVwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24oe1xuICAgICAgZXhwcmVzc2lvbjogYCR7T2JqZWN0LmtleXModmFsdWVzKS5qb2luKFwiICsgXCIpfWAsXG4gICAgICB1c2luZ01ldHJpY3M6IHsgLi4udmFsdWVzIH0sXG4gICAgICBjb2xvcjogcHJvcHM/LmNvbG9yLFxuICAgICAgbGFiZWw6IGV4cHJlc3Npb25MYWJlbCxcbiAgICAgIHBlcmlvZDogcHJvcHM/LnBlcmlvZCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWV0cmljc0Zvck9wZXJhdGlvbnMoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdLFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICAgIG1ldHJpY05hbWVNYXBwZXI/OiAob3A6IE9wZXJhdGlvbikgPT4gc3RyaW5nLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBjbG91ZHdhdGNoLklNZXRyaWM+IHtcbiAgICBjb25zdCBtZXRyaWNzOiBSZWNvcmQ8c3RyaW5nLCBjbG91ZHdhdGNoLklNZXRyaWM+ID0ge307XG4gICAgY29uc3QgbWFwcGVyID0gbWV0cmljTmFtZU1hcHBlciA/PyAoKG9wKSA9PiBvcC50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGlmIChwcm9wcz8uZGltZW5zaW9uc01hcD8uT3BlcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkludmFsaWQgcHJvcGVydGllcy4gT3BlcmF0aW9uIGRpbWVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gY2FsY3VsYXRpbmcgb3BlcmF0aW9uYWwgbWV0cmljc1wiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBtZXRyaWMgPSB0aGlzLm1ldHJpYyhtZXRyaWNOYW1lLCB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBPcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcGVyYXRpb25NZXRyaWNOYW1lID0gbWFwcGVyKG9wZXJhdGlvbik7XG4gICAgICBjb25zdCBmaXJzdENoYXIgPSBvcGVyYXRpb25NZXRyaWNOYW1lLmNoYXJBdCgwKTtcblxuICAgICAgaWYgKGZpcnN0Q2hhciA9PT0gZmlyc3RDaGFyLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvdXNpbmctbWV0cmljLW1hdGguaHRtbCNtZXRyaWMtbWF0aC1zeW50YXhcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgTWFwcGVyIGdlbmVyYXRlZCBhbiBpbGxlZ2FsIG9wZXJhdGlvbiBtZXRyaWMgbmFtZTogJHtvcGVyYXRpb25NZXRyaWNOYW1lfS4gTXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlcmAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG1ldHJpY3Nbb3BlcmF0aW9uTWV0cmljTmFtZV0gPSBtZXRyaWM7XG4gICAgfVxuICAgIHJldHVybiBtZXRyaWNzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBoYXNJbmRleCgpOiBib29sZWFuO1xuXG4gIHByaXZhdGUgY29tYmluZWRHcmFudChcbiAgICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgICBvcHRzOiB7XG4gICAgICBrZXlBY3Rpb25zPzogc3RyaW5nW107XG4gICAgICB0YWJsZUFjdGlvbnM/OiBzdHJpbmdbXTtcbiAgICAgIHN0cmVhbUFjdGlvbnM/OiBzdHJpbmdbXTtcbiAgICB9LFxuICApOiBpYW0uR3JhbnQge1xuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYgb3B0cy5rZXlBY3Rpb25zKSB7XG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnQoZ3JhbnRlZSwgLi4ub3B0cy5rZXlBY3Rpb25zKTtcbiAgICB9XG4gICAgaWYgKG9wdHMudGFibGVBY3Rpb25zKSB7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSBbXG4gICAgICAgIHRoaXMudGFibGVBcm4sXG4gICAgICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+XG4gICAgICAgICAgICB0aGlzLmhhc0luZGV4ID8gYCR7dGhpcy50YWJsZUFybn0vaW5kZXgvKmAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pLFxuICAgICAgICAuLi50aGlzLnJlZ2lvbmFsQXJucyxcbiAgICAgICAgLi4udGhpcy5yZWdpb25hbEFybnMubWFwKChhcm4pID0+XG4gICAgICAgICAgTGF6eS5zdHJpbmdWYWx1ZSh7XG4gICAgICAgICAgICBwcm9kdWNlOiAoKSA9PiAodGhpcy5oYXNJbmRleCA/IGAke2Fybn0vaW5kZXgvKmAgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJldCA9IGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAgICAgICBncmFudGVlLFxuICAgICAgICBhY3Rpb25zOiBvcHRzLnRhYmxlQWN0aW9ucyxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiByZXNvdXJjZXMuZmlsdGVyKChyKSA9PiByICE9PSB1bmRlZmluZWQpLFxuICAgICAgICByZXNvdXJjZTogdGhpcyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdHJlYW1BY3Rpb25zKSB7XG4gICAgICBpZiAoIXRoaXMudGFibGVTdHJlYW1Bcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgRHluYW1vREIgU3RyZWFtcyBtdXN0IGJlIGVuYWJsZWQgb24gdGhlIHRhYmxlICR7dGhpcy5ub2RlLnBhdGh9YCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmV0ID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gICAgICAgIGdyYW50ZWUsXG4gICAgICAgIGFjdGlvbnM6IG9wdHMuc3RyZWFtQWN0aW9ucyxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiBbdGhpcy50YWJsZVN0cmVhbUFybl0sXG4gICAgICAgIHJlc291cmNlOiB0aGlzLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQgZ3JhbnQgY29tYmluYXRpb24sIGFjdGlvbnMgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGFibGUgb3Igc3RyZWFtLmAsXG4gICAgICB0aGlzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNhbm5lZE1ldHJpYyhcbiAgICBmbjogKGRpbXM6IHsgVGFibGVOYW1lOiBzdHJpbmcgfSkgPT4gY2xvdWR3YXRjaC5NZXRyaWNQcm9wcyxcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgLi4uZm4oeyBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lIH0pLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIER5bmFtb0RCIHRhYmxlLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGUgZXh0ZW5kcyBUYWJsZUJhc2Uge1xuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gUHJpbmNpcGFsIHRvIGxpc3QgYWxsIER5bmFtb0RCIFN0cmVhbXMuXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgI2dyYW50VGFibGVMaXN0U3RyZWFtc2AgZm9yIG1vcmUgZ3JhbnVsYXIgcGVybWlzc2lvblxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIChuby1vcCBpZiB1bmRlZmluZWQpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdyYW50TGlzdFN0cmVhbXMoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFtcImR5bmFtb2RiOkxpc3RTdHJlYW1zXCJdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXCIqXCJdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBUYWJsZSBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIHRhYmxlIHZpYSB0YWJsZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBuYW1lLlxuICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSB0YWJsZSdzIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZU5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBJVGFibGUge1xuICAgIHJldHVybiBUYWJsZS5mcm9tVGFibGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZU5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFRhYmxlIGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgdGFibGUgdmlhIHRhYmxlIGFybi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIHRhYmxlQXJuIFRoZSB0YWJsZSdzIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRhYmxlQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB0YWJsZUFybjogc3RyaW5nLFxuICApOiBJVGFibGUge1xuICAgIHJldHVybiBUYWJsZS5mcm9tVGFibGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZUFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIGF0dHJzIEEgYFRhYmxlQXR0cmlidXRlc2Agb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tVGFibGVBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogVGFibGVBdHRyaWJ1dGVzLFxuICApOiBJVGFibGUge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFRhYmxlQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YWJsZVN0cmVhbUFybj86IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gICAgICBwdWJsaWMgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzSW5kZXggPVxuICAgICAgICAoYXR0cnMuZ3JhbnRJbmRleFBlcm1pc3Npb25zID8/IGZhbHNlKSB8fFxuICAgICAgICAoYXR0cnMuZ2xvYmFsSW5kZXhlcyA/PyBbXSkubGVuZ3RoID4gMCB8fFxuICAgICAgICAoYXR0cnMubG9jYWxJbmRleGVzID8/IFtdKS5sZW5ndGggPiAwO1xuXG4gICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvcHM6IEF3c0NvbnN0cnVjdFByb3BzLFxuICAgICAgICBfdGFibGVBcm46IHN0cmluZyxcbiAgICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHRhYmxlU3RyZWFtQXJuPzogc3RyaW5nLFxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgICAgICB0aGlzLnRhYmxlQXJuID0gX3RhYmxlQXJuO1xuICAgICAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAgICAgdGhpcy50YWJsZVN0cmVhbUFybiA9IHRhYmxlU3RyZWFtQXJuO1xuICAgICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBhdHRycy5lbmNyeXB0aW9uS2V5O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBuYW1lOiBzdHJpbmc7XG4gICAgbGV0IGFybjogc3RyaW5nO1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpO1xuICAgIGlmICghYXR0cnMudGFibGVOYW1lKSB7XG4gICAgICBpZiAoIWF0dHJzLnRhYmxlQXJuKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJPbmUgb2YgdGFibGVOYW1lIG9yIHRhYmxlQXJuIGlzIHJlcXVpcmVkIVwiLFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBjb25zdCBtYXliZVRhYmxlTmFtZSA9IHN0YWNrLnNwbGl0QXJuKFxuICAgICAgICBhdHRycy50YWJsZUFybixcbiAgICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgICApLnJlc291cmNlTmFtZTtcbiAgICAgIGlmICghbWF5YmVUYWJsZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIkFSTiBmb3IgRHluYW1vREIgdGFibGUgbXVzdCBiZSBpbiB0aGUgZm9ybTogYXJuOjxwYXJ0aXRpb24+OmR5bmFtb2RiOjxyZWdpb24+OjxhY2NvdW50Pjp0YWJsZS88dGFibGUtbmFtZT5cIixcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSBtYXliZVRhYmxlTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGF0dHJzLnRhYmxlQXJuKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJPbmx5IG9uZSBvZiB0YWJsZUFybiBvciB0YWJsZU5hbWUgY2FuIGJlIHByb3ZpZGVkXCIsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBuYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgICAgYXJuID0gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogXCJkeW5hbW9kYlwiLFxuICAgICAgICByZXNvdXJjZTogXCJ0YWJsZVwiLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGF0dHJzLnRhYmxlTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KFxuICAgICAgeyBlbnZpcm9ubWVudEZyb21Bcm46IGFybiB9LFxuICAgICAgYXJuLFxuICAgICAgbmFtZSxcbiAgICAgIGF0dHJzLnRhYmxlU3RyZWFtQXJuLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBwb2xpY3kgdG8gYXNzaWduIHRvIER5bmFtb0RCIFRhYmxlLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLXJlc291cmNlcG9saWN5Lmh0bWxcbiAgICogQGRlZmF1bHQgLSBObyByZXNvdXJjZSBwb2xpY3kgc3RhdGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZUFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZVN0cmVhbUFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbCA9XG4gICAgbmV3IEFycmF5PGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZUF0dHJpYnV0ZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwgPVxuICAgIG5ldyBBcnJheTxkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbCA9XG4gICAgbmV3IEFycmF5PGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZUxvY2FsU2Vjb25kYXJ5SW5kZXg+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZWNvbmRhcnlJbmRleFNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgU2NoZW1hT3B0aW9ucz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBub25LZXlBdHRyaWJ1dGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0YWJsZVBhcnRpdGlvbktleTogQXR0cmlidXRlO1xuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlU29ydEtleT86IEF0dHJpYnV0ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJpbGxpbmdNb2RlOiBCaWxsaW5nTW9kZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWJsZVNjYWxpbmc6IFNjYWxhYmxlQXR0cmlidXRlUGFpciA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGV4U2NhbGluZyA9IG5ldyBNYXA8c3RyaW5nLCBTY2FsYWJsZUF0dHJpYnV0ZVBhaXI+KCk7XG4gIC8vIENvbW1lbnRpbmcgb3V0IHNjYWxpbmdSb2xlIGFzIFRlcnJhZm9ybSBhdXRvLWNyZWF0ZXMgc2VydmljZS1saW5rZWQgcm9sZXNcbiAgLy8gVW5saWtlIEFXUyBDREsgQ2xvdWRGb3JtYXRpb24sIFRlcnJhZm9ybSBBV1MgcHJvdmlkZXIncyByb2xlQXJuIGlzIG9wdGlvbmFsXG4gIC8vIGFuZCBkZWZhdWx0cyB0byBhcHByb3ByaWF0ZSBzZXJ2aWNlLWxpbmtlZCByb2xlcyB3aGVuIG9taXR0ZWRcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBzY2FsaW5nUm9sZTogaWFtLklSb2xlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc291cmNlOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcGxpY2FzOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVSZXBsaWNhW10gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFRhYmxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGNvbnN0IHBoeXNpY2FsVGFibGVOYW1lID1cbiAgICAgIHByb3BzLnRhYmxlTmFtZSA/PyB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzKTtcblxuICAgIGNvbnN0IHsgc3NlU3BlY2lmaWNhdGlvbiwgZW5jcnlwdGlvbktleSB9ID0gdGhpcy5wYXJzZUVuY3J5cHRpb24ocHJvcHMpO1xuICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXk7XG5cbiAgICBjb25zdCBwb2ludEluVGltZVJlY292ZXJ5ID0gdGhpcy5yZW5kZXJQb2ludEluVGltZVJlY292ZXJ5KHByb3BzKTtcblxuICAgIC8vIGVycm9yIGlmIGJvdGggcmVwbGljYXRpb25SZWdpb25zIGFuZCByZXBsaWNhU3BlY2lmaWNhdGlvbiBhcmUgc3BlY2lmaWVkXG4gICAgaWYgKHByb3BzLnJlcGxpY2F0aW9uUmVnaW9ucyAmJiBwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJZb3UgY2Fubm90IHNwZWNpZnkgYm90aCBgcmVwbGljYXRpb25SZWdpb25zYCBhbmQgYHJlcGxpY2FTcGVjaWZpY2F0aW9uYFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgc3RyZWFtU3BlY2lmaWNhdGlvbjpcbiAgICAgIHwge1xuICAgICAgICAgIHN0cmVhbUVuYWJsZWQ6IGJvb2xlYW47XG4gICAgICAgICAgc3RyZWFtVmlld1R5cGU/OiBTdHJlYW1WaWV3VHlwZTtcbiAgICAgICAgfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgKHByb3BzLnJlcGxpY2F0aW9uUmVnaW9ucyAmJiBwcm9wcy5yZXBsaWNhdGlvblJlZ2lvbnMubGVuZ3RoID4gMCkgfHxcbiAgICAgIChwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbiAmJiBwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbi5sZW5ndGggPiAwKVxuICAgICkge1xuICAgICAgaWYgKHByb3BzLnN0cmVhbSAmJiBwcm9wcy5zdHJlYW0gIT09IFN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiYHN0cmVhbWAgbXVzdCBiZSBzZXQgdG8gYE5FV19BTkRfT0xEX0lNQUdFU2Agd2hlbiBzcGVjaWZ5aW5nIGByZXBsaWNhdGlvblJlZ2lvbnNgXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmlsbGluZ01vZGUgPSBwcm9wcy5iaWxsaW5nTW9kZSA/PyBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1Q7XG4gICAgICBzdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgICBzdHJlYW1FbmFibGVkOiB0cnVlLFxuICAgICAgICBzdHJlYW1WaWV3VHlwZTogU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9IHByb3BzLmJpbGxpbmdNb2RlID8/IEJpbGxpbmdNb2RlLlBST1ZJU0lPTkVEO1xuICAgICAgaWYgKHByb3BzLnN0cmVhbSkge1xuICAgICAgICBzdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgICAgIHN0cmVhbUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3RyZWFtVmlld1R5cGU6IHByb3BzLnN0cmVhbSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVByb3Zpc2lvbmluZyhwcm9wcyk7XG4gICAgdGhpcy5hZGRLZXkocHJvcHMucGFydGl0aW9uS2V5LCBIQVNIX0tFWV9UWVBFKTtcbiAgICB0aGlzLnRhYmxlUGFydGl0aW9uS2V5ID0gcHJvcHMucGFydGl0aW9uS2V5O1xuICAgIGlmIChwcm9wcy5zb3J0S2V5KSB7XG4gICAgICB0aGlzLmFkZEtleShwcm9wcy5zb3J0S2V5LCBSQU5HRV9LRVlfVFlQRSk7XG4gICAgICB0aGlzLnRhYmxlU29ydEtleSA9IHByb3BzLnNvcnRLZXk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwbGljYXMgPSB0aGlzLnJlbmRlclJlcGxpY2FzKFxuICAgICAgcHJvcHMucmVwbGljYXRpb25SZWdpb25zLFxuICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24sXG4gICAgKTtcbiAgICBpZiAodGhpcy5fcmVwbGljYXMgJiYgdGhpcy5fcmVwbGljYXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fcmVwbGljYXMuZm9yRWFjaCgocikgPT5cbiAgICAgICAgLy8gU2F2ZSByZWdpb25hbCBhcm5zIGZvciBncmFudFh4eCgpIG1ldGhvZHNcbiAgICAgICAgdGhpcy5yZWdpb25hbEFybnMucHVzaChcbiAgICAgICAgICB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gICAgICAgICAgICByZWdpb246IHIucmVnaW9uTmFtZSxcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiZHluYW1vZGJcIixcbiAgICAgICAgICAgIHJlc291cmNlOiBcInRhYmxlXCIsXG4gICAgICAgICAgICByZXNvdXJjZU5hbWU6IHBoeXNpY2FsVGFibGVOYW1lLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvdXJjZSA9IG5ldyBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGUodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBuYW1lOiBwaHlzaWNhbFRhYmxlTmFtZSxcbiAgICAgIGhhc2hLZXk6IHRoaXMudGFibGVQYXJ0aXRpb25LZXkubmFtZSxcbiAgICAgIHJhbmdlS2V5OiB0aGlzLnRhYmxlU29ydEtleT8ubmFtZSxcbiAgICAgIGF0dHJpYnV0ZTogdGhpcy5hdHRyaWJ1dGVEZWZpbml0aW9uc0ludGVybmFsLFxuICAgICAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXg6IExhenkuYW55VmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5nbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubWFwKFxuICAgICAgICAgICAgICBkeW5hbW9kYlRhYmxlLmR5bmFtb2RiVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleFRvVGVycmFmb3JtLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9LFxuICAgICAgKSxcbiAgICAgIGxvY2FsU2Vjb25kYXJ5SW5kZXg6IExhenkuYW55VmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5tYXAoXG4gICAgICAgICAgICAgIGR5bmFtb2RiVGFibGUuZHluYW1vZGJUYWJsZUxvY2FsU2Vjb25kYXJ5SW5kZXhUb1RlcnJhZm9ybSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSxcbiAgICAgICksXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5LFxuICAgICAgYmlsbGluZ01vZGU6IHRoaXMuYmlsbGluZ01vZGUsXG4gICAgICByZWFkQ2FwYWNpdHk6XG4gICAgICAgIHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBST1ZJU0lPTkVEXG4gICAgICAgICAgPyAocHJvcHMucmVhZENhcGFjaXR5ID8/IDUpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB3cml0ZUNhcGFjaXR5OlxuICAgICAgICB0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QUk9WSVNJT05FRFxuICAgICAgICAgID8gKHByb3BzLndyaXRlQ2FwYWNpdHkgPz8gNSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG9uRGVtYW5kVGhyb3VnaHB1dDpcbiAgICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUICYmXG4gICAgICAgIChwcm9wcy5tYXhSZWFkUmVxdWVzdFVuaXRzIHx8IHByb3BzLm1heFdyaXRlUmVxdWVzdFVuaXRzKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBtYXhSZWFkUmVxdWVzdFVuaXRzOiBwcm9wcy5tYXhSZWFkUmVxdWVzdFVuaXRzLFxuICAgICAgICAgICAgICBtYXhXcml0ZVJlcXVlc3RVbml0czogcHJvcHMubWF4V3JpdGVSZXF1ZXN0VW5pdHMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzZXJ2ZXJTaWRlRW5jcnlwdGlvbjogc3NlU3BlY2lmaWNhdGlvbixcbiAgICAgIHN0cmVhbUVuYWJsZWQ6IHN0cmVhbVNwZWNpZmljYXRpb24/LnN0cmVhbUVuYWJsZWQsXG4gICAgICBzdHJlYW1WaWV3VHlwZTogc3RyZWFtU3BlY2lmaWNhdGlvbj8uc3RyZWFtVmlld1R5cGUsXG4gICAgICB0YWJsZUNsYXNzOiBwcm9wcy50YWJsZUNsYXNzLFxuICAgICAgdHRsOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlXG4gICAgICAgID8geyBhdHRyaWJ1dGVOYW1lOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlLCBlbmFibGVkOiB0cnVlIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb25FbmFibGVkOiBwcm9wcy5kZWxldGlvblByb3RlY3Rpb24sXG4gICAgICBpbXBvcnRUYWJsZTogdGhpcy5yZW5kZXJJbXBvcnRTb3VyY2VTcGVjaWZpY2F0aW9uKHByb3BzLmltcG9ydFNvdXJjZSksXG4gICAgICByZXBsaWNhOiB0aGlzLl9yZXBsaWNhcyxcbiAgICAgIC8vIHJlc291cmNlUG9saWN5OiBwcm9wcy5yZXNvdXJjZVBvbGljeSA/IHsgcG9saWN5RG9jdW1lbnQ6IHRoaXMuc3RhY2sudG9Kc29uU3RyaW5nKHByb3BzLnJlc291cmNlUG9saWN5LnRvSlNPTigpKSB9IDogdW5kZWZpbmVkLCAvLyBOb3QgaW4gVEYgcmVzb3VyY2VcbiAgICAgIC8vIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9pc3N1ZXMvNDMxNDJcbiAgICAgIC8vIHdhcm1UaHJvdWdocHV0OiBwcm9wcy53YXJtVGhyb3VnaHB1dCA/PyB1bmRlZmluZWQsIC8vIE5vdCBpbiBURiByZXNvdXJjZVxuICAgIH0pO1xuXG4gICAgdGhpcy50YWJsZUFybiA9IHRoaXMuX3Jlc291cmNlLmFybjtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRoaXMuX3Jlc291cmNlLm5hbWU7XG4gICAgdGhpcy50YWJsZVN0cmVhbUFybiA9IHN0cmVhbVNwZWNpZmljYXRpb24/LnN0cmVhbUVuYWJsZWRcbiAgICAgID8gdGhpcy5fcmVzb3VyY2Uuc3RyZWFtQXJuXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlc291cmNlUG9saWN5ID0gcHJvcHMucmVzb3VyY2VQb2xpY3k7XG4gICAgaWYgKHRoaXMucmVzb3VyY2VQb2xpY3kpIHtcbiAgICAgIG5ldyBkeW5hbW9kYlJlc291cmNlUG9saWN5LkR5bmFtb2RiUmVzb3VyY2VQb2xpY3koXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiUmVzb3VyY2VQb2xpY3lcIixcbiAgICAgICAge1xuICAgICAgICAgIHBvbGljeTogdGhpcy5yZXNvdXJjZVBvbGljeS5qc29uLFxuICAgICAgICAgIHJlc291cmNlQXJuOiB0aGlzLnRhYmxlQXJuLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMua2luZXNpc1N0cmVhbSkge1xuICAgICAgbmV3IGR5bmFtb2RiS2luZXNpc1N0cmVhbWluZ0Rlc3RpbmF0aW9uLkR5bmFtb2RiS2luZXNpc1N0cmVhbWluZ0Rlc3RpbmF0aW9uKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIktpbmVzaXNTdHJlYW1pbmdEZXN0aW5hdGlvblwiLFxuICAgICAgICB7XG4gICAgICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBzdHJlYW1Bcm46IHByb3BzLmtpbmVzaXNTdHJlYW0uc3RyZWFtQXJuLFxuICAgICAgICAgIC4uLihwcm9wcy5raW5lc2lzUHJlY2lzaW9uVGltZXN0YW1wICYmIHtcbiAgICAgICAgICAgIGFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbjpcbiAgICAgICAgICAgICAgcHJvcHMua2luZXNpc1ByZWNpc2lvblRpbWVzdGFtcCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmNvbnRyaWJ1dG9ySW5zaWdodHNFbmFibGVkKSB7XG4gICAgICAvLyBUT0RPOiBHZW5lcmF0ZSBjb25udHJpYnV0b3IgaW5zaWdodHMgcGVyIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhcbiAgICAgIC8vIHRoaXMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsXG4gICAgICBuZXcgZHluYW1vZGJDb250cmlidXRvckluc2lnaHRzLkR5bmFtb2RiQ29udHJpYnV0b3JJbnNpZ2h0cyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJDb250cmlidXRvckluc2lnaHRzXCIsXG4gICAgICAgIHtcbiAgICAgICAgICB0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICAgIC8vIFRPRE86IHVzZSBmb3IgZWFjaCBvbiBnbGkgaXRlcmF0b3JcbiAgICAgICAgICAvLyBpbmRleE5hbWU6IGl0ZXJhdG9yLnZhbHVlLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21tZW50aW5nIG91dCBzY2FsaW5nUm9sZSBpbml0aWFsaXphdGlvbiAtIGxldCBUZXJyYWZvcm0gYXV0by1jcmVhdGUgc2VydmljZS1saW5rZWQgcm9sZVxuICAgIC8vIHRoaXMuc2NhbGluZ1JvbGUgPSB0aGlzLm1ha2VTY2FsaW5nUm9sZSgpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZVRhYmxlKCkgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgocHJvcHM6IEdsb2JhbFNlY29uZGFyeUluZGV4UHJvcHMpIHtcbiAgICB0aGlzLnZhbGlkYXRlUHJvdmlzaW9uaW5nR1NJKHByb3BzKTtcbiAgICB0aGlzLnZhbGlkYXRlSW5kZXhOYW1lKHByb3BzLmluZGV4TmFtZSk7XG5cbiAgICBjb25zdCBnc2lQcm9qZWN0aW9uID0gdGhpcy5idWlsZEluZGV4UHJvamVjdGlvbihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlckF0dHJpYnV0ZShwcm9wcy5wYXJ0aXRpb25LZXkpO1xuICAgIGlmIChwcm9wcy5zb3J0S2V5KSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyQXR0cmlidXRlKHByb3BzLnNvcnRLZXkpO1xuICAgIH1cblxuICAgIHRoaXMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsLnB1c2goe1xuICAgICAgbmFtZTogcHJvcHMuaW5kZXhOYW1lLFxuICAgICAgaGFzaEtleTogcHJvcHMucGFydGl0aW9uS2V5Lm5hbWUsXG4gICAgICByYW5nZUtleTogcHJvcHMuc29ydEtleT8ubmFtZSxcbiAgICAgIHByb2plY3Rpb25UeXBlOiBnc2lQcm9qZWN0aW9uLnByb2plY3Rpb25UeXBlLFxuICAgICAgbm9uS2V5QXR0cmlidXRlczogZ3NpUHJvamVjdGlvbi5ub25LZXlBdHRyaWJ1dGVzLFxuICAgICAgcmVhZENhcGFjaXR5OlxuICAgICAgICB0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QUk9WSVNJT05FRFxuICAgICAgICAgID8gKHByb3BzLnJlYWRDYXBhY2l0eSA/PyA1KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgd3JpdGVDYXBhY2l0eTpcbiAgICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICAgICAgICA/IChwcm9wcy53cml0ZUNhcGFjaXR5ID8/IDUpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBvbkRlbWFuZFRocm91Z2hwdXQ6XG4gICAgICAgIHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCAmJlxuICAgICAgICAocHJvcHMubWF4UmVhZFJlcXVlc3RVbml0cyB8fCBwcm9wcy5tYXhXcml0ZVJlcXVlc3RVbml0cylcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbWF4UmVhZFJlcXVlc3RVbml0czogcHJvcHMubWF4UmVhZFJlcXVlc3RVbml0cyxcbiAgICAgICAgICAgICAgbWF4V3JpdGVSZXF1ZXN0VW5pdHM6IHByb3BzLm1heFdyaXRlUmVxdWVzdFVuaXRzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gY29udHJpYnV0b3JJbnNpZ2h0c0VuYWJsZWQ6IHByb3BzLmNvbnRyaWJ1dG9ySW5zaWdodHNFbmFibGVkLCAvLyBOb3QgaW4gVEYgR1NJIGJsb2NrXG4gICAgICAvLyB3YXJtVGhyb3VnaHB1dDogcHJvcHMud2FybVRocm91Z2hwdXQsIC8vIE5vdCBpbiBURiBHU0kgYmxvY2tcbiAgICB9KTtcblxuICAgIHRoaXMuc2Vjb25kYXJ5SW5kZXhTY2hlbWFzLnNldChwcm9wcy5pbmRleE5hbWUsIHtcbiAgICAgIHBhcnRpdGlvbktleTogcHJvcHMucGFydGl0aW9uS2V5LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleSxcbiAgICB9KTtcbiAgICB0aGlzLmluZGV4U2NhbGluZy5zZXQocHJvcHMuaW5kZXhOYW1lLCB7fSk7XG4gIH1cblxuICBwdWJsaWMgYWRkTG9jYWxTZWNvbmRhcnlJbmRleChwcm9wczogTG9jYWxTZWNvbmRhcnlJbmRleFByb3BzKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5sZW5ndGggPj1cbiAgICAgIE1BWF9MT0NBTF9TRUNPTkRBUllfSU5ERVhfQ09VTlRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICBgQSBtYXhpbXVtIG51bWJlciBvZiBsb2NhbCBzZWNvbmRhcnkgaW5kZXggcGVyIHRhYmxlIGlzICR7TUFYX0xPQ0FMX1NFQ09OREFSWV9JTkRFWF9DT1VOVH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUluZGV4TmFtZShwcm9wcy5pbmRleE5hbWUpO1xuXG4gICAgaWYgKCF0aGlzLnRhYmxlUGFydGl0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlRhYmxlIHBhcnRpdGlvbiBrZXkgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBhZGRpbmcgbG9jYWwgc2Vjb25kYXJ5IGluZGV4XCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdGVyQXR0cmlidXRlKHRoaXMudGFibGVQYXJ0aXRpb25LZXkpO1xuICAgIHRoaXMucmVnaXN0ZXJBdHRyaWJ1dGUocHJvcHMuc29ydEtleSk7XG5cbiAgICBjb25zdCBsc2lQcm9qZWN0aW9uID0gdGhpcy5idWlsZEluZGV4UHJvamVjdGlvbihwcm9wcyk7XG5cbiAgICB0aGlzLmxvY2FsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsLnB1c2goe1xuICAgICAgbmFtZTogcHJvcHMuaW5kZXhOYW1lLFxuICAgICAgcmFuZ2VLZXk6IHByb3BzLnNvcnRLZXkubmFtZSxcbiAgICAgIHByb2plY3Rpb25UeXBlOiBsc2lQcm9qZWN0aW9uLnByb2plY3Rpb25UeXBlLFxuICAgICAgbm9uS2V5QXR0cmlidXRlczogbHNpUHJvamVjdGlvbi5ub25LZXlBdHRyaWJ1dGVzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWNvbmRhcnlJbmRleFNjaGVtYXMuc2V0KHByb3BzLmluZGV4TmFtZSwge1xuICAgICAgcGFydGl0aW9uS2V5OiB0aGlzLnRhYmxlUGFydGl0aW9uS2V5LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhdXRvU2NhbGVSZWFkQ2FwYWNpdHkoXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLnRhYmxlU2NhbGluZy5zY2FsYWJsZVJlYWRBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiUmVhZCBBdXRvU2NhbGluZyBhbHJlYWR5IGVuYWJsZWQgZm9yIHRoaXMgdGFibGVcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQXV0b1NjYWxpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGFibGVzIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMudGFibGVTY2FsaW5nLnNjYWxhYmxlUmVhZEF0dHJpYnV0ZSA9XG4gICAgICBuZXcgU2NhbGFibGVUYWJsZUF0dHJpYnV0ZSh0aGlzLCBcIlJlYWRTY2FsaW5nXCIsIHtcbiAgICAgICAgc2VydmljZU5hbWVzcGFjZTogYXBwc2NhbGluZy5TZXJ2aWNlTmFtZXNwYWNlLkRZTkFNT0RCLFxuICAgICAgICByZXNvdXJjZUlkOiBgdGFibGUvJHt0aGlzLnRhYmxlTmFtZX1gLFxuICAgICAgICBkaW1lbnNpb246IFwiZHluYW1vZGI6dGFibGU6UmVhZENhcGFjaXR5VW5pdHNcIixcbiAgICAgICAgLy8gcm9sZTogdGhpcy5zY2FsaW5nUm9sZSwgLy8gQ29tbWVudGluZyBvdXQgLSBsZXQgVGVycmFmb3JtIHVzZSBzZXJ2aWNlLWxpbmtlZCByb2xlXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGF1dG9TY2FsZVdyaXRlQ2FwYWNpdHkoXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLnRhYmxlU2NhbGluZy5zY2FsYWJsZVdyaXRlQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIldyaXRlIEF1dG9TY2FsaW5nIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhpcyB0YWJsZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJBdXRvU2NhbGluZyBpcyBub3QgYXZhaWxhYmxlIGZvciB0YWJsZXMgd2l0aCBQQVlfUEVSX1JFUVVFU1QgYmlsbGluZyBtb2RlXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudGFibGVTY2FsaW5nLnNjYWxhYmxlV3JpdGVBdHRyaWJ1dGUgPSBuZXcgU2NhbGFibGVUYWJsZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMsXG4gICAgICBcIldyaXRlU2NhbGluZ1wiLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBhcHBzY2FsaW5nLlNlcnZpY2VOYW1lc3BhY2UuRFlOQU1PREIsXG4gICAgICAgIHJlc291cmNlSWQ6IGB0YWJsZS8ke3RoaXMudGFibGVOYW1lfWAsXG4gICAgICAgIGRpbWVuc2lvbjogXCJkeW5hbW9kYjp0YWJsZTpXcml0ZUNhcGFjaXR5VW5pdHNcIixcbiAgICAgICAgLy8gcm9sZTogdGhpcy5zY2FsaW5nUm9sZSwgLy8gQ29tbWVudGluZyBvdXQgLSBsZXQgVGVycmFmb3JtIHVzZSBzZXJ2aWNlLWxpbmtlZCByb2xlXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIElmIHRoZXJlIGFyZSByZXBsaWNhcywgdGhleSBkZXBlbmQgb24gdGhlIHdyaXRlIHNjYWxpbmcgcG9saWN5IG9mIHRoZSBtYWluIHRhYmxlLlxuICAgIC8vIFRoaXMgaXMgbm90IGV4cGxpY2l0bHkgbW9kZWxlZCBpbiBURiBidXQgd2FzIGhhbmRsZWQgYnkgQ3VzdG9tUmVzb3VyY2UgZGVwZW5kZW5jaWVzIGluIENESy5cbiAgICAvLyBGb3IgVEYsIHRoaXMgZGVwZW5kZW5jeSBpcyBpbXBsaWNpdCBpZiB0aGUgcHJvdmlkZXIgaGFuZGxlcyBpdCwgb3IgbWlnaHQgbmVlZCBleHBsaWNpdCBkZXBlbmRzT24gaWYgaXNzdWVzIGFyaXNlLlxuICAgIHJldHVybiB0aGlzLnRhYmxlU2NhbGluZy5zY2FsYWJsZVdyaXRlQXR0cmlidXRlO1xuICB9XG5cbiAgcHVibGljIGF1dG9TY2FsZUdsb2JhbFNlY29uZGFyeUluZGV4UmVhZENhcGFjaXR5KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBFbmFibGVTY2FsaW5nUHJvcHMsXG4gICk6IElTY2FsYWJsZVRhYmxlQXR0cmlidXRlIHtcbiAgICBpZiAodGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkF1dG9TY2FsaW5nIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRhYmxlcyB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGVcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVBhaXIgPSB0aGlzLmluZGV4U2NhbGluZy5nZXQoaW5kZXhOYW1lKTtcbiAgICBpZiAoIWF0dHJpYnV0ZVBhaXIpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBObyBnbG9iYWwgc2Vjb25kYXJ5IGluZGV4IHdpdGggbmFtZSAke2luZGV4TmFtZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZVBhaXIuc2NhbGFibGVSZWFkQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlJlYWQgQXV0b1NjYWxpbmcgYWxyZWFkeSBlbmFibGVkIGZvciB0aGlzIGluZGV4XCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoYXR0cmlidXRlUGFpci5zY2FsYWJsZVJlYWRBdHRyaWJ1dGUgPSBuZXcgU2NhbGFibGVUYWJsZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtpbmRleE5hbWV9UmVhZFNjYWxpbmdgLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBhcHBzY2FsaW5nLlNlcnZpY2VOYW1lc3BhY2UuRFlOQU1PREIsXG4gICAgICAgIHJlc291cmNlSWQ6IGB0YWJsZS8ke3RoaXMudGFibGVOYW1lfS9pbmRleC8ke2luZGV4TmFtZX1gLFxuICAgICAgICBkaW1lbnNpb246IFwiZHluYW1vZGI6aW5kZXg6UmVhZENhcGFjaXR5VW5pdHNcIixcbiAgICAgICAgLy8gcm9sZTogdGhpcy5zY2FsaW5nUm9sZSwgLy8gQ29tbWVudGluZyBvdXQgLSBsZXQgVGVycmFmb3JtIHVzZSBzZXJ2aWNlLWxpbmtlZCByb2xlXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSxcbiAgICApKTtcbiAgfVxuXG4gIHB1YmxpYyBhdXRvU2NhbGVHbG9iYWxTZWNvbmRhcnlJbmRleFdyaXRlQ2FwYWNpdHkoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQXV0b1NjYWxpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGFibGVzIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlUGFpciA9IHRoaXMuaW5kZXhTY2FsaW5nLmdldChpbmRleE5hbWUpO1xuICAgIGlmICghYXR0cmlidXRlUGFpcikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYE5vIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXggd2l0aCBuYW1lICR7aW5kZXhOYW1lfWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlUGFpci5zY2FsYWJsZVdyaXRlQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIldyaXRlIEF1dG9TY2FsaW5nIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhpcyBpbmRleFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGF0dHJpYnV0ZVBhaXIuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZSA9IG5ldyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2luZGV4TmFtZX1Xcml0ZVNjYWxpbmdgLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBhcHBzY2FsaW5nLlNlcnZpY2VOYW1lc3BhY2UuRFlOQU1PREIsXG4gICAgICAgIHJlc291cmNlSWQ6IGB0YWJsZS8ke3RoaXMudGFibGVOYW1lfS9pbmRleC8ke2luZGV4TmFtZX1gLFxuICAgICAgICBkaW1lbnNpb246IFwiZHluYW1vZGI6aW5kZXg6V3JpdGVDYXBhY2l0eVVuaXRzXCIsXG4gICAgICAgIC8vIHJvbGU6IHRoaXMuc2NhbGluZ1JvbGUsIC8vIENvbW1lbnRpbmcgb3V0IC0gbGV0IFRlcnJhZm9ybSB1c2Ugc2VydmljZS1saW5rZWQgcm9sZVxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH0sXG4gICAgKSk7XG4gIH1cblxuICBwdWJsaWMgc2NoZW1hKGluZGV4TmFtZT86IHN0cmluZyk6IFNjaGVtYU9wdGlvbnMge1xuICAgIGlmICghaW5kZXhOYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJ0aXRpb25LZXk6IHRoaXMudGFibGVQYXJ0aXRpb25LZXksXG4gICAgICAgIHNvcnRLZXk6IHRoaXMudGFibGVTb3J0S2V5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zZWNvbmRhcnlJbmRleFNjaGVtYXMuZ2V0KGluZGV4TmFtZSk7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBzY2hlbWEgZm9yIGluZGV4OiAke2luZGV4TmFtZX0uIFVzZSAnYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgnIG9yICdhZGRMb2NhbFNlY29uZGFyeUluZGV4JyB0byBhZGQgaW5kZXhgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVUYWJsZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBpZiAoIXRoaXMudGFibGVQYXJ0aXRpb25LZXkpIHtcbiAgICAgIGVycm9ycy5wdXNoKFwiQSBwYXJ0aXRpb24ga2V5IG11c3QgYmUgc3BlY2lmaWVkXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5sZW5ndGggPiAwICYmICF0aGlzLnRhYmxlU29ydEtleSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQSBzb3J0IGtleSBvZiB0aGUgdGFibGUgbXVzdCBiZSBzcGVjaWZpZWQgdG8gYWRkIGxvY2FsIHNlY29uZGFyeSBpbmRleGVzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXBsaWNhcyAmJlxuICAgICAgdGhpcy5fcmVwbGljYXMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICApIHtcbiAgICAgIGNvbnN0IHdyaXRlQXV0b1NjYWxlQXR0cmlidXRlID0gdGhpcy50YWJsZVNjYWxpbmcuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZTtcbiAgICAgIGlmICghd3JpdGVBdXRvU2NhbGVBdHRyaWJ1dGUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgXCJBIGdsb2JhbCBUYWJsZSB0aGF0IHVzZXMgUFJPVklTSU9ORUQgYXMgdGhlIGJpbGxpbmcgbW9kZSBuZWVkcyBhdXRvLXNjYWxlZCB3cml0ZSBjYXBhY2l0eS4gXCIgK1xuICAgICAgICAgICAgXCJVc2UgdGhlIGF1dG9TY2FsZVdyaXRlQ2FwYWNpdHkoKSBtZXRob2QgdG8gZW5hYmxlIGl0LlwiLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICghd3JpdGVBdXRvU2NhbGVBdHRyaWJ1dGUuX3NjYWxpbmdQb2xpY3lDcmVhdGVkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIFwiQSBnbG9iYWwgVGFibGUgdGhhdCB1c2VzIFBST1ZJU0lPTkVEIGFzIHRoZSBiaWxsaW5nIG1vZGUgbmVlZHMgYXV0by1zY2FsZWQgd3JpdGUgY2FwYWNpdHkgd2l0aCBhIHBvbGljeS4gXCIgK1xuICAgICAgICAgICAgXCJDYWxsIG9uZSBvZiB0aGUgc2NhbGVPbiooKSBtZXRob2RzIG9mIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBhdXRvU2NhbGVXcml0ZUNhcGFjaXR5KClcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm92aXNpb25pbmcocHJvcHM6IHtcbiAgICByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gICAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgfSkge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVhZENhcGFjaXR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJvcHMud3JpdGVDYXBhY2l0eSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIllvdSBjYW5ub3QgcHJvdmlzaW9uIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIHRhYmxlIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3Zpc2lvbmluZ0dTSShwcm9wczogR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcykge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVhZENhcGFjaXR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJvcHMud3JpdGVDYXBhY2l0eSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIllvdSBjYW5ub3QgcHJvdmlzaW9uIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIEdTSSB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGUgb24gdGhlIHRhYmxlXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlSW5kZXhOYW1lKGluZGV4TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5SW5kZXhTY2hlbWFzLmhhcyhpbmRleE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgQSBkdXBsaWNhdGUgaW5kZXggbmFtZSwgJHtpbmRleE5hbWV9LCBpcyBub3QgYWxsb3dlZGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVOb25LZXlBdHRyaWJ1dGVzKG5vbktleUF0dHJpYnV0ZXM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKHRoaXMubm9uS2V5QXR0cmlidXRlcy5zaXplICsgbm9uS2V5QXR0cmlidXRlcy5sZW5ndGggPiAxMDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICBcIkEgbWF4aW11bSBudW1iZXIgb2Ygbm9uS2V5QXR0cmlidXRlcyBhY3Jvc3MgYWxsIG9mIHNlY29uZGFyeSBpbmRleGVzIGlzIDEwMFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgbm9uS2V5QXR0cmlidXRlcy5mb3JFYWNoKChhdHQpID0+IHRoaXMubm9uS2V5QXR0cmlidXRlcy5hZGQoYXR0KSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclBvaW50SW5UaW1lUmVjb3ZlcnkoXG4gICAgcHJvcHM6IFRhYmxlUHJvcHMsXG4gICk6IGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZVBvaW50SW5UaW1lUmVjb3ZlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmIChcbiAgICAgIHByb3BzLnBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLnBvaW50SW5UaW1lUmVjb3ZlcnkgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJgcG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb25gIGFuZCBgcG9pbnRJblRpbWVSZWNvdmVyeWAgYXJlIHNldC4gVXNlIGBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbmAgb25seS5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlYyA9IHByb3BzLnBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uO1xuICAgIGlmIChzcGVjPy5yZWNvdmVyeVBlcmlvZEluRGF5cykge1xuICAgICAgLy8gVE9ETzogVXBncmFkZSBwcm92aWRlciB0byA1Ljk4LjAgdG8gc3VwcG9ydCByZWNvdmVyeVBlcmlvZEluRGF5c1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgXCJXYXJuaW5nOiByZWNvdmVyeVBlcmlvZEluRGF5cyBpcyBub3Qgc3VwcG9ydGVkIHVudGlsIHByb3ZpZGVyIGF3cyBpcyB1cGdyYWRlZCB0byA1Ljk4LjAgYW5kIHdpbGwgYmUgaWdub3JlZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlZCA9XG4gICAgICBzcGVjPy5wb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZCA/PyBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5O1xuICAgIGlmIChlbmFibGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgZW5hYmxlZCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEluZGV4UHJvamVjdGlvbihcbiAgICBwcm9wczogU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgKTogUGljazxcbiAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleCxcbiAgICBcInByb2plY3Rpb25UeXBlXCIgfCBcIm5vbktleUF0dHJpYnV0ZXNcIlxuICA+IHtcbiAgICBpZiAoXG4gICAgICBwcm9wcy5wcm9qZWN0aW9uVHlwZSA9PT0gUHJvamVjdGlvblR5cGUuSU5DTFVERSAmJlxuICAgICAgIXByb3BzLm5vbktleUF0dHJpYnV0ZXNcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBOb24ta2V5IGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHVzaW5nICR7UHJvamVjdGlvblR5cGUuSU5DTFVERX0gcHJvamVjdGlvbiB0eXBlYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHByb3BzLnByb2plY3Rpb25UeXBlICE9PSBQcm9qZWN0aW9uVHlwZS5JTkNMVURFICYmXG4gICAgICBwcm9wcy5ub25LZXlBdHRyaWJ1dGVzXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgTm9uLWtleSBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkIHdoZW4gbm90IHVzaW5nICR7UHJvamVjdGlvblR5cGUuSU5DTFVERX0gcHJvamVjdGlvbiB0eXBlYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5ub25LZXlBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTm9uS2V5QXR0cmlidXRlcyhwcm9wcy5ub25LZXlBdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2plY3Rpb25UeXBlOiBwcm9wcy5wcm9qZWN0aW9uVHlwZSA/PyBQcm9qZWN0aW9uVHlwZS5BTEwsXG4gICAgICBub25LZXlBdHRyaWJ1dGVzOiBwcm9wcy5ub25LZXlBdHRyaWJ1dGVzLFxuICAgIH07XG4gIH1cblxuICAvLyBUT0RPOiBrZXlUeXBlIGlzIHVudXNlZFxuICBwcml2YXRlIGFkZEtleShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgX2tleVR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nQXR0ciA9IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5maW5kKFxuICAgICAgKGRlZikgPT4gZGVmLm5hbWUgPT09IGF0dHJpYnV0ZS5uYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXR0ciAmJiBleGlzdGluZ0F0dHIudHlwZSAhPT0gYXR0cmlidXRlLnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gc3BlY2lmeSAke2F0dHJpYnV0ZS5uYW1lfSBhcyAke2F0dHJpYnV0ZS50eXBlfSBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IGRlZmluZWQgYXMgJHtleGlzdGluZ0F0dHIudHlwZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFleGlzdGluZ0F0dHIpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5wdXNoKHtcbiAgICAgICAgbmFtZTogYXR0cmlidXRlLm5hbWUsXG4gICAgICAgIHR5cGU6IGF0dHJpYnV0ZS50eXBlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEZvciB0aGUgbWFpbiB0YWJsZSwgaGFzaEtleSBhbmQgcmFuZ2VLZXkgYXJlIHNldCBkaXJlY3RseSBvbiB0aGUgcmVzb3VyY2UuXG4gICAgLy8gRm9yIEdTSXMvTFNJcywgdGhleSBhcmUgcGFydCBvZiB0aGVpciByZXNwZWN0aXZlIGJsb2Nrcy5cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpIHtcbiAgICBjb25zdCBleGlzdGluZ0RlZiA9IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5maW5kKFxuICAgICAgKGRlZikgPT4gZGVmLm5hbWUgPT09IGF0dHJpYnV0ZS5uYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nRGVmICYmIGV4aXN0aW5nRGVmLnR5cGUgIT09IGF0dHJpYnV0ZS50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVW5hYmxlIHRvIHNwZWNpZnkgJHthdHRyaWJ1dGUubmFtZX0gYXMgJHthdHRyaWJ1dGUudHlwZX0gYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSBkZWZpbmVkIGFzICR7ZXhpc3RpbmdEZWYudHlwZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFleGlzdGluZ0RlZikge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVEZWZpbml0aW9uc0ludGVybmFsLnB1c2goe1xuICAgICAgICBuYW1lOiBhdHRyaWJ1dGUubmFtZSxcbiAgICAgICAgdHlwZTogYXR0cmlidXRlLnR5cGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBDb21tZW50aW5nIG91dCBtYWtlU2NhbGluZ1JvbGUgbWV0aG9kIC0gVGVycmFmb3JtIGhhbmRsZXMgc2VydmljZS1saW5rZWQgcm9sZXMgYXV0b21hdGljYWxseVxuICAvLyBVbmxpa2UgQVdTIENESyBDbG91ZEZvcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiwgVGVycmFmb3JtIEFXUyBwcm92aWRlciBjcmVhdGVzIGFwcHJvcHJpYXRlXG4gIC8vIHNlcnZpY2UtbGlua2VkIHJvbGVzIHdoZW4gcm9sZUFybiBpcyBvbWl0dGVkIGZyb20gYXdzX2FwcGF1dG9zY2FsaW5nX3RhcmdldCByZXNvdXJjZVxuICAvLyBwcml2YXRlIG1ha2VTY2FsaW5nUm9sZSgpOiBpYW0uSVJvbGUge1xuICAvLyAgIC8vIFVzZSBhIFNlcnZpY2UgTGlua2VkIFJvbGUuXG4gIC8vICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F1dG9zY2FsaW5nL2FwcGxpY2F0aW9uL3VzZXJndWlkZS9hcHBsaWNhdGlvbi1hdXRvLXNjYWxpbmctc2VydmljZS1saW5rZWQtcm9sZXMuaHRtbFxuICAvLyAgIHJldHVybiBpYW0uUm9sZS5mcm9tUm9sZUFybihcbiAgLy8gICAgIHRoaXMsXG4gIC8vICAgICBcIlNjYWxpbmdSb2xlXCIsXG4gIC8vICAgICB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gIC8vICAgICAgIHNlcnZpY2U6IFwiaWFtXCIsXG4gIC8vICAgICAgIHJlZ2lvbjogXCJcIiwgLy8gU0xScyBhcmUgZ2xvYmFsXG4gIC8vICAgICAgIHJlc291cmNlOlxuICAvLyAgICAgICAgIFwicm9sZS9hd3Mtc2VydmljZS1yb2xlL2R5bmFtb2RiLmFwcGxpY2F0aW9uLWF1dG9zY2FsaW5nLmFtYXpvbmF3cy5jb21cIixcbiAgLy8gICAgICAgcmVzb3VyY2VOYW1lOiBcIkFXU1NlcnZpY2VSb2xlRm9yQXBwbGljYXRpb25BdXRvU2NhbGluZ19EeW5hbW9EQlRhYmxlXCIsXG4gIC8vICAgICAgIC8vIFRPRE86IElzIHRoaXMgbmVlZGVkP1xuICAvLyAgICAgICAvLyBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FLCAvLyBTcGVjaWFsIGZvcm1hdCBmb3IgU0xSc1xuICAvLyAgICAgfSksXG4gIC8vICAgKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHJlcGxpY2EgdGFibGVzXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb25zIHJlZ2lvbnMgd2hlcmUgdG8gY3JlYXRlIHRhYmxlc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJSZXBsaWNhcyhcbiAgICByZWdpb25zPzogc3RyaW5nW10sXG4gICAgcmVwbGljYVNwZWNpZmljYXRpb24/OiBEeW5hbW9kYlRhYmxlUmVwbGljYVtdLFxuICApOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVSZXBsaWNhW10gfCB1bmRlZmluZWQge1xuICAgIGlmIChyZXBsaWNhU3BlY2lmaWNhdGlvbiAmJiByZXBsaWNhU3BlY2lmaWNhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFjay5yZWdpb24pICYmXG4gICAgICAgIHJlcGxpY2FTcGVjaWZpY2F0aW9uLnNvbWUoXG4gICAgICAgICAgKHJlcGxpY2EpID0+IHJlcGxpY2EucmVnaW9uTmFtZSA9PT0gdGhpcy5zdGFjay5yZWdpb24sXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiYHJlcGxpY2FTcGVjaWZpY2F0aW9uYCBjYW5ub3QgaW5jbHVkZSB0aGUgcmVnaW9uIHdoZXJlIHRoaXMgc3RhY2sgaXMgZGVwbG95ZWQuXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXBsaWNhU3BlY2lmaWNhdGlvbi5tYXAoKHJlcGxpY2EpID0+ICh7XG4gICAgICAgIHJlZ2lvbk5hbWU6IHJlcGxpY2EucmVnaW9uTmFtZSxcbiAgICAgICAga21zS2V5QXJuOiByZXBsaWNhLmVuY3J5cHRpb25LZXk/LmtleUFybixcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeTogcmVwbGljYS5wb2ludEluVGltZVJlY292ZXJ5LFxuICAgICAgICBwcm9wYWdhdGVUYWdzOiByZXBsaWNhLnByb3BhZ2F0ZVRhZ3MsXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmICghcmVnaW9ucyB8fCByZWdpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmIChcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFjay5yZWdpb24pICYmXG4gICAgICByZWdpb25zLmluY2x1ZGVzKHRoaXMuc3RhY2sucmVnaW9uKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJgcmVwbGljYXRpb25SZWdpb25zYCBjYW5ub3QgaW5jbHVkZSB0aGUgcmVnaW9uIHdoZXJlIHRoaXMgc3RhY2sgaXMgZGVwbG95ZWQuXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4ubmV3IFNldChyZWdpb25zKV0ubWFwKChyZWdpb24pID0+ICh7XG4gICAgICByZWdpb25OYW1lOiByZWdpb24sXG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBoYXNJbmRleCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5nbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubGVuZ3RoICtcbiAgICAgICAgdGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5sZW5ndGggPlxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogVGFibGVQcm9wcyk6IHtcbiAgICBzc2VTcGVjaWZpY2F0aW9uPzogZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlU2VydmVyU2lkZUVuY3J5cHRpb247XG4gICAgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICB9IHtcbiAgICBsZXQgZW5jcnlwdGlvblR5cGUgPSBwcm9wcy5lbmNyeXB0aW9uO1xuICAgIGlmIChlbmNyeXB0aW9uVHlwZSAhPSBudWxsICYmIHByb3BzLnNlcnZlclNpZGVFbmNyeXB0aW9uICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiT25seSBvbmUgb2YgZW5jcnlwdGlvbiBhbmQgc2VydmVyU2lkZUVuY3J5cHRpb24gY2FuIGJlIHNwZWNpZmllZCwgYnV0IGJvdGggd2VyZSBwcm92aWRlZFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnNlcnZlclNpZGVFbmNyeXB0aW9uICYmIHByb3BzLmVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiZW5jcnlwdGlvbktleSBjYW5ub3QgYmUgc3BlY2lmaWVkIHdoZW4gc2VydmVyU2lkZUVuY3J5cHRpb24gaXMgc3BlY2lmaWVkLiBVc2UgZW5jcnlwdGlvbiBpbnN0ZWFkXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmNyeXB0aW9uVHlwZSA9XG4gICAgICAgIHByb3BzLmVuY3J5cHRpb25LZXkgIT0gbnVsbFxuICAgICAgICAgID8gVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRURcbiAgICAgICAgICA6IHByb3BzLnNlcnZlclNpZGVFbmNyeXB0aW9uXG4gICAgICAgICAgICA/IFRhYmxlRW5jcnlwdGlvbi5BV1NfTUFOQUdFRFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEICYmXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgZW5jcnlwdGlvbktleSBjYW5ub3QgYmUgc3BlY2lmaWVkIHVubGVzcyBlbmNyeXB0aW9uIGlzIHNldCB0byBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCAoaXQgd2FzIHNldCB0byAke2VuY3J5cHRpb25UeXBlfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBpbiB0aGlzIGNhc2UsIGVhY2ggcmVwbGljYSBzaG91bGQgc3BlY2lmeSBhIEN1c3RvbWVyIEtNUyBrZXkuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgPT09IFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEICYmXG4gICAgICBwcm9wcy5yZXBsaWNhdGlvblJlZ2lvbnNcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRUQgaXMgbm90IHN1cHBvcnRlZCBieSBEeW5hbW9EQiBHbG9iYWwgVGFibGVzICh3aGVyZSByZXBsaWNhdGlvblJlZ2lvbnMgd2FzIHNldClcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24gJiZcbiAgICAgIHByb3BzLnJlcGxpY2FTcGVjaWZpY2F0aW9uLmxlbmd0aCA+IDAgJiZcbiAgICAgIGVuY3J5cHRpb25UeXBlID09PSBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbi5zb21lKFxuICAgICAgICAgIChyZXBsaWNhKSA9PiAhcmVwbGljYS5lbmNyeXB0aW9uS2V5LCAvLyBDaGVjayBpZiBhbnkgcmVwbGljYSBpcyBtaXNzaW5nIGFuIGVuY3J5cHRpb24ga2V5XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiV2hlbiB1c2luZyByZXBsaWNhU3BlY2lmaWNhdGlvbiwgZWFjaCByZXBsaWNhIG11c3Qgc3BlY2lmeSBhbiBlbmNyeXB0aW9uS2V5IGlmIFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEIGlzIHVzZWRcIixcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvL1ZhbGlkYXRlIHRoYXQgdGhlIGtleXMgYmVsb25nIHRvIHRoZSBjb3JyZWN0IHJlZ2lvbnNcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24uc29tZShcbiAgICAgICAgICAocmVwbGljYSkgPT5cbiAgICAgICAgICAgIHJlcGxpY2EuZW5jcnlwdGlvbktleSAmJlxuICAgICAgICAgICAgcmVwbGljYS5lbmNyeXB0aW9uS2V5LmVudi5yZWdpb24gIT09IHJlcGxpY2EucmVnaW9uTmFtZSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJXaGVuIHVzaW5nIHJlcGxpY2FTcGVjaWZpY2F0aW9uLCBlYWNoIHJlcGxpY2EncyBlbmNyeXB0aW9uS2V5IG11c3QgYmUgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIGl0cyByZXBsaWNhXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKGVuY3J5cHRpb25UeXBlKSB7XG4gICAgICBjYXNlIFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEOlxuICAgICAgICBjb25zdCBrZXkgPVxuICAgICAgICAgIHByb3BzLmVuY3J5cHRpb25LZXkgPz9cbiAgICAgICAgICBuZXcga21zLktleSh0aGlzLCBcIktleVwiLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYEN1c3RvbWVyLW1hbmFnZWQga2V5IGF1dG8tY3JlYXRlZCBmb3IgZW5jcnlwdGluZyBEeW5hbW9EQiB0YWJsZSBhdCAke3RoaXMubm9kZS5wYXRofWAsXG4gICAgICAgICAgICBlbmFibGVLZXlSb3RhdGlvbjogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzc2VTcGVjaWZpY2F0aW9uOiB7IGVuYWJsZWQ6IHRydWUsIGttc0tleUFybjoga2V5LmtleUFybiB9LFxuICAgICAgICAgIGVuY3J5cHRpb25LZXk6IGtleSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgVGFibGVFbmNyeXB0aW9uLkFXU19NQU5BR0VEOlxuICAgICAgICByZXR1cm4geyBzc2VTcGVjaWZpY2F0aW9uOiB7IGVuYWJsZWQ6IHRydWUgfSB9OyAvLyBVc2VzIGFsaWFzL2F3cy9keW5hbW9kYiBieSBkZWZhdWx0XG4gICAgICBjYXNlIFRhYmxlRW5jcnlwdGlvbi5ERUZBVUxUOlxuICAgICAgICByZXR1cm4geyBzc2VTcGVjaWZpY2F0aW9uOiB7IGVuYWJsZWQ6IGZhbHNlIH0gfTsgLy8gQVdTLW93bmVkIGtleVxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB7IHNzZVNwZWNpZmljYXRpb246IHVuZGVmaW5lZCB9OyAvLyBEZWZhdWx0cyB0byBBV1Mtb3duZWQga2V5XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGBVbmV4cGVjdGVkICdlbmNyeXB0aW9uVHlwZSc6ICR7ZW5jcnlwdGlvblR5cGV9YCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVySW1wb3J0U291cmNlU3BlY2lmaWNhdGlvbihcbiAgICBpbXBvcnRTb3VyY2U/OiBJbXBvcnRTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICApOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpbXBvcnRTb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVuZGVyZWRJbnB1dEZvcm1hdCA9IGltcG9ydFNvdXJjZS5pbnB1dEZvcm1hdC5fcmVuZGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0Rm9ybWF0OiByZW5kZXJlZElucHV0Rm9ybWF0LmlucHV0Rm9ybWF0LFxuICAgICAgaW5wdXRGb3JtYXRPcHRpb25zOiByZW5kZXJlZElucHV0Rm9ybWF0LmlucHV0Rm9ybWF0T3B0aW9ucyxcbiAgICAgIGlucHV0Q29tcHJlc3Npb25UeXBlOiBpbXBvcnRTb3VyY2UuY29tcHJlc3Npb25UeXBlLFxuICAgICAgczNCdWNrZXRTb3VyY2U6IHtcbiAgICAgICAgYnVja2V0OiBpbXBvcnRTb3VyY2UuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgIGJ1Y2tldE93bmVyOiBpbXBvcnRTb3VyY2UuYnVja2V0T3duZXIsXG4gICAgICAgIGtleVByZWZpeDogaW1wb3J0U291cmNlLmtleVByZWZpeCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgU2NhbGFibGVBdHRyaWJ1dGVQYWlyIHtcbiAgc2NhbGFibGVSZWFkQXR0cmlidXRlPzogU2NhbGFibGVUYWJsZUF0dHJpYnV0ZTtcbiAgc2NhbGFibGVXcml0ZUF0dHJpYnV0ZT86IFNjYWxhYmxlVGFibGVBdHRyaWJ1dGU7XG59XG4iXX0=
1204
+ Table[_c] = { fqn: "terraconstructs.aws.storage.Table", version: "0.2.2" };
1205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL3N0b3JhZ2UvdGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RkFBOEY7QUFFOUYsc0RBSzZCO0FBQzdCLGlDQUFvQztBQUdwQywwQkFBOEU7QUFDOUUsMkZBQXNFO0FBS3RFLHlFQUFvRTtBQUNwRSxxQ0FpQmtCO0FBQ2xCLG1EQUErQztBQUMvQyxpREFBNkM7QUFDN0MseUNBQXdFO0FBQ3hFLDRDQUE0QztBQUM1Qyx5Q0FBeUM7QUFDekMscUNBQXFDO0FBQ3JDLDhCQUE4QjtBQUc5QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFDN0IsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBRS9CLHdHQUF3RztBQUN4RyxNQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQW1CMUM7O0dBRUc7QUFDSCxJQUFZLG9CQWVYO0FBZkQsV0FBWSxvQkFBb0I7SUFDOUI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQWZXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBZS9CO0FBZ0NEOztHQUVHO0FBQ0gsTUFBc0IsV0FBVztJQUMvQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEtBQU0sU0FBUSxXQUFXO1lBQzVCLE9BQU87Z0JBSVosT0FBTztvQkFDTCxXQUFXLEVBQUUsZUFBZTtpQkFDN0IsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxHQUFHO1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFdBQVc7WUFDNUIsT0FBTztnQkFJWixPQUFPO29CQUNMLFdBQVcsRUFBRSxLQUFLO2lCQUNuQixDQUFDO1lBQ0os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LHFCQUFxQixFQUNyQjtvQkFDRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFNBQVMsRUFBRSxHQUFHLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxJQUFJO2lCQUNqRCxDQUNGLENBQUM7Z0JBQ0YsT0FBTyxHQUFHLENBQUMsZ0NBQWdDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7O0FBaG1DSCxzQkFpbUNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTg2LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiL2xpYi90YWJsZS50c1xuXG5pbXBvcnQge1xuICBkeW5hbW9kYkNvbnRyaWJ1dG9ySW5zaWdodHMsXG4gIGR5bmFtb2RiS2luZXNpc1N0cmVhbWluZ0Rlc3RpbmF0aW9uLFxuICBkeW5hbW9kYlJlc291cmNlUG9saWN5LFxuICBkeW5hbW9kYlRhYmxlLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgVG9rZW4sIExhenkgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBzdG9yYWdlIGZyb20gXCIuXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQsIEF3c0NvbnN0cnVjdEJhc2UsIEF3c0NvbnN0cnVjdFByb3BzLCBBd3NTdGFjayB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgRHluYW1vREJNZXRyaWNzIH0gZnJvbSBcIi4vZHluYW1vZGItY2FubmVkLW1ldHJpY3MuZ2VuZXJhdGVkXCI7XG5pbXBvcnQge1xuICBFbmFibGVTY2FsaW5nUHJvcHMsXG4gIElTY2FsYWJsZVRhYmxlQXR0cmlidXRlLFxufSBmcm9tIFwiLi9zY2FsYWJsZS1hdHRyaWJ1dGUtYXBpXCI7XG5pbXBvcnQgeyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlIH0gZnJvbSBcIi4vc2NhbGFibGUtdGFibGUtYXR0cmlidXRlXCI7XG5pbXBvcnQge1xuICBPcGVyYXRpb24sXG4gIE9wZXJhdGlvbnNNZXRyaWNPcHRpb25zLFxuICBTeXN0ZW1FcnJvcnNGb3JPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgQXR0cmlidXRlLFxuICBCaWxsaW5nTW9kZSxcbiAgUHJvamVjdGlvblR5cGUsXG4gIElUYWJsZSxcbiAgU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgVGFibGVDbGFzcyxcbiAgTG9jYWxTZWNvbmRhcnlJbmRleFByb3BzLFxuICBUYWJsZUVuY3J5cHRpb24sXG4gIFN0cmVhbVZpZXdUeXBlLFxuICBQb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbixcbiAgV2FybVRocm91Z2hwdXQsXG4gIENvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uLFxuICB2YWxpZGF0ZUNvbnRyaWJ1dG9ySW5zaWdodHMsXG59IGZyb20gXCIuL3NoYXJlZFwiO1xuaW1wb3J0IHsgU3RyZWFtR3JhbnRzIH0gZnJvbSBcIi4vc3RyZWFtLWdyYW50c1wiO1xuaW1wb3J0IHsgVGFibGVHcmFudHMgfSBmcm9tIFwiLi90YWJsZS1ncmFudHNcIjtcbmltcG9ydCB7IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzXCI7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gXCIuLi9jbG91ZHdhdGNoXCI7XG5pbXBvcnQgKiBhcyBhcHBzY2FsaW5nIGZyb20gXCIuLi9jb21wdXRlXCI7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSBcIi4uL2VuY3J5cHRpb25cIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgKiBhcyBraW5lc2lzIGZyb20gXCIuLi9ub3RpZnlcIjtcblxuY29uc3QgSEFTSF9LRVlfVFlQRSA9IFwiSEFTSFwiO1xuY29uc3QgUkFOR0VfS0VZX1RZUEUgPSBcIlJBTkdFXCI7XG5cbi8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25keW5hbW9kYi9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvTGltaXRzLmh0bWwjbGltaXRzLXNlY29uZGFyeS1pbmRleGVzXG5jb25zdCBNQVhfTE9DQUxfU0VDT05EQVJZX0lOREVYX0NPVU5UID0gNTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB0YWJsZSBzY2hlbWEgYXR0cmlidXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhcnRpdGlvbiBrZXkgYXR0cmlidXRlIGRlZmluaXRpb24uXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb25LZXk6IEF0dHJpYnV0ZTtcblxuICAvKipcbiAgICogU29ydCBrZXkgYXR0cmlidXRlIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIHNvcnQga2V5XG4gICAqL1xuICByZWFkb25seSBzb3J0S2V5PzogQXR0cmlidXRlO1xufVxuXG4vKipcbiAqIFR5cGUgb2YgY29tcHJlc3Npb24gdG8gdXNlIGZvciBpbXBvcnRlZCBkYXRhLlxuICovXG5leHBvcnQgZW51bSBJbnB1dENvbXByZXNzaW9uVHlwZSB7XG4gIC8qKlxuICAgKiBHWklQIGNvbXByZXNzaW9uLlxuICAgKi9cbiAgR1pJUCA9IFwiR1pJUFwiLFxuXG4gIC8qKlxuICAgKiBaU1REIGNvbXByZXNzaW9uLlxuICAgKi9cbiAgWlNURCA9IFwiWlNURFwiLFxuXG4gIC8qKlxuICAgKiBObyBjb21wcmVzc2lvbi5cbiAgICovXG4gIE5PTkUgPSBcIk5PTkVcIixcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgaW1wb3J0ZWQgc291cmNlIGZpbGVzIGluIENTViBmb3JtYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3N2T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGVsaW1pdGVyIHVzZWQgZm9yIHNlcGFyYXRpbmcgaXRlbXMgaW4gdGhlIENTViBmaWxlIGJlaW5nIGltcG9ydGVkLlxuICAgKlxuICAgKiBWYWxpZCBkZWxpbWl0ZXJzIGFyZSBhcyBmb2xsb3dzOlxuICAgKiAtIGNvbW1hIChgLGApXG4gICAqIC0gdGFiIChgXFx0YClcbiAgICogLSBjb2xvbiAoYDpgKVxuICAgKiAtIHNlbWljb2xvbiAoYDtgKVxuICAgKiAtIHBpcGUgKGB8YClcbiAgICogLSBzcGFjZSAoYCBgKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSBjb21tYSBhcyBhIGRlbGltaXRlci5cbiAgICovXG4gIHJlYWRvbmx5IGRlbGltaXRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiB0aGUgaGVhZGVycyB1c2VkIHRvIHNwZWNpZnkgYSBjb21tb24gaGVhZGVyIGZvciBhbGwgc291cmNlIENTViBmaWxlcyBiZWluZyBpbXBvcnRlZC5cbiAgICpcbiAgICogKipOT1RFKio6IElmIHRoaXMgZmllbGQgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGxpbmUgb2YgZWFjaCBDU1YgZmlsZSBpcyB0cmVhdGVkIGFzIGRhdGEgaW5zdGVhZCBvZiB0aGUgaGVhZGVyLlxuICAgKiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHRoZSBmaXJzdCBsaW5lIG9mIGVhY2ggQ1NWIGZpbGUgaXMgdHJlYXRlZCBhcyB0aGUgaGVhZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBDU1YgZmlsZSBpcyB0cmVhdGVkIGFzIHRoZSBoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlckxpc3Q/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgZm9ybWF0IG9mIHRoZSBzb3VyY2UgZGF0YS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElucHV0Rm9ybWF0IHtcbiAgLyoqXG4gICAqIER5bmFtb0RCIEpTT04gZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkeW5hbW9EQkpzb24oKTogSW5wdXRGb3JtYXQge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5wdXRGb3JtYXQge1xuICAgICAgcHVibGljIF9yZW5kZXIoKTogUGljazxcbiAgICAgICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlSW1wb3J0VGFibGUsXG4gICAgICAgIFwiaW5wdXRGb3JtYXRcIiB8IFwiaW5wdXRGb3JtYXRPcHRpb25zXCJcbiAgICAgID4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlucHV0Rm9ybWF0OiBcIkRZTkFNT0RCX0pTT05cIixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFtYXpvbiBJb24gZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpb24oKTogSW5wdXRGb3JtYXQge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5wdXRGb3JtYXQge1xuICAgICAgcHVibGljIF9yZW5kZXIoKTogUGljazxcbiAgICAgICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlSW1wb3J0VGFibGUsXG4gICAgICAgIFwiaW5wdXRGb3JtYXRcIiB8IFwiaW5wdXRGb3JtYXRPcHRpb25zXCJcbiAgICAgID4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlucHV0Rm9ybWF0OiBcIklPTlwiLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICAvKipcbiAgICogQ1NWIGZvcm1hdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3N2KG9wdGlvbnM/OiBDc3ZPcHRpb25zKTogSW5wdXRGb3JtYXQge1xuICAgIC8vIFdlIGFyZSB1c2luZyB0aGUgLmxlbmd0aCBwcm9wZXJ0eSB0byBjaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBkZWxpbWl0ZXIuXG4gICAgLy8gTm90ZSB0aGF0IC5sZW5ndGggbWF5IG5vdCByZXR1cm4gdGhlIGV4cGVjdGVkIHJlc3VsdCBmb3IgbXVsdGktY29kZXBvaW50IGNoYXJhY3RlcnMgbGlrZSBmdWxsLXdpZHRoIGNoYXJhY3RlcnMgb3IgZW1vamlzLFxuICAgIC8vIGJ1dCBzdWNoIGNoYXJhY3RlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBiZSB1c2VkIGFzIGRlbGltaXRlcnMgaW4gdGhpcyBjb250ZXh0LlxuICAgIGlmIChcbiAgICAgIG9wdGlvbnM/LmRlbGltaXRlciAmJlxuICAgICAgKCF0aGlzLnZhbGlkQ3N2RGVsaW1pdGVycy5pbmNsdWRlcyhvcHRpb25zLmRlbGltaXRlcikgfHxcbiAgICAgICAgb3B0aW9ucy5kZWxpbWl0ZXIubGVuZ3RoICE9PSAxKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBbXG4gICAgICAgICAgXCJEZWxpbWl0ZXIgbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nOlwiLFxuICAgICAgICAgIGAke3RoaXMucmVhZGFibGVWYWxpZENzdkRlbGltaXRlcnMuam9pbihcIiwgXCIpfSxgLFxuICAgICAgICAgIGBnb3QgJyR7b3B0aW9ucy5kZWxpbWl0ZXJ9J2AsXG4gICAgICAgIF0uam9pbihcIiBcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5wdXRGb3JtYXQge1xuICAgICAgcHVibGljIF9yZW5kZXIoKTogUGljazxcbiAgICAgICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlSW1wb3J0VGFibGUsXG4gICAgICAgIFwiaW5wdXRGb3JtYXRcIiB8IFwiaW5wdXRGb3JtYXRPcHRpb25zXCJcbiAgICAgID4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlucHV0Rm9ybWF0OiBcIkNTVlwiLFxuICAgICAgICAgIGlucHV0Rm9ybWF0T3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY3N2OiB7XG4gICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IG9wdGlvbnM/LmRlbGltaXRlcixcbiAgICAgICAgICAgICAgICAgIGhlYWRlckxpc3Q6IG9wdGlvbnM/LmhlYWRlckxpc3QsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZCBDU1YgZGVsaW1pdGVycy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1keW5hbW9kYi10YWJsZS1jc3YuaHRtbCNjZm4tZHluYW1vZGItdGFibGUtY3N2LWRlbGltaXRlclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRDc3ZEZWxpbWl0ZXJzID0gW1wiLFwiLCBcIlxcdFwiLCBcIjpcIiwgXCI7XCIsIFwifFwiLCBcIiBcIl07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZGFibGVWYWxpZENzdkRlbGltaXRlcnMgPSBbXG4gICAgXCJjb21tYSAoLClcIixcbiAgICBcInRhYiAoXFxcXHQpXCIsXG4gICAgXCJjb2xvbiAoOilcIixcbiAgICBcInNlbWljb2xvbiAoOylcIixcbiAgICBcInBpcGUgKHwpXCIsXG4gICAgXCJzcGFjZSAoIClcIixcbiAgXTtcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBpbnB1dCBmb3JtYXQgYW5kIG9wdGlvbnMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9yZW5kZXIoKTogUGljazxcbiAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICBcImlucHV0Rm9ybWF0XCIgfCBcImlucHV0Rm9ybWF0T3B0aW9uc1wiXG4gID47XG59XG5cbi8qKlxuICogIFByb3BlcnRpZXMgZm9yIGltcG9ydGluZyBkYXRhIGZyb20gdGhlIFMzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFNvdXJjZVNwZWNpZmljYXRpb24ge1xuICAvKipcbiAgICogVGhlIGNvbXByZXNzaW9uIHR5cGUgb2YgdGhlIGltcG9ydGVkIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IElucHV0Q29tcHJlc3Npb25UeXBlLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXByZXNzaW9uVHlwZT86IElucHV0Q29tcHJlc3Npb25UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBpbXBvcnRlZCBkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRGb3JtYXQ6IElucHV0Rm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHRoYXQgaXMgYmVpbmcgaW1wb3J0ZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIFMzIGJ1Y2tldCB0aGF0IGlzIGJlaW5nIGltcG9ydGVkIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE93bmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHByZWZpeCBzaGFyZWQgYnkgYWxsIFMzIE9iamVjdHMgdGhhdCBhcmUgYmVpbmcgaW1wb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGtleVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcHJlY2lzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgRHluYW1vREIgd3JpdGUgdGltZXN0YW1wcyB0aGF0IHdpbGwgYmUgcmVwbGljYXRlZCB0byBLaW5lc2lzLlxuICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgcmVjb3JkIHRpbWVzdGFtcCBwcmVjaXNpb24gaXMgbWljcm9zZWNvbmRzLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHNldHRpbmcgYXQgYW55IHRpbWUuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLWtpbmVzaXNzdHJlYW1zcGVjaWZpY2F0aW9uLmh0bWwjYXdzLXByb3BlcnRpZXMtZHluYW1vZGItdGFibGUta2luZXNpc3N0cmVhbXNwZWNpZmljYXRpb24tcHJvcGVydGllc1xuICovXG5leHBvcnQgZW51bSBBcHByb3hpbWF0ZUNyZWF0aW9uRGF0ZVRpbWVQcmVjaXNpb24ge1xuICAvKipcbiAgICogTWlsbGlzZWNvbmQgcHJlY2lzaW9uXG4gICAqL1xuICBNSUxMSVNFQ09ORCA9IFwiTUlMTElTRUNPTkRcIixcblxuICAvKipcbiAgICogTWljcm9zZWNvbmQgcHJlY2lzaW9uXG4gICAqL1xuICBNSUNST1NFQ09ORCA9IFwiTUlDUk9TRUNPTkRcIixcbn1cblxuLyoqXG4gKiBDb21tb24gaW50ZXJmYWNlIGZvciB0eXBlcyB0aGF0IGNhbiBjb25maWd1cmUgY29udHJpYnV0b3IgaW5zaWdodHNcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgSUNvbnRyaWJ1dG9ySW5zaWdodHNDb25maWd1cmFibGUge1xuICAvKipcbiAgICogV2hldGhlciBDbG91ZFdhdGNoIGNvbnRyaWJ1dG9yIGluc2lnaHRzIGlzIGVuYWJsZWQuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgY29udHJpYnV0b3JJbnNpZ2h0c1NwZWNpZmljYXRpb25gIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dG9ySW5zaWdodHNFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBDbG91ZFdhdGNoIGNvbnRyaWJ1dG9yIGluc2lnaHRzIGlzIGVuYWJsZWQgYW5kIHdoYXQgbW9kZSBpcyBzZWxlY3RlZFxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJpYnV0b3JJbnNpZ2h0c1NwZWNpZmljYXRpb24/OiBDb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbW9kYlRhYmxlUmVwbGljYSB7XG4gIC8qKiAoT3B0aW9uYWwpIEFSTiBvZiB0aGUgQ01LIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBBV1MgS01TIGVuY3J5cHRpb24uIFRoaXMgYXJndW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUga2V5IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IEtNUy1tYW5hZ2VkIER5bmFtb0RCIGtleSwgYGFsaWFzL2F3cy9keW5hbW9kYmAuICoqTm90ZToqKiBUaGlzIGF0dHJpYnV0ZSB3aWxsIF9ub3RfIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBBUk4gb2YgX2RlZmF1bHRfIGtleXMuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcbiAgLyoqIChPcHRpb25hbCkgV2hldGhlciB0byBlbmFibGUgUG9pbnQgSW4gVGltZSBSZWNvdmVyeSBmb3IgdGhlIHJlcGxpY2EuIERlZmF1bHQgaXMgYGZhbHNlYC4gKi9cbiAgcmVhZG9ubHkgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIC8qKiAoT3B0aW9uYWwpIFdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSBnbG9iYWwgdGFibGUncyB0YWdzIHRvIGEgcmVwbGljYS4gRGVmYXVsdCBpcyBgZmFsc2VgLiBDaGFuZ2VzIHRvIHRhZ3Mgb25seSBtb3ZlIGluIG9uZSBkaXJlY3Rpb246IGZyb20gZ2xvYmFsIChzb3VyY2UpIHRvIHJlcGxpY2EuIEluIG90aGVyIHdvcmRzLCB0YWcgZHJpZnQgb24gYSByZXBsaWNhIHdpbGwgbm90IHRyaWdnZXIgYW4gdXBkYXRlLiBUYWcgb3IgcmVwbGljYSBjaGFuZ2VzIG9uIHRoZSBnbG9iYWwgdGFibGUsIHdoZXRoZXIgZnJvbSBkcmlmdCBvciBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFyZSBwcm9wYWdhdGVkIHRvIHJlcGxpY2FzLiBDaGFuZ2luZyBmcm9tIGB0cnVlYCB0byBgZmFsc2VgIG9uIGEgc3Vic2VxdWVudCBgYXBwbHlgIG1lYW5zIHJlcGxpY2EgdGFncyBhcmUgbGVmdCBhcyB0aGV5IHdlcmUsIHVubWFuYWdlZCwgbm90IGRlbGV0ZWQuICovXG4gIHJlYWRvbmx5IHByb3BhZ2F0ZVRhZ3M/OiBib29sZWFuO1xuICAvKiogKFJlcXVpcmVkKSBSZWdpb24gbmFtZSBvZiB0aGUgcmVwbGljYS4gKi9cbiAgcmVhZG9ubHkgcmVnaW9uTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBEeW5hbW9EQiBUYWJsZVxuICpcbiAqIFVzZSBgVGFibGVQcm9wc2AgZm9yIGFsbCB0YWJsZSBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVPcHRpb25zIGV4dGVuZHMgU2NoZW1hT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgcmVhZCBjYXBhY2l0eSBmb3IgdGhlIHRhYmxlLiBDYXJlZnVsIGlmIHlvdSBhZGQgR2xvYmFsIFNlY29uZGFyeSBJbmRleGVzLCBhc1xuICAgKiB0aG9zZSB3aWxsIHNoYXJlIHRoZSB0YWJsZSdzIHByb3Zpc2lvbmVkIHRocm91Z2hwdXQuXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIGJpbGxpbmdNb2RlIGlzIFByb3Zpc2lvbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgd3JpdGUgY2FwYWNpdHkgZm9yIHRoZSB0YWJsZS4gQ2FyZWZ1bCBpZiB5b3UgYWRkIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhlcywgYXNcbiAgICogdGhvc2Ugd2lsbCBzaGFyZSB0aGUgdGFibGUncyBwcm92aXNpb25lZCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBDYW4gb25seSBiZSBwcm92aWRlZCBpZiBiaWxsaW5nTW9kZSBpcyBQcm92aXNpb25lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gcmVhZCByZXF1ZXN0IHVuaXRzIGZvciB0aGUgdGFibGUuIENhcmVmdWwgaWYgeW91IGFkZCBHbG9iYWwgU2Vjb25kYXJ5IEluZGV4ZXMsIGFzXG4gICAqIHRob3NlIHdpbGwgc2hhcmUgdGhlIHRhYmxlJ3MgbWF4aW11bSBvbi1kZW1hbmQgdGhyb3VnaHB1dC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhSZWFkUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHdyaXRlIHJlcXVlc3QgdW5pdHMgZm9yIHRoZSB0YWJsZS4gQ2FyZWZ1bCBpZiB5b3UgYWRkIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhlcywgYXNcbiAgICogdGhvc2Ugd2lsbCBzaGFyZSB0aGUgdGFibGUncyBtYXhpbXVtIG9uLWRlbWFuZCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBDYW4gb25seSBiZSBwcm92aWRlZCBpZiBiaWxsaW5nTW9kZSBpcyBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gb24tZGVtYW5kIHRocm91Z2hwdXQgaXMgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IG1heFdyaXRlUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGhvdyB5b3UgYXJlIGNoYXJnZWQgZm9yIHJlYWQgYW5kIHdyaXRlIHRocm91Z2hwdXQgYW5kIGhvdyB5b3UgbWFuYWdlIGNhcGFjaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBQUk9WSVNJT05FRCBpZiBgcmVwbGljYXRpb25SZWdpb25zYCBpcyBub3Qgc3BlY2lmaWVkLCBQQVlfUEVSX1JFUVVFU1Qgb3RoZXJ3aXNlXG4gICAqL1xuICByZWFkb25seSBiaWxsaW5nTW9kZT86IEJpbGxpbmdNb2RlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHZhbHVlcyB0byBwcmUtd2FybSB5b3UgRHluYW1vREIgVGFibGVcbiAgICogV2FybSBUaHJvdWdocHV0IGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgR2xvYmFsIFRhYmxlIHJlcGxpY2FzIHVzaW5nIHRoZSBgVGFibGVgIGNvbnN0cnVjdC4gVG8gZW5hYmxlIFdhcm0gVGhyb3VnaHB1dCwgdXNlIHRoZSBgVGFibGVWMmAgY29uc3RydWN0IGluc3RlYWQuXG4gICAqIEBzZWUgaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZHluYW1vZGItdGFibGUuaHRtbCNjZm4tZHluYW1vZGItdGFibGUtd2FybXRocm91Z2hwdXRcbiAgICogQGRlZmF1bHQgLSB3YXJtIHRocm91Z2hwdXQgaXMgbm90IGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IHdhcm1UaHJvdWdocHV0PzogV2FybVRocm91Z2hwdXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcG9pbnQtaW4tdGltZSByZWNvdmVyeSBpcyBlbmFibGVkLlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYHBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uYCBpbnN0ZWFkXG4gICAqIEBkZWZhdWx0IGZhbHNlIC0gcG9pbnQgaW4gdGltZSByZWNvdmVyeSBpcyBub3QgZW5hYmxlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvaW50SW5UaW1lUmVjb3Zlcnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHBvaW50LWluLXRpbWUgcmVjb3ZlcnkgaXMgZW5hYmxlZFxuICAgKiBhbmQgcmVjb3ZlcnlQZXJpb2RJbkRheXMgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBvaW50IGluIHRpbWUgcmVjb3ZlcnkgaXMgbm90IGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbj86IFBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhbiBBV1MgbWFuYWdlZCBjdXN0b21lciBtYXN0ZXIga2V5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHNldCBpZiBgZW5jcnlwdGlvbmAgYW5kL29yIGBlbmNyeXB0aW9uS2V5YCBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHRhYmxlIGlzIGVuY3J5cHRlZCB3aXRoIGFuIGVuY3J5cHRpb24ga2V5IG1hbmFnZWQgYnkgRHluYW1vREIsIGFuZCB5b3UgYXJlIG5vdCBjaGFyZ2VkIGFueSBmZWUgZm9yIHVzaW5nIGl0LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIEluIG9yZGVyIHRvIG9idGFpbiB0aGUgc2FtZSBiZWhhdmlvciBhc1xuICAgKiBlbmFibGluZyB0aGlzLCBzZXQgdGhlIGBlbmNyeXB0aW9uYCBwcm9wZXJ0eSB0byBgVGFibGVFbmNyeXB0aW9uLkFXU19NQU5BR0VEYCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyU2lkZUVuY3J5cHRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB0YWJsZSBjbGFzcy5cbiAgICogQGRlZmF1bHQgU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQ2xhc3M/OiBUYWJsZUNsYXNzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhbiBBV1MgbWFuYWdlZCBjdXN0b21lciBtYXN0ZXIga2V5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHNldCBpZiBgc2VydmVyU2lkZUVuY3J5cHRpb25gIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgdGFibGUgaXMgZW5jcnlwdGVkIHdpdGggYW4gZW5jcnlwdGlvbiBrZXkgbWFuYWdlZCBieSBEeW5hbW9EQiwgYW5kIHlvdSBhcmUgbm90IGNoYXJnZWQgYW55IGZlZSBmb3IgdXNpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogVGFibGVFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgdGFibGUgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBzZXQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRURgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIGBlbmNyeXB0aW9uYCBpcyBzZXQgdG8gYFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEYCBhbmQgdGhpc1xuICAgKiBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsIGEgbmV3IEtNUyBrZXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWJsZS5cbiAgICogSWYgYGVuY3J5cHRpb25gIGFuZCB0aGlzIHByb3BlcnR5IGFyZSBib3RoIHVuZGVmaW5lZCwgdGhlbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkIHdpdGhcbiAgICogYW4gZW5jcnlwdGlvbiBrZXkgbWFuYWdlZCBieSBEeW5hbW9EQiwgYW5kIHlvdSBhcmUgbm90IGNoYXJnZWQgYW55IGZlZSBmb3IgdXNpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIFRUTCBhdHRyaWJ1dGUuXG4gICAqIEBkZWZhdWx0IC0gVFRMIGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSB0aW1lVG9MaXZlQXR0cmlidXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGFuIGl0ZW0gaW4gdGhlIHRhYmxlIGlzIG1vZGlmaWVkLCBTdHJlYW1WaWV3VHlwZSBkZXRlcm1pbmVzIHdoYXQgaW5mb3JtYXRpb25cbiAgICogaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN0cmVhbXMgYXJlIGRpc2FibGVkIHVubGVzcyBgcmVwbGljYXRpb25SZWdpb25zYCBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbT86IFN0cmVhbVZpZXdUeXBlO1xuXG4gIC8qKlxuICAgKiBSZWdpb25zIHdoZXJlIHJlcGxpY2EgdGFibGVzIHdpbGwgYmUgY3JlYXRlZFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgcmVwbGljYVNwZWNpZmljYXRpb24gaW5zdGVhZFxuICAgKiBAZGVmYXVsdCAtIG5vIHJlcGxpY2EgdGFibGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhdGlvblJlZ2lvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHNwZWNpZmljYXRpb24gZm9yIHJlcGxpY2EgdGFibGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGljYVNwZWNpZmljYXRpb24/OiBEeW5hbW9kYlRhYmxlUmVwbGljYVtdO1xuXG4gIC8vIHJlYWRvbmx5IHJlcGxpY2F0aW9uVGltZW91dD86IER1cmF0aW9uOyAvLyBOb3QgZGlyZWN0bHkgYXBwbGljYWJsZSB0byBURidzIHJlcGxpY2EgYmxvY2sgY29uZmlndXJhdGlvblxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIENsb3VkV2F0Y2ggY29udHJpYnV0b3IgaW5zaWdodHMgaXMgZW5hYmxlZC5cbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbiBpbnN0ZWFkXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvckluc2lnaHRzRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQ2xvdWRXYXRjaCBjb250cmlidXRvciBpbnNpZ2h0cyBpcyBlbmFibGVkIGFuZCB3aGF0IG1vZGUgaXMgc2VsZWN0ZWRcbiAgICogQGRlZmF1bHQgLSBjb250cmlidXRvciBpbnNpZ2h0cyBpcyBub3QgZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJpYnV0b3JJbnNpZ2h0c1NwZWNpZmljYXRpb24/OiBDb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBkZWxldGlvbiBwcm90ZWN0aW9uIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWxldGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiBkYXRhIGJlaW5nIGltcG9ydGVkIGZyb20gdGhlIFMzIGJ1Y2tldCBzb3VyY2UgdG8gdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRhdGEgaW1wb3J0IGZyb20gdGhlIFMzIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0U291cmNlPzogSW1wb3J0U291cmNlU3BlY2lmaWNhdGlvbjtcblxuICAvKipcbiAgICogUmVzb3VyY2UgcG9saWN5IHRvIGFzc2lnbiB0byB0YWJsZS5cbiAgICogTm90ZTogYGF3c19keW5hbW9kYl90YWJsZWAgZG9lcyBub3QgZGlyZWN0bHkgc3VwcG9ydCBhIHJlc291cmNlIHBvbGljeSBwcm9wZXJ0eS5cbiAgICogVGhpcyBwb2xpY3kgd291bGQgbmVlZCB0byBiZSBtYW5hZ2VkIGFuZCBhcHBsaWVkIHNlcGFyYXRlbHksIGUuZy4sIHZpYSBgYXdzX2lhbV9wb2xpY3lgIGF0dGFjaGVkIHRvIHByaW5jaXBhbHMuXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVzb3VyY2UgcG9saWN5IHN0YXRlbWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBEeW5hbW9EQiBUYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlUHJvcHMgZXh0ZW5kcyBUYWJsZU9wdGlvbnMsIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIEVuZm9yY2VzIGEgcGFydGljdWxhciBwaHlzaWNhbCB0YWJsZSBuYW1lLlxuICAgKiBAZGVmYXVsdCA8Z2VuZXJhdGVkPlxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLaW5lc2lzIERhdGEgU3RyZWFtIHRvIGNhcHR1cmUgaXRlbS1sZXZlbCBjaGFuZ2VzIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gS2luZXNpcyBEYXRhIFN0cmVhbVxuICAgKi9cbiAgcmVhZG9ubHkga2luZXNpc1N0cmVhbT86IGtpbmVzaXMuSVN0cmVhbTtcblxuICAvKipcbiAgICogS2luZXNpcyBEYXRhIFN0cmVhbSBhcHByb3hpbWF0ZSBjcmVhdGlvbiB0aW1lc3RhbXAgcHJlY2lzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IEFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbi5NSUNST1NFQ09ORFxuICAgKi9cbiAgcmVhZG9ubHkga2luZXNpc1ByZWNpc2lvblRpbWVzdGFtcD86IEFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxTZWNvbmRhcnlJbmRleFByb3BzXG4gIGV4dGVuZHMgU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgICBTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSByZWFkIGNhcGFjaXR5IGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUHJvdmlzaW9uZWQgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZSBjYXBhY2l0eSBmb3IgdGhlIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXguXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIHRhYmxlIGJpbGxpbmdNb2RlIGlzIFByb3Zpc2lvbmVkIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gcmVhZCByZXF1ZXN0IHVuaXRzIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhSZWFkUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB3cml0ZSByZXF1ZXN0IHVuaXRzIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhXcml0ZVJlcXVlc3RVbml0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHdhcm0gdGhyb3VnaHB1dCBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB3YXJtIHRocm91Z2hwdXQgaXMgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgd2FybVRocm91Z2hwdXQ/OiBXYXJtVGhyb3VnaHB1dDtcblxuICAvKipcbiAgICogV2hldGhlciBDbG91ZFdhdGNoIGNvbnRyaWJ1dG9yIGluc2lnaHRzIGlzIGVuYWJsZWQgYW5kIHdoYXQgbW9kZSBpcyBzZWxlY3RlZFxuICAgKiBAZGVmYXVsdCAtIGNvbnRyaWJ1dG9yIGluc2lnaHRzIGlzIG5vdCBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbj86IENvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uO1xufVxuXG4vKipcbiAqIFJlZmVyZW5jZSB0byBhIGR5bmFtb2RiIHRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBkeW5hbW9kYiB0YWJsZS5cbiAgICogT25lIG9mIHRoaXMsIG9yIGB0YWJsZU5hbWVgLCBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0YWJsZSBhcm5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgbmFtZSBvZiB0aGUgZHluYW1vZGIgdGFibGUuXG4gICAqIE9uZSBvZiB0aGlzLCBvciBgdGFibGVBcm5gLCBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0YWJsZSBuYW1lXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHRhYmxlJ3Mgc3RyZWFtLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhYmxlIHN0cmVhbVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVTdHJlYW1Bcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtNUyBlbmNyeXB0aW9uIGtleSwgaWYgdGhpcyB0YWJsZSB1c2VzIGEgY3VzdG9tZXItbWFuYWdlZCBlbmNyeXB0aW9uIGtleS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdsb2JhbCBpbmRleGVzIHNldCBmb3IgdGhpcyBUYWJsZS5cbiAgICogTm90ZSB0aGF0IHlvdSBuZWVkIHRvIHNldCBlaXRoZXIgdGhpcyBwcm9wZXJ0eSxcbiAgICogb3IgYGxvY2FsSW5kZXhlc2AsXG4gICAqIGlmIHlvdSB3YW50IG1ldGhvZHMgbGlrZSBncmFudFJlYWREYXRhKClcbiAgICogdG8gZ3JhbnQgcGVybWlzc2lvbnMgZm9yIGluZGV4ZXMgYXMgd2VsbCBhcyB0aGUgdGFibGUgaXRzZWxmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGdsb2JhbCBpbmRleGVzXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxJbmRleGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCBpbmRleGVzIHNldCBmb3IgdGhpcyBUYWJsZS5cbiAgICogTm90ZSB0aGF0IHlvdSBuZWVkIHRvIHNldCBlaXRoZXIgdGhpcyBwcm9wZXJ0eSxcbiAgICogb3IgYGdsb2JhbEluZGV4ZXNgLFxuICAgKiBpZiB5b3Ugd2FudCBtZXRob2RzIGxpa2UgZ3JhbnRSZWFkRGF0YSgpXG4gICAqIHRvIGdyYW50IHBlcm1pc3Npb25zIGZvciBpbmRleGVzIGFzIHdlbGwgYXMgdGhlIHRhYmxlIGl0c2VsZi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBsb2NhbCBpbmRleGVzXG4gICAqL1xuICByZWFkb25seSBsb2NhbEluZGV4ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSWYgc2V0IHRvIHRydWUsIGdyYW50IG1ldGhvZHMgYWx3YXlzIGdyYW50IHBlcm1pc3Npb25zIGZvciBhbGwgaW5kZXhlcy5cbiAgICogSWYgZmFsc2UgaXMgcHJvdmlkZWQsIGdyYW50IG1ldGhvZHMgZ3JhbnQgdGhlIHBlcm1pc3Npb25zXG4gICAqIG9ubHkgd2hlbiBgZ2xvYmFsSW5kZXhlc2Agb3IgYGxvY2FsSW5kZXhlc2AgaXMgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBncmFudEluZGV4UGVybWlzc2lvbnM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlXG4gIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZVxuICBpbXBsZW1lbnRzIElUYWJsZSwgaWFtLklBd3NDb25zdHJ1Y3RXaXRoUG9saWN5XG57XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZUFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZVN0cmVhbUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogS01TIGVuY3J5cHRpb24ga2V5LCBpZiB0aGlzIHRhYmxlIHVzZXMgYSBjdXN0b21lci1tYW5hZ2VkIGVuY3J5cHRpb24ga2V5LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogUmVzb3VyY2UgcG9saWN5IHRvIGFzc2lnbiB0byB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZXNvdXJjZVBvbGljeT86IGlhbS5Qb2xpY3lEb2N1bWVudDtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCByZWdpb25zIG90aGVyIHRoYW4gdGhlIG1haW4gb25lIHRoYXQgdGhpcyB0YWJsZSBpcyByZXBsaWNhdGVkIHRvXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1lbWJlciBpcyBzdGlsbCBmaWxsZWQgYnV0IGl0IGlzIG5vdCByZWFkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVnaW9uYWxBcm5zID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICBwdWJsaWMgZ3JhbnRPbktleShcbiAgICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgICAuLi5hY3Rpb25zOiBzdHJpbmdbXVxuICApOiBpYW0uR3JhbnRPbktleVJlc3VsdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdyYW50OiB0aGlzLmVuY3J5cHRpb25LZXk/LmdyYW50KGdyYW50ZWUsIC4uLmFjdGlvbnMpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlQXJuOiB0aGlzLnRhYmxlQXJuLFxuICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHRhYmxlU3RyZWFtQXJuOiB0aGlzLnRhYmxlU3RyZWFtQXJuLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgYSBwcmVkZWZpbmVkIHNldCBvZiBwZXJtaXNzaW9ucyBvbiB0aGlzIFRhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldCBncmFudHMoKTogVGFibGVHcmFudHMge1xuICAgIHJldHVybiBuZXcgVGFibGVHcmFudHMoe1xuICAgICAgdGFibGU6IHRoaXMsXG4gICAgICBlbmNyeXB0ZWRSZXNvdXJjZTogdGhpcyxcbiAgICAgIHBvbGljeVJlc291cmNlOiB0aGlzLFxuICAgICAgcmVnaW9uczogdGhpcy5yZWdpb25zLFxuICAgICAgaGFzSW5kZXg6IHRoaXMuaGFzSW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgYSBwcmVkZWZpbmVkIHNldCBvZiBwZXJtaXNzaW9ucyBvbiB0aGlzIFRhYmxlJ3MgU3RyZWFtLCBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBXaWxsIHRocm93IGlmIHRoZSBUYWJsZSBoYXMgbm90IGJlZW4gY29uZmlndXJlZCBmb3Igc3RyZWFtaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBzdHJlYW1HcmFudHMoKTogU3RyZWFtR3JhbnRzIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdHJlYW1Bcm4pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEeW5hbW9EQiBTdHJlYW1zIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgdGFibGUgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1HcmFudHMoe1xuICAgICAgdGFibGU6IHRoaXMsXG4gICAgICB0YWJsZVN0cmVhbUFybjogdGhpcy50YWJsZVN0cmVhbUFybixcbiAgICAgIGVuY3J5cHRpb25LZXk6IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSByZXNvdXJjZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQsXG4gICk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIElBTSBwb2xpY3kgc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYmxlIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwncyBwb2xpY3kuXG4gICAqXG4gICAqIElmIGBlbmNyeXB0aW9uS2V5YCBpcyBwcmVzZW50LCBhcHByb3ByaWF0ZSBncmFudHMgdG8gdGhlIGtleSBuZWVkcyB0byBiZSBhZGRlZFxuICAgKiBzZXBhcmF0ZWx5IHVzaW5nIHRoZSBgdGFibGUuZW5jcnlwdGlvbktleS5ncmFudCpgIG1ldGhvZHMuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWwgKG5vLW9wIGlmIHVuZGVmaW5lZClcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIHNldCBvZiBhY3Rpb25zIHRvIGFsbG93IChpLmUuIFwiZHluYW1vZGI6UHV0SXRlbVwiLCBcImR5bmFtb2RiOkdldEl0ZW1cIiwgLi4uKVxuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnRzLmFjdGlvbnMoZ3JhbnRlZSwgLi4uYWN0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gSUFNIHBvbGljeSBzdGF0ZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFibGUncyBzdHJlYW0gdG8gYW5cbiAgICogSUFNIHByaW5jaXBhbCdzIHBvbGljeS5cbiAgICpcbiAgICogSWYgYGVuY3J5cHRpb25LZXlgIGlzIHByZXNlbnQsIGFwcHJvcHJpYXRlIGdyYW50cyB0byB0aGUga2V5IG5lZWRzIHRvIGJlIGFkZGVkXG4gICAqIHNlcGFyYXRlbHkgdXNpbmcgdGhlIGB0YWJsZS5lbmNyeXB0aW9uS2V5LmdyYW50KmAgbWV0aG9kcy5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCAobm8tb3AgaWYgdW5kZWZpbmVkKVxuICAgKiBAcGFyYW0gYWN0aW9ucyBUaGUgc2V0IG9mIGFjdGlvbnMgdG8gYWxsb3cgKGkuZS4gXCJkeW5hbW9kYjpEZXNjcmliZVN0cmVhbVwiLCBcImR5bmFtb2RiOkdldFJlY29yZHNcIiwgLi4uKVxuICAgKi9cbiAgcHVibGljIGdyYW50U3RyZWFtKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtR3JhbnRzLmFjdGlvbnMoZ3JhbnRlZSwgLi4uYWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIGFsbCBkYXRhIHJlYWQgb3BlcmF0aW9ucyBmcm9tIHRoaXMgdGFibGU6XG4gICAqIEJhdGNoR2V0SXRlbSwgR2V0UmVjb3JkcywgR2V0U2hhcmRJdGVyYXRvciwgUXVlcnksIEdldEl0ZW0sIFNjYW4sIERlc2NyaWJlVGFibGUuXG4gICAqXG4gICAqIEFwcHJvcHJpYXRlIGdyYW50cyB3aWxsIGFsc28gYmUgYWRkZWQgdG8gdGhlIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleVxuICAgKiBpZiBvbmUgd2FzIGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgYWNjZXNzIHRvXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkRGF0YShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnRzLnJlYWREYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYW4gSUFNIFByaW5jaXBhbCB0byBsaXN0IHN0cmVhbXMgYXR0YWNoZWQgdG8gY3VycmVudCBkeW5hbW9kYiB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCAobm8tb3AgaWYgdW5kZWZpbmVkKVxuICAgKi9cbiAgcHVibGljIGdyYW50VGFibGVMaXN0U3RyZWFtcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtR3JhbnRzLmxpc3QoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIGFsbCBzdHJlYW0gZGF0YSByZWFkIG9wZXJhdGlvbnMgZm9yIHRoaXNcbiAgICogdGFibGUncyBzdHJlYW06XG4gICAqIERlc2NyaWJlU3RyZWFtLCBHZXRSZWNvcmRzLCBHZXRTaGFyZEl0ZXJhdG9yLCBMaXN0U3RyZWFtcy5cbiAgICpcbiAgICogQXBwcm9wcmlhdGUgZ3JhbnRzIHdpbGwgYWxzbyBiZSBhZGRlZCB0byB0aGUgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5XG4gICAqIGlmIG9uZSB3YXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCBhY2Nlc3MgdG9cbiAgICovXG4gIHB1YmxpYyBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUdyYW50cy5yZWFkKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYW4gSUFNIHByaW5jaXBhbCBhbGwgZGF0YSB3cml0ZSBvcGVyYXRpb25zIHRvIHRoaXMgdGFibGU6XG4gICAqIEJhdGNoV3JpdGVJdGVtLCBQdXRJdGVtLCBVcGRhdGVJdGVtLCBEZWxldGVJdGVtLCBEZXNjcmliZVRhYmxlLlxuICAgKlxuICAgKiBBcHByb3ByaWF0ZSBncmFudHMgd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXlcbiAgICogaWYgb25lIHdhcyBjb25maWd1cmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgcHVibGljIGdyYW50V3JpdGVEYXRhKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMud3JpdGVEYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYW4gSUFNIHByaW5jaXBhbCB0byBhbGwgZGF0YSByZWFkL3dyaXRlIG9wZXJhdGlvbnMgdG8gdGhpcyB0YWJsZS5cbiAgICogQmF0Y2hHZXRJdGVtLCBHZXRSZWNvcmRzLCBHZXRTaGFyZEl0ZXJhdG9yLCBRdWVyeSwgR2V0SXRlbSwgU2NhbixcbiAgICogQmF0Y2hXcml0ZUl0ZW0sIFB1dEl0ZW0sIFVwZGF0ZUl0ZW0sIERlbGV0ZUl0ZW0sIERlc2NyaWJlVGFibGVcbiAgICpcbiAgICogQXBwcm9wcmlhdGUgZ3JhbnRzIHdpbGwgYWxzbyBiZSBhZGRlZCB0byB0aGUgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5XG4gICAqIGlmIG9uZSB3YXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCBhY2Nlc3MgdG9cbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWRXcml0ZURhdGEoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5yZWFkV3JpdGVEYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYWxsIER5bmFtb0RCIG9wZXJhdGlvbnMgKFwiZHluYW1vZGI6KlwiKSB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBBcHByb3ByaWF0ZSBncmFudHMgd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXlcbiAgICogaWYgb25lIHdhcyBjb25maWd1cmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgcHVibGljIGdyYW50RnVsbEFjY2VzcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSkge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5mdWxsQWNjZXNzKGdyYW50ZWUpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpYyhcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvRHluYW1vREJcIixcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgY29uc3VtZWQgcmVhZCBjYXBhY2l0eSB1bml0cyB0aGlzIHRhYmxlXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBtZXRyaWMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIGEgc3VtIG92ZXIgYSBwZXJpb2Qgb2YgNSBtaW51dGVzLlxuICAgKiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGJ5IHVzaW5nIHRoZSBgc3RhdGlzdGljYCBhbmQgYHBlcmlvZGAgcHJvcGVydGllcy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNDb25zdW1lZFJlYWRDYXBhY2l0eVVuaXRzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKFxuICAgICAgRHluYW1vREJNZXRyaWNzLmNvbnN1bWVkUmVhZENhcGFjaXR5VW5pdHNTdW0sXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIGNvbnN1bWVkIHdyaXRlIGNhcGFjaXR5IHVuaXRzIHRoaXMgdGFibGVcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIG1ldHJpYyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMgYSBzdW0gb3ZlciBhIHBlcmlvZCBvZiA1IG1pbnV0ZXMuXG4gICAqIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnkgdXNpbmcgdGhlIGBzdGF0aXN0aWNgIGFuZCBgcGVyaW9kYCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0NvbnN1bWVkV3JpdGVDYXBhY2l0eVVuaXRzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKFxuICAgICAgRHluYW1vREJNZXRyaWNzLmNvbnN1bWVkV3JpdGVDYXBhY2l0eVVuaXRzU3VtLFxuICAgICAgcHJvcHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgYG1ldHJpY1N5c3RlbUVycm9yc0Zvck9wZXJhdGlvbnNgLiAqL1xuICBwdWJsaWMgbWV0cmljU3lzdGVtRXJyb3JzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgaWYgKCFwcm9wcz8uZGltZW5zaW9uc01hcD8uT3BlcmF0aW9uKSB7XG4gICAgICAvLyAnT3BlcmF0aW9uJyBtdXN0IGJlIHBhc3NlZCBiZWNhdXNlIGl0cyBhbiBvcGVyYXRpb25hbCBtZXRyaWMuXG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIidPcGVyYXRpb24nIGRpbWVuc2lvbiBtdXN0IGJlIHBhc3NlZCBmb3IgdGhlICdTeXN0ZW1FcnJvcnMnIG1ldHJpYy5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGltZW5zaW9uc01hcCA9IHtcbiAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiU3lzdGVtRXJyb3JzXCIsIHtcbiAgICAgIHN0YXRpc3RpYzogXCJzdW1cIixcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSB1c2VyIGVycm9ycy4gTm90ZSB0aGF0IHRoaXMgbWV0cmljIHJlcG9ydHMgdXNlciBlcnJvcnMgYWNyb3NzIGFsbFxuICAgKiB0aGUgdGFibGVzIGluIHRoZSBhY2NvdW50IGFuZCByZWdpb24gdGhlIHRhYmxlIHJlc2lkZXMgaW4uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBtZXRyaWMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIGEgc3VtIG92ZXIgYSBwZXJpb2Qgb2YgNSBtaW51dGVzLlxuICAgKiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGJ5IHVzaW5nIHRoZSBgc3RhdGlzdGljYCBhbmQgYHBlcmlvZGAgcHJvcGVydGllcy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNVc2VyRXJyb3JzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIGlmIChwcm9wcz8uZGltZW5zaW9uc01hcCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCInZGltZW5zaW9uc01hcCcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlICdVc2VyRXJyb3JzJyBtZXRyaWNcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gb3ZlcnJpZGluZyAnZGltZW5zaW9ucycgaGVyZSBiZWNhdXNlIHRoaXMgbWV0cmljIGlzIGFuIGFjY291bnQgbWV0cmljLlxuICAgIC8vIHNlZSAnVXNlckVycm9ycycgaW4gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbmR5bmFtb2RiL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9tZXRyaWNzLWRpbWVuc2lvbnMuaHRtbFxuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlVzZXJFcnJvcnNcIiwge1xuICAgICAgc3RhdGlzdGljOiBcInN1bVwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7fSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBjb25kaXRpb25hbCBjaGVjayBmYWlsZWQgcmVxdWVzdHMgdGhpcyB0YWJsZVxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ29uZGl0aW9uYWxDaGVja0ZhaWxlZFJlcXVlc3RzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZFJlcXVlc3RzXCIsIHtcbiAgICAgIHN0YXRpc3RpYzogXCJzdW1cIixcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbi4gSXQgcmV0dXJucyBhbiBpbnZhbGlkIG1ldHJpYy4gVXNlIGBtZXRyaWNUaHJvdHRsZWRSZXF1ZXN0c0Zvck9wZXJhdGlvbmAgaW5zdGVhZC4gKi9cbiAgcHVibGljIG1ldHJpY1Rocm90dGxlZFJlcXVlc3RzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVGhyb3R0bGVkUmVxdWVzdHNcIiwgeyBzdGF0aXN0aWM6IFwic3VtXCIsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHN1Y2Nlc3NmdWwgcmVxdWVzdCBsYXRlbmN5IHRoaXMgdGFibGUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBtZXRyaWMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIGFuIGF2ZXJhZ2Ugb3ZlciBhIHBlcmlvZCBvZiA1IG1pbnV0ZXMuXG4gICAqIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnkgdXNpbmcgdGhlIGBzdGF0aXN0aWNgIGFuZCBgcGVyaW9kYCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1N1Y2Nlc3NmdWxSZXF1ZXN0TGF0ZW5jeShcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIGlmICghcHJvcHM/LmRpbWVuc2lvbnNNYXA/Lk9wZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCInT3BlcmF0aW9uJyBkaW1lbnNpb24gbXVzdCBiZSBwYXNzZWQgZm9yIHRoZSAnU3VjY2Vzc2Z1bFJlcXVlc3RMYXRlbmN5JyBtZXRyaWMuXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRpbWVuc2lvbnNNYXAgPSB7XG4gICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgT3BlcmF0aW9uOiBwcm9wcy5kaW1lbnNpb25zTWFwLk9wZXJhdGlvbixcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICAuLi5EeW5hbW9EQk1ldHJpY3Muc3VjY2Vzc2Z1bFJlcXVlc3RMYXRlbmN5QXZlcmFnZShkaW1lbnNpb25zTWFwKSxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcCxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgbWFueSByZXF1ZXN0cyBhcmUgdGhyb3R0bGVkIG9uIHRoaXMgdGFibGUsIGZvciB0aGUgZ2l2ZW4gb3BlcmF0aW9uXG4gICAqXG4gICAqIERlZmF1bHQ6IHN1bSBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1Rocm90dGxlZFJlcXVlc3RzRm9yT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICAuLi5EeW5hbW9EQk1ldHJpY3MudGhyb3R0bGVkUmVxdWVzdHNTdW0oe1xuICAgICAgICBPcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIH0pLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgcmVxdWVzdHMgYXJlIHRocm90dGxlZCBvbiB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgc3VtIGVycm9ycyBhY3Jvc3MgYWxsIHBvc3NpYmxlIG9wZXJhdGlvbnMuXG4gICAqIE5vdGUgdGhhdCBieSBkZWZhdWx0LCBlYWNoIGluZGl2aWR1YWwgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVGhyb3R0bGVkUmVxdWVzdHNGb3JPcGVyYXRpb25zKFxuICAgIHByb3BzPzogT3BlcmF0aW9uc01ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guSU1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuc3VtTWV0cmljc0Zvck9wZXJhdGlvbnMoXG4gICAgICBcIlRocm90dGxlZFJlcXVlc3RzXCIsXG4gICAgICBcIlN1bSBvZiB0aHJvdHRsZWQgcmVxdWVzdHMgYWNyb3NzIGFsbCBvcGVyYXRpb25zXCIsXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHN5c3RlbSBlcnJvcnMgdGhpcyB0YWJsZS5cbiAgICpcbiAgICogVGhpcyB3aWxsIHN1bSBlcnJvcnMgYWNyb3NzIGFsbCBwb3NzaWJsZSBvcGVyYXRpb25zLlxuICAgKiBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgZWFjaCBpbmRpdmlkdWFsIG1ldHJpYyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMgYSBzdW0gb3ZlciBhIHBlcmlvZCBvZiA1IG1pbnV0ZXMuXG4gICAqIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnkgdXNpbmcgdGhlIGBzdGF0aXN0aWNgIGFuZCBgcGVyaW9kYCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1N5c3RlbUVycm9yc0Zvck9wZXJhdGlvbnMoXG4gICAgcHJvcHM/OiBTeXN0ZW1FcnJvcnNGb3JPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5JTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5zdW1NZXRyaWNzRm9yT3BlcmF0aW9ucyhcbiAgICAgIFwiU3lzdGVtRXJyb3JzXCIsXG4gICAgICBcIlN1bSBvZiBlcnJvcnMgYWNyb3NzIGFsbCBvcGVyYXRpb25zXCIsXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1hdGggZXhwcmVzc2lvbiBmb3Igb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIG1ldHJpY05hbWUgVGhlIG1ldHJpYyBuYW1lLlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbkxhYmVsIExhYmVsIGZvciBleHByZXNzaW9uXG4gICAqIEBwYXJhbSBwcm9wcyBvcGVyYXRpb24gbGlzdFxuICAgKi9cbiAgcHJpdmF0ZSBzdW1NZXRyaWNzRm9yT3BlcmF0aW9ucyhcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgZXhwcmVzc2lvbkxhYmVsOiBzdHJpbmcsXG4gICAgcHJvcHM/OiBPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5JTWV0cmljIHtcbiAgICBpZiAocHJvcHM/LmRpbWVuc2lvbnNNYXA/Lk9wZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJUaGUgT3BlcmF0aW9uIGRpbWVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgdGhlICdvcGVyYXRpb25zJyBwcm9wZXJ0eS5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IHByb3BzPy5vcGVyYXRpb25zID8/IE9iamVjdC52YWx1ZXMoT3BlcmF0aW9uKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuY3JlYXRlTWV0cmljc0Zvck9wZXJhdGlvbnMobWV0cmljTmFtZSwgb3BlcmF0aW9ucywge1xuICAgICAgc3RhdGlzdGljOiBcInN1bVwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdW0gPSBuZXcgY2xvdWR3YXRjaC5NYXRoRXhwcmVzc2lvbih7XG4gICAgICBleHByZXNzaW9uOiBgJHtPYmplY3Qua2V5cyh2YWx1ZXMpLmpvaW4oXCIgKyBcIil9YCxcbiAgICAgIHVzaW5nTWV0cmljczogeyAuLi52YWx1ZXMgfSxcbiAgICAgIGNvbG9yOiBwcm9wcz8uY29sb3IsXG4gICAgICBsYWJlbDogZXhwcmVzc2lvbkxhYmVsLFxuICAgICAgcGVyaW9kOiBwcm9wcz8ucGVyaW9kLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN1bTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtYXAgb2YgbWV0cmljcyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgbWF0aCBleHByZXNzaW9uLlxuICAgKlxuICAgKiBVc2luZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGB1c2luZ01ldHJpY3NgIHByb3BlcnR5IGluIGBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uYCBhbGxvd3MgeW91IHRvXG4gICAqIHVzZSB0aGUga2V5cyBvZiB0aGlzIG1hcCBhcyBtZXRyaWMgbmFtZXMgaW5zaWRlIHlvdSBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBUaGUgbWV0cmljIG5hbWUuXG4gICAqIEBwYXJhbSBvcGVyYXRpb25zIFRoZSBsaXN0IG9mIG9wZXJhdGlvbnMgdG8gY3JlYXRlIG1ldHJpY3MgZm9yLlxuICAgKiBAcGFyYW0gcHJvcHMgUHJvcGVydGllcyBmb3IgdGhlIGluZGl2aWR1YWwgbWV0cmljcy5cbiAgICogQHBhcmFtIG1ldHJpY05hbWVNYXBwZXIgTWFwcGVyIGZ1bmN0aW9uIHRvIGFsbG93IGNvbnRyb2xsaW5nIHRoZSBpbmRpdmlkdWFsIG1ldHJpYyBuYW1lIHBlciBvcGVyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU1ldHJpY3NGb3JPcGVyYXRpb25zKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBvcGVyYXRpb25zOiBPcGVyYXRpb25bXSxcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgICBtZXRyaWNOYW1lTWFwcGVyPzogKG9wOiBPcGVyYXRpb24pID0+IHN0cmluZyxcbiAgKTogUmVjb3JkPHN0cmluZywgY2xvdWR3YXRjaC5JTWV0cmljPiB7XG4gICAgY29uc3QgbWV0cmljczogUmVjb3JkPHN0cmluZywgY2xvdWR3YXRjaC5JTWV0cmljPiA9IHt9O1xuXG4gICAgY29uc3QgbWFwcGVyID0gbWV0cmljTmFtZU1hcHBlciA/PyAoKG9wKSA9PiBvcC50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGlmIChwcm9wcz8uZGltZW5zaW9uc01hcD8uT3BlcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkludmFsaWQgcHJvcGVydGllcy4gT3BlcmF0aW9uIGRpbWVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gY2FsY3VsYXRpbmcgb3BlcmF0aW9uYWwgbWV0cmljc1wiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBtZXRyaWMgPSB0aGlzLm1ldHJpYyhtZXRyaWNOYW1lLCB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBPcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcGVyYXRpb25NZXRyaWNOYW1lID0gbWFwcGVyKG9wZXJhdGlvbik7XG4gICAgICBjb25zdCBmaXJzdENoYXIgPSBvcGVyYXRpb25NZXRyaWNOYW1lLmNoYXJBdCgwKTtcblxuICAgICAgaWYgKGZpcnN0Q2hhciA9PT0gZmlyc3RDaGFyLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvdXNpbmctbWV0cmljLW1hdGguaHRtbCNtZXRyaWMtbWF0aC1zeW50YXhcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgTWFwcGVyIGdlbmVyYXRlZCBhbiBpbGxlZ2FsIG9wZXJhdGlvbiBtZXRyaWMgbmFtZTogJHtvcGVyYXRpb25NZXRyaWNOYW1lfS4gTXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlcmAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWV0cmljc1tvcGVyYXRpb25NZXRyaWNOYW1lXSA9IG1ldHJpYztcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0cmljcztcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgaGFzSW5kZXgoKTogYm9vbGVhbjtcblxuICBwcml2YXRlIGNhbm5lZE1ldHJpYyhcbiAgICBmbjogKGRpbXM6IHsgVGFibGVOYW1lOiBzdHJpbmcgfSkgPT4gY2xvdWR3YXRjaC5NZXRyaWNQcm9wcyxcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgLi4uZm4oeyBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lIH0pLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIER5bmFtb0RCIHRhYmxlLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGUgZXh0ZW5kcyBUYWJsZUJhc2Uge1xuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gUHJpbmNpcGFsIHRvIGxpc3QgYWxsIER5bmFtb0RCIFN0cmVhbXMuXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgI2dyYW50VGFibGVMaXN0U3RyZWFtc2AgZm9yIG1vcmUgZ3JhbnVsYXIgcGVybWlzc2lvblxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIChuby1vcCBpZiB1bmRlZmluZWQpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdyYW50TGlzdFN0cmVhbXMoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFtcImR5bmFtb2RiOkxpc3RTdHJlYW1zXCJdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXCIqXCJdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBUYWJsZSBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIHRhYmxlIHZpYSB0YWJsZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBuYW1lLlxuICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSB0YWJsZSdzIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZU5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBJVGFibGUge1xuICAgIHJldHVybiBUYWJsZS5mcm9tVGFibGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZU5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFRhYmxlIGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgdGFibGUgdmlhIHRhYmxlIGFybi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIHRhYmxlQXJuIFRoZSB0YWJsZSdzIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRhYmxlQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB0YWJsZUFybjogc3RyaW5nLFxuICApOiBJVGFibGUge1xuICAgIHJldHVybiBUYWJsZS5mcm9tVGFibGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZUFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIGF0dHJzIEEgYFRhYmxlQXR0cmlidXRlc2Agb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tVGFibGVBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogVGFibGVBdHRyaWJ1dGVzLFxuICApOiBJVGFibGUge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFRhYmxlQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YWJsZVN0cmVhbUFybj86IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gICAgICBwdWJsaWMgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzSW5kZXggPVxuICAgICAgICAoYXR0cnMuZ3JhbnRJbmRleFBlcm1pc3Npb25zID8/IGZhbHNlKSB8fFxuICAgICAgICAoYXR0cnMuZ2xvYmFsSW5kZXhlcyA/PyBbXSkubGVuZ3RoID4gMCB8fFxuICAgICAgICAoYXR0cnMubG9jYWxJbmRleGVzID8/IFtdKS5sZW5ndGggPiAwO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlZ2lvbnMgPSBbXTtcblxuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3BzOiBBd3NDb25zdHJ1Y3RQcm9wcyxcbiAgICAgICAgX3RhYmxlQXJuOiBzdHJpbmcsXG4gICAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgICB0YWJsZVN0cmVhbUFybj86IHN0cmluZyxcbiAgICAgICkge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICAgICAgdGhpcy50YWJsZUFybiA9IF90YWJsZUFybjtcbiAgICAgICAgdGhpcy50YWJsZU5hbWUgPSB0YWJsZU5hbWU7XG4gICAgICAgIHRoaXMudGFibGVTdHJlYW1Bcm4gPSB0YWJsZVN0cmVhbUFybjtcbiAgICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gYXR0cnMuZW5jcnlwdGlvbktleTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICAgIF9zdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQsXG4gICAgICApOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdCB7XG4gICAgICAgIC8vIEltcG9ydGVkIHRhYmxlcyBjYW5ub3QgaGF2ZSByZXNvdXJjZSBwb2xpY2llcyBtb2RpZmllZFxuICAgICAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbmFtZTogc3RyaW5nO1xuICAgIGxldCBhcm46IHN0cmluZztcbiAgICBjb25zdCBzdGFjayA9IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHNjb3BlKTtcbiAgICBpZiAoIWF0dHJzLnRhYmxlTmFtZSkge1xuICAgICAgaWYgKCFhdHRycy50YWJsZUFybikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiT25lIG9mIHRhYmxlTmFtZSBvciB0YWJsZUFybiBpcyByZXF1aXJlZCFcIixcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBjb25zdCBtYXliZVRhYmxlTmFtZSA9IHN0YWNrLnNwbGl0QXJuKFxuICAgICAgICBhdHRycy50YWJsZUFybixcbiAgICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgICApLnJlc291cmNlTmFtZTtcbiAgICAgIGlmICghbWF5YmVUYWJsZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIkFSTiBmb3IgRHluYW1vREIgdGFibGUgbXVzdCBiZSBpbiB0aGUgZm9ybTogYXJuOjxwYXJ0aXRpb24+OmR5bmFtb2RiOjxyZWdpb24+OjxhY2NvdW50Pjp0YWJsZS88dGFibGUtbmFtZT5cIixcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSBtYXliZVRhYmxlTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGF0dHJzLnRhYmxlQXJuKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJPbmx5IG9uZSBvZiB0YWJsZUFybiBvciB0YWJsZU5hbWUgY2FuIGJlIHByb3ZpZGVkXCIsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBuYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgICAgYXJuID0gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogXCJkeW5hbW9kYlwiLFxuICAgICAgICByZXNvdXJjZTogXCJ0YWJsZVwiLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGF0dHJzLnRhYmxlTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KFxuICAgICAgeyBlbnZpcm9ubWVudEZyb21Bcm46IGFybiB9LFxuICAgICAgYXJuLFxuICAgICAgbmFtZSxcbiAgICAgIGF0dHJzLnRhYmxlU3RyZWFtQXJuLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBwb2xpY3kgdG8gYXNzaWduIHRvIER5bmFtb0RCIFRhYmxlLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLXJlc291cmNlcG9saWN5Lmh0bWxcbiAgICogQGRlZmF1bHQgLSBObyByZXNvdXJjZSBwb2xpY3kgc3RhdGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZUFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZVN0cmVhbUFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbCA9XG4gICAgbmV3IEFycmF5PGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZUF0dHJpYnV0ZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwgPSBuZXcgQXJyYXk8XG4gICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXggJiB7XG4gICAgICBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbj86IENvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uO1xuICAgIH1cbiAgPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsID1cbiAgICBuZXcgQXJyYXk8ZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlTG9jYWxTZWNvbmRhcnlJbmRleD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlY29uZGFyeUluZGV4U2NoZW1hcyA9IG5ldyBNYXA8c3RyaW5nLCBTY2hlbWFPcHRpb25zPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vbktleUF0dHJpYnV0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlUGFydGl0aW9uS2V5OiBBdHRyaWJ1dGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFibGVTb3J0S2V5PzogQXR0cmlidXRlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYmlsbGluZ01vZGU6IEJpbGxpbmdNb2RlO1xuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlU2NhbGluZzogU2NhbGFibGVBdHRyaWJ1dGVQYWlyID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXhTY2FsaW5nID0gbmV3IE1hcDxzdHJpbmcsIFNjYWxhYmxlQXR0cmlidXRlUGFpcj4oKTtcbiAgLy8gQ29tbWVudGluZyBvdXQgc2NhbGluZ1JvbGUgYXMgVGVycmFmb3JtIGF1dG8tY3JlYXRlcyBzZXJ2aWNlLWxpbmtlZCByb2xlc1xuICAvLyBVbmxpa2UgQVdTIENESyBDbG91ZEZvcm1hdGlvbiwgVGVycmFmb3JtIEFXUyBwcm92aWRlcidzIHJvbGVBcm4gaXMgb3B0aW9uYWxcbiAgLy8gYW5kIGRlZmF1bHRzIHRvIGFwcHJvcHJpYXRlIHNlcnZpY2UtbGlua2VkIHJvbGVzIHdoZW4gb21pdHRlZFxuICAvLyBwcml2YXRlIHJlYWRvbmx5IHNjYWxpbmdSb2xlOiBpYW0uSVJvbGU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb3VyY2U6IGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVwbGljYXM6IGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZVJlcGxpY2FbXSB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVnaW9ucz8gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUYWJsZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBjb25zdCBwaHlzaWNhbFRhYmxlTmFtZSA9XG4gICAgICBwcm9wcy50YWJsZU5hbWUgPz8gdGhpcy5zdGFjay51bmlxdWVSZXNvdXJjZU5hbWUodGhpcyk7XG5cbiAgICBjb25zdCB7IHNzZVNwZWNpZmljYXRpb24sIGVuY3J5cHRpb25LZXkgfSA9IHRoaXMucGFyc2VFbmNyeXB0aW9uKHByb3BzKTtcbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuXG4gICAgY29uc3QgcG9pbnRJblRpbWVSZWNvdmVyeSA9IHRoaXMucmVuZGVyUG9pbnRJblRpbWVSZWNvdmVyeShwcm9wcyk7XG5cbiAgICAvLyBlcnJvciBpZiBib3RoIHJlcGxpY2F0aW9uUmVnaW9ucyBhbmQgcmVwbGljYVNwZWNpZmljYXRpb24gYXJlIHNwZWNpZmllZFxuICAgIGlmIChwcm9wcy5yZXBsaWNhdGlvblJlZ2lvbnMgJiYgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggYHJlcGxpY2F0aW9uUmVnaW9uc2AgYW5kIGByZXBsaWNhU3BlY2lmaWNhdGlvbmBcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHN0cmVhbVNwZWNpZmljYXRpb246XG4gICAgICB8IHtcbiAgICAgICAgICBzdHJlYW1FbmFibGVkOiBib29sZWFuO1xuICAgICAgICAgIHN0cmVhbVZpZXdUeXBlPzogU3RyZWFtVmlld1R5cGU7XG4gICAgICAgIH1cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIChwcm9wcy5yZXBsaWNhdGlvblJlZ2lvbnMgJiYgcHJvcHMucmVwbGljYXRpb25SZWdpb25zLmxlbmd0aCA+IDApIHx8XG4gICAgICAocHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24gJiYgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24ubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIGlmIChwcm9wcy5zdHJlYW0gJiYgcHJvcHMuc3RyZWFtICE9PSBTdHJlYW1WaWV3VHlwZS5ORVdfQU5EX09MRF9JTUFHRVMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcImBzdHJlYW1gIG11c3QgYmUgc2V0IHRvIGBORVdfQU5EX09MRF9JTUFHRVNgIHdoZW4gc3BlY2lmeWluZyBgcmVwbGljYXRpb25SZWdpb25zYFwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgICBzdHJlYW1FbmFibGVkOiB0cnVlLFxuICAgICAgICBzdHJlYW1WaWV3VHlwZTogU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9IHByb3BzLmJpbGxpbmdNb2RlID8/IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9IHByb3BzLmJpbGxpbmdNb2RlID8/IEJpbGxpbmdNb2RlLlBST1ZJU0lPTkVEO1xuICAgICAgaWYgKHByb3BzLnN0cmVhbSkge1xuICAgICAgICBzdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgICAgIHN0cmVhbUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3RyZWFtVmlld1R5cGU6IHByb3BzLnN0cmVhbSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVByb3Zpc2lvbmluZyhwcm9wcyk7XG4gICAgdGhpcy5hZGRLZXkocHJvcHMucGFydGl0aW9uS2V5LCBIQVNIX0tFWV9UWVBFKTtcbiAgICB0aGlzLnRhYmxlUGFydGl0aW9uS2V5ID0gcHJvcHMucGFydGl0aW9uS2V5O1xuICAgIGlmIChwcm9wcy5zb3J0S2V5KSB7XG4gICAgICB0aGlzLmFkZEtleShwcm9wcy5zb3J0S2V5LCBSQU5HRV9LRVlfVFlQRSk7XG4gICAgICB0aGlzLnRhYmxlU29ydEtleSA9IHByb3BzLnNvcnRLZXk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwbGljYXMgPSB0aGlzLnJlbmRlclJlcGxpY2FzKFxuICAgICAgcHJvcHMucmVwbGljYXRpb25SZWdpb25zLFxuICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24sXG4gICAgKTtcbiAgICBpZiAodGhpcy5fcmVwbGljYXMgJiYgdGhpcy5fcmVwbGljYXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fcmVwbGljYXMuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAvLyBTYXZlIHJlZ2lvbmFsIGFybnMgZm9yIGdyYW50WHh4KCkgbWV0aG9kc1xuICAgICAgICB0aGlzLnJlZ2lvbnM/LnB1c2goci5yZWdpb25OYW1lKTtcbiAgICAgICAgdGhpcy5yZWdpb25hbEFybnMucHVzaChcbiAgICAgICAgICB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gICAgICAgICAgICByZWdpb246IHIucmVnaW9uTmFtZSxcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiZHluYW1vZGJcIixcbiAgICAgICAgICAgIHJlc291cmNlOiBcInRhYmxlXCIsXG4gICAgICAgICAgICByZXNvdXJjZU5hbWU6IHBoeXNpY2FsVGFibGVOYW1lLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb3VyY2UgPSBuZXcgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgbmFtZTogcGh5c2ljYWxUYWJsZU5hbWUsXG4gICAgICBoYXNoS2V5OiB0aGlzLnRhYmxlUGFydGl0aW9uS2V5Lm5hbWUsXG4gICAgICByYW5nZUtleTogdGhpcy50YWJsZVNvcnRLZXk/Lm5hbWUsXG4gICAgICBhdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbCxcbiAgICAgIGdsb2JhbFNlY29uZGFyeUluZGV4OiBMYXp5LmFueVZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsLm1hcChcbiAgICAgICAgICAgICAgZHluYW1vZGJUYWJsZS5keW5hbW9kYlRhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhUb1RlcnJhZm9ybSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSxcbiAgICAgICksXG4gICAgICBsb2NhbFNlY29uZGFyeUluZGV4OiBMYXp5LmFueVZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMubG9jYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubWFwKFxuICAgICAgICAgICAgICBkeW5hbW9kYlRhYmxlLmR5bmFtb2RiVGFibGVMb2NhbFNlY29uZGFyeUluZGV4VG9UZXJyYWZvcm0sXG4gICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0sXG4gICAgICApLFxuICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeSxcbiAgICAgIGJpbGxpbmdNb2RlOiB0aGlzLmJpbGxpbmdNb2RlLFxuICAgICAgcmVhZENhcGFjaXR5OlxuICAgICAgICB0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QUk9WSVNJT05FRFxuICAgICAgICAgID8gKHByb3BzLnJlYWRDYXBhY2l0eSA/PyA1KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgd3JpdGVDYXBhY2l0eTpcbiAgICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICAgICAgICA/IChwcm9wcy53cml0ZUNhcGFjaXR5ID8/IDUpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBvbkRlbWFuZFRocm91Z2hwdXQ6XG4gICAgICAgIHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCAmJlxuICAgICAgICAocHJvcHMubWF4UmVhZFJlcXVlc3RVbml0cyB8fCBwcm9wcy5tYXhXcml0ZVJlcXVlc3RVbml0cylcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbWF4UmVhZFJlcXVlc3RVbml0czogcHJvcHMubWF4UmVhZFJlcXVlc3RVbml0cyxcbiAgICAgICAgICAgICAgbWF4V3JpdGVSZXF1ZXN0VW5pdHM6IHByb3BzLm1heFdyaXRlUmVxdWVzdFVuaXRzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc2VydmVyU2lkZUVuY3J5cHRpb246IHNzZVNwZWNpZmljYXRpb24sXG4gICAgICBzdHJlYW1FbmFibGVkOiBzdHJlYW1TcGVjaWZpY2F0aW9uPy5zdHJlYW1FbmFibGVkLFxuICAgICAgc3RyZWFtVmlld1R5cGU6IHN0cmVhbVNwZWNpZmljYXRpb24/LnN0cmVhbVZpZXdUeXBlLFxuICAgICAgdGFibGVDbGFzczogcHJvcHMudGFibGVDbGFzcyxcbiAgICAgIHR0bDogcHJvcHMudGltZVRvTGl2ZUF0dHJpYnV0ZVxuICAgICAgICA/IHsgYXR0cmlidXRlTmFtZTogcHJvcHMudGltZVRvTGl2ZUF0dHJpYnV0ZSwgZW5hYmxlZDogdHJ1ZSB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZDogcHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uLFxuICAgICAgaW1wb3J0VGFibGU6IHRoaXMucmVuZGVySW1wb3J0U291cmNlU3BlY2lmaWNhdGlvbihwcm9wcy5pbXBvcnRTb3VyY2UpLFxuICAgICAgcmVwbGljYTogdGhpcy5fcmVwbGljYXMsXG4gICAgICAvLyByZXNvdXJjZVBvbGljeTogcHJvcHMucmVzb3VyY2VQb2xpY3kgPyB7IHBvbGljeURvY3VtZW50OiB0aGlzLnN0YWNrLnRvSnNvblN0cmluZyhwcm9wcy5yZXNvdXJjZVBvbGljeS50b0pTT04oKSkgfSA6IHVuZGVmaW5lZCwgLy8gTm90IGluIFRGIHJlc291cmNlXG4gICAgICB3YXJtVGhyb3VnaHB1dDogcHJvcHMud2FybVRocm91Z2hwdXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhYmxlQXJuID0gdGhpcy5fcmVzb3VyY2UuYXJuO1xuICAgIHRoaXMudGFibGVOYW1lID0gdGhpcy5fcmVzb3VyY2UubmFtZTtcbiAgICB0aGlzLnRhYmxlU3RyZWFtQXJuID0gc3RyZWFtU3BlY2lmaWNhdGlvbj8uc3RyZWFtRW5hYmxlZFxuICAgICAgPyB0aGlzLl9yZXNvdXJjZS5zdHJlYW1Bcm5cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzb3VyY2VQb2xpY3kgPSBwcm9wcy5yZXNvdXJjZVBvbGljeTtcbiAgICBpZiAodGhpcy5yZXNvdXJjZVBvbGljeSkge1xuICAgICAgbmV3IGR5bmFtb2RiUmVzb3VyY2VQb2xpY3kuRHluYW1vZGJSZXNvdXJjZVBvbGljeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJSZXNvdXJjZVBvbGljeVwiLFxuICAgICAgICB7XG4gICAgICAgICAgcG9saWN5OiB0aGlzLnJlc291cmNlUG9saWN5Lmpzb24sXG4gICAgICAgICAgcmVzb3VyY2VBcm46IHRoaXMudGFibGVBcm4sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5raW5lc2lzU3RyZWFtKSB7XG4gICAgICBuZXcgZHluYW1vZGJLaW5lc2lzU3RyZWFtaW5nRGVzdGluYXRpb24uRHluYW1vZGJLaW5lc2lzU3RyZWFtaW5nRGVzdGluYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiS2luZXNpc1N0cmVhbWluZ0Rlc3RpbmF0aW9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICB0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICAgIHN0cmVhbUFybjogcHJvcHMua2luZXNpc1N0cmVhbS5zdHJlYW1Bcm4sXG4gICAgICAgICAgLi4uKHByb3BzLmtpbmVzaXNQcmVjaXNpb25UaW1lc3RhbXAgJiYge1xuICAgICAgICAgICAgYXBwcm94aW1hdGVDcmVhdGlvbkRhdGVUaW1lUHJlY2lzaW9uOlxuICAgICAgICAgICAgICBwcm9wcy5raW5lc2lzUHJlY2lzaW9uVGltZXN0YW1wLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbiA9XG4gICAgICB0aGlzLnJlbmRlckNvbnRyaWJ1dG9ySW5zaWdodHMocHJvcHMpO1xuICAgIGlmIChjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbj8uZW5hYmxlZCkge1xuICAgICAgbmV3IGR5bmFtb2RiQ29udHJpYnV0b3JJbnNpZ2h0cy5EeW5hbW9kYkNvbnRyaWJ1dG9ySW5zaWdodHMoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQ29udHJpYnV0b3JJbnNpZ2h0c1wiLFxuICAgICAgICB7XG4gICAgICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBtb2RlOiBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbi5tb2RlLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21tZW50aW5nIG91dCBzY2FsaW5nUm9sZSBpbml0aWFsaXphdGlvbiAtIGxldCBUZXJyYWZvcm0gYXV0by1jcmVhdGUgc2VydmljZS1saW5rZWQgcm9sZVxuICAgIC8vIHRoaXMuc2NhbGluZ1JvbGUgPSB0aGlzLm1ha2VTY2FsaW5nUm9sZSgpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZVRhYmxlKCkgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYmxlLlxuICAgKiBBIHJlc291cmNlIHBvbGljeSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3Qgd29yayB3aXRoIGltcG9ydGVkIHRhYmxlcy5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCBUaGUgcG9saWN5IHN0YXRlbWVudCB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgIHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5yZXNvdXJjZVBvbGljeSkge1xuICAgICAgLy8gZW5zdXJlIGEgcG9saWN5IGV4aXN0cyBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZVxuICAgICAgdGhpcy5yZXNvdXJjZVBvbGljeSA9IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQodGhpcywgXCJQb2xpY3lcIiwge1xuICAgICAgICBzdGF0ZW1lbnQ6IFtdLFxuICAgICAgfSk7XG4gICAgICBuZXcgZHluYW1vZGJSZXNvdXJjZVBvbGljeS5EeW5hbW9kYlJlc291cmNlUG9saWN5KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlBvbGljeUF0dGFjaG1lbnRcIixcbiAgICAgICAge1xuICAgICAgICAgIHBvbGljeTogdGhpcy5yZXNvdXJjZVBvbGljeS5qc29uLFxuICAgICAgICAgIHJlc291cmNlQXJuOiB0aGlzLnRhYmxlQXJuLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5yZXNvdXJjZVBvbGljeS5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlbWVudEFkZGVkOiB0cnVlLFxuICAgICAgcG9saWN5RGVwZW5kYWJsZTogdGhpcyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFkZEdsb2JhbFNlY29uZGFyeUluZGV4KHByb3BzOiBHbG9iYWxTZWNvbmRhcnlJbmRleFByb3BzKSB7XG4gICAgdGhpcy52YWxpZGF0ZVByb3Zpc2lvbmluZ0dTSShwcm9wcyk7XG4gICAgdGhpcy52YWxpZGF0ZUluZGV4TmFtZShwcm9wcy5pbmRleE5hbWUpO1xuXG4gICAgY29uc3QgZ3NpUHJvamVjdGlvbiA9IHRoaXMuYnVpbGRJbmRleFByb2plY3Rpb24ocHJvcHMpO1xuICAgIHRoaXMucmVnaXN0ZXJBdHRyaWJ1dGUocHJvcHMucGFydGl0aW9uS2V5KTtcbiAgICBpZiAocHJvcHMuc29ydEtleSkge1xuICAgICAgdGhpcy5yZWdpc3RlckF0dHJpYnV0ZShwcm9wcy5zb3J0S2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5wdXNoKHtcbiAgICAgIG5hbWU6IHByb3BzLmluZGV4TmFtZSxcbiAgICAgIGhhc2hLZXk6IHByb3BzLnBhcnRpdGlvbktleS5uYW1lLFxuICAgICAgcmFuZ2VLZXk6IHByb3BzLnNvcnRLZXk/Lm5hbWUsXG4gICAgICBwcm9qZWN0aW9uVHlwZTogZ3NpUHJvamVjdGlvbi5wcm9qZWN0aW9uVHlwZSxcbiAgICAgIG5vbktleUF0dHJpYnV0ZXM6IGdzaVByb2plY3Rpb24ubm9uS2V5QXR0cmlidXRlcyxcbiAgICAgIHJlYWRDYXBhY2l0eTpcbiAgICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICAgICAgICA/IChwcm9wcy5yZWFkQ2FwYWNpdHkgPz8gNSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRlQ2FwYWNpdHk6XG4gICAgICAgIHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBST1ZJU0lPTkVEXG4gICAgICAgICAgPyAocHJvcHMud3JpdGVDYXBhY2l0eSA/PyA1KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgb25EZW1hbmRUaHJvdWdocHV0OlxuICAgICAgICB0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QgJiZcbiAgICAgICAgKHByb3BzLm1heFJlYWRSZXF1ZXN0VW5pdHMgfHwgcHJvcHMubWF4V3JpdGVSZXF1ZXN0VW5pdHMpXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIG1heFJlYWRSZXF1ZXN0VW5pdHM6IHByb3BzLm1heFJlYWRSZXF1ZXN0VW5pdHMsXG4gICAgICAgICAgICAgIG1heFdyaXRlUmVxdWVzdFVuaXRzOiBwcm9wcy5tYXhXcml0ZVJlcXVlc3RVbml0cyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uOiBwcm9wcy5jb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbiwgLy8gTm90IGluIFRGIEdTSSBibG9ja1xuICAgICAgd2FybVRocm91Z2hwdXQ6IHByb3BzLndhcm1UaHJvdWdocHV0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWNvbmRhcnlJbmRleFNjaGVtYXMuc2V0KHByb3BzLmluZGV4TmFtZSwge1xuICAgICAgcGFydGl0aW9uS2V5OiBwcm9wcy5wYXJ0aXRpb25LZXksXG4gICAgICBzb3J0S2V5OiBwcm9wcy5zb3J0S2V5LFxuICAgIH0pO1xuICAgIHRoaXMuaW5kZXhTY2FsaW5nLnNldChwcm9wcy5pbmRleE5hbWUsIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBsb2NhbCBzZWNvbmRhcnkgaW5kZXggb2YgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyB0aGUgcHJvcGVydHkgb2YgbG9jYWwgc2Vjb25kYXJ5IGluZGV4XG4gICAqL1xuICBwdWJsaWMgYWRkTG9jYWxTZWNvbmRhcnlJbmRleChwcm9wczogTG9jYWxTZWNvbmRhcnlJbmRleFByb3BzKSB7XG4gICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbmR5bmFtb2RiL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9MaW1pdHMuaHRtbCNsaW1pdHMtc2Vjb25kYXJ5LWluZGV4ZXNcbiAgICBpZiAoXG4gICAgICB0aGlzLmxvY2FsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsLmxlbmd0aCA+PVxuICAgICAgTUFYX0xPQ0FMX1NFQ09OREFSWV9JTkRFWF9DT1VOVFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBBIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHNlY29uZGFyeSBpbmRleCBwZXIgdGFibGUgaXMgJHtNQVhfTE9DQUxfU0VDT05EQVJZX0lOREVYX0NPVU5UfWAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlSW5kZXhOYW1lKHByb3BzLmluZGV4TmFtZSk7XG5cbiAgICBpZiAoIXRoaXMudGFibGVQYXJ0aXRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiVGFibGUgcGFydGl0aW9uIGtleSBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIGFkZGluZyBsb2NhbCBzZWNvbmRhcnkgaW5kZXhcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJBdHRyaWJ1dGUodGhpcy50YWJsZVBhcnRpdGlvbktleSk7XG4gICAgdGhpcy5yZWdpc3RlckF0dHJpYnV0ZShwcm9wcy5zb3J0S2V5KTtcblxuICAgIGNvbnN0IGxzaVByb2plY3Rpb24gPSB0aGlzLmJ1aWxkSW5kZXhQcm9qZWN0aW9uKHByb3BzKTtcblxuICAgIHRoaXMubG9jYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwucHVzaCh7XG4gICAgICBuYW1lOiBwcm9wcy5pbmRleE5hbWUsXG4gICAgICByYW5nZUtleTogcHJvcHMuc29ydEtleS5uYW1lLFxuICAgICAgcHJvamVjdGlvblR5cGU6IGxzaVByb2plY3Rpb24ucHJvamVjdGlvblR5cGUsXG4gICAgICBub25LZXlBdHRyaWJ1dGVzOiBsc2lQcm9qZWN0aW9uLm5vbktleUF0dHJpYnV0ZXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlY29uZGFyeUluZGV4U2NoZW1hcy5zZXQocHJvcHMuaW5kZXhOYW1lLCB7XG4gICAgICBwYXJ0aXRpb25LZXk6IHRoaXMudGFibGVQYXJ0aXRpb25LZXksXG4gICAgICBzb3J0S2V5OiBwcm9wcy5zb3J0S2V5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSByZWFkIGNhcGFjaXR5IHNjYWxpbmcgZm9yIHRoaXMgdGFibGVcbiAgICpcbiAgICogQHJldHVybnMgQW4gb2JqZWN0IHRvIGNvbmZpZ3VyZSBhZGRpdGlvbmFsIEF1dG9TY2FsaW5nIHNldHRpbmdzXG4gICAqL1xuICBwdWJsaWMgYXV0b1NjYWxlUmVhZENhcGFjaXR5KFxuICAgIHByb3BzOiBFbmFibGVTY2FsaW5nUHJvcHMsXG4gICk6IElTY2FsYWJsZVRhYmxlQXR0cmlidXRlIHtcbiAgICBpZiAodGhpcy50YWJsZVNjYWxpbmcuc2NhbGFibGVSZWFkQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlJlYWQgQXV0b1NjYWxpbmcgYWxyZWFkeSBlbmFibGVkIGZvciB0aGlzIHRhYmxlXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkF1dG9TY2FsaW5nIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRhYmxlcyB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGVcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLnRhYmxlU2NhbGluZy5zY2FsYWJsZVJlYWRBdHRyaWJ1dGUgPVxuICAgICAgbmV3IFNjYWxhYmxlVGFibGVBdHRyaWJ1dGUodGhpcywgXCJSZWFkU2NhbGluZ1wiLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IGFwcHNjYWxpbmcuU2VydmljZU5hbWVzcGFjZS5EWU5BTU9EQixcbiAgICAgICAgcmVzb3VyY2VJZDogYHRhYmxlLyR7dGhpcy50YWJsZU5hbWV9YCxcbiAgICAgICAgZGltZW5zaW9uOiBcImR5bmFtb2RiOnRhYmxlOlJlYWRDYXBhY2l0eVVuaXRzXCIsXG4gICAgICAgIC8vIHJvbGU6IHRoaXMuc2NhbGluZ1JvbGUsIC8vIENvbW1lbnRpbmcgb3V0IC0gbGV0IFRlcnJhZm9ybSB1c2Ugc2VydmljZS1saW5rZWQgcm9sZVxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgd3JpdGUgY2FwYWNpdHkgc2NhbGluZyBmb3IgdGhpcyB0YWJsZVxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3QgdG8gY29uZmlndXJlIGFkZGl0aW9uYWwgQXV0b1NjYWxpbmcgc2V0dGluZ3MgZm9yIHRoaXMgYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgYXV0b1NjYWxlV3JpdGVDYXBhY2l0eShcbiAgICBwcm9wczogRW5hYmxlU2NhbGluZ1Byb3BzLFxuICApOiBJU2NhbGFibGVUYWJsZUF0dHJpYnV0ZSB7XG4gICAgaWYgKHRoaXMudGFibGVTY2FsaW5nLnNjYWxhYmxlV3JpdGVBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiV3JpdGUgQXV0b1NjYWxpbmcgYWxyZWFkeSBlbmFibGVkIGZvciB0aGlzIHRhYmxlXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkF1dG9TY2FsaW5nIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRhYmxlcyB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGVcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZVNjYWxpbmcuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZSA9IG5ldyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiV3JpdGVTY2FsaW5nXCIsXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IGFwcHNjYWxpbmcuU2VydmljZU5hbWVzcGFjZS5EWU5BTU9EQixcbiAgICAgICAgcmVzb3VyY2VJZDogYHRhYmxlLyR7dGhpcy50YWJsZU5hbWV9YCxcbiAgICAgICAgZGltZW5zaW9uOiBcImR5bmFtb2RiOnRhYmxlOldyaXRlQ2FwYWNpdHlVbml0c1wiLFxuICAgICAgICAvLyByb2xlOiB0aGlzLnNjYWxpbmdSb2xlLCAvLyBDb21tZW50aW5nIG91dCAtIGxldCBUZXJyYWZvcm0gdXNlIHNlcnZpY2UtbGlua2VkIHJvbGVcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gSWYgdGhlcmUgYXJlIHJlcGxpY2FzLCB0aGV5IGRlcGVuZCBvbiB0aGUgd3JpdGUgc2NhbGluZyBwb2xpY3kgb2YgdGhlIG1haW4gdGFibGUuXG4gICAgLy8gVGhpcyBpcyBub3QgZXhwbGljaXRseSBtb2RlbGVkIGluIFRGIGJ1dCB3YXMgaGFuZGxlZCBieSBDdXN0b21SZXNvdXJjZSBkZXBlbmRlbmNpZXMgaW4gQ0RLLlxuICAgIC8vIEZvciBURiwgdGhpcyBkZXBlbmRlbmN5IGlzIGltcGxpY2l0IGlmIHRoZSBwcm92aWRlciBoYW5kbGVzIGl0LCBvciBtaWdodCBuZWVkIGV4cGxpY2l0IGRlcGVuZHNPbiBpZiBpc3N1ZXMgYXJpc2UuXG4gICAgcmV0dXJuIHRoaXMudGFibGVTY2FsaW5nLnNjYWxhYmxlV3JpdGVBdHRyaWJ1dGU7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHJlYWQgY2FwYWNpdHkgc2NhbGluZyBmb3IgdGhlIGdpdmVuIEdTSVxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3QgdG8gY29uZmlndXJlIGFkZGl0aW9uYWwgQXV0b1NjYWxpbmcgc2V0dGluZ3MgZm9yIHRoaXMgYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgYXV0b1NjYWxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhSZWFkQ2FwYWNpdHkoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQXV0b1NjYWxpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGFibGVzIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlUGFpciA9IHRoaXMuaW5kZXhTY2FsaW5nLmdldChpbmRleE5hbWUpO1xuICAgIGlmICghYXR0cmlidXRlUGFpcikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYE5vIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXggd2l0aCBuYW1lICR7aW5kZXhOYW1lfWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlUGFpci5zY2FsYWJsZVJlYWRBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiUmVhZCBBdXRvU2NhbGluZyBhbHJlYWR5IGVuYWJsZWQgZm9yIHRoaXMgaW5kZXhcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChhdHRyaWJ1dGVQYWlyLnNjYWxhYmxlUmVhZEF0dHJpYnV0ZSA9IG5ldyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2luZGV4TmFtZX1SZWFkU2NhbGluZ2AsXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IGFwcHNjYWxpbmcuU2VydmljZU5hbWVzcGFjZS5EWU5BTU9EQixcbiAgICAgICAgcmVzb3VyY2VJZDogYHRhYmxlLyR7dGhpcy50YWJsZU5hbWV9L2luZGV4LyR7aW5kZXhOYW1lfWAsXG4gICAgICAgIGRpbWVuc2lvbjogXCJkeW5hbW9kYjppbmRleDpSZWFkQ2FwYWNpdHlVbml0c1wiLFxuICAgICAgICAvLyByb2xlOiB0aGlzLnNjYWxpbmdSb2xlLCAvLyBDb21tZW50aW5nIG91dCAtIGxldCBUZXJyYWZvcm0gdXNlIHNlcnZpY2UtbGlua2VkIHJvbGVcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9LFxuICAgICkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB3cml0ZSBjYXBhY2l0eSBzY2FsaW5nIGZvciB0aGUgZ2l2ZW4gR1NJXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB0byBjb25maWd1cmUgYWRkaXRpb25hbCBBdXRvU2NhbGluZyBzZXR0aW5ncyBmb3IgdGhpcyBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBhdXRvU2NhbGVHbG9iYWxTZWNvbmRhcnlJbmRleFdyaXRlQ2FwYWNpdHkoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQXV0b1NjYWxpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGFibGVzIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlUGFpciA9IHRoaXMuaW5kZXhTY2FsaW5nLmdldChpbmRleE5hbWUpO1xuICAgIGlmICghYXR0cmlidXRlUGFpcikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYE5vIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXggd2l0aCBuYW1lICR7aW5kZXhOYW1lfWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlUGFpci5zY2FsYWJsZVdyaXRlQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIldyaXRlIEF1dG9TY2FsaW5nIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhpcyBpbmRleFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGF0dHJpYnV0ZVBhaXIuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZSA9IG5ldyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2luZGV4TmFtZX1Xcml0ZVNjYWxpbmdgLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBhcHBzY2FsaW5nLlNlcnZpY2VOYW1lc3BhY2UuRFlOQU1PREIsXG4gICAgICAgIHJlc291cmNlSWQ6IGB0YWJsZS8ke3RoaXMudGFibGVOYW1lfS9pbmRleC8ke2luZGV4TmFtZX1gLFxuICAgICAgICBkaW1lbnNpb246IFwiZHluYW1vZGI6aW5kZXg6V3JpdGVDYXBhY2l0eVVuaXRzXCIsXG4gICAgICAgIC8vIHJvbGU6IHRoaXMuc2NhbGluZ1JvbGUsIC8vIENvbW1lbnRpbmcgb3V0IC0gbGV0IFRlcnJhZm9ybSB1c2Ugc2VydmljZS1saW5rZWQgcm9sZVxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH0sXG4gICAgKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNjaGVtYSBhdHRyaWJ1dGVzIG9mIHRhYmxlIG9yIGluZGV4LlxuICAgKlxuICAgKiBAcmV0dXJucyBTY2hlbWEgb2YgdGFibGUgb3IgaW5kZXguXG4gICAqL1xuICBwdWJsaWMgc2NoZW1hKGluZGV4TmFtZT86IHN0cmluZyk6IFNjaGVtYU9wdGlvbnMge1xuICAgIGlmICghaW5kZXhOYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJ0aXRpb25LZXk6IHRoaXMudGFibGVQYXJ0aXRpb25LZXksXG4gICAgICAgIHNvcnRLZXk6IHRoaXMudGFibGVTb3J0S2V5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zZWNvbmRhcnlJbmRleFNjaGVtYXMuZ2V0KGluZGV4TmFtZSk7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBzY2hlbWEgZm9yIGluZGV4OiAke2luZGV4TmFtZX0uIFVzZSAnYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgnIG9yICdhZGRMb2NhbFNlY29uZGFyeUluZGV4JyB0byBhZGQgaW5kZXhgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSB0YWJsZSBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRhYmxlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKCF0aGlzLnRhYmxlUGFydGl0aW9uS2V5KSB7XG4gICAgICBlcnJvcnMucHVzaChcIkEgcGFydGl0aW9uIGtleSBtdXN0IGJlIHNwZWNpZmllZFwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9jYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubGVuZ3RoID4gMCAmJiAhdGhpcy50YWJsZVNvcnRLZXkpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBcIkEgc29ydCBrZXkgb2YgdGhlIHRhYmxlIG11c3QgYmUgc3BlY2lmaWVkIHRvIGFkZCBsb2NhbCBzZWNvbmRhcnkgaW5kZXhlc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXBsaWNhcyAmJlxuICAgICAgdGhpcy5fcmVwbGljYXMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICApIHtcbiAgICAgIGNvbnN0IHdyaXRlQXV0b1NjYWxlQXR0cmlidXRlID0gdGhpcy50YWJsZVNjYWxpbmcuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZTtcbiAgICAgIGlmICghd3JpdGVBdXRvU2NhbGVBdHRyaWJ1dGUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgXCJBIGdsb2JhbCBUYWJsZSB0aGF0IHVzZXMgUFJPVklTSU9ORUQgYXMgdGhlIGJpbGxpbmcgbW9kZSBuZWVkcyBhdXRvLXNjYWxlZCB3cml0ZSBjYXBhY2l0eS4gXCIgK1xuICAgICAgICAgICAgXCJVc2UgdGhlIGF1dG9TY2FsZVdyaXRlQ2FwYWNpdHkoKSBtZXRob2QgdG8gZW5hYmxlIGl0LlwiLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICghd3JpdGVBdXRvU2NhbGVBdHRyaWJ1dGUuX3NjYWxpbmdQb2xpY3lDcmVhdGVkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIFwiQSBnbG9iYWwgVGFibGUgdGhhdCB1c2VzIFBST1ZJU0lPTkVEIGFzIHRoZSBiaWxsaW5nIG1vZGUgbmVlZHMgYXV0by1zY2FsZWQgd3JpdGUgY2FwYWNpdHkgd2l0aCBhIHBvbGljeS4gXCIgK1xuICAgICAgICAgICAgXCJDYWxsIG9uZSBvZiB0aGUgc2NhbGVPbiooKSBtZXRob2RzIG9mIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBhdXRvU2NhbGVXcml0ZUNhcGFjaXR5KClcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGFyZSBub3Qgc3BlY2lmaWVkIGZvciBvbi1kZW1hbmQgdGFibGVzIChiaWxsaW5nIG1vZGUgUEFZX1BFUl9SRVFVRVNUKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IHByb3BlcnRpZXNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQcm92aXNpb25pbmcocHJvcHM6IHtcbiAgICByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gICAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgfSkge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVhZENhcGFjaXR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJvcHMud3JpdGVDYXBhY2l0eSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIllvdSBjYW5ub3QgcHJvdmlzaW9uIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIHRhYmxlIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3Zpc2lvbmluZ0dTSShwcm9wczogR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcykge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVhZENhcGFjaXR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJvcHMud3JpdGVDYXBhY2l0eSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIllvdSBjYW5ub3QgcHJvdmlzaW9uIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIEdTSSB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGUgb24gdGhlIHRhYmxlXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaW5kZXggbmFtZSB0byBjaGVjayBpZiBhIGR1cGxpY2F0ZSBuYW1lIGFscmVhZHkgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXhOYW1lIGEgbmFtZSBvZiBnbG9iYWwgb3IgbG9jYWwgc2Vjb25kYXJ5IGluZGV4XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlSW5kZXhOYW1lKGluZGV4TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5SW5kZXhTY2hlbWFzLmhhcyhpbmRleE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgQSBkdXBsaWNhdGUgaW5kZXggbmFtZSwgJHtpbmRleE5hbWV9LCBpcyBub3QgYWxsb3dlZGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBub24ta2V5IGF0dHJpYnV0ZXMgYnkgY2hlY2tpbmcgbGltaXRzIHdpdGhpbiBzZWNvbmRhcnkgaW5kZXgsIHdoaWNoIG1heSB2YXJ5IGluIGZ1dHVyZS5cbiAgICpcbiAgICogQHBhcmFtIG5vbktleUF0dHJpYnV0ZXMgYSBsaXN0IG9mIG5vbi1rZXkgYXR0cmlidXRlIG5hbWVzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTm9uS2V5QXR0cmlidXRlcyhub25LZXlBdHRyaWJ1dGVzOiBzdHJpbmdbXSkge1xuICAgIGlmICh0aGlzLm5vbktleUF0dHJpYnV0ZXMuc2l6ZSArIG5vbktleUF0dHJpYnV0ZXMubGVuZ3RoID4gMTAwKSB7XG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uZHluYW1vZGIvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL0xpbWl0cy5odG1sI2xpbWl0cy1zZWNvbmRhcnktaW5kZXhlc1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIFwiQSBtYXhpbXVtIG51bWJlciBvZiBub25LZXlBdHRyaWJ1dGVzIGFjcm9zcyBhbGwgb2Ygc2Vjb25kYXJ5IGluZGV4ZXMgaXMgMTAwXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHN0b3JlIGFsbCBub24ta2V5IGF0dHJpYnV0ZXNcbiAgICBub25LZXlBdHRyaWJ1dGVzLmZvckVhY2goKGF0dCkgPT4gdGhpcy5ub25LZXlBdHRyaWJ1dGVzLmFkZChhdHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyUG9pbnRJblRpbWVSZWNvdmVyeShcbiAgICBwcm9wczogVGFibGVQcm9wcyxcbiAgKTogZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlUG9pbnRJblRpbWVSZWNvdmVyeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKFxuICAgICAgcHJvcHMucG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcHJvcHMucG9pbnRJblRpbWVSZWNvdmVyeSAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcImBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbmAgYW5kIGBwb2ludEluVGltZVJlY292ZXJ5YCBhcmUgc2V0LiBVc2UgYHBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uYCBvbmx5LlwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjID0gcHJvcHMucG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb247XG4gICAgY29uc3QgcmVjb3ZlcnlQZXJpb2RJbkRheXMgPSBzcGVjPy5yZWNvdmVyeVBlcmlvZEluRGF5cztcbiAgICBpZiAoIXNwZWM/LnBvaW50SW5UaW1lUmVjb3ZlcnlFbmFibGVkICYmIHJlY292ZXJ5UGVyaW9kSW5EYXlzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbm5vdCBzZXQgYHJlY292ZXJ5UGVyaW9kSW5EYXlzYCB3aGlsZSBgcG9pbnRJblRpbWVSZWNvdmVyeUVuYWJsZWRgIGlzIHNldCB0byBmYWxzZS5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcmVjb3ZlcnlQZXJpb2RJbkRheXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKHJlY292ZXJ5UGVyaW9kSW5EYXlzIDwgMSB8fCByZWNvdmVyeVBlcmlvZEluRGF5cyA+IDM1KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJgcmVjb3ZlcnlQZXJpb2RJbkRheXNgIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIGAxYCBhbmQgYDM1YC5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlZCA9XG4gICAgICBzcGVjPy5wb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZCA/PyBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5O1xuICAgIGlmIChlbmFibGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgZW5hYmxlZCwgcmVjb3ZlcnlQZXJpb2RJbkRheXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29udHJpYnV0b3JJbnNpZ2h0cyhcbiAgICBwcm9wczogSUNvbnRyaWJ1dG9ySW5zaWdodHNDb25maWd1cmFibGUsXG4gICk6IENvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdmFsaWRhdGVDb250cmlidXRvckluc2lnaHRzKFxuICAgICAgcHJvcHMuY29udHJpYnV0b3JJbnNpZ2h0c0VuYWJsZWQsXG4gICAgICBwcm9wcy5jb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbixcbiAgICAgIFwiY29udHJpYnV0b3JJbnNpZ2h0c0VuYWJsZWRcIixcbiAgICAgIHRoaXMsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRJbmRleFByb2plY3Rpb24oXG4gICAgcHJvcHM6IFNlY29uZGFyeUluZGV4UHJvcHMsXG4gICk6IFBpY2s8XG4gICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXgsXG4gICAgXCJwcm9qZWN0aW9uVHlwZVwiIHwgXCJub25LZXlBdHRyaWJ1dGVzXCJcbiAgPiB7XG4gICAgaWYgKFxuICAgICAgcHJvcHMucHJvamVjdGlvblR5cGUgPT09IFByb2plY3Rpb25UeXBlLklOQ0xVREUgJiZcbiAgICAgICFwcm9wcy5ub25LZXlBdHRyaWJ1dGVzXG4gICAgKSB7XG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1keW5hbW9kYi1wcm9qZWN0aW9ub2JqZWN0Lmh0bWxcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBOb24ta2V5IGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHVzaW5nICR7UHJvamVjdGlvblR5cGUuSU5DTFVERX0gcHJvamVjdGlvbiB0eXBlYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJvcHMucHJvamVjdGlvblR5cGUgIT09IFByb2plY3Rpb25UeXBlLklOQ0xVREUgJiZcbiAgICAgIHByb3BzLm5vbktleUF0dHJpYnV0ZXNcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBOb24ta2V5IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQgd2hlbiBub3QgdXNpbmcgJHtQcm9qZWN0aW9uVHlwZS5JTkNMVURFfSBwcm9qZWN0aW9uIHR5cGVgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMubm9uS2V5QXR0cmlidXRlcykge1xuICAgICAgdGhpcy52YWxpZGF0ZU5vbktleUF0dHJpYnV0ZXMocHJvcHMubm9uS2V5QXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2plY3Rpb25UeXBlOiBwcm9wcy5wcm9qZWN0aW9uVHlwZSA/PyBQcm9qZWN0aW9uVHlwZS5BTEwsXG4gICAgICBub25LZXlBdHRyaWJ1dGVzOiBwcm9wcy5ub25LZXlBdHRyaWJ1dGVzLFxuICAgIH07XG4gIH1cblxuICAvLyBUT0RPOiBrZXlUeXBlIGlzIHVudXNlZFxuICBwcml2YXRlIGFkZEtleShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgX2tleVR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nQXR0ciA9IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5maW5kKFxuICAgICAgKGRlZikgPT4gZGVmLm5hbWUgPT09IGF0dHJpYnV0ZS5uYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXR0ciAmJiBleGlzdGluZ0F0dHIudHlwZSAhPT0gYXR0cmlidXRlLnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gc3BlY2lmeSAke2F0dHJpYnV0ZS5uYW1lfSBhcyAke2F0dHJpYnV0ZS50eXBlfSBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IGRlZmluZWQgYXMgJHtleGlzdGluZ0F0dHIudHlwZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFleGlzdGluZ0F0dHIpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5wdXNoKHtcbiAgICAgICAgbmFtZTogYXR0cmlidXRlLm5hbWUsXG4gICAgICAgIHR5cGU6IGF0dHJpYnV0ZS50eXBlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEZvciB0aGUgbWFpbiB0YWJsZSwgaGFzaEtleSBhbmQgcmFuZ2VLZXkgYXJlIHNldCBkaXJlY3RseSBvbiB0aGUgcmVzb3VyY2UuXG4gICAgLy8gRm9yIEdTSXMvTFNJcywgdGhleSBhcmUgcGFydCBvZiB0aGVpciByZXNwZWN0aXZlIGJsb2Nrcy5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUga2V5IGF0dHJpYnV0ZSBvZiB0YWJsZSBvciBzZWNvbmRhcnkgaW5kZXggdG8gYXNzZW1ibGUgYXR0cmlidXRlIGRlZmluaXRpb25zIG9mIFRhYmxlUmVzb3VyY2VQcm9wcy5cbiAgICpcbiAgICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUga2V5IGF0dHJpYnV0ZSBvZiB0YWJsZSBvciBzZWNvbmRhcnkgaW5kZXhcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpIHtcbiAgICBjb25zdCBleGlzdGluZ0RlZiA9IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5maW5kKFxuICAgICAgKGRlZikgPT4gZGVmLm5hbWUgPT09IGF0dHJpYnV0ZS5uYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nRGVmICYmIGV4aXN0aW5nRGVmLnR5cGUgIT09IGF0dHJpYnV0ZS50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVW5hYmxlIHRvIHNwZWNpZnkgJHthdHRyaWJ1dGUubmFtZX0gYXMgJHthdHRyaWJ1dGUudHlwZX0gYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSBkZWZpbmVkIGFzICR7ZXhpc3RpbmdEZWYudHlwZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFleGlzdGluZ0RlZikge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVEZWZpbml0aW9uc0ludGVybmFsLnB1c2goe1xuICAgICAgICBuYW1lOiBhdHRyaWJ1dGUubmFtZSxcbiAgICAgICAgdHlwZTogYXR0cmlidXRlLnR5cGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBDb21tZW50aW5nIG91dCBtYWtlU2NhbGluZ1JvbGUgbWV0aG9kIC0gVGVycmFmb3JtIGhhbmRsZXMgc2VydmljZS1saW5rZWQgcm9sZXMgYXV0b21hdGljYWxseVxuICAvLyBVbmxpa2UgQVdTIENESyBDbG91ZEZvcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiwgVGVycmFmb3JtIEFXUyBwcm92aWRlciBjcmVhdGVzIGFwcHJvcHJpYXRlXG4gIC8vIHNlcnZpY2UtbGlua2VkIHJvbGVzIHdoZW4gcm9sZUFybiBpcyBvbWl0dGVkIGZyb20gYXdzX2FwcGF1dG9zY2FsaW5nX3RhcmdldCByZXNvdXJjZVxuICAvLyBwcml2YXRlIG1ha2VTY2FsaW5nUm9sZSgpOiBpYW0uSVJvbGUge1xuICAvLyAgIC8vIFVzZSBhIFNlcnZpY2UgTGlua2VkIFJvbGUuXG4gIC8vICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F1dG9zY2FsaW5nL2FwcGxpY2F0aW9uL3VzZXJndWlkZS9hcHBsaWNhdGlvbi1hdXRvLXNjYWxpbmctc2VydmljZS1saW5rZWQtcm9sZXMuaHRtbFxuICAvLyAgIHJldHVybiBpYW0uUm9sZS5mcm9tUm9sZUFybihcbiAgLy8gICAgIHRoaXMsXG4gIC8vICAgICBcIlNjYWxpbmdSb2xlXCIsXG4gIC8vICAgICB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gIC8vICAgICAgIHNlcnZpY2U6IFwiaWFtXCIsXG4gIC8vICAgICAgIHJlZ2lvbjogXCJcIiwgLy8gU0xScyBhcmUgZ2xvYmFsXG4gIC8vICAgICAgIHJlc291cmNlOlxuICAvLyAgICAgICAgIFwicm9sZS9hd3Mtc2VydmljZS1yb2xlL2R5bmFtb2RiLmFwcGxpY2F0aW9uLWF1dG9zY2FsaW5nLmFtYXpvbmF3cy5jb21cIixcbiAgLy8gICAgICAgcmVzb3VyY2VOYW1lOiBcIkFXU1NlcnZpY2VSb2xlRm9yQXBwbGljYXRpb25BdXRvU2NhbGluZ19EeW5hbW9EQlRhYmxlXCIsXG4gIC8vICAgICAgIC8vIFRPRE86IElzIHRoaXMgbmVlZGVkP1xuICAvLyAgICAgICAvLyBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FLCAvLyBTcGVjaWFsIGZvcm1hdCBmb3IgU0xSc1xuICAvLyAgICAgfSksXG4gIC8vICAgKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHJlcGxpY2EgdGFibGVzXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb25zIHJlZ2lvbnMgd2hlcmUgdG8gY3JlYXRlIHRhYmxlc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJSZXBsaWNhcyhcbiAgICByZWdpb25zPzogc3RyaW5nW10sXG4gICAgcmVwbGljYVNwZWNpZmljYXRpb24/OiBEeW5hbW9kYlRhYmxlUmVwbGljYVtdLFxuICApOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVSZXBsaWNhW10gfCB1bmRlZmluZWQge1xuICAgIGlmIChyZXBsaWNhU3BlY2lmaWNhdGlvbiAmJiByZXBsaWNhU3BlY2lmaWNhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFjay5yZWdpb24pICYmXG4gICAgICAgIHJlcGxpY2FTcGVjaWZpY2F0aW9uLnNvbWUoXG4gICAgICAgICAgKHJlcGxpY2EpID0+IHJlcGxpY2EucmVnaW9uTmFtZSA9PT0gdGhpcy5zdGFjay5yZWdpb24sXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiYHJlcGxpY2FTcGVjaWZpY2F0aW9uYCBjYW5ub3QgaW5jbHVkZSB0aGUgcmVnaW9uIHdoZXJlIHRoaXMgc3RhY2sgaXMgZGVwbG95ZWQuXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXBsaWNhU3BlY2lmaWNhdGlvbi5tYXAoKHJlcGxpY2EpID0+ICh7XG4gICAgICAgIHJlZ2lvbk5hbWU6IHJlcGxpY2EucmVnaW9uTmFtZSxcbiAgICAgICAga21zS2V5QXJuOiByZXBsaWNhLmVuY3J5cHRpb25LZXk/LmtleUFybixcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeTogcmVwbGljYS5wb2ludEluVGltZVJlY292ZXJ5LFxuICAgICAgICBwcm9wYWdhdGVUYWdzOiByZXBsaWNhLnByb3BhZ2F0ZVRhZ3MsXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmICghcmVnaW9ucyB8fCByZWdpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmIChcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFjay5yZWdpb24pICYmXG4gICAgICByZWdpb25zLmluY2x1ZGVzKHRoaXMuc3RhY2sucmVnaW9uKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJgcmVwbGljYXRpb25SZWdpb25zYCBjYW5ub3QgaW5jbHVkZSB0aGUgcmVnaW9uIHdoZXJlIHRoaXMgc3RhY2sgaXMgZGVwbG95ZWQuXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4ubmV3IFNldChyZWdpb25zKV0ubWFwKChyZWdpb24pID0+ICh7XG4gICAgICByZWdpb25OYW1lOiByZWdpb24sXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0YWJsZSBoYXMgaW5kZXhlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBoYXNJbmRleCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5nbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubGVuZ3RoICtcbiAgICAgICAgdGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5sZW5ndGggPlxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGtleSBwcm9wZXJ0aWVzIGFuZCByZXR1cm4gdGhlIFRhYmxlIGVuY3J5cHRpb24gcHJvcGVydHkgZnJvbSB0aGVcbiAgICogdXNlcidzIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogVGFibGVQcm9wcyk6IHtcbiAgICBzc2VTcGVjaWZpY2F0aW9uPzogZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlU2VydmVyU2lkZUVuY3J5cHRpb247XG4gICAgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICB9IHtcbiAgICBsZXQgZW5jcnlwdGlvblR5cGUgPSBwcm9wcy5lbmNyeXB0aW9uO1xuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlICE9IG51bGwgJiYgcHJvcHMuc2VydmVyU2lkZUVuY3J5cHRpb24gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJPbmx5IG9uZSBvZiBlbmNyeXB0aW9uIGFuZCBzZXJ2ZXJTaWRlRW5jcnlwdGlvbiBjYW4gYmUgc3BlY2lmaWVkLCBidXQgYm90aCB3ZXJlIHByb3ZpZGVkXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zZXJ2ZXJTaWRlRW5jcnlwdGlvbiAmJiBwcm9wcy5lbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcImVuY3J5cHRpb25LZXkgY2Fubm90IGJlIHNwZWNpZmllZCB3aGVuIHNlcnZlclNpZGVFbmNyeXB0aW9uIGlzIHNwZWNpZmllZC4gVXNlIGVuY3J5cHRpb24gaW5zdGVhZFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5jcnlwdGlvblR5cGUgPVxuICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5ICE9IG51bGxcbiAgICAgICAgICA/IC8vIElmIHRoZXJlIGlzIGEgY29uZmlndXJlZCBlbmNyeXB0aW9uS2V5LCB0aGUgZW5jcnlwdGlvbiBpcyBpbXBsaWNpdGx5IENVU1RPTUVSX01BTkFHRURcbiAgICAgICAgICAgIFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEXG4gICAgICAgICAgOiAvLyBPdGhlcndpc2UsIGlmIHNldmVyU2lkZUVuY3J5cHRpb24gaXMgZW5hYmxlZCwgaXQncyBBV1NfTUFOQUdFRDsgZWxzZSB1bmRlZmluZWQgKGRvIG5vdCBzZXQgYW55dGhpbmcpXG4gICAgICAgICAgICBwcm9wcy5zZXJ2ZXJTaWRlRW5jcnlwdGlvblxuICAgICAgICAgICAgPyBUYWJsZUVuY3J5cHRpb24uQVdTX01BTkFHRURcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGVuY3J5cHRpb25UeXBlICE9PSBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCAmJlxuICAgICAgcHJvcHMuZW5jcnlwdGlvbktleVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYGVuY3J5cHRpb25LZXkgY2Fubm90IGJlIHNwZWNpZmllZCB1bmxlc3MgZW5jcnlwdGlvbiBpcyBzZXQgdG8gVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRUQgKGl0IHdhcyBzZXQgdG8gJHtlbmNyeXB0aW9uVHlwZX0pYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gaW4gdGhpcyBjYXNlLCBlYWNoIHJlcGxpY2Egc2hvdWxkIHNwZWNpZnkgYSBDdXN0b21lciBLTVMga2V5LlxuICAgIGlmIChcbiAgICAgIGVuY3J5cHRpb25UeXBlID09PSBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCAmJlxuICAgICAgcHJvcHMucmVwbGljYXRpb25SZWdpb25zXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEIGlzIG5vdCBzdXBwb3J0ZWQgYnkgRHluYW1vREIgR2xvYmFsIFRhYmxlcyAod2hlcmUgcmVwbGljYXRpb25SZWdpb25zIHdhcyBzZXQpXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByb3BzLnJlcGxpY2FTcGVjaWZpY2F0aW9uICYmXG4gICAgICBwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbi5sZW5ndGggPiAwICYmXG4gICAgICBlbmNyeXB0aW9uVHlwZSA9PT0gVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRURcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24uc29tZShcbiAgICAgICAgICAocmVwbGljYSkgPT4gIXJlcGxpY2EuZW5jcnlwdGlvbktleSwgLy8gQ2hlY2sgaWYgYW55IHJlcGxpY2EgaXMgbWlzc2luZyBhbiBlbmNyeXB0aW9uIGtleVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIldoZW4gdXNpbmcgcmVwbGljYVNwZWNpZmljYXRpb24sIGVhY2ggcmVwbGljYSBtdXN0IHNwZWNpZnkgYW4gZW5jcnlwdGlvbktleSBpZiBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCBpcyB1c2VkXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy9WYWxpZGF0ZSB0aGF0IHRoZSBrZXlzIGJlbG9uZyB0byB0aGUgY29ycmVjdCByZWdpb25zXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLnJlcGxpY2FTcGVjaWZpY2F0aW9uLnNvbWUoXG4gICAgICAgICAgKHJlcGxpY2EpID0+XG4gICAgICAgICAgICByZXBsaWNhLmVuY3J5cHRpb25LZXkgJiZcbiAgICAgICAgICAgIHJlcGxpY2EuZW5jcnlwdGlvbktleS5lbnYucmVnaW9uICE9PSByZXBsaWNhLnJlZ2lvbk5hbWUsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiV2hlbiB1c2luZyByZXBsaWNhU3BlY2lmaWNhdGlvbiwgZWFjaCByZXBsaWNhJ3MgZW5jcnlwdGlvbktleSBtdXN0IGJlIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyBpdHMgcmVwbGljYVwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChlbmNyeXB0aW9uVHlwZSkge1xuICAgICAgY2FzZSBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRDpcbiAgICAgICAgY29uc3Qga2V5ID1cbiAgICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5ID8/XG4gICAgICAgICAgbmV3IGttcy5LZXkodGhpcywgXCJLZXlcIiwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDdXN0b21lci1tYW5hZ2VkIGtleSBhdXRvLWNyZWF0ZWQgZm9yIGVuY3J5cHRpbmcgRHluYW1vREIgdGFibGUgYXQgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzc2VTcGVjaWZpY2F0aW9uOiB7IGVuYWJsZWQ6IHRydWUsIGttc0tleUFybjoga2V5LmtleUFybiB9LFxuICAgICAgICAgIGVuY3J5cHRpb25LZXk6IGtleSxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSBUYWJsZUVuY3J5cHRpb24uQVdTX01BTkFHRUQ6XG4gICAgICAgIHJldHVybiB7IHNzZVNwZWNpZmljYXRpb246IHsgZW5hYmxlZDogdHJ1ZSB9IH07IC8vIFVzZXMgYWxpYXMvYXdzL2R5bmFtb2RiIGJ5IGRlZmF1bHRcbiAgICAgIGNhc2UgVGFibGVFbmNyeXB0aW9uLkRFRkFVTFQ6XG4gICAgICAgIHJldHVybiB7IHNzZVNwZWNpZmljYXRpb246IHsgZW5hYmxlZDogZmFsc2UgfSB9OyAvLyBBV1Mtb3duZWQga2V5XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHsgc3NlU3BlY2lmaWNhdGlvbjogdW5kZWZpbmVkIH07IC8vIERlZmF1bHRzIHRvIEFXUy1vd25lZCBrZXlcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgJ2VuY3J5cHRpb25UeXBlJzogJHtlbmNyeXB0aW9uVHlwZX1gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJJbXBvcnRTb3VyY2VTcGVjaWZpY2F0aW9uKFxuICAgIGltcG9ydFNvdXJjZT86IEltcG9ydFNvdXJjZVNwZWNpZmljYXRpb24sXG4gICk6IGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZUltcG9ydFRhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWltcG9ydFNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZW5kZXJlZElucHV0Rm9ybWF0ID0gaW1wb3J0U291cmNlLmlucHV0Rm9ybWF0Ll9yZW5kZXIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRGb3JtYXQ6IHJlbmRlcmVkSW5wdXRGb3JtYXQuaW5wdXRGb3JtYXQsXG4gICAgICBpbnB1dEZvcm1hdE9wdGlvbnM6IHJlbmRlcmVkSW5wdXRGb3JtYXQuaW5wdXRGb3JtYXRPcHRpb25zLFxuICAgICAgaW5wdXRDb21wcmVzc2lvblR5cGU6IGltcG9ydFNvdXJjZS5jb21wcmVzc2lvblR5cGUsXG4gICAgICBzM0J1Y2tldFNvdXJjZToge1xuICAgICAgICBidWNrZXQ6IGltcG9ydFNvdXJjZS5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgYnVja2V0T3duZXI6IGltcG9ydFNvdXJjZS5idWNrZXRPd25lcixcbiAgICAgICAga2V5UHJlZml4OiBpbXBvcnRTb3VyY2Uua2V5UHJlZml4LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgdG8gdGhlIFRlcnJhZm9ybSBKU09OIG91dHB1dCBhdCBTeW50aCB0aW1lLlxuICAgKlxuICAgKiBjYWxsZWQgYnkgVGVycmFmb3JtU3RhY2sucHJlcGFyZVN0YWNrKClcbiAgICovXG4gIHB1YmxpYyB0b1RlcnJhZm9ybSgpOiBhbnkge1xuICAgIC8qKlxuICAgICAqIEEgcHJlcGFyaW5nIHJlc29sdmUgbWlnaHQgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHN0YWNrXG4gICAgICovXG4gICAgZm9yIChjb25zdCBnc2kgb2YgdGhpcy5nbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwpIHtcbiAgICAgIGlmIChnc2kuY29udHJpYnV0b3JJbnNpZ2h0c1NwZWNpZmljYXRpb24/LmVuYWJsZWQpIHtcbiAgICAgICAgbmV3IGR5bmFtb2RiQ29udHJpYnV0b3JJbnNpZ2h0cy5EeW5hbW9kYkNvbnRyaWJ1dG9ySW5zaWdodHMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIkNvbnRyaWJ1dG9ySW5zaWdodHNcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICAgICAgaW5kZXhOYW1lOiBnc2kubmFtZSxcbiAgICAgICAgICAgIG1vZGU6IGdzaS5jb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbj8ubW9kZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBkZWxldGUgZ3NpLmNvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqXG4gKiBKdXN0IGEgY29udmVuaWVudCB3YXkgdG8ga2VlcCB0cmFjayBvZiBib3RoIGF0dHJpYnV0ZXNcbiAqL1xuaW50ZXJmYWNlIFNjYWxhYmxlQXR0cmlidXRlUGFpciB7XG4gIHNjYWxhYmxlUmVhZEF0dHJpYnV0ZT86IFNjYWxhYmxlVGFibGVBdHRyaWJ1dGU7XG4gIHNjYWxhYmxlV3JpdGVBdHRyaWJ1dGU/OiBTY2FsYWJsZVRhYmxlQXR0cmlidXRlO1xufVxuIl19