terraconstructs 0.0.17 → 0.0.18

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 (225) hide show
  1. package/.jsii +4533 -3
  2. package/lib/aws/arn.js +1 -1
  3. package/lib/aws/aws-construct.js +1 -1
  4. package/lib/aws/aws-stack.js +1 -1
  5. package/lib/aws/aws-tags.js +2 -2
  6. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  7. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  8. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  9. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  10. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  11. package/lib/aws/cloudwatch/alarm.js +1 -1
  12. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  13. package/lib/aws/cloudwatch/dashboard.js +1 -1
  14. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  15. package/lib/aws/cloudwatch/graph.js +8 -8
  16. package/lib/aws/cloudwatch/layout.js +3 -3
  17. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  18. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  19. package/lib/aws/cloudwatch/log-group.js +1 -1
  20. package/lib/aws/cloudwatch/log-query.js +1 -1
  21. package/lib/aws/cloudwatch/log-stream.js +1 -1
  22. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  23. package/lib/aws/cloudwatch/metric.js +2 -2
  24. package/lib/aws/cloudwatch/pattern.js +3 -3
  25. package/lib/aws/cloudwatch/policy.js +1 -1
  26. package/lib/aws/cloudwatch/query-definition.js +2 -2
  27. package/lib/aws/cloudwatch/stats.js +1 -1
  28. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  29. package/lib/aws/cloudwatch/text.js +1 -1
  30. package/lib/aws/cloudwatch/variable.js +3 -3
  31. package/lib/aws/cloudwatch/widget.js +1 -1
  32. package/lib/aws/compute/activity.js +1 -1
  33. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  34. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  35. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  36. package/lib/aws/compute/alb/application-listener.js +1 -1
  37. package/lib/aws/compute/alb/application-load-balancer.js +1 -1
  38. package/lib/aws/compute/alb/application-target-group.js +1 -1
  39. package/lib/aws/compute/alb/conditions.js +1 -1
  40. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  41. package/lib/aws/compute/alb/trust-store.js +1 -1
  42. package/lib/aws/compute/architecture.js +1 -1
  43. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  44. package/lib/aws/compute/bastion-host.js +1 -1
  45. package/lib/aws/compute/chain.js +1 -1
  46. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  47. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  48. package/lib/aws/compute/client-vpn-route.js +2 -2
  49. package/lib/aws/compute/condition.js +1 -1
  50. package/lib/aws/compute/connections.js +1 -1
  51. package/lib/aws/compute/event-invoke-config.js +1 -1
  52. package/lib/aws/compute/event-source-filter.js +2 -2
  53. package/lib/aws/compute/event-source-mapping.js +1 -1
  54. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  55. package/lib/aws/compute/event-sources/s3.js +1 -1
  56. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  57. package/lib/aws/compute/event-sources/sqs.js +1 -1
  58. package/lib/aws/compute/fields.js +4 -4
  59. package/lib/aws/compute/function-alias.js +1 -1
  60. package/lib/aws/compute/function-base.js +2 -2
  61. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  62. package/lib/aws/compute/function-destinations/function.js +1 -1
  63. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  64. package/lib/aws/compute/function-nodejs.js +1 -1
  65. package/lib/aws/compute/function-url.js +1 -1
  66. package/lib/aws/compute/function.js +1 -1
  67. package/lib/aws/compute/instance-types.js +1 -1
  68. package/lib/aws/compute/instance.js +1 -1
  69. package/lib/aws/compute/ip-addresses.js +2 -2
  70. package/lib/aws/compute/ipam.js +1 -1
  71. package/lib/aws/compute/key-pair.js +1 -1
  72. package/lib/aws/compute/launch-template.js +2 -2
  73. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  74. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  75. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  76. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  77. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  78. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  79. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  80. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  81. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  82. package/lib/aws/compute/load-balancer.js +3 -3
  83. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  84. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  85. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  86. package/lib/aws/compute/machine-image/common.js +1 -1
  87. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  88. package/lib/aws/compute/nat.js +5 -5
  89. package/lib/aws/compute/network-acl-types.js +2 -2
  90. package/lib/aws/compute/network-acl.js +3 -3
  91. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  92. package/lib/aws/compute/nlb/network-listener.js +1 -1
  93. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  94. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  95. package/lib/aws/compute/peer.js +1 -1
  96. package/lib/aws/compute/placement-group.js +1 -1
  97. package/lib/aws/compute/port.js +1 -1
  98. package/lib/aws/compute/prefix-list.js +1 -1
  99. package/lib/aws/compute/route.js +8 -8
  100. package/lib/aws/compute/security-group.js +1 -1
  101. package/lib/aws/compute/state-graph.js +1 -1
  102. package/lib/aws/compute/state-machine-fragment.js +1 -1
  103. package/lib/aws/compute/state-machine.js +4 -4
  104. package/lib/aws/compute/states/choice.js +1 -1
  105. package/lib/aws/compute/states/custom-state.js +1 -1
  106. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  107. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  108. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  109. package/lib/aws/compute/states/distributed-map.js +1 -1
  110. package/lib/aws/compute/states/fail.js +1 -1
  111. package/lib/aws/compute/states/map-base.js +1 -1
  112. package/lib/aws/compute/states/map.js +1 -1
  113. package/lib/aws/compute/states/parallel.js +1 -1
  114. package/lib/aws/compute/states/pass.js +2 -2
  115. package/lib/aws/compute/states/state.js +1 -1
  116. package/lib/aws/compute/states/succeed.js +1 -1
  117. package/lib/aws/compute/states/task-base.js +2 -2
  118. package/lib/aws/compute/states/task.js +1 -1
  119. package/lib/aws/compute/states/wait.js +2 -2
  120. package/lib/aws/compute/subnet-v2.js +2 -2
  121. package/lib/aws/compute/subnet.js +1 -1
  122. package/lib/aws/compute/task-credentials.js +1 -1
  123. package/lib/aws/compute/task-input.js +1 -1
  124. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  125. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  126. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  127. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  128. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  129. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  130. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  131. package/lib/aws/compute/types.js +1 -1
  132. package/lib/aws/compute/user-data.js +3 -3
  133. package/lib/aws/compute/volume.js +2 -2
  134. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  135. package/lib/aws/compute/vpc-endpoint.js +6 -6
  136. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  137. package/lib/aws/compute/vpc-v2-base.js +1 -1
  138. package/lib/aws/compute/vpc-v2.js +2 -2
  139. package/lib/aws/compute/vpc.js +4 -4
  140. package/lib/aws/compute/vpn.js +3 -3
  141. package/lib/aws/edge/certificate.js +1 -1
  142. package/lib/aws/edge/distribution.js +3 -3
  143. package/lib/aws/edge/dns-alias-record-targets.js +3 -3
  144. package/lib/aws/edge/dns-record.js +13 -13
  145. package/lib/aws/edge/dns-zone.js +1 -1
  146. package/lib/aws/edge/function.js +2 -2
  147. package/lib/aws/edge/key-value-store.js +4 -4
  148. package/lib/aws/edge/origin.js +3 -3
  149. package/lib/aws/edge/response-headers-policy.js +1 -1
  150. package/lib/aws/encryption/alias.js +1 -1
  151. package/lib/aws/encryption/key.js +1 -1
  152. package/lib/aws/encryption/via-service-principal.js +1 -1
  153. package/lib/aws/iam/grant.js +2 -2
  154. package/lib/aws/iam/group.js +1 -1
  155. package/lib/aws/iam/instance-profile.js +1 -1
  156. package/lib/aws/iam/managed-policy.js +1 -1
  157. package/lib/aws/iam/oidc-provider.js +1 -1
  158. package/lib/aws/iam/policy-document.js +1 -1
  159. package/lib/aws/iam/policy-statement.js +1 -1
  160. package/lib/aws/iam/policy.js +1 -1
  161. package/lib/aws/iam/principals.js +20 -20
  162. package/lib/aws/iam/role.js +1 -1
  163. package/lib/aws/iam/saml-provider.js +2 -2
  164. package/lib/aws/iam/unknown-principal.js +1 -1
  165. package/lib/aws/iam/user.js +1 -1
  166. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  167. package/lib/aws/network/subnet-group.js +3 -3
  168. package/lib/aws/network/subnet.js +4 -4
  169. package/lib/aws/notify/archive.js +1 -1
  170. package/lib/aws/notify/connection.js +3 -3
  171. package/lib/aws/notify/delivery-policy.d.ts +114 -0
  172. package/lib/aws/notify/delivery-policy.js +27 -0
  173. package/lib/aws/notify/event-bus.js +3 -3
  174. package/lib/aws/notify/event-pattern.js +1 -1
  175. package/lib/aws/notify/index.d.ts +11 -0
  176. package/lib/aws/notify/index.js +14 -1
  177. package/lib/aws/notify/input.js +2 -2
  178. package/lib/aws/notify/kinesis-stream.js +1 -1
  179. package/lib/aws/notify/notification-rule-source.d.ts +20 -0
  180. package/lib/aws/notify/notification-rule-source.js +4 -0
  181. package/lib/aws/notify/notification-rule-target.d.ts +24 -0
  182. package/lib/aws/notify/notification-rule-target.js +4 -0
  183. package/lib/aws/notify/notification-rule.d.ts +123 -0
  184. package/lib/aws/notify/notification-rule.js +129 -0
  185. package/lib/aws/notify/policy.d.ts +56 -0
  186. package/lib/aws/notify/policy.js +83 -0
  187. package/lib/aws/notify/queue-policy.js +1 -1
  188. package/lib/aws/notify/queue.js +1 -1
  189. package/lib/aws/notify/resource-policy.js +1 -1
  190. package/lib/aws/notify/rule.js +1 -1
  191. package/lib/aws/notify/schedule.js +1 -1
  192. package/lib/aws/notify/sns-augmentations.generated.d.ts +125 -0
  193. package/lib/aws/notify/sns-augmentations.generated.js +71 -0
  194. package/lib/aws/notify/sns-canned-metrics.generated.d.ts +33 -0
  195. package/lib/aws/notify/sns-canned-metrics.generated.js +47 -0
  196. package/lib/aws/notify/subscriber.d.ts +44 -0
  197. package/lib/aws/notify/subscriber.js +4 -0
  198. package/lib/aws/notify/subscription-filter.d.ts +129 -0
  199. package/lib/aws/notify/subscription-filter.js +105 -0
  200. package/lib/aws/notify/subscription.d.ts +219 -0
  201. package/lib/aws/notify/subscription.js +357 -0
  202. package/lib/aws/notify/targets/event-bus.js +1 -1
  203. package/lib/aws/notify/targets/function.js +1 -1
  204. package/lib/aws/notify/targets/log-group.js +2 -2
  205. package/lib/aws/notify/targets/sqs.js +1 -1
  206. package/lib/aws/notify/targets/state-machine.js +1 -1
  207. package/lib/aws/notify/topic-base.d.ts +155 -0
  208. package/lib/aws/notify/topic-base.js +175 -0
  209. package/lib/aws/notify/topic.d.ts +222 -0
  210. package/lib/aws/notify/topic.js +219 -0
  211. package/lib/aws/storage/bucket-notifications.js +1 -1
  212. package/lib/aws/storage/bucket-policy.js +1 -1
  213. package/lib/aws/storage/bucket-source.js +1 -1
  214. package/lib/aws/storage/bucket.js +2 -2
  215. package/lib/aws/storage/notification-targets/function.js +1 -1
  216. package/lib/aws/storage/notification-targets/queue.js +1 -1
  217. package/lib/aws/storage/origin-access-identity.js +1 -1
  218. package/lib/aws/storage/parameter.js +2 -2
  219. package/lib/construct-base.js +2 -2
  220. package/lib/duration.js +1 -1
  221. package/lib/expiration.js +1 -1
  222. package/lib/size.js +1 -1
  223. package/lib/stack-base.js +1 -1
  224. package/lib/terra-func.js +1 -1
  225. package/package.json +1 -1
