terraconstructs 0.0.22 → 0.0.24

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 (288) hide show
  1. package/.jsii +104400 -90067
  2. package/go.mod +2 -1
  3. package/go.sum +2 -0
  4. package/lib/aws/arn.js +1 -1
  5. package/lib/aws/aws-construct.js +1 -1
  6. package/lib/aws/aws-stack.js +1 -1
  7. package/lib/aws/aws-tags.js +2 -2
  8. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  9. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  10. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  11. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  12. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  13. package/lib/aws/cloudwatch/alarm.js +4 -5
  14. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  15. package/lib/aws/cloudwatch/dashboard.js +1 -1
  16. package/lib/aws/cloudwatch/data-protection-policy.js +5 -5
  17. package/lib/aws/cloudwatch/graph.js +8 -8
  18. package/lib/aws/cloudwatch/layout.js +3 -3
  19. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  20. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  21. package/lib/aws/cloudwatch/log-group.js +3 -3
  22. package/lib/aws/cloudwatch/log-query.js +1 -1
  23. package/lib/aws/cloudwatch/log-stream.js +1 -1
  24. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  25. package/lib/aws/cloudwatch/metric.js +4 -4
  26. package/lib/aws/cloudwatch/pattern.js +3 -3
  27. package/lib/aws/cloudwatch/policy.js +1 -1
  28. package/lib/aws/cloudwatch/private/metric-util.js +1 -2
  29. package/lib/aws/cloudwatch/query-definition.js +2 -2
  30. package/lib/aws/cloudwatch/stats.js +1 -1
  31. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  32. package/lib/aws/cloudwatch/text.js +1 -1
  33. package/lib/aws/cloudwatch/variable.js +3 -3
  34. package/lib/aws/cloudwatch/widget.js +1 -1
  35. package/lib/aws/compute/activity.js +1 -1
  36. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  37. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  38. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  39. package/lib/aws/compute/alb/application-listener.js +2 -4
  40. package/lib/aws/compute/alb/application-load-balancer.js +2 -4
  41. package/lib/aws/compute/alb/application-target-group.js +1 -1
  42. package/lib/aws/compute/alb/conditions.js +1 -1
  43. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  44. package/lib/aws/compute/alb/trust-store.js +1 -1
  45. package/lib/aws/compute/architecture.js +1 -1
  46. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  47. package/lib/aws/compute/autoscaling-common/index.d.ts +3 -0
  48. package/lib/aws/compute/autoscaling-common/index.js +21 -0
  49. package/lib/aws/compute/autoscaling-common/interval-utils.d.ts +21 -0
  50. package/lib/aws/compute/autoscaling-common/interval-utils.js +213 -0
  51. package/lib/aws/compute/autoscaling-common/test-utils.d.ts +21 -0
  52. package/lib/aws/compute/autoscaling-common/test-utils.js +94 -0
  53. package/lib/aws/compute/autoscaling-common/types.d.ts +34 -0
  54. package/lib/aws/compute/autoscaling-common/types.js +3 -0
  55. package/lib/aws/compute/base-scalable-attribute.d.ts +74 -0
  56. package/lib/aws/compute/base-scalable-attribute.js +58 -0
  57. package/lib/aws/compute/bastion-host.js +1 -1
  58. package/lib/aws/compute/chain.js +1 -1
  59. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  60. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  61. package/lib/aws/compute/client-vpn-route.js +2 -2
  62. package/lib/aws/compute/condition.js +1 -1
  63. package/lib/aws/compute/connections.js +1 -1
  64. package/lib/aws/compute/ec2-util.js +1 -4
  65. package/lib/aws/compute/event-invoke-config.js +1 -1
  66. package/lib/aws/compute/event-source-filter.js +2 -2
  67. package/lib/aws/compute/event-source-mapping.js +3 -3
  68. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  69. package/lib/aws/compute/event-sources/s3.js +1 -1
  70. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  71. package/lib/aws/compute/event-sources/sqs.js +1 -1
  72. package/lib/aws/compute/fields.js +4 -4
  73. package/lib/aws/compute/function-alias.js +1 -1
  74. package/lib/aws/compute/function-base.js +7 -8
  75. package/lib/aws/compute/function-destinations/event-bridge.js +3 -3
  76. package/lib/aws/compute/function-destinations/function.js +1 -1
  77. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  78. package/lib/aws/compute/function-nodejs.js +1 -1
  79. package/lib/aws/compute/function-url.js +1 -1
  80. package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
  81. package/lib/aws/compute/function-vpc-config.generated.js +1 -1
  82. package/lib/aws/compute/function.js +1 -1
  83. package/lib/aws/compute/index.d.ts +7 -0
  84. package/lib/aws/compute/index.js +11 -2
  85. package/lib/aws/compute/instance-types.js +1 -1
  86. package/lib/aws/compute/instance.js +1 -1
  87. package/lib/aws/compute/ip-addresses.js +2 -2
  88. package/lib/aws/compute/ipam.js +1 -1
  89. package/lib/aws/compute/key-pair.js +1 -1
  90. package/lib/aws/compute/launch-template.js +2 -2
  91. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  92. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  93. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  94. package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +31 -31
  95. package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +1 -1
  96. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +4 -4
  97. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +1 -1
  98. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  99. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  100. package/lib/aws/compute/lb-shared/util.js +1 -2
  101. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  102. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  103. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  104. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  105. package/lib/aws/compute/load-balancer.js +3 -3
  106. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  107. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  108. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  109. package/lib/aws/compute/machine-image/common.js +1 -1
  110. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  111. package/lib/aws/compute/machine-image/utils.js +6 -6
  112. package/lib/aws/compute/nat.js +5 -5
  113. package/lib/aws/compute/network-acl-types.js +2 -2
  114. package/lib/aws/compute/network-acl.js +3 -3
  115. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  116. package/lib/aws/compute/nlb/network-listener.js +2 -3
  117. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  118. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  119. package/lib/aws/compute/peer.js +1 -1
  120. package/lib/aws/compute/placement-group.js +1 -1
  121. package/lib/aws/compute/port.js +1 -1
  122. package/lib/aws/compute/prefix-list.js +1 -1
  123. package/lib/aws/compute/private/context-stub.js +2 -2
  124. package/lib/aws/compute/route.js +11 -11
  125. package/lib/aws/compute/scalable-target.d.ts +197 -0
  126. package/lib/aws/compute/scalable-target.js +168 -0
  127. package/lib/aws/compute/schedule.d.ts +81 -0
  128. package/lib/aws/compute/schedule.js +145 -0
  129. package/lib/aws/compute/security-group.js +4 -4
  130. package/lib/aws/compute/state-graph.js +1 -1
  131. package/lib/aws/compute/state-machine-fragment.js +1 -1
  132. package/lib/aws/compute/state-machine.js +4 -4
  133. package/lib/aws/compute/states/choice.js +1 -1
  134. package/lib/aws/compute/states/custom-state.js +1 -1
  135. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  136. package/lib/aws/compute/states/distributed-map/item-reader.js +7 -7
  137. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  138. package/lib/aws/compute/states/distributed-map.js +4 -4
  139. package/lib/aws/compute/states/fail.js +1 -1
  140. package/lib/aws/compute/states/map-base.js +1 -1
  141. package/lib/aws/compute/states/map.js +1 -1
  142. package/lib/aws/compute/states/parallel.js +1 -1
  143. package/lib/aws/compute/states/pass.js +2 -2
  144. package/lib/aws/compute/states/state.js +1 -1
  145. package/lib/aws/compute/states/succeed.js +1 -1
  146. package/lib/aws/compute/states/task-base.js +2 -2
  147. package/lib/aws/compute/states/task.js +1 -1
  148. package/lib/aws/compute/states/wait.js +2 -2
  149. package/lib/aws/compute/step-scaling-action.d.ts +148 -0
  150. package/lib/aws/compute/step-scaling-action.js +109 -0
  151. package/lib/aws/compute/step-scaling-policy.d.ts +132 -0
  152. package/lib/aws/compute/step-scaling-policy.js +153 -0
  153. package/lib/aws/compute/subnet-v2.js +2 -2
  154. package/lib/aws/compute/subnet.js +1 -1
  155. package/lib/aws/compute/target-tracking-scaling-policy.d.ts +262 -0
  156. package/lib/aws/compute/target-tracking-scaling-policy.js +234 -0
  157. package/lib/aws/compute/task-credentials.js +1 -1
  158. package/lib/aws/compute/task-input.js +1 -1
  159. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  160. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  161. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  162. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  163. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  164. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  165. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  166. package/lib/aws/compute/types.js +1 -1
  167. package/lib/aws/compute/user-data.js +3 -3
  168. package/lib/aws/compute/volume.js +2 -2
  169. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  170. package/lib/aws/compute/vpc-endpoint.js +6 -6
  171. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  172. package/lib/aws/compute/vpc-v2-base.js +1 -1
  173. package/lib/aws/compute/vpc-v2.js +2 -2
  174. package/lib/aws/compute/vpc.d.ts +1 -1
  175. package/lib/aws/compute/vpc.js +10 -16
  176. package/lib/aws/compute/vpn.js +4 -7
  177. package/lib/aws/compute/windows-versions.js +1 -2
  178. package/lib/aws/edge/certificate.js +1 -1
  179. package/lib/aws/edge/distribution.js +4 -5
  180. package/lib/aws/edge/dns-alias-record-targets.js +3 -3
  181. package/lib/aws/edge/dns-record.js +13 -13
  182. package/lib/aws/edge/dns-zone.js +1 -1
  183. package/lib/aws/edge/function.js +2 -2
  184. package/lib/aws/edge/key-value-store.js +4 -4
  185. package/lib/aws/edge/origin.js +3 -3
  186. package/lib/aws/edge/response-headers-policy.js +1 -1
  187. package/lib/aws/encryption/alias.js +1 -1
  188. package/lib/aws/encryption/key.js +1 -1
  189. package/lib/aws/encryption/via-service-principal.js +1 -1
  190. package/lib/aws/iam/grant.js +3 -4
  191. package/lib/aws/iam/group.js +1 -1
  192. package/lib/aws/iam/instance-profile.js +1 -1
  193. package/lib/aws/iam/managed-policy.js +1 -1
  194. package/lib/aws/iam/oidc-provider.js +3 -3
  195. package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
  196. package/lib/aws/iam/policy-document-config.generated.js +1 -1
  197. package/lib/aws/iam/policy-document.js +1 -1
  198. package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
  199. package/lib/aws/iam/policy-statement-props.generated.js +1 -1
  200. package/lib/aws/iam/policy-statement.js +1 -1
  201. package/lib/aws/iam/policy.js +1 -1
  202. package/lib/aws/iam/principals.js +20 -20
  203. package/lib/aws/iam/role.js +1 -1
  204. package/lib/aws/iam/saml-provider.js +2 -2
  205. package/lib/aws/iam/unknown-principal.js +1 -1
  206. package/lib/aws/iam/user.js +1 -1
  207. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  208. package/lib/aws/network/subnet-group.js +3 -3
  209. package/lib/aws/network/subnet.js +4 -4
  210. package/lib/aws/notify/archive.js +1 -1
  211. package/lib/aws/notify/connection.js +7 -7
  212. package/lib/aws/notify/event-bus.js +3 -3
  213. package/lib/aws/notify/event-pattern.js +1 -1
  214. package/lib/aws/notify/input.js +2 -2
  215. package/lib/aws/notify/kinesis-stream.js +1 -1
  216. package/lib/aws/notify/notification-rule.js +1 -1
  217. package/lib/aws/notify/policy.js +1 -1
  218. package/lib/aws/notify/queue-config.generated.d.ts +12 -12
  219. package/lib/aws/notify/queue-config.generated.js +1 -1
  220. package/lib/aws/notify/queue-policy.js +1 -1
  221. package/lib/aws/notify/queue.js +1 -1
  222. package/lib/aws/notify/resource-policy.js +1 -1
  223. package/lib/aws/notify/rule.js +1 -1
  224. package/lib/aws/notify/schedule.js +1 -1
  225. package/lib/aws/notify/subscription-filter.js +1 -1
  226. package/lib/aws/notify/subscription.js +4 -4
  227. package/lib/aws/notify/subscriptions/email.js +1 -1
  228. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  229. package/lib/aws/notify/subscriptions/sms.js +1 -1
  230. package/lib/aws/notify/subscriptions/sqs.js +1 -1
  231. package/lib/aws/notify/subscriptions/url.js +1 -1
  232. package/lib/aws/notify/targets/event-bus.js +1 -1
  233. package/lib/aws/notify/targets/function.js +1 -1
  234. package/lib/aws/notify/targets/log-group.js +2 -2
  235. package/lib/aws/notify/targets/sqs.js +3 -3
  236. package/lib/aws/notify/targets/state-machine.js +1 -1
  237. package/lib/aws/notify/targets/util.js +2 -2
  238. package/lib/aws/notify/topic-base.js +1 -1
  239. package/lib/aws/notify/topic.js +1 -1
  240. package/lib/aws/provider-config.generated.d.ts +33 -33
  241. package/lib/aws/provider-config.generated.js +1 -1
  242. package/lib/aws/storage/billing.d.ts +62 -0
  243. package/lib/aws/storage/billing.js +49 -0
  244. package/lib/aws/storage/bucket-notifications.js +1 -1
  245. package/lib/aws/storage/bucket-policy.js +1 -1
  246. package/lib/aws/storage/bucket-source.js +3 -3
  247. package/lib/aws/storage/bucket.js +2 -2
  248. package/lib/aws/storage/capacity.d.ts +96 -0
  249. package/lib/aws/storage/capacity.js +103 -0
  250. package/lib/aws/storage/cors-config.generated.d.ts +3 -3
  251. package/lib/aws/storage/cors-config.generated.js +1 -1
  252. package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
  253. package/lib/aws/storage/cors-rule-config.generated.js +1 -1
  254. package/lib/aws/storage/dynamodb-canned-metrics.generated.d.ts +493 -0
  255. package/lib/aws/storage/dynamodb-canned-metrics.generated.js +263 -0
  256. package/lib/aws/storage/dynamodb-perms.d.ts +8 -0
  257. package/lib/aws/storage/dynamodb-perms.js +45 -0
  258. package/lib/aws/storage/encryption.d.ts +54 -0
  259. package/lib/aws/storage/encryption.js +116 -0
  260. package/lib/aws/storage/index.d.ts +6 -0
  261. package/lib/aws/storage/index.js +10 -1
  262. package/lib/aws/storage/lifecycle-config.generated.d.ts +7 -7
  263. package/lib/aws/storage/lifecycle-config.generated.js +1 -1
  264. package/lib/aws/storage/notification-targets/function.js +1 -1
  265. package/lib/aws/storage/notification-targets/queue.js +1 -1
  266. package/lib/aws/storage/origin-access-identity.js +1 -1
  267. package/lib/aws/storage/parameter.js +2 -2
  268. package/lib/aws/storage/scalable-attribute-api.d.ts +36 -0
  269. package/lib/aws/storage/scalable-attribute-api.js +3 -0
  270. package/lib/aws/storage/scalable-table-attribute.d.ts +32 -0
  271. package/lib/aws/storage/scalable-table-attribute.js +48 -0
  272. package/lib/aws/storage/shared.d.ts +419 -0
  273. package/lib/aws/storage/shared.js +161 -0
  274. package/lib/aws/storage/table.d.ts +536 -0
  275. package/lib/aws/storage/table.js +1054 -0
  276. package/lib/aws/storage/website-config.generated.d.ts +5 -5
  277. package/lib/aws/storage/website-config.generated.js +1 -1
  278. package/lib/construct-base.js +2 -2
  279. package/lib/duration.js +1 -1
  280. package/lib/expiration.js +1 -1
  281. package/lib/index.d.ts +1 -0
  282. package/lib/index.js +2 -1
  283. package/lib/size.js +1 -1
  284. package/lib/stack-base.js +1 -1
  285. package/lib/terra-func.js +1 -1
  286. package/lib/time-zone.d.ts +724 -0
  287. package/lib/time-zone.js +737 -0
  288. package/package.json +14 -13
