terraconstructs 0.0.23 → 0.0.25

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 (266) hide show
  1. package/.jsii +61226 -46941
  2. package/go.mod +10 -7
  3. package/go.sum +20 -14
  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.js +1 -1
  81. package/lib/aws/compute/index.d.ts +7 -0
  82. package/lib/aws/compute/index.js +11 -2
  83. package/lib/aws/compute/instance-types.js +1 -1
  84. package/lib/aws/compute/instance.js +1 -1
  85. package/lib/aws/compute/ip-addresses.js +2 -2
  86. package/lib/aws/compute/ipam.js +1 -1
  87. package/lib/aws/compute/key-pair.js +1 -1
  88. package/lib/aws/compute/launch-template.js +2 -2
  89. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  90. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  91. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  92. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  93. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  94. package/lib/aws/compute/lb-shared/util.js +1 -2
  95. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  96. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  97. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  98. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  99. package/lib/aws/compute/load-balancer.js +3 -3
  100. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  101. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  102. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  103. package/lib/aws/compute/machine-image/common.js +1 -1
  104. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  105. package/lib/aws/compute/machine-image/utils.js +6 -6
  106. package/lib/aws/compute/nat.js +5 -5
  107. package/lib/aws/compute/network-acl-types.js +2 -2
  108. package/lib/aws/compute/network-acl.js +3 -3
  109. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  110. package/lib/aws/compute/nlb/network-listener.js +2 -3
  111. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  112. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  113. package/lib/aws/compute/peer.js +1 -1
  114. package/lib/aws/compute/placement-group.js +1 -1
  115. package/lib/aws/compute/port.js +1 -1
  116. package/lib/aws/compute/prefix-list.js +1 -1
  117. package/lib/aws/compute/private/context-stub.js +2 -2
  118. package/lib/aws/compute/route.js +11 -11
  119. package/lib/aws/compute/scalable-target.d.ts +197 -0
  120. package/lib/aws/compute/scalable-target.js +168 -0
  121. package/lib/aws/compute/schedule.d.ts +81 -0
  122. package/lib/aws/compute/schedule.js +145 -0
  123. package/lib/aws/compute/security-group.js +4 -4
  124. package/lib/aws/compute/state-graph.js +1 -1
  125. package/lib/aws/compute/state-machine-fragment.js +1 -1
  126. package/lib/aws/compute/state-machine.js +4 -4
  127. package/lib/aws/compute/states/choice.js +1 -1
  128. package/lib/aws/compute/states/custom-state.js +1 -1
  129. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  130. package/lib/aws/compute/states/distributed-map/item-reader.js +7 -7
  131. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  132. package/lib/aws/compute/states/distributed-map.js +4 -4
  133. package/lib/aws/compute/states/fail.js +1 -1
  134. package/lib/aws/compute/states/map-base.js +1 -1
  135. package/lib/aws/compute/states/map.js +1 -1
  136. package/lib/aws/compute/states/parallel.js +1 -1
  137. package/lib/aws/compute/states/pass.js +2 -2
  138. package/lib/aws/compute/states/state.js +1 -1
  139. package/lib/aws/compute/states/succeed.js +1 -1
  140. package/lib/aws/compute/states/task-base.js +2 -2
  141. package/lib/aws/compute/states/task.js +1 -1
  142. package/lib/aws/compute/states/wait.js +2 -2
  143. package/lib/aws/compute/step-scaling-action.d.ts +148 -0
  144. package/lib/aws/compute/step-scaling-action.js +109 -0
  145. package/lib/aws/compute/step-scaling-policy.d.ts +132 -0
  146. package/lib/aws/compute/step-scaling-policy.js +153 -0
  147. package/lib/aws/compute/subnet-v2.js +2 -2
  148. package/lib/aws/compute/subnet.js +1 -1
  149. package/lib/aws/compute/target-tracking-scaling-policy.d.ts +262 -0
  150. package/lib/aws/compute/target-tracking-scaling-policy.js +234 -0
  151. package/lib/aws/compute/task-credentials.js +1 -1
  152. package/lib/aws/compute/task-input.js +1 -1
  153. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  154. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  155. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  156. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  157. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  158. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  159. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  160. package/lib/aws/compute/types.js +1 -1
  161. package/lib/aws/compute/user-data.js +3 -3
  162. package/lib/aws/compute/volume.js +2 -2
  163. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  164. package/lib/aws/compute/vpc-endpoint.js +6 -6
  165. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  166. package/lib/aws/compute/vpc-v2-base.js +1 -1
  167. package/lib/aws/compute/vpc-v2.js +2 -2
  168. package/lib/aws/compute/vpc.d.ts +1 -1
  169. package/lib/aws/compute/vpc.js +10 -16
  170. package/lib/aws/compute/vpn.js +4 -7
  171. package/lib/aws/compute/windows-versions.js +1 -2
  172. package/lib/aws/edge/certificate.js +1 -1
  173. package/lib/aws/edge/distribution.js +4 -5
  174. package/lib/aws/edge/dns-alias-record-targets.js +3 -3
  175. package/lib/aws/edge/dns-record.js +13 -13
  176. package/lib/aws/edge/dns-zone.js +1 -1
  177. package/lib/aws/edge/function.js +2 -2
  178. package/lib/aws/edge/key-value-store.js +4 -4
  179. package/lib/aws/edge/origin.js +3 -3
  180. package/lib/aws/edge/response-headers-policy.js +1 -1
  181. package/lib/aws/encryption/alias.js +1 -1
  182. package/lib/aws/encryption/key.js +1 -1
  183. package/lib/aws/encryption/via-service-principal.js +1 -1
  184. package/lib/aws/iam/grant.js +3 -4
  185. package/lib/aws/iam/group.js +1 -1
  186. package/lib/aws/iam/instance-profile.js +1 -1
  187. package/lib/aws/iam/managed-policy.js +1 -1
  188. package/lib/aws/iam/oidc-provider.js +3 -3
  189. package/lib/aws/iam/policy-document.js +1 -1
  190. package/lib/aws/iam/policy-statement.js +1 -1
  191. package/lib/aws/iam/policy.js +1 -1
  192. package/lib/aws/iam/principals.js +20 -20
  193. package/lib/aws/iam/role.js +1 -1
  194. package/lib/aws/iam/saml-provider.js +2 -2
  195. package/lib/aws/iam/unknown-principal.js +1 -1
  196. package/lib/aws/iam/user.js +1 -1
  197. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  198. package/lib/aws/network/subnet-group.js +3 -3
  199. package/lib/aws/network/subnet.js +4 -4
  200. package/lib/aws/notify/archive.js +1 -1
  201. package/lib/aws/notify/connection.js +7 -7
  202. package/lib/aws/notify/event-bus.js +3 -3
  203. package/lib/aws/notify/event-pattern.js +1 -1
  204. package/lib/aws/notify/input.js +2 -2
  205. package/lib/aws/notify/kinesis-stream.js +1 -1
  206. package/lib/aws/notify/notification-rule.js +1 -1
  207. package/lib/aws/notify/policy.js +1 -1
  208. package/lib/aws/notify/queue-policy.js +1 -1
  209. package/lib/aws/notify/queue.js +1 -1
  210. package/lib/aws/notify/resource-policy.js +1 -1
  211. package/lib/aws/notify/rule.js +1 -1
  212. package/lib/aws/notify/schedule.js +1 -1
  213. package/lib/aws/notify/subscription-filter.js +1 -1
  214. package/lib/aws/notify/subscription.js +4 -4
  215. package/lib/aws/notify/subscriptions/email.js +1 -1
  216. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  217. package/lib/aws/notify/subscriptions/sms.js +1 -1
  218. package/lib/aws/notify/subscriptions/sqs.js +1 -1
  219. package/lib/aws/notify/subscriptions/url.js +1 -1
  220. package/lib/aws/notify/targets/event-bus.js +1 -1
  221. package/lib/aws/notify/targets/function.js +1 -1
  222. package/lib/aws/notify/targets/log-group.js +2 -2
  223. package/lib/aws/notify/targets/sqs.js +3 -3
  224. package/lib/aws/notify/targets/state-machine.js +1 -1
  225. package/lib/aws/notify/targets/util.js +2 -2
  226. package/lib/aws/notify/topic-base.js +1 -1
  227. package/lib/aws/notify/topic.js +1 -1
  228. package/lib/aws/storage/billing.d.ts +62 -0
  229. package/lib/aws/storage/billing.js +49 -0
  230. package/lib/aws/storage/bucket-notifications.js +1 -1
  231. package/lib/aws/storage/bucket-policy.js +1 -1
  232. package/lib/aws/storage/bucket-source.js +3 -3
  233. package/lib/aws/storage/bucket.js +2 -2
  234. package/lib/aws/storage/capacity.d.ts +96 -0
  235. package/lib/aws/storage/capacity.js +103 -0
  236. package/lib/aws/storage/dynamodb-canned-metrics.generated.d.ts +493 -0
  237. package/lib/aws/storage/dynamodb-canned-metrics.generated.js +263 -0
  238. package/lib/aws/storage/dynamodb-perms.d.ts +8 -0
  239. package/lib/aws/storage/dynamodb-perms.js +45 -0
  240. package/lib/aws/storage/encryption.d.ts +54 -0
  241. package/lib/aws/storage/encryption.js +116 -0
  242. package/lib/aws/storage/index.d.ts +6 -0
  243. package/lib/aws/storage/index.js +10 -1
  244. package/lib/aws/storage/notification-targets/function.js +1 -1
  245. package/lib/aws/storage/notification-targets/queue.js +1 -1
  246. package/lib/aws/storage/origin-access-identity.js +1 -1
  247. package/lib/aws/storage/parameter.js +2 -2
  248. package/lib/aws/storage/scalable-attribute-api.d.ts +36 -0
  249. package/lib/aws/storage/scalable-attribute-api.js +3 -0
  250. package/lib/aws/storage/scalable-table-attribute.d.ts +32 -0
  251. package/lib/aws/storage/scalable-table-attribute.js +48 -0
  252. package/lib/aws/storage/shared.d.ts +419 -0
  253. package/lib/aws/storage/shared.js +161 -0
  254. package/lib/aws/storage/table.d.ts +536 -0
  255. package/lib/aws/storage/table.js +1054 -0
  256. package/lib/construct-base.js +2 -2
  257. package/lib/duration.js +1 -1
  258. package/lib/expiration.js +1 -1
  259. package/lib/index.d.ts +1 -0
  260. package/lib/index.js +2 -1
  261. package/lib/size.js +1 -1
  262. package/lib/stack-base.js +1 -1
  263. package/lib/terra-func.js +1 -1
  264. package/lib/time-zone.d.ts +724 -0
  265. package/lib/time-zone.js +737 -0
  266. package/package.json +2 -1
@@ -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.25" };
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.25" };
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==