@@ -0,0 +1,219 @@
1
+ import { Construct } from "constructs";
2
+ import { DeliveryPolicy } from "./delivery-policy";
3
+ import { SubscriptionFilter } from "./subscription-filter";
4
+ import { ITopic } from "./topic-base";
5
+ import { AwsConstructBase, AwsConstructProps } from "../aws-construct";
6
+ import * as notify from "../notify";
7
+ /**
8
+ * Outputs for the Subscription construct.
9
+ */
10
+ export interface SubscriptionOutputs {
11
+ /**
12
+ * The ARN of the subscription.
13
+ */
14
+ readonly subscriptionArn: string;
15
+ }
16
+ /**
17
+ * Options for creating a new subscription
18
+ */
19
+ export interface SubscriptionOptions extends AwsConstructProps {
20
+ /**
21
+ * What type of subscription to add.
22
+ */
23
+ readonly protocol: SubscriptionProtocol;
24
+ /**
25
+ * The subscription endpoint.
26
+ *
27
+ * The meaning of this value depends on the value for 'protocol'.
28
+ */
29
+ readonly endpoint: string;
30
+ /**
31
+ * true if raw message delivery is enabled for the subscription. Raw messages are free of JSON formatting and can be
32
+ * sent to HTTP/S and Amazon SQS endpoints. For more information, see GetSubscriptionAttributes in the Amazon Simple
33
+ * Notification Service API Reference.
34
+ *
35
+ * @default false
36
+ */
37
+ readonly rawMessageDelivery?: boolean;
38
+ /**
39
+ * The filter policy.
40
+ *
41
+ * @default - all messages are delivered
42
+ */
43
+ readonly filterPolicy?: {
44
+ [attribute: string]: SubscriptionFilter;
45
+ };
46
+ /**
47
+ * The filter policy that is applied on the message body.
48
+ * To apply a filter policy to the message attributes, use `filterPolicy`. A maximum of one of `filterPolicyWithMessageBody` and `filterPolicy` may be used.
49
+ *
50
+ * @default - all messages are delivered
51
+ */
52
+ readonly filterPolicyWithMessageBody?: {
53
+ [attribute: string]: FilterOrPolicy;
54
+ };
55
+ /**
56
+ * Queue to be used as dead letter queue.
57
+ * If not passed no dead letter queue is enabled.
58
+ *
59
+ * @default - No dead letter queue enabled.
60
+ */
61
+ readonly deadLetterQueue?: notify.IQueue;
62
+ /**
63
+ * Arn of role allowing access to firehose delivery stream.
64
+ * Required for a firehose subscription protocol.
65
+ * @default - No subscription role is provided
66
+ */
67
+ readonly subscriptionRoleArn?: string;
68
+ /**
69
+ * The delivery policy.
70
+ *
71
+ * @default - if the initial delivery of the message fails, three retries with a delay between failed attempts set at 20 seconds
72
+ */
73
+ readonly deliveryPolicy?: DeliveryPolicy;
74
+ }
75
+ /**
76
+ * Properties for creating a new subscription
77
+ */
78
+ export interface SubscriptionProps extends SubscriptionOptions {
79
+ /**
80
+ * The topic to subscribe to.
81
+ */
82
+ readonly topic: ITopic;
83
+ }
84
+ /**
85
+ * A new subscription.
86
+ *
87
+ * Prefer to use the `ITopic.addSubscription()` methods to create instances of
88
+ * this class.
89
+ *
90
+ * @resource aws_sns_topic_subscription
91
+ */
92
+ export declare class Subscription extends AwsConstructBase {
93
+ /**
94
+ * The DLQ associated with this subscription if present.
95
+ */
96
+ readonly deadLetterQueue?: notify.IQueue;
97
+ private readonly resource;
98
+ readonly subscriptionOutputs: SubscriptionOutputs;
99
+ get outputs(): Record<string, any>;
100
+ constructor(scope: Construct, id: string, props: SubscriptionProps);
101
+ private renderDeliveryPolicy;
102
+ private buildDeadLetterQueue;
103
+ private buildDeadLetterConfig;
104
+ }
105
+ /**
106
+ * The type of subscription, controlling the type of the endpoint parameter.
107
+ */
108
+ export declare enum SubscriptionProtocol {
109
+ /**
110
+ * JSON-encoded message is POSTED to an HTTP url.
111
+ */
112
+ HTTP = "http",
113
+ /**
114
+ * JSON-encoded message is POSTed to an HTTPS url.
115
+ */
116
+ HTTPS = "https",
117
+ /**
118
+ * Notifications are sent via email.
119
+ */
120
+ EMAIL = "email",
121
+ /**
122
+ * Notifications are JSON-encoded and sent via mail.
123
+ */
124
+ EMAIL_JSON = "email-json",
125
+ /**
126
+ * Notification is delivered by SMS
127
+ */
128
+ SMS = "sms",
129
+ /**
130
+ * Notifications are enqueued into an SQS queue.
131
+ */
132
+ SQS = "sqs",
133
+ /**
134
+ * JSON-encoded notifications are sent to a mobile app endpoint.
135
+ */
136
+ APPLICATION = "application",
137
+ /**
138
+ * Notifications trigger a Lambda function.
139
+ */
140
+ LAMBDA = "lambda",
141
+ /**
142
+ * Notifications put records into a firehose delivery stream.
143
+ */
144
+ FIREHOSE = "firehose"
145
+ }
146
+ /**
147
+ * The type of the MessageBody at a given key value pair
148
+ */
149
+ export declare enum FilterOrPolicyType {
150
+ /**
151
+ * The filter of the MessageBody
152
+ */
153
+ FILTER = 0,
154
+ /**
155
+ * A nested key of the MessageBody
156
+ */
157
+ POLICY = 1
158
+ }
159
+ /**
160
+ * Class for building the FilterPolicy by avoiding union types
161
+ */
162
+ export declare abstract class FilterOrPolicy {
163
+ /**
164
+ * Filter of MessageBody
165
+ */
166
+ static filter(filter: SubscriptionFilter): notify.Filter;
167
+ /**
168
+ * Policy of MessageBody
169
+ */
170
+ static policy(policy: {
171
+ [attribute: string]: FilterOrPolicy;
172
+ }): notify.Policy;
173
+ /**
174
+ * Type switch for disambiguating between subclasses
175
+ */
176
+ abstract readonly type: FilterOrPolicyType;
177
+ /**
178
+ * Check if instance is `Policy` type
179
+ */
180
+ isPolicy(): this is Policy;
181
+ /**
182
+ * Check if instance is `Filter` type
183
+ */
184
+ isFilter(): this is Filter;
185
+ }
186
+ /**
187
+ * Filter implementation of FilterOrPolicy
188
+ */
189
+ export declare class Filter extends FilterOrPolicy {
190
+ readonly filterDoc: SubscriptionFilter;
191
+ /**
192
+ * Type used in DFS buildFilterPolicyWithMessageBody to determine json value type
193
+ */
194
+ readonly type = notify.FilterOrPolicyType.FILTER;
195
+ /**
196
+ * Policy constructor
197
+ * @param filterDoc filter argument to construct
198
+ */
199
+ constructor(filterDoc: SubscriptionFilter);
200
+ }
201
+ /**
202
+ * Policy Implementation of FilterOrPolicy
203
+ */
204
+ export declare class Policy extends FilterOrPolicy {
205
+ readonly policyDoc: {
206
+ [attribute: string]: FilterOrPolicy;
207
+ };
208
+ /**
209
+ * Type used in DFS buildFilterPolicyWithMessageBody to determine json value type
210
+ */
211
+ readonly type = notify.FilterOrPolicyType.POLICY;
212
+ /**
213
+ * Policy constructor
214
+ * @param policyDoc policy argument to construct
215
+ */
216
+ constructor(policyDoc: {
217
+ [attribute: string]: FilterOrPolicy;
218
+ });
219
+ }
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Policy = exports.Filter = exports.FilterOrPolicy = exports.FilterOrPolicyType = exports.SubscriptionProtocol = exports.Subscription = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // https://github.com/aws/aws-cdk/blob/6b9e47a1529319561bc1040739fe02bac15895bf/packages/aws-cdk-lib/aws-sns/lib/subscription.ts
7
+ const provider_aws_1 = require("@cdktf/provider-aws");
8
+ const aws_construct_1 = require("../aws-construct");
9
+ const iam = require("../iam");
10
+ /**
11
+ * A new subscription.
12
+ *
13
+ * Prefer to use the `ITopic.addSubscription()` methods to create instances of
14
+ * this class.
15
+ *
16
+ * @resource aws_sns_topic_subscription
17
+ */
18
+ class Subscription extends aws_construct_1.AwsConstructBase {
19
+ get outputs() {
20
+ return this.subscriptionOutputs;
21
+ }
22
+ constructor(scope, id, props) {
23
+ super(scope, id, props);
24
+ if (props.rawMessageDelivery &&
25
+ [
26
+ SubscriptionProtocol.HTTP,
27
+ SubscriptionProtocol.HTTPS,
28
+ SubscriptionProtocol.SQS,
29
+ SubscriptionProtocol.FIREHOSE,
30
+ ].indexOf(props.protocol) < 0) {
31
+ // TODO: re-add ValidationError
32
+ throw new Error("Raw message delivery can only be enabled for HTTP, HTTPS, SQS, and Firehose subscriptions.");
33
+ }
34
+ let filterPolicyJson;
35
+ /** Whether the filter_policy applies to MessageAttributes (default) or MessageBody */
36
+ let filterPolicyScope;
37
+ if (props.filterPolicy && props.filterPolicyWithMessageBody) {
38
+ throw new Error("A maximum of one of `filterPolicyWithMessageBody` and `filterPolicy` may be used.");
39
+ }
40
+ if (props.filterPolicy) {
41
+ if (Object.keys(props.filterPolicy).length > 5) {
42
+ throw new Error("A filter policy can have a maximum of 5 attribute names.");
43
+ }
44
+ const filterPolicyConditions = Object.entries(props.filterPolicy).reduce((acc, [k, v]) => ({ ...acc, [k]: v.conditions }), {});
45
+ let total = 1;
46
+ Object.values(filterPolicyConditions).forEach((filter) => {
47
+ total *= filter.length;
48
+ });
49
+ if (total > 150) {
50
+ // TODO: re-add ValidationError
51
+ throw new Error(`The total combination of values (${total}) must not exceed 150.`);
52
+ }
53
+ filterPolicyJson = JSON.stringify(filterPolicyConditions);
54
+ filterPolicyScope = "MessageAttributes"; // Default scope
55
+ }
56
+ else if (props.filterPolicyWithMessageBody) {
57
+ if (Object.keys(props.filterPolicyWithMessageBody).length > 5) {
58
+ throw new Error("A filter policy can have a maximum of 5 attribute names.");
59
+ }
60
+ const builtPolicy = buildFilterPolicyWithMessageBody(this, props.filterPolicyWithMessageBody);
61
+ filterPolicyJson = JSON.stringify(builtPolicy);
62
+ filterPolicyScope = "MessageBody";
63
+ }
64
+ if (props.protocol === SubscriptionProtocol.FIREHOSE &&
65
+ !props.subscriptionRoleArn) {
66
+ throw new Error("Subscription role arn is required field for subscriptions with a firehose protocol.");
67
+ }
68
+ this.deadLetterQueue = this.buildDeadLetterQueue(props);
69
+ const redrivePolicyJson = this.buildDeadLetterConfig(this.deadLetterQueue);
70
+ const deliveryPolicyJson = props.deliveryPolicy
71
+ ? this.renderDeliveryPolicy(props.deliveryPolicy, props.protocol)
72
+ : undefined;
73
+ this.resource = new provider_aws_1.snsTopicSubscription.SnsTopicSubscription(this, "Resource", {
74
+ endpoint: props.endpoint,
75
+ protocol: props.protocol,
76
+ topicArn: props.topic.topicArn,
77
+ rawMessageDelivery: props.rawMessageDelivery,
78
+ filterPolicy: filterPolicyJson,
79
+ filterPolicyScope: filterPolicyScope,
80
+ redrivePolicy: redrivePolicyJson,
81
+ subscriptionRoleArn: props.subscriptionRoleArn,
82
+ deliveryPolicy: deliveryPolicyJson,
83
+ // confirmationTimeoutInMinutes: // Not directly available in CDK props
84
+ // endpointAutoConfirms: // Not directly available in CDK props
85
+ // replayPolicy: // Not directly available in CDK props (missing in AWS CDK)
86
+ });
87
+ this.subscriptionOutputs = {
88
+ subscriptionArn: this.resource.arn,
89
+ };
90
+ }
91
+ renderDeliveryPolicy(deliveryPolicy, protocol) {
92
+ // TODO: re-add ValidationError(s)
93
+ if (![SubscriptionProtocol.HTTP, SubscriptionProtocol.HTTPS].includes(protocol)) {
94
+ throw new Error(`Delivery policy is only supported for HTTP and HTTPS subscriptions, got: ${protocol}`);
95
+ }
96
+ const { healthyRetryPolicy, throttlePolicy, requestPolicy } = deliveryPolicy;
97
+ const renderedPolicy = {};
98
+ if (healthyRetryPolicy) {
99
+ const delayTargetLimitSecs = 3600;
100
+ const minDelayTarget = healthyRetryPolicy.minDelayTarget;
101
+ const maxDelayTarget = healthyRetryPolicy.maxDelayTarget;
102
+ if (minDelayTarget !== undefined) {
103
+ if (minDelayTarget.toMilliseconds() % 1000 !== 0) {
104
+ throw new Error(`minDelayTarget must be a whole number of seconds, got: ${minDelayTarget}`);
105
+ }
106
+ const minDelayTargetSecs = minDelayTarget.toSeconds();
107
+ if (minDelayTargetSecs < 1 ||
108
+ minDelayTargetSecs > delayTargetLimitSecs) {
109
+ throw new Error(`minDelayTarget must be between 1 and ${delayTargetLimitSecs} seconds inclusive, got: ${minDelayTargetSecs}s`);
110
+ }
111
+ }
112
+ if (maxDelayTarget !== undefined) {
113
+ if (maxDelayTarget.toMilliseconds() % 1000 !== 0) {
114
+ throw new Error(`maxDelayTarget must be a whole number of seconds, got: ${maxDelayTarget}`);
115
+ }
116
+ const maxDelayTargetSecs = maxDelayTarget.toSeconds();
117
+ if (maxDelayTargetSecs < 1 ||
118
+ maxDelayTargetSecs > delayTargetLimitSecs) {
119
+ throw new Error(`maxDelayTarget must be between 1 and ${delayTargetLimitSecs} seconds inclusive, got: ${maxDelayTargetSecs}s`);
120
+ }
121
+ if (minDelayTarget !== undefined &&
122
+ minDelayTarget.toSeconds() > maxDelayTargetSecs) {
123
+ throw new Error("minDelayTarget must not exceed maxDelayTarget");
124
+ }
125
+ }
126
+ const numRetriesLimit = 100;
127
+ if (healthyRetryPolicy.numRetries &&
128
+ (healthyRetryPolicy.numRetries < 0 ||
129
+ healthyRetryPolicy.numRetries > numRetriesLimit)) {
130
+ throw new Error(`numRetries must be between 0 and ${numRetriesLimit} inclusive, got: ${healthyRetryPolicy.numRetries}`);
131
+ }
132
+ const { numNoDelayRetries, numMinDelayRetries, numMaxDelayRetries } = healthyRetryPolicy;
133
+ if (numNoDelayRetries &&
134
+ (numNoDelayRetries < 0 || !Number.isInteger(numNoDelayRetries))) {
135
+ throw new Error(`numNoDelayRetries must be an integer zero or greater, got: ${numNoDelayRetries}`);
136
+ }
137
+ if (numMinDelayRetries &&
138
+ (numMinDelayRetries < 0 || !Number.isInteger(numMinDelayRetries))) {
139
+ throw new Error(`numMinDelayRetries must be an integer zero or greater, got: ${numMinDelayRetries}`);
140
+ }
141
+ if (numMaxDelayRetries &&
142
+ (numMaxDelayRetries < 0 || !Number.isInteger(numMaxDelayRetries))) {
143
+ throw new Error(`numMaxDelayRetries must be an integer zero or greater, got: ${numMaxDelayRetries}`);
144
+ }
145
+ renderedPolicy.healthyRetryPolicy = {
146
+ minDelayTarget: healthyRetryPolicy.minDelayTarget === undefined
147
+ ? 20
148
+ : healthyRetryPolicy.minDelayTarget.toSeconds(),
149
+ maxDelayTarget: healthyRetryPolicy.maxDelayTarget === undefined
150
+ ? 20
151
+ : healthyRetryPolicy.maxDelayTarget.toSeconds(),
152
+ numRetries: healthyRetryPolicy.numRetries === undefined
153
+ ? 3
154
+ : healthyRetryPolicy.numRetries,
155
+ numNoDelayRetries: healthyRetryPolicy.numNoDelayRetries,
156
+ numMinDelayRetries: healthyRetryPolicy.numMinDelayRetries,
157
+ numMaxDelayRetries: healthyRetryPolicy.numMaxDelayRetries,
158
+ backoffFunction: healthyRetryPolicy.backoffFunction,
159
+ };
160
+ }
161
+ if (throttlePolicy) {
162
+ const maxReceivesPerSecond = throttlePolicy.maxReceivesPerSecond;
163
+ if (maxReceivesPerSecond !== undefined &&
164
+ (maxReceivesPerSecond < 1 || !Number.isInteger(maxReceivesPerSecond))) {
165
+ throw new Error(`maxReceivesPerSecond must be an integer greater than zero, got: ${maxReceivesPerSecond}`);
166
+ }
167
+ renderedPolicy.throttlePolicy = {
168
+ maxReceivesPerSecond: throttlePolicy.maxReceivesPerSecond,
169
+ };
170
+ }
171
+ if (requestPolicy) {
172
+ renderedPolicy.requestPolicy = {
173
+ headerContentType: requestPolicy.headerContentType,
174
+ };
175
+ }
176
+ return JSON.stringify(renderedPolicy);
177
+ }
178
+ buildDeadLetterQueue(props) {
179
+ if (!props.deadLetterQueue) {
180
+ return undefined;
181
+ }
182
+ const deadLetterQueue = props.deadLetterQueue;
183
+ deadLetterQueue.addToResourcePolicy(new iam.PolicyStatement({
184
+ resources: [deadLetterQueue.queueArn],
185
+ actions: ["sqs:SendMessage"],
186
+ principals: [new iam.ServicePrincipal("sns.amazonaws.com")],
187
+ condition: [
188
+ {
189
+ test: "ArnEquals",
190
+ variable: "aws:SourceArn",
191
+ values: [props.topic.topicArn],
192
+ },
193
+ ],
194
+ }));
195
+ return deadLetterQueue;
196
+ }
197
+ buildDeadLetterConfig(deadLetterQueue) {
198
+ if (deadLetterQueue) {
199
+ return JSON.stringify({
200
+ deadLetterTargetArn: deadLetterQueue.queueArn,
201
+ });
202
+ }
203
+ else {
204
+ return undefined;
205
+ }
206
+ }
207
+ }
208
+ exports.Subscription = Subscription;
209
+ _a = JSII_RTTI_SYMBOL_1;
210
+ Subscription[_a] = { fqn: "terraconstructs.aws.notify.Subscription", version: "0.0.18" };
211
+ /**
212
+ * The type of subscription, controlling the type of the endpoint parameter.
213
+ */
214
+ var SubscriptionProtocol;
215
+ (function (SubscriptionProtocol) {
216
+ /**
217
+ * JSON-encoded message is POSTED to an HTTP url.
218
+ */
219
+ SubscriptionProtocol["HTTP"] = "http";
220
+ /**
221
+ * JSON-encoded message is POSTed to an HTTPS url.
222
+ */
223
+ SubscriptionProtocol["HTTPS"] = "https";
224
+ /**
225
+ * Notifications are sent via email.
226
+ */
227
+ SubscriptionProtocol["EMAIL"] = "email";
228
+ /**
229
+ * Notifications are JSON-encoded and sent via mail.
230
+ */
231
+ SubscriptionProtocol["EMAIL_JSON"] = "email-json";
232
+ /**
233
+ * Notification is delivered by SMS
234
+ */
235
+ SubscriptionProtocol["SMS"] = "sms";
236
+ /**
237
+ * Notifications are enqueued into an SQS queue.
238
+ */
239
+ SubscriptionProtocol["SQS"] = "sqs";
240
+ /**
241
+ * JSON-encoded notifications are sent to a mobile app endpoint.
242
+ */
243
+ SubscriptionProtocol["APPLICATION"] = "application";
244
+ /**
245
+ * Notifications trigger a Lambda function.
246
+ */
247
+ SubscriptionProtocol["LAMBDA"] = "lambda";
248
+ /**
249
+ * Notifications put records into a firehose delivery stream.
250
+ */
251
+ SubscriptionProtocol["FIREHOSE"] = "firehose";
252
+ })(SubscriptionProtocol || (exports.SubscriptionProtocol = SubscriptionProtocol = {}));
253
+ function buildFilterPolicyWithMessageBody(scope, inputObject, depth = 1, totalCombinationValues = [1]) {
254
+ const result = {};
255
+ for (const [key, filterOrPolicy] of Object.entries(inputObject)) {
256
+ if (filterOrPolicy.isPolicy()) {
257
+ result[key] = buildFilterPolicyWithMessageBody(scope, filterOrPolicy.policyDoc, depth + 1, totalCombinationValues);
258
+ }
259
+ else if (filterOrPolicy.isFilter()) {
260
+ const filter = filterOrPolicy.filterDoc.conditions;
261
+ result[key] = filter;
262
+ totalCombinationValues[0] *= filter.length * depth;
263
+ }
264
+ }
265
+ // https://docs.aws.amazon.com/sns/latest/dg/subscription-filter-policy-constraints.html
266
+ if (totalCombinationValues[0] > 150) {
267
+ throw new Error(`The total combination of values (${totalCombinationValues}) must not exceed 150.`);
268
+ }
269
+ return result;
270
+ }
271
+ /**
272
+ * The type of the MessageBody at a given key value pair
273
+ */
274
+ var FilterOrPolicyType;
275
+ (function (FilterOrPolicyType) {
276
+ /**
277
+ * The filter of the MessageBody
278
+ */
279
+ FilterOrPolicyType[FilterOrPolicyType["FILTER"] = 0] = "FILTER";
280
+ /**
281
+ * A nested key of the MessageBody
282
+ */
283
+ FilterOrPolicyType[FilterOrPolicyType["POLICY"] = 1] = "POLICY";
284
+ })(FilterOrPolicyType || (exports.FilterOrPolicyType = FilterOrPolicyType = {}));
285
+ /**
286
+ * Class for building the FilterPolicy by avoiding union types
287
+ */
288
+ class FilterOrPolicy {
289
+ /**
290
+ * Filter of MessageBody
291
+ */
292
+ static filter(filter) {
293
+ return new Filter(filter);
294
+ }
295
+ /**
296
+ * Policy of MessageBody
297
+ */
298
+ static policy(policy) {
299
+ return new Policy(policy);
300
+ }
301
+ /**
302
+ * Check if instance is `Policy` type
303
+ */
304
+ isPolicy() {
305
+ return this.type === FilterOrPolicyType.POLICY;
306
+ }
307
+ /**
308
+ * Check if instance is `Filter` type
309
+ */
310
+ isFilter() {
311
+ return this.type === FilterOrPolicyType.FILTER;
312
+ }
313
+ }
314
+ exports.FilterOrPolicy = FilterOrPolicy;
315
+ _b = JSII_RTTI_SYMBOL_1;
316
+ FilterOrPolicy[_b] = { fqn: "terraconstructs.aws.notify.FilterOrPolicy", version: "0.0.18" };
317
+ /**
318
+ * Filter implementation of FilterOrPolicy
319
+ */
320
+ class Filter extends FilterOrPolicy {
321
+ /**
322
+ * Policy constructor
323
+ * @param filterDoc filter argument to construct
324
+ */
325
+ constructor(filterDoc) {
326
+ super();
327
+ this.filterDoc = filterDoc;
328
+ /**
329
+ * Type used in DFS buildFilterPolicyWithMessageBody to determine json value type
330
+ */
331
+ this.type = FilterOrPolicyType.FILTER;
332
+ }
333
+ }
334
+ exports.Filter = Filter;
335
+ _c = JSII_RTTI_SYMBOL_1;
336
+ Filter[_c] = { fqn: "terraconstructs.aws.notify.Filter", version: "0.0.18" };
337
+ /**
338
+ * Policy Implementation of FilterOrPolicy
339
+ */
340
+ class Policy extends FilterOrPolicy {
341
+ /**
342
+ * Policy constructor
343
+ * @param policyDoc policy argument to construct
344
+ */
345
+ constructor(policyDoc) {
346
+ super();
347
+ this.policyDoc = policyDoc;
348
+ /**
349
+ * Type used in DFS buildFilterPolicyWithMessageBody to determine json value type
350
+ */
351
+ this.type = FilterOrPolicyType.POLICY;
352
+ }
353
+ }
354
+ exports.Policy = Policy;
355
+ _d = JSII_RTTI_SYMBOL_1;
356
+ Policy[_d] = { fqn: "terraconstructs.aws.notify.Policy", version: "0.0.18" };
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9ub3RpZnkvc3Vic2NyaXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0lBQWdJO0FBRWhJLHNEQUEyRDtBQUszRCxvREFBdUU7QUFDdkUsOEJBQThCO0FBZ0c5Qjs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxZQUFhLFNBQVEsZ0NBQWdCO0lBU2hELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUNFLEtBQUssQ0FBQyxrQkFBa0I7WUFDeEI7Z0JBQ0Usb0JBQW9CLENBQUMsSUFBSTtnQkFDekIsb0JBQW9CLENBQUMsS0FBSztnQkFDMUIsb0JBQW9CLENBQUMsR0FBRztnQkFDeEIsb0JBQW9CLENBQUMsUUFBUTthQUM5QixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUM3QixDQUFDO1lBQ0QsK0JBQStCO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEZBQTRGLENBQzdGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxnQkFBb0MsQ0FBQztRQUN6QyxzRkFBc0Y7UUFDdEYsSUFBSSxpQkFBa0UsQ0FBQztRQUV2RSxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDNUQsTUFBTSxJQUFJLEtBQUssQ0FDYixtRkFBbUYsQ0FDcEYsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1B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Q2xFLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQU9EOztPQUVHO0lBQ0ksUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7SUFDakQsQ0FBQzs7QUFoQ0gsd0NBaUNDOzs7QUFFRDs7R0FFRztBQUNILE1BQWEsTUFBTyxTQUFRLGNBQWM7SUFLeEM7OztPQUdHO0lBQ0gsWUFBbUMsU0FBNkI7UUFDOUQsS0FBSyxFQUFFLENBQUM7UUFEeUIsY0FBUyxHQUFULFNBQVMsQ0FBb0I7UUFSaEU7O1dBRUc7UUFDYSxTQUFJLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBT2pELENBQUM7O0FBWEgsd0JBWUM7OztBQUVEOztHQUVHO0FBQ0gsTUFBYSxNQUFPLFNBQVEsY0FBYztJQUt4Qzs7O09BR0c7SUFDSCxZQUNrQixTQUFrRDtRQUVsRSxLQUFLLEVBQUUsQ0FBQztRQUZRLGNBQVMsR0FBVCxTQUFTLENBQXlDO1FBVHBFOztXQUVHO1FBQ2EsU0FBSSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztJQVNqRCxDQUFDOztBQWJILHdCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvNmI5ZTQ3YTE1MjkzMTk1NjFiYzEwNDA3MzlmZTAyYmFjMTU4OTViZi9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3Mtc25zL2xpYi9zdWJzY3JpcHRpb24udHNcblxuaW1wb3J0IHsgc25zVG9waWNTdWJzY3JpcHRpb24gfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IERlbGl2ZXJ5UG9saWN5IH0gZnJvbSBcIi4vZGVsaXZlcnktcG9saWN5XCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9zdWJzY3JpcHRpb24tZmlsdGVyXCI7XG5pbXBvcnQgeyBJVG9waWMgfSBmcm9tIFwiLi90b3BpYy1iYXNlXCI7XG5pbXBvcnQgeyBBd3NDb25zdHJ1Y3RCYXNlLCBBd3NDb25zdHJ1Y3RQcm9wcyB9IGZyb20gXCIuLi9hd3MtY29uc3RydWN0XCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0ICogYXMgbm90aWZ5IGZyb20gXCIuLi9ub3RpZnlcIjtcblxuLyoqXG4gKiBPdXRwdXRzIGZvciB0aGUgU3Vic2NyaXB0aW9uIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpcHRpb25PdXRwdXRzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnNjcmlwdGlvbkFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgbmV3IHN1YnNjcmlwdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmlwdGlvbk9wdGlvbnMgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8qKlxuICAgKiBXaGF0IHR5cGUgb2Ygc3Vic2NyaXB0aW9uIHRvIGFkZC5cbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sOiBTdWJzY3JpcHRpb25Qcm90b2NvbDtcblxuICAvKipcbiAgICogVGhlIHN1YnNjcmlwdGlvbiBlbmRwb2ludC5cbiAgICpcbiAgICogVGhlIG1lYW5pbmcgb2YgdGhpcyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBmb3IgJ3Byb3RvY29sJy5cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHRydWUgaWYgcmF3IG1lc3NhZ2UgZGVsaXZlcnkgaXMgZW5hYmxlZCBmb3IgdGhlIHN1YnNjcmlwdGlvbi4gUmF3IG1lc3NhZ2VzIGFyZSBmcmVlIG9mIEpTT04gZm9ybWF0dGluZyBhbmQgY2FuIGJlXG4gICAqIHNlbnQgdG8gSFRUUC9TIGFuZCBBbWF6b24gU1FTIGVuZHBvaW50cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBHZXRTdWJzY3JpcHRpb25BdHRyaWJ1dGVzIGluIHRoZSBBbWF6b24gU2ltcGxlXG4gICAqIE5vdGlmaWNhdGlvbiBTZXJ2aWNlIEFQSSBSZWZlcmVuY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSByYXdNZXNzYWdlRGVsaXZlcnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyIHBvbGljeS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgbWVzc2FnZXMgYXJlIGRlbGl2ZXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUG9saWN5PzogeyBbYXR0cmlidXRlOiBzdHJpbmddOiBTdWJzY3JpcHRpb25GaWx0ZXIgfTtcblxuICAvKipcbiAgICogVGhlIGZpbHRlciBwb2xpY3kgdGhhdCBpcyBhcHBsaWVkIG9uIHRoZSBtZXNzYWdlIGJvZHkuXG4gICAqIFRvIGFwcGx5IGEgZmlsdGVyIHBvbGljeSB0byB0aGUgbWVzc2FnZSBhdHRyaWJ1dGVzLCB1c2UgYGZpbHRlclBvbGljeWAuIEEgbWF4aW11bSBvZiBvbmUgb2YgYGZpbHRlclBvbGljeVdpdGhNZXNzYWdlQm9keWAgYW5kIGBmaWx0ZXJQb2xpY3lgIG1heSBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCBtZXNzYWdlcyBhcmUgZGVsaXZlcmVkXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXJQb2xpY3lXaXRoTWVzc2FnZUJvZHk/OiB7XG4gICAgW2F0dHJpYnV0ZTogc3RyaW5nXTogRmlsdGVyT3JQb2xpY3k7XG4gIH07XG5cbiAgLy8gVE9ETzogQ3Jvc3MtcmVnaW9uIHN1YnNjcmlwdGlvbnMgbWlnaHQgcmVxdWlyZSBwcm92aWRlciBhbGlhc2VzIGluIENES1RGLlxuICAvLyBUaGUgc25zX3RvcGljX3N1YnNjcmlwdGlvbiByZXNvdXJjZSBpdHNlbGYgZG9lc24ndCBoYXZlIGEgcmVnaW9uIHBhcmFtZXRlci5cbiAgLy8gLyoqXG4gIC8vICAqIFRoZSByZWdpb24gd2hlcmUgdGhlIHRvcGljIHJlc2lkZXMsIGluIHRoZSBjYXNlIG9mIGNyb3NzLXJlZ2lvbiBzdWJzY3JpcHRpb25zXG4gIC8vICAqIEBsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1zbnMtc3Vic2NyaXB0aW9uLmh0bWwjY2ZuLXNucy1zdWJzY3JpcHRpb24tcmVnaW9uXG4gIC8vICAqIEBkZWZhdWx0IC0gdGhlIHJlZ2lvbiB3aGVyZSB0aGUgc3RhY2sgaXMgYmVpbmcgZGVwbG95ZWQuXG4gIC8vICAqL1xuICAvLyByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXVlIHRvIGJlIHVzZWQgYXMgZGVhZCBsZXR0ZXIgcXVldWUuXG4gICAqIElmIG5vdCBwYXNzZWQgbm8gZGVhZCBsZXR0ZXIgcXVldWUgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBkZWFkIGxldHRlciBxdWV1ZSBlbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlPzogbm90aWZ5LklRdWV1ZTtcblxuICAvKipcbiAgICogQXJuIG9mIHJvbGUgYWxsb3dpbmcgYWNjZXNzIHRvIGZpcmVob3NlIGRlbGl2ZXJ5IHN0cmVhbS5cbiAgICogUmVxdWlyZWQgZm9yIGEgZmlyZWhvc2Ugc3Vic2NyaXB0aW9uIHByb3RvY29sLlxuICAgKiBAZGVmYXVsdCAtIE5vIHN1YnNjcmlwdGlvbiByb2xlIGlzIHByb3ZpZGVkXG4gICAqL1xuICByZWFkb25seSBzdWJzY3JpcHRpb25Sb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVsaXZlcnkgcG9saWN5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGlmIHRoZSBpbml0aWFsIGRlbGl2ZXJ5IG9mIHRoZSBtZXNzYWdlIGZhaWxzLCB0aHJlZSByZXRyaWVzIHdpdGggYSBkZWxheSBiZXR3ZWVuIGZhaWxlZCBhdHRlbXB0cyBzZXQgYXQgMjAgc2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVsaXZlcnlQb2xpY3k/OiBEZWxpdmVyeVBvbGljeTtcbn1cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBuZXcgc3Vic2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaXB0aW9uUHJvcHMgZXh0ZW5kcyBTdWJzY3JpcHRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0b3BpYyB0byBzdWJzY3JpYmUgdG8uXG4gICAqL1xuICByZWFkb25seSB0b3BpYzogSVRvcGljO1xufVxuXG4vKipcbiAqIEEgbmV3IHN1YnNjcmlwdGlvbi5cbiAqXG4gKiBQcmVmZXIgdG8gdXNlIHRoZSBgSVRvcGljLmFkZFN1YnNjcmlwdGlvbigpYCBtZXRob2RzIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2ZcbiAqIHRoaXMgY2xhc3MuXG4gKlxuICogQHJlc291cmNlIGF3c19zbnNfdG9waWNfc3Vic2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb24gZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBETFEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic2NyaXB0aW9uIGlmIHByZXNlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlPzogbm90aWZ5LklRdWV1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBzbnNUb3BpY1N1YnNjcmlwdGlvbi5TbnNUb3BpY1N1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgcmVhZG9ubHkgc3Vic2NyaXB0aW9uT3V0cHV0czogU3Vic2NyaXB0aW9uT3V0cHV0cztcbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbk91dHB1dHM7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3Vic2NyaXB0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGlmIChcbiAgICAgIHByb3BzLnJhd01lc3NhZ2VEZWxpdmVyeSAmJlxuICAgICAgW1xuICAgICAgICBTdWJzY3JpcHRpb25Qcm90b2NvbC5IVFRQLFxuICAgICAgICBTdWJzY3JpcHRpb25Qcm90b2NvbC5IVFRQUyxcbiAgICAgICAgU3Vic2NyaXB0aW9uUHJvdG9jb2wuU1FTLFxuICAgICAgICBTdWJzY3JpcHRpb25Qcm90b2NvbC5GSVJFSE9TRSxcbiAgICAgIF0uaW5kZXhPZihwcm9wcy5wcm90b2NvbCkgPCAwXG4gICAgKSB7XG4gICAgICAvLyBUT0RPOiByZS1hZGQgVmFsaWRhdGlvbkVycm9yXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiUmF3IG1lc3NhZ2UgZGVsaXZlcnkgY2FuIG9ubHkgYmUgZW5hYmxlZCBmb3IgSFRUUCwgSFRUUFMsIFNRUywgYW5kIEZpcmVob3NlIHN1YnNjcmlwdGlvbnMuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBmaWx0ZXJQb2xpY3lKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqIFdoZXRoZXIgdGhlIGZpbHRlcl9wb2xpY3kgYXBwbGllcyB0byBNZXNzYWdlQXR0cmlidXRlcyAoZGVmYXVsdCkgb3IgTWVzc2FnZUJvZHkgKi9cbiAgICBsZXQgZmlsdGVyUG9saWN5U2NvcGU6IFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiB8IFwiTWVzc2FnZUJvZHlcIiB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChwcm9wcy5maWx0ZXJQb2xpY3kgJiYgcHJvcHMuZmlsdGVyUG9saWN5V2l0aE1lc3NhZ2VCb2R5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQSBtYXhpbXVtIG9mIG9uZSBvZiBgZmlsdGVyUG9saWN5V2l0aE1lc3NhZ2VCb2R5YCBhbmQgYGZpbHRlclBvbGljeWAgbWF5IGJlIHVzZWQuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5maWx0ZXJQb2xpY3kpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwcm9wcy5maWx0ZXJQb2xpY3kpLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQSBmaWx0ZXIgcG9saWN5IGNhbiBoYXZlIGEgbWF4aW11bSBvZiA1IGF0dHJpYnV0ZSBuYW1lcy5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyUG9saWN5Q29uZGl0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHByb3BzLmZpbHRlclBvbGljeSkucmVkdWNlKFxuICAgICAgICAoYWNjLCBbaywgdl0pID0+ICh7IC4uLmFjYywgW2tdOiB2LmNvbmRpdGlvbnMgfSksXG4gICAgICAgIHt9LFxuICAgICAgKTtcblxuICAgICAgbGV0IHRvdGFsID0gMTtcbiAgICAgIE9iamVjdC52YWx1ZXMoZmlsdGVyUG9saWN5Q29uZGl0aW9ucykuZm9yRWFjaCgoZmlsdGVyOiBhbnkpID0+IHtcbiAgICAgICAgdG90YWwgKj0gZmlsdGVyLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRvdGFsID4gMTUwKSB7XG4gICAgICAgIC8vIFRPRE86IHJlLWFkZCBWYWxpZGF0aW9uRXJyb3JcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgdG90YWwgY29tYmluYXRpb24gb2YgdmFsdWVzICgke3RvdGFsfSkgbXVzdCBub3QgZXhjZWVkIDE1MC5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZmlsdGVyUG9saWN5SnNvbiA9IEpTT04uc3RyaW5naWZ5KGZpbHRlclBvbGljeUNvbmRpdGlvbnMpO1xuICAgICAgZmlsdGVyUG9saWN5U2NvcGUgPSBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCI7IC8vIERlZmF1bHQgc2NvcGVcbiAgICB9IGVsc2UgaWYgKHByb3BzLmZpbHRlclBvbGljeVdpdGhNZXNzYWdlQm9keSkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHByb3BzLmZpbHRlclBvbGljeVdpdGhNZXNzYWdlQm9keSkubGVuZ3RoID4gNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJBIGZpbHRlciBwb2xpY3kgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDUgYXR0cmlidXRlIG5hbWVzLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgYnVpbHRQb2xpY3kgPSBidWlsZEZpbHRlclBvbGljeVdpdGhNZXNzYWdlQm9keShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcHJvcHMuZmlsdGVyUG9saWN5V2l0aE1lc3NhZ2VCb2R5LFxuICAgICAgKTtcbiAgICAgIGZpbHRlclBvbGljeUpzb24gPSBKU09OLnN0cmluZ2lmeShidWlsdFBvbGljeSk7XG4gICAgICBmaWx0ZXJQb2xpY3lTY29wZSA9IFwiTWVzc2FnZUJvZHlcIjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5wcm90b2NvbCA9PT0gU3Vic2NyaXB0aW9uUHJvdG9jb2wuRklSRUhPU0UgJiZcbiAgICAgICFwcm9wcy5zdWJzY3JpcHRpb25Sb2xlQXJuXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiU3Vic2NyaXB0aW9uIHJvbGUgYXJuIGlzIHJlcXVpcmVkIGZpZWxkIGZvciBzdWJzY3JpcHRpb25zIHdpdGggYSBmaXJlaG9zZSBwcm90b2NvbC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWFkTGV0dGVyUXVldWUgPSB0aGlzLmJ1aWxkRGVhZExldHRlclF1ZXVlKHByb3BzKTtcbiAgICBjb25zdCByZWRyaXZlUG9saWN5SnNvbiA9IHRoaXMuYnVpbGREZWFkTGV0dGVyQ29uZmlnKHRoaXMuZGVhZExldHRlclF1ZXVlKTtcbiAgICBjb25zdCBkZWxpdmVyeVBvbGljeUpzb24gPSBwcm9wcy5kZWxpdmVyeVBvbGljeVxuICAgICAgPyB0aGlzLnJlbmRlckRlbGl2ZXJ5UG9saWN5KHByb3BzLmRlbGl2ZXJ5UG9saWN5LCBwcm9wcy5wcm90b2NvbClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBzbnNUb3BpY1N1YnNjcmlwdGlvbi5TbnNUb3BpY1N1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBcIlJlc291cmNlXCIsXG4gICAgICB7XG4gICAgICAgIGVuZHBvaW50OiBwcm9wcy5lbmRwb2ludCxcbiAgICAgICAgcHJvdG9jb2w6IHByb3BzLnByb3RvY29sLFxuICAgICAgICB0b3BpY0FybjogcHJvcHMudG9waWMudG9waWNBcm4sXG4gICAgICAgIHJhd01lc3NhZ2VEZWxpdmVyeTogcHJvcHMucmF3TWVzc2FnZURlbGl2ZXJ5LFxuICAgICAgICBmaWx0ZXJQb2xpY3k6IGZpbHRlclBvbGljeUpzb24sXG4gICAgICAgIGZpbHRlclBvbGljeVNjb3BlOiBmaWx0ZXJQb2xpY3lTY29wZSxcbiAgICAgICAgcmVkcml2ZVBvbGljeTogcmVkcml2ZVBvbGljeUpzb24sXG4gICAgICAgIHN1YnNjcmlwdGlvblJvbGVBcm46IHByb3BzLnN1YnNjcmlwdGlvblJvbGVBcm4sXG4gICAgICAgIGRlbGl2ZXJ5UG9saWN5OiBkZWxpdmVyeVBvbGljeUpzb24sXG4gICAgICAgIC8vIGNvbmZpcm1hdGlvblRpbWVvdXRJbk1pbnV0ZXM6IC8vIE5vdCBkaXJlY3RseSBhdmFpbGFibGUgaW4gQ0RLIHByb3BzXG4gICAgICAgIC8vIGVuZHBvaW50QXV0b0NvbmZpcm1zOiAvLyBOb3QgZGlyZWN0bHkgYXZhaWxhYmxlIGluIENESyBwcm9wc1xuICAgICAgICAvLyByZXBsYXlQb2xpY3k6IC8vIE5vdCBkaXJlY3RseSBhdmFpbGFibGUgaW4gQ0RLIHByb3BzIChtaXNzaW5nIGluIEFXUyBDREspXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbk91dHB1dHMgPSB7XG4gICAgICBzdWJzY3JpcHRpb25Bcm46IHRoaXMucmVzb3VyY2UuYXJuLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckRlbGl2ZXJ5UG9saWN5KFxuICAgIGRlbGl2ZXJ5UG9saWN5OiBEZWxpdmVyeVBvbGljeSxcbiAgICBwcm90b2NvbDogU3Vic2NyaXB0aW9uUHJvdG9jb2wsXG4gICk6IHN0cmluZyB7XG4gICAgLy8gVE9ETzogcmUtYWRkIFZhbGlkYXRpb25FcnJvcihzKVxuICAgIGlmIChcbiAgICAgICFbU3Vic2NyaXB0aW9uUHJvdG9jb2wuSFRUUCwgU3Vic2NyaXB0aW9uUHJvdG9jb2wuSFRUUFNdLmluY2x1ZGVzKFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERlbGl2ZXJ5IHBvbGljeSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSFRUUCBhbmQgSFRUUFMgc3Vic2NyaXB0aW9ucywgZ290OiAke3Byb3RvY29sfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB7IGhlYWx0aHlSZXRyeVBvbGljeSwgdGhyb3R0bGVQb2xpY3ksIHJlcXVlc3RQb2xpY3kgfSA9XG4gICAgICBkZWxpdmVyeVBvbGljeTtcbiAgICBjb25zdCByZW5kZXJlZFBvbGljeTogYW55ID0ge307XG5cbiAgICBpZiAoaGVhbHRoeVJldHJ5UG9saWN5KSB7XG4gICAgICBjb25zdCBkZWxheVRhcmdldExpbWl0U2VjcyA9IDM2MDA7XG4gICAgICBjb25zdCBtaW5EZWxheVRhcmdldCA9IGhlYWx0aHlSZXRyeVBvbGljeS5taW5EZWxheVRhcmdldDtcbiAgICAgIGNvbnN0IG1heERlbGF5VGFyZ2V0ID0gaGVhbHRoeVJldHJ5UG9saWN5Lm1heERlbGF5VGFyZ2V0O1xuICAgICAgaWYgKG1pbkRlbGF5VGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG1pbkRlbGF5VGFyZ2V0LnRvTWlsbGlzZWNvbmRzKCkgJSAxMDAwICE9PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYG1pbkRlbGF5VGFyZ2V0IG11c3QgYmUgYSB3aG9sZSBudW1iZXIgb2Ygc2Vjb25kcywgZ290OiAke21pbkRlbGF5VGFyZ2V0fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW5EZWxheVRhcmdldFNlY3MgPSBtaW5EZWxheVRhcmdldC50b1NlY29uZHMoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1pbkRlbGF5VGFyZ2V0U2VjcyA8IDEgfHxcbiAgICAgICAgICBtaW5EZWxheVRhcmdldFNlY3MgPiBkZWxheVRhcmdldExpbWl0U2Vjc1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgbWluRGVsYXlUYXJnZXQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICR7ZGVsYXlUYXJnZXRMaW1pdFNlY3N9IHNlY29uZHMgaW5jbHVzaXZlLCBnb3Q6ICR7bWluRGVsYXlUYXJnZXRTZWNzfXNgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhEZWxheVRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChtYXhEZWxheVRhcmdldC50b01pbGxpc2Vjb25kcygpICUgMTAwMCAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBtYXhEZWxheVRhcmdldCBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyIG9mIHNlY29uZHMsIGdvdDogJHttYXhEZWxheVRhcmdldH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF4RGVsYXlUYXJnZXRTZWNzID0gbWF4RGVsYXlUYXJnZXQudG9TZWNvbmRzKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtYXhEZWxheVRhcmdldFNlY3MgPCAxIHx8XG4gICAgICAgICAgbWF4RGVsYXlUYXJnZXRTZWNzID4gZGVsYXlUYXJnZXRMaW1pdFNlY3NcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYG1heERlbGF5VGFyZ2V0IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAke2RlbGF5VGFyZ2V0TGltaXRTZWNzfSBzZWNvbmRzIGluY2x1c2l2ZSwgZ290OiAke21heERlbGF5VGFyZ2V0U2Vjc31zYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtaW5EZWxheVRhcmdldCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgbWluRGVsYXlUYXJnZXQudG9TZWNvbmRzKCkgPiBtYXhEZWxheVRhcmdldFNlY3NcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWluRGVsYXlUYXJnZXQgbXVzdCBub3QgZXhjZWVkIG1heERlbGF5VGFyZ2V0XCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG51bVJldHJpZXNMaW1pdCA9IDEwMDtcbiAgICAgIGlmIChcbiAgICAgICAgaGVhbHRoeVJldHJ5UG9saWN5Lm51bVJldHJpZXMgJiZcbiAgICAgICAgKGhlYWx0aHlSZXRyeVBvbGljeS5udW1SZXRyaWVzIDwgMCB8fFxuICAgICAgICAgIGhlYWx0aHlSZXRyeVBvbGljeS5udW1SZXRyaWVzID4gbnVtUmV0cmllc0xpbWl0KVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgbnVtUmV0cmllcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHtudW1SZXRyaWVzTGltaXR9IGluY2x1c2l2ZSwgZ290OiAke2hlYWx0aHlSZXRyeVBvbGljeS5udW1SZXRyaWVzfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IG51bU5vRGVsYXlSZXRyaWVzLCBudW1NaW5EZWxheVJldHJpZXMsIG51bU1heERlbGF5UmV0cmllcyB9ID1cbiAgICAgICAgaGVhbHRoeVJldHJ5UG9saWN5O1xuICAgICAgaWYgKFxuICAgICAgICBudW1Ob0RlbGF5UmV0cmllcyAmJlxuICAgICAgICAobnVtTm9EZWxheVJldHJpZXMgPCAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG51bU5vRGVsYXlSZXRyaWVzKSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYG51bU5vRGVsYXlSZXRyaWVzIG11c3QgYmUgYW4gaW50ZWdlciB6ZXJvIG9yIGdyZWF0ZXIsIGdvdDogJHtudW1Ob0RlbGF5UmV0cmllc31gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBudW1NaW5EZWxheVJldHJpZXMgJiZcbiAgICAgICAgKG51bU1pbkRlbGF5UmV0cmllcyA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIobnVtTWluRGVsYXlSZXRyaWVzKSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYG51bU1pbkRlbGF5UmV0cmllcyBtdXN0IGJlIGFuIGludGVnZXIgemVybyBvciBncmVhdGVyLCBnb3Q6ICR7bnVtTWluRGVsYXlSZXRyaWVzfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIG51bU1heERlbGF5UmV0cmllcyAmJlxuICAgICAgICAobnVtTWF4RGVsYXlSZXRyaWVzIDwgMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihudW1NYXhEZWxheVJldHJpZXMpKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgbnVtTWF4RGVsYXlSZXRyaWVzIG11c3QgYmUgYW4gaW50ZWdlciB6ZXJvIG9yIGdyZWF0ZXIsIGdvdDogJHtudW1NYXhEZWxheVJldHJpZXN9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyZWRQb2xpY3kuaGVhbHRoeVJldHJ5UG9saWN5ID0ge1xuICAgICAgICBtaW5EZWxheVRhcmdldDpcbiAgICAgICAgICBoZWFsdGh5UmV0cnlQb2xpY3kubWluRGVsYXlUYXJnZXQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyAyMFxuICAgICAgICAgICAgOiBoZWFsdGh5UmV0cnlQb2xpY3kubWluRGVsYXlUYXJnZXQudG9TZWNvbmRzKCksXG4gICAgICAgIG1heERlbGF5VGFyZ2V0OlxuICAgICAgICAgIGhlYWx0aHlSZXRyeVBvbGljeS5tYXhEZWxheVRhcmdldCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDIwXG4gICAgICAgICAgICA6IGhlYWx0aHlSZXRyeVBvbGljeS5tYXhEZWxheVRhcmdldC50b1NlY29uZHMoKSxcbiAgICAgICAgbnVtUmV0cmllczpcbiAgICAgICAgICBoZWFsdGh5UmV0cnlQb2xpY3kubnVtUmV0cmllcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDNcbiAgICAgICAgICAgIDogaGVhbHRoeVJldHJ5UG9saWN5Lm51bVJldHJpZXMsXG4gICAgICAgIG51bU5vRGVsYXlSZXRyaWVzOiBoZWFsdGh5UmV0cnlQb2xpY3kubnVtTm9EZWxheVJldHJpZXMsXG4gICAgICAgIG51bU1pbkRlbGF5UmV0cmllczogaGVhbHRoeVJldHJ5UG9saWN5Lm51bU1pbkRlbGF5UmV0cmllcyxcbiAgICAgICAgbnVtTWF4RGVsYXlSZXRyaWVzOiBoZWFsdGh5UmV0cnlQb2xpY3kubnVtTWF4RGVsYXlSZXRyaWVzLFxuICAgICAgICBiYWNrb2ZmRnVuY3Rpb246IGhlYWx0aHlSZXRyeVBvbGljeS5iYWNrb2ZmRnVuY3Rpb24sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aHJvdHRsZVBvbGljeSkge1xuICAgICAgY29uc3QgbWF4UmVjZWl2ZXNQZXJTZWNvbmQgPSB0aHJvdHRsZVBvbGljeS5tYXhSZWNlaXZlc1BlclNlY29uZDtcbiAgICAgIGlmIChcbiAgICAgICAgbWF4UmVjZWl2ZXNQZXJTZWNvbmQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAobWF4UmVjZWl2ZXNQZXJTZWNvbmQgPCAxIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlY2VpdmVzUGVyU2Vjb25kKSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYG1heFJlY2VpdmVzUGVyU2Vjb25kIG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gemVybywgZ290OiAke21heFJlY2VpdmVzUGVyU2Vjb25kfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZW5kZXJlZFBvbGljeS50aHJvdHRsZVBvbGljeSA9IHtcbiAgICAgICAgbWF4UmVjZWl2ZXNQZXJTZWNvbmQ6IHRocm90dGxlUG9saWN5Lm1heFJlY2VpdmVzUGVyU2Vjb25kLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdFBvbGljeSkge1xuICAgICAgcmVuZGVyZWRQb2xpY3kucmVxdWVzdFBvbGljeSA9IHtcbiAgICAgICAgaGVhZGVyQ29udGVudFR5cGU6IHJlcXVlc3RQb2xpY3kuaGVhZGVyQ29udGVudFR5cGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZW5kZXJlZFBvbGljeSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVhZExldHRlclF1ZXVlKFxuICAgIHByb3BzOiBTdWJzY3JpcHRpb25Qcm9wcyxcbiAgKTogbm90aWZ5LklRdWV1ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwcm9wcy5kZWFkTGV0dGVyUXVldWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZGVhZExldHRlclF1ZXVlID0gcHJvcHMuZGVhZExldHRlclF1ZXVlO1xuXG4gICAgZGVhZExldHRlclF1ZXVlLmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHJlc291cmNlczogW2RlYWRMZXR0ZXJRdWV1ZS5xdWV1ZUFybl0sXG4gICAgICAgIGFjdGlvbnM6IFtcInNxczpTZW5kTWVzc2FnZVwiXSxcbiAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uU2VydmljZVByaW5jaXBhbChcInNucy5hbWF6b25hd3MuY29tXCIpXSxcbiAgICAgICAgY29uZGl0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGVzdDogXCJBcm5FcXVhbHNcIixcbiAgICAgICAgICAgIHZhcmlhYmxlOiBcImF3czpTb3VyY2VBcm5cIixcbiAgICAgICAgICAgIHZhbHVlczogW3Byb3BzLnRvcGljLnRvcGljQXJuXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBkZWFkTGV0dGVyUXVldWU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVhZExldHRlckNvbmZpZyhcbiAgICBkZWFkTGV0dGVyUXVldWU/OiBub3RpZnkuSVF1ZXVlLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChkZWFkTGV0dGVyUXVldWUpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGRlYWRMZXR0ZXJUYXJnZXRBcm46IGRlYWRMZXR0ZXJRdWV1ZS5xdWV1ZUFybixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHN1YnNjcmlwdGlvbiwgY29udHJvbGxpbmcgdGhlIHR5cGUgb2YgdGhlIGVuZHBvaW50IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGVudW0gU3Vic2NyaXB0aW9uUHJvdG9jb2wge1xuICAvKipcbiAgICogSlNPTi1lbmNvZGVkIG1lc3NhZ2UgaXMgUE9TVEVEIHRvIGFuIEhUVFAgdXJsLlxuICAgKi9cbiAgSFRUUCA9IFwiaHR0cFwiLFxuXG4gIC8qKlxuICAgKiBKU09OLWVuY29kZWQgbWVzc2FnZSBpcyBQT1NUZWQgdG8gYW4gSFRUUFMgdXJsLlxuICAgKi9cbiAgSFRUUFMgPSBcImh0dHBzXCIsXG5cbiAgLyoqXG4gICAqIE5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdmlhIGVtYWlsLlxuICAgKi9cbiAgRU1BSUwgPSBcImVtYWlsXCIsXG5cbiAgLyoqXG4gICAqIE5vdGlmaWNhdGlvbnMgYXJlIEpTT04tZW5jb2RlZCBhbmQgc2VudCB2aWEgbWFpbC5cbiAgICovXG4gIEVNQUlMX0pTT04gPSBcImVtYWlsLWpzb25cIixcblxuICAvKipcbiAgICogTm90aWZpY2F0aW9uIGlzIGRlbGl2ZXJlZCBieSBTTVNcbiAgICovXG4gIFNNUyA9IFwic21zXCIsXG5cbiAgLyoqXG4gICAqIE5vdGlmaWNhdGlvbnMgYXJlIGVucXVldWVkIGludG8gYW4gU1FTIHF1ZXVlLlxuICAgKi9cbiAgU1FTID0gXCJzcXNcIixcblxuICAvKipcbiAgICogSlNPTi1lbmNvZGVkIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYSBtb2JpbGUgYXBwIGVuZHBvaW50LlxuICAgKi9cbiAgQVBQTElDQVRJT04gPSBcImFwcGxpY2F0aW9uXCIsXG5cbiAgLyoqXG4gICAqIE5vdGlmaWNhdGlvbnMgdHJpZ2dlciBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIExBTUJEQSA9IFwibGFtYmRhXCIsXG5cbiAgLyoqXG4gICAqIE5vdGlmaWNhdGlvbnMgcHV0IHJlY29yZHMgaW50byBhIGZpcmVob3NlIGRlbGl2ZXJ5IHN0cmVhbS5cbiAgICovXG4gIEZJUkVIT1NFID0gXCJmaXJlaG9zZVwiLFxufVxuXG5mdW5jdGlvbiBidWlsZEZpbHRlclBvbGljeVdpdGhNZXNzYWdlQm9keShcbiAgc2NvcGU6IENvbnN0cnVjdCxcbiAgaW5wdXRPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogRmlsdGVyT3JQb2xpY3kgfSxcbiAgZGVwdGggPSAxLFxuICB0b3RhbENvbWJpbmF0aW9uVmFsdWVzID0gWzFdLFxuKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgZmlsdGVyT3JQb2xpY3ldIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0T2JqZWN0KSkge1xuICAgIGlmIChmaWx0ZXJPclBvbGljeS5pc1BvbGljeSgpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGJ1aWxkRmlsdGVyUG9saWN5V2l0aE1lc3NhZ2VCb2R5KFxuICAgICAgICBzY29wZSxcbiAgICAgICAgZmlsdGVyT3JQb2xpY3kucG9saWN5RG9jLFxuICAgICAgICBkZXB0aCArIDEsXG4gICAgICAgIHRvdGFsQ29tYmluYXRpb25WYWx1ZXMsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyT3JQb2xpY3kuaXNGaWx0ZXIoKSkge1xuICAgICAgY29uc3QgZmlsdGVyID0gZmlsdGVyT3JQb2xpY3kuZmlsdGVyRG9jLmNvbmRpdGlvbnM7XG4gICAgICByZXN1bHRba2V5XSA9IGZpbHRlcjtcbiAgICAgIHRvdGFsQ29tYmluYXRpb25WYWx1ZXNbMF0gKj0gZmlsdGVyLmxlbmd0aCAqIGRlcHRoO1xuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zbnMvbGF0ZXN0L2RnL3N1YnNjcmlwdGlvbi1maWx0ZXItcG9saWN5LWNvbnN0cmFpbnRzLmh0bWxcbiAgaWYgKHRvdGFsQ29tYmluYXRpb25WYWx1ZXNbMF0gPiAxNTApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHRvdGFsIGNvbWJpbmF0aW9uIG9mIHZhbHVlcyAoJHt0b3RhbENvbWJpbmF0aW9uVmFsdWVzfSkgbXVzdCBub3QgZXhjZWVkIDE1MC5gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBNZXNzYWdlQm9keSBhdCBhIGdpdmVuIGtleSB2YWx1ZSBwYWlyXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck9yUG9saWN5VHlwZSB7XG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyIG9mIHRoZSBNZXNzYWdlQm9keVxuICAgKi9cbiAgRklMVEVSLFxuICAvKipcbiAgICogQSBuZXN0ZWQga2V5IG9mIHRoZSBNZXNzYWdlQm9keVxuICAgKi9cbiAgUE9MSUNZLFxufVxuXG4vKipcbiAqIENsYXNzIGZvciBidWlsZGluZyB0aGUgRmlsdGVyUG9saWN5IGJ5IGF2b2lkaW5nIHVuaW9uIHR5cGVzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaWx0ZXJPclBvbGljeSB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgb2YgTWVzc2FnZUJvZHlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyKGZpbHRlcjogU3Vic2NyaXB0aW9uRmlsdGVyKSB7XG4gICAgcmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xpY3kgb2YgTWVzc2FnZUJvZHlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcG9saWN5KHBvbGljeTogeyBbYXR0cmlidXRlOiBzdHJpbmddOiBGaWx0ZXJPclBvbGljeSB9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUeXBlIHN3aXRjaCBmb3IgZGlzYW1iaWd1YXRpbmcgYmV0d2VlbiBzdWJjbGFzc2VzXG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSB0eXBlOiBGaWx0ZXJPclBvbGljeVR5cGU7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGluc3RhbmNlIGlzIGBQb2xpY3lgIHR5cGVcbiAgICovXG4gIHB1YmxpYyBpc1BvbGljeSgpOiB0aGlzIGlzIFBvbGljeSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRmlsdGVyT3JQb2xpY3lUeXBlLlBPTElDWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBpbnN0YW5jZSBpcyBgRmlsdGVyYCB0eXBlXG4gICAqL1xuICBwdWJsaWMgaXNGaWx0ZXIoKTogdGhpcyBpcyBGaWx0ZXIge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IEZpbHRlck9yUG9saWN5VHlwZS5GSUxURVI7XG4gIH1cbn1cblxuLyoqXG4gKiBGaWx0ZXIgaW1wbGVtZW50YXRpb24gb2YgRmlsdGVyT3JQb2xpY3lcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbHRlciBleHRlbmRzIEZpbHRlck9yUG9saWN5IHtcbiAgLyoqXG4gICAqIFR5cGUgdXNlZCBpbiBERlMgYnVpbGRGaWx0ZXJQb2xpY3lXaXRoTWVzc2FnZUJvZHkgdG8gZGV0ZXJtaW5lIGpzb24gdmFsdWUgdHlwZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBGaWx0ZXJPclBvbGljeVR5cGUuRklMVEVSO1xuICAvKipcbiAgICogUG9saWN5IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBmaWx0ZXJEb2MgZmlsdGVyIGFyZ3VtZW50IHRvIGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBmaWx0ZXJEb2M6IFN1YnNjcmlwdGlvbkZpbHRlcikge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQb2xpY3kgSW1wbGVtZW50YXRpb24gb2YgRmlsdGVyT3JQb2xpY3lcbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGljeSBleHRlbmRzIEZpbHRlck9yUG9saWN5IHtcbiAgLyoqXG4gICAqIFR5cGUgdXNlZCBpbiBERlMgYnVpbGRGaWx0ZXJQb2xpY3lXaXRoTWVzc2FnZUJvZHkgdG8gZGV0ZXJtaW5lIGpzb24gdmFsdWUgdHlwZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBGaWx0ZXJPclBvbGljeVR5cGUuUE9MSUNZO1xuICAvKipcbiAgICogUG9saWN5IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBwb2xpY3lEb2MgcG9saWN5IGFyZ3VtZW50IHRvIGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwb2xpY3lEb2M6IHsgW2F0dHJpYnV0ZTogc3RyaW5nXTogRmlsdGVyT3JQb2xpY3kgfSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuIl19
@@ -36,5 +36,5 @@ class EventBus {
36
36
  }
