terraconstructs 0.0.25 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/.jsii +83665 -54911
  2. package/.mise.toml +1 -1
  3. package/.nvmrc +1 -1
  4. package/LICENSE +202 -674
  5. package/lib/asset-manager.d.ts +23 -0
  6. package/lib/asset-manager.js +3 -0
  7. package/lib/asset-staging.d.ts +178 -0
  8. package/lib/asset-staging.js +589 -0
  9. package/lib/assets.d.ts +359 -0
  10. package/lib/assets.js +55 -0
  11. package/lib/aws/arn.js +16 -15
  12. package/lib/aws/aws-asset-manager.d.ts +91 -0
  13. package/lib/aws/aws-asset-manager.js +244 -0
  14. package/lib/aws/aws-construct.js +1 -1
  15. package/lib/aws/aws-stack.d.ts +37 -0
  16. package/lib/aws/aws-stack.js +30 -9
  17. package/lib/aws/aws-tags.js +2 -2
  18. package/lib/aws/cloudwatch/actions/appscaling.d.ts +15 -0
  19. package/lib/aws/cloudwatch/actions/appscaling.js +24 -0
  20. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  21. package/lib/aws/cloudwatch/actions/index.d.ts +3 -0
  22. package/lib/aws/cloudwatch/actions/index.js +4 -4
  23. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  24. package/lib/aws/cloudwatch/actions/sns.d.ts +14 -0
  25. package/lib/aws/cloudwatch/actions/sns.js +23 -0
  26. package/lib/aws/cloudwatch/actions/ssm.d.ts +72 -0
  27. package/lib/aws/cloudwatch/actions/ssm.js +104 -0
  28. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  29. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  30. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  31. package/lib/aws/cloudwatch/alarm.js +1 -1
  32. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  33. package/lib/aws/cloudwatch/dashboard.js +1 -1
  34. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  35. package/lib/aws/cloudwatch/graph.js +8 -8
  36. package/lib/aws/cloudwatch/layout.js +3 -3
  37. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  38. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  39. package/lib/aws/cloudwatch/log-group.js +1 -1
  40. package/lib/aws/cloudwatch/log-query.js +1 -1
  41. package/lib/aws/cloudwatch/log-stream.js +1 -1
  42. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  43. package/lib/aws/cloudwatch/metric.js +2 -2
  44. package/lib/aws/cloudwatch/pattern.js +3 -3
  45. package/lib/aws/cloudwatch/policy.js +1 -1
  46. package/lib/aws/cloudwatch/query-definition.js +2 -2
  47. package/lib/aws/cloudwatch/stats.js +1 -1
  48. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  49. package/lib/aws/cloudwatch/text.js +1 -1
  50. package/lib/aws/cloudwatch/variable.js +3 -3
  51. package/lib/aws/cloudwatch/widget.js +1 -1
  52. package/lib/aws/compute/access-log.d.ts +478 -0
  53. package/lib/aws/compute/access-log.js +649 -0
  54. package/lib/aws/compute/activity.js +1 -1
  55. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  56. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  57. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  58. package/lib/aws/compute/alb/application-listener.js +1 -1
  59. package/lib/aws/compute/alb/application-load-balancer.js +1 -1
  60. package/lib/aws/compute/alb/application-target-group.js +1 -1
  61. package/lib/aws/compute/alb/conditions.js +1 -1
  62. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  63. package/lib/aws/compute/alb/trust-store.js +1 -1
  64. package/lib/aws/compute/api-definition.d.ts +106 -0
  65. package/lib/aws/compute/api-definition.js +200 -0
  66. package/lib/aws/compute/api-key.d.ts +184 -0
  67. package/lib/aws/compute/api-key.js +197 -0
  68. package/lib/aws/compute/apigateway-canned-metrics.generated.d.ts +169 -0
  69. package/lib/aws/compute/apigateway-canned-metrics.generated.js +63 -0
  70. package/lib/aws/compute/apigateway-util.d.ts +31 -0
  71. package/lib/aws/compute/apigateway-util.js +152 -0
  72. package/lib/aws/compute/architecture.js +1 -1
  73. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  74. package/lib/aws/compute/authorizer.d.ts +35 -0
  75. package/lib/aws/compute/authorizer.js +28 -0
  76. package/lib/aws/compute/authorizers/identity-source.d.ts +37 -0
  77. package/lib/aws/compute/authorizers/identity-source.js +61 -0
  78. package/lib/aws/compute/authorizers/index.d.ts +2 -0
  79. package/lib/aws/compute/authorizers/index.js +20 -0
  80. package/lib/aws/compute/authorizers/lambda.d.ts +140 -0
  81. package/lib/aws/compute/authorizers/lambda.js +208 -0
  82. package/lib/aws/compute/base-path-mapping.d.ts +49 -0
  83. package/lib/aws/compute/base-path-mapping.js +52 -0
  84. package/lib/aws/compute/base-scalable-attribute.js +3 -3
  85. package/lib/aws/compute/bastion-host.js +1 -1
  86. package/lib/aws/compute/chain.js +1 -1
  87. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  88. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  89. package/lib/aws/compute/client-vpn-route.js +2 -2
  90. package/lib/aws/compute/code.d.ts +415 -0
  91. package/lib/aws/compute/code.js +424 -0
  92. package/lib/aws/compute/condition.js +1 -1
  93. package/lib/aws/compute/connections.js +1 -1
  94. package/lib/aws/compute/cors.d.ts +102 -0
  95. package/lib/aws/compute/cors.js +33 -0
  96. package/lib/aws/compute/deployment.d.ts +83 -0
  97. package/lib/aws/compute/deployment.js +158 -0
  98. package/lib/aws/compute/domain-name.d.ts +153 -0
  99. package/lib/aws/compute/domain-name.js +158 -0
  100. package/lib/aws/compute/event-invoke-config.d.ts +2 -2
  101. package/lib/aws/compute/event-invoke-config.js +4 -4
  102. package/lib/aws/compute/event-source-filter.js +2 -2
  103. package/lib/aws/compute/event-source-mapping.d.ts +2 -2
  104. package/lib/aws/compute/event-source-mapping.js +9 -7
  105. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  106. package/lib/aws/compute/event-sources/s3.js +1 -1
  107. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  108. package/lib/aws/compute/event-sources/sqs.js +3 -2
  109. package/lib/aws/compute/fields.js +4 -4
  110. package/lib/aws/compute/function-alias.d.ts +1 -0
  111. package/lib/aws/compute/function-alias.js +8 -2
  112. package/lib/aws/compute/function-base.d.ts +15 -0
  113. package/lib/aws/compute/function-base.js +4 -4
  114. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  115. package/lib/aws/compute/function-destinations/function.js +1 -1
  116. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  117. package/lib/aws/compute/function-nodejs/bundling.d.ts +75 -0
  118. package/lib/aws/compute/function-nodejs/bundling.js +405 -0
  119. package/lib/aws/compute/function-nodejs/function.d.ts +99 -0
  120. package/lib/aws/compute/function-nodejs/function.js +175 -0
  121. package/lib/aws/compute/function-nodejs/index.d.ts +2 -0
  122. package/lib/aws/compute/function-nodejs/index.js +19 -0
  123. package/lib/aws/compute/function-nodejs/package-installation.d.ts +8 -0
  124. package/lib/aws/compute/function-nodejs/package-installation.js +36 -0
  125. package/lib/aws/compute/function-nodejs/package-manager.d.ts +33 -0
  126. package/lib/aws/compute/function-nodejs/package-manager.js +99 -0
  127. package/lib/aws/compute/function-nodejs/types.d.ts +410 -0
  128. package/lib/aws/compute/function-nodejs/types.js +81 -0
  129. package/lib/aws/compute/function-nodejs/util.d.ts +60 -0
  130. package/lib/aws/compute/function-nodejs/util.js +202 -0
  131. package/lib/aws/compute/function-url.d.ts +2 -2
  132. package/lib/aws/compute/function-url.js +4 -4
  133. package/lib/aws/compute/function.d.ts +34 -4
  134. package/lib/aws/compute/function.js +91 -17
  135. package/lib/aws/compute/gateway-response.d.ts +157 -0
  136. package/lib/aws/compute/gateway-response.js +156 -0
  137. package/lib/aws/compute/handler.d.ts +10 -0
  138. package/lib/aws/compute/handler.js +20 -0
  139. package/lib/aws/compute/index.d.ts +27 -0
  140. package/lib/aws/compute/index.js +29 -1
  141. package/lib/aws/compute/instance-types.js +1 -1
  142. package/lib/aws/compute/instance.js +1 -1
  143. package/lib/aws/compute/integration.d.ts +311 -0
  144. package/lib/aws/compute/integration.js +165 -0
  145. package/lib/aws/compute/integrations/aws.d.ts +72 -0
  146. package/lib/aws/compute/integrations/aws.js +55 -0
  147. package/lib/aws/compute/integrations/http.d.ts +37 -0
  148. package/lib/aws/compute/integrations/http.js +35 -0
  149. package/lib/aws/compute/integrations/index.d.ts +6 -0
  150. package/lib/aws/compute/integrations/index.js +24 -0
  151. package/lib/aws/compute/integrations/lambda.d.ts +40 -0
  152. package/lib/aws/compute/integrations/lambda.js +73 -0
  153. package/lib/aws/compute/integrations/mock.d.ts +16 -0
  154. package/lib/aws/compute/integrations/mock.js +30 -0
  155. package/lib/aws/compute/integrations/request-context.d.ts +144 -0
  156. package/lib/aws/compute/integrations/request-context.js +3 -0
  157. package/lib/aws/compute/integrations/stepfunctions.d.ts +102 -0
  158. package/lib/aws/compute/integrations/stepfunctions.js +268 -0
  159. package/lib/aws/compute/ip-addresses.js +2 -2
  160. package/lib/aws/compute/ipam.js +1 -1
  161. package/lib/aws/compute/json-schema.d.ts +75 -0
  162. package/lib/aws/compute/json-schema.js +23 -0
  163. package/lib/aws/compute/key-pair.js +1 -1
  164. package/lib/aws/compute/lambda-api.d.ts +46 -0
  165. package/lib/aws/compute/lambda-api.js +64 -0
  166. package/lib/aws/compute/launch-template.js +2 -2
  167. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  168. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  169. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  170. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  171. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  172. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  173. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  174. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  175. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  176. package/lib/aws/compute/load-balancer.js +3 -3
  177. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  178. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  179. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  180. package/lib/aws/compute/machine-image/common.js +1 -1
  181. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  182. package/lib/aws/compute/method.d.ts +219 -0
  183. package/lib/aws/compute/method.js +396 -0
  184. package/lib/aws/compute/methodresponse.d.ts +28 -0
  185. package/lib/aws/compute/methodresponse.js +3 -0
  186. package/lib/aws/compute/model.d.ts +143 -0
  187. package/lib/aws/compute/model.js +141 -0
  188. package/lib/aws/compute/nat.js +5 -5
  189. package/lib/aws/compute/network-acl-types.js +2 -2
  190. package/lib/aws/compute/network-acl.js +3 -3
  191. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  192. package/lib/aws/compute/nlb/network-listener.js +1 -1
  193. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  194. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  195. package/lib/aws/compute/peer.js +1 -1
  196. package/lib/aws/compute/placement-group.js +1 -1
  197. package/lib/aws/compute/port.js +1 -1
  198. package/lib/aws/compute/prefix-list.js +1 -1
  199. package/lib/aws/compute/requestvalidator.d.ts +50 -0
  200. package/lib/aws/compute/requestvalidator.js +59 -0
  201. package/lib/aws/compute/resource.d.ts +223 -0
  202. package/lib/aws/compute/resource.js +316 -0
  203. package/lib/aws/compute/restapi.d.ts +510 -0
  204. package/lib/aws/compute/restapi.js +626 -0
  205. package/lib/aws/compute/route.js +8 -8
  206. package/lib/aws/compute/runtime.d.ts +282 -0
  207. package/lib/aws/compute/runtime.js +337 -0
  208. package/lib/aws/compute/scalable-target.js +3 -3
  209. package/lib/aws/compute/schedule.js +3 -3
  210. package/lib/aws/compute/security-group.js +1 -1
  211. package/lib/aws/compute/stage.d.ts +350 -0
  212. package/lib/aws/compute/stage.js +304 -0
  213. package/lib/aws/compute/state-graph.js +1 -1
  214. package/lib/aws/compute/state-machine-fragment.js +1 -1
  215. package/lib/aws/compute/state-machine.js +4 -4
  216. package/lib/aws/compute/states/choice.js +1 -1
  217. package/lib/aws/compute/states/custom-state.js +1 -1
  218. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  219. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  220. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  221. package/lib/aws/compute/states/distributed-map.js +1 -1
  222. package/lib/aws/compute/states/fail.js +1 -1
  223. package/lib/aws/compute/states/map-base.js +1 -1
  224. package/lib/aws/compute/states/map.js +1 -1
  225. package/lib/aws/compute/states/parallel.js +1 -1
  226. package/lib/aws/compute/states/pass.js +2 -2
  227. package/lib/aws/compute/states/state.js +1 -1
  228. package/lib/aws/compute/states/succeed.js +1 -1
  229. package/lib/aws/compute/states/task-base.js +2 -2
  230. package/lib/aws/compute/states/task.js +1 -1
  231. package/lib/aws/compute/states/wait.js +2 -2
  232. package/lib/aws/compute/step-scaling-action.js +3 -3
  233. package/lib/aws/compute/step-scaling-policy.js +1 -1
  234. package/lib/aws/compute/stepfunctions-api.d.ts +103 -0
  235. package/lib/aws/compute/stepfunctions-api.js +39 -0
  236. package/lib/aws/compute/subnet-v2.js +2 -2
  237. package/lib/aws/compute/subnet.js +1 -1
  238. package/lib/aws/compute/target-tracking-scaling-policy.js +3 -3
  239. package/lib/aws/compute/task-credentials.js +1 -1
  240. package/lib/aws/compute/task-input.js +1 -1
  241. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  242. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  243. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  244. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  245. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  246. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  247. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  248. package/lib/aws/compute/types.js +1 -1
  249. package/lib/aws/compute/usage-plan.d.ts +194 -0
  250. package/lib/aws/compute/usage-plan.js +174 -0
  251. package/lib/aws/compute/user-data.js +3 -3
  252. package/lib/aws/compute/volume.js +2 -2
  253. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  254. package/lib/aws/compute/vpc-endpoint.js +6 -6
  255. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  256. package/lib/aws/compute/vpc-link.d.ts +104 -0
  257. package/lib/aws/compute/vpc-link.js +137 -0
  258. package/lib/aws/compute/vpc-v2-base.js +1 -1
  259. package/lib/aws/compute/vpc-v2.js +2 -2
  260. package/lib/aws/compute/vpc.js +4 -4
  261. package/lib/aws/compute/vpn.js +3 -3
  262. package/lib/aws/edge/certificate.js +1 -1
  263. package/lib/aws/edge/distribution.js +3 -3
  264. package/lib/aws/edge/dns-alias-record-targets.js +3 -3
  265. package/lib/aws/edge/dns-record.js +13 -13
  266. package/lib/aws/edge/dns-zone.js +1 -1
  267. package/lib/aws/edge/function.js +2 -2
  268. package/lib/aws/edge/key-value-store.js +4 -4
  269. package/lib/aws/edge/origin.js +3 -3
  270. package/lib/aws/edge/response-headers-policy.js +1 -1
  271. package/lib/aws/encryption/alias.js +1 -1
  272. package/lib/aws/encryption/key.js +1 -1
  273. package/lib/aws/encryption/via-service-principal.js +1 -1
  274. package/lib/aws/iam/grant.js +2 -2
  275. package/lib/aws/iam/group.js +1 -1
  276. package/lib/aws/iam/instance-profile.js +1 -1
  277. package/lib/aws/iam/managed-policy.js +1 -1
  278. package/lib/aws/iam/oidc-provider.js +1 -1
  279. package/lib/aws/iam/policy-document.js +1 -1
  280. package/lib/aws/iam/policy-statement.js +1 -1
  281. package/lib/aws/iam/policy.js +1 -1
  282. package/lib/aws/iam/principals.js +20 -20
  283. package/lib/aws/iam/role.js +1 -1
  284. package/lib/aws/iam/saml-provider.js +2 -2
  285. package/lib/aws/iam/unknown-principal.js +1 -1
  286. package/lib/aws/iam/user.js +5 -5
  287. package/lib/aws/index.d.ts +1 -0
  288. package/lib/aws/index.js +4 -1
  289. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  290. package/lib/aws/network/subnet-group.js +3 -3
  291. package/lib/aws/network/subnet.js +4 -4
  292. package/lib/aws/notify/archive.js +1 -1
  293. package/lib/aws/notify/connection.js +3 -3
  294. package/lib/aws/notify/event-bus.js +3 -3
  295. package/lib/aws/notify/event-pattern.js +1 -1
  296. package/lib/aws/notify/input.js +2 -2
  297. package/lib/aws/notify/kinesis-stream.js +1 -1
  298. package/lib/aws/notify/notification-rule.d.ts +1 -1
  299. package/lib/aws/notify/notification-rule.js +5 -5
  300. package/lib/aws/notify/policy.js +1 -1
  301. package/lib/aws/notify/queue-policy.js +1 -1
  302. package/lib/aws/notify/queue.js +1 -1
  303. package/lib/aws/notify/resource-policy.js +1 -1
  304. package/lib/aws/notify/rule.js +1 -1
  305. package/lib/aws/notify/schedule.js +1 -1
  306. package/lib/aws/notify/subscription-filter.js +1 -1
  307. package/lib/aws/notify/subscription.js +4 -4
  308. package/lib/aws/notify/subscriptions/email.js +1 -1
  309. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  310. package/lib/aws/notify/subscriptions/sms.js +1 -1
  311. package/lib/aws/notify/subscriptions/sqs.js +1 -1
  312. package/lib/aws/notify/subscriptions/url.js +1 -1
  313. package/lib/aws/notify/targets/event-bus.js +1 -1
  314. package/lib/aws/notify/targets/function.js +1 -1
  315. package/lib/aws/notify/targets/log-group.js +2 -2
  316. package/lib/aws/notify/targets/sqs.js +1 -1
  317. package/lib/aws/notify/targets/state-machine.js +1 -1
  318. package/lib/aws/notify/topic-base.js +1 -1
  319. package/lib/aws/notify/topic.js +6 -5
  320. package/lib/aws/partition.d.ts +21 -0
  321. package/lib/aws/partition.js +42 -0
  322. package/lib/aws/storage/assets/image-asset.d.ts +379 -0
  323. package/lib/aws/storage/assets/image-asset.js +247 -0
  324. package/lib/aws/storage/assets/index.d.ts +2 -0
  325. package/lib/aws/storage/assets/index.js +21 -0
  326. package/lib/aws/storage/assets/s3.d.ts +125 -0
  327. package/lib/aws/storage/assets/s3.js +80 -0
  328. package/lib/aws/storage/auth-token.d.ts +25 -0
  329. package/lib/aws/storage/auth-token.js +54 -0
  330. package/lib/aws/storage/billing.js +1 -1
  331. package/lib/aws/storage/bucket-notifications.js +1 -1
  332. package/lib/aws/storage/bucket-policy.js +1 -1
  333. package/lib/aws/storage/bucket-source.d.ts +1 -1
  334. package/lib/aws/storage/bucket-source.js +4 -4
  335. package/lib/aws/storage/bucket.d.ts +14 -6
  336. package/lib/aws/storage/bucket.js +48 -40
  337. package/lib/aws/storage/capacity.js +1 -1
  338. package/lib/aws/storage/ecr-lifecycle.d.ts +88 -0
  339. package/lib/aws/storage/ecr-lifecycle.js +23 -0
  340. package/lib/aws/storage/ecr-repository.d.ts +446 -0
  341. package/lib/aws/storage/ecr-repository.js +685 -0
  342. package/lib/aws/storage/encryption.js +1 -1
  343. package/lib/aws/storage/index.d.ts +5 -0
  344. package/lib/aws/storage/index.js +10 -3
  345. package/lib/aws/storage/location.d.ts +17 -0
  346. package/lib/aws/storage/location.js +4 -0
  347. package/lib/aws/storage/notification-targets/function.js +1 -1
  348. package/lib/aws/storage/notification-targets/queue.js +1 -1
  349. package/lib/aws/storage/origin-access-identity.js +1 -1
  350. package/lib/aws/storage/parameter.js +2 -2
  351. package/lib/aws/storage/table.js +3 -3
  352. package/lib/aws/storage/util.d.ts +8 -20
  353. package/lib/aws/storage/util.js +56 -34
  354. package/lib/aws/util.d.ts +1 -0
  355. package/lib/aws/util.js +6 -1
  356. package/lib/bundling.d.ts +434 -0
  357. package/lib/bundling.js +368 -0
  358. package/lib/construct-base.js +2 -2
  359. package/lib/duration.js +1 -1
  360. package/lib/expiration.js +1 -1
  361. package/lib/fs/copy.d.ts +2 -0
  362. package/lib/fs/copy.js +57 -0
  363. package/lib/fs/fingerprint.d.ts +21 -0
  364. package/lib/fs/fingerprint.js +165 -0
  365. package/lib/fs/ignore.d.ts +107 -0
  366. package/lib/fs/ignore.js +190 -0
  367. package/lib/fs/index.d.ts +47 -0
  368. package/lib/fs/index.js +88 -0
  369. package/lib/fs/options.d.ts +110 -0
  370. package/lib/fs/options.js +60 -0
  371. package/lib/fs/utils.d.ts +11 -0
  372. package/lib/fs/utils.js +34 -0
  373. package/lib/index.d.ts +5 -0
  374. package/lib/index.js +7 -1
  375. package/lib/private/asset-staging.d.ts +83 -0
  376. package/lib/private/asset-staging.js +205 -0
  377. package/lib/private/cache.d.ts +17 -0
  378. package/lib/private/cache.js +35 -0
  379. package/lib/private/jsii-deprecated.d.ts +2 -0
  380. package/lib/private/jsii-deprecated.js +19 -0
  381. package/lib/private/unique-resource-name.js +3 -2
  382. package/lib/size.js +1 -1
  383. package/lib/stack-base.js +1 -1
  384. package/lib/terra-func.js +2 -2
  385. package/lib/time-zone.js +1 -1
  386. package/node_modules/@balena/dockerignore/CHANGELOG.md +31 -0
  387. package/node_modules/@balena/dockerignore/LICENSE.md +206 -0
  388. package/node_modules/@balena/dockerignore/README.md +261 -0
  389. package/node_modules/@balena/dockerignore/ignore.js +363 -0
  390. package/node_modules/@balena/dockerignore/index.d.ts +45 -0
  391. package/node_modules/@balena/dockerignore/package.json +49 -0
  392. package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  393. package/node_modules/balanced-match/LICENSE.md +21 -0
  394. package/node_modules/balanced-match/README.md +97 -0
  395. package/node_modules/balanced-match/index.js +62 -0
  396. package/node_modules/balanced-match/package.json +48 -0
  397. package/node_modules/concat-map/.travis.yml +4 -0
  398. package/node_modules/concat-map/LICENSE +18 -0
  399. package/node_modules/concat-map/README.markdown +62 -0
  400. package/node_modules/concat-map/example/map.js +6 -0
  401. package/node_modules/concat-map/index.js +13 -0
  402. package/node_modules/concat-map/package.json +43 -0
  403. package/node_modules/concat-map/test/map.js +39 -0
  404. package/node_modules/ignore/LICENSE-MIT +21 -0
  405. package/node_modules/ignore/README.md +412 -0
  406. package/node_modules/ignore/index.d.ts +61 -0
  407. package/node_modules/ignore/index.js +636 -0
  408. package/node_modules/ignore/legacy.js +559 -0
  409. package/node_modules/ignore/package.json +74 -0
  410. package/node_modules/minimatch/LICENSE +15 -0
  411. package/node_modules/minimatch/README.md +230 -0
  412. package/node_modules/minimatch/minimatch.js +947 -0
  413. package/node_modules/minimatch/node_modules/brace-expansion/LICENSE +21 -0
  414. package/node_modules/minimatch/node_modules/brace-expansion/README.md +129 -0
  415. package/node_modules/minimatch/node_modules/brace-expansion/index.js +201 -0
  416. package/node_modules/minimatch/node_modules/brace-expansion/package.json +47 -0
  417. package/node_modules/minimatch/package.json +33 -0
  418. package/package.json +14 -5
  419. package/lib/aws/compute/function-nodejs.d.ts +0 -55
  420. package/lib/aws/compute/function-nodejs.js +0 -70
