terraconstructs 0.0.8

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 (680) hide show
  1. package/.envrc +5 -0
  2. package/.jsii +79780 -0
  3. package/.mise.toml +8 -0
  4. package/.nvmrc +1 -0
  5. package/.terraform-version +1 -0
  6. package/.terraform.d/plugin-cache/.gitignore +5 -0
  7. package/LICENSE +674 -0
  8. package/NOTICE.txt +12 -0
  9. package/README.md +42 -0
  10. package/bun.lockb +0 -0
  11. package/go.mod +158 -0
  12. package/go.sum +1206 -0
  13. package/lib/aws/arn.d.ts +187 -0
  14. package/lib/aws/arn.js +383 -0
  15. package/lib/aws/aws-construct.d.ts +76 -0
  16. package/lib/aws/aws-construct.js +38 -0
  17. package/lib/aws/aws-stack.d.ts +201 -0
  18. package/lib/aws/aws-stack.js +303 -0
  19. package/lib/aws/cloudwatch/actions/ec2.d.ts +35 -0
  20. package/lib/aws/cloudwatch/actions/ec2.js +48 -0
  21. package/lib/aws/cloudwatch/actions/index.d.ts +2 -0
  22. package/lib/aws/cloudwatch/actions/index.js +24 -0
  23. package/lib/aws/cloudwatch/actions/lambda.d.ts +16 -0
  24. package/lib/aws/cloudwatch/actions/lambda.js +48 -0
  25. package/lib/aws/cloudwatch/alarm-action.d.ts +23 -0
  26. package/lib/aws/cloudwatch/alarm-action.js +4 -0
  27. package/lib/aws/cloudwatch/alarm-base.d.ts +84 -0
  28. package/lib/aws/cloudwatch/alarm-base.js +64 -0
  29. package/lib/aws/cloudwatch/alarm-rule.d.ts +61 -0
  30. package/lib/aws/cloudwatch/alarm-rule.js +116 -0
  31. package/lib/aws/cloudwatch/alarm-status-widget.d.ts +77 -0
  32. package/lib/aws/cloudwatch/alarm-status-widget.js +62 -0
  33. package/lib/aws/cloudwatch/alarm.d.ts +158 -0
  34. package/lib/aws/cloudwatch/alarm.js +410 -0
  35. package/lib/aws/cloudwatch/composite-alarm.d.ts +88 -0
  36. package/lib/aws/cloudwatch/composite-alarm.js +98 -0
  37. package/lib/aws/cloudwatch/dashboard.d.ts +137 -0
  38. package/lib/aws/cloudwatch/dashboard.js +141 -0
  39. package/lib/aws/cloudwatch/data-protection-policy.d.ts +184 -0
  40. package/lib/aws/cloudwatch/data-protection-policy.js +246 -0
  41. package/lib/aws/cloudwatch/graph.d.ts +792 -0
  42. package/lib/aws/cloudwatch/graph.js +537 -0
  43. package/lib/aws/cloudwatch/index.d.ts +26 -0
  44. package/lib/aws/cloudwatch/index.js +49 -0
  45. package/lib/aws/cloudwatch/layout.d.ts +89 -0
  46. package/lib/aws/cloudwatch/layout.js +147 -0
  47. package/lib/aws/cloudwatch/log-destinations/index.d.ts +2 -0
  48. package/lib/aws/cloudwatch/log-destinations/index.js +20 -0
  49. package/lib/aws/cloudwatch/log-destinations/kinesis.d.ts +29 -0
  50. package/lib/aws/cloudwatch/log-destinations/kinesis.js +52 -0
  51. package/lib/aws/cloudwatch/log-destinations/lambda.d.ts +22 -0
  52. package/lib/aws/cloudwatch/log-destinations/lambda.js +46 -0
  53. package/lib/aws/cloudwatch/log-group.d.ts +453 -0
  54. package/lib/aws/cloudwatch/log-group.js +350 -0
  55. package/lib/aws/cloudwatch/log-query.d.ts +91 -0
  56. package/lib/aws/cloudwatch/log-query.js +85 -0
  57. package/lib/aws/cloudwatch/log-stream.d.ts +57 -0
  58. package/lib/aws/cloudwatch/log-stream.js +57 -0
  59. package/lib/aws/cloudwatch/metric-filter.d.ts +30 -0
  60. package/lib/aws/cloudwatch/metric-filter.js +69 -0
  61. package/lib/aws/cloudwatch/metric-types.d.ts +407 -0
  62. package/lib/aws/cloudwatch/metric-types.js +151 -0
  63. package/lib/aws/cloudwatch/metric.d.ts +492 -0
  64. package/lib/aws/cloudwatch/metric.js +493 -0
  65. package/lib/aws/cloudwatch/pattern.d.ts +195 -0
  66. package/lib/aws/cloudwatch/pattern.js +412 -0
  67. package/lib/aws/cloudwatch/policy.d.ts +43 -0
  68. package/lib/aws/cloudwatch/policy.js +50 -0
  69. package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.d.ts +14 -0
  70. package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.js +37 -0
  71. package/lib/aws/cloudwatch/private/env-tokens.d.ts +8 -0
  72. package/lib/aws/cloudwatch/private/env-tokens.js +48 -0
  73. package/lib/aws/cloudwatch/private/metric-util.d.ts +60 -0
  74. package/lib/aws/cloudwatch/private/metric-util.js +132 -0
  75. package/lib/aws/cloudwatch/private/object.d.ts +1 -0
  76. package/lib/aws/cloudwatch/private/object.js +18 -0
  77. package/lib/aws/cloudwatch/private/rendering.d.ts +60 -0
  78. package/lib/aws/cloudwatch/private/rendering.js +181 -0
  79. package/lib/aws/cloudwatch/private/statistic.d.ts +51 -0
  80. package/lib/aws/cloudwatch/private/statistic.js +176 -0
  81. package/lib/aws/cloudwatch/query-definition.d.ts +150 -0
  82. package/lib/aws/cloudwatch/query-definition.js +114 -0
  83. package/lib/aws/cloudwatch/stats.d.ts +150 -0
  84. package/lib/aws/cloudwatch/stats.js +207 -0
  85. package/lib/aws/cloudwatch/subscription-filter.d.ts +75 -0
  86. package/lib/aws/cloudwatch/subscription-filter.js +51 -0
  87. package/lib/aws/cloudwatch/text.d.ts +52 -0
  88. package/lib/aws/cloudwatch/text.js +53 -0
  89. package/lib/aws/cloudwatch/variable.d.ts +156 -0
  90. package/lib/aws/cloudwatch/variable.js +156 -0
  91. package/lib/aws/cloudwatch/widget.d.ts +62 -0
  92. package/lib/aws/cloudwatch/widget.js +45 -0
  93. package/lib/aws/compute/activity.d.ts +81 -0
  94. package/lib/aws/compute/activity.js +132 -0
  95. package/lib/aws/compute/architecture.d.ts +33 -0
  96. package/lib/aws/compute/architecture.js +42 -0
  97. package/lib/aws/compute/chain.d.ts +52 -0
  98. package/lib/aws/compute/chain.js +68 -0
  99. package/lib/aws/compute/condition.d.ts +202 -0
  100. package/lib/aws/compute/condition.js +409 -0
  101. package/lib/aws/compute/event-invoke-config.d.ts +74 -0
  102. package/lib/aws/compute/event-invoke-config.js +63 -0
  103. package/lib/aws/compute/event-source-filter.d.ts +64 -0
  104. package/lib/aws/compute/event-source-filter.js +86 -0
  105. package/lib/aws/compute/event-source-mapping.d.ts +310 -0
  106. package/lib/aws/compute/event-source-mapping.js +267 -0
  107. package/lib/aws/compute/event-sources/index.d.ts +4 -0
  108. package/lib/aws/compute/event-sources/index.js +28 -0
  109. package/lib/aws/compute/event-sources/s3-onfailure-destination.d.ts +13 -0
  110. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +26 -0
  111. package/lib/aws/compute/event-sources/s3.d.ts +24 -0
  112. package/lib/aws/compute/event-sources/s3.js +25 -0
  113. package/lib/aws/compute/event-sources/sqs-dlq.d.ts +13 -0
  114. package/lib/aws/compute/event-sources/sqs-dlq.js +26 -0
  115. package/lib/aws/compute/event-sources/sqs.d.ts +75 -0
  116. package/lib/aws/compute/event-sources/sqs.js +84 -0
  117. package/lib/aws/compute/fields.d.ts +367 -0
  118. package/lib/aws/compute/fields.js +546 -0
  119. package/lib/aws/compute/function-alias.d.ts +148 -0
  120. package/lib/aws/compute/function-alias.js +176 -0
  121. package/lib/aws/compute/function-base.d.ts +314 -0
  122. package/lib/aws/compute/function-base.js +421 -0
  123. package/lib/aws/compute/function-destination.d.ts +42 -0
  124. package/lib/aws/compute/function-destination.js +18 -0
  125. package/lib/aws/compute/function-destinations/event-bridge.d.ts +19 -0
  126. package/lib/aws/compute/function-destinations/event-bridge.js +46 -0
  127. package/lib/aws/compute/function-destinations/function.d.ts +34 -0
  128. package/lib/aws/compute/function-destinations/function.js +55 -0
  129. package/lib/aws/compute/function-destinations/index.d.ts +3 -0
  130. package/lib/aws/compute/function-destinations/index.js +22 -0
  131. package/lib/aws/compute/function-destinations/sqs.d.ts +14 -0
  132. package/lib/aws/compute/function-destinations/sqs.js +27 -0
  133. package/lib/aws/compute/function-nodejs.d.ts +55 -0
  134. package/lib/aws/compute/function-nodejs.js +70 -0
  135. package/lib/aws/compute/function-permission.d.ts +83 -0
  136. package/lib/aws/compute/function-permission.js +3 -0
  137. package/lib/aws/compute/function-url.d.ts +210 -0
  138. package/lib/aws/compute/function-url.js +148 -0
  139. package/lib/aws/compute/function-vpc-config.generated.d.ts +36 -0
  140. package/lib/aws/compute/function-vpc-config.generated.js +3 -0
  141. package/lib/aws/compute/function.d.ts +492 -0
  142. package/lib/aws/compute/function.js +692 -0
  143. package/lib/aws/compute/index.d.ts +42 -0
  144. package/lib/aws/compute/index.js +64 -0
  145. package/lib/aws/compute/private/intrinstics.d.ts +86 -0
  146. package/lib/aws/compute/private/intrinstics.js +220 -0
  147. package/lib/aws/compute/private/json-path.d.ts +57 -0
  148. package/lib/aws/compute/private/json-path.js +351 -0
  149. package/lib/aws/compute/private/util.d.ts +1 -0
  150. package/lib/aws/compute/private/util.js +38 -0
  151. package/lib/aws/compute/state-graph.d.ts +100 -0
  152. package/lib/aws/compute/state-graph.js +177 -0
  153. package/lib/aws/compute/state-machine-fragment.d.ts +61 -0
  154. package/lib/aws/compute/state-machine-fragment.js +56 -0
  155. package/lib/aws/compute/state-machine.d.ts +323 -0
  156. package/lib/aws/compute/state-machine.js +392 -0
  157. package/lib/aws/compute/states/choice.d.ts +94 -0
  158. package/lib/aws/compute/states/choice.js +81 -0
  159. package/lib/aws/compute/states/custom-state.d.ts +55 -0
  160. package/lib/aws/compute/states/custom-state.js +114 -0
  161. package/lib/aws/compute/states/distributed-map/item-batcher.d.ts +64 -0
  162. package/lib/aws/compute/states/distributed-map/item-batcher.js +58 -0
  163. package/lib/aws/compute/states/distributed-map/item-reader.d.ts +256 -0
  164. package/lib/aws/compute/states/distributed-map/item-reader.js +253 -0
  165. package/lib/aws/compute/states/distributed-map/result-writer.d.ts +41 -0
  166. package/lib/aws/compute/states/distributed-map/result-writer.js +66 -0
  167. package/lib/aws/compute/states/distributed-map.d.ts +153 -0
  168. package/lib/aws/compute/states/distributed-map.js +207 -0
  169. package/lib/aws/compute/states/fail.d.ts +74 -0
  170. package/lib/aws/compute/states/fail.js +83 -0
  171. package/lib/aws/compute/states/map-base.d.ts +145 -0
  172. package/lib/aws/compute/states/map-base.js +109 -0
  173. package/lib/aws/compute/states/map.d.ts +76 -0
  174. package/lib/aws/compute/states/map.js +110 -0
  175. package/lib/aws/compute/states/parallel.d.ts +113 -0
  176. package/lib/aws/compute/states/parallel.js +100 -0
  177. package/lib/aws/compute/states/pass.d.ts +122 -0
  178. package/lib/aws/compute/states/pass.js +99 -0
  179. package/lib/aws/compute/states/private/state-type.d.ts +13 -0
  180. package/lib/aws/compute/states/private/state-type.js +19 -0
  181. package/lib/aws/compute/states/state.d.ts +276 -0
  182. package/lib/aws/compute/states/state.js +482 -0
  183. package/lib/aws/compute/states/succeed.d.ts +51 -0
  184. package/lib/aws/compute/states/succeed.js +32 -0
  185. package/lib/aws/compute/states/task-base.d.ts +225 -0
  186. package/lib/aws/compute/states/task-base.js +160 -0
  187. package/lib/aws/compute/states/task.d.ts +127 -0
  188. package/lib/aws/compute/states/task.js +92 -0
  189. package/lib/aws/compute/states/wait.d.ts +78 -0
  190. package/lib/aws/compute/states/wait.js +90 -0
  191. package/lib/aws/compute/step-functions-task.d.ts +78 -0
  192. package/lib/aws/compute/step-functions-task.js +27 -0
  193. package/lib/aws/compute/task-credentials.d.ts +45 -0
  194. package/lib/aws/compute/task-credentials.js +52 -0
  195. package/lib/aws/compute/task-input.d.ts +86 -0
  196. package/lib/aws/compute/task-input.js +107 -0
  197. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.d.ts +73 -0
  198. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +69 -0
  199. package/lib/aws/compute/tasks/eventbridge/put-events.d.ts +74 -0
  200. package/lib/aws/compute/tasks/eventbridge/put-events.js +94 -0
  201. package/lib/aws/compute/tasks/http/invoke.d.ts +104 -0
  202. package/lib/aws/compute/tasks/http/invoke.js +117 -0
  203. package/lib/aws/compute/tasks/index.d.ts +7 -0
  204. package/lib/aws/compute/tasks/index.js +42 -0
  205. package/lib/aws/compute/tasks/lambda/invoke.d.ts +106 -0
  206. package/lib/aws/compute/tasks/lambda/invoke.js +125 -0
  207. package/lib/aws/compute/tasks/private/task-utils.d.ts +8 -0
  208. package/lib/aws/compute/tasks/private/task-utils.js +36 -0
  209. package/lib/aws/compute/tasks/resource-arn-suffix.d.ts +3 -0
  210. package/lib/aws/compute/tasks/resource-arn-suffix.js +25 -0
  211. package/lib/aws/compute/tasks/sqs/send-message.d.ts +62 -0
  212. package/lib/aws/compute/tasks/sqs/send-message.js +70 -0
  213. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.d.ts +36 -0
  214. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +45 -0
  215. package/lib/aws/compute/tasks/stepfunctions/start-execution.d.ts +63 -0
  216. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +123 -0
  217. package/lib/aws/compute/types.d.ts +214 -0
  218. package/lib/aws/compute/types.js +103 -0
  219. package/lib/aws/compute/util.d.ts +12 -0
  220. package/lib/aws/compute/util.js +29 -0
  221. package/lib/aws/edge/certificate.d.ts +144 -0
  222. package/lib/aws/edge/certificate.js +191 -0
  223. package/lib/aws/edge/distribution.d.ts +505 -0
  224. package/lib/aws/edge/distribution.js +444 -0
  225. package/lib/aws/edge/dns-alias-record-targets.d.ts +29 -0
  226. package/lib/aws/edge/dns-alias-record-targets.js +46 -0
  227. package/lib/aws/edge/dns-record.d.ts +536 -0
  228. package/lib/aws/edge/dns-record.js +532 -0
  229. package/lib/aws/edge/dns-zone.d.ts +169 -0
  230. package/lib/aws/edge/dns-zone.js +149 -0
  231. package/lib/aws/edge/function.d.ts +185 -0
  232. package/lib/aws/edge/function.js +141 -0
  233. package/lib/aws/edge/index.d.ts +8 -0
  234. package/lib/aws/edge/index.js +25 -0
  235. package/lib/aws/edge/key-value-store.d.ts +162 -0
  236. package/lib/aws/edge/key-value-store.js +163 -0
  237. package/lib/aws/edge/origin.d.ts +160 -0
  238. package/lib/aws/edge/origin.js +245 -0
  239. package/lib/aws/encryption/alias.d.ts +137 -0
  240. package/lib/aws/encryption/alias.js +216 -0
  241. package/lib/aws/encryption/index.d.ts +4 -0
  242. package/lib/aws/encryption/index.js +21 -0
  243. package/lib/aws/encryption/key-lookup.d.ts +11 -0
  244. package/lib/aws/encryption/key-lookup.js +4 -0
  245. package/lib/aws/encryption/key.d.ts +461 -0
  246. package/lib/aws/encryption/key.js +586 -0
  247. package/lib/aws/encryption/private/perms.d.ts +5 -0
  248. package/lib/aws/encryption/private/perms.js +30 -0
  249. package/lib/aws/encryption/via-service-principal.d.ts +11 -0
  250. package/lib/aws/encryption/via-service-principal.js +39 -0
  251. package/lib/aws/iam/grant.d.ts +221 -0
  252. package/lib/aws/iam/grant.js +239 -0
  253. package/lib/aws/iam/identity-base.d.ts +20 -0
  254. package/lib/aws/iam/identity-base.js +3 -0
  255. package/lib/aws/iam/index.d.ts +16 -0
  256. package/lib/aws/iam/index.js +34 -0
  257. package/lib/aws/iam/managed-policy.d.ts +227 -0
  258. package/lib/aws/iam/managed-policy.js +237 -0
  259. package/lib/aws/iam/oidc-provider.d.ts +120 -0
  260. package/lib/aws/iam/oidc-provider.js +82 -0
  261. package/lib/aws/iam/policy-document-config.generated.d.ts +78 -0
  262. package/lib/aws/iam/policy-document-config.generated.js +3 -0
  263. package/lib/aws/iam/policy-document.d.ts +150 -0
  264. package/lib/aws/iam/policy-document.js +172 -0
  265. package/lib/aws/iam/policy-statement-props.generated.d.ts +55 -0
  266. package/lib/aws/iam/policy-statement-props.generated.js +3 -0
  267. package/lib/aws/iam/policy-statement.d.ts +451 -0
  268. package/lib/aws/iam/policy-statement.js +947 -0
  269. package/lib/aws/iam/policy.d.ts +122 -0
  270. package/lib/aws/iam/policy.js +192 -0
  271. package/lib/aws/iam/principals.d.ts +668 -0
  272. package/lib/aws/iam/principals.js +1032 -0
  273. package/lib/aws/iam/private/adapter.d.ts +21 -0
  274. package/lib/aws/iam/private/adapter.js +51 -0
  275. package/lib/aws/iam/private/assume-role-policy.d.ts +8 -0
  276. package/lib/aws/iam/private/assume-role-policy.js +27 -0
  277. package/lib/aws/iam/private/comparable-principal.d.ts +6 -0
  278. package/lib/aws/iam/private/comparable-principal.js +20 -0
  279. package/lib/aws/iam/private/immutable-role.d.ts +43 -0
  280. package/lib/aws/iam/private/immutable-role.js +76 -0
  281. package/lib/aws/iam/private/imported-role.d.ts +49 -0
  282. package/lib/aws/iam/private/imported-role.js +103 -0
  283. package/lib/aws/iam/private/merge-statements.d.ts +44 -0
  284. package/lib/aws/iam/private/merge-statements.js +214 -0
  285. package/lib/aws/iam/private/postprocess-policy-document.d.ts +15 -0
  286. package/lib/aws/iam/private/postprocess-policy-document.js +102 -0
  287. package/lib/aws/iam/private/util.d.ts +37 -0
  288. package/lib/aws/iam/private/util.js +87 -0
  289. package/lib/aws/iam/role.d.ts +425 -0
  290. package/lib/aws/iam/role.js +407 -0
  291. package/lib/aws/iam/saml-provider.d.ts +79 -0
  292. package/lib/aws/iam/saml-provider.js +79 -0
  293. package/lib/aws/iam/unknown-principal.d.ts +32 -0
  294. package/lib/aws/iam/unknown-principal.js +45 -0
  295. package/lib/aws/iam/utils.d.ts +12 -0
  296. package/lib/aws/iam/utils.js +41 -0
  297. package/lib/aws/index.d.ts +13 -0
  298. package/lib/aws/index.js +34 -0
  299. package/lib/aws/log-retention.d.ts +97 -0
  300. package/lib/aws/log-retention.js +103 -0
  301. package/lib/aws/network/index.d.ts +4 -0
  302. package/lib/aws/network/index.js +21 -0
  303. package/lib/aws/network/network.d.ts +77 -0
  304. package/lib/aws/network/network.js +3 -0
  305. package/lib/aws/network/simple-ipv4-vpc.d.ts +84 -0
  306. package/lib/aws/network/simple-ipv4-vpc.js +236 -0
  307. package/lib/aws/network/subnet-group.d.ts +42 -0
  308. package/lib/aws/network/subnet-group.js +72 -0
  309. package/lib/aws/network/subnet.d.ts +95 -0
  310. package/lib/aws/network/subnet.js +123 -0
  311. package/lib/aws/notify/archive.d.ts +77 -0
  312. package/lib/aws/notify/archive.js +62 -0
  313. package/lib/aws/notify/connection.d.ts +276 -0
  314. package/lib/aws/notify/connection.js +261 -0
  315. package/lib/aws/notify/event-bus.d.ts +298 -0
  316. package/lib/aws/notify/event-bus.js +326 -0
  317. package/lib/aws/notify/event-pattern.d.ts +220 -0
  318. package/lib/aws/notify/event-pattern.js +197 -0
  319. package/lib/aws/notify/index.d.ts +15 -0
  320. package/lib/aws/notify/index.js +35 -0
  321. package/lib/aws/notify/input.d.ts +126 -0
  322. package/lib/aws/notify/input.js +282 -0
  323. package/lib/aws/notify/kinesis-canned-metrics.generated.d.ts +68 -0
  324. package/lib/aws/notify/kinesis-canned-metrics.generated.js +103 -0
  325. package/lib/aws/notify/kinesis-fixed-canned-metrics.d.ts +195 -0
  326. package/lib/aws/notify/kinesis-fixed-canned-metrics.js +155 -0
  327. package/lib/aws/notify/kinesis-stream.d.ts +705 -0
  328. package/lib/aws/notify/kinesis-stream.js +541 -0
  329. package/lib/aws/notify/on-event-options.d.ts +54 -0
  330. package/lib/aws/notify/on-event-options.js +3 -0
  331. package/lib/aws/notify/queue-config.generated.d.ts +85 -0
  332. package/lib/aws/notify/queue-config.generated.js +3 -0
  333. package/lib/aws/notify/queue-policy.d.ts +35 -0
  334. package/lib/aws/notify/queue-policy.js +39 -0
  335. package/lib/aws/notify/queue.d.ts +355 -0
  336. package/lib/aws/notify/queue.js +305 -0
  337. package/lib/aws/notify/resource-policy.d.ts +41 -0
  338. package/lib/aws/notify/resource-policy.js +43 -0
  339. package/lib/aws/notify/rule.d.ts +153 -0
  340. package/lib/aws/notify/rule.js +227 -0
  341. package/lib/aws/notify/schedule.d.ts +83 -0
  342. package/lib/aws/notify/schedule.js +116 -0
  343. package/lib/aws/notify/target.d.ts +102 -0
  344. package/lib/aws/notify/target.js +3 -0
  345. package/lib/aws/notify/targets/event-bus.d.ts +39 -0
  346. package/lib/aws/notify/targets/event-bus.js +40 -0
  347. package/lib/aws/notify/targets/function.d.ts +31 -0
  348. package/lib/aws/notify/targets/function.js +36 -0
  349. package/lib/aws/notify/targets/index.d.ts +6 -0
  350. package/lib/aws/notify/targets/index.js +37 -0
  351. package/lib/aws/notify/targets/log-group.d.ts +89 -0
  352. package/lib/aws/notify/targets/log-group.js +110 -0
  353. package/lib/aws/notify/targets/sqs.d.ts +45 -0
  354. package/lib/aws/notify/targets/sqs.js +73 -0
  355. package/lib/aws/notify/targets/state-machine.d.ts +36 -0
  356. package/lib/aws/notify/targets/state-machine.js +39 -0
  357. package/lib/aws/notify/targets/util.d.ts +71 -0
  358. package/lib/aws/notify/targets/util.js +130 -0
  359. package/lib/aws/notify/util.d.ts +13 -0
  360. package/lib/aws/notify/util.js +69 -0
  361. package/lib/aws/provider-config.generated.d.ts +220 -0
  362. package/lib/aws/provider-config.generated.js +3 -0
  363. package/lib/aws/storage/bucket-destination.d.ts +41 -0
  364. package/lib/aws/storage/bucket-destination.js +13 -0
  365. package/lib/aws/storage/bucket-notifications.d.ts +58 -0
  366. package/lib/aws/storage/bucket-notifications.js +169 -0
  367. package/lib/aws/storage/bucket-perms.d.ts +9 -0
  368. package/lib/aws/storage/bucket-perms.js +33 -0
  369. package/lib/aws/storage/bucket-policy.d.ts +51 -0
  370. package/lib/aws/storage/bucket-policy.js +53 -0
  371. package/lib/aws/storage/bucket-source.d.ts +41 -0
  372. package/lib/aws/storage/bucket-source.js +79 -0
  373. package/lib/aws/storage/bucket.d.ts +941 -0
  374. package/lib/aws/storage/bucket.js +869 -0
  375. package/lib/aws/storage/cors-config.generated.d.ts +57 -0
  376. package/lib/aws/storage/cors-config.generated.js +3 -0
  377. package/lib/aws/storage/cors-rule-config.generated.d.ts +38 -0
  378. package/lib/aws/storage/cors-rule-config.generated.js +3 -0
  379. package/lib/aws/storage/index.d.ts +12 -0
  380. package/lib/aws/storage/index.js +31 -0
  381. package/lib/aws/storage/lifecycle-config.generated.d.ts +55 -0
  382. package/lib/aws/storage/lifecycle-config.generated.js +3 -0
  383. package/lib/aws/storage/notification-targets/function.d.ts +11 -0
  384. package/lib/aws/storage/notification-targets/function.js +48 -0
  385. package/lib/aws/storage/notification-targets/index.d.ts +2 -0
  386. package/lib/aws/storage/notification-targets/index.js +21 -0
  387. package/lib/aws/storage/notification-targets/queue.d.ts +15 -0
  388. package/lib/aws/storage/notification-targets/queue.js +58 -0
  389. package/lib/aws/storage/origin-access-identity.d.ts +91 -0
  390. package/lib/aws/storage/origin-access-identity.js +76 -0
  391. package/lib/aws/storage/util.d.ts +40 -0
  392. package/lib/aws/storage/util.js +85 -0
  393. package/lib/aws/storage/website-config.generated.d.ts +73 -0
  394. package/lib/aws/storage/website-config.generated.js +3 -0
  395. package/lib/aws/util.d.ts +4 -0
  396. package/lib/aws/util.js +25 -0
  397. package/lib/construct-base.d.ts +69 -0
  398. package/lib/construct-base.js +89 -0
  399. package/lib/duration.d.ts +160 -0
  400. package/lib/duration.js +327 -0
  401. package/lib/index.d.ts +5 -0
  402. package/lib/index.js +24 -0
  403. package/lib/private/index.d.ts +2 -0
  404. package/lib/private/index.js +19 -0
  405. package/lib/private/terraform-dependables-aspect.d.ts +20 -0
  406. package/lib/private/terraform-dependables-aspect.js +95 -0
  407. package/lib/private/unique-resource-name.d.ts +9 -0
  408. package/lib/private/unique-resource-name.js +145 -0
  409. package/lib/size.d.ts +146 -0
  410. package/lib/size.js +220 -0
  411. package/lib/stack-base.d.ts +188 -0
  412. package/lib/stack-base.js +183 -0
  413. package/lib/token.d.ts +32 -0
  414. package/lib/token.js +54 -0
  415. package/node_modules/camel-case/LICENSE +21 -0
  416. package/node_modules/camel-case/README.md +47 -0
  417. package/node_modules/camel-case/dist/index.d.ts +5 -0
  418. package/node_modules/camel-case/dist/index.js +23 -0
  419. package/node_modules/camel-case/dist/index.js.map +1 -0
  420. package/node_modules/camel-case/dist/index.spec.d.ts +1 -0
  421. package/node_modules/camel-case/dist/index.spec.js +26 -0
  422. package/node_modules/camel-case/dist/index.spec.js.map +1 -0
  423. package/node_modules/camel-case/dist.es2015/index.d.ts +5 -0
  424. package/node_modules/camel-case/dist.es2015/index.js +17 -0
  425. package/node_modules/camel-case/dist.es2015/index.js.map +1 -0
  426. package/node_modules/camel-case/dist.es2015/index.spec.d.ts +1 -0
  427. package/node_modules/camel-case/dist.es2015/index.spec.js +24 -0
  428. package/node_modules/camel-case/dist.es2015/index.spec.js.map +1 -0
  429. package/node_modules/camel-case/package.json +89 -0
  430. package/node_modules/capital-case/LICENSE +21 -0
  431. package/node_modules/capital-case/README.md +37 -0
  432. package/node_modules/capital-case/dist/index.d.ts +4 -0
  433. package/node_modules/capital-case/dist/index.js +16 -0
  434. package/node_modules/capital-case/dist/index.js.map +1 -0
  435. package/node_modules/capital-case/dist/index.spec.d.ts +1 -0
  436. package/node_modules/capital-case/dist/index.spec.js +24 -0
  437. package/node_modules/capital-case/dist/index.spec.js.map +1 -0
  438. package/node_modules/capital-case/dist.es2015/index.d.ts +4 -0
  439. package/node_modules/capital-case/dist.es2015/index.js +11 -0
  440. package/node_modules/capital-case/dist.es2015/index.js.map +1 -0
  441. package/node_modules/capital-case/dist.es2015/index.spec.d.ts +1 -0
  442. package/node_modules/capital-case/dist.es2015/index.spec.js +22 -0
  443. package/node_modules/capital-case/dist.es2015/index.spec.js.map +1 -0
  444. package/node_modules/capital-case/package.json +90 -0
  445. package/node_modules/change-case/LICENSE +21 -0
  446. package/node_modules/change-case/README.md +44 -0
  447. package/node_modules/change-case/dist/index.d.ts +11 -0
  448. package/node_modules/change-case/dist/index.js +15 -0
  449. package/node_modules/change-case/dist/index.js.map +1 -0
  450. package/node_modules/change-case/dist/index.spec.d.ts +1 -0
  451. package/node_modules/change-case/dist/index.spec.js +9 -0
  452. package/node_modules/change-case/dist/index.spec.js.map +1 -0
  453. package/node_modules/change-case/dist.es2015/index.d.ts +11 -0
  454. package/node_modules/change-case/dist.es2015/index.js +12 -0
  455. package/node_modules/change-case/dist.es2015/index.js.map +1 -0
  456. package/node_modules/change-case/dist.es2015/index.spec.d.ts +1 -0
  457. package/node_modules/change-case/dist.es2015/index.spec.js +7 -0
  458. package/node_modules/change-case/dist.es2015/index.spec.js.map +1 -0
  459. package/node_modules/change-case/package.json +101 -0
  460. package/node_modules/constant-case/LICENSE +21 -0
  461. package/node_modules/constant-case/README.md +37 -0
  462. package/node_modules/constant-case/dist/index.d.ts +3 -0
  463. package/node_modules/constant-case/dist/index.js +12 -0
  464. package/node_modules/constant-case/dist/index.js.map +1 -0
  465. package/node_modules/constant-case/dist/index.spec.d.ts +1 -0
  466. package/node_modules/constant-case/dist/index.spec.js +26 -0
  467. package/node_modules/constant-case/dist/index.spec.js.map +1 -0
  468. package/node_modules/constant-case/dist.es2015/index.d.ts +3 -0
  469. package/node_modules/constant-case/dist.es2015/index.js +8 -0
  470. package/node_modules/constant-case/dist.es2015/index.js.map +1 -0
  471. package/node_modules/constant-case/dist.es2015/index.spec.d.ts +1 -0
  472. package/node_modules/constant-case/dist.es2015/index.spec.js +24 -0
  473. package/node_modules/constant-case/dist.es2015/index.spec.js.map +1 -0
  474. package/node_modules/constant-case/package.json +90 -0
  475. package/node_modules/dot-case/LICENSE +21 -0
  476. package/node_modules/dot-case/README.md +37 -0
  477. package/node_modules/dot-case/dist/index.d.ts +3 -0
  478. package/node_modules/dot-case/dist/index.js +11 -0
  479. package/node_modules/dot-case/dist/index.js.map +1 -0
  480. package/node_modules/dot-case/dist/index.spec.d.ts +1 -0
  481. package/node_modules/dot-case/dist/index.spec.js +26 -0
  482. package/node_modules/dot-case/dist/index.spec.js.map +1 -0
  483. package/node_modules/dot-case/dist.es2015/index.d.ts +3 -0
  484. package/node_modules/dot-case/dist.es2015/index.js +7 -0
  485. package/node_modules/dot-case/dist.es2015/index.js.map +1 -0
  486. package/node_modules/dot-case/dist.es2015/index.spec.d.ts +1 -0
  487. package/node_modules/dot-case/dist.es2015/index.spec.js +24 -0
  488. package/node_modules/dot-case/dist.es2015/index.spec.js.map +1 -0
  489. package/node_modules/dot-case/package.json +89 -0
  490. package/node_modules/esbuild-wasm/LICENSE.md +21 -0
  491. package/node_modules/esbuild-wasm/README.md +3 -0
  492. package/node_modules/esbuild-wasm/bin/esbuild +91 -0
  493. package/node_modules/esbuild-wasm/esbuild.wasm +0 -0
  494. package/node_modules/esbuild-wasm/esm/browser.d.ts +705 -0
  495. package/node_modules/esbuild-wasm/esm/browser.js +2370 -0
  496. package/node_modules/esbuild-wasm/esm/browser.min.js +20 -0
  497. package/node_modules/esbuild-wasm/lib/browser.d.ts +705 -0
  498. package/node_modules/esbuild-wasm/lib/browser.js +2415 -0
  499. package/node_modules/esbuild-wasm/lib/browser.min.js +22 -0
  500. package/node_modules/esbuild-wasm/lib/main.d.ts +705 -0
  501. package/node_modules/esbuild-wasm/lib/main.js +2051 -0
  502. package/node_modules/esbuild-wasm/package.json +19 -0
  503. package/node_modules/esbuild-wasm/wasm_exec.js +561 -0
  504. package/node_modules/esbuild-wasm/wasm_exec_node.js +39 -0
  505. package/node_modules/header-case/LICENSE +21 -0
  506. package/node_modules/header-case/README.md +37 -0
  507. package/node_modules/header-case/dist/index.d.ts +3 -0
  508. package/node_modules/header-case/dist/index.js +11 -0
  509. package/node_modules/header-case/dist/index.js.map +1 -0
  510. package/node_modules/header-case/dist/index.spec.d.ts +1 -0
  511. package/node_modules/header-case/dist/index.spec.js +24 -0
  512. package/node_modules/header-case/dist/index.spec.js.map +1 -0
  513. package/node_modules/header-case/dist.es2015/index.d.ts +3 -0
  514. package/node_modules/header-case/dist.es2015/index.js +7 -0
  515. package/node_modules/header-case/dist.es2015/index.js.map +1 -0
  516. package/node_modules/header-case/dist.es2015/index.spec.d.ts +1 -0
  517. package/node_modules/header-case/dist.es2015/index.spec.js +22 -0
  518. package/node_modules/header-case/dist.es2015/index.spec.js.map +1 -0
  519. package/node_modules/header-case/package.json +89 -0
  520. package/node_modules/lower-case/LICENSE +21 -0
  521. package/node_modules/lower-case/README.md +35 -0
  522. package/node_modules/lower-case/dist/index.d.ts +8 -0
  523. package/node_modules/lower-case/dist/index.js +53 -0
  524. package/node_modules/lower-case/dist/index.js.map +1 -0
  525. package/node_modules/lower-case/dist/index.spec.d.ts +1 -0
  526. package/node_modules/lower-case/dist/index.spec.js +36 -0
  527. package/node_modules/lower-case/dist/index.spec.js.map +1 -0
  528. package/node_modules/lower-case/dist.es2015/index.d.ts +8 -0
  529. package/node_modules/lower-case/dist.es2015/index.js +48 -0
  530. package/node_modules/lower-case/dist.es2015/index.js.map +1 -0
  531. package/node_modules/lower-case/dist.es2015/index.spec.d.ts +1 -0
  532. package/node_modules/lower-case/dist.es2015/index.spec.js +34 -0
  533. package/node_modules/lower-case/dist.es2015/index.spec.js.map +1 -0
  534. package/node_modules/lower-case/package.json +87 -0
  535. package/node_modules/mime-db/HISTORY.md +507 -0
  536. package/node_modules/mime-db/LICENSE +23 -0
  537. package/node_modules/mime-db/README.md +100 -0
  538. package/node_modules/mime-db/db.json +8519 -0
  539. package/node_modules/mime-db/index.js +12 -0
  540. package/node_modules/mime-db/package.json +60 -0
  541. package/node_modules/mime-types/HISTORY.md +397 -0
  542. package/node_modules/mime-types/LICENSE +23 -0
  543. package/node_modules/mime-types/README.md +113 -0
  544. package/node_modules/mime-types/index.js +188 -0
  545. package/node_modules/mime-types/package.json +44 -0
  546. package/node_modules/no-case/LICENSE +21 -0
  547. package/node_modules/no-case/README.md +37 -0
  548. package/node_modules/no-case/dist/index.d.ts +10 -0
  549. package/node_modules/no-case/dist/index.js +35 -0
  550. package/node_modules/no-case/dist/index.js.map +1 -0
  551. package/node_modules/no-case/dist/index.spec.d.ts +1 -0
  552. package/node_modules/no-case/dist/index.spec.js +59 -0
  553. package/node_modules/no-case/dist/index.spec.js.map +1 -0
  554. package/node_modules/no-case/dist.es2015/index.d.ts +10 -0
  555. package/node_modules/no-case/dist.es2015/index.js +31 -0
  556. package/node_modules/no-case/dist.es2015/index.js.map +1 -0
  557. package/node_modules/no-case/dist.es2015/index.spec.d.ts +1 -0
  558. package/node_modules/no-case/dist.es2015/index.spec.js +57 -0
  559. package/node_modules/no-case/dist.es2015/index.spec.js.map +1 -0
  560. package/node_modules/no-case/package.json +85 -0
  561. package/node_modules/param-case/LICENSE +21 -0
  562. package/node_modules/param-case/README.md +37 -0
  563. package/node_modules/param-case/dist/index.d.ts +3 -0
  564. package/node_modules/param-case/dist/index.js +11 -0
  565. package/node_modules/param-case/dist/index.js.map +1 -0
  566. package/node_modules/param-case/dist/index.spec.d.ts +1 -0
  567. package/node_modules/param-case/dist/index.spec.js +24 -0
  568. package/node_modules/param-case/dist/index.spec.js.map +1 -0
  569. package/node_modules/param-case/dist.es2015/index.d.ts +3 -0
  570. package/node_modules/param-case/dist.es2015/index.js +7 -0
  571. package/node_modules/param-case/dist.es2015/index.js.map +1 -0
  572. package/node_modules/param-case/dist.es2015/index.spec.d.ts +1 -0
  573. package/node_modules/param-case/dist.es2015/index.spec.js +22 -0
  574. package/node_modules/param-case/dist.es2015/index.spec.js.map +1 -0
  575. package/node_modules/param-case/package.json +91 -0
  576. package/node_modules/pascal-case/LICENSE +21 -0
  577. package/node_modules/pascal-case/README.md +47 -0
  578. package/node_modules/pascal-case/dist/index.d.ts +5 -0
  579. package/node_modules/pascal-case/dist/index.js +24 -0
  580. package/node_modules/pascal-case/dist/index.js.map +1 -0
  581. package/node_modules/pascal-case/dist/index.spec.d.ts +1 -0
  582. package/node_modules/pascal-case/dist/index.spec.js +25 -0
  583. package/node_modules/pascal-case/dist/index.spec.js.map +1 -0
  584. package/node_modules/pascal-case/dist.es2015/index.d.ts +5 -0
  585. package/node_modules/pascal-case/dist.es2015/index.js +18 -0
  586. package/node_modules/pascal-case/dist.es2015/index.js.map +1 -0
  587. package/node_modules/pascal-case/dist.es2015/index.spec.d.ts +1 -0
  588. package/node_modules/pascal-case/dist.es2015/index.spec.js +23 -0
  589. package/node_modules/pascal-case/dist.es2015/index.spec.js.map +1 -0
  590. package/node_modules/pascal-case/package.json +90 -0
  591. package/node_modules/path-case/LICENSE +21 -0
  592. package/node_modules/path-case/README.md +37 -0
  593. package/node_modules/path-case/dist/index.d.ts +3 -0
  594. package/node_modules/path-case/dist/index.js +11 -0
  595. package/node_modules/path-case/dist/index.js.map +1 -0
  596. package/node_modules/path-case/dist/index.spec.d.ts +1 -0
  597. package/node_modules/path-case/dist/index.spec.js +24 -0
  598. package/node_modules/path-case/dist/index.spec.js.map +1 -0
  599. package/node_modules/path-case/dist.es2015/index.d.ts +3 -0
  600. package/node_modules/path-case/dist.es2015/index.js +7 -0
  601. package/node_modules/path-case/dist.es2015/index.js.map +1 -0
  602. package/node_modules/path-case/dist.es2015/index.spec.d.ts +1 -0
  603. package/node_modules/path-case/dist.es2015/index.spec.js +22 -0
  604. package/node_modules/path-case/dist.es2015/index.spec.js.map +1 -0
  605. package/node_modules/path-case/package.json +88 -0
  606. package/node_modules/sentence-case/LICENSE +21 -0
  607. package/node_modules/sentence-case/README.md +37 -0
  608. package/node_modules/sentence-case/dist/index.d.ts +4 -0
  609. package/node_modules/sentence-case/dist/index.js +19 -0
  610. package/node_modules/sentence-case/dist/index.js.map +1 -0
  611. package/node_modules/sentence-case/dist/index.spec.d.ts +1 -0
  612. package/node_modules/sentence-case/dist/index.spec.js +24 -0
  613. package/node_modules/sentence-case/dist/index.spec.js.map +1 -0
  614. package/node_modules/sentence-case/dist.es2015/index.d.ts +4 -0
  615. package/node_modules/sentence-case/dist.es2015/index.js +14 -0
  616. package/node_modules/sentence-case/dist.es2015/index.js.map +1 -0
  617. package/node_modules/sentence-case/dist.es2015/index.spec.d.ts +1 -0
  618. package/node_modules/sentence-case/dist.es2015/index.spec.js +22 -0
  619. package/node_modules/sentence-case/dist.es2015/index.spec.js.map +1 -0
  620. package/node_modules/sentence-case/package.json +89 -0
  621. package/node_modules/snake-case/LICENSE +21 -0
  622. package/node_modules/snake-case/README.md +37 -0
  623. package/node_modules/snake-case/dist/index.d.ts +3 -0
  624. package/node_modules/snake-case/dist/index.js +11 -0
  625. package/node_modules/snake-case/dist/index.js.map +1 -0
  626. package/node_modules/snake-case/dist/index.spec.d.ts +1 -0
  627. package/node_modules/snake-case/dist/index.spec.js +25 -0
  628. package/node_modules/snake-case/dist/index.spec.js.map +1 -0
  629. package/node_modules/snake-case/dist.es2015/index.d.ts +3 -0
  630. package/node_modules/snake-case/dist.es2015/index.js +7 -0
  631. package/node_modules/snake-case/dist.es2015/index.js.map +1 -0
  632. package/node_modules/snake-case/dist.es2015/index.spec.d.ts +1 -0
  633. package/node_modules/snake-case/dist.es2015/index.spec.js +23 -0
  634. package/node_modules/snake-case/dist.es2015/index.spec.js.map +1 -0
  635. package/node_modules/snake-case/package.json +90 -0
  636. package/node_modules/tslib/CopyrightNotice.txt +15 -0
  637. package/node_modules/tslib/LICENSE.txt +12 -0
  638. package/node_modules/tslib/README.md +164 -0
  639. package/node_modules/tslib/SECURITY.md +41 -0
  640. package/node_modules/tslib/modules/index.d.ts +37 -0
  641. package/node_modules/tslib/modules/index.js +68 -0
  642. package/node_modules/tslib/modules/package.json +3 -0
  643. package/node_modules/tslib/package.json +47 -0
  644. package/node_modules/tslib/tslib.d.ts +453 -0
  645. package/node_modules/tslib/tslib.es6.html +1 -0
  646. package/node_modules/tslib/tslib.es6.js +374 -0
  647. package/node_modules/tslib/tslib.es6.mjs +373 -0
  648. package/node_modules/tslib/tslib.html +1 -0
  649. package/node_modules/tslib/tslib.js +424 -0
  650. package/node_modules/upper-case/README.md +34 -0
  651. package/node_modules/upper-case/dist/index.d.ts +8 -0
  652. package/node_modules/upper-case/dist/index.js +49 -0
  653. package/node_modules/upper-case/dist/index.js.map +1 -0
  654. package/node_modules/upper-case/dist/index.spec.d.ts +1 -0
  655. package/node_modules/upper-case/dist/index.spec.js +34 -0
  656. package/node_modules/upper-case/dist/index.spec.js.map +1 -0
  657. package/node_modules/upper-case/dist.es2015/index.d.ts +8 -0
  658. package/node_modules/upper-case/dist.es2015/index.js +44 -0
  659. package/node_modules/upper-case/dist.es2015/index.js.map +1 -0
  660. package/node_modules/upper-case/dist.es2015/index.spec.d.ts +1 -0
  661. package/node_modules/upper-case/dist.es2015/index.spec.js +32 -0
  662. package/node_modules/upper-case/dist.es2015/index.spec.js.map +1 -0
  663. package/node_modules/upper-case/package.json +86 -0
  664. package/node_modules/upper-case-first/LICENSE +21 -0
  665. package/node_modules/upper-case-first/README.md +32 -0
  666. package/node_modules/upper-case-first/dist/index.d.ts +4 -0
  667. package/node_modules/upper-case-first/dist/index.js +11 -0
  668. package/node_modules/upper-case-first/dist/index.js.map +1 -0
  669. package/node_modules/upper-case-first/dist/index.spec.d.ts +1 -0
  670. package/node_modules/upper-case-first/dist/index.spec.js +20 -0
  671. package/node_modules/upper-case-first/dist/index.spec.js.map +1 -0
  672. package/node_modules/upper-case-first/dist.es2015/index.d.ts +4 -0
  673. package/node_modules/upper-case-first/dist.es2015/index.js +7 -0
  674. package/node_modules/upper-case-first/dist.es2015/index.js.map +1 -0
  675. package/node_modules/upper-case-first/dist.es2015/index.spec.d.ts +1 -0
  676. package/node_modules/upper-case-first/dist.es2015/index.spec.js +18 -0
  677. package/node_modules/upper-case-first/dist.es2015/index.spec.js.map +1 -0
  678. package/node_modules/upper-case-first/package.json +87 -0
  679. package/package.json +152 -0
  680. package/setup.js +2 -0