37
37
  exports.EventBus = EventBus;
38
38
  _a = JSII_RTTI_SYMBOL_1;
39
- EventBus[_a] = { fqn: "terraconstructs.aws.notify.targets.EventBus", version: "0.0.17" };
39
+ EventBus[_a] = { fqn: "terraconstructs.aws.notify.targets.EventBus", version: "0.0.18" };
40
40
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9ub3RpZnkvdGFyZ2V0cy9ldmVudC1idXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSxpQ0FBZ0Y7QUFDaEYsaUNBQWlDO0FBNEJqQzs7R0FFRztBQUNILE1BQWEsUUFBUTtJQUNuQixZQUNtQixRQUFtQixFQUNuQixRQUF1QixFQUFFO1FBRHpCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsVUFBSyxHQUFMLEtBQUssQ0FBb0I7SUFDekMsQ0FBQztJQUVKLElBQUksQ0FBQyxJQUFXLEVBQUUsR0FBWTtRQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFBLHlCQUFrQixFQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBRXBELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMvQixJQUFBLHlDQUFrQyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVztZQUM5QixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWU7Z0JBQzFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUU7Z0JBQy9DLENBQUMsQ0FBQyxTQUFTO1lBQ2IsSUFBSTtTQUNMLENBQUM7SUFDSixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixDQUFDO1lBQzdCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBNUJILDRCQTZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudC1idXNcIjtcbmltcG9ydCB7IElRdWV1ZSB9IGZyb20gXCIuLi9xdWV1ZVwiO1xuaW1wb3J0IHsgSVJ1bGUgfSBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgSVJ1bGVUYXJnZXQsIFJ1bGVUYXJnZXRDb25maWcgfSBmcm9tIFwiLi4vdGFyZ2V0XCI7XG5pbXBvcnQgeyBzaW5nbGV0b25FdmVudFJvbGUsIGFkZFRvRGVhZExldHRlclF1ZXVlUmVzb3VyY2VQb2xpY3kgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcIi4uLy4uL2lhbVwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiBhbiBFdmVudCBCdXMgZXZlbnRcbiAqXG4gKiBDYW5ub3QgZXh0ZW5kIFRhcmdldEJhc2VQcm9wcy4gUmV0cnkgcG9saWN5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEV2ZW50IGJ1cyB0YXJnZXRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50QnVzUHJvcHMge1xuICAvKipcbiAgICogUm9sZSB0byBiZSB1c2VkIHRvIHB1Ymxpc2ggdGhlIGV2ZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IGEgbmV3IHJvbGUgaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBTUVMgcXVldWUgdG8gYmUgdXNlZCBhcyBkZWFkTGV0dGVyUXVldWUuXG4gICAqIENoZWNrIG91dCB0aGUgW2NvbnNpZGVyYXRpb25zIGZvciB1c2luZyBhIGRlYWQtbGV0dGVyIHF1ZXVlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZXZlbnRicmlkZ2UvbGF0ZXN0L3VzZXJndWlkZS9ydWxlLWRscS5odG1sI2RscS1jb25zaWRlcmF0aW9ucykuXG4gICAqXG4gICAqIFRoZSBldmVudHMgbm90IHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQgYXJlIGF1dG9tYXRpY2FsbHkgcmV0cmllZCBmb3IgYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUsXG4gICAqIGRlcGVuZGluZyBvbiB0aGUgcmV0cnkgcG9saWN5IG9mIHRoZSB0YXJnZXQuXG4gICAqIElmIGFuIGV2ZW50IGlzIG5vdCBkZWxpdmVyZWQgYmVmb3JlIGFsbCByZXRyeSBhdHRlbXB0cyBhcmUgZXhoYXVzdGVkLCBpdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGRlYWQgbGV0dGVyIHF1ZXVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlYWQtbGV0dGVyIHF1ZXVlXG4gICAqL1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWU/OiBJUXVldWU7XG59XG5cbi8qKlxuICogTm90aWZ5IGFuIGV4aXN0aW5nIEV2ZW50IEJ1cyBvZiBhbiBldmVudFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRCdXMgaW1wbGVtZW50cyBJUnVsZVRhcmdldCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IElFdmVudEJ1cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBFdmVudEJ1c1Byb3BzID0ge30sXG4gICkge31cblxuICBiaW5kKHJ1bGU6IElSdWxlLCBfaWQ/OiBzdHJpbmcpOiBSdWxlVGFyZ2V0Q29uZmlnIHtcbiAgICBjb25zdCByb2xlID0gdGhpcy5wcm9wcy5yb2xlID8/IHNpbmdsZXRvbkV2ZW50Um9sZShydWxlKTtcbiAgICByb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHRoaXMucHV0RXZlbnRTdGF0ZW1lbnQoKSk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5kZWFkTGV0dGVyUXVldWUpIHtcbiAgICAgIGFkZFRvRGVhZExldHRlclF1ZXVlUmVzb3VyY2VQb2xpY3kocnVsZSwgdGhpcy5wcm9wcy5kZWFkTGV0dGVyUXVldWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhcm46IHRoaXMuZXZlbnRCdXMuZXZlbnRCdXNBcm4sXG4gICAgICBkZWFkTGV0dGVyQ29uZmlnOiB0aGlzLnByb3BzLmRlYWRMZXR0ZXJRdWV1ZVxuICAgICAgICA/IHsgYXJuOiB0aGlzLnByb3BzLmRlYWRMZXR0ZXJRdWV1ZT8ucXVldWVBcm4gfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJvbGUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHV0RXZlbnRTdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcImV2ZW50czpQdXRFdmVudHNcIl0sXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLmV2ZW50QnVzLmV2ZW50QnVzQXJuXSxcbiAgICB9KTtcbiAgfVxufVxuIl19