@@ -0,0 +1,75 @@
1
+ import { IConstruct } from "constructs";
2
+ import { Architecture, AssetCode, Runtime } from "..";
3
+ import { BundlingOptions } from "./types";
4
+ import { BundlingFileAccess, BundlingOptions as CoreBundlingOptions, DockerImage, DockerVolume, ILocalBundling } from "../../../bundling";
5
+ /**
6
+ * Bundling properties
7
+ */
8
+ export interface BundlingProps extends BundlingOptions {
9
+ /**
10
+ * Path to lock file
11
+ */
12
+ readonly depsLockFilePath: string;
13
+ /**
14
+ * Entry file
15
+ */
16
+ readonly entry: string;
17
+ /**
18
+ * The runtime of the lambda function
19
+ */
20
+ readonly runtime: Runtime;
21
+ /**
22
+ * The system architecture of the lambda function
23
+ */
24
+ readonly architecture: Architecture;
25
+ /**
26
+ * Path to project root
27
+ */
28
+ readonly projectRoot: string;
29
+ /**
30
+ * Run compilation using `tsc` before bundling
31
+ */
32
+ readonly preCompilation?: boolean;
33
+ /**
34
+ * Which option to use to copy the source files to the docker container and output files back
35
+ * @default - BundlingFileAccess.BIND_MOUNT
36
+ */
37
+ readonly bundlingFileAccess?: BundlingFileAccess;
38
+ }
39
+ /**
40
+ * Bundling with esbuild
41
+ */
42
+ export declare class Bundling implements CoreBundlingOptions {
43
+ private readonly props;
44
+ /**
45
+ * esbuild bundled Lambda asset code
46
+ */
47
+ static bundle(scope: IConstruct, options: BundlingProps): AssetCode;
48
+ static clearEsbuildInstallationCache(): void;
49
+ static clearTscInstallationCache(): void;
50
+ private static esbuildInstallation?;
51
+ private static tscInstallation?;
52
+ readonly image: DockerImage;
53
+ readonly entrypoint?: string[];
54
+ readonly command: string[];
55
+ readonly volumes?: DockerVolume[];
56
+ readonly volumesFrom?: string[];
57
+ readonly environment?: {
58
+ [key: string]: string;
59
+ };
60
+ readonly workingDirectory: string;
61
+ readonly user?: string;
62
+ readonly securityOpt?: string;
63
+ readonly network?: string;
64
+ readonly local?: ILocalBundling;
65
+ readonly bundlingFileAccess?: BundlingFileAccess;
66
+ private readonly projectRoot;
67
+ private readonly relativeEntryPath;
68
+ private readonly relativeTsconfigPath?;
69
+ private readonly relativeDepsLockFilePath;
70
+ private readonly externals;
71
+ private readonly packageManager;
72
+ constructor(scope: IConstruct, props: BundlingProps);
73
+ private createBundlingCommand;
74
+ private getLocalBundlingProvider;
75
+ }
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ // https://github.com/aws/aws-cdk/blob/v2.186.0/packages/aws-cdk-lib/aws-lambda-nodejs/lib/bundling.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Bundling = void 0;
5
+ const os = require("os");
6
+ const path = require("path");
7
+ const cdktf_1 = require("cdktf");
8
+ const __1 = require("..");
9
+ const package_installation_1 = require("./package-installation");
10
+ const package_manager_1 = require("./package-manager");
11
+ const types_1 = require("./types");
12
+ const util_1 = require("./util");
13
+ const asset_staging_1 = require("../../../asset-staging");
14
+ const assets_1 = require("../../../assets");
15
+ const bundling_1 = require("../../../bundling");
16
+ const ESBUILD_MAJOR_VERSION = "0";
17
+ const ESBUILD_DEFAULT_VERSION = "0.21";
18
+ /**
19
+ * Bundling with esbuild
20
+ */
21
+ class Bundling {
22
+ /**
23
+ * esbuild bundled Lambda asset code
24
+ */
25
+ static bundle(scope, options) {
26
+ return __1.Code.fromAsset(options.projectRoot, {
27
+ assetHash: options.assetHash,
28
+ assetHashType: options.assetHash
29
+ ? assets_1.AssetHashType.CUSTOM
30
+ : assets_1.AssetHashType.OUTPUT,
31
+ bundling: new Bundling(scope, options),
32
+ });
33
+ }
34
+ static clearEsbuildInstallationCache() {
35
+ this.esbuildInstallation = undefined;
36
+ }
37
+ static clearTscInstallationCache() {
38
+ this.tscInstallation = undefined;
39
+ }
40
+ constructor(scope, props) {
41
+ this.props = props;
42
+ this.packageManager = package_manager_1.PackageManager.fromLockFile(props.depsLockFilePath, props.logLevel);
43
+ Bundling.esbuildInstallation =
44
+ Bundling.esbuildInstallation ?? package_installation_1.PackageInstallation.detect("esbuild");
45
+ Bundling.tscInstallation =
46
+ Bundling.tscInstallation ?? package_installation_1.PackageInstallation.detect("typescript");
47
+ this.projectRoot = props.projectRoot;
48
+ this.relativeEntryPath = path.relative(this.projectRoot, path.resolve(props.entry));
49
+ this.relativeDepsLockFilePath = path.relative(this.projectRoot, path.resolve(props.depsLockFilePath));
50
+ if (this.relativeDepsLockFilePath.includes("..")) {
51
+ throw new Error(`Expected depsLockFilePath: ${props.depsLockFilePath} to be under projectRoot: ${this.projectRoot} (${this.relativeDepsLockFilePath})`);
52
+ }
53
+ if (props.tsconfig) {
54
+ this.relativeTsconfigPath = path.relative(this.projectRoot, path.resolve(props.tsconfig));
55
+ }
56
+ if (props.preCompilation && !/\.tsx?$/.test(props.entry)) {
57
+ throw new Error("preCompilation can only be used with typescript files");
58
+ }
59
+ if (props.format === types_1.OutputFormat.ESM && !isEsmRuntime(props.runtime)) {
60
+ throw new Error(`ECMAScript module output format is not supported by the ${props.runtime.name} runtime`);
61
+ }
62
+ /**
63
+ * For Lambda runtime that uses AWS SDK v3, we need to remove both `aws-sdk/*` modules
64
+ * and `smithy/*` modules to prevent version mismatches.
65
+ *
66
+ * Issue reference: https://github.com/aws/aws-cdk/issues/31610#issuecomment-2389983347
67
+ */
68
+ const sdkV3Externals = ["@aws-sdk/*", "@smithy/*"];
69
+ // Modules to externalize when using a constant known version of the runtime.
70
+ // Mark aws-sdk as external by default (available in the runtime)
71
+ const isV2Runtime = (0, util_1.isSdkV2Runtime)(props.runtime);
72
+ const versionedExternals = isV2Runtime ? ["aws-sdk"] : sdkV3Externals;
73
+ // Don't automatically externalize any dependencies when using a `latest` runtime which may
74
+ // update versions in the future.
75
+ // Don't automatically externalize aws sdk if `bundleAwsSDK` is true so it can be
76
+ // include in the bundle asset
77
+ const defaultExternals = props.runtime?.isVariable || props.bundleAwsSDK ? [] : versionedExternals;
78
+ const externals = props.externalModules ?? defaultExternals;
79
+ // warn users if they are using a runtime that does not support sdk v2
80
+ // and the sdk is not explicitly bundled
81
+ if (externals.length && isV2Runtime) {
82
+ // "aws-cdk-lib/aws-lambda-nodejs:runtimeUpdateSdkV2Breakage",
83
+ cdktf_1.Annotations.of(scope).addWarning("Be aware that the NodeJS runtime of Node 16 will be deprecated by Lambda on June 12, 2024. Lambda runtimes Node 18 and higher include SDKv3 and not SDKv2. Updating your Lambda runtime will require bundling the SDK, or updating all SDK calls in your handler code to use SDKv3 (which is not a trivial update). Please account for this added complexity and update as soon as possible.");
84
+ }
85
+ // Warn users if they are trying to rely on global versions of the SDK that aren't available in
86
+ // their environment.
87
+ if (isV2Runtime &&
88
+ externals.some((pkgName) => pkgName.startsWith("@aws-sdk/"))) {
89
+ // "@aws-cdk/aws-lambda-nodejs:sdkV3NotInRuntime",
90
+ cdktf_1.Annotations.of(scope).addWarning("If you are relying on AWS SDK v3 to be present in the Lambda environment already, please explicitly configure a NodeJS runtime of Node 18 or higher.");
91
+ }
92
+ else if (!isV2Runtime && externals.includes("aws-sdk")) {
93
+ // "@aws-cdk/aws-lambda-nodejs:sdkV2NotInRuntime",
94
+ cdktf_1.Annotations.of(scope).addWarning("If you are relying on AWS SDK v2 to be present in the Lambda environment already, please explicitly configure a NodeJS runtime of Node 16 or lower.");
95
+ }
96
+ // Warn users if they are using a runtime that may change and are excluding any dependencies from
97
+ // bundling.
98
+ if (externals.length && props.runtime?.isVariable) {
99
+ // "@aws-cdk/aws-lambda-nodejs:variableRuntimeExternals",
100
+ cdktf_1.Annotations.of(scope).addWarning("When using NODEJS_LATEST the runtime version may change as new runtimes are released, this may affect the availability of packages shipped with the environment. Ensure that any external dependencies are available through layers or specify a specific runtime version.");
101
+ }
102
+ this.externals = [
103
+ ...externals,
104
+ ...(props.nodeModules ?? []), // Mark the modules that we are going to install as externals also
105
+ ];
106
+ // Docker bundling
107
+ const shouldBuildImage = props.forceDockerBundling || !Bundling.esbuildInstallation;
108
+ this.image = shouldBuildImage
109
+ ? (props.dockerImage ??
110
+ bundling_1.DockerImage.fromBuild(path.join(__dirname), {
111
+ buildArgs: {
112
+ ...(props.buildArgs ?? {}),
113
+ // If runtime isn't passed use regional default, lowest common denominator is node18
114
+ IMAGE: props.runtime.bundlingImage.image,
115
+ ESBUILD_VERSION: props.esbuildVersion ?? ESBUILD_DEFAULT_VERSION,
116
+ },
117
+ platform: props.architecture.dockerPlatform,
118
+ }))
119
+ : bundling_1.DockerImage.fromRegistry("dummy"); // Do not build if we don't need to
120
+ const bundlingCommand = this.createBundlingCommand({
121
+ inputDir: asset_staging_1.AssetStaging.BUNDLING_INPUT_DIR,
122
+ outputDir: asset_staging_1.AssetStaging.BUNDLING_OUTPUT_DIR,
123
+ esbuildRunner: "esbuild", // esbuild is installed globally in the docker image
124
+ tscRunner: "tsc", // tsc is installed globally in the docker image
125
+ osPlatform: "linux", // linux docker image
126
+ });
127
+ this.command = props.command ?? ["bash", "-c", bundlingCommand];
128
+ this.environment = props.environment;
129
+ // Bundling sets the working directory to AssetStaging.BUNDLING_INPUT_DIR
130
+ // and we want to force npx to use the globally installed esbuild.
131
+ this.workingDirectory = props.workingDirectory ?? "/";
132
+ this.entrypoint = props.entrypoint;
133
+ this.volumes = props.volumes;
134
+ this.volumesFrom = props.volumesFrom;
135
+ this.user = props.user;
136
+ this.securityOpt = props.securityOpt;
137
+ this.network = props.network;
138
+ this.bundlingFileAccess = props.bundlingFileAccess;
139
+ // Local bundling
140
+ if (!props.forceDockerBundling) {
141
+ // only if Docker is not forced
142
+ this.local = this.getLocalBundlingProvider();
143
+ }
144
+ }
145
+ createBundlingCommand(options) {
146
+ const pathJoin = osPathJoin(options.osPlatform);
147
+ let relativeEntryPath = pathJoin(options.inputDir, this.relativeEntryPath);
148
+ let tscCommand = "";
149
+ if (this.props.preCompilation) {
150
+ const tsconfig = this.props.tsconfig ??
151
+ (0, util_1.findUp)("tsconfig.json", path.dirname(this.props.entry));
152
+ if (!tsconfig) {
153
+ throw new Error("Cannot find a `tsconfig.json` but `preCompilation` is set to `true`, please specify it via `tsconfig`");
154
+ }
155
+ const compilerOptions = (0, util_1.getTsconfigCompilerOptions)(tsconfig);
156
+ tscCommand = `${options.tscRunner} "${relativeEntryPath}" ${compilerOptions}`;
157
+ relativeEntryPath = relativeEntryPath.replace(/\.ts(x?)$/, ".js$1");
158
+ }
159
+ const loaders = Object.entries(this.props.loader ?? {});
160
+ const defines = Object.entries(this.props.define ?? {});
161
+ if (this.props.sourceMap === false && this.props.sourceMapMode) {
162
+ throw new Error("sourceMapMode cannot be used when sourceMap is false");
163
+ }
164
+ const sourceMapEnabled = this.props.sourceMapMode ?? this.props.sourceMap;
165
+ const sourceMapMode = this.props.sourceMapMode ?? types_1.SourceMapMode.DEFAULT;
166
+ const sourceMapValue = sourceMapMode === types_1.SourceMapMode.DEFAULT
167
+ ? ""
168
+ : `=${this.props.sourceMapMode}`;
169
+ const sourcesContent = this.props.sourcesContent ?? true;
170
+ const outFile = this.props.format === types_1.OutputFormat.ESM ? "index.mjs" : "index.js";
171
+ const esbuildCommand = [
172
+ options.esbuildRunner,
173
+ "--bundle",
174
+ `"${relativeEntryPath}"`,
175
+ `--target=${this.props.target ?? toTarget(this.props.runtime)}`,
176
+ "--platform=node",
177
+ ...(this.props.format ? [`--format=${this.props.format}`] : []),
178
+ `--outfile="${pathJoin(options.outputDir, outFile)}"`,
179
+ ...(this.props.minify ? ["--minify"] : []),
180
+ ...(sourceMapEnabled ? [`--sourcemap${sourceMapValue}`] : []),
181
+ ...(sourcesContent ? [] : [`--sources-content=${sourcesContent}`]),
182
+ ...this.externals.map((external) => `--external:${external}`),
183
+ ...loaders.map(([ext, name]) => `--loader:${ext}=${name}`),
184
+ ...defines.map(([key, value]) => `--define:${key}=${JSON.stringify(value)}`),
185
+ ...(this.props.logLevel ? [`--log-level=${this.props.logLevel}`] : []),
186
+ ...(this.props.keepNames ? ["--keep-names"] : []),
187
+ ...(this.relativeTsconfigPath
188
+ ? [
189
+ `--tsconfig="${pathJoin(options.inputDir, this.relativeTsconfigPath)}"`,
190
+ ]
191
+ : []),
192
+ ...(this.props.metafile
193
+ ? [`--metafile="${pathJoin(options.outputDir, "index.meta.json")}"`]
194
+ : []),
195
+ ...(this.props.banner
196
+ ? [`--banner:js=${JSON.stringify(this.props.banner)}`]
197
+ : []),
198
+ ...(this.props.footer
199
+ ? [`--footer:js=${JSON.stringify(this.props.footer)}`]
200
+ : []),
201
+ ...(this.props.mainFields
202
+ ? [`--main-fields=${this.props.mainFields.join(",")}`]
203
+ : []),
204
+ ...(this.props.inject
205
+ ? this.props.inject.map((i) => `--inject:"${i}"`)
206
+ : []),
207
+ ...(this.props.esbuildArgs ? [toCliArgs(this.props.esbuildArgs)] : []),
208
+ ];
209
+ let depsCommand = "";
210
+ if (this.props.nodeModules) {
211
+ // Find 'package.json' closest to entry folder, we are going to extract the
212
+ // modules versions from it.
213
+ const pkgPath = (0, util_1.findUp)("package.json", path.dirname(this.props.entry));
214
+ if (!pkgPath) {
215
+ throw new Error("Cannot find a `package.json` in this project. Using `nodeModules` requires a `package.json`.");
216
+ }
217
+ // Determine dependencies versions, lock file and installer
218
+ const dependencies = (0, util_1.extractDependencies)(pkgPath, this.props.nodeModules);
219
+ const osCommand = new OsCommand(options.osPlatform);
220
+ const lockFilePath = pathJoin(options.inputDir, this.relativeDepsLockFilePath ?? this.packageManager.lockFile);
221
+ const isPnpm = this.packageManager.lockFile === package_manager_1.LockFile.PNPM;
222
+ const isBun = this.packageManager.lockFile === package_manager_1.LockFile.BUN;
223
+ // Create dummy package.json, copy lock file if any and then install
224
+ depsCommand = chain([
225
+ isPnpm
226
+ ? osCommand.write(pathJoin(options.outputDir, "pnpm-workspace.yaml"), "")
227
+ : "", // Ensure node_modules directory is installed locally by creating local 'pnpm-workspace.yaml' file
228
+ osCommand.writeJson(pathJoin(options.outputDir, "package.json"), {
229
+ dependencies,
230
+ }),
231
+ osCommand.copy(lockFilePath, pathJoin(options.outputDir, this.packageManager.lockFile)),
232
+ osCommand.changeDirectory(options.outputDir),
233
+ this.packageManager.installCommand.join(" "),
234
+ isPnpm
235
+ ? osCommand.remove(pathJoin(options.outputDir, "node_modules", ".modules.yaml"), true)
236
+ : "", // Remove '.modules.yaml' file which changes on each deployment
237
+ isBun
238
+ ? osCommand.removeDir(pathJoin(options.outputDir, "node_modules", ".cache"))
239
+ : "", // Remove node_modules/.cache folder since you can't disable its creation
240
+ ]);
241
+ }
242
+ return chain([
243
+ ...(this.props.commandHooks?.beforeBundling(options.inputDir, options.outputDir) ?? []),
244
+ tscCommand,
245
+ esbuildCommand.join(" "),
246
+ ...((this.props.nodeModules &&
247
+ this.props.commandHooks?.beforeInstall(options.inputDir, options.outputDir)) ??
248
+ []),
249
+ depsCommand,
250
+ ...(this.props.commandHooks?.afterBundling(options.inputDir, options.outputDir) ?? []),
251
+ ]);
252
+ }
253
+ getLocalBundlingProvider() {
254
+ const osPlatform = os.platform();
255
+ const createLocalCommand = (outputDir, esbuild, tsc) => this.createBundlingCommand({
256
+ inputDir: this.projectRoot,
257
+ outputDir,
258
+ esbuildRunner: esbuild.isLocal
259
+ ? this.packageManager.runBinCommand("esbuild")
260
+ : "esbuild",
261
+ tscRunner: tsc &&
262
+ (tsc.isLocal ? this.packageManager.runBinCommand("tsc") : "tsc"),
263
+ osPlatform,
264
+ });
265
+ const environment = this.props.environment ?? {};
266
+ const cwd = this.projectRoot;
267
+ return {
268
+ tryBundle(outputDir) {
269
+ if (!Bundling.esbuildInstallation) {
270
+ process.stderr.write("esbuild cannot run locally. Switching to Docker bundling.\n");
271
+ return false;
272
+ }
273
+ if (!Bundling.esbuildInstallation.version.startsWith(`${ESBUILD_MAJOR_VERSION}.`)) {
274
+ throw new Error(`Expected esbuild version ${ESBUILD_MAJOR_VERSION}.x but got ${Bundling.esbuildInstallation.version}`);
275
+ }
276
+ const localCommand = createLocalCommand(outputDir, Bundling.esbuildInstallation, Bundling.tscInstallation);
277
+ (0, util_1.exec)(osPlatform === "win32" ? "cmd" : "bash", [osPlatform === "win32" ? "/c" : "-c", localCommand], {
278
+ env: { ...process.env, ...environment },
279
+ stdio: [
280
+ // show output
281
+ "ignore", // ignore stdio
282
+ process.stderr, // redirect stdout to stderr
283
+ "inherit", // inherit stderr
284
+ ],
285
+ cwd,
286
+ windowsVerbatimArguments: osPlatform === "win32",
287
+ });
288
+ return true;
289
+ },
290
+ };
291
+ }
292
+ }
293
+ exports.Bundling = Bundling;
294
+ /**
295
+ * OS agnostic command
296
+ */
297
+ class OsCommand {
298
+ constructor(osPlatform) {
299
+ this.osPlatform = osPlatform;
300
+ }
301
+ write(filePath, data) {
302
+ if (this.osPlatform === "win32") {
303
+ if (!data) {
304
+ // if `data` is empty, echo a blank line, otherwise the file will contain a `^` character
305
+ return `echo. > "${filePath}"`;
306
+ }
307
+ return `echo ^${data}^ > "${filePath}"`;
308
+ }
309
+ return `echo '${data}' > "${filePath}"`;
310
+ }
311
+ writeJson(filePath, data) {
312
+ const stringifiedData = JSON.stringify(data);
313
+ return this.write(filePath, stringifiedData);
314
+ }
315
+ copy(src, dest) {
316
+ if (this.osPlatform === "win32") {
317
+ return `copy "${src}" "${dest}"`;
318
+ }
319
+ return `cp "${src}" "${dest}"`;
320
+ }
321
+ changeDirectory(dir) {
322
+ return `cd "${dir}"`;
323
+ }
324
+ remove(filePath, force = false) {
325
+ if (this.osPlatform === "win32") {
326
+ return `del "${filePath}"`;
327
+ }
328
+ const opts = force ? ["-f"] : [];
329
+ return `rm ${opts.join(" ")} "${filePath}"`;
330
+ }
331
+ removeDir(dir) {
332
+ if (this.osPlatform === "win32") {
333
+ return `rmdir /s /q "${dir}"`;
334
+ }
335
+ return `rm -rf "${dir}"`;
336
+ }
337
+ }
338
+ /**
339
+ * Chain commands
340
+ */
341
+ function chain(commands) {
342
+ return commands.filter((c) => !!c).join(" && ");
343
+ }
344
+ /**
345
+ * Platform specific path join
346
+ */
347
+ function osPathJoin(platform) {
348
+ return function (...paths) {
349
+ const joined = path.join(...paths);
350
+ // If we are on win32 but need posix style paths
351
+ if (os.platform() === "win32" && platform !== "win32") {
352
+ return joined.replace(/\\/g, "/");
353
+ }
354
+ return joined;
355
+ };
356
+ }
357
+ /**
358
+ * Converts a runtime to an esbuild node target
359
+ */
360
+ function toTarget(runtime) {
361
+ const match = runtime.name.match(/nodejs(\d+)/);
362
+ if (!match) {
363
+ throw new Error("Cannot extract version from runtime.");
364
+ }
365
+ return `node${match[1]}`;
366
+ }
367
+ function toCliArgs(esbuildArgs) {
368
+ const args = new Array();
369
+ const reSpecifiedKeys = [
370
+ "--alias",
371
+ "--drop",
372
+ "--pure",
373
+ "--log-override",
374
+ "--out-extension",
375
+ ];
376
+ for (const [key, value] of Object.entries(esbuildArgs)) {
377
+ if (value === true || value === "") {
378
+ args.push(key);
379
+ }
380
+ else if (reSpecifiedKeys.includes(key)) {
381
+ args.push(`${key}:"${value}"`);
382
+ }
383
+ else if (value) {
384
+ args.push(`${key}="${value}"`);
385
+ }
386
+ }
387
+ return args.join(" ");
388
+ }
389
+ /**
390
+ * Detect if a given Node.js runtime supports ESM (ECMAScript modules)
391
+ */
392
+ function isEsmRuntime(runtime) {
393
+ const unsupportedRuntimes = [
394
+ __1.Runtime.NODEJS,
395
+ __1.Runtime.NODEJS_4_3,
396
+ __1.Runtime.NODEJS_6_10,
397
+ __1.Runtime.NODEJS_8_10,
398
+ __1.Runtime.NODEJS_10_X,
399
+ __1.Runtime.NODEJS_12_X,
400
+ ];
401
+ return !unsupportedRuntimes.some((r) => {
402
+ return r.family === runtime.family && r.name === runtime.name;
403
+ });
404
+ }
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvZnVuY3Rpb24tbm9kZWpzL2J1bmRsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxzR0FBc0c7OztBQUV0Ryx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLGlDQUFvQztBQUVwQywwQkFBNEQ7QUFDNUQsaUVBQTZEO0FBQzdELHVEQUE2RDtBQUM3RCxtQ0FBdUU7QUFDdkUsaUNBTWdCO0FBQ2hCLDBEQUFzRDtBQUN0RCw0Q0FBZ0Q7QUFDaEQsZ0RBTTJCO0FBRTNCLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBMkN2Qzs7R0FFRztBQUNILE1BQWEsUUFBUTtJQUNuQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBaUIsRUFBRSxPQUFzQjtRQUM1RCxPQUFPLFFBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUN6QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxTQUFTO2dCQUM5QixDQUFDLENBQUMsc0JBQWEsQ0FBQyxNQUFNO2dCQUN0QixDQUFDLENBQUMsc0JBQWEsQ0FBQyxNQUFNO1lBQ3hCLFFBQVEsRUFBRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsNkJBQTZCO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7SUFDdkMsQ0FBQztJQUVNLE1BQU0sQ0FBQyx5QkFBeUI7UUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQTBCRCxZQUNFLEtBQWlCLEVBQ0EsS0FBb0I7UUFBcEIsVUFBSyxHQUFMLEtBQUssQ0FBZTtR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QUssR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsT0FBZ0I7SUFDcEMsTUFBTSxtQkFBbUIsR0FBRztRQUMxQixXQUFPLENBQUMsTUFBTTtRQUNkLFdBQU8sQ0FBQyxVQUFVO1FBQ2xCLFdBQU8sQ0FBQyxXQUFXO1FBQ25CLFdBQU8sQ0FBQyxXQUFXO1FBQ25CLFdBQU8sQ0FBQyxXQUFXO1FBQ25CLFdBQU8sQ0FBQyxXQUFXO0tBQ3BCLENBQUM7SUFFRixPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDckMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ2hFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE4Ni4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzL2xpYi9idW5kbGluZy50c1xuXG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSwgQXNzZXRDb2RlLCBDb2RlLCBSdW50aW1lIH0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyBQYWNrYWdlSW5zdGFsbGF0aW9uIH0gZnJvbSBcIi4vcGFja2FnZS1pbnN0YWxsYXRpb25cIjtcbmltcG9ydCB7IExvY2tGaWxlLCBQYWNrYWdlTWFuYWdlciB9IGZyb20gXCIuL3BhY2thZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHsgQnVuZGxpbmdPcHRpb25zLCBPdXRwdXRGb3JtYXQsIFNvdXJjZU1hcE1vZGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZXhlYyxcbiAgZXh0cmFjdERlcGVuZGVuY2llcyxcbiAgZmluZFVwLFxuICBnZXRUc2NvbmZpZ0NvbXBpbGVyT3B0aW9ucyxcbiAgaXNTZGtWMlJ1bnRpbWUsXG59IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IEFzc2V0U3RhZ2luZyB9IGZyb20gXCIuLi8uLi8uLi9hc3NldC1zdGFnaW5nXCI7XG5pbXBvcnQgeyBBc3NldEhhc2hUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL2Fzc2V0c1wiO1xuaW1wb3J0IHtcbiAgQnVuZGxpbmdGaWxlQWNjZXNzLFxuICBCdW5kbGluZ09wdGlvbnMgYXMgQ29yZUJ1bmRsaW5nT3B0aW9ucyxcbiAgRG9ja2VySW1hZ2UsXG4gIERvY2tlclZvbHVtZSxcbiAgSUxvY2FsQnVuZGxpbmcsXG59IGZyb20gXCIuLi8uLi8uLi9idW5kbGluZ1wiO1xuXG5jb25zdCBFU0JVSUxEX01BSk9SX1ZFUlNJT04gPSBcIjBcIjtcbmNvbnN0IEVTQlVJTERfREVGQVVMVF9WRVJTSU9OID0gXCIwLjIxXCI7XG5cbi8qKlxuICogQnVuZGxpbmcgcHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmRsaW5nUHJvcHMgZXh0ZW5kcyBCdW5kbGluZ09wdGlvbnMge1xuICAvKipcbiAgICogUGF0aCB0byBsb2NrIGZpbGVcbiAgICovXG4gIHJlYWRvbmx5IGRlcHNMb2NrRmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogRW50cnkgZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJ1bnRpbWUgb2YgdGhlIGxhbWJkYSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZTogUnVudGltZTtcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgb2YgdGhlIGxhbWJkYSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gcHJvamVjdCByb290XG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0Um9vdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW4gY29tcGlsYXRpb24gdXNpbmcgYHRzY2AgYmVmb3JlIGJ1bmRsaW5nXG4gICAqL1xuICByZWFkb25seSBwcmVDb21waWxhdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9wdGlvbiB0byB1c2UgdG8gY29weSB0aGUgc291cmNlIGZpbGVzIHRvIHRoZSBkb2NrZXIgY29udGFpbmVyIGFuZCBvdXRwdXQgZmlsZXMgYmFja1xuICAgKiBAZGVmYXVsdCAtIEJ1bmRsaW5nRmlsZUFjY2Vzcy5CSU5EX01PVU5UXG4gICAqL1xuICByZWFkb25seSBidW5kbGluZ0ZpbGVBY2Nlc3M/OiBCdW5kbGluZ0ZpbGVBY2Nlc3M7XG59XG5cbi8qKlxuICogQnVuZGxpbmcgd2l0aCBlc2J1aWxkXG4gKi9cbmV4cG9ydCBjbGFzcyBCdW5kbGluZyBpbXBsZW1lbnRzIENvcmVCdW5kbGluZ09wdGlvbnMge1xuICAvKipcbiAgICogZXNidWlsZCBidW5kbGVkIExhbWJkYSBhc3NldCBjb2RlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1bmRsZShzY29wZTogSUNvbnN0cnVjdCwgb3B0aW9uczogQnVuZGxpbmdQcm9wcyk6IEFzc2V0Q29kZSB7XG4gICAgcmV0dXJuIENvZGUuZnJvbUFzc2V0KG9wdGlvbnMucHJvamVjdFJvb3QsIHtcbiAgICAgIGFzc2V0SGFzaDogb3B0aW9ucy5hc3NldEhhc2gsXG4gICAgICBhc3NldEhhc2hUeXBlOiBvcHRpb25zLmFzc2V0SGFzaFxuICAgICAgICA/IEFzc2V0SGFzaFR5cGUuQ1VTVE9NXG4gICAgICAgIDogQXNzZXRIYXNoVHlwZS5PVVRQVVQsXG4gICAgICBidW5kbGluZzogbmV3IEJ1bmRsaW5nKHNjb3BlLCBvcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2xlYXJFc2J1aWxkSW5zdGFsbGF0aW9uQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5lc2J1aWxkSW5zdGFsbGF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjbGVhclRzY0luc3RhbGxhdGlvbkNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMudHNjSW5zdGFsbGF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZXNidWlsZEluc3RhbGxhdGlvbj86IFBhY2thZ2VJbnN0YWxsYXRpb247XG4gIHByaXZhdGUgc3RhdGljIHRzY0luc3RhbGxhdGlvbj86IFBhY2thZ2VJbnN0YWxsYXRpb247XG5cbiAgLy8gQ29yZSBidW5kbGluZyBvcHRpb25zXG4gIHB1YmxpYyByZWFkb25seSBpbWFnZTogRG9ja2VySW1hZ2U7XG4gIHB1YmxpYyByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IHZvbHVtZXM/OiBEb2NrZXJWb2x1bWVbXTtcbiAgcHVibGljIHJlYWRvbmx5IHZvbHVtZXNGcm9tPzogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHB1YmxpYyByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB1c2VyPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlPcHQ/OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbG9jYWw/OiBJTG9jYWxCdW5kbGluZztcbiAgcHVibGljIHJlYWRvbmx5IGJ1bmRsaW5nRmlsZUFjY2Vzcz86IEJ1bmRsaW5nRmlsZUFjY2VzcztcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3RSb290OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVsYXRpdmVFbnRyeVBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWxhdGl2ZVRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWxhdGl2ZURlcHNMb2NrRmlsZVBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBleHRlcm5hbHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogSUNvbnN0cnVjdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBCdW5kbGluZ1Byb3BzLFxuICApIHtcbiAgICB0aGlzLnBhY2thZ2VNYW5hZ2VyID0gUGFja2FnZU1hbmFnZXIuZnJvbUxvY2tGaWxlKFxuICAgICAgcHJvcHMuZGVwc0xvY2tGaWxlUGF0aCxcbiAgICAgIHByb3BzLmxvZ0xldmVsLFxuICAgICk7XG5cbiAgICBCdW5kbGluZy5lc2J1aWxkSW5zdGFsbGF0aW9uID1cbiAgICAgIEJ1bmRsaW5nLmVzYnVpbGRJbnN0YWxsYXRpb24gPz8gUGFja2FnZUluc3RhbGxhdGlvbi5kZXRlY3QoXCJlc2J1aWxkXCIpO1xuICAgIEJ1bmRsaW5nLnRzY0luc3RhbGxhdGlvbiA9XG4gICAgICBCdW5kbGluZy50c2NJbnN0YWxsYXRpb24gPz8gUGFja2FnZUluc3RhbGxhdGlvbi5kZXRlY3QoXCJ0eXBlc2NyaXB0XCIpO1xuXG4gICAgdGhpcy5wcm9qZWN0Um9vdCA9IHByb3BzLnByb2plY3RSb290O1xuICAgIHRoaXMucmVsYXRpdmVFbnRyeVBhdGggPSBwYXRoLnJlbGF0aXZlKFxuICAgICAgdGhpcy5wcm9qZWN0Um9vdCxcbiAgICAgIHBhdGgucmVzb2x2ZShwcm9wcy5lbnRyeSksXG4gICAgKTtcbiAgICB0aGlzLnJlbGF0aXZlRGVwc0xvY2tGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3RSb290LFxuICAgICAgcGF0aC5yZXNvbHZlKHByb3BzLmRlcHNMb2NrRmlsZVBhdGgpLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5yZWxhdGl2ZURlcHNMb2NrRmlsZVBhdGguaW5jbHVkZXMoXCIuLlwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgZGVwc0xvY2tGaWxlUGF0aDogJHtwcm9wcy5kZXBzTG9ja0ZpbGVQYXRofSB0byBiZSB1bmRlciBwcm9qZWN0Um9vdDogJHt0aGlzLnByb2plY3RSb290fSAoJHt0aGlzLnJlbGF0aXZlRGVwc0xvY2tGaWxlUGF0aH0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnRzY29uZmlnKSB7XG4gICAgICB0aGlzLnJlbGF0aXZlVHNjb25maWdQYXRoID0gcGF0aC5yZWxhdGl2ZShcbiAgICAgICAgdGhpcy5wcm9qZWN0Um9vdCxcbiAgICAgICAgcGF0aC5yZXNvbHZlKHByb3BzLnRzY29uZmlnKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnByZUNvbXBpbGF0aW9uICYmICEvXFwudHN4PyQvLnRlc3QocHJvcHMuZW50cnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcmVDb21waWxhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggdHlwZXNjcmlwdCBmaWxlc1wiKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZm9ybWF0ID09PSBPdXRwdXRGb3JtYXQuRVNNICYmICFpc0VzbVJ1bnRpbWUocHJvcHMucnVudGltZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEVDTUFTY3JpcHQgbW9kdWxlIG91dHB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgJHtwcm9wcy5ydW50aW1lLm5hbWV9IHJ1bnRpbWVgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgTGFtYmRhIHJ1bnRpbWUgdGhhdCB1c2VzIEFXUyBTREsgdjMsIHdlIG5lZWQgdG8gcmVtb3ZlIGJvdGggYGF3cy1zZGsvKmAgbW9kdWxlc1xuICAgICAqIGFuZCBgc21pdGh5LypgIG1vZHVsZXMgdG8gcHJldmVudCB2ZXJzaW9uIG1pc21hdGNoZXMuXG4gICAgICpcbiAgICAgKiBJc3N1ZSByZWZlcmVuY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMzE2MTAjaXNzdWVjb21tZW50LTIzODk5ODMzNDdcbiAgICAgKi9cbiAgICBjb25zdCBzZGtWM0V4dGVybmFscyA9IFtcIkBhd3Mtc2RrLypcIiwgXCJAc21pdGh5LypcIl07XG4gICAgLy8gTW9kdWxlcyB0byBleHRlcm5hbGl6ZSB3aGVuIHVzaW5nIGEgY29uc3RhbnQga25vd24gdmVyc2lvbiBvZiB0aGUgcnVudGltZS5cbiAgICAvLyBNYXJrIGF3cy1zZGsgYXMgZXh0ZXJuYWwgYnkgZGVmYXVsdCAoYXZhaWxhYmxlIGluIHRoZSBydW50aW1lKVxuICAgIGNvbnN0IGlzVjJSdW50aW1lID0gaXNTZGtWMlJ1bnRpbWUocHJvcHMucnVudGltZSk7XG4gICAgY29uc3QgdmVyc2lvbmVkRXh0ZXJuYWxzID0gaXNWMlJ1bnRpbWUgPyBbXCJhd3Mtc2RrXCJdIDogc2RrVjNFeHRlcm5hbHM7XG4gICAgLy8gRG9uJ3QgYXV0b21hdGljYWxseSBleHRlcm5hbGl6ZSBhbnkgZGVwZW5kZW5jaWVzIHdoZW4gdXNpbmcgYSBgbGF0ZXN0YCBydW50aW1lIHdoaWNoIG1heVxuICAgIC8vIHVwZGF0ZSB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLlxuICAgIC8vIERvbid0IGF1dG9tYXRpY2FsbHkgZXh0ZXJuYWxpemUgYXdzIHNkayBpZiBgYnVuZGxlQXdzU0RLYCBpcyB0cnVlIHNvIGl0IGNhbiBiZVxuICAgIC8vIGluY2x1ZGUgaW4gdGhlIGJ1bmRsZSBhc3NldFxuICAgIGNvbnN0IGRlZmF1bHRFeHRlcm5hbHMgPVxuICAgICAgcHJvcHMucnVudGltZT8uaXNWYXJpYWJsZSB8fCBwcm9wcy5idW5kbGVBd3NTREsgPyBbXSA6IHZlcnNpb25lZEV4dGVybmFscztcblxuICAgIGNvbnN0IGV4dGVybmFscyA9IHByb3BzLmV4dGVybmFsTW9kdWxlcyA/PyBkZWZhdWx0RXh0ZXJuYWxzO1xuXG4gICAgLy8gd2FybiB1c2VycyBpZiB0aGV5IGFyZSB1c2luZyBhIHJ1bnRpbWUgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHNkayB2MlxuICAgIC8vIGFuZCB0aGUgc2RrIGlzIG5vdCBleHBsaWNpdGx5IGJ1bmRsZWRcbiAgICBpZiAoZXh0ZXJuYWxzLmxlbmd0aCAmJiBpc1YyUnVudGltZSkge1xuICAgICAgLy8gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqczpydW50aW1lVXBkYXRlU2RrVjJCcmVha2FnZVwiLFxuICAgICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmcoXG4gICAgICAgIFwiQmUgYXdhcmUgdGhhdCB0aGUgTm9kZUpTIHJ1bnRpbWUgb2YgTm9kZSAxNiB3aWxsIGJlIGRlcHJlY2F0ZWQgYnkgTGFtYmRhIG9uIEp1bmUgMTIsIDIwMjQuIExhbWJkYSBydW50aW1lcyBOb2RlIDE4IGFuZCBoaWdoZXIgaW5jbHVkZSBTREt2MyBhbmQgbm90IFNES3YyLiBVcGRhdGluZyB5b3VyIExhbWJkYSBydW50aW1lIHdpbGwgcmVxdWlyZSBidW5kbGluZyB0aGUgU0RLLCBvciB1cGRhdGluZyBhbGwgU0RLIGNhbGxzIGluIHlvdXIgaGFuZGxlciBjb2RlIHRvIHVzZSBTREt2MyAod2hpY2ggaXMgbm90IGEgdHJpdmlhbCB1cGRhdGUpLiBQbGVhc2UgYWNjb3VudCBmb3IgdGhpcyBhZGRlZCBjb21wbGV4aXR5IGFuZCB1cGRhdGUgYXMgc29vbiBhcyBwb3NzaWJsZS5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiB1c2VycyBpZiB0aGV5IGFyZSB0cnlpbmcgdG8gcmVseSBvbiBnbG9iYWwgdmVyc2lvbnMgb2YgdGhlIFNESyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgaW5cbiAgICAvLyB0aGVpciBlbnZpcm9ubWVudC5cbiAgICBpZiAoXG4gICAgICBpc1YyUnVudGltZSAmJlxuICAgICAgZXh0ZXJuYWxzLnNvbWUoKHBrZ05hbWUpID0+IHBrZ05hbWUuc3RhcnRzV2l0aChcIkBhd3Mtc2RrL1wiKSlcbiAgICApIHtcbiAgICAgIC8vIFwiQGF3cy1jZGsvYXdzLWxhbWJkYS1ub2RlanM6c2RrVjNOb3RJblJ1bnRpbWVcIixcbiAgICAgIEFubm90YXRpb25zLm9mKHNjb3BlKS5hZGRXYXJuaW5nKFxuICAgICAgICBcIklmIHlvdSBhcmUgcmVseWluZyBvbiBBV1MgU0RLIHYzIHRvIGJlIHByZXNlbnQgaW4gdGhlIExhbWJkYSBlbnZpcm9ubWVudCBhbHJlYWR5LCBwbGVhc2UgZXhwbGljaXRseSBjb25maWd1cmUgYSBOb2RlSlMgcnVudGltZSBvZiBOb2RlIDE4IG9yIGhpZ2hlci5cIixcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghaXNWMlJ1bnRpbWUgJiYgZXh0ZXJuYWxzLmluY2x1ZGVzKFwiYXdzLXNka1wiKSkge1xuICAgICAgLy8gXCJAYXdzLWNkay9hd3MtbGFtYmRhLW5vZGVqczpzZGtWMk5vdEluUnVudGltZVwiLFxuICAgICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmcoXG4gICAgICAgIFwiSWYgeW91IGFyZSByZWx5aW5nIG9uIEFXUyBTREsgdjIgdG8gYmUgcHJlc2VudCBpbiB0aGUgTGFtYmRhIGVudmlyb25tZW50IGFscmVhZHksIHBsZWFzZSBleHBsaWNpdGx5IGNvbmZpZ3VyZSBhIE5vZGVKUyBydW50aW1lIG9mIE5vZGUgMTYgb3IgbG93ZXIuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdhcm4gdXNlcnMgaWYgdGhleSBhcmUgdXNpbmcgYSBydW50aW1lIHRoYXQgbWF5IGNoYW5nZSBhbmQgYXJlIGV4Y2x1ZGluZyBhbnkgZGVwZW5kZW5jaWVzIGZyb21cbiAgICAvLyBidW5kbGluZy5cbiAgICBpZiAoZXh0ZXJuYWxzLmxlbmd0aCAmJiBwcm9wcy5ydW50aW1lPy5pc1ZhcmlhYmxlKSB7XG4gICAgICAvLyBcIkBhd3MtY2RrL2F3cy1sYW1iZGEtbm9kZWpzOnZhcmlhYmxlUnVudGltZUV4dGVybmFsc1wiLFxuICAgICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmcoXG4gICAgICAgIFwiV2hlbiB1c2luZyBOT0RFSlNfTEFURVNUIHRoZSBydW50aW1lIHZlcnNpb24gbWF5IGNoYW5nZSBhcyBuZXcgcnVudGltZXMgYXJlIHJlbGVhc2VkLCB0aGlzIG1heSBhZmZlY3QgdGhlIGF2YWlsYWJpbGl0eSBvZiBwYWNrYWdlcyBzaGlwcGVkIHdpdGggdGhlIGVudmlyb25tZW50LiBFbnN1cmUgdGhhdCBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGFyZSBhdmFpbGFibGUgdGhyb3VnaCBsYXllcnMgb3Igc3BlY2lmeSBhIHNwZWNpZmljIHJ1bnRpbWUgdmVyc2lvbi5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5leHRlcm5hbHMgPSBbXG4gICAgICAuLi5leHRlcm5hbHMsXG4gICAgICAuLi4ocHJvcHMubm9kZU1vZHVsZXMgPz8gW10pLCAvLyBNYXJrIHRoZSBtb2R1bGVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc3RhbGwgYXMgZXh0ZXJuYWxzIGFsc29cbiAgICBdO1xuXG4gICAgLy8gRG9ja2VyIGJ1bmRsaW5nXG4gICAgY29uc3Qgc2hvdWxkQnVpbGRJbWFnZSA9XG4gICAgICBwcm9wcy5mb3JjZURvY2tlckJ1bmRsaW5nIHx8ICFCdW5kbGluZy5lc2J1aWxkSW5zdGFsbGF0aW9uO1xuICAgIHRoaXMuaW1hZ2UgPSBzaG91bGRCdWlsZEltYWdlXG4gICAgICA/IChwcm9wcy5kb2NrZXJJbWFnZSA/P1xuICAgICAgICBEb2NrZXJJbWFnZS5mcm9tQnVpbGQocGF0aC5qb2luKF9fZGlybmFtZSksIHtcbiAgICAgICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgICAgIC4uLihwcm9wcy5idWlsZEFyZ3MgPz8ge30pLFxuICAgICAgICAgICAgLy8gSWYgcnVudGltZSBpc24ndCBwYXNzZWQgdXNlIHJlZ2lvbmFsIGRlZmF1bHQsIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IgaXMgbm9kZTE4XG4gICAgICAgICAgICBJTUFHRTogcHJvcHMucnVudGltZS5idW5kbGluZ0ltYWdlLmltYWdlLFxuICAgICAgICAgICAgRVNCVUlMRF9WRVJTSU9OOiBwcm9wcy5lc2J1aWxkVmVyc2lvbiA/PyBFU0JVSUxEX0RFRkFVTFRfVkVSU0lPTixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBsYXRmb3JtOiBwcm9wcy5hcmNoaXRlY3R1cmUuZG9ja2VyUGxhdGZvcm0sXG4gICAgICAgIH0pKVxuICAgICAgOiBEb2NrZXJJbWFnZS5mcm9tUmVnaXN0cnkoXCJkdW1teVwiKTsgLy8gRG8gbm90IGJ1aWxkIGlmIHdlIGRvbid0IG5lZWQgdG9cblxuICAgIGNvbnN0IGJ1bmRsaW5nQ29tbWFuZCA9IHRoaXMuY3JlYXRlQnVuZGxpbmdDb21tYW5kKHtcbiAgICAgIGlucHV0RGlyOiBBc3NldFN0YWdpbmcuQlVORExJTkdfSU5QVVRfRElSLFxuICAgICAgb3V0cHV0RGlyOiBBc3NldFN0YWdpbmcuQlVORExJTkdfT1VUUFVUX0RJUixcbiAgICAgIGVzYnVpbGRSdW5uZXI6IFwiZXNidWlsZFwiLCAvLyBlc2J1aWxkIGlzIGluc3RhbGxlZCBnbG9iYWxseSBpbiB0aGUgZG9ja2VyIGltYWdlXG4gICAgICB0c2NSdW5uZXI6IFwidHNjXCIsIC8vIHRzYyBpcyBpbnN0YWxsZWQgZ2xvYmFsbHkgaW4gdGhlIGRvY2tlciBpbWFnZVxuICAgICAgb3NQbGF0Zm9ybTogXCJsaW51eFwiLCAvLyBsaW51eCBkb2NrZXIgaW1hZ2VcbiAgICB9KTtcbiAgICB0aGlzLmNvbW1hbmQgPSBwcm9wcy5jb21tYW5kID8/IFtcImJhc2hcIiwgXCItY1wiLCBidW5kbGluZ0NvbW1hbmRdO1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBwcm9wcy5lbnZpcm9ubWVudDtcbiAgICAvLyBCdW5kbGluZyBzZXRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBBc3NldFN0YWdpbmcuQlVORExJTkdfSU5QVVRfRElSXG4gICAgLy8gYW5kIHdlIHdhbnQgdG8gZm9yY2UgbnB4IHRvIHVzZSB0aGUgZ2xvYmFsbHkgaW5zdGFsbGVkIGVzYnVpbGQuXG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gcHJvcHMud29ya2luZ0RpcmVjdG9yeSA/PyBcIi9cIjtcbiAgICB0aGlzLmVudHJ5cG9pbnQgPSBwcm9wcy5lbnRyeXBvaW50O1xuICAgIHRoaXMudm9sdW1lcyA9IHByb3BzLnZvbHVtZXM7XG4gICAgdGhpcy52b2x1bWVzRnJvbSA9IHByb3BzLnZvbHVtZXNGcm9tO1xuICAgIHRoaXMudXNlciA9IHByb3BzLnVzZXI7XG4gICAgdGhpcy5zZWN1cml0eU9wdCA9IHByb3BzLnNlY3VyaXR5T3B0O1xuICAgIHRoaXMubmV0d29yayA9IHByb3BzLm5ldHdvcms7XG4gICAgdGhpcy5idW5kbGluZ0ZpbGVBY2Nlc3MgPSBwcm9wcy5idW5kbGluZ0ZpbGVBY2Nlc3M7XG5cbiAgICAvLyBMb2NhbCBidW5kbGluZ1xuICAgIGlmICghcHJvcHMuZm9yY2VEb2NrZXJCdW5kbGluZykge1xuICAgICAgLy8gb25seSBpZiBEb2NrZXIgaXMgbm90IGZvcmNlZFxuICAgICAgdGhpcy5sb2NhbCA9IHRoaXMuZ2V0TG9jYWxCdW5kbGluZ1Byb3ZpZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCdW5kbGluZ0NvbW1hbmQob3B0aW9uczogQnVuZGxpbmdDb21tYW5kT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGF0aEpvaW4gPSBvc1BhdGhKb2luKG9wdGlvbnMub3NQbGF0Zm9ybSk7XG4gICAgbGV0IHJlbGF0aXZlRW50cnlQYXRoID0gcGF0aEpvaW4ob3B0aW9ucy5pbnB1dERpciwgdGhpcy5yZWxhdGl2ZUVudHJ5UGF0aCk7XG4gICAgbGV0IHRzY0NvbW1hbmQgPSBcIlwiO1xuXG4gICAgaWYgKHRoaXMucHJvcHMucHJlQ29tcGlsYXRpb24pIHtcbiAgICAgIGNvbnN0IHRzY29uZmlnID1cbiAgICAgICAgdGhpcy5wcm9wcy50c2NvbmZpZyA/P1xuICAgICAgICBmaW5kVXAoXCJ0c2NvbmZpZy5qc29uXCIsIHBhdGguZGlybmFtZSh0aGlzLnByb3BzLmVudHJ5KSk7XG4gICAgICBpZiAoIXRzY29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCBmaW5kIGEgYHRzY29uZmlnLmpzb25gIGJ1dCBgcHJlQ29tcGlsYXRpb25gIGlzIHNldCB0byBgdHJ1ZWAsIHBsZWFzZSBzcGVjaWZ5IGl0IHZpYSBgdHNjb25maWdgXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBnZXRUc2NvbmZpZ0NvbXBpbGVyT3B0aW9ucyh0c2NvbmZpZyk7XG4gICAgICB0c2NDb21tYW5kID0gYCR7b3B0aW9ucy50c2NSdW5uZXJ9IFwiJHtyZWxhdGl2ZUVudHJ5UGF0aH1cIiAke2NvbXBpbGVyT3B0aW9uc31gO1xuICAgICAgcmVsYXRpdmVFbnRyeVBhdGggPSByZWxhdGl2ZUVudHJ5UGF0aC5yZXBsYWNlKC9cXC50cyh4PykkLywgXCIuanMkMVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZXJzID0gT2JqZWN0LmVudHJpZXModGhpcy5wcm9wcy5sb2FkZXIgPz8ge30pO1xuICAgIGNvbnN0IGRlZmluZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLnByb3BzLmRlZmluZSA/PyB7fSk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5zb3VyY2VNYXAgPT09IGZhbHNlICYmIHRoaXMucHJvcHMuc291cmNlTWFwTW9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic291cmNlTWFwTW9kZSBjYW5ub3QgYmUgdXNlZCB3aGVuIHNvdXJjZU1hcCBpcyBmYWxzZVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VNYXBFbmFibGVkID0gdGhpcy5wcm9wcy5zb3VyY2VNYXBNb2RlID8/IHRoaXMucHJvcHMuc291cmNlTWFwO1xuICAgIGNvbnN0IHNvdXJjZU1hcE1vZGUgPSB0aGlzLnByb3BzLnNvdXJjZU1hcE1vZGUgPz8gU291cmNlTWFwTW9kZS5ERUZBVUxUO1xuICAgIGNvbnN0IHNvdXJjZU1hcFZhbHVlID1cbiAgICAgIHNvdXJjZU1hcE1vZGUgPT09IFNvdXJjZU1hcE1vZGUuREVGQVVMVFxuICAgICAgICA/IFwiXCJcbiAgICAgICAgOiBgPSR7dGhpcy5wcm9wcy5zb3VyY2VNYXBNb2RlfWA7XG4gICAgY29uc3Qgc291cmNlc0NvbnRlbnQgPSB0aGlzLnByb3BzLnNvdXJjZXNDb250ZW50ID8/IHRydWU7XG5cbiAgICBjb25zdCBvdXRGaWxlID1cbiAgICAgIHRoaXMucHJvcHMuZm9ybWF0ID09PSBPdXRwdXRGb3JtYXQuRVNNID8gXCJpbmRleC5tanNcIiA6IFwiaW5kZXguanNcIjtcbiAgICBjb25zdCBlc2J1aWxkQ29tbWFuZDogc3RyaW5nW10gPSBbXG4gICAgICBvcHRpb25zLmVzYnVpbGRSdW5uZXIsXG4gICAgICBcIi0tYnVuZGxlXCIsXG4gICAgICBgXCIke3JlbGF0aXZlRW50cnlQYXRofVwiYCxcbiAgICAgIGAtLXRhcmdldD0ke3RoaXMucHJvcHMudGFyZ2V0ID8/IHRvVGFyZ2V0KHRoaXMucHJvcHMucnVudGltZSl9YCxcbiAgICAgIFwiLS1wbGF0Zm9ybT1ub2RlXCIsXG4gICAgICAuLi4odGhpcy5wcm9wcy5mb3JtYXQgPyBbYC0tZm9ybWF0PSR7dGhpcy5wcm9wcy5mb3JtYXR9YF0gOiBbXSksXG4gICAgICBgLS1vdXRmaWxlPVwiJHtwYXRoSm9pbihvcHRpb25zLm91dHB1dERpciwgb3V0RmlsZSl9XCJgLFxuICAgICAgLi4uKHRoaXMucHJvcHMubWluaWZ5ID8gW1wiLS1taW5pZnlcIl0gOiBbXSksXG4gICAgICAuLi4oc291cmNlTWFwRW5hYmxlZCA/IFtgLS1zb3VyY2VtYXAke3NvdXJjZU1hcFZhbHVlfWBdIDogW10pLFxuICAgICAgLi4uKHNvdXJjZXNDb250ZW50ID8gW10gOiBbYC0tc291cmNlcy1jb250ZW50PSR7c291cmNlc0NvbnRlbnR9YF0pLFxuICAgICAgLi4udGhpcy5leHRlcm5hbHMubWFwKChleHRlcm5hbCkgPT4gYC0tZXh0ZXJuYWw6JHtleHRlcm5hbH1gKSxcbiAgICAgIC4uLmxvYWRlcnMubWFwKChbZXh0LCBuYW1lXSkgPT4gYC0tbG9hZGVyOiR7ZXh0fT0ke25hbWV9YCksXG4gICAgICAuLi5kZWZpbmVzLm1hcChcbiAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gYC0tZGVmaW5lOiR7a2V5fT0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gLFxuICAgICAgKSxcbiAgICAgIC4uLih0aGlzLnByb3BzLmxvZ0xldmVsID8gW2AtLWxvZy1sZXZlbD0ke3RoaXMucHJvcHMubG9nTGV2ZWx9YF0gOiBbXSksXG4gICAgICAuLi4odGhpcy5wcm9wcy5rZWVwTmFtZXMgPyBbXCItLWtlZXAtbmFtZXNcIl0gOiBbXSksXG4gICAgICAuLi4odGhpcy5yZWxhdGl2ZVRzY29uZmlnUGF0aFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIGAtLXRzY29uZmlnPVwiJHtwYXRoSm9pbihvcHRpb25zLmlucHV0RGlyLCB0aGlzLnJlbGF0aXZlVHNjb25maWdQYXRoKX1cImAsXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLih0aGlzLnByb3BzLm1ldGFmaWxlXG4gICAgICAgID8gW2AtLW1ldGFmaWxlPVwiJHtwYXRoSm9pbihvcHRpb25zLm91dHB1dERpciwgXCJpbmRleC5tZXRhLmpzb25cIil9XCJgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLih0aGlzLnByb3BzLmJhbm5lclxuICAgICAgICA/IFtgLS1iYW5uZXI6anM9JHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmJhbm5lcil9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4odGhpcy5wcm9wcy5mb290ZXJcbiAgICAgICAgPyBbYC0tZm9vdGVyOmpzPSR7SlNPTi5zdHJpbmdpZnkodGhpcy5wcm9wcy5mb290ZXIpfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKHRoaXMucHJvcHMubWFpbkZpZWxkc1xuICAgICAgICA/IFtgLS1tYWluLWZpZWxkcz0ke3RoaXMucHJvcHMubWFpbkZpZWxkcy5qb2luKFwiLFwiKX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLih0aGlzLnByb3BzLmluamVjdFxuICAgICAgICA/IHRoaXMucHJvcHMuaW5qZWN0Lm1hcCgoaSkgPT4gYC0taW5qZWN0OlwiJHtpfVwiYClcbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4odGhpcy5wcm9wcy5lc2J1aWxkQXJncyA/IFt0b0NsaUFyZ3ModGhpcy5wcm9wcy5lc2J1aWxkQXJncyldIDogW10pLFxuICAgIF07XG5cbiAgICBsZXQgZGVwc0NvbW1hbmQgPSBcIlwiO1xuICAgIGlmICh0aGlzLnByb3BzLm5vZGVNb2R1bGVzKSB7XG4gICAgICAvLyBGaW5kICdwYWNrYWdlLmpzb24nIGNsb3Nlc3QgdG8gZW50cnkgZm9sZGVyLCB3ZSBhcmUgZ29pbmcgdG8gZXh0cmFjdCB0aGVcbiAgICAgIC8vIG1vZHVsZXMgdmVyc2lvbnMgZnJvbSBpdC5cbiAgICAgIGNvbnN0IHBrZ1BhdGggPSBmaW5kVXAoXCJwYWNrYWdlLmpzb25cIiwgcGF0aC5kaXJuYW1lKHRoaXMucHJvcHMuZW50cnkpKTtcbiAgICAgIGlmICghcGtnUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgZmluZCBhIGBwYWNrYWdlLmpzb25gIGluIHRoaXMgcHJvamVjdC4gVXNpbmcgYG5vZGVNb2R1bGVzYCByZXF1aXJlcyBhIGBwYWNrYWdlLmpzb25gLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgZGVwZW5kZW5jaWVzIHZlcnNpb25zLCBsb2NrIGZpbGUgYW5kIGluc3RhbGxlclxuICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZXh0cmFjdERlcGVuZGVuY2llcyhwa2dQYXRoLCB0aGlzLnByb3BzLm5vZGVNb2R1bGVzKTtcbiAgICAgIGNvbnN0IG9zQ29tbWFuZCA9IG5ldyBPc0NvbW1hbmQob3B0aW9ucy5vc1BsYXRmb3JtKTtcblxuICAgICAgY29uc3QgbG9ja0ZpbGVQYXRoID0gcGF0aEpvaW4oXG4gICAgICAgIG9wdGlvbnMuaW5wdXREaXIsXG4gICAgICAgIHRoaXMucmVsYXRpdmVEZXBzTG9ja0ZpbGVQYXRoID8/IHRoaXMucGFja2FnZU1hbmFnZXIubG9ja0ZpbGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1BucG0gPSB0aGlzLnBhY2thZ2VNYW5hZ2VyLmxvY2tGaWxlID09PSBMb2NrRmlsZS5QTlBNO1xuICAgICAgY29uc3QgaXNCdW4gPSB0aGlzLnBhY2thZ2VNYW5hZ2VyLmxvY2tGaWxlID09PSBMb2NrRmlsZS5CVU47XG5cbiAgICAgIC8vIENyZWF0ZSBkdW1teSBwYWNrYWdlLmpzb24sIGNvcHkgbG9jayBmaWxlIGlmIGFueSBhbmQgdGhlbiBpbnN0YWxsXG4gICAgICBkZXBzQ29tbWFuZCA9IGNoYWluKFtcbiAgICAgICAgaXNQbnBtXG4gICAgICAgICAgPyBvc0NvbW1hbmQud3JpdGUoXG4gICAgICAgICAgICAgIHBhdGhKb2luKG9wdGlvbnMub3V0cHV0RGlyLCBcInBucG0td29ya3NwYWNlLnlhbWxcIiksXG4gICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBcIlwiLCAvLyBFbnN1cmUgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpcyBpbnN0YWxsZWQgbG9jYWxseSBieSBjcmVhdGluZyBsb2NhbCAncG5wbS13b3Jrc3BhY2UueWFtbCcgZmlsZVxuICAgICAgICBvc0NvbW1hbmQud3JpdGVKc29uKHBhdGhKb2luKG9wdGlvbnMub3V0cHV0RGlyLCBcInBhY2thZ2UuanNvblwiKSwge1xuICAgICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgfSksXG4gICAgICAgIG9zQ29tbWFuZC5jb3B5KFxuICAgICAgICAgIGxvY2tGaWxlUGF0aCxcbiAgICAgICAgICBwYXRoSm9pbihvcHRpb25zLm91dHB1dERpciwgdGhpcy5wYWNrYWdlTWFuYWdlci5sb2NrRmlsZSksXG4gICAgICAgICksXG4gICAgICAgIG9zQ29tbWFuZC5jaGFuZ2VEaXJlY3Rvcnkob3B0aW9ucy5vdXRwdXREaXIpLFxuICAgICAgICB0aGlzLnBhY2thZ2VNYW5hZ2VyLmluc3RhbGxDb21tYW5kLmpvaW4oXCIgXCIpLFxuICAgICAgICBpc1BucG1cbiAgICAgICAgICA/IG9zQ29tbWFuZC5yZW1vdmUoXG4gICAgICAgICAgICAgIHBhdGhKb2luKG9wdGlvbnMub3V0cHV0RGlyLCBcIm5vZGVfbW9kdWxlc1wiLCBcIi5tb2R1bGVzLnlhbWxcIiksXG4gICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBcIlwiLCAvLyBSZW1vdmUgJy5tb2R1bGVzLnlhbWwnIGZpbGUgd2hpY2ggY2hhbmdlcyBvbiBlYWNoIGRlcGxveW1lbnRcbiAgICAgICAgaXNCdW5cbiAgICAgICAgICA/IG9zQ29tbWFuZC5yZW1vdmVEaXIoXG4gICAgICAgICAgICAgIHBhdGhKb2luKG9wdGlvbnMub3V0cHV0RGlyLCBcIm5vZGVfbW9kdWxlc1wiLCBcIi5jYWNoZVwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IFwiXCIsIC8vIFJlbW92ZSBub2RlX21vZHVsZXMvLmNhY2hlIGZvbGRlciBzaW5jZSB5b3UgY2FuJ3QgZGlzYWJsZSBpdHMgY3JlYXRpb25cbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHJldHVybiBjaGFpbihbXG4gICAgICAuLi4odGhpcy5wcm9wcy5jb21tYW5kSG9va3M/LmJlZm9yZUJ1bmRsaW5nKFxuICAgICAgICBvcHRpb25zLmlucHV0RGlyLFxuICAgICAgICBvcHRpb25zLm91dHB1dERpcixcbiAgICAgICkgPz8gW10pLFxuICAgICAgdHNjQ29tbWFuZCxcbiAgICAgIGVzYnVpbGRDb21tYW5kLmpvaW4oXCIgXCIpLFxuICAgICAgLi4uKCh0aGlzLnByb3BzLm5vZGVNb2R1bGVzICYmXG4gICAgICAgIHRoaXMucHJvcHMuY29tbWFuZEhvb2tzPy5iZWZvcmVJbnN0YWxsKFxuICAgICAgICAgIG9wdGlvbnMuaW5wdXREaXIsXG4gICAgICAgICAgb3B0aW9ucy5vdXRwdXREaXIsXG4gICAgICAgICkpID8/XG4gICAgICAgIFtdKSxcbiAgICAgIGRlcHNDb21tYW5kLFxuICAgICAgLi4uKHRoaXMucHJvcHMuY29tbWFuZEhvb2tzPy5hZnRlckJ1bmRsaW5nKFxuICAgICAgICBvcHRpb25zLmlucHV0RGlyLFxuICAgICAgICBvcHRpb25zLm91dHB1dERpcixcbiAgICAgICkgPz8gW10pLFxuICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhbEJ1bmRsaW5nUHJvdmlkZXIoKTogSUxvY2FsQnVuZGxpbmcge1xuICAgIGNvbnN0IG9zUGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuICAgIGNvbnN0IGNyZWF0ZUxvY2FsQ29tbWFuZCA9IChcbiAgICAgIG91dHB1dERpcjogc3RyaW5nLFxuICAgICAgZXNidWlsZDogUGFja2FnZUluc3RhbGxhdGlvbixcbiAgICAgIHRzYz86IFBhY2thZ2VJbnN0YWxsYXRpb24sXG4gICAgKSA9PlxuICAgICAgdGhpcy5jcmVhdGVCdW5kbGluZ0NvbW1hbmQoe1xuICAgICAgICBpbnB1dERpcjogdGhpcy5wcm9qZWN0Um9vdCxcbiAgICAgICAgb3V0cHV0RGlyLFxuICAgICAgICBlc2J1aWxkUnVubmVyOiBlc2J1aWxkLmlzTG9jYWxcbiAgICAgICAgICA/IHRoaXMucGFja2FnZU1hbmFnZXIucnVuQmluQ29tbWFuZChcImVzYnVpbGRcIilcbiAgICAgICAgICA6IFwiZXNidWlsZFwiLFxuICAgICAgICB0c2NSdW5uZXI6XG4gICAgICAgICAgdHNjICYmXG4gICAgICAgICAgKHRzYy5pc0xvY2FsID8gdGhpcy5wYWNrYWdlTWFuYWdlci5ydW5CaW5Db21tYW5kKFwidHNjXCIpIDogXCJ0c2NcIiksXG4gICAgICAgIG9zUGxhdGZvcm0sXG4gICAgICB9KTtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMucHJvcHMuZW52aXJvbm1lbnQgPz8ge307XG4gICAgY29uc3QgY3dkID0gdGhpcy5wcm9qZWN0Um9vdDtcblxuICAgIHJldHVybiB7XG4gICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFCdW5kbGluZy5lc2J1aWxkSW5zdGFsbGF0aW9uKSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoXG4gICAgICAgICAgICBcImVzYnVpbGQgY2Fubm90IHJ1biBsb2NhbGx5LiBTd2l0Y2hpbmcgdG8gRG9ja2VyIGJ1bmRsaW5nLlxcblwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFCdW5kbGluZy5lc2J1aWxkSW5zdGFsbGF0aW9uLnZlcnNpb24uc3RhcnRzV2l0aChcbiAgICAgICAgICAgIGAke0VTQlVJTERfTUFKT1JfVkVSU0lPTn0uYCxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBlc2J1aWxkIHZlcnNpb24gJHtFU0JVSUxEX01BSk9SX1ZFUlNJT059LnggYnV0IGdvdCAke0J1bmRsaW5nLmVzYnVpbGRJbnN0YWxsYXRpb24udmVyc2lvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbENvbW1hbmQgPSBjcmVhdGVMb2NhbENvbW1hbmQoXG4gICAgICAgICAgb3V0cHV0RGlyLFxuICAgICAgICAgIEJ1bmRsaW5nLmVzYnVpbGRJbnN0YWxsYXRpb24sXG4gICAgICAgICAgQnVuZGxpbmcudHNjSW5zdGFsbGF0aW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4ZWMoXG4gICAgICAgICAgb3NQbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJjbWRcIiA6IFwiYmFzaFwiLFxuICAgICAgICAgIFtvc1BsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIi9jXCIgOiBcIi1jXCIsIGxvY2FsQ29tbWFuZF0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZpcm9ubWVudCB9LFxuICAgICAgICAgICAgc3RkaW86IFtcbiAgICAgICAgICAgICAgLy8gc2hvdyBvdXRwdXRcbiAgICAgICAgICAgICAgXCJpZ25vcmVcIiwgLy8gaWdub3JlIHN0ZGlvXG4gICAgICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLCAvLyByZWRpcmVjdCBzdGRvdXQgdG8gc3RkZXJyXG4gICAgICAgICAgICAgIFwiaW5oZXJpdFwiLCAvLyBpbmhlcml0IHN0ZGVyclxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgIHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50czogb3NQbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuaW50ZXJmYWNlIEJ1bmRsaW5nQ29tbWFuZE9wdGlvbnMge1xuICByZWFkb25seSBpbnB1dERpcjogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXREaXI6IHN0cmluZztcbiAgcmVhZG9ubHkgZXNidWlsZFJ1bm5lcjogc3RyaW5nO1xuICByZWFkb25seSB0c2NSdW5uZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9zUGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybTtcbn1cblxuLyoqXG4gKiBPUyBhZ25vc3RpYyBjb21tYW5kXG4gKi9cbmNsYXNzIE9zQ29tbWFuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3NQbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtKSB7fVxuXG4gIHB1YmxpYyB3cml0ZShmaWxlUGF0aDogc3RyaW5nLCBkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9zUGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIC8vIGlmIGBkYXRhYCBpcyBlbXB0eSwgZWNobyBhIGJsYW5rIGxpbmUsIG90aGVyd2lzZSB0aGUgZmlsZSB3aWxsIGNvbnRhaW4gYSBgXmAgY2hhcmFjdGVyXG4gICAgICAgIHJldHVybiBgZWNoby4gPiBcIiR7ZmlsZVBhdGh9XCJgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBlY2hvIF4ke2RhdGF9XiA+IFwiJHtmaWxlUGF0aH1cImA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBlY2hvICcke2RhdGF9JyA+IFwiJHtmaWxlUGF0aH1cImA7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVKc29uKGZpbGVQYXRoOiBzdHJpbmcsIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWREYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMud3JpdGUoZmlsZVBhdGgsIHN0cmluZ2lmaWVkRGF0YSk7XG4gIH1cblxuICBwdWJsaWMgY29weShzcmM6IHN0cmluZywgZGVzdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vc1BsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICAgIHJldHVybiBgY29weSBcIiR7c3JjfVwiIFwiJHtkZXN0fVwiYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYGNwIFwiJHtzcmN9XCIgXCIke2Rlc3R9XCJgO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZURpcmVjdG9yeShkaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjZCBcIiR7ZGlyfVwiYDtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmUoZmlsZVBhdGg6IHN0cmluZywgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMub3NQbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgICByZXR1cm4gYGRlbCBcIiR7ZmlsZVBhdGh9XCJgO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSBmb3JjZSA/IFtcIi1mXCJdIDogW107XG4gICAgcmV0dXJuIGBybSAke29wdHMuam9pbihcIiBcIil9IFwiJHtmaWxlUGF0aH1cImA7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRGlyKGRpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vc1BsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICAgIHJldHVybiBgcm1kaXIgL3MgL3EgXCIke2Rpcn1cImA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBybSAtcmYgXCIke2Rpcn1cImA7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGFpbiBjb21tYW5kc1xuICovXG5mdW5jdGlvbiBjaGFpbihjb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY29tbWFuZHMuZmlsdGVyKChjKSA9PiAhIWMpLmpvaW4oXCIgJiYgXCIpO1xufVxuXG4vKipcbiAqIFBsYXRmb3JtIHNwZWNpZmljIHBhdGggam9pblxuICovXG5mdW5jdGlvbiBvc1BhdGhKb2luKHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICguLi5wYXRoczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGpvaW5lZCA9IHBhdGguam9pbiguLi5wYXRocyk7XG4gICAgLy8gSWYgd2UgYXJlIG9uIHdpbjMyIGJ1dCBuZWVkIHBvc2l4IHN0eWxlIHBhdGhzXG4gICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09IFwid2luMzJcIiAmJiBwbGF0Zm9ybSAhPT0gXCJ3aW4zMlwiKSB7XG4gICAgICByZXR1cm4gam9pbmVkLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgIH1cbiAgICByZXR1cm4gam9pbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcnVudGltZSB0byBhbiBlc2J1aWxkIG5vZGUgdGFyZ2V0XG4gKi9cbmZ1bmN0aW9uIHRvVGFyZ2V0KHJ1bnRpbWU6IFJ1bnRpbWUpOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IHJ1bnRpbWUubmFtZS5tYXRjaCgvbm9kZWpzKFxcZCspLyk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBleHRyYWN0IHZlcnNpb24gZnJvbSBydW50aW1lLlwiKTtcbiAgfVxuXG4gIHJldHVybiBgbm9kZSR7bWF0Y2hbMV19YDtcbn1cblxuZnVuY3Rpb24gdG9DbGlBcmdzKGVzYnVpbGRBcmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IGJvb2xlYW4gfSk6IHN0cmluZyB7XG4gIGNvbnN0IGFyZ3MgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBjb25zdCByZVNwZWNpZmllZEtleXMgPSBbXG4gICAgXCItLWFsaWFzXCIsXG4gICAgXCItLWRyb3BcIixcbiAgICBcIi0tcHVyZVwiLFxuICAgIFwiLS1sb2ctb3ZlcnJpZGVcIixcbiAgICBcIi0tb3V0LWV4dGVuc2lvblwiLFxuICBdO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVzYnVpbGRBcmdzKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgYXJncy5wdXNoKGtleSk7XG4gICAgfSBlbHNlIGlmIChyZVNwZWNpZmllZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgYXJncy5wdXNoKGAke2tleX06XCIke3ZhbHVlfVwiYCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgYXJncy5wdXNoKGAke2tleX09XCIke3ZhbHVlfVwiYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyZ3Muam9pbihcIiBcIik7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIGEgZ2l2ZW4gTm9kZS5qcyBydW50aW1lIHN1cHBvcnRzIEVTTSAoRUNNQVNjcmlwdCBtb2R1bGVzKVxuICovXG5mdW5jdGlvbiBpc0VzbVJ1bnRpbWUocnVudGltZTogUnVudGltZSk6IGJvb2xlYW4ge1xuICBjb25zdCB1bnN1cHBvcnRlZFJ1bnRpbWVzID0gW1xuICAgIFJ1bnRpbWUuTk9ERUpTLFxuICAgIFJ1bnRpbWUuTk9ERUpTXzRfMyxcbiAgICBSdW50aW1lLk5PREVKU182XzEwLFxuICAgIFJ1bnRpbWUuTk9ERUpTXzhfMTAsXG4gICAgUnVudGltZS5OT0RFSlNfMTBfWCxcbiAgICBSdW50aW1lLk5PREVKU18xMl9YLFxuICBdO1xuXG4gIHJldHVybiAhdW5zdXBwb3J0ZWRSdW50aW1lcy5zb21lKChyKSA9PiB7XG4gICAgcmV0dXJuIHIuZmFtaWx5ID09PSBydW50aW1lLmZhbWlseSAmJiByLm5hbWUgPT09IHJ1bnRpbWUubmFtZTtcbiAgfSk7XG59XG4iXX0=