@@ -0,0 +1,1032 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.mergePrincipal = exports.defaultAddPrincipalToAssumeRole = exports.SessionTagsPrincipal = exports.PrincipalWithConditions = exports.ComparablePrincipal = exports.CompositePrincipal = exports.StarPrincipal = exports.Anyone = exports.AnyPrincipal = exports.AccountRootPrincipal = exports.SamlConsolePrincipal = exports.SamlPrincipal = exports.OpenIdConnectPrincipal = exports.WebIdentityPrincipal = exports.FederatedPrincipal = exports.CanonicalUserPrincipal = exports.OrganizationPrincipal = exports.ServicePrincipal = exports.AccountPrincipal = exports.ArnPrincipal = exports.PrincipalBase = exports.toPrincipalJson = exports.fromPrincipalJson = exports.PrincipalPolicyFragment = exports.PrincipalType = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const cdktf_1 = require("cdktf");
7
+ const aws_stack_1 = require("../aws-stack");
8
+ const policy_statement_1 = require("./policy-statement");
9
+ var PrincipalType;
10
+ (function (PrincipalType) {
11
+ PrincipalType["AWS"] = "AWS";
12
+ PrincipalType["FEDERATED"] = "Federated";
13
+ PrincipalType["SERVICE"] = "Service";
14
+ PrincipalType["CANONICALUSER"] = "CanonicalUser";
15
+ PrincipalType["ANY"] = "*";
16
+ })(PrincipalType || (exports.PrincipalType = PrincipalType = {}));
17
+ function isValidPrincipalType(value) {
18
+ const upperCaseValue = value.toUpperCase();
19
+ return upperCaseValue in PrincipalType;
20
+ }
21
+ /**
22
+ * A collection of the fields in a PolicyStatement that can be used to identify a principal.
23
+ *
24
+ * This consists of the Terraform PrincipalProps representing the
25
+ * `principals` block(s) in a policy statement.
26
+ *
27
+ * Generally, AWS principal JSON looks like:
28
+ *
29
+ * { '<TYPE>': ['ID', 'ID', ...] }
30
+ *
31
+ * And this is also the type of the field `principalJson`.
32
+ *
33
+ * However, there is a special type of principal that is just the string '*',
34
+ * which is treated differently by some services.
35
+ *
36
+ * To represent that principal, `principalJson` should contain `*`.
37
+ * To represent that principal in Terraform principals block(s), the
38
+ * type should be `PrincipalType.ANY` and the identifiers should be `['*']`.
39
+ */
40
+ class PrincipalPolicyFragment {
41
+ /**
42
+ * Parses a JSON object with the AWS IAM Principal structure
43
+ *
44
+ * Refer to the `fromPrincipalJson` and `fromConditionJson` functions for more information
45
+ */
46
+ static fromJson(principalJson, conditionsJson = {}) {
47
+ return new PrincipalPolicyFragment(fromPrincipalJson(principalJson), (0, policy_statement_1.fromConditionJson)(conditionsJson));
48
+ }
49
+ // TODO: Should this actually be used anywhere?
50
+ get principalJson() {
51
+ return toPrincipalJson(...this.principals);
52
+ }
53
+ get conditionsJson() {
54
+ return (0, policy_statement_1.toConditionJson)(...this.conditions);
55
+ }
56
+ /**
57
+ *
58
+ * @param principals Array of "principals" block in a policy statement
59
+ * @param conditions conditions that need to be applied to this policy
60
+ */
61
+ constructor(principals,
62
+ /**
63
+ * The conditions under which the policy is in effect.
64
+ * See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
65
+ */
66
+ conditions = []) {
67
+ this.principals = principals;
68
+ this.conditions = conditions;
69
+ }
70
+ }
71
+ exports.PrincipalPolicyFragment = PrincipalPolicyFragment;
72
+ _a = JSII_RTTI_SYMBOL_1;
73
+ PrincipalPolicyFragment[_a] = { fqn: "terraconstructs.aws.iam.PrincipalPolicyFragment", version: "0.0.8" };
74
+ /**
75
+ * Read from AWS Principal JSON to Terraform principals block(s)
76
+ *
77
+ * Handles special case: if principal is "*" and turns it into the `StarPrincipal`,
78
+ *
79
+ * Even though the IAM Documentation states that "Principal": "*" and "Principal": {"AWS": "*"} are equivalent,
80
+ * those principal elements have different behavior in some situations, e.g., IAM Role Trust Policy.
81
+ *
82
+ * To have Terraform render JSON containing "Principal": "*", use type = "*" and identifiers = ["*"].
83
+ * To have Terraform render JSON containing "Principal": {"AWS": "*"}, use type = "AWS" and identifiers = ["*"].
84
+ */
85
+ function fromPrincipalJson(principalJson = {}) {
86
+ if (typeof principalJson === "string") {
87
+ if (principalJson === "*") {
88
+ return [{ type: PrincipalType.ANY, identifiers: ["*"] }];
89
+ }
90
+ else {
91
+ // TODO: Should this handle other scenarios (i.e. Tokens?)
92
+ throw new Error(`Invalid principal type: ${principalJson}`);
93
+ }
94
+ }
95
+ if (typeof principalJson !== "object") {
96
+ throw new Error(`JSON IAM principal should be an object, got ${JSON.stringify(principalJson)}`);
97
+ }
98
+ const result = new Array();
99
+ for (const [key, identifiers] of Object.entries(principalJson)) {
100
+ if (!isValidPrincipalType(key)) {
101
+ throw new Error(`Invalid principal type: ${key}, valid values are: ${Object.values(PrincipalType)}`);
102
+ }
103
+ result.push({
104
+ identifiers: Array.isArray(identifiers) ? identifiers : [identifiers],
105
+ type: key,
106
+ });
107
+ }
108
+ return result;
109
+ }
110
+ exports.fromPrincipalJson = fromPrincipalJson;
111
+ /**
112
+ * Convert Terraform principals blocks back to AWS Principal JSON
113
+ */
114
+ function toPrincipalJson(...principalProps) {
115
+ if (principalProps.length === 1 &&
116
+ principalProps[0].type === PrincipalType.ANY &&
117
+ principalProps[0].identifiers.length === 1 &&
118
+ principalProps[0].identifiers[0] === "*")
119
+ return "*";
120
+ const result = {};
121
+ for (const principal of principalProps) {
122
+ result[principal.type] =
123
+ principal.identifiers.length === 1
124
+ ? principal.identifiers[0]
125
+ : principal.identifiers;
126
+ }
127
+ return result;
128
+ }
129
+ exports.toPrincipalJson = toPrincipalJson;
130
+ /**
131
+ * Base class for policy principals
132
+ */
133
+ class PrincipalBase {
134
+ constructor() {
135
+ this.grantPrincipal = this;
136
+ this.principalAccount = undefined;
137
+ /**
138
+ * When this Principal is used in an AssumeRole policy, the action to use.
139
+ */
140
+ this.assumeRoleAction = "sts:AssumeRole";
141
+ }
142
+ addToPolicy(statement) {
143
+ return this.addToPrincipalPolicy(statement).statementAdded;
144
+ }
145
+ addToPrincipalPolicy(_statement) {
146
+ // This base class is used for non-identity principals. None of them
147
+ // have a PolicyDocument to add to.
148
+ return { statementAdded: false };
149
+ }
150
+ addToAssumeRolePolicy(document) {
151
+ // Default implementation of this protocol
152
+ document.addStatements(new policy_statement_1.PolicyStatement({
153
+ actions: [this.assumeRoleAction],
154
+ principals: [this],
155
+ }));
156
+ }
157
+ toString() {
158
+ // This is a first pass to make the object readable. Descendant principals
159
+ // should return something nicer.
160
+ return JSON.stringify(this.policyFragment.principalJson);
161
+ }
162
+ /**
163
+ * JSON-ify the principal
164
+ *
165
+ * Used when JSON.stringify() is called
166
+ */
167
+ toJSON() {
168
+ // Have to implement toJSON() because the default will lead to infinite recursion.
169
+ return this.policyFragment.principalJson;
170
+ }
171
+ /**
172
+ * Returns a new PrincipalWithConditions using this principal as the base, with the
173
+ * passed conditions added.
174
+ *
175
+ * When there is a value for the same operator and key in both the principal and the
176
+ * conditions parameter, the value from the conditions parameter will be used.
177
+ *
178
+ * @returns a new PrincipalWithConditions object.
179
+ */
180
+ withConditions(...conditions) {
181
+ return new PrincipalWithConditions(this, conditions);
182
+ }
183
+ /**
184
+ * Returns a new principal using this principal as the base, with session tags enabled.
185
+ *
186
+ * @returns a new SessionTagsPrincipal object.
187
+ */
188
+ withSessionTags() {
189
+ return new SessionTagsPrincipal(this);
190
+ }
191
+ }
192
+ exports.PrincipalBase = PrincipalBase;
193
+ _b = JSII_RTTI_SYMBOL_1;
194
+ PrincipalBase[_b] = { fqn: "terraconstructs.aws.iam.PrincipalBase", version: "0.0.8" };
195
+ /**
196
+ * Specify a principal by the Amazon Resource Name (ARN).
197
+ * You can specify AWS accounts, IAM users, Federated SAML users, IAM roles, and specific assumed-role sessions.
198
+ * You cannot specify IAM groups or instance profiles as principals
199
+ *
200
+ * @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html
201
+ */
202
+ class ArnPrincipal extends PrincipalBase {
203
+ /**
204
+ *
205
+ * @param arn Amazon Resource Name (ARN) of the principal entity (i.e. arn:aws:iam::123456789012:user/user-name)
206
+ */
207
+ constructor(arn) {
208
+ super();
209
+ this.arn = arn;
210
+ }
211
+ get policyFragment() {
212
+ return new PrincipalPolicyFragment([
213
+ {
214
+ type: PrincipalType.AWS,
215
+ identifiers: [this.arn],
216
+ },
217
+ ]);
218
+ }
219
+ toString() {
220
+ return `ArnPrincipal(${this.arn})`;
221
+ }
222
+ /**
223
+ * A convenience method for adding a condition that the principal is part of the specified
224
+ * AWS Organization.
225
+ */
226
+ inOrganization(organizationId) {
227
+ return this.withConditions({
228
+ test: "StringEquals",
229
+ variable: "aws:PrincipalOrgID",
230
+ values: [organizationId],
231
+ });
232
+ }
233
+ dedupeString() {
234
+ return `ArnPrincipal:${this.arn}`;
235
+ }
236
+ }
237
+ exports.ArnPrincipal = ArnPrincipal;
238
+ _c = JSII_RTTI_SYMBOL_1;
239
+ ArnPrincipal[_c] = { fqn: "terraconstructs.aws.iam.ArnPrincipal", version: "0.0.8" };
240
+ /**
241
+ * Specify AWS account ID as the principal entity in a policy to delegate authority to the account.
242
+ */
243
+ class AccountPrincipal extends ArnPrincipal {
244
+ /**
245
+ *
246
+ * @param accountId AWS account ID (i.e. '123456789012')
247
+ */
248
+ constructor(accountId) {
249
+ super(new AwsStackDependentToken((awsStack) => `arn:${awsStack.partition}:iam::${accountId}:root`).toString());
250
+ this.accountId = accountId;
251
+ if (!cdktf_1.Token.isUnresolved(accountId) && typeof accountId !== "string") {
252
+ throw new Error("accountId should be of type string");
253
+ }
254
+ this.principalAccount = accountId;
255
+ }
256
+ toString() {
257
+ return `AccountPrincipal(${this.accountId})`;
258
+ }
259
+ }
260
+ exports.AccountPrincipal = AccountPrincipal;
261
+ _d = JSII_RTTI_SYMBOL_1;
262
+ AccountPrincipal[_d] = { fqn: "terraconstructs.aws.iam.AccountPrincipal", version: "0.0.8" };
263
+ /**
264
+ * An IAM principal that represents an AWS service (i.e. `sqs.amazonaws.com`).
265
+ */
266
+ class ServicePrincipal extends PrincipalBase {
267
+ /**
268
+ * Return the service principal name based on the region it's used in.
269
+ *
270
+ * Some service principal names used to be different for different partitions,
271
+ * and some were not.
272
+ *
273
+ * These days all service principal names are standardized, and they are all
274
+ * of the form `<servicename>.amazonaws.com`.
275
+ *
276
+ * To avoid breaking changes, handling is provided for services added with the formats below,
277
+ * however, no additional handling will be added for new regions or partitions.
278
+ * - s3
279
+ * - s3.amazonaws.com
280
+ * - s3.amazonaws.com.cn
281
+ * - s3.c2s.ic.gov
282
+ * - s3.sc2s.sgov.gov
283
+ *
284
+ * @example
285
+ * const principalName = iam.ServicePrincipal.servicePrincipalName('ec2');
286
+ */
287
+ static servicePrincipalName(service) {
288
+ return new ServicePrincipalToken(service, {}).toString();
289
+ }
290
+ /**
291
+ * Reference an AWS service, optionally in a given region
292
+ *
293
+ * @param service AWS service (i.e. sqs.amazonaws.com)
294
+ */
295
+ constructor(service, opts = {}) {
296
+ super();
297
+ this.service = service;
298
+ this.opts = opts;
299
+ }
300
+ get policyFragment() {
301
+ return new PrincipalPolicyFragment([
302
+ {
303
+ type: PrincipalType.SERVICE,
304
+ identifiers: [
305
+ new ServicePrincipalToken(this.service, this.opts).toString(),
306
+ ],
307
+ },
308
+ ], this.opts.conditions);
309
+ }
310
+ toString() {
311
+ return `ServicePrincipal(${this.service})`;
312
+ }
313
+ dedupeString() {
314
+ return `ServicePrincipal:${this.service}:${JSON.stringify(this.opts)}`;
315
+ }
316
+ }
317
+ exports.ServicePrincipal = ServicePrincipal;
318
+ _e = JSII_RTTI_SYMBOL_1;
319
+ ServicePrincipal[_e] = { fqn: "terraconstructs.aws.iam.ServicePrincipal", version: "0.0.8" };
320
+ /**
321
+ * A principal that represents an AWS Organization
322
+ */
323
+ class OrganizationPrincipal extends PrincipalBase {
324
+ /**
325
+ *
326
+ * @param organizationId The unique identifier (ID) of an organization (i.e. o-12345abcde)
327
+ */
328
+ constructor(organizationId) {
329
+ super();
330
+ this.organizationId = organizationId;
331
+ }
332
+ get policyFragment() {
333
+ return new PrincipalPolicyFragment([{ type: PrincipalType.AWS, identifiers: ["*"] }], [
334
+ {
335
+ test: "StringEquals",
336
+ variable: "aws:PrincipalOrgID",
337
+ values: [this.organizationId],
338
+ },
339
+ ]);
340
+ }
341
+ toString() {
342
+ return `OrganizationPrincipal(${this.organizationId})`;
343
+ }
344
+ dedupeString() {
345
+ return `OrganizationPrincipal:${this.organizationId}`;
346
+ }
347
+ }
348
+ exports.OrganizationPrincipal = OrganizationPrincipal;
349
+ _f = JSII_RTTI_SYMBOL_1;
350
+ OrganizationPrincipal[_f] = { fqn: "terraconstructs.aws.iam.OrganizationPrincipal", version: "0.0.8" };
351
+ /**
352
+ * A policy principal for canonicalUserIds - useful for S3 bucket policies that use
353
+ * Origin Access identities.
354
+ *
355
+ * See https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html
356
+ *
357
+ * and
358
+ *
359
+ * https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html
360
+ *
361
+ * for more details.
362
+ *
363
+ */
364
+ class CanonicalUserPrincipal extends PrincipalBase {
365
+ /**
366
+ *
367
+ * @param canonicalUserId unique identifier assigned by AWS for every account.
368
+ * root user and IAM users for an account all see the same ID.
369
+ * (i.e. 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be)
370
+ */
371
+ constructor(canonicalUserId) {
372
+ super();
373
+ this.canonicalUserId = canonicalUserId;
374
+ }
375
+ get policyFragment() {
376
+ return new PrincipalPolicyFragment([
377
+ {
378
+ type: PrincipalType.CANONICALUSER,
379
+ identifiers: [this.canonicalUserId],
380
+ },
381
+ ]);
382
+ }
383
+ toString() {
384
+ return `CanonicalUserPrincipal(${this.canonicalUserId})`;
385
+ }
386
+ dedupeString() {
387
+ return `CanonicalUserPrincipal:${this.canonicalUserId}`;
388
+ }
389
+ }
390
+ exports.CanonicalUserPrincipal = CanonicalUserPrincipal;
391
+ _g = JSII_RTTI_SYMBOL_1;
392
+ CanonicalUserPrincipal[_g] = { fqn: "terraconstructs.aws.iam.CanonicalUserPrincipal", version: "0.0.8" };
393
+ /**
394
+ * Principal entity that represents a federated identity provider such as Amazon Cognito,
395
+ * that can be used to provide temporary security credentials to users who have been authenticated.
396
+ * Additional condition keys are available when the temporary security credentials are used to make a request.
397
+ * You can use these keys to write policies that limit the access of federated users.
398
+ *
399
+ * @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-wif
400
+ */
401
+ class FederatedPrincipal extends PrincipalBase {
402
+ /**
403
+ *
404
+ * @param federated federated identity provider (i.e. 'cognito-identity.amazonaws.com' for users authenticated through Cognito)
405
+ * @param sessionTags Whether to enable session tagging (see https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)
406
+ */
407
+ constructor(federated, conditions = [], assumeRoleAction = "sts:AssumeRole") {
408
+ super();
409
+ this.federated = federated;
410
+ this.conditions = conditions;
411
+ this.assumeRoleAction = assumeRoleAction;
412
+ }
413
+ get policyFragment() {
414
+ return new PrincipalPolicyFragment([{ type: PrincipalType.FEDERATED, identifiers: [this.federated] }], this.conditions);
415
+ }
416
+ toString() {
417
+ return `FederatedPrincipal(${this.federated})`;
418
+ }
419
+ dedupeString() {
420
+ return `FederatedPrincipal:${this.federated}:${this.assumeRoleAction}:${JSON.stringify(this.conditions)}`;
421
+ }
422
+ }
423
+ exports.FederatedPrincipal = FederatedPrincipal;
424
+ _h = JSII_RTTI_SYMBOL_1;
425
+ FederatedPrincipal[_h] = { fqn: "terraconstructs.aws.iam.FederatedPrincipal", version: "0.0.8" };
426
+ /**
427
+ * A principal that represents a federated identity provider as Web Identity such as Cognito, Amazon,
428
+ * Facebook, Google, etc.
429
+ */
430
+ class WebIdentityPrincipal extends FederatedPrincipal {
431
+ /**
432
+ *
433
+ * @param identityProvider identity provider (i.e. 'cognito-identity.amazonaws.com' for users authenticated through Cognito)
434
+ * @param conditions The conditions under which the policy is in effect.
435
+ * See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
436
+ * @param sessionTags Whether to enable session tagging (see https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)
437
+ */
438
+ constructor(identityProvider, conditions = []) {
439
+ super(identityProvider, conditions ?? {}, "sts:AssumeRoleWithWebIdentity");
440
+ }
441
+ get policyFragment() {
442
+ return new PrincipalPolicyFragment([{ type: PrincipalType.FEDERATED, identifiers: [this.federated] }], this.conditions);
443
+ }
444
+ toString() {
445
+ return `WebIdentityPrincipal(${this.federated})`;
446
+ }
447
+ }
448
+ exports.WebIdentityPrincipal = WebIdentityPrincipal;
449
+ _j = JSII_RTTI_SYMBOL_1;
450
+ WebIdentityPrincipal[_j] = { fqn: "terraconstructs.aws.iam.WebIdentityPrincipal", version: "0.0.8" };
451
+ /**
452
+ * A principal that represents a federated identity provider as from a OpenID Connect provider.
453
+ */
454
+ class OpenIdConnectPrincipal extends WebIdentityPrincipal {
455
+ /**
456
+ *
457
+ * @param openIdConnectProvider OpenID Connect provider
458
+ * @param conditions The conditions under which the policy is in effect.
459
+ * See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
460
+ */
461
+ constructor(openIdConnectProvider, conditions = []) {
462
+ super(openIdConnectProvider.openIdConnectProviderArn, conditions);
463
+ }
464
+ get policyFragment() {
465
+ return new PrincipalPolicyFragment([{ type: PrincipalType.FEDERATED, identifiers: [this.federated] }], this.conditions);
466
+ }
467
+ toString() {
468
+ return `OpenIdConnectPrincipal(${this.federated})`;
469
+ }
470
+ }
471
+ exports.OpenIdConnectPrincipal = OpenIdConnectPrincipal;
472
+ _k = JSII_RTTI_SYMBOL_1;
473
+ OpenIdConnectPrincipal[_k] = { fqn: "terraconstructs.aws.iam.OpenIdConnectPrincipal", version: "0.0.8" };
474
+ /**
475
+ * Principal entity that represents a SAML federated identity provider
476
+ */
477
+ class SamlPrincipal extends FederatedPrincipal {
478
+ constructor(samlProvider, conditions) {
479
+ super(samlProvider.samlProviderArn, conditions, "sts:AssumeRoleWithSAML");
480
+ }
481
+ toString() {
482
+ return `SamlPrincipal(${this.federated})`;
483
+ }
484
+ }
485
+ exports.SamlPrincipal = SamlPrincipal;
486
+ _l = JSII_RTTI_SYMBOL_1;
487
+ SamlPrincipal[_l] = { fqn: "terraconstructs.aws.iam.SamlPrincipal", version: "0.0.8" };
488
+ /**
489
+ * Principal entity that represents a SAML federated identity provider for
490
+ * programmatic and AWS Management Console access.
491
+ */
492
+ class SamlConsolePrincipal extends SamlPrincipal {
493
+ /**
494
+ * enum Partition {
495
+ * Default = 'aws',
496
+ * Cn = 'aws-cn',
497
+ * UsGov = 'aws-us-gov',
498
+ * UsIso = 'aws-iso',
499
+ * UsIsoB = 'aws-iso-b',
500
+ * UsIsoF = 'aws-iso-f',
501
+ * EuIsoE = 'aws-iso-e',
502
+ * }
503
+ * SAML Sign On urls could be...
504
+ * [Partition.Default]: 'https://signin.aws.amazon.com/saml',
505
+ * [Partition.Cn]: 'https://signin.amazonaws.cn/saml',
506
+ * [Partition.UsGov]: 'https://signin.amazonaws-us-gov.com/saml',
507
+ * [Partition.UsIso]: 'https://signin.c2shome.ic.gov/saml',
508
+ * [Partition.UsIsoB]: 'https://signin.sc2shome.sgov.gov/saml',
509
+ */
510
+ /**
511
+ * @param samlProvider The SAML provider
512
+ */
513
+ constructor(samlProvider, conditions = []) {
514
+ super(samlProvider, [
515
+ ...conditions,
516
+ // TODO: handle collisions on "SAML:aud"?
517
+ {
518
+ test: "StringEquals",
519
+ variable: "SAML:aud",
520
+ values: ["https://signin.aws.amazon.com/saml"],
521
+ },
522
+ ]);
523
+ }
524
+ toString() {
525
+ return `SamlConsolePrincipal(${this.federated})`;
526
+ }
527
+ }
528
+ exports.SamlConsolePrincipal = SamlConsolePrincipal;
529
+ _m = JSII_RTTI_SYMBOL_1;
530
+ SamlConsolePrincipal[_m] = { fqn: "terraconstructs.aws.iam.SamlConsolePrincipal", version: "0.0.8" };
531
+ /**
532
+ * Use the AWS account into which a stack is deployed as the principal entity in a policy
533
+ */
534
+ class AccountRootPrincipal extends AccountPrincipal {
535
+ constructor() {
536
+ super(new AwsStackDependentToken((awsStack) => awsStack.account).toString());
537
+ }
538
+ toString() {
539
+ return "AccountRootPrincipal()";
540
+ }
541
+ }
542
+ exports.AccountRootPrincipal = AccountRootPrincipal;
543
+ _o = JSII_RTTI_SYMBOL_1;
544
+ AccountRootPrincipal[_o] = { fqn: "terraconstructs.aws.iam.AccountRootPrincipal", version: "0.0.8" };
545
+ /**
546
+ * A principal representing all AWS identities in all accounts
547
+ *
548
+ * Some services behave differently when you specify `Principal: '*'`
549
+ * or `Principal: { AWS: "*" }` in their resource policy.
550
+ *
551
+ * `AnyPrincipal` renders to `Principal: { AWS: "*" }`. This is correct
552
+ * most of the time, but in cases where you need the other principal,
553
+ * use `StarPrincipal` instead.
554
+ */
555
+ class AnyPrincipal extends ArnPrincipal {
556
+ constructor() {
557
+ super("*");
558
+ }
559
+ toString() {
560
+ return "AnyPrincipal()";
561
+ }
562
+ }
563
+ exports.AnyPrincipal = AnyPrincipal;
564
+ _p = JSII_RTTI_SYMBOL_1;
565
+ AnyPrincipal[_p] = { fqn: "terraconstructs.aws.iam.AnyPrincipal", version: "0.0.8" };
566
+ /**
567
+ * A principal representing all identities in all accounts
568
+ * @deprecated use `AnyPrincipal`
569
+ */
570
+ class Anyone extends AnyPrincipal {
571
+ }
572
+ exports.Anyone = Anyone;
573
+ _q = JSII_RTTI_SYMBOL_1;
574
+ Anyone[_q] = { fqn: "terraconstructs.aws.iam.Anyone", version: "0.0.8" };
575
+ /**
576
+ * A principal that uses a literal '*' in the IAM JSON language
577
+ *
578
+ * Some services behave differently when you specify `Principal: "*"`
579
+ * or `Principal: { AWS: "*" }` in their resource policy.
580
+ *
581
+ * `StarPrincipal` renders to `Principal: *`. Most of the time, you
582
+ * should use `AnyPrincipal` instead.
583
+ */
584
+ class StarPrincipal extends PrincipalBase {
585
+ constructor() {
586
+ super(...arguments);
587
+ this.policyFragment = new PrincipalPolicyFragment([
588
+ {
589
+ type: PrincipalType.ANY,
590
+ identifiers: ["*"],
591
+ },
592
+ ]);
593
+ }
594
+ toString() {
595
+ return "StarPrincipal()";
596
+ }
597
+ dedupeString() {
598
+ return "StarPrincipal";
599
+ }
600
+ }
601
+ exports.StarPrincipal = StarPrincipal;
602
+ _r = JSII_RTTI_SYMBOL_1;
603
+ StarPrincipal[_r] = { fqn: "terraconstructs.aws.iam.StarPrincipal", version: "0.0.8" };
604
+ /**
605
+ * Represents a principal that has multiple types of principals. A composite principal cannot
606
+ * have conditions. i.e. multiple ServicePrincipals that form a composite principal
607
+ */
608
+ class CompositePrincipal extends PrincipalBase {
609
+ constructor(...principals) {
610
+ super();
611
+ this._principals = new Array();
612
+ if (principals.length === 0) {
613
+ throw new Error("CompositePrincipals must be constructed with at least 1 Principal but none were passed.");
614
+ }
615
+ this.assumeRoleAction = principals[0].assumeRoleAction;
616
+ this.addPrincipals(...principals);
617
+ }
618
+ /**
619
+ * Adds IAM principals to the composite principal. Composite principals cannot have
620
+ * conditions.
621
+ *
622
+ * @param principals IAM principals that will be added to the composite principal
623
+ */
624
+ addPrincipals(...principals) {
625
+ this._principals.push(...principals);
626
+ return this;
627
+ }
628
+ addToAssumeRolePolicy(doc) {
629
+ for (const p of this._principals) {
630
+ defaultAddPrincipalToAssumeRole(p, doc);
631
+ }
632
+ }
633
+ get policyFragment() {
634
+ // We only have a problem with conditions if we are trying to render composite
635
+ // principals into a single statement (which is when `policyFragment` would get called)
636
+ for (const p of this._principals) {
637
+ const fragment = p.policyFragment;
638
+ if (fragment.conditions && fragment.conditions.length > 0) {
639
+ throw new Error("Components of a CompositePrincipal must not have conditions. " +
640
+ `Tried to add the following fragment: ${JSON.stringify(fragment)}`);
641
+ }
642
+ }
643
+ const principals = new Array();
644
+ for (const p of this._principals) {
645
+ mergePrincipal(principals, p.policyFragment.principals);
646
+ }
647
+ return new PrincipalPolicyFragment(principals);
648
+ }
649
+ toString() {
650
+ return `CompositePrincipal(${this._principals})`;
651
+ }
652
+ dedupeString() {
653
+ const inner = this._principals.map(ComparablePrincipal.dedupeStringFor);
654
+ if (inner.some((x) => x === undefined)) {
655
+ return undefined;
656
+ }
657
+ return `CompositePrincipal[${inner.join(",")}]`;
658
+ }
659
+ /**
660
+ * Returns the principals that make up the CompositePrincipal
661
+ */
662
+ get principals() {
663
+ return this._principals;
664
+ }
665
+ }
666
+ exports.CompositePrincipal = CompositePrincipal;
667
+ _s = JSII_RTTI_SYMBOL_1;
668
+ CompositePrincipal[_s] = { fqn: "terraconstructs.aws.iam.CompositePrincipal", version: "0.0.8" };
669
+ /**
670
+ * Base class for Principals that wrap other principals
671
+ */
672
+ class PrincipalAdapter extends PrincipalBase {
673
+ constructor(wrapped) {
674
+ super();
675
+ this.wrapped = wrapped;
676
+ this.assumeRoleAction = this.wrapped.assumeRoleAction;
677
+ this.principalAccount = this.wrapped.principalAccount;
678
+ }
679
+ get policyFragment() {
680
+ return this.wrapped.policyFragment;
681
+ }
682
+ addToPrincipalPolicy(statement) {
683
+ return this.wrapped.addToPrincipalPolicy(statement);
684
+ }
685
+ /**
686
+ * Append the given string to the wrapped principal's dedupe string (if available)
687
+ */
688
+ appendDedupe(append) {
689
+ const inner = ComparablePrincipal.dedupeStringFor(this.wrapped);
690
+ return inner !== undefined
691
+ ? `${this.constructor.name}:${inner}:${append}`
692
+ : undefined;
693
+ }
694
+ }
695
+ /**
696
+ * Helper class for working with `IComparablePrincipal`s
697
+ */
698
+ class ComparablePrincipal {
699
+ /**
700
+ * Whether or not the given principal is a comparable principal
701
+ */
702
+ static isComparablePrincipal(x) {
703
+ return "dedupeString" in x;
704
+ }
705
+ /**
706
+ * Return the dedupeString of the given principal, if available
707
+ */
708
+ static dedupeStringFor(x) {
709
+ return ComparablePrincipal.isComparablePrincipal(x)
710
+ ? x.dedupeString()
711
+ : undefined;
712
+ }
713
+ }
714
+ exports.ComparablePrincipal = ComparablePrincipal;
715
+ _t = JSII_RTTI_SYMBOL_1;
716
+ ComparablePrincipal[_t] = { fqn: "terraconstructs.aws.iam.ComparablePrincipal", version: "0.0.8" };
717
+ /**
718
+ * An IAM principal with additional conditions specifying when the policy is in effect.
719
+ *
720
+ * For more information about conditions, see:
721
+ * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html
722
+ */
723
+ class PrincipalWithConditions extends PrincipalAdapter {
724
+ constructor(principal, conditions) {
725
+ super(principal);
726
+ this.additionalConditions = {};
727
+ for (const c of conditions) {
728
+ this.addCondition(c);
729
+ }
730
+ }
731
+ // ref: https://github.com/aws/aws-cdk/pull/28510/files#diff-50248f671e9b13a9cb35a62441d72832dca89b6c7ad4a88aa4fb2ec8e676b7cd
732
+ addToAssumeRolePolicy(doc) {
733
+ if (doc.node.scope === undefined) {
734
+ throw new Error("Cannot add a condition to a principal outside of a stack scope");
735
+ }
736
+ // Lazy import to avoid circular import dependencies during startup
737
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
738
+ const adapter = require("./private/adapter");
739
+ defaultAddPrincipalToAssumeRole(this.wrapped, new adapter.MutatingPolicyDocumentAdapter(doc, (statement) => {
740
+ statement.addActions(this.assumeRoleAction);
741
+ statement.addConditions(...this.conditions);
742
+ return statement;
743
+ }));
744
+ }
745
+ /**
746
+ * Add a condition to the principal
747
+ */
748
+ addCondition(condition) {
749
+ if (!this.additionalConditions[condition.test]) {
750
+ this.additionalConditions[condition.test] = {};
751
+ }
752
+ const existingCondition = this.additionalConditions[condition.test][condition.variable];
753
+ if (existingCondition) {
754
+ this.additionalConditions[condition.test][condition.variable] = {
755
+ ...existingCondition,
756
+ ...condition,
757
+ };
758
+ }
759
+ else {
760
+ this.additionalConditions[condition.test][condition.variable] = condition;
761
+ }
762
+ }
763
+ /**
764
+ * Add a conditionObject to the principal
765
+ *
766
+ * A conditionObject has the format of test: { variable: value | values[] }
767
+ *
768
+ * For example:
769
+ *
770
+ * ```ts
771
+ * const condition1 = {'StringEquals', { 'aws:SomeField': '1' }};
772
+ * // or
773
+ * const condition2 = {'StringEquals', { 'aws:SomeField': ['1', '2'] }};
774
+ * ```
775
+ */
776
+ addConditionObject(key, value) {
777
+ (0, policy_statement_1.validateConditionObject)(value);
778
+ for (const [k, v] of Object.entries(value)) {
779
+ if (!(0, policy_statement_1.isStringOrArrayOfStrings)(v)) {
780
+ throw new Error(`Fields must be either a string or an array of strings. Got ${v} for key ${k}`);
781
+ }
782
+ this.addCondition({
783
+ test: key,
784
+ variable: k,
785
+ values: Array.isArray(v) ? v : [v],
786
+ });
787
+ }
788
+ }
789
+ /**
790
+ * Adds multiple conditions to the principal
791
+ *
792
+ * Values from the conditions parameter will overwrite existing values with the same operator
793
+ * and key.
794
+ */
795
+ addConditions(conditions) {
796
+ conditions.map((c) => {
797
+ this.addCondition(c);
798
+ });
799
+ }
800
+ /**
801
+ * Adds multiple conditionObjects to the principal
802
+ *
803
+ * Values from the conditions parameter will overwrite existing values with the same operator
804
+ * and key.
805
+ */
806
+ addConditionObjects(conditions) {
807
+ for (const [key, value] of Object.entries(conditions)) {
808
+ this.addConditionObject(key, value);
809
+ }
810
+ }
811
+ /**
812
+ * The conditions under which the policy is in effect.
813
+ * See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
814
+ */
815
+ get conditions() {
816
+ return this.mergeConditions(this.wrapped.policyFragment.conditions, this.additionalConditions);
817
+ }
818
+ get policyFragment() {
819
+ return new PrincipalPolicyFragment(this.wrapped.policyFragment.principals, this.conditions);
820
+ }
821
+ toString() {
822
+ return this.wrapped.toString();
823
+ }
824
+ /**
825
+ * JSON-ify the principal
826
+ *
827
+ * Used when JSON.stringify() is called
828
+ */
829
+ toJSON() {
830
+ // Have to implement toJSON() because the default will lead to infinite recursion.
831
+ return this.policyFragment.principalJson;
832
+ }
833
+ dedupeString() {
834
+ return this.appendDedupe(JSON.stringify(this.conditions));
835
+ }
836
+ mergeConditions(principalConditions, additionalConditions) {
837
+ const mergedConditions = {};
838
+ principalConditions.forEach((c) => {
839
+ if (!mergedConditions[c.test]) {
840
+ mergedConditions[c.test] = {};
841
+ }
842
+ mergedConditions[c.test][c.variable] = c;
843
+ });
844
+ Object.entries(additionalConditions).forEach(([test, condition]) => {
845
+ // merge the conditions if one of the additional conditions uses an
846
+ // operator that's already used by the principal's conditions merge the
847
+ // inner structure.
848
+ const existing = mergedConditions[test];
849
+ if (!existing) {
850
+ mergedConditions[test] = condition;
851
+ return; // continue
852
+ }
853
+ // TODO: Support IResolvable Condition?
854
+ // // if either the existing condition or the new one contain unresolved
855
+ // // tokens, fail the merge. this is as far as we go at this point.
856
+ // if (Token.isUnresolved(condition) || Token.isUnresolved(existing)) {
857
+ // throw new Error(
858
+ // `multiple "${test}" conditions cannot be merged if one of them contains an unresolved token`,
859
+ // );
860
+ // }
861
+ // TODO: Validate condition?
862
+ // validateConditionObject(existing);
863
+ // validateConditionObject(condition);
864
+ mergedConditions[test] = { ...existing, ...condition };
865
+ });
866
+ return (0, policy_statement_1.toConditions)(mergedConditions);
867
+ }
868
+ }
869
+ exports.PrincipalWithConditions = PrincipalWithConditions;
870
+ _u = JSII_RTTI_SYMBOL_1;
871
+ PrincipalWithConditions[_u] = { fqn: "terraconstructs.aws.iam.PrincipalWithConditions", version: "0.0.8" };
872
+ /**
873
+ * Enables session tags on role assumptions from a principal
874
+ *
875
+ * For more information on session tags, see:
876
+ * https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html
877
+ */
878
+ class SessionTagsPrincipal extends PrincipalAdapter {
879
+ constructor(principal) {
880
+ super(principal);
881
+ }
882
+ // ref: https://github.com/aws/aws-cdk/pull/28510/files#diff-50248f671e9b13a9cb35a62441d72832dca89b6c7ad4a88aa4fb2ec8e676b7cd
883
+ addToAssumeRolePolicy(doc) {
884
+ // Lazy import to avoid circular import dependencies during startup
885
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
886
+ const adapter = require("./private/adapter");
887
+ defaultAddPrincipalToAssumeRole(this.wrapped, new adapter.MutatingPolicyDocumentAdapter(doc, (statement) => {
888
+ statement.addActions("sts:TagSession");
889
+ return statement;
890
+ }));
891
+ }
892
+ dedupeString() {
893
+ return this.appendDedupe("");
894
+ }
895
+ }
896
+ exports.SessionTagsPrincipal = SessionTagsPrincipal;
897
+ _v = JSII_RTTI_SYMBOL_1;
898
+ SessionTagsPrincipal[_v] = { fqn: "terraconstructs.aws.iam.SessionTagsPrincipal", version: "0.0.8" };
899
+ /**
900
+ * Add a principal to an AssumeRolePolicyDocument in the right way
901
+ *
902
+ * Delegate to the principal if it can do the job itself, do a default job if it can't.
903
+ */
904
+ function defaultAddPrincipalToAssumeRole(principal, doc) {
905
+ if (isAssumeRolePrincipal(principal)) {
906
+ // Principal knows how to add itself
907
+ principal.addToAssumeRolePolicy(doc);
908
+ }
909
+ else {
910
+ // Principal can't add itself, we do it for them
911
+ doc.addStatements(new policy_statement_1.PolicyStatement({
912
+ actions: [principal.assumeRoleAction],
913
+ principals: [principal],
914
+ }));
915
+ }
916
+ }
917
+ exports.defaultAddPrincipalToAssumeRole = defaultAddPrincipalToAssumeRole;
918
+ function isAssumeRolePrincipal(principal) {
919
+ return !!principal.addToAssumeRolePolicy;
920
+ }
921
+ /**
922
+ * A lazy token that requires an instance of Stack to evaluate
923
+ */
924
+ class AwsStackDependentToken {
925
+ constructor(fn) {
926
+ this.fn = fn;
927
+ // TODO: Implement stack traces
928
+ // ref: https://github.com/hashicorp/terraform-cdk/blob/v0.20.9/packages/cdktf/lib/tokens/private/stack-trace.ts#L9
929
+ // ref: https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/core/lib/stack-trace.ts#L22
930
+ this.creationStack = ["stack traces disabled"];
931
+ }
932
+ resolve(context) {
933
+ return this.fn(aws_stack_1.AwsStack.ofAwsConstruct(context.scope));
934
+ }
935
+ toString() {
936
+ return cdktf_1.Token.asString(this);
937
+ }
938
+ /**
939
+ * JSON-ify the token
940
+ *
941
+ * Used when JSON.stringify() is called
942
+ */
943
+ toJSON() {
944
+ return "<unresolved-token>";
945
+ }
946
+ }
947
+ class ServicePrincipalToken {
948
+ constructor(service, opts) {
949
+ this.service = service;
950
+ this.opts = opts;
951
+ // TODO: Implement stack traces
952
+ // ref: https://github.com/hashicorp/terraform-cdk/blob/v0.20.9/packages/cdktf/lib/tokens/private/stack-trace.ts#L9
953
+ // ref: https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/core/lib/stack-trace.ts#L22
954
+ this.creationStack = ["stack traces disabled"];
955
+ }
956
+ resolve(ctx) {
957
+ const awsStack = aws_stack_1.AwsStack.ofAwsConstruct(ctx.scope);
958
+ // TODO: Does this work for Opt-In regions??
959
+ // https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/aws-iam/lib/principals.ts#L506-L510
960
+ return awsStack.servicePrincipalName(this.service, this.opts.region);
961
+ }
962
+ toString() {
963
+ return cdktf_1.Token.asString(this, {
964
+ displayHint: this.service,
965
+ });
966
+ }
967
+ /**
968
+ * JSON-ify the token
969
+ *
970
+ * Used when JSON.stringify() is called
971
+ */
972
+ toJSON() {
973
+ return `<${this.service}>`;
974
+ }
975
+ }
976
+ /**
977
+ * Merge two arrays that represent IAM principals
978
+ *
979
+ * Does an in-place merge into target.
980
+ */
981
+ function mergePrincipal(target, source) {
982
+ // if one represents the starPrincipal the other one must be empty
983
+ if ((hasStarPrincipal(target) && source.length > 0) ||
984
+ (hasStarPrincipal(source) && target.length > 0)) {
985
+ throw new Error(`Cannot merge principals ${JSON.stringify(target)} and ${JSON.stringify(source)}; if one uses a the StarPrincipal string the other one must be empty`);
986
+ }
987
+ const targetMap = new Map();
988
+ for (const principal of target) {
989
+ targetMap.set(principal.type, principal);
990
+ }
991
+ for (const sourcePrincipal of source) {
992
+ const { type, identifiers: sourceIdentifiers } = sourcePrincipal;
993
+ if (targetMap.has(type)) {
994
+ const targetIndentifierSet = new Set(targetMap.get(type).identifiers);
995
+ for (const id of sourceIdentifiers) {
996
+ targetIndentifierSet.add(id);
997
+ }
998
+ // Update the target identifiers in-place
999
+ const index = target.findIndex((principal) => principal.type === type);
1000
+ if (index !== -1) {
1001
+ target[index] = {
1002
+ type,
1003
+ identifiers: Array.from(targetIndentifierSet),
1004
+ };
1005
+ }
1006
+ }
1007
+ else {
1008
+ target.push({
1009
+ type,
1010
+ identifiers: [...sourceIdentifiers],
1011
+ });
1012
+ }
1013
+ }
1014
+ }
1015
+ exports.mergePrincipal = mergePrincipal;
1016
+ /**
1017
+ * Detect if the PrincipalProps array contains the StarPrincipal:
1018
+ * type = PrincipalType.ANY and identifiers = ["*"]
1019
+ */
1020
+ function hasStarPrincipal(principals) {
1021
+ // TODO: Does having more than 1 principal make sense if one of them is the StarPrincipal?
1022
+ for (let index = 0; index < principals.length; index++) {
1023
+ const principal = principals[index];
1024
+ if (principal.type === PrincipalType.ANY &&
1025
+ principal.identifiers.length === 1 &&
1026
+ principal.identifiers[0] === "*") {
1027
+ return true;
1028
+ }
1029
+ }
1030
+ return false;
1031
+ }
1032
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbmNpcGFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3ByaW5jaXBhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBNEQ7QUFFNUQsNENBQXdDO0FBR3hDLHlEQVU0QjtBQWlDNUIsSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCx3Q0FBdUIsQ0FBQTtJQUN2QixvQ0FBbUIsQ0FBQTtJQUNuQixnREFBK0IsQ0FBQTtJQUMvQiwwQkFBUyxDQUFBO0FBQ1gsQ0FBQyxFQU5XLGFBQWEsNkJBQWIsYUFBYSxRQU14QjtBQUVELFNBQVMsb0JBQW9CLENBQUMsS0FBYTtJQUN6QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsT0FBTyxjQUFjLElBQUksYUFBYSxDQUFDO0FBQ3pDLENBQUM7QUFpRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsdUJBQXVCO0lBQ2xDOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUNwQixhQUFrQixFQUNsQixpQkFBeUMsRUFBRTtRQUUzQyxPQUFPLElBQUksdUJBQXVCLENBQ2hDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUNoQyxJQUFBLG9DQUFpQixFQUFDLGNBQWMsQ0FBQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFXLGFBQWE7UUFDdEIsT0FBTyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUEsa0NBQWUsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQ2tCLFVBQWlDO0lBQ2pEOzs7T0FHRztJQUNhLGFBQXlCLEVBQUU7UUFMM0IsZUFBVSxHQUFW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RSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBekNELHdDQXlDQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsVUFBNEI7SUFDcEQsMEZBQTBGO0lBQzFGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQ0UsU0FBUyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsR0FBRztZQUNwQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2xDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUNoQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuLCBJUmVzb2x2YWJsZSwgSVJlc29sdmVDb250ZXh0IH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJRGVwZW5kYWJsZSB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IElPcGVuSWRDb25uZWN0UHJvdmlkZXIgfSBmcm9tIFwiLi9vaWRjLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBJUG9saWN5RG9jdW1lbnQgfSBmcm9tIFwiLi9wb2xpY3ktZG9jdW1lbnRcIjtcbmltcG9ydCB7XG4gIFBvbGljeVN0YXRlbWVudCxcbiAgQ29uZGl0aW9uLFxuICBDb25kaXRpb25zLFxuICBpc1N0cmluZ09yQXJyYXlPZlN0cmluZ3MsXG4gIHRvQ29uZGl0aW9uSnNvbixcbiAgZnJvbUNvbmRpdGlvbkpzb24sXG4gIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0LFxuICBDb25kaXRpb25NYXAsXG4gIHRvQ29uZGl0aW9ucyxcbn0gZnJvbSBcIi4vcG9saWN5LXN0YXRlbWVudFwiO1xuaW1wb3J0IHsgSVNhbWxQcm92aWRlciB9IGZyb20gXCIuL3NhbWwtcHJvdmlkZXJcIjtcbi8qKlxuICogVGVycmFmb3JtIFByaW5jaXBhbCBQcm9wc1xuICpcbiAqIFRoZSBgcHJpbmNpcGFsc2AgYW5kIGBub3RfcHJpbmNpcGFsc2AgYmxvY2tzIG9mIGEgcG9saWN5IHN0YXRlbWVudFxuICpcbiAqIFJlZjogaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvbGF0ZXN0L2RvY3MvZGF0YS1zb3VyY2VzL2lhbV9wb2xpY3lfZG9jdW1lbnQjcHJpbmNpcGFscy1hbmQtbm90X3ByaW5jaXBhbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmluY2lwYWxQcm9wcyB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIGlkZW50aWZpZXJzIGZvciBwcmluY2lwYWxzLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgQVdTLCB0aGVzZSBhcmUgSUFNIHByaW5jaXBhbCBBUk5zLCBlLmcuLCBhcm46YXdzOmlhbTo6MTIzNDU2Nzg5MDE6cm9sZS95YWstcm9sZS5cbiAgICpcbiAgICogV2hlbiB0eXBlIGlzIFNlcnZpY2UsIHRoZXNlIGFyZSBBV1MgU2VydmljZSByb2xlcywgZS5nLiwgbGFtYmRhLmFtYXpvbmF3cy5jb20uXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBGZWRlcmF0ZWQsIHRoZXNlIGFyZSB3ZWIgaWRlbnRpdHkgdXNlcnMgb3IgU0FNTCBwcm92aWRlciBBUk5zLFxuICAgKiBlLmcuLCBhY2NvdW50cy5nb29nbGUuY29tIG9yIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTpzYW1sLXByb3ZpZGVyL3lhay1zYW1sLXByb3ZpZGVyLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgQ2Fub25pY2FsVXNlciwgdGhlc2UgYXJlIGNhbm9uaWNhbCB1c2VyIElEcyxcbiAgICogZS5nLiwgNzlhNTlkZjkwMGI5NDllNTVkOTZhMWU2OThmYmFjZWRmZDZlMDlkOThlYWNmOGY4ZDUyMThlN2NkNDdlZjJiZS5cbiAgICpcbiAgICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81LjY4LjAvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCNpZGVudGlmaWVycyBEYXRhQXdzSWFtUG9saWN5RG9jdW1lbnQjaWRlbnRpZmllcnN9XG4gICAqL1xuICByZWFkb25seSBpZGVudGlmaWVyczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUeXBlIG9mIHByaW5jaXBhbC5cbiAgICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81LjY4LjAvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCN0eXBlIERhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudCN0eXBlfVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogUHJpbmNpcGFsVHlwZTtcbn1cblxuZXhwb3J0IGVudW0gUHJpbmNpcGFsVHlwZSB7XG4gIEFXUyA9IFwiQVdTXCIsXG4gIEZFREVSQVRFRCA9IFwiRmVkZXJhdGVkXCIsXG4gIFNFUlZJQ0UgPSBcIlNlcnZpY2VcIixcbiAgQ0FOT05JQ0FMVVNFUiA9IFwiQ2Fub25pY2FsVXNlclwiLFxuICBBTlkgPSBcIipcIixcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFByaW5jaXBhbFR5cGUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB1cHBlckNhc2VWYWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIHJldHVybiB1cHBlckNhc2VWYWx1ZSBpbiBQcmluY2lwYWxUeXBlO1xufVxuXG4vKipcbiAqIEFueSBvYmplY3QgdGhhdCBoYXMgYW4gYXNzb2NpYXRlZCBwcmluY2lwYWwgdGhhdCBhIHBlcm1pc3Npb24gY2FuIGJlIGdyYW50ZWQgdG9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsb2dpY2FsIElBTSBwcmluY2lwYWwuXG4gKlxuICogQW4gSVByaW5jaXBhbCBkZXNjcmliZXMgYSBsb2dpY2FsIGVudGl0eSB0aGF0IGNhbiBwZXJmb3JtIEFXUyBBUEkgY2FsbHNcbiAqIGFnYWluc3Qgc2V0cyBvZiByZXNvdXJjZXMsIG9wdGlvbmFsbHkgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLlxuICpcbiAqIEV4YW1wbGVzIG9mIHNpbXBsZSBwcmluY2lwYWxzIGFyZSBJQU0gb2JqZWN0cyB0aGF0IHlvdSBjcmVhdGUsIHN1Y2hcbiAqIGFzIFVzZXJzIG9yIFJvbGVzLlxuICpcbiAqIEFuIGV4YW1wbGUgb2YgYSBtb3JlIGNvbXBsZXggcHJpbmNpcGFscyBpcyBhIGBTZXJ2aWNlUHJpbmNpcGFsYCAoc3VjaCBhc1xuICogYG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwic25zLmFtYXpvbmF3cy5jb21cIilgLCB3aGljaCByZXByZXNlbnRzIHRoZSBTaW1wbGVcbiAqIE5vdGlmaWNhdGlvbnMgU2VydmljZSkuXG4gKlxuICogQSBzaW5nbGUgbG9naWNhbCBQcmluY2lwYWwgbWF5IGFsc28gbWFwIHRvIGEgc2V0IG9mIHBoeXNpY2FsIHByaW5jaXBhbHMuXG4gKiBGb3IgZXhhbXBsZSwgYG5ldyBPcmdhbml6YXRpb25QcmluY2lwYWwoJ28tMTIzNCcpYCByZXByZXNlbnRzIGFsbFxuICogaWRlbnRpdGllcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBnaXZlbiBBV1MgT3JnYW5pemF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQcmluY2lwYWwgZXh0ZW5kcyBJR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBQcmluY2lwYWwgaXMgdXNlZCBpbiBhbiBBc3N1bWVSb2xlIHBvbGljeSwgdGhlIGFjdGlvbiB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcG9saWN5IGZyYWdtZW50IHRoYXQgaWRlbnRpZmllcyB0aGlzIHByaW5jaXBhbCBpbiBhIFBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeUZyYWdtZW50OiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudDtcblxuICAvKipcbiAgICogVGhlIEFXUyBhY2NvdW50IElEIG9mIHRoaXMgcHJpbmNpcGFsLlxuICAgKiBDYW4gYmUgdW5kZWZpbmVkIHdoZW4gdGhlIGFjY291bnQgaXMgbm90IGtub3duXG4gICAqIChmb3IgZXhhbXBsZSwgZm9yIHNlcnZpY2UgcHJpbmNpcGFscykuXG4gICAqIENhbiBiZSBhIFRva2VuIC0gaW4gdGhhdCBjYXNlLFxuICAgKiBpdCdzIGFzc3VtZWQgdG8gYmUgYSByZWZlcmVuY2UgdG8gdGhlIERhdGFBd3NDYWxsZXJJZGVudGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpbmNpcGFsQWNjb3VudD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkIHRvIHRoZSBwb2xpY3kgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHN0YXRlbWVudCB3YXMgYWRkZWQsIGZhbHNlIGlmIHRoZSBwcmluY2lwYWwgaW5cbiAgICogcXVlc3Rpb24gZG9lcyBub3QgaGF2ZSBhIHBvbGljeSBkb2N1bWVudCB0byBhZGQgdGhlIHN0YXRlbWVudCB0by5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBhZGRUb1ByaW5jaXBhbFBvbGljeWAgaW5zdGVhZC5cbiAgICovXG4gIGFkZFRvUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkIHRvIHRoZSBwb2xpY3kgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqL1xuICBhZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0O1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiB0aGUgZmllbGRzIGluIGEgUG9saWN5U3RhdGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBwcmluY2lwYWwuXG4gKlxuICogVGhpcyBjb25zaXN0cyBvZiB0aGUgVGVycmFmb3JtIFByaW5jaXBhbFByb3BzIHJlcHJlc2VudGluZyB0aGVcbiAqIGBwcmluY2lwYWxzYCBibG9jayhzKSBpbiBhIHBvbGljeSBzdGF0ZW1lbnQuXG4gKlxuICogR2VuZXJhbGx5LCBBV1MgcHJpbmNpcGFsIEpTT04gbG9va3MgbGlrZTpcbiAqXG4gKiAgICAgeyAnPFRZUEU+JzogWydJRCcsICdJRCcsIC4uLl0gfVxuICpcbiAqIEFuZCB0aGlzIGlzIGFsc28gdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGBwcmluY2lwYWxKc29uYC5cbiAqXG4gKiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgdHlwZSBvZiBwcmluY2lwYWwgdGhhdCBpcyBqdXN0IHRoZSBzdHJpbmcgJyonLFxuICogd2hpY2ggaXMgdHJlYXRlZCBkaWZmZXJlbnRseSBieSBzb21lIHNlcnZpY2VzLlxuICpcbiAqIFRvIHJlcHJlc2VudCB0aGF0IHByaW5jaXBhbCwgYHByaW5jaXBhbEpzb25gIHNob3VsZCBjb250YWluIGAqYC5cbiAqIFRvIHJlcHJlc2VudCB0aGF0IHByaW5jaXBhbCBpbiBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9jayhzKSwgdGhlXG4gKiB0eXBlIHNob3VsZCBiZSBgUHJpbmNpcGFsVHlwZS5BTllgIGFuZCB0aGUgaWRlbnRpZmllcnMgc2hvdWxkIGJlIGBbJyonXWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gIC8qKlxuICAgKiBQYXJzZXMgYSBKU09OIG9iamVjdCB3aXRoIHRoZSBBV1MgSUFNIFByaW5jaXBhbCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogUmVmZXIgdG8gdGhlIGBmcm9tUHJpbmNpcGFsSnNvbmAgYW5kIGBmcm9tQ29uZGl0aW9uSnNvbmAgZnVuY3Rpb25zIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Kc29uKFxuICAgIHByaW5jaXBhbEpzb246IGFueSxcbiAgICBjb25kaXRpb25zSnNvbjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICApOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIGZyb21QcmluY2lwYWxKc29uKHByaW5jaXBhbEpzb24pLFxuICAgICAgZnJvbUNvbmRpdGlvbkpzb24oY29uZGl0aW9uc0pzb24pLFxuICAgICk7XG4gIH1cblxuICAvLyBUT0RPOiBTaG91bGQgdGhpcyBhY3R1YWxseSBiZSB1c2VkIGFueXdoZXJlP1xuICBwdWJsaWMgZ2V0IHByaW5jaXBhbEpzb24oKTogQXdzUHJpbmNpcGFsSnNvbiB7XG4gICAgcmV0dXJuIHRvUHJpbmNpcGFsSnNvbiguLi50aGlzLnByaW5jaXBhbHMpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29uZGl0aW9uc0pzb24oKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRvQ29uZGl0aW9uSnNvbiguLi50aGlzLmNvbmRpdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwcmluY2lwYWxzIEFycmF5IG9mIFwicHJpbmNpcGFsc1wiIGJsb2NrIGluIGEgcG9saWN5IHN0YXRlbWVudFxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyBjb25kaXRpb25zIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkIHRvIHRoaXMgcG9saWN5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsczogQXJyYXk8UHJpbmNpcGFsUHJvcHM+LFxuICAgIC8qKlxuICAgICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgICAqIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICApIHt9XG59XG5cbi8qKlxuICogVHlwZWQgcmVwcmVzZW50YXRpb24gb2YgQVdTIFByaW5jaXBhbCBKU09OXG4gKi9cbmV4cG9ydCB0eXBlIEF3c1ByaW5jaXBhbEpzb24gPSBzdHJpbmcgfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH07XG5cbi8qKlxuICogUmVhZCBmcm9tIEFXUyBQcmluY2lwYWwgSlNPTiB0byBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9jayhzKVxuICpcbiAqIEhhbmRsZXMgc3BlY2lhbCBjYXNlOiBpZiBwcmluY2lwYWwgaXMgXCIqXCIgYW5kIHR1cm5zIGl0IGludG8gdGhlIGBTdGFyUHJpbmNpcGFsYCxcbiAqXG4gKiBFdmVuIHRob3VnaCB0aGUgSUFNIERvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgXCJQcmluY2lwYWxcIjogXCIqXCIgYW5kIFwiUHJpbmNpcGFsXCI6IHtcIkFXU1wiOiBcIipcIn0gYXJlIGVxdWl2YWxlbnQsXG4gKiB0aG9zZSBwcmluY2lwYWwgZWxlbWVudHMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IgaW4gc29tZSBzaXR1YXRpb25zLCBlLmcuLCBJQU0gUm9sZSBUcnVzdCBQb2xpY3kuXG4gKlxuICogVG8gaGF2ZSBUZXJyYWZvcm0gcmVuZGVyIEpTT04gY29udGFpbmluZyBcIlByaW5jaXBhbFwiOiBcIipcIiwgdXNlIHR5cGUgPSBcIipcIiBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdLlxuICogVG8gaGF2ZSBUZXJyYWZvcm0gcmVuZGVyIEpTT04gY29udGFpbmluZyBcIlByaW5jaXBhbFwiOiB7XCJBV1NcIjogXCIqXCJ9LCB1c2UgdHlwZSA9IFwiQVdTXCIgYW5kIGlkZW50aWZpZXJzID0gW1wiKlwiXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21QcmluY2lwYWxKc29uKHByaW5jaXBhbEpzb246IGFueSA9IHt9KTogUHJpbmNpcGFsUHJvcHNbXSB7XG4gIGlmICh0eXBlb2YgcHJpbmNpcGFsSnNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChwcmluY2lwYWxKc29uID09PSBcIipcIikge1xuICAgICAgcmV0dXJuIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuQU5ZLCBpZGVudGlmaWVyczogW1wiKlwiXSB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgaGFuZGxlIG90aGVyIHNjZW5hcmlvcyAoaS5lLiBUb2tlbnM/KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByaW5jaXBhbCB0eXBlOiAke3ByaW5jaXBhbEpzb259YCk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgcHJpbmNpcGFsSnNvbiAhPT0gXCJvYmplY3RcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBKU09OIElBTSBwcmluY2lwYWwgc2hvdWxkIGJlIGFuIG9iamVjdCwgZ290ICR7SlNPTi5zdHJpbmdpZnkocHJpbmNpcGFsSnNvbil9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxQcmluY2lwYWxQcm9wcz4oKTtcbiAgZm9yIChjb25zdCBba2V5LCBpZGVudGlmaWVyc10gb2YgT2JqZWN0LmVudHJpZXMocHJpbmNpcGFsSnNvbikpIHtcbiAgICBpZiAoIWlzVmFsaWRQcmluY2lwYWxUeXBlKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcHJpbmNpcGFsIHR5cGU6ICR7a2V5fSwgdmFsaWQgdmFsdWVzIGFyZTogJHtPYmplY3QudmFsdWVzKFByaW5jaXBhbFR5cGUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXN1bHQucHVzaCh7XG4gICAgICBpZGVudGlmaWVyczogQXJyYXkuaXNBcnJheShpZGVudGlmaWVycykgPyBpZGVudGlmaWVycyA6IFtpZGVudGlmaWVyc10sXG4gICAgICB0eXBlOiBrZXkgYXMgUHJpbmNpcGFsVHlwZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgVGVycmFmb3JtIHByaW5jaXBhbHMgYmxvY2tzIGJhY2sgdG8gQVdTIFByaW5jaXBhbCBKU09OXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1ByaW5jaXBhbEpzb24oXG4gIC4uLnByaW5jaXBhbFByb3BzOiBQcmluY2lwYWxQcm9wc1tdXG4pOiBBd3NQcmluY2lwYWxKc29uIHtcbiAgaWYgKFxuICAgIHByaW5jaXBhbFByb3BzLmxlbmd0aCA9PT0gMSAmJlxuICAgIHByaW5jaXBhbFByb3BzWzBdLnR5cGUgPT09IFByaW5jaXBhbFR5cGUuQU5ZICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0uaWRlbnRpZmllcnMubGVuZ3RoID09PSAxICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0uaWRlbnRpZmllcnNbMF0gPT09IFwiKlwiXG4gIClcbiAgICByZXR1cm4gXCIqXCI7XG5cbiAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBwcmluY2lwYWwgb2YgcHJpbmNpcGFsUHJvcHMpIHtcbiAgICByZXN1bHRbcHJpbmNpcGFsLnR5cGVdID1cbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVycy5sZW5ndGggPT09IDFcbiAgICAgICAgPyBwcmluY2lwYWwuaWRlbnRpZmllcnNbMF1cbiAgICAgICAgOiBwcmluY2lwYWwuaWRlbnRpZmllcnM7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHR5cGUgb2YgcHJpbmNpcGFsIHRoYXQgaGFzIG1vcmUgY29udHJvbCBvdmVyIGl0cyBvd24gcmVwcmVzZW50YXRpb24gaW4gQXNzdW1lUm9sZVBvbGljeURvY3VtZW50c1xuICpcbiAqIE1vcmUgY29tcGxleCB0eXBlcyBvZiBpZGVudGl0eSBwcm92aWRlcnMgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciBSb2xlJ3MgcG9saWN5IGRvY3VtZW50c1xuICogdGhhbiBzaW1wbHkgYHsgRWZmZWN0OiAnQWxsb3cnLCBBY3Rpb246ICdBc3N1bWVSb2xlJywgUHJpbmNpcGFsOiA8V2hhdGV2ZXI+IH1gLlxuICpcbiAqIElmIHRoYXQgY29udHJvbCBpcyBuZWNlc3NhcnksIHRoZXkgY2FuIGltcGxlbWVudCBgSUFzc3VtZVJvbGVQcmluY2lwYWxgIHRvIGdldCBmdWxsXG4gKiBhY2Nlc3MgdG8gYSBSb2xlJ3MgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBc3N1bWVSb2xlUHJpbmNpcGFsIGV4dGVuZHMgSVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIHByaW5jaXBhbCB0byB0aGUgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50XG4gICAqXG4gICAqIEFkZCB0aGUgc3RhdGVtZW50cyB0byB0aGUgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50IG5lY2Vzc2FyeSB0byBnaXZlIHRoaXMgcHJpbmNpcGFsXG4gICAqIHBlcm1pc3Npb25zIHRvIGFzc3VtZSB0aGUgZ2l2ZW4gcm9sZS5cbiAgICovXG4gIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2N1bWVudDogSVBvbGljeURvY3VtZW50KTogdm9pZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY2FsbGluZyBgYWRkVG9QcmluY2lwYWxQb2xpY3lgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RhdGVtZW50IHdhcyBhZGRlZCB0byB0aGUgaWRlbnRpdHkncyBwb2xpY2llcy5cbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlbWVudEFkZGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXBlbmRhYmxlIHdoaWNoIGFsbG93cyBkZXBlbmRpbmcgb24gdGhlIHBvbGljeSBjaGFuZ2UgYmVpbmcgYXBwbGllZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFJlcXVpcmVkIGlmIGBzdGF0ZW1lbnRBZGRlZGAgaXMgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeURlcGVuZGFibGU/OiBJRGVwZW5kYWJsZTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBwb2xpY3kgcHJpbmNpcGFsc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUHJpbmNpcGFsQmFzZSBpbXBsZW1lbnRzIElBc3N1bWVSb2xlUHJpbmNpcGFsIHtcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsID0gdGhpcztcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBwb2xpY3kgZnJhZ21lbnQgdGhhdCBpZGVudGlmaWVzIHRoaXMgcHJpbmNpcGFsIGluIGEgUG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHBvbGljeUZyYWdtZW50OiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudDtcblxuICAvKipcbiAgICogV2hlbiB0aGlzIFByaW5jaXBhbCBpcyB1c2VkIGluIGFuIEFzc3VtZVJvbGUgcG9saWN5LCB0aGUgYWN0aW9uIHRvIHVzZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmcgPSBcInN0czpBc3N1bWVSb2xlXCI7XG5cbiAgcHVibGljIGFkZFRvUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KS5zdGF0ZW1lbnRBZGRlZDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBfc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQsXG4gICk6IEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0IHtcbiAgICAvLyBUaGlzIGJhc2UgY2xhc3MgaXMgdXNlZCBmb3Igbm9uLWlkZW50aXR5IHByaW5jaXBhbHMuIE5vbmUgb2YgdGhlbVxuICAgIC8vIGhhdmUgYSBQb2xpY3lEb2N1bWVudCB0byBhZGQgdG8uXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvY3VtZW50OiBJUG9saWN5RG9jdW1lbnQpOiB2b2lkIHtcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgcHJvdG9jb2xcbiAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFt0aGlzLmFzc3VtZVJvbGVBY3Rpb25dLFxuICAgICAgICBwcmluY2lwYWxzOiBbdGhpc10sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmaXJzdCBwYXNzIHRvIG1ha2UgdGhlIG9iamVjdCByZWFkYWJsZS4gRGVzY2VuZGFudCBwcmluY2lwYWxzXG4gICAgLy8gc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbmljZXIuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbik7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgLy8gSGF2ZSB0byBpbXBsZW1lbnQgdG9KU09OKCkgYmVjYXVzZSB0aGUgZGVmYXVsdCB3aWxsIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgIHJldHVybiB0aGlzLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbEpzb247XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyB1c2luZyB0aGlzIHByaW5jaXBhbCBhcyB0aGUgYmFzZSwgd2l0aCB0aGVcbiAgICogcGFzc2VkIGNvbmRpdGlvbnMgYWRkZWQuXG4gICAqXG4gICAqIFdoZW4gdGhlcmUgaXMgYSB2YWx1ZSBmb3IgdGhlIHNhbWUgb3BlcmF0b3IgYW5kIGtleSBpbiBib3RoIHRoZSBwcmluY2lwYWwgYW5kIHRoZVxuICAgKiBjb25kaXRpb25zIHBhcmFtZXRlciwgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHJldHVybnMgYSBuZXcgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHdpdGhDb25kaXRpb25zKC4uLmNvbmRpdGlvbnM6IENvbmRpdGlvbnMpOiBQcmluY2lwYWxCYXNlIHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFdpdGhDb25kaXRpb25zKHRoaXMsIGNvbmRpdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgcHJpbmNpcGFsIHVzaW5nIHRoaXMgcHJpbmNpcGFsIGFzIHRoZSBiYXNlLCB3aXRoIHNlc3Npb24gdGFncyBlbmFibGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIG5ldyBTZXNzaW9uVGFnc1ByaW5jaXBhbCBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgd2l0aFNlc3Npb25UYWdzKCk6IFByaW5jaXBhbEJhc2Uge1xuICAgIHJldHVybiBuZXcgU2Vzc2lvblRhZ3NQcmluY2lwYWwodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoaXMgcHJpbmNpcGFsIGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwZWNpZnkgYSBwcmluY2lwYWwgYnkgdGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pLlxuICogWW91IGNhbiBzcGVjaWZ5IEFXUyBhY2NvdW50cywgSUFNIHVzZXJzLCBGZWRlcmF0ZWQgU0FNTCB1c2VycywgSUFNIHJvbGVzLCBhbmQgc3BlY2lmaWMgYXNzdW1lZC1yb2xlIHNlc3Npb25zLlxuICogWW91IGNhbm5vdCBzcGVjaWZ5IElBTSBncm91cHMgb3IgaW5zdGFuY2UgcHJvZmlsZXMgYXMgcHJpbmNpcGFsc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19wcmluY2lwYWwuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgQXJuUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBwcmluY2lwYWwgZW50aXR5IChpLmUuIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTI6dXNlci91c2VyLW5hbWUpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYXJuOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFByaW5jaXBhbFR5cGUuQVdTLFxuICAgICAgICBpZGVudGlmaWVyczogW3RoaXMuYXJuXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBBcm5QcmluY2lwYWwoJHt0aGlzLmFybn0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgYWRkaW5nIGEgY29uZGl0aW9uIHRoYXQgdGhlIHByaW5jaXBhbCBpcyBwYXJ0IG9mIHRoZSBzcGVjaWZpZWRcbiAgICogQVdTIE9yZ2FuaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBpbk9yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMud2l0aENvbmRpdGlvbnMoe1xuICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgIHZhcmlhYmxlOiBcImF3czpQcmluY2lwYWxPcmdJRFwiLFxuICAgICAgdmFsdWVzOiBbb3JnYW5pemF0aW9uSWRdLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgQXJuUHJpbmNpcGFsOiR7dGhpcy5hcm59YDtcbiAgfVxufVxuXG4vKipcbiAqIFNwZWNpZnkgQVdTIGFjY291bnQgSUQgYXMgdGhlIHByaW5jaXBhbCBlbnRpdHkgaW4gYSBwb2xpY3kgdG8gZGVsZWdhdGUgYXV0aG9yaXR5IHRvIHRoZSBhY2NvdW50LlxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFByaW5jaXBhbCBleHRlbmRzIEFyblByaW5jaXBhbCB7XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxBY2NvdW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50SWQgQVdTIGFjY291bnQgSUQgKGkuZS4gJzEyMzQ1Njc4OTAxMicpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYWNjb3VudElkOiBhbnkpIHtcbiAgICBzdXBlcihcbiAgICAgIG5ldyBBd3NTdGFja0RlcGVuZGVudFRva2VuKFxuICAgICAgICAoYXdzU3RhY2spID0+IGBhcm46JHthd3NTdGFjay5wYXJ0aXRpb259OmlhbTo6JHthY2NvdW50SWR9OnJvb3RgLFxuICAgICAgKS50b1N0cmluZygpLFxuICAgICk7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoYWNjb3VudElkKSAmJiB0eXBlb2YgYWNjb3VudElkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhY2NvdW50SWQgc2hvdWxkIGJlIG9mIHR5cGUgc3RyaW5nXCIpO1xuICAgIH1cbiAgICB0aGlzLnByaW5jaXBhbEFjY291bnQgPSBhY2NvdW50SWQ7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBBY2NvdW50UHJpbmNpcGFsKCR7dGhpcy5hY2NvdW50SWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIHNlcnZpY2UgcHJpbmNpcGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VQcmluY2lwYWxPcHRzIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gaW4gd2hpY2ggeW91IHdhbnQgdG8gcmVmZXJlbmNlIHRoZSBzZXJ2aWNlXG4gICAqXG4gICAqIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yICpjcm9zcy1yZWdpb24qIHJlZmVyZW5jZXMuXG4gICAqXG4gICAqIE5vdGU6IFdlIGFsd2F5cyByZXR1cm4gdGhlIGZ1bGwgc2VydmljZSBwcmluY2lwYWwgbmFtZSwgaW5jbHVkaW5nIHRoZSByZWdpb24uXG4gICAqIE5vcm1hbGx5LCB0aGUgcmVnaW9uIGlzIG9ubHkgcmVxdWlyZWQgZm9yICpvcHQtaW4qIHJlZ2lvbnMuIEluIHRob3NlXG4gICAqIGNhc2VzLCB0aGUgcmVnaW9uIG5hbWUgbmVlZHMgdG8gYmUgaW5jbHVkZWQgdG8gcmVmZXJlbmNlIHRoZSBjb3JyZWN0IHNlcnZpY2UgcHJpbmNpcGFsLlxuICAgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSBnbG9iYWwgc2VydmljZSBwcmluY2lwYWwgbmFtZSBpcyBzdWZmaWNpZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSByZXNvbHZpbmcgU3RhY2sncyByZWdpb24uXG4gICAqL1xuICByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgY29uZGl0aW9ucyB0byBhZGQgdG8gdGhlIFNlcnZpY2UgUHJpbmNpcGFsXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29uZGl0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgY29uZGl0aW9ucz86IENvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQW4gSUFNIHByaW5jaXBhbCB0aGF0IHJlcHJlc2VudHMgYW4gQVdTIHNlcnZpY2UgKGkuZS4gYHNxcy5hbWF6b25hd3MuY29tYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNlcnZpY2UgcHJpbmNpcGFsIG5hbWUgYmFzZWQgb24gdGhlIHJlZ2lvbiBpdCdzIHVzZWQgaW4uXG4gICAqXG4gICAqIFNvbWUgc2VydmljZSBwcmluY2lwYWwgbmFtZXMgdXNlZCB0byBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBwYXJ0aXRpb25zLFxuICAgKiBhbmQgc29tZSB3ZXJlIG5vdC5cbiAgICpcbiAgICogVGhlc2UgZGF5cyBhbGwgc2VydmljZSBwcmluY2lwYWwgbmFtZXMgYXJlIHN0YW5kYXJkaXplZCwgYW5kIHRoZXkgYXJlIGFsbFxuICAgKiBvZiB0aGUgZm9ybSBgPHNlcnZpY2VuYW1lPi5hbWF6b25hd3MuY29tYC5cbiAgICpcbiAgICogVG8gYXZvaWQgYnJlYWtpbmcgY2hhbmdlcywgaGFuZGxpbmcgaXMgcHJvdmlkZWQgZm9yIHNlcnZpY2VzIGFkZGVkIHdpdGggdGhlIGZvcm1hdHMgYmVsb3csXG4gICAqIGhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgaGFuZGxpbmcgd2lsbCBiZSBhZGRlZCBmb3IgbmV3IHJlZ2lvbnMgb3IgcGFydGl0aW9ucy5cbiAgICogICAtIHMzXG4gICAqICAgLSBzMy5hbWF6b25hd3MuY29tXG4gICAqICAgLSBzMy5hbWF6b25hd3MuY29tLmNuXG4gICAqICAgLSBzMy5jMnMuaWMuZ292XG4gICAqICAgLSBzMy5zYzJzLnNnb3YuZ292XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IHByaW5jaXBhbE5hbWUgPSBpYW0uU2VydmljZVByaW5jaXBhbC5zZXJ2aWNlUHJpbmNpcGFsTmFtZSgnZWMyJyk7XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlcnZpY2VQcmluY2lwYWxOYW1lKHNlcnZpY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4oc2VydmljZSwge30pLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlIGFuIEFXUyBzZXJ2aWNlLCBvcHRpb25hbGx5IGluIGEgZ2l2ZW4gcmVnaW9uXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlIEFXUyBzZXJ2aWNlIChpLmUuIHNxcy5hbWF6b25hd3MuY29tKVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IFNlcnZpY2VQcmluY2lwYWxPcHRzID0ge30sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5TRVJWSUNFLFxuICAgICAgICAgIGlkZW50aWZpZXJzOiBbXG4gICAgICAgICAgICBuZXcgU2VydmljZVByaW5jaXBhbFRva2VuKHRoaXMuc2VydmljZSwgdGhpcy5vcHRzKS50b1N0cmluZygpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdGhpcy5vcHRzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFNlcnZpY2VQcmluY2lwYWwoJHt0aGlzLnNlcnZpY2V9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBTZXJ2aWNlUHJpbmNpcGFsOiR7dGhpcy5zZXJ2aWNlfToke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0cyl9YDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhbiBBV1MgT3JnYW5pemF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb25QcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcmdhbml6YXRpb25JZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgKElEKSBvZiBhbiBvcmdhbml6YXRpb24gKGkuZS4gby0xMjM0NWFiY2RlKVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuQVdTLCBpZGVudGlmaWVyczogW1wiKlwiXSB9XSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiYXdzOlByaW5jaXBhbE9yZ0lEXCIsXG4gICAgICAgICAgdmFsdWVzOiBbdGhpcy5vcmdhbml6YXRpb25JZF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBPcmdhbml6YXRpb25QcmluY2lwYWwoJHt0aGlzLm9yZ2FuaXphdGlvbklkfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgT3JnYW5pemF0aW9uUHJpbmNpcGFsOiR7dGhpcy5vcmdhbml6YXRpb25JZH1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwb2xpY3kgcHJpbmNpcGFsIGZvciBjYW5vbmljYWxVc2VySWRzIC0gdXNlZnVsIGZvciBTMyBidWNrZXQgcG9saWNpZXMgdGhhdCB1c2VcbiAqIE9yaWdpbiBBY2Nlc3MgaWRlbnRpdGllcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dlbmVyYWwvbGF0ZXN0L2dyL2FjY3QtaWRlbnRpZmllcnMuaHRtbFxuICpcbiAqIGFuZFxuICpcbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9wcml2YXRlLWNvbnRlbnQtcmVzdHJpY3RpbmctYWNjZXNzLXRvLXMzLmh0bWxcbiAqXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIENhbm9uaWNhbFVzZXJQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjYW5vbmljYWxVc2VySWQgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgQVdTIGZvciBldmVyeSBhY2NvdW50LlxuICAgKiAgIHJvb3QgdXNlciBhbmQgSUFNIHVzZXJzIGZvciBhbiBhY2NvdW50IGFsbCBzZWUgdGhlIHNhbWUgSUQuXG4gICAqICAgKGkuZS4gNzlhNTlkZjkwMGI5NDllNTVkOTZhMWU2OThmYmFjZWRmZDZlMDlkOThlYWNmOGY4ZDUyMThlN2NkNDdlZjJiZSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBjYW5vbmljYWxVc2VySWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5DQU5PTklDQUxVU0VSLFxuICAgICAgICBpZGVudGlmaWVyczogW3RoaXMuY2Fub25pY2FsVXNlcklkXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBDYW5vbmljYWxVc2VyUHJpbmNpcGFsKCR7dGhpcy5jYW5vbmljYWxVc2VySWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBDYW5vbmljYWxVc2VyUHJpbmNpcGFsOiR7dGhpcy5jYW5vbmljYWxVc2VySWR9YDtcbiAgfVxufVxuXG4vKipcbiAqIFByaW5jaXBhbCBlbnRpdHkgdGhhdCByZXByZXNlbnRzIGEgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIHN1Y2ggYXMgQW1hem9uIENvZ25pdG8sXG4gKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGVtcG9yYXJ5IHNlY3VyaXR5IGNyZWRlbnRpYWxzIHRvIHVzZXJzIHdobyBoYXZlIGJlZW4gYXV0aGVudGljYXRlZC5cbiAqIEFkZGl0aW9uYWwgY29uZGl0aW9uIGtleXMgYXJlIGF2YWlsYWJsZSB3aGVuIHRoZSB0ZW1wb3Jhcnkgc2VjdXJpdHkgY3JlZGVudGlhbHMgYXJlIHVzZWQgdG8gbWFrZSBhIHJlcXVlc3QuXG4gKiBZb3UgY2FuIHVzZSB0aGVzZSBrZXlzIHRvIHdyaXRlIHBvbGljaWVzIHRoYXQgbGltaXQgdGhlIGFjY2VzcyBvZiBmZWRlcmF0ZWQgdXNlcnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2lhbS1jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXdpZlxuICovXG5leHBvcnQgY2xhc3MgRmVkZXJhdGVkUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25kaXRpb25zOiBDb25kaXRpb25zO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZmVkZXJhdGVkIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciAoaS5lLiAnY29nbml0by1pZGVudGl0eS5hbWF6b25hd3MuY29tJyBmb3IgdXNlcnMgYXV0aGVudGljYXRlZCB0aHJvdWdoIENvZ25pdG8pXG4gICAqIEBwYXJhbSBzZXNzaW9uVGFncyBXaGV0aGVyIHRvIGVuYWJsZSBzZXNzaW9uIHRhZ2dpbmcgKHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfc2Vzc2lvbi10YWdzLmh0bWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmVkZXJhdGVkOiBzdHJpbmcsXG4gICAgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICAgIGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIixcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29uZGl0aW9ucyA9IGNvbmRpdGlvbnM7XG4gICAgdGhpcy5hc3N1bWVSb2xlQWN0aW9uID0gYXNzdW1lUm9sZUFjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEZlZGVyYXRlZFByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgRmVkZXJhdGVkUHJpbmNpcGFsOiR7dGhpcy5mZWRlcmF0ZWR9OiR7dGhpcy5hc3N1bWVSb2xlQWN0aW9ufToke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZGl0aW9ucyl9YDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBhcyBXZWIgSWRlbnRpdHkgc3VjaCBhcyBDb2duaXRvLCBBbWF6b24sXG4gKiBGYWNlYm9vaywgR29vZ2xlLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJJZGVudGl0eVByaW5jaXBhbCBleHRlbmRzIEZlZGVyYXRlZFByaW5jaXBhbCB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHlQcm92aWRlciBpZGVudGl0eSBwcm92aWRlciAoaS5lLiAnY29nbml0by1pZGVudGl0eS5hbWF6b25hd3MuY29tJyBmb3IgdXNlcnMgYXV0aGVudGljYXRlZCB0aHJvdWdoIENvZ25pdG8pXG4gICAqIEBwYXJhbSBjb25kaXRpb25zIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiAgIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICogQHBhcmFtIHNlc3Npb25UYWdzIFdoZXRoZXIgdG8gZW5hYmxlIHNlc3Npb24gdGFnZ2luZyAoc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9zZXNzaW9uLXRhZ3MuaHRtbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKGlkZW50aXR5UHJvdmlkZXI6IHN0cmluZywgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdKSB7XG4gICAgc3VwZXIoaWRlbnRpdHlQcm92aWRlciwgY29uZGl0aW9ucyA/PyB7fSwgXCJzdHM6QXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eVwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFdlYklkZW50aXR5UHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHByaW5jaXBhbCB0aGF0IHJlcHJlc2VudHMgYSBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgYXMgZnJvbSBhIE9wZW5JRCBDb25uZWN0IHByb3ZpZGVyLlxuICovXG5leHBvcnQgY2xhc3MgT3BlbklkQ29ubmVjdFByaW5jaXBhbCBleHRlbmRzIFdlYklkZW50aXR5UHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcGVuSWRDb25uZWN0UHJvdmlkZXIgT3BlbklEIENvbm5lY3QgcHJvdmlkZXJcbiAgICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqICAgU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgb3BlbklkQ29ubmVjdFByb3ZpZGVyOiBJT3BlbklkQ29ubmVjdFByb3ZpZGVyLFxuICAgIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMgPSBbXSxcbiAgKSB7XG4gICAgc3VwZXIob3BlbklkQ29ubmVjdFByb3ZpZGVyLm9wZW5JZENvbm5lY3RQcm92aWRlckFybiwgY29uZGl0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5GRURFUkFURUQsIGlkZW50aWZpZXJzOiBbdGhpcy5mZWRlcmF0ZWRdIH1dLFxuICAgICAgdGhpcy5jb25kaXRpb25zLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBPcGVuSWRDb25uZWN0UHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmluY2lwYWwgZW50aXR5IHRoYXQgcmVwcmVzZW50cyBhIFNBTUwgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBTYW1sUHJpbmNpcGFsIGV4dGVuZHMgRmVkZXJhdGVkUHJpbmNpcGFsIHtcbiAgY29uc3RydWN0b3Ioc2FtbFByb3ZpZGVyOiBJU2FtbFByb3ZpZGVyLCBjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgc3VwZXIoc2FtbFByb3ZpZGVyLnNhbWxQcm92aWRlckFybiwgY29uZGl0aW9ucywgXCJzdHM6QXNzdW1lUm9sZVdpdGhTQU1MXCIpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgU2FtbFByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpbmNpcGFsIGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBTQU1MIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBmb3JcbiAqIHByb2dyYW1tYXRpYyBhbmQgQVdTIE1hbmFnZW1lbnQgQ29uc29sZSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTYW1sQ29uc29sZVByaW5jaXBhbCBleHRlbmRzIFNhbWxQcmluY2lwYWwge1xuICAvKipcbiAgICogZW51bSBQYXJ0aXRpb24ge1xuICAgKiAgIERlZmF1bHQgPSAnYXdzJyxcbiAgICogICBDbiA9ICdhd3MtY24nLFxuICAgKiAgIFVzR292ID0gJ2F3cy11cy1nb3YnLFxuICAgKiAgIFVzSXNvID0gJ2F3cy1pc28nLFxuICAgKiAgIFVzSXNvQiA9ICdhd3MtaXNvLWInLFxuICAgKiAgIFVzSXNvRiA9ICdhd3MtaXNvLWYnLFxuICAgKiAgIEV1SXNvRSA9ICdhd3MtaXNvLWUnLFxuICAgKiB9XG4gICAqIFNBTUwgU2lnbiBPbiB1cmxzIGNvdWxkIGJlLi4uXG4gICAqIFtQYXJ0aXRpb24uRGVmYXVsdF06ICdodHRwczovL3NpZ25pbi5hd3MuYW1hem9uLmNvbS9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Dbl06ICdodHRwczovL3NpZ25pbi5hbWF6b25hd3MuY24vc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNHb3ZdOiAnaHR0cHM6Ly9zaWduaW4uYW1hem9uYXdzLXVzLWdvdi5jb20vc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNJc29dOiAnaHR0cHM6Ly9zaWduaW4uYzJzaG9tZS5pYy5nb3Yvc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNJc29CXTogJ2h0dHBzOi8vc2lnbmluLnNjMnNob21lLnNnb3YuZ292L3NhbWwnLFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHNhbWxQcm92aWRlciBUaGUgU0FNTCBwcm92aWRlclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2FtbFByb3ZpZGVyOiBJU2FtbFByb3ZpZGVyLCBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10pIHtcbiAgICBzdXBlcihzYW1sUHJvdmlkZXIsIFtcbiAgICAgIC4uLmNvbmRpdGlvbnMsXG4gICAgICAvLyBUT0RPOiBoYW5kbGUgY29sbGlzaW9ucyBvbiBcIlNBTUw6YXVkXCI/XG4gICAgICB7XG4gICAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICAgIHZhcmlhYmxlOiBcIlNBTUw6YXVkXCIsXG4gICAgICAgIHZhbHVlczogW1wiaHR0cHM6Ly9zaWduaW4uYXdzLmFtYXpvbi5jb20vc2FtbFwiXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBTYW1sQ29uc29sZVByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG59XG5cbi8qKlxuICogVXNlIHRoZSBBV1MgYWNjb3VudCBpbnRvIHdoaWNoIGEgc3RhY2sgaXMgZGVwbG95ZWQgYXMgdGhlIHByaW5jaXBhbCBlbnRpdHkgaW4gYSBwb2xpY3lcbiAqL1xuZXhwb3J0IGNsYXNzIEFjY291bnRSb290UHJpbmNpcGFsIGV4dGVuZHMgQWNjb3VudFByaW5jaXBhbCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgbmV3IEF3c1N0YWNrRGVwZW5kZW50VG9rZW4oKGF3c1N0YWNrKSA9PiBhd3NTdGFjay5hY2NvdW50KS50b1N0cmluZygpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFwiQWNjb3VudFJvb3RQcmluY2lwYWwoKVwiO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgcmVwcmVzZW50aW5nIGFsbCBBV1MgaWRlbnRpdGllcyBpbiBhbGwgYWNjb3VudHNcbiAqXG4gKiBTb21lIHNlcnZpY2VzIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIHlvdSBzcGVjaWZ5IGBQcmluY2lwYWw6ICcqJ2BcbiAqIG9yIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YCBpbiB0aGVpciByZXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYEFueVByaW5jaXBhbGAgcmVuZGVycyB0byBgUHJpbmNpcGFsOiB7IEFXUzogXCIqXCIgfWAuIFRoaXMgaXMgY29ycmVjdFxuICogbW9zdCBvZiB0aGUgdGltZSwgYnV0IGluIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRoZSBvdGhlciBwcmluY2lwYWwsXG4gKiB1c2UgYFN0YXJQcmluY2lwYWxgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbnlQcmluY2lwYWwgZXh0ZW5kcyBBcm5QcmluY2lwYWwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIipcIik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFwiQW55UHJpbmNpcGFsKClcIjtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHJlcHJlc2VudGluZyBhbGwgaWRlbnRpdGllcyBpbiBhbGwgYWNjb3VudHNcbiAqIEBkZXByZWNhdGVkIHVzZSBgQW55UHJpbmNpcGFsYFxuICovXG5leHBvcnQgY2xhc3MgQW55b25lIGV4dGVuZHMgQW55UHJpbmNpcGFsIHt9XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCB1c2VzIGEgbGl0ZXJhbCAnKicgaW4gdGhlIElBTSBKU09OIGxhbmd1YWdlXG4gKlxuICogU29tZSBzZXJ2aWNlcyBiZWhhdmUgZGlmZmVyZW50bHkgd2hlbiB5b3Ugc3BlY2lmeSBgUHJpbmNpcGFsOiBcIipcImBcbiAqIG9yIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YCBpbiB0aGVpciByZXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYFN0YXJQcmluY2lwYWxgIHJlbmRlcnMgdG8gYFByaW5jaXBhbDogKmAuIE1vc3Qgb2YgdGhlIHRpbWUsIHlvdVxuICogc2hvdWxkIHVzZSBgQW55UHJpbmNpcGFsYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgY2xhc3MgU3RhclByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50ID1cbiAgICBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLkFOWSxcbiAgICAgICAgaWRlbnRpZmllcnM6IFtcIipcIl0sXG4gICAgICB9LFxuICAgIF0pO1xuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJTdGFyUHJpbmNpcGFsKClcIjtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gXCJTdGFyUHJpbmNpcGFsXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcHJpbmNpcGFsIHRoYXQgaGFzIG11bHRpcGxlIHR5cGVzIG9mIHByaW5jaXBhbHMuIEEgY29tcG9zaXRlIHByaW5jaXBhbCBjYW5ub3RcbiAqIGhhdmUgY29uZGl0aW9ucy4gaS5lLiBtdWx0aXBsZSBTZXJ2aWNlUHJpbmNpcGFscyB0aGF0IGZvcm0gYSBjb21wb3NpdGUgcHJpbmNpcGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJpbmNpcGFscyA9IG5ldyBBcnJheTxJUHJpbmNpcGFsPigpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLnByaW5jaXBhbHM6IElQcmluY2lwYWxbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHByaW5jaXBhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ29tcG9zaXRlUHJpbmNpcGFscyBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYXQgbGVhc3QgMSBQcmluY2lwYWwgYnV0IG5vbmUgd2VyZSBwYXNzZWQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFzc3VtZVJvbGVBY3Rpb24gPSBwcmluY2lwYWxzWzBdLmFzc3VtZVJvbGVBY3Rpb247XG4gICAgdGhpcy5hZGRQcmluY2lwYWxzKC4uLnByaW5jaXBhbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgSUFNIHByaW5jaXBhbHMgdG8gdGhlIGNvbXBvc2l0ZSBwcmluY2lwYWwuIENvbXBvc2l0ZSBwcmluY2lwYWxzIGNhbm5vdCBoYXZlXG4gICAqIGNvbmRpdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcmluY2lwYWxzIElBTSBwcmluY2lwYWxzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcG9zaXRlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFkZFByaW5jaXBhbHMoLi4ucHJpbmNpcGFsczogSVByaW5jaXBhbFtdKTogdGhpcyB7XG4gICAgdGhpcy5fcHJpbmNpcGFscy5wdXNoKC4uLnByaW5jaXBhbHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9wcmluY2lwYWxzKSB7XG4gICAgICBkZWZhdWx0QWRkUHJpbmNpcGFsVG9Bc3N1bWVSb2xlKHAsIGRvYyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgLy8gV2Ugb25seSBoYXZlIGEgcHJvYmxlbSB3aXRoIGNvbmRpdGlvbnMgaWYgd2UgYXJlIHRyeWluZyB0byByZW5kZXIgY29tcG9zaXRlXG4gICAgLy8gcHJpbmNpcGFscyBpbnRvIGEgc2luZ2xlIHN0YXRlbWVudCAod2hpY2ggaXMgd2hlbiBgcG9saWN5RnJhZ21lbnRgIHdvdWxkIGdldCBjYWxsZWQpXG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gcC5wb2xpY3lGcmFnbWVudDtcbiAgICAgIGlmIChmcmFnbWVudC5jb25kaXRpb25zICYmIGZyYWdtZW50LmNvbmRpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDb21wb25lbnRzIG9mIGEgQ29tcG9zaXRlUHJpbmNpcGFsIG11c3Qgbm90IGhhdmUgY29uZGl0aW9ucy4gXCIgK1xuICAgICAgICAgICAgYFRyaWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGZyYWdtZW50OiAke0pTT04uc3RyaW5naWZ5KGZyYWdtZW50KX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByaW5jaXBhbHMgPSBuZXcgQXJyYXk8UHJpbmNpcGFsUHJvcHM+KCk7XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIG1lcmdlUHJpbmNpcGFsKHByaW5jaXBhbHMsIHAucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQocHJpbmNpcGFscyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBDb21wb3NpdGVQcmluY2lwYWwoJHt0aGlzLl9wcmluY2lwYWxzfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlubmVyID0gdGhpcy5fcHJpbmNpcGFscy5tYXAoQ29tcGFyYWJsZVByaW5jaXBhbC5kZWR1cGVTdHJpbmdGb3IpO1xuICAgIGlmIChpbm5lci5zb21lKCh4KSA9PiB4ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gYENvbXBvc2l0ZVByaW5jaXBhbFske2lubmVyLmpvaW4oXCIsXCIpfV1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByaW5jaXBhbHMgdGhhdCBtYWtlIHVwIHRoZSBDb21wb3NpdGVQcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJpbmNpcGFscygpOiBJUHJpbmNpcGFsW10ge1xuICAgIHJldHVybiB0aGlzLl9wcmluY2lwYWxzO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgUHJpbmNpcGFscyB0aGF0IHdyYXAgb3RoZXIgcHJpbmNpcGFsc1xuICovXG5hYnN0cmFjdCBjbGFzcyBQcmluY2lwYWxBZGFwdGVyIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uID0gdGhpcy53cmFwcGVkLmFzc3VtZVJvbGVBY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxBY2NvdW50ID0gdGhpcy53cmFwcGVkLnByaW5jaXBhbEFjY291bnQ7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHdyYXBwZWQ6IElQcmluY2lwYWwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZC5wb2xpY3lGcmFnbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLndyYXBwZWQuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGUgd3JhcHBlZCBwcmluY2lwYWwncyBkZWR1cGUgc3RyaW5nIChpZiBhdmFpbGFibGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXBwZW5kRGVkdXBlKGFwcGVuZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbm5lciA9IENvbXBhcmFibGVQcmluY2lwYWwuZGVkdXBlU3RyaW5nRm9yKHRoaXMud3JhcHBlZCk7XG4gICAgcmV0dXJuIGlubmVyICE9PSB1bmRlZmluZWRcbiAgICAgID8gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfToke2lubmVyfToke2FwcGVuZH1gXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgcHJpbmNpcGFscyB0aGF0IGNhbiBiZSBjb21wYXJlZC5cbiAqXG4gKiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIHByaW5jaXBhbHMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBiZSB2YWx1ZS1lcXVhbC5cbiAqIElkZW50aXR5LWVxdWFsIHByaW5jaXBhbHMgd2lsbCBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb21wYXJhYmxlUHJpbmNpcGFsIGV4dGVuZHMgSVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBzdHJpbmcgZm9ybWF0IG9mIHRoaXMgcHJpbmNpcGFsIHdoaWNoIHNob3VsZCBiZSBpZGVudGljYWwgaWYgdGhlIHR3b1xuICAgKiBwcmluY2lwYWxzIGFyZSB0aGUgc2FtZS5cbiAgICovXG4gIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciB3b3JraW5nIHdpdGggYElDb21wYXJhYmxlUHJpbmNpcGFsYHNcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBhcmFibGVQcmluY2lwYWwge1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGdpdmVuIHByaW5jaXBhbCBpcyBhIGNvbXBhcmFibGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzQ29tcGFyYWJsZVByaW5jaXBhbChcbiAgICB4OiBJUHJpbmNpcGFsLFxuICApOiB4IGlzIElDb21wYXJhYmxlUHJpbmNpcGFsIHtcbiAgICByZXR1cm4gXCJkZWR1cGVTdHJpbmdcIiBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGVkdXBlU3RyaW5nIG9mIHRoZSBnaXZlbiBwcmluY2lwYWwsIGlmIGF2YWlsYWJsZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWR1cGVTdHJpbmdGb3IoeDogSVByaW5jaXBhbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIENvbXBhcmFibGVQcmluY2lwYWwuaXNDb21wYXJhYmxlUHJpbmNpcGFsKHgpXG4gICAgICA/IHguZGVkdXBlU3RyaW5nKClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQW4gSUFNIHByaW5jaXBhbCB3aXRoIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBzcGVjaWZ5aW5nIHdoZW4gdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZGl0aW9ucywgc2VlOlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbFxuICovXG5leHBvcnQgY2xhc3MgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMgZXh0ZW5kcyBQcmluY2lwYWxBZGFwdGVyIHtcbiAgcHJpdmF0ZSBhZGRpdGlvbmFsQ29uZGl0aW9uczogQ29uZGl0aW9uTWFwID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpbmNpcGFsOiBJUHJpbmNpcGFsLCBjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgc3VwZXIocHJpbmNpcGFsKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY29uZGl0aW9ucykge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8yODUxMC9maWxlcyNkaWZmLTUwMjQ4ZjY3MWU5YjEzYTljYjM1YTYyNDQxZDcyODMyZGNhODliNmM3YWQ0YTg4YWE0ZmIyZWM4ZTY3NmI3Y2RcbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIGlmIChkb2Mubm9kZS5zY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCBhIGNvbmRpdGlvbiB0byBhIHByaW5jaXBhbCBvdXRzaWRlIG9mIGEgc3RhY2sgc2NvcGVcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIExhenkgaW1wb3J0IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydCBkZXBlbmRlbmNpZXMgZHVyaW5nIHN0YXJ0dXBcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3QgYWRhcHRlcjogdHlwZW9mIGltcG9ydChcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpID0gcmVxdWlyZShcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpO1xuICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gICAgICB0aGlzLndyYXBwZWQsXG4gICAgICBuZXcgYWRhcHRlci5NdXRhdGluZ1BvbGljeURvY3VtZW50QWRhcHRlcihkb2MsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgc3RhdGVtZW50LmFkZEFjdGlvbnModGhpcy5hc3N1bWVSb2xlQWN0aW9uKTtcbiAgICAgICAgc3RhdGVtZW50LmFkZENvbmRpdGlvbnMoLi4udGhpcy5jb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZGl0aW9uIHRvIHRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pIHtcbiAgICBpZiAoIXRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdKSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XSA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZGl0aW9uID1cbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV07XG4gICAgaWYgKGV4aXN0aW5nQ29uZGl0aW9uKSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XVtjb25kaXRpb24udmFyaWFibGVdID0ge1xuICAgICAgICAuLi5leGlzdGluZ0NvbmRpdGlvbixcbiAgICAgICAgLi4uY29uZGl0aW9uLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXSA9IGNvbmRpdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZGl0aW9uT2JqZWN0IHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogQSBjb25kaXRpb25PYmplY3QgaGFzIHRoZSBmb3JtYXQgb2YgdGVzdDogeyB2YXJpYWJsZTogdmFsdWUgfCB2YWx1ZXNbXSB9XG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBjb25kaXRpb24xID0geydTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogJzEnIH19O1xuICAgKiAvLyBvclxuICAgKiBjb25zdCBjb25kaXRpb24yID0geydTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogWycxJywgJzInXSB9fTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KHZhbHVlKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmICghaXNTdHJpbmdPckFycmF5T2ZTdHJpbmdzKHYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGRzIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuIEdvdCAke3Z9IGZvciBrZXkgJHtrfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICAgIHRlc3Q6IGtleSxcbiAgICAgICAgdmFyaWFibGU6IGssXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSBjb25kaXRpb25zIHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogVmFsdWVzIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yXG4gICAqIGFuZCBrZXkuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9ucyhjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgY29uZGl0aW9ucy5tYXAoKGMpID0+IHtcbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uKGMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgY29uZGl0aW9uT2JqZWN0cyB0byB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFZhbHVlcyBmcm9tIHRoZSBjb25kaXRpb25zIHBhcmFtZXRlciB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBvcGVyYXRvclxuICAgKiBhbmQga2V5LlxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHMoY29uZGl0aW9uczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25kaXRpb25zKSkge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb25PYmplY3Qoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiBTZWUgW3RoZSBJQU0gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmRpdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VDb25kaXRpb25zKFxuICAgICAgdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50LmNvbmRpdGlvbnMsXG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbHMsXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVkLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgLy8gSGF2ZSB0byBpbXBsZW1lbnQgdG9KU09OKCkgYmVjYXVzZSB0aGUgZGVmYXVsdCB3aWxsIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgIHJldHVybiB0aGlzLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbEpzb247XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kRGVkdXBlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZGl0aW9ucykpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmRpdGlvbnMoXG4gICAgcHJpbmNpcGFsQ29uZGl0aW9uczogQ29uZGl0aW9ucyxcbiAgICBhZGRpdGlvbmFsQ29uZGl0aW9uczogQ29uZGl0aW9uTWFwLFxuICApOiBDb25kaXRpb25zIHtcbiAgICBjb25zdCBtZXJnZWRDb25kaXRpb25zOiBDb25kaXRpb25NYXAgPSB7fTtcbiAgICBwcmluY2lwYWxDb25kaXRpb25zLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGlmICghbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdKSB7XG4gICAgICAgIG1lcmdlZENvbmRpdGlvbnNbYy50ZXN0XSA9IHt9O1xuICAgICAgfVxuICAgICAgbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdW2MudmFyaWFibGVdID0gYztcbiAgICB9KTtcblxuICAgIE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxDb25kaXRpb25zKS5mb3JFYWNoKChbdGVzdCwgY29uZGl0aW9uXSkgPT4ge1xuICAgICAgLy8gbWVyZ2UgdGhlIGNvbmRpdGlvbnMgaWYgb25lIG9mIHRoZSBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgdXNlcyBhblxuICAgICAgLy8gb3BlcmF0b3IgdGhhdCdzIGFscmVhZHkgdXNlZCBieSB0aGUgcHJpbmNpcGFsJ3MgY29uZGl0aW9ucyBtZXJnZSB0aGVcbiAgICAgIC8vIGlubmVyIHN0cnVjdHVyZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWVyZ2VkQ29uZGl0aW9uc1t0ZXN0XTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgbWVyZ2VkQ29uZGl0aW9uc1t0ZXN0XSA9IGNvbmRpdGlvbjtcbiAgICAgICAgcmV0dXJuOyAvLyBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBTdXBwb3J0IElSZXNvbHZhYmxlIENvbmRpdGlvbj9cbiAgICAgIC8vIC8vIGlmIGVpdGhlciB0aGUgZXhpc3RpbmcgY29uZGl0aW9uIG9yIHRoZSBuZXcgb25lIGNvbnRhaW4gdW5yZXNvbHZlZFxuICAgICAgLy8gLy8gdG9rZW5zLCBmYWlsIHRoZSBtZXJnZS4gdGhpcyBpcyBhcyBmYXIgYXMgd2UgZ28gYXQgdGhpcyBwb2ludC5cbiAgICAgIC8vIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoY29uZGl0aW9uKSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQoZXhpc3RpbmcpKSB7XG4gICAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIC8vICAgICBgbXVsdGlwbGUgXCIke3Rlc3R9XCIgY29uZGl0aW9ucyBjYW5ub3QgYmUgbWVyZ2VkIGlmIG9uZSBvZiB0aGVtIGNvbnRhaW5zIGFuIHVucmVzb2x2ZWQgdG9rZW5gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBUT0RPOiBWYWxpZGF0ZSBjb25kaXRpb24/XG4gICAgICAvLyB2YWxpZGF0ZUNvbmRpdGlvbk9iamVjdChleGlzdGluZyk7XG4gICAgICAvLyB2YWxpZGF0ZUNvbmRpdGlvbk9iamVjdChjb25kaXRpb24pO1xuXG4gICAgICBtZXJnZWRDb25kaXRpb25zW3Rlc3RdID0geyAuLi5leGlzdGluZywgLi4uY29uZGl0aW9uIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvQ29uZGl0aW9ucyhtZXJnZWRDb25kaXRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgc2Vzc2lvbiB0YWdzIG9uIHJvbGUgYXNzdW1wdGlvbnMgZnJvbSBhIHByaW5jaXBhbFxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNlc3Npb24gdGFncywgc2VlOlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3Nlc3Npb24tdGFncy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uVGFnc1ByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEFkYXB0ZXIge1xuICBjb25zdHJ1Y3RvcihwcmluY2lwYWw6IElQcmluY2lwYWwpIHtcbiAgICBzdXBlcihwcmluY2lwYWwpO1xuICB9XG5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8yODUxMC9maWxlcyNkaWZmLTUwMjQ4ZjY3MWU5YjEzYTljYjM1YTYyNDQxZDcyODMyZGNhODliNmM3YWQ0YTg4YWE0ZmIyZWM4ZTY3NmI3Y2RcbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIC8vIExhenkgaW1wb3J0IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydCBkZXBlbmRlbmNpZXMgZHVyaW5nIHN0YXJ0dXBcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3QgYWRhcHRlcjogdHlwZW9mIGltcG9ydChcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpID0gcmVxdWlyZShcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpO1xuICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gICAgICB0aGlzLndyYXBwZWQsXG4gICAgICBuZXcgYWRhcHRlci5NdXRhdGluZ1BvbGljeURvY3VtZW50QWRhcHRlcihkb2MsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgc3RhdGVtZW50LmFkZEFjdGlvbnMoXCJzdHM6VGFnU2Vzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kRGVkdXBlKFwiXCIpO1xuICB9XG59XG5cbi8qKlxuICogQWRkIGEgcHJpbmNpcGFsIHRvIGFuIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudCBpbiB0aGUgcmlnaHQgd2F5XG4gKlxuICogRGVsZWdhdGUgdG8gdGhlIHByaW5jaXBhbCBpZiBpdCBjYW4gZG8gdGhlIGpvYiBpdHNlbGYsIGRvIGEgZGVmYXVsdCBqb2IgaWYgaXQgY2FuJ3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0QWRkUHJpbmNpcGFsVG9Bc3N1bWVSb2xlKFxuICBwcmluY2lwYWw6IElQcmluY2lwYWwsXG4gIGRvYzogSVBvbGljeURvY3VtZW50LFxuKSB7XG4gIGlmIChpc0Fzc3VtZVJvbGVQcmluY2lwYWwocHJpbmNpcGFsKSkge1xuICAgIC8vIFByaW5jaXBhbCBrbm93cyBob3cgdG8gYWRkIGl0c2VsZlxuICAgIHByaW5jaXBhbC5hZGRUb0Fzc3VtZVJvbGVQb2xpY3koZG9jKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQcmluY2lwYWwgY2FuJ3QgYWRkIGl0c2VsZiwgd2UgZG8gaXQgZm9yIHRoZW1cbiAgICBkb2MuYWRkU3RhdGVtZW50cyhcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbcHJpbmNpcGFsLmFzc3VtZVJvbGVBY3Rpb25dLFxuICAgICAgICBwcmluY2lwYWxzOiBbcHJpbmNpcGFsXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBc3N1bWVSb2xlUHJpbmNpcGFsKFxuICBwcmluY2lwYWw6IElQcmluY2lwYWwsXG4pOiBwcmluY2lwYWwgaXMgSUFzc3VtZVJvbGVQcmluY2lwYWwge1xuICByZXR1cm4gISEocHJpbmNpcGFsIGFzIElBc3N1bWVSb2xlUHJpbmNpcGFsKS5hZGRUb0Fzc3VtZVJvbGVQb2xpY3k7XG59XG5cbi8qKlxuICogQSBsYXp5IHRva2VuIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgU3RhY2sgdG8gZXZhbHVhdGVcbiAqL1xuY2xhc3MgQXdzU3RhY2tEZXBlbmRlbnRUb2tlbiBpbXBsZW1lbnRzIElSZXNvbHZhYmxlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0aW9uU3RhY2s6IHN0cmluZ1tdO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZuOiAoc3BlYzogQXdzU3RhY2spID0+IGFueSkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBzdGFjayB0cmFjZXNcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9ibG9iL3YwLjIwLjkvcGFja2FnZXMvY2RrdGYvbGliL3Rva2Vucy9wcml2YXRlL3N0YWNrLXRyYWNlLnRzI0w5XG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9zdGFjay10cmFjZS50cyNMMjJcbiAgICB0aGlzLmNyZWF0aW9uU3RhY2sgPSBbXCJzdGFjayB0cmFjZXMgZGlzYWJsZWRcIl07XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5mbihBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChjb250ZXh0LnNjb3BlKSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04taWZ5IHRoZSB0b2tlblxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIFwiPHVucmVzb2x2ZWQtdG9rZW4+XCI7XG4gIH1cbn1cblxuY2xhc3MgU2VydmljZVByaW5jaXBhbFRva2VuIGltcGxlbWVudHMgSVJlc29sdmFibGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRpb25TdGFjazogc3RyaW5nW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogU2VydmljZVByaW5jaXBhbE9wdHMsXG4gICkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBzdGFjayB0cmFjZXNcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9ibG9iL3YwLjIwLjkvcGFja2FnZXMvY2RrdGYvbGliL3Rva2Vucy9wcml2YXRlL3N0YWNrLXRyYWNlLnRzI0w5XG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9zdGFjay10cmFjZS50cyNMMjJcbiAgICB0aGlzLmNyZWF0aW9uU3RhY2sgPSBbXCJzdGFjayB0cmFjZXMgZGlzYWJsZWRcIl07XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjdHg6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIGNvbnN0IGF3c1N0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QoY3R4LnNjb3BlKTtcbiAgICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgT3B0LUluIHJlZ2lvbnM/P1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1pYW0vbGliL3ByaW5jaXBhbHMudHMjTDUwNi1MNTEwXG4gICAgcmV0dXJuIGF3c1N0YWNrLnNlcnZpY2VQcmluY2lwYWxOYW1lKHRoaXMuc2VydmljZSwgdGhpcy5vcHRzLnJlZ2lvbik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMsIHtcbiAgICAgIGRpc3BsYXlIaW50OiB0aGlzLnNlcnZpY2UsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHRva2VuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4gYDwke3RoaXMuc2VydmljZX0+YDtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIHR3byBhcnJheXMgdGhhdCByZXByZXNlbnQgSUFNIHByaW5jaXBhbHNcbiAqXG4gKiBEb2VzIGFuIGluLXBsYWNlIG1lcmdlIGludG8gdGFyZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmluY2lwYWwoXG4gIHRhcmdldDogUHJpbmNpcGFsUHJvcHNbXSxcbiAgc291cmNlOiBQcmluY2lwYWxQcm9wc1tdLFxuKSB7XG4gIC8vIGlmIG9uZSByZXByZXNlbnRzIHRoZSBzdGFyUHJpbmNpcGFsIHRoZSBvdGhlciBvbmUgbXVzdCBiZSBlbXB0eVxuICBpZiAoXG4gICAgKGhhc1N0YXJQcmluY2lwYWwodGFyZ2V0KSAmJiBzb3VyY2UubGVuZ3RoID4gMCkgfHxcbiAgICAoaGFzU3RhclByaW5jaXBhbChzb3VyY2UpICYmIHRhcmdldC5sZW5ndGggPiAwKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IG1lcmdlIHByaW5jaXBhbHMgJHtKU09OLnN0cmluZ2lmeSh0YXJnZXQpfSBhbmQgJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfTsgaWYgb25lIHVzZXMgYSB0aGUgU3RhclByaW5jaXBhbCBzdHJpbmcgdGhlIG90aGVyIG9uZSBtdXN0IGJlIGVtcHR5YCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0TWFwOiBNYXA8UHJpbmNpcGFsVHlwZSwgUHJpbmNpcGFsUHJvcHM+ID0gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiB0YXJnZXQpIHtcbiAgICB0YXJnZXRNYXAuc2V0KHByaW5jaXBhbC50eXBlLCBwcmluY2lwYWwpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQcmluY2lwYWwgb2Ygc291cmNlKSB7XG4gICAgY29uc3QgeyB0eXBlLCBpZGVudGlmaWVyczogc291cmNlSWRlbnRpZmllcnMgfSA9IHNvdXJjZVByaW5jaXBhbDtcbiAgICBpZiAodGFyZ2V0TWFwLmhhcyh0eXBlKSkge1xuICAgICAgY29uc3QgdGFyZ2V0SW5kZW50aWZpZXJTZXQgPSBuZXcgU2V0KHRhcmdldE1hcC5nZXQodHlwZSkhLmlkZW50aWZpZXJzKTtcbiAgICAgIGZvciAoY29uc3QgaWQgb2Ygc291cmNlSWRlbnRpZmllcnMpIHtcbiAgICAgICAgdGFyZ2V0SW5kZW50aWZpZXJTZXQuYWRkKGlkKTtcbiAgICAgIH1cbiAgICAgIC8vIFVwZGF0ZSB0aGUgdGFyZ2V0IGlkZW50aWZpZXJzIGluLXBsYWNlXG4gICAgICBjb25zdCBpbmRleCA9IHRhcmdldC5maW5kSW5kZXgoKHByaW5jaXBhbCkgPT4gcHJpbmNpcGFsLnR5cGUgPT09IHR5cGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0ge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgaWRlbnRpZmllcnM6IEFycmF5LmZyb20odGFyZ2V0SW5kZW50aWZpZXJTZXQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucHVzaCh7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbLi4uc291cmNlSWRlbnRpZmllcnNdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBQcmluY2lwYWxQcm9wcyBhcnJheSBjb250YWlucyB0aGUgU3RhclByaW5jaXBhbDpcbiAqIHR5cGUgPSBQcmluY2lwYWxUeXBlLkFOWSBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdXG4gKi9cbmZ1bmN0aW9uIGhhc1N0YXJQcmluY2lwYWwocHJpbmNpcGFsczogUHJpbmNpcGFsUHJvcHNbXSkge1xuICAvLyBUT0RPOiBEb2VzIGhhdmluZyBtb3JlIHRoYW4gMSBwcmluY2lwYWwgbWFrZSBzZW5zZSBpZiBvbmUgb2YgdGhlbSBpcyB0aGUgU3RhclByaW5jaXBhbD9cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByaW5jaXBhbHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgcHJpbmNpcGFsID0gcHJpbmNpcGFsc1tpbmRleF07XG4gICAgaWYgKFxuICAgICAgcHJpbmNpcGFsLnR5cGUgPT09IFByaW5jaXBhbFR5cGUuQU5ZICYmXG4gICAgICBwcmluY2lwYWwuaWRlbnRpZmllcnMubGVuZ3RoID09PSAxICYmXG4gICAgICBwcmluY2lwYWwuaWRlbnRpZmllcnNbMF0gPT09IFwiKlwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19