@@ -0,0 +1,197 @@
1
+ import { appautoscalingScheduledAction } from "@cdktf/provider-aws";
2
+ import { Construct } from "constructs";
3
+ import { Schedule } from "./schedule";
4
+ import { BasicStepScalingPolicyProps, StepScalingPolicy } from "./step-scaling-policy";
5
+ import { BasicTargetTrackingScalingPolicyProps, TargetTrackingScalingPolicy } from "./target-tracking-scaling-policy";
6
+ import { TimeZone } from "../../time-zone";
7
+ import { AwsConstructBase, AwsConstructProps, IAwsConstruct } from "../aws-construct";
8
+ import * as iam from "../iam";
9
+ /**
10
+ * Represents a Application Auto Scaling Scalable Target
11
+ */
12
+ export interface IScalableTarget extends IAwsConstruct {
13
+ /**
14
+ * The ID of the Scalable Target.
15
+ * This is typically in the format: service-namespace/resource-id/scalable-dimension
16
+ * @attribute
17
+ */
18
+ readonly scalableTargetId: string;
19
+ /**
20
+ * The IAM role that allows Application Auto Scaling to modify your scalable target.
21
+ */
22
+ readonly role?: iam.IRole;
23
+ /**
24
+ * The resource identifier to associate with this scalable target.
25
+ */
26
+ readonly resourceId: string;
27
+ /**
28
+ * The scalable dimension that's associated with the scalable target.
29
+ */
30
+ readonly scalableDimension: string;
31
+ /**
32
+ * The namespace of the AWS service that provides the resource.
33
+ */
34
+ readonly serviceNamespace: ServiceNamespace;
35
+ /**
36
+ * Add a policy statement to the role's policy document.
37
+ * @param statement The policy statement to add
38
+ */
39
+ addToRolePolicy(statement: iam.PolicyStatement): void;
40
+ /**
41
+ * Scale out or in based on time.
42
+ * @param id The ID of the scheduled action
43
+ * @param action The scaling schedule
44
+ */
45
+ scaleOnSchedule(id: string, action: ScalingSchedule): appautoscalingScheduledAction.AppautoscalingScheduledAction;
46
+ /**
47
+ * Scale out or in, in response to a metric.
48
+ * @param id The ID of the scaling policy
49
+ * @param props The properties for the step scaling policy
50
+ */
51
+ scaleOnMetric(id: string, props: BasicStepScalingPolicyProps): StepScalingPolicy;
52
+ /**
53
+ * Scale out or in in order to keep a metric around a target value.
54
+ * @param id The ID of the scaling policy
55
+ * @param props The properties for the target tracking scaling policy
56
+ */
57
+ scaleToTrackMetric(id: string, props: BasicTargetTrackingScalingPolicyProps): TargetTrackingScalingPolicy;
58
+ }
59
+ /**
60
+ * Properties for a scalable target
61
+ */
62
+ export interface ScalableTargetProps extends AwsConstructProps {
63
+ /**
64
+ * The minimum value that Application Auto Scaling can use to scale a target during a scaling activity.
65
+ */
66
+ readonly minCapacity: number;
67
+ /**
68
+ * The maximum value that Application Auto Scaling can use to scale a target during a scaling activity.
69
+ */
70
+ readonly maxCapacity: number;
71
+ /**
72
+ * Role that allows Application Auto Scaling to modify your scalable target.
73
+ *
74
+ * @default A role is automatically created
75
+ */
76
+ readonly role?: iam.IRole;
77
+ /**
78
+ * The resource identifier to associate with this scalable target.
79
+ *
80
+ * This string consists of the resource type and unique identifier.
81
+ *
82
+ * Example value: `service/ecsStack-MyECSCluster-AB12CDE3F4GH/ecsStack-MyECSService-AB12CDE3F4GH`
83
+ *
84
+ * @see https://docs.aws.amazon.com/autoscaling/application/APIReference/API_RegisterScalableTarget.html
85
+ */
86
+ readonly resourceId: string;
87
+ /**
88
+ * The scalable dimension that's associated with the scalable target.
89
+ *
90
+ * Specify the service namespace, resource type, and scaling property.
91
+ *
92
+ * Example value: `ecs:service:DesiredCount`
93
+ * @see https://docs.aws.amazon.com/autoscaling/application/APIReference/API_ScalingPolicy.html
94
+ */
95
+ readonly scalableDimension: string;
96
+ /**
97
+ * The namespace of the AWS service that provides the resource or
98
+ * custom-resource for a resource provided by your own application or
99
+ * service.
100
+ *
101
+ * For valid AWS service namespace values, see the RegisterScalableTarget
102
+ * action in the Application Auto Scaling API Reference.
103
+ *
104
+ * @see https://docs.aws.amazon.com/autoscaling/application/APIReference/API_RegisterScalableTarget.html
105
+ */
106
+ readonly serviceNamespace: ServiceNamespace;
107
+ }
108
+ /**
109
+ * Define a scalable target
110
+ *
111
+ * @resource aws_appautoscaling_target
112
+ */
113
+ export declare class ScalableTarget extends AwsConstructBase implements IScalableTarget {
114
+ static fromScalableTargetId(scope: Construct, id: string, scalableTargetId: string): IScalableTarget;
115
+ readonly scalableTargetId: string;
116
+ readonly role?: iam.IRole;
117
+ readonly resourceId: string;
118
+ readonly scalableDimension: string;
119
+ readonly serviceNamespace: ServiceNamespace;
120
+ private readonly targetResource;
121
+ constructor(scope: Construct, id: string, props: ScalableTargetProps);
122
+ get outputs(): Record<string, any>;
123
+ addToRolePolicy(statement: iam.PolicyStatement): void;
124
+ scaleOnSchedule(scheduleId: string, action: ScalingSchedule): appautoscalingScheduledAction.AppautoscalingScheduledAction;
125
+ scaleOnMetric(policyId: string, props: BasicStepScalingPolicyProps): StepScalingPolicy;
126
+ scaleToTrackMetric(policyId: string, props: BasicTargetTrackingScalingPolicyProps): TargetTrackingScalingPolicy;
127
+ }
128
+ /**
129
+ * A scheduled scaling action
130
+ */
131
+ export interface ScalingSchedule {
132
+ /**
133
+ * When to perform this action.
134
+ */
135
+ readonly schedule: Schedule;
136
+ /**
137
+ * When this scheduled action becomes active.
138
+ *
139
+ * @default The rule is activate immediately
140
+ */
141
+ readonly startTime?: Date;
142
+ /**
143
+ * When this scheduled action expires.
144
+ *
145
+ * @default The rule never expires.
146
+ */
147
+ readonly endTime?: Date;
148
+ /**
149
+ * The new minimum capacity.
150
+ *
151
+ * During the scheduled time, if the current capacity is below the minimum
152
+ * capacity, Application Auto Scaling scales out to the minimum capacity.
153
+ *
154
+ * At least one of maxCapacity and minCapacity must be supplied.
155
+ *
156
+ * @default No new minimum capacity
157
+ */
158
+ readonly minCapacity?: number;
159
+ /**
160
+ * The new maximum capacity.
161
+ *
162
+ * During the scheduled time, the current capacity is above the maximum
163
+ * capacity, Application Auto Scaling scales in to the maximum capacity.
164
+ *
165
+ * At least one of maxCapacity and minCapacity must be supplied.
166
+ *
167
+ * @default No new maximum capacity
168
+ */
169
+ readonly maxCapacity?: number;
170
+ /**
171
+ * The time zone used when referring to the date and time of a scheduled action,
172
+ * when the scheduled action uses an at or cron expression.
173
+ *
174
+ * @default - UTC
175
+ */
176
+ readonly timeZone?: TimeZone;
177
+ }
178
+ /**
179
+ * The service that supports Application AutoScaling
180
+ */
181
+ export declare enum ServiceNamespace {
182
+ ECS = "ecs",
183
+ ELASTIC_MAP_REDUCE = "elasticmapreduce",
184
+ EC2 = "ec2",
185
+ APPSTREAM = "appstream",
186
+ DYNAMODB = "dynamodb",
187
+ RDS = "rds",
188
+ SAGEMAKER = "sagemaker",
189
+ CUSTOM_RESOURCE = "custom-resource",
190
+ LAMBDA = "lambda",
191
+ COMPREHEND = "comprehend",
192
+ KAFKA = "kafka",
193
+ ELASTICACHE = "elasticache",
194
+ NEPTUNE = "neptune",
195
+ CASSANDRA = "cassandra",
196
+ WORKSPACES = "workspaces"
197
+ }
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ServiceNamespace = exports.ScalableTarget = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // https://github.com/aws/aws-cdk/blob/v2.168.0/packages/aws-cdk-lib/aws-applicationautoscaling/lib/scalable-target.ts
7
+ const provider_aws_1 = require("@cdktf/provider-aws");
8
+ const step_scaling_policy_1 = require("./step-scaling-policy");
9
+ const target_tracking_scaling_policy_1 = require("./target-tracking-scaling-policy");
10
+ const token_1 = require("../../token");
11
+ const aws_construct_1 = require("../aws-construct");
12
+ const iam = require("../iam");
13
+ /**
14
+ * Define a scalable target
15
+ *
16
+ * @resource aws_appautoscaling_target
17
+ */
18
+ class ScalableTarget extends aws_construct_1.AwsConstructBase {
19
+ static fromScalableTargetId(scope, id, scalableTargetId) {
20
+ // Assuming scalableTargetId is in the format: serviceNamespace/resourceId/scalableDimension
21
+ const parts = scalableTargetId.split("/");
22
+ if (parts.length < 3) {
23
+ throw new Error("Invalid scalableTargetId format. Expected serviceNamespace/resourceId/scalableDimension");
24
+ }
25
+ const serviceNamespace = parts[0];
26
+ const scalableDimension = parts[parts.length - 1];
27
+ const resourceId = parts.slice(1, -1).join("/");
28
+ class Import extends aws_construct_1.AwsConstructBase {
29
+ constructor(s, i) {
30
+ super(s, i, {
31
+ environmentFromArn: `arn:aws:application-autoscaling:${aws_construct_1.AwsConstructBase.isConstruct(s) ? s.env.region : "unknown"}:${aws_construct_1.AwsConstructBase.isConstruct(s) ? s.env.account : "unknown"}:scalable-target/${scalableTargetId}`,
32
+ });
33
+ this.scalableTargetId = scalableTargetId;
34
+ this.resourceId = resourceId;
35
+ this.scalableDimension = scalableDimension;
36
+ this.serviceNamespace = serviceNamespace;
37
+ // Role is not directly importable with just the target ID, it would need to be imported separately or ARN provided.
38
+ // For simplicity, we'll represent it as an unmodifiable imported role placeholder.
39
+ this.role = iam.Role.fromRoleArn(this, "ImportedRole", "arn:aws:iam::unknown:role/unknownapplicationautoscalingrole", { mutable: false });
40
+ }
41
+ get outputs() {
42
+ return { scalableTargetId: this.scalableTargetId };
43
+ }
44
+ addToRolePolicy(_statement) {
45
+ throw new Error("Cannot add to policy of an imported ScalableTarget role like this.");
46
+ }
47
+ scaleOnSchedule(_actionId, _action) {
48
+ throw new Error("Cannot add scheduled action to an imported ScalableTarget.");
49
+ }
50
+ scaleOnMetric(_policyId, _props) {
51
+ throw new Error("Cannot add step scaling policy to an imported ScalableTarget.");
52
+ }
53
+ scaleToTrackMetric(_policyId, _props) {
54
+ throw new Error("Cannot add target tracking policy to an imported ScalableTarget.");
55
+ }
56
+ }
57
+ return new Import(scope, id);
58
+ }
59
+ constructor(scope, id, props) {
60
+ super(scope, id, props);
61
+ (0, token_1.withResolved)(props.maxCapacity, (max) => {
62
+ if (max < 0) {
63
+ throw new Error(`maxCapacity cannot be negative, got: ${props.maxCapacity}`);
64
+ }
65
+ });
66
+ (0, token_1.withResolved)(props.minCapacity, (min) => {
67
+ if (min < 0) {
68
+ throw new Error(`minCapacity cannot be negative, got: ${props.minCapacity}`);
69
+ }
70
+ });
71
+ (0, token_1.withResolved)(props.minCapacity, props.maxCapacity, (min, max) => {
72
+ if (max < min) {
73
+ throw new Error(`minCapacity (${props.minCapacity}) should be lower than maxCapacity (${props.maxCapacity})`);
74
+ }
75
+ });
76
+ // For DynamoDB autoscaling, use service-linked roles when no explicit role is provided
77
+ // This allows Terraform to automatically manage the appropriate service-linked role
78
+ // rather than creating a custom IAM role that may have incorrect ARN format
79
+ this.role = props.role;
80
+ const targetConfig = {
81
+ maxCapacity: props.maxCapacity,
82
+ minCapacity: props.minCapacity,
83
+ resourceId: props.resourceId,
84
+ scalableDimension: props.scalableDimension,
85
+ serviceNamespace: props.serviceNamespace,
86
+ };
87
+ // Only include roleArn if a role is explicitly provided
88
+ // When omitted, Terraform will use appropriate service-linked roles
89
+ if (this.role) {
90
+ targetConfig.roleArn = this.role.roleArn;
91
+ }
92
+ this.targetResource = new provider_aws_1.appautoscalingTarget.AppautoscalingTarget(this, "Resource", targetConfig);
93
+ this.scalableTargetId = this.targetResource.id;
94
+ this.resourceId = props.resourceId;
95
+ this.scalableDimension = props.scalableDimension;
96
+ this.serviceNamespace = props.serviceNamespace;
97
+ }
98
+ get outputs() {
99
+ return {
100
+ scalableTargetId: this.scalableTargetId,
101
+ roleArn: this.role?.roleArn,
102
+ };
103
+ }
104
+ addToRolePolicy(statement) {
105
+ if (!this.role) {
106
+ throw new Error("Cannot add policy to role when using service-linked roles. " +
107
+ "Provide an explicit role in ScalableTargetProps if you need to add custom policies.");
108
+ }
109
+ this.role.addToPrincipalPolicy(statement);
110
+ }
111
+ scaleOnSchedule(scheduleId, action) {
112
+ if (action.minCapacity === undefined && action.maxCapacity === undefined) {
113
+ throw new Error(`You must supply at least one of minCapacity or maxCapacity, got ${JSON.stringify(action)}`);
114
+ }
115
+ action.schedule._bind(this);
116
+ return new provider_aws_1.appautoscalingScheduledAction.AppautoscalingScheduledAction(this, scheduleId, {
117
+ name: scheduleId,
118
+ serviceNamespace: this.serviceNamespace,
119
+ resourceId: this.resourceId,
120
+ scalableDimension: this.scalableDimension,
121
+ schedule: action.schedule.expressionString,
122
+ startTime: action.startTime?.toISOString(),
123
+ endTime: action.endTime?.toISOString(),
124
+ scalableTargetAction: {
125
+ maxCapacity: action.maxCapacity?.toString(),
126
+ minCapacity: action.minCapacity?.toString(),
127
+ },
128
+ timezone: action.timeZone?.timezoneName,
129
+ });
130
+ }
131
+ scaleOnMetric(policyId, props) {
132
+ return new step_scaling_policy_1.StepScalingPolicy(this, policyId, {
133
+ ...props,
134
+ scalingTarget: this,
135
+ });
136
+ }
137
+ scaleToTrackMetric(policyId, props) {
138
+ return new target_tracking_scaling_policy_1.TargetTrackingScalingPolicy(this, policyId, {
139
+ ...props,
140
+ scalingTarget: this,
141
+ });
142
+ }
143
+ }
144
+ exports.ScalableTarget = ScalableTarget;
145
+ _a = JSII_RTTI_SYMBOL_1;
146
+ ScalableTarget[_a] = { fqn: "terraconstructs.aws.compute.ScalableTarget", version: "0.0.24" };
147
+ /**
148
+ * The service that supports Application AutoScaling
149
+ */
150
+ var ServiceNamespace;
151
+ (function (ServiceNamespace) {
152
+ ServiceNamespace["ECS"] = "ecs";
153
+ ServiceNamespace["ELASTIC_MAP_REDUCE"] = "elasticmapreduce";
154
+ ServiceNamespace["EC2"] = "ec2";
155
+ ServiceNamespace["APPSTREAM"] = "appstream";
156
+ ServiceNamespace["DYNAMODB"] = "dynamodb";
157
+ ServiceNamespace["RDS"] = "rds";
158
+ ServiceNamespace["SAGEMAKER"] = "sagemaker";
159
+ ServiceNamespace["CUSTOM_RESOURCE"] = "custom-resource";
160
+ ServiceNamespace["LAMBDA"] = "lambda";
161
+ ServiceNamespace["COMPREHEND"] = "comprehend";
162
+ ServiceNamespace["KAFKA"] = "kafka";
163
+ ServiceNamespace["ELASTICACHE"] = "elasticache";
164
+ ServiceNamespace["NEPTUNE"] = "neptune";
165
+ ServiceNamespace["CASSANDRA"] = "cassandra";
166
+ ServiceNamespace["WORKSPACES"] = "workspaces";
167
+ })(ServiceNamespace || (exports.ServiceNamespace = ServiceNamespace = {}));
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGFibGUtdGFyZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9jb21wdXRlL3NjYWxhYmxlLXRhcmdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNIQUFzSDtBQUV0SCxzREFHNkI7QUFHN0IsK0RBRytCO0FBQy9CLHFGQUcwQztBQUUxQyx1Q0FBMkM7QUFDM0Msb0RBSTBCO0FBQzFCLDhCQUE4QjtBQTZIOUI7Ozs7R0FJRztBQUNILE1BQWEsY0FDWCxTQUFRLGdDQUFnQjtJQUdqQixNQUFNLENBQUMsb0JBQW9CLENBQ2hDLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixnQkFBd0I7UUFFeEIsNEZBQTRGO1FBQzVGLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FDYix5RkFBeUYsQ0FDMUYsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQXFCLENBQUM7UUFDdEQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVoRCxNQUFNLE1BQU8sU0FBUSxnQ0FBZ0I7WUFPbkMsWUFBWSxDQUFZLEVBQUUsQ0FBUztnQkFDakMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQ1Ysa0JBQWtCLEVBQUUsbUNBQW1DLGdDQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBc0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksZ0NBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsb0JBQW9CLGdCQUFnQixFQUFFO2lCQUNuUSxDQUFDLENBQUM7Z0JBVFcscUJBQWdCLEdBQUcsZ0JBQWdCLENBQUM7Z0JBRXBDLGVBQVUsR0FBRyxVQUFVLENBQUM7Z0JBQ3hCLHNCQUFpQixHQUFHLGlCQUFpQixDQUFDO2dCQUN0QyxxQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztnQkFNbEQsb0hBQW9IO2dCQUNwSCxtRkFBbUY7Z0JBQ25GLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQzlCLElBQUksRUFDSixjQUFjLEVBQ2QsNkRBQTZELEVBQzdELEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUNuQixDQUFDO1lBQ0osQ0FBQztZQUVELElBQVcsT0FBTztnQkFDaEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JELENBQUM7WUFFTSxlQUFlLENBQUMsVUFBK0I7Z0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQ2Isb0VBQW9FLENBQ3JFLENBQUM7WUFDSixDQUFDO1lBRU0sZUFBZSxDQUNwQixTQUFpQixFQUNqQixPQUF3QjtnQkFFeEIsTUFBTSxJQUFJLEtBQUssQ0FDYiw0REFBNEQsQ0FDN0QsQ0FBQztZQUNKLENBQUM7WUFFTSxhQUFhLENBQ2xCLFNBQWlCLEVBQ2pCLE1BQW1DO2dCQUVuQyxNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO1lBQ0osQ0FBQztZQUVNLGtCQUFrQixDQUN2QixTQUFpQixFQUNqQixNQUE2QztnQkFFN0MsTUFBTSxJQUFJLEtBQUssQ0FDYixrRUFBa0UsQ0FDbkUsQ0FBQztZQUNKLENBQUM7U0FDRjtRQUNELE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFVRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUEsb0JBQVksRUFBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FDYix3Q0FBd0MsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUM1RCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxvQkFBWSxFQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0QyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDWixNQUFNLElBQUksS0FBSyxDQUNiLHdDQUF3QyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQzVELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLG9CQUFZLEVBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzlELElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNkLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0JBQWdCLEtBQUssQ0FBQyxXQUFXLHVDQUF1QyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQzdGLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCx1RkFBdUY7UUFDdkYsb0ZBQW9GO1FBQ3BGLDRFQUE0RTtRQUM1RSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFdkIsTUFBTSxZQUFZLEdBQVE7WUFDeEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtZQUMxQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1NBQ3pDLENBQUM7UUFFRix3REFBd0Q7UUFDeEQsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzQyxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLG1DQUFvQixDQUFDLG9CQUFvQixDQUNqRSxJQUFJLEVBQ0osVUFBVSxFQUNWLFlBQVksQ0FDYixDQUFDO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1FBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7SUFDakQsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUN2QyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRU0sZUFBZSxDQUFDLFNBQThCO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUNiLDZEQUE2RDtnQkFDM0QscUZBQXFGLENBQ3hGLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sZUFBZSxDQUNwQixVQUFrQixFQUNsQixNQUF1QjtRQUV2QixJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekUsTUFBTSxJQUFJLEtBQUssQ0FDYixtRUFBbUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUM1RixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLE9BQU8sSUFBSSw0Q0FBNkIsQ0FBQyw2QkFBNkIsQ0FDcEUsSUFBSSxFQUNKLFVBQVUsRUFDVjtZQUNFLElBQUksRUFBRSxVQUFVO1lBQ2hCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDekMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO1lBQzFDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRTtZQUMxQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUU7WUFDdEMsb0JBQW9CLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRTtnQkFDM0MsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFO2FBQzVDO1lBQ0QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsWUFBWTtTQUN4QyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sYUFBYSxDQUNsQixRQUFnQixFQUNoQixLQUFrQztRQUVsQyxPQUFPLElBQUksdUNBQWlCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUMzQyxHQUFHLEtBQUs7WUFDUixhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sa0JBQWtCLENBQ3ZCLFFBQWdCLEVBQ2hCLEtBQTRDO1FBRTVDLE9BQU8sSUFBSSw0REFBMkIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3JELEdBQUcsS0FBSztZQUNSLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBdE5ILHdDQXVOQzs7O0FBMEREOztHQUVHO0FBQ0gsSUFBWSxnQkFnQlg7QUFoQkQsV0FBWSxnQkFBZ0I7SUFDMUIsK0JBQVcsQ0FBQTtJQUNYLDJEQUF1QyxDQUFBO0lBQ3ZDLCtCQUFXLENBQUE7SUFDWCwyQ0FBdUIsQ0FBQTtJQUN2Qix5Q0FBcUIsQ0FBQTtJQUNyQiwrQkFBVyxDQUFBO0lBQ1gsMkNBQXVCLENBQUE7SUFDdkIsdURBQW1DLENBQUE7SUFDbkMscUNBQWlCLENBQUE7SUFDakIsNkNBQXlCLENBQUE7SUFDekIsbUNBQWUsQ0FBQTtJQUNmLCtDQUEyQixDQUFBO0lBQzNCLHVDQUFtQixDQUFBO0lBQ25CLDJDQUF1QixDQUFBO0lBQ3ZCLDZDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFoQlcsZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFnQjNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTY4LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWFwcGxpY2F0aW9uYXV0b3NjYWxpbmcvbGliL3NjYWxhYmxlLXRhcmdldC50c1xuXG5pbXBvcnQge1xuICBhcHBhdXRvc2NhbGluZ1RhcmdldCxcbiAgYXBwYXV0b3NjYWxpbmdTY2hlZHVsZWRBY3Rpb24sXG59IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgU2NoZWR1bGUgfSBmcm9tIFwiLi9zY2hlZHVsZVwiO1xuaW1wb3J0IHtcbiAgQmFzaWNTdGVwU2NhbGluZ1BvbGljeVByb3BzLFxuICBTdGVwU2NhbGluZ1BvbGljeSxcbn0gZnJvbSBcIi4vc3RlcC1zY2FsaW5nLXBvbGljeVwiO1xuaW1wb3J0IHtcbiAgQmFzaWNUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3lQcm9wcyxcbiAgVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5LFxufSBmcm9tIFwiLi90YXJnZXQtdHJhY2tpbmctc2NhbGluZy1wb2xpY3lcIjtcbmltcG9ydCB7IFRpbWVab25lIH0gZnJvbSBcIi4uLy4uL3RpbWUtem9uZVwiO1xuaW1wb3J0IHsgd2l0aFJlc29sdmVkIH0gZnJvbSBcIi4uLy4uL3Rva2VuXCI7XG5pbXBvcnQge1xuICBBd3NDb25zdHJ1Y3RCYXNlLFxuICBBd3NDb25zdHJ1Y3RQcm9wcyxcbiAgSUF3c0NvbnN0cnVjdCxcbn0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vaWFtXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIEFwcGxpY2F0aW9uIEF1dG8gU2NhbGluZyBTY2FsYWJsZSBUYXJnZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2NhbGFibGVUYXJnZXQgZXh0ZW5kcyBJQXdzQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgU2NhbGFibGUgVGFyZ2V0LlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSBpbiB0aGUgZm9ybWF0OiBzZXJ2aWNlLW5hbWVzcGFjZS9yZXNvdXJjZS1pZC9zY2FsYWJsZS1kaW1lbnNpb25cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2NhbGFibGVUYXJnZXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdGhhdCBhbGxvd3MgQXBwbGljYXRpb24gQXV0byBTY2FsaW5nIHRvIG1vZGlmeSB5b3VyIHNjYWxhYmxlIHRhcmdldC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBpZGVudGlmaWVyIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgc2NhbGFibGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NhbGFibGUgZGltZW5zaW9uIHRoYXQncyBhc3NvY2lhdGVkIHdpdGggdGhlIHNjYWxhYmxlIHRhcmdldC5cbiAgICovXG4gIHJlYWRvbmx5IHNjYWxhYmxlRGltZW5zaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIEFXUyBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgdGhlIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZTtcblxuICAvKipcbiAgICogQWRkIGEgcG9saWN5IHN0YXRlbWVudCB0byB0aGUgcm9sZSdzIHBvbGljeSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHN0YXRlbWVudCBUaGUgcG9saWN5IHN0YXRlbWVudCB0byBhZGRcbiAgICovXG4gIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTY2FsZSBvdXQgb3IgaW4gYmFzZWQgb24gdGltZS5cbiAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGFjdGlvblxuICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBzY2FsaW5nIHNjaGVkdWxlXG4gICAqL1xuICBzY2FsZU9uU2NoZWR1bGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhY3Rpb246IFNjYWxpbmdTY2hlZHVsZSxcbiAgKTogYXBwYXV0b3NjYWxpbmdTY2hlZHVsZWRBY3Rpb24uQXBwYXV0b3NjYWxpbmdTY2hlZHVsZWRBY3Rpb247XG5cbiAgLyoqXG4gICAqIFNjYWxlIG91dCBvciBpbiwgaW4gcmVzcG9uc2UgdG8gYSBtZXRyaWMuXG4gICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIHNjYWxpbmcgcG9saWN5XG4gICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHN0ZXAgc2NhbGluZyBwb2xpY3lcbiAgICovXG4gIHNjYWxlT25NZXRyaWMoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQmFzaWNTdGVwU2NhbGluZ1BvbGljeVByb3BzLFxuICApOiBTdGVwU2NhbGluZ1BvbGljeTtcblxuICAvKipcbiAgICogU2NhbGUgb3V0IG9yIGluIGluIG9yZGVyIHRvIGtlZXAgYSBtZXRyaWMgYXJvdW5kIGEgdGFyZ2V0IHZhbHVlLlxuICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBzY2FsaW5nIHBvbGljeVxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSB0YXJnZXQgdHJhY2tpbmcgc2NhbGluZyBwb2xpY3lcbiAgICovXG4gIHNjYWxlVG9UcmFja01ldHJpYyhcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBCYXNpY1RhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeVByb3BzLFxuICApOiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3k7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBzY2FsYWJsZSB0YXJnZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FsYWJsZVRhcmdldFByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gdmFsdWUgdGhhdCBBcHBsaWNhdGlvbiBBdXRvIFNjYWxpbmcgY2FuIHVzZSB0byBzY2FsZSBhIHRhcmdldCBkdXJpbmcgYSBzY2FsaW5nIGFjdGl2aXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgbWluQ2FwYWNpdHk6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdmFsdWUgdGhhdCBBcHBsaWNhdGlvbiBBdXRvIFNjYWxpbmcgY2FuIHVzZSB0byBzY2FsZSBhIHRhcmdldCBkdXJpbmcgYSBzY2FsaW5nIGFjdGl2aXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q2FwYWNpdHk6IG51bWJlcjtcblxuICAvKipcbiAgICogUm9sZSB0aGF0IGFsbG93cyBBcHBsaWNhdGlvbiBBdXRvIFNjYWxpbmcgdG8gbW9kaWZ5IHlvdXIgc2NhbGFibGUgdGFyZ2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBBIHJvbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgaWRlbnRpZmllciB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHNjYWxhYmxlIHRhcmdldC5cbiAgICpcbiAgICogVGhpcyBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIHJlc291cmNlIHR5cGUgYW5kIHVuaXF1ZSBpZGVudGlmaWVyLlxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgc2VydmljZS9lY3NTdGFjay1NeUVDU0NsdXN0ZXItQUIxMkNERTNGNEdIL2Vjc1N0YWNrLU15RUNTU2VydmljZS1BQjEyQ0RFM0Y0R0hgXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F1dG9zY2FsaW5nL2FwcGxpY2F0aW9uL0FQSVJlZmVyZW5jZS9BUElfUmVnaXN0ZXJTY2FsYWJsZVRhcmdldC5odG1sXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzY2FsYWJsZSBkaW1lbnNpb24gdGhhdCdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NhbGFibGUgdGFyZ2V0LlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoZSBzZXJ2aWNlIG5hbWVzcGFjZSwgcmVzb3VyY2UgdHlwZSwgYW5kIHNjYWxpbmcgcHJvcGVydHkuXG4gICAqXG4gICAqIEV4YW1wbGUgdmFsdWU6IGBlY3M6c2VydmljZTpEZXNpcmVkQ291bnRgXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F1dG9zY2FsaW5nL2FwcGxpY2F0aW9uL0FQSVJlZmVyZW5jZS9BUElfU2NhbGluZ1BvbGljeS5odG1sXG4gICAqL1xuICByZWFkb25seSBzY2FsYWJsZURpbWVuc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBBV1Mgc2VydmljZSB0aGF0IHByb3ZpZGVzIHRoZSByZXNvdXJjZSBvclxuICAgKiBjdXN0b20tcmVzb3VyY2UgZm9yIGEgcmVzb3VyY2UgcHJvdmlkZWQgYnkgeW91ciBvd24gYXBwbGljYXRpb24gb3JcbiAgICogc2VydmljZS5cbiAgICpcbiAgICogRm9yIHZhbGlkIEFXUyBzZXJ2aWNlIG5hbWVzcGFjZSB2YWx1ZXMsIHNlZSB0aGUgUmVnaXN0ZXJTY2FsYWJsZVRhcmdldFxuICAgKiBhY3Rpb24gaW4gdGhlIEFwcGxpY2F0aW9uIEF1dG8gU2NhbGluZyBBUEkgUmVmZXJlbmNlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdXRvc2NhbGluZy9hcHBsaWNhdGlvbi9BUElSZWZlcmVuY2UvQVBJX1JlZ2lzdGVyU2NhbGFibGVUYXJnZXQuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZTtcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBzY2FsYWJsZSB0YXJnZXRcbiAqXG4gKiBAcmVzb3VyY2UgYXdzX2FwcGF1dG9zY2FsaW5nX3RhcmdldFxuICovXG5leHBvcnQgY2xhc3MgU2NhbGFibGVUYXJnZXRcbiAgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlXG4gIGltcGxlbWVudHMgSVNjYWxhYmxlVGFyZ2V0XG57XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNjYWxhYmxlVGFyZ2V0SWQoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHNjYWxhYmxlVGFyZ2V0SWQ6IHN0cmluZyxcbiAgKTogSVNjYWxhYmxlVGFyZ2V0IHtcbiAgICAvLyBBc3N1bWluZyBzY2FsYWJsZVRhcmdldElkIGlzIGluIHRoZSBmb3JtYXQ6IHNlcnZpY2VOYW1lc3BhY2UvcmVzb3VyY2VJZC9zY2FsYWJsZURpbWVuc2lvblxuICAgIGNvbnN0IHBhcnRzID0gc2NhbGFibGVUYXJnZXRJZC5zcGxpdChcIi9cIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIHNjYWxhYmxlVGFyZ2V0SWQgZm9ybWF0LiBFeHBlY3RlZCBzZXJ2aWNlTmFtZXNwYWNlL3Jlc291cmNlSWQvc2NhbGFibGVEaW1lbnNpb25cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2VOYW1lc3BhY2UgPSBwYXJ0c1swXSBhcyBTZXJ2aWNlTmFtZXNwYWNlO1xuICAgIGNvbnN0IHNjYWxhYmxlRGltZW5zaW9uID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IHBhcnRzLnNsaWNlKDEsIC0xKS5qb2luKFwiL1wiKTtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJU2NhbGFibGVUYXJnZXQge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHNjYWxhYmxlVGFyZ2V0SWQgPSBzY2FsYWJsZVRhcmdldElkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSByZXNvdXJjZUlkID0gcmVzb3VyY2VJZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzY2FsYWJsZURpbWVuc2lvbiA9IHNjYWxhYmxlRGltZW5zaW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2VOYW1lc3BhY2UgPSBzZXJ2aWNlTmFtZXNwYWNlO1xuXG4gICAgICBjb25zdHJ1Y3RvcihzOiBDb25zdHJ1Y3QsIGk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihzLCBpLCB7XG4gICAgICAgICAgZW52aXJvbm1lbnRGcm9tQXJuOiBgYXJuOmF3czphcHBsaWNhdGlvbi1hdXRvc2NhbGluZzoke0F3c0NvbnN0cnVjdEJhc2UuaXNDb25zdHJ1Y3QocykgPyAocyBhcyBBd3NDb25zdHJ1Y3RCYXNlKS5lbnYucmVnaW9uIDogXCJ1bmtub3duXCJ9OiR7QXdzQ29uc3RydWN0QmFzZS5pc0NvbnN0cnVjdChzKSA/IChzIGFzIEF3c0NvbnN0cnVjdEJhc2UpLmVudi5hY2NvdW50IDogXCJ1bmtub3duXCJ9OnNjYWxhYmxlLXRhcmdldC8ke3NjYWxhYmxlVGFyZ2V0SWR9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFJvbGUgaXMgbm90IGRpcmVjdGx5IGltcG9ydGFibGUgd2l0aCBqdXN0IHRoZSB0YXJnZXQgSUQsIGl0IHdvdWxkIG5lZWQgdG8gYmUgaW1wb3J0ZWQgc2VwYXJhdGVseSBvciBBUk4gcHJvdmlkZWQuXG4gICAgICAgIC8vIEZvciBzaW1wbGljaXR5LCB3ZSdsbCByZXByZXNlbnQgaXQgYXMgYW4gdW5tb2RpZmlhYmxlIGltcG9ydGVkIHJvbGUgcGxhY2Vob2xkZXIuXG4gICAgICAgIHRoaXMucm9sZSA9IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJJbXBvcnRlZFJvbGVcIixcbiAgICAgICAgICBcImFybjphd3M6aWFtOjp1bmtub3duOnJvbGUvdW5rbm93bmFwcGxpY2F0aW9uYXV0b3NjYWxpbmdyb2xlXCIsXG4gICAgICAgICAgeyBtdXRhYmxlOiBmYWxzZSB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIHJldHVybiB7IHNjYWxhYmxlVGFyZ2V0SWQ6IHRoaXMuc2NhbGFibGVUYXJnZXRJZCB9O1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgYWRkVG9Sb2xlUG9saWN5KF9zdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGFkZCB0byBwb2xpY3kgb2YgYW4gaW1wb3J0ZWQgU2NhbGFibGVUYXJnZXQgcm9sZSBsaWtlIHRoaXMuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBzY2FsZU9uU2NoZWR1bGUoXG4gICAgICAgIF9hY3Rpb25JZDogc3RyaW5nLFxuICAgICAgICBfYWN0aW9uOiBTY2FsaW5nU2NoZWR1bGUsXG4gICAgICApOiBhcHBhdXRvc2NhbGluZ1NjaGVkdWxlZEFjdGlvbi5BcHBhdXRvc2NhbGluZ1NjaGVkdWxlZEFjdGlvbiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCBhZGQgc2NoZWR1bGVkIGFjdGlvbiB0byBhbiBpbXBvcnRlZCBTY2FsYWJsZVRhcmdldC5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIHNjYWxlT25NZXRyaWMoXG4gICAgICAgIF9wb2xpY3lJZDogc3RyaW5nLFxuICAgICAgICBfcHJvcHM6IEJhc2ljU3RlcFNjYWxpbmdQb2xpY3lQcm9wcyxcbiAgICAgICk6IFN0ZXBTY2FsaW5nUG9saWN5IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGFkZCBzdGVwIHNjYWxpbmcgcG9saWN5IHRvIGFuIGltcG9ydGVkIFNjYWxhYmxlVGFyZ2V0LlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgc2NhbGVUb1RyYWNrTWV0cmljKFxuICAgICAgICBfcG9saWN5SWQ6IHN0cmluZyxcbiAgICAgICAgX3Byb3BzOiBCYXNpY1RhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeVByb3BzLFxuICAgICAgKTogVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGFkZCB0YXJnZXQgdHJhY2tpbmcgcG9saWN5IHRvIGFuIGltcG9ydGVkIFNjYWxhYmxlVGFyZ2V0LlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHNjYWxhYmxlVGFyZ2V0SWQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzY2FsYWJsZURpbWVuc2lvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldFJlc291cmNlOiBhcHBhdXRvc2NhbGluZ1RhcmdldC5BcHBhdXRvc2NhbGluZ1RhcmdldDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2NhbGFibGVUYXJnZXRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgd2l0aFJlc29sdmVkKHByb3BzLm1heENhcGFjaXR5LCAobWF4KSA9PiB7XG4gICAgICBpZiAobWF4IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYG1heENhcGFjaXR5IGNhbm5vdCBiZSBuZWdhdGl2ZSwgZ290OiAke3Byb3BzLm1heENhcGFjaXR5fWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB3aXRoUmVzb2x2ZWQocHJvcHMubWluQ2FwYWNpdHksIChtaW4pID0+IHtcbiAgICAgIGlmIChtaW4gPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgbWluQ2FwYWNpdHkgY2Fubm90IGJlIG5lZ2F0aXZlLCBnb3Q6ICR7cHJvcHMubWluQ2FwYWNpdHl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdpdGhSZXNvbHZlZChwcm9wcy5taW5DYXBhY2l0eSwgcHJvcHMubWF4Q2FwYWNpdHksIChtaW4sIG1heCkgPT4ge1xuICAgICAgaWYgKG1heCA8IG1pbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYG1pbkNhcGFjaXR5ICgke3Byb3BzLm1pbkNhcGFjaXR5fSkgc2hvdWxkIGJlIGxvd2VyIHRoYW4gbWF4Q2FwYWNpdHkgKCR7cHJvcHMubWF4Q2FwYWNpdHl9KWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBGb3IgRHluYW1vREIgYXV0b3NjYWxpbmcsIHVzZSBzZXJ2aWNlLWxpbmtlZCByb2xlcyB3aGVuIG5vIGV4cGxpY2l0IHJvbGUgaXMgcHJvdmlkZWRcbiAgICAvLyBUaGlzIGFsbG93cyBUZXJyYWZvcm0gdG8gYXV0b21hdGljYWxseSBtYW5hZ2UgdGhlIGFwcHJvcHJpYXRlIHNlcnZpY2UtbGlua2VkIHJvbGVcbiAgICAvLyByYXRoZXIgdGhhbiBjcmVhdGluZyBhIGN1c3RvbSBJQU0gcm9sZSB0aGF0IG1heSBoYXZlIGluY29ycmVjdCBBUk4gZm9ybWF0XG4gICAgdGhpcy5yb2xlID0gcHJvcHMucm9sZTtcblxuICAgIGNvbnN0IHRhcmdldENvbmZpZzogYW55ID0ge1xuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5LFxuICAgICAgbWluQ2FwYWNpdHk6IHByb3BzLm1pbkNhcGFjaXR5LFxuICAgICAgcmVzb3VyY2VJZDogcHJvcHMucmVzb3VyY2VJZCxcbiAgICAgIHNjYWxhYmxlRGltZW5zaW9uOiBwcm9wcy5zY2FsYWJsZURpbWVuc2lvbixcbiAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IHByb3BzLnNlcnZpY2VOYW1lc3BhY2UsXG4gICAgfTtcblxuICAgIC8vIE9ubHkgaW5jbHVkZSByb2xlQXJuIGlmIGEgcm9sZSBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgLy8gV2hlbiBvbWl0dGVkLCBUZXJyYWZvcm0gd2lsbCB1c2UgYXBwcm9wcmlhdGUgc2VydmljZS1saW5rZWQgcm9sZXNcbiAgICBpZiAodGhpcy5yb2xlKSB7XG4gICAgICB0YXJnZXRDb25maWcucm9sZUFybiA9IHRoaXMucm9sZS5yb2xlQXJuO1xuICAgIH1cblxuICAgIHRoaXMudGFyZ2V0UmVzb3VyY2UgPSBuZXcgYXBwYXV0b3NjYWxpbmdUYXJnZXQuQXBwYXV0b3NjYWxpbmdUYXJnZXQoXG4gICAgICB0aGlzLFxuICAgICAgXCJSZXNvdXJjZVwiLFxuICAgICAgdGFyZ2V0Q29uZmlnLFxuICAgICk7XG5cbiAgICB0aGlzLnNjYWxhYmxlVGFyZ2V0SWQgPSB0aGlzLnRhcmdldFJlc291cmNlLmlkO1xuICAgIHRoaXMucmVzb3VyY2VJZCA9IHByb3BzLnJlc291cmNlSWQ7XG4gICAgdGhpcy5zY2FsYWJsZURpbWVuc2lvbiA9IHByb3BzLnNjYWxhYmxlRGltZW5zaW9uO1xuICAgIHRoaXMuc2VydmljZU5hbWVzcGFjZSA9IHByb3BzLnNlcnZpY2VOYW1lc3BhY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjYWxhYmxlVGFyZ2V0SWQ6IHRoaXMuc2NhbGFibGVUYXJnZXRJZCxcbiAgICAgIHJvbGVBcm46IHRoaXMucm9sZT8ucm9sZUFybixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMucm9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBhZGQgcG9saWN5IHRvIHJvbGUgd2hlbiB1c2luZyBzZXJ2aWNlLWxpbmtlZCByb2xlcy4gXCIgK1xuICAgICAgICAgIFwiUHJvdmlkZSBhbiBleHBsaWNpdCByb2xlIGluIFNjYWxhYmxlVGFyZ2V0UHJvcHMgaWYgeW91IG5lZWQgdG8gYWRkIGN1c3RvbSBwb2xpY2llcy5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgcHVibGljIHNjYWxlT25TY2hlZHVsZShcbiAgICBzY2hlZHVsZUlkOiBzdHJpbmcsXG4gICAgYWN0aW9uOiBTY2FsaW5nU2NoZWR1bGUsXG4gICk6IGFwcGF1dG9zY2FsaW5nU2NoZWR1bGVkQWN0aW9uLkFwcGF1dG9zY2FsaW5nU2NoZWR1bGVkQWN0aW9uIHtcbiAgICBpZiAoYWN0aW9uLm1pbkNhcGFjaXR5ID09PSB1bmRlZmluZWQgJiYgYWN0aW9uLm1heENhcGFjaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgb2YgbWluQ2FwYWNpdHkgb3IgbWF4Q2FwYWNpdHksIGdvdCAke0pTT04uc3RyaW5naWZ5KGFjdGlvbil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYWN0aW9uLnNjaGVkdWxlLl9iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIG5ldyBhcHBhdXRvc2NhbGluZ1NjaGVkdWxlZEFjdGlvbi5BcHBhdXRvc2NhbGluZ1NjaGVkdWxlZEFjdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBzY2hlZHVsZUlkLFxuICAgICAge1xuICAgICAgICBuYW1lOiBzY2hlZHVsZUlkLFxuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiB0aGlzLnNlcnZpY2VOYW1lc3BhY2UsXG4gICAgICAgIHJlc291cmNlSWQ6IHRoaXMucmVzb3VyY2VJZCxcbiAgICAgICAgc2NhbGFibGVEaW1lbnNpb246IHRoaXMuc2NhbGFibGVEaW1lbnNpb24sXG4gICAgICAgIHNjaGVkdWxlOiBhY3Rpb24uc2NoZWR1bGUuZXhwcmVzc2lvblN0cmluZyxcbiAgICAgICAgc3RhcnRUaW1lOiBhY3Rpb24uc3RhcnRUaW1lPy50b0lTT1N0cmluZygpLFxuICAgICAgICBlbmRUaW1lOiBhY3Rpb24uZW5kVGltZT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgc2NhbGFibGVUYXJnZXRBY3Rpb246IHtcbiAgICAgICAgICBtYXhDYXBhY2l0eTogYWN0aW9uLm1heENhcGFjaXR5Py50b1N0cmluZygpLFxuICAgICAgICAgIG1pbkNhcGFjaXR5OiBhY3Rpb24ubWluQ2FwYWNpdHk/LnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWV6b25lOiBhY3Rpb24udGltZVpvbmU/LnRpbWV6b25lTmFtZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzY2FsZU9uTWV0cmljKFxuICAgIHBvbGljeUlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEJhc2ljU3RlcFNjYWxpbmdQb2xpY3lQcm9wcyxcbiAgKTogU3RlcFNjYWxpbmdQb2xpY3kge1xuICAgIHJldHVybiBuZXcgU3RlcFNjYWxpbmdQb2xpY3kodGhpcywgcG9saWN5SWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc2NhbGluZ1RhcmdldDogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzY2FsZVRvVHJhY2tNZXRyaWMoXG4gICAgcG9saWN5SWQ6IHN0cmluZyxcbiAgICBwcm9wczogQmFzaWNUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3lQcm9wcyxcbiAgKTogVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5IHtcbiAgICByZXR1cm4gbmV3IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeSh0aGlzLCBwb2xpY3lJZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBzY2FsaW5nVGFyZ2V0OiB0aGlzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBzY2hlZHVsZWQgc2NhbGluZyBhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FsaW5nU2NoZWR1bGUge1xuICAvKipcbiAgICogV2hlbiB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU6IFNjaGVkdWxlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgc2NoZWR1bGVkIGFjdGlvbiBiZWNvbWVzIGFjdGl2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIHJ1bGUgaXMgYWN0aXZhdGUgaW1tZWRpYXRlbHlcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGltZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBzY2hlZHVsZWQgYWN0aW9uIGV4cGlyZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSBydWxlIG5ldmVyIGV4cGlyZXMuXG4gICAqL1xuICByZWFkb25seSBlbmRUaW1lPzogRGF0ZTtcblxuICAvKipcbiAgICogVGhlIG5ldyBtaW5pbXVtIGNhcGFjaXR5LlxuICAgKlxuICAgKiBEdXJpbmcgdGhlIHNjaGVkdWxlZCB0aW1lLCBpZiB0aGUgY3VycmVudCBjYXBhY2l0eSBpcyBiZWxvdyB0aGUgbWluaW11bVxuICAgKiBjYXBhY2l0eSwgQXBwbGljYXRpb24gQXV0byBTY2FsaW5nIHNjYWxlcyBvdXQgdG8gdGhlIG1pbmltdW0gY2FwYWNpdHkuXG4gICAqXG4gICAqIEF0IGxlYXN0IG9uZSBvZiBtYXhDYXBhY2l0eSBhbmQgbWluQ2FwYWNpdHkgbXVzdCBiZSBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gbmV3IG1pbmltdW0gY2FwYWNpdHlcbiAgICovXG4gIHJlYWRvbmx5IG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IG1heGltdW0gY2FwYWNpdHkuXG4gICAqXG4gICAqIER1cmluZyB0aGUgc2NoZWR1bGVkIHRpbWUsIHRoZSBjdXJyZW50IGNhcGFjaXR5IGlzIGFib3ZlIHRoZSBtYXhpbXVtXG4gICAqIGNhcGFjaXR5LCBBcHBsaWNhdGlvbiBBdXRvIFNjYWxpbmcgc2NhbGVzIGluIHRvIHRoZSBtYXhpbXVtIGNhcGFjaXR5LlxuICAgKlxuICAgKiBBdCBsZWFzdCBvbmUgb2YgbWF4Q2FwYWNpdHkgYW5kIG1pbkNhcGFjaXR5IG11c3QgYmUgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIG5ldyBtYXhpbXVtIGNhcGFjaXR5XG4gICAqL1xuICByZWFkb25seSBtYXhDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRpbWUgem9uZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIHRoZSBkYXRlIGFuZCB0aW1lIG9mIGEgc2NoZWR1bGVkIGFjdGlvbixcbiAgICogd2hlbiB0aGUgc2NoZWR1bGVkIGFjdGlvbiB1c2VzIGFuIGF0IG9yIGNyb24gZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBVVENcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVab25lPzogVGltZVpvbmU7XG59XG5cbi8qKlxuICogVGhlIHNlcnZpY2UgdGhhdCBzdXBwb3J0cyBBcHBsaWNhdGlvbiBBdXRvU2NhbGluZ1xuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTmFtZXNwYWNlIHtcbiAgRUNTID0gXCJlY3NcIixcbiAgRUxBU1RJQ19NQVBfUkVEVUNFID0gXCJlbGFzdGljbWFwcmVkdWNlXCIsXG4gIEVDMiA9IFwiZWMyXCIsXG4gIEFQUFNUUkVBTSA9IFwiYXBwc3RyZWFtXCIsXG4gIERZTkFNT0RCID0gXCJkeW5hbW9kYlwiLFxuICBSRFMgPSBcInJkc1wiLFxuICBTQUdFTUFLRVIgPSBcInNhZ2VtYWtlclwiLFxuICBDVVNUT01fUkVTT1VSQ0UgPSBcImN1c3RvbS1yZXNvdXJjZVwiLFxuICBMQU1CREEgPSBcImxhbWJkYVwiLFxuICBDT01QUkVIRU5EID0gXCJjb21wcmVoZW5kXCIsXG4gIEtBRktBID0gXCJrYWZrYVwiLFxuICBFTEFTVElDQUNIRSA9IFwiZWxhc3RpY2FjaGVcIixcbiAgTkVQVFVORSA9IFwibmVwdHVuZVwiLFxuICBDQVNTQU5EUkEgPSBcImNhc3NhbmRyYVwiLFxuICBXT1JLU1BBQ0VTID0gXCJ3b3Jrc3BhY2VzXCIsXG59XG4iXX0=
@@ -0,0 +1,81 @@
1
+ import { Construct } from "constructs";
2
+ import { Duration } from "../../duration";
3
+ /**
4
+ * Schedule for scheduled scaling actions
5
+ */
6
+ export declare abstract class Schedule {
7
+ /**
8
+ * Construct a schedule from a literal schedule expression
9
+ *
10
+ * @param expression The expression to use. Must be in a format that Application AutoScaling will recognize
11
+ */
12
+ static expression(expression: string): Schedule;
13
+ /**
14
+ * Construct a schedule from an interval and a time unit
15
+ */
16
+ static rate(duration: Duration): Schedule;
17
+ /**
18
+ * Construct a Schedule from a moment in time
19
+ */
20
+ static at(moment: Date): Schedule;
21
+ /**
22
+ * Create a schedule from a set of cron fields
23
+ */
24
+ static cron(options: CronOptions): Schedule;
25
+ /**
26
+ * Retrieve the expression for this schedule
27
+ */
28
+ abstract readonly expressionString: string;
29
+ protected constructor();
30
+ /**
31
+ *
32
+ * @internal
33
+ */
34
+ abstract _bind(scope: Construct): void;
35
+ }
36
+ /**
37
+ * Options to configure a cron expression
38
+ *
39
+ * All fields are strings so you can use complex expressions. Absence of
40
+ * a field implies '*' or '?', whichever one is appropriate.
41
+ *
42
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions
43
+ */
44
+ export interface CronOptions {
45
+ /**
46
+ * The minute to run this rule at
47
+ *
48
+ * @default - Every minute
49
+ */
50
+ readonly minute?: string;
51
+ /**
52
+ * The hour to run this rule at
53
+ *
54
+ * @default - Every hour
55
+ */
56
+ readonly hour?: string;
57
+ /**
58
+ * The day of the month to run this rule at
59
+ *
60
+ * @default - Every day of the month
61
+ */
62
+ readonly day?: string;
63
+ /**
64
+ * The month to run this rule at
65
+ *
66
+ * @default - Every month
67
+ */
68
+ readonly month?: string;
69
+ /**
70
+ * The year to run this rule at
71
+ *
72
+ * @default - Every year
73
+ */
74
+ readonly year?: string;
75
+ /**
76
+ * The day of the week to run this rule at
77
+ *
78
+ * @default - Any day of the week
79
+ */
80
+ readonly weekDay?: string;
81
+ }
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Schedule = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // https://github.com/aws/aws-cdk/blob/v2.168.0/packages/aws-cdk-lib/aws-applicationautoscaling/lib/schedule.ts
7
+ const cdktf_1 = require("cdktf");
8
+ // TODO Adupt ValidationError is available, otherwise use standard Error
9
+ // - https://github.com/aws/aws-cdk/pull/33382/
10
+ // - https://github.com/aws/aws-cdk/pull/33045
11
+ // import { UnscopedValidationError } from "../../errors";
12
+ /**
13
+ * Schedule for scheduled scaling actions
14
+ */
15
+ class Schedule {
16
+ /**
17
+ * Construct a schedule from a literal schedule expression
18
+ *
19
+ * @param expression The expression to use. Must be in a format that Application AutoScaling will recognize
20
+ */
21
+ static expression(expression) {
22
+ return new LiteralSchedule(expression);
23
+ }
24
+ /**
25
+ * Construct a schedule from an interval and a time unit
26
+ */
27
+ static rate(duration) {
28
+ if (duration.isUnresolved()) {
29
+ const validDurationUnit = [
30
+ "minute",
31
+ "minutes",
32
+ "hour",
33
+ "hours",
34
+ "day",
35
+ "days",
36
+ ];
37
+ if (!validDurationUnit.includes(duration.unitLabel())) {
38
+ // throw new UnscopedValidationError(
39
+ throw new Error("Allowed units for scheduling are: 'minute', 'minutes', 'hour', 'hours', 'day' or 'days'");
40
+ }
41
+ return new LiteralSchedule(`rate(${duration.formatTokenToNumber()})`);
42
+ }
43
+ if (duration.toSeconds() === 0) {
44
+ // throw new UnscopedValidationError(
45
+ throw new Error("Duration cannot be 0");
46
+ }
47
+ let rate = maybeRate(duration.toDays({ integral: false }), "day");
48
+ if (rate === undefined) {
49
+ rate = maybeRate(duration.toHours({ integral: false }), "hour");
50
+ }
51
+ if (rate === undefined) {
52
+ rate = makeRate(duration.toMinutes({ integral: true }), "minute");
53
+ }
54
+ return new LiteralSchedule(rate);
55
+ }
56
+ /**
57
+ * Construct a Schedule from a moment in time
58
+ */
59
+ static at(moment) {
60
+ return new LiteralSchedule(`at(${formatISO(moment)})`);
61
+ }
62
+ /**
63
+ * Create a schedule from a set of cron fields
64
+ */
65
+ static cron(options) {
66
+ if (options.weekDay !== undefined && options.day !== undefined) {
67
+ // throw new UnscopedValidationError(
68
+ throw new Error("Cannot supply both 'day' and 'weekDay', use at most one");
69
+ }
70
+ const minute = fallback(options.minute, "*");
71
+ const hour = fallback(options.hour, "*");
72
+ const month = fallback(options.month, "*");
73
+ const year = fallback(options.year, "*");
74
+ // Weekday defaults to '?' if not supplied. If it is supplied, day must become '?'
75
+ const day = fallback(options.day, options.weekDay !== undefined ? "?" : "*");
76
+ const weekDay = fallback(options.weekDay, "?");
77
+ return new (class extends Schedule {
78
+ constructor() {
79
+ super(...arguments);
80
+ this.expressionString = `cron(${minute} ${hour} ${day} ${month} ${weekDay} ${year})`;
81
+ }
82
+ _bind(scope) {
83
+ if (!options.minute) {
84
+ // "@aws-cdk/aws-applicationautoscaling:defaultRunEveryMinute",
85
+ cdktf_1.Annotations.of(scope).addWarning("cron: If you don't pass 'minute', by default the event runs every minute. Pass 'minute: '*'' if that's what you intend, or 'minute: 0' to run once per hour instead.");
86
+ }
87
+ return new LiteralSchedule(this.expressionString);
88
+ }
89
+ })();
90
+ }
91
+ constructor() { }
92
+ }
93
+ exports.Schedule = Schedule;
94
+ _a = JSII_RTTI_SYMBOL_1;
95
+ Schedule[_a] = { fqn: "terraconstructs.aws.compute.Schedule", version: "0.0.24" };
96
+ class LiteralSchedule extends Schedule {
97
+ constructor(expressionString) {
98
+ super();
99
+ this.expressionString = expressionString;
100
+ }
101
+ _bind() { }
102
+ }
103
+ function fallback(x, def) {
104
+ return x === undefined ? def : x;
105
+ }
106
+ function formatISO(date) {
107
+ if (!date) {
108
+ return undefined;
109
+ }
110
+ return (date.getUTCFullYear() +
111
+ "-" +
112
+ pad(date.getUTCMonth() + 1) +
113
+ "-" +
114
+ pad(date.getUTCDate()) +
115
+ "T" +
116
+ pad(date.getUTCHours()) +
117
+ ":" +
118
+ pad(date.getUTCMinutes()) +
119
+ ":" +
120
+ pad(date.getUTCSeconds()));
121
+ function pad(num) {
122
+ if (num < 10) {
123
+ return "0" + num;
124
+ }
125
+ return num;
126
+ }
127
+ }
128
+ /**
129
+ * Return the rate if the rate is whole number
130
+ */
131
+ function maybeRate(interval, singular) {
132
+ if (interval === 0 || !Number.isInteger(interval)) {
133
+ return undefined;
134
+ }
135
+ return makeRate(interval, singular);
136
+ }
137
+ /**
138
+ * Return 'rate(${interval} ${singular}(s))` for the interval
139
+ */
140
+ function makeRate(interval, singular) {
141
+ return interval === 1
142
+ ? `rate(1 ${singular})`
143
+ : `rate(${interval} ${singular}s)`;
144
+ }
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvc2NoZWR1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrR0FBK0c7QUFFL0csaUNBQW9DO0FBR3BDLHdFQUF3RTtBQUN4RSwrQ0FBK0M7QUFDL0MsOENBQThDO0FBQzlDLDBEQUEwRDtBQUUxRDs7R0FFRztBQUNILE1BQXNCLFFBQVE7SUFDNUI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBa0I7UUFDekMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWtCO1FBQ25DLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDNUIsTUFBTSxpQkFBaUIsR0FBRztnQkFDeEIsUUFBUTtnQkFDUixTQUFTO2dCQUNULE1BQU07Z0JBQ04sT0FBTztnQkFDUCxLQUFLO2dCQUNMLE1BQU07YUFDUCxDQUFDO1lBQ0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxxQ0FBcUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQ2IseUZBQXlGLENBQzFGLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxJQUFJLGVBQWUsQ0FBQyxRQUFRLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IscUNBQXFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMs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Q3ZCLENBQUMsQ0FBQyxRQUFRLFFBQVEsSUFBSSxRQUFRLElBQUksQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTY4LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWFwcGxpY2F0aW9uYXV0b3NjYWxpbmcvbGliL3NjaGVkdWxlLnRzXG5cbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiLi4vLi4vZHVyYXRpb25cIjtcbi8vIFRPRE8gQWR1cHQgVmFsaWRhdGlvbkVycm9yIGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBzdGFuZGFyZCBFcnJvclxuLy8gLSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8zMzM4Mi9cbi8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3B1bGwvMzMwNDVcbi8vIGltcG9ydCB7IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuXG4vKipcbiAqIFNjaGVkdWxlIGZvciBzY2hlZHVsZWQgc2NhbGluZyBhY3Rpb25zXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTY2hlZHVsZSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBzY2hlZHVsZSBmcm9tIGEgbGl0ZXJhbCBzY2hlZHVsZSBleHByZXNzaW9uXG4gICAqXG4gICAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIHVzZS4gTXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IEFwcGxpY2F0aW9uIEF1dG9TY2FsaW5nIHdpbGwgcmVjb2duaXplXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2NoZWR1bGUge1xuICAgIHJldHVybiBuZXcgTGl0ZXJhbFNjaGVkdWxlKGV4cHJlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHNjaGVkdWxlIGZyb20gYW4gaW50ZXJ2YWwgYW5kIGEgdGltZSB1bml0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJhdGUoZHVyYXRpb246IER1cmF0aW9uKTogU2NoZWR1bGUge1xuICAgIGlmIChkdXJhdGlvbi5pc1VucmVzb2x2ZWQoKSkge1xuICAgICAgY29uc3QgdmFsaWREdXJhdGlvblVuaXQgPSBbXG4gICAgICAgIFwibWludXRlXCIsXG4gICAgICAgIFwibWludXRlc1wiLFxuICAgICAgICBcImhvdXJcIixcbiAgICAgICAgXCJob3Vyc1wiLFxuICAgICAgICBcImRheVwiLFxuICAgICAgICBcImRheXNcIixcbiAgICAgIF07XG4gICAgICBpZiAoIXZhbGlkRHVyYXRpb25Vbml0LmluY2x1ZGVzKGR1cmF0aW9uLnVuaXRMYWJlbCgpKSkge1xuICAgICAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkFsbG93ZWQgdW5pdHMgZm9yIHNjaGVkdWxpbmcgYXJlOiAnbWludXRlJywgJ21pbnV0ZXMnLCAnaG91cicsICdob3VycycsICdkYXknIG9yICdkYXlzJ1wiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsU2NoZWR1bGUoYHJhdGUoJHtkdXJhdGlvbi5mb3JtYXRUb2tlblRvTnVtYmVyKCl9KWApO1xuICAgIH1cbiAgICBpZiAoZHVyYXRpb24udG9TZWNvbmRzKCkgPT09IDApIHtcbiAgICAgIC8vIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkR1cmF0aW9uIGNhbm5vdCBiZSAwXCIpO1xuICAgIH1cblxuICAgIGxldCByYXRlID0gbWF5YmVSYXRlKGR1cmF0aW9uLnRvRGF5cyh7IGludGVncmFsOiBmYWxzZSB9KSwgXCJkYXlcIik7XG4gICAgaWYgKHJhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmF0ZSA9IG1heWJlUmF0ZShkdXJhdGlvbi50b0hvdXJzKHsgaW50ZWdyYWw6IGZhbHNlIH0pLCBcImhvdXJcIik7XG4gICAgfVxuICAgIGlmIChyYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJhdGUgPSBtYWtlUmF0ZShkdXJhdGlvbi50b01pbnV0ZXMoeyBpbnRlZ3JhbDogdHJ1ZSB9KSwgXCJtaW51dGVcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTGl0ZXJhbFNjaGVkdWxlKHJhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIFNjaGVkdWxlIGZyb20gYSBtb21lbnQgaW4gdGltZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhdChtb21lbnQ6IERhdGUpOiBTY2hlZHVsZSB7XG4gICAgcmV0dXJuIG5ldyBMaXRlcmFsU2NoZWR1bGUoYGF0KCR7Zm9ybWF0SVNPKG1vbWVudCl9KWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNjaGVkdWxlIGZyb20gYSBzZXQgb2YgY3JvbiBmaWVsZHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JvbihvcHRpb25zOiBDcm9uT3B0aW9ucyk6IFNjaGVkdWxlIHtcbiAgICBpZiAob3B0aW9ucy53ZWVrRGF5ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kYXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBzdXBwbHkgYm90aCAnZGF5JyBhbmQgJ3dlZWtEYXknLCB1c2UgYXQgbW9zdCBvbmVcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbWludXRlID0gZmFsbGJhY2sob3B0aW9ucy5taW51dGUsIFwiKlwiKTtcbiAgICBjb25zdCBob3VyID0gZmFsbGJhY2sob3B0aW9ucy5ob3VyLCBcIipcIik7XG4gICAgY29uc3QgbW9udGggPSBmYWxsYmFjayhvcHRpb25zLm1vbnRoLCBcIipcIik7XG4gICAgY29uc3QgeWVhciA9IGZhbGxiYWNrKG9wdGlvbnMueWVhciwgXCIqXCIpO1xuXG4gICAgLy8gV2Vla2RheSBkZWZhdWx0cyB0byAnPycgaWYgbm90IHN1cHBsaWVkLiBJZiBpdCBpcyBzdXBwbGllZCwgZGF5IG11c3QgYmVjb21lICc/J1xuICAgIGNvbnN0IGRheSA9IGZhbGxiYWNrKFxuICAgICAgb3B0aW9ucy5kYXksXG4gICAgICBvcHRpb25zLndlZWtEYXkgIT09IHVuZGVmaW5lZCA/IFwiP1wiIDogXCIqXCIsXG4gICAgKTtcbiAgICBjb25zdCB3ZWVrRGF5ID0gZmFsbGJhY2sob3B0aW9ucy53ZWVrRGF5LCBcIj9cIik7XG5cbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIFNjaGVkdWxlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBleHByZXNzaW9uU3RyaW5nOiBzdHJpbmcgPSBgY3Jvbigke21pbnV0ZX0gJHtob3VyfSAke2RheX0gJHttb250aH0gJHt3ZWVrRGF5fSAke3llYXJ9KWA7XG4gICAgICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCkge1xuICAgICAgICBpZiAoIW9wdGlvbnMubWludXRlKSB7XG4gICAgICAgICAgLy8gXCJAYXdzLWNkay9hd3MtYXBwbGljYXRpb25hdXRvc2NhbGluZzpkZWZhdWx0UnVuRXZlcnlNaW51dGVcIixcbiAgICAgICAgICBBbm5vdGF0aW9ucy5vZihzY29wZSkuYWRkV2FybmluZyhcbiAgICAgICAgICAgIFwiY3JvbjogSWYgeW91IGRvbid0IHBhc3MgJ21pbnV0ZScsIGJ5IGRlZmF1bHQgdGhlIGV2ZW50IHJ1bnMgZXZlcnkgbWludXRlLiBQYXNzICdtaW51dGU6ICcqJycgaWYgdGhhdCdzIHdoYXQgeW91IGludGVuZCwgb3IgJ21pbnV0ZTogMCcgdG8gcnVuIG9uY2UgcGVyIGhvdXIgaW5zdGVhZC5cIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFNjaGVkdWxlKHRoaXMuZXhwcmVzc2lvblN0cmluZyk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZXhwcmVzc2lvbiBmb3IgdGhpcyBzY2hlZHVsZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGV4cHJlc3Npb25TdHJpbmc6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZChzY29wZTogQ29uc3RydWN0KTogdm9pZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGNvbmZpZ3VyZSBhIGNyb24gZXhwcmVzc2lvblxuICpcbiAqIEFsbCBmaWVsZHMgYXJlIHN0cmluZ3Mgc28geW91IGNhbiB1c2UgY29tcGxleCBleHByZXNzaW9ucy4gQWJzZW5jZSBvZlxuICogYSBmaWVsZCBpbXBsaWVzICcqJyBvciAnPycsIHdoaWNoZXZlciBvbmUgaXMgYXBwcm9wcmlhdGUuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvZXZlbnRzL1NjaGVkdWxlZEV2ZW50cy5odG1sI0Nyb25FeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBtaW51dGUgdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5IG1pbnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWludXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG91ciB0byBydW4gdGhpcyBydWxlIGF0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXZlcnkgaG91clxuICAgKi9cbiAgcmVhZG9ubHkgaG91cj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5IGRheSBvZiB0aGUgbW9udGhcbiAgICovXG4gIHJlYWRvbmx5IGRheT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vbnRoIHRvIHJ1biB0aGlzIHJ1bGUgYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBFdmVyeSBtb250aFxuICAgKi9cbiAgcmVhZG9ubHkgbW9udGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB5ZWFyIHRvIHJ1biB0aGlzIHJ1bGUgYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBFdmVyeSB5ZWFyXG4gICAqL1xuICByZWFkb25seSB5ZWFyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHJ1biB0aGlzIHJ1bGUgYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBBbnkgZGF5IG9mIHRoZSB3ZWVrXG4gICAqL1xuICByZWFkb25seSB3ZWVrRGF5Pzogc3RyaW5nO1xufVxuXG5jbGFzcyBMaXRlcmFsU2NoZWR1bGUgZXh0ZW5kcyBTY2hlZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBleHByZXNzaW9uU3RyaW5nOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIF9iaW5kKCkge31cbn1cblxuZnVuY3Rpb24gZmFsbGJhY2s8VD4oeDogVCB8IHVuZGVmaW5lZCwgZGVmOiBUKTogVCB7XG4gIHJldHVybiB4ID09PSB1bmRlZmluZWQgPyBkZWYgOiB4O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRJU08oZGF0ZT86IERhdGUpIHtcbiAgaWYgKCFkYXRlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgZGF0ZS5nZXRVVENGdWxsWWVhcigpICtcbiAgICBcIi1cIiArXG4gICAgcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpICtcbiAgICBcIi1cIiArXG4gICAgcGFkKGRhdGUuZ2V0VVRDRGF0ZSgpKSArXG4gICAgXCJUXCIgK1xuICAgIHBhZChkYXRlLmdldFVUQ0hvdXJzKCkpICtcbiAgICBcIjpcIiArXG4gICAgcGFkKGRhdGUuZ2V0VVRDTWludXRlcygpKSArXG4gICAgXCI6XCIgK1xuICAgIHBhZChkYXRlLmdldFVUQ1NlY29uZHMoKSlcbiAgKTtcblxuICBmdW5jdGlvbiBwYWQobnVtOiBudW1iZXIpIHtcbiAgICBpZiAobnVtIDwgMTApIHtcbiAgICAgIHJldHVybiBcIjBcIiArIG51bTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcmF0ZSBpZiB0aGUgcmF0ZSBpcyB3aG9sZSBudW1iZXJcbiAqL1xuZnVuY3Rpb24gbWF5YmVSYXRlKGludGVydmFsOiBudW1iZXIsIHNpbmd1bGFyOiBzdHJpbmcpIHtcbiAgaWYgKGludGVydmFsID09PSAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGludGVydmFsKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1ha2VSYXRlKGludGVydmFsLCBzaW5ndWxhcik7XG59XG5cbi8qKlxuICogUmV0dXJuICdyYXRlKCR7aW50ZXJ2YWx9ICR7c2luZ3VsYXJ9KHMpKWAgZm9yIHRoZSBpbnRlcnZhbFxuICovXG5mdW5jdGlvbiBtYWtlUmF0ZShpbnRlcnZhbDogbnVtYmVyLCBzaW5ndWxhcjogc3RyaW5nKSB7XG4gIHJldHVybiBpbnRlcnZhbCA9PT0gMVxuICAgID8gYHJhdGUoMSAke3Npbmd1bGFyfSlgXG4gICAgOiBgcmF0ZSgke2ludGVydmFsfSAke3Npbmd1bGFyfXMpYDtcbn1cbiJdfQ==