terraconstructs 0.0.9 → 0.0.10

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 (136) hide show
  1. package/.jsii +1391 -145
  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/cloudwatch/actions/ec2.js +1 -1
  6. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  7. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  8. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  9. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  10. package/lib/aws/cloudwatch/alarm.js +1 -1
  11. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  12. package/lib/aws/cloudwatch/dashboard.js +1 -1
  13. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  14. package/lib/aws/cloudwatch/graph.js +8 -8
  15. package/lib/aws/cloudwatch/layout.js +3 -3
  16. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  17. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  18. package/lib/aws/cloudwatch/log-group.js +1 -1
  19. package/lib/aws/cloudwatch/log-query.js +1 -1
  20. package/lib/aws/cloudwatch/log-stream.js +1 -1
  21. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  22. package/lib/aws/cloudwatch/metric.js +2 -2
  23. package/lib/aws/cloudwatch/pattern.js +3 -3
  24. package/lib/aws/cloudwatch/policy.js +1 -1
  25. package/lib/aws/cloudwatch/query-definition.js +2 -2
  26. package/lib/aws/cloudwatch/stats.js +1 -1
  27. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  28. package/lib/aws/cloudwatch/text.js +1 -1
  29. package/lib/aws/cloudwatch/variable.js +3 -3
  30. package/lib/aws/cloudwatch/widget.js +1 -1
  31. package/lib/aws/compute/activity.js +1 -1
  32. package/lib/aws/compute/architecture.js +1 -1
  33. package/lib/aws/compute/chain.js +1 -1
  34. package/lib/aws/compute/condition.js +1 -1
  35. package/lib/aws/compute/event-invoke-config.js +1 -1
  36. package/lib/aws/compute/event-source-filter.js +2 -2
  37. package/lib/aws/compute/event-source-mapping.js +1 -1
  38. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  39. package/lib/aws/compute/event-sources/s3.js +1 -1
  40. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  41. package/lib/aws/compute/event-sources/sqs.js +1 -1
  42. package/lib/aws/compute/fields.js +4 -4
  43. package/lib/aws/compute/function-alias.js +1 -1
  44. package/lib/aws/compute/function-base.js +2 -2
  45. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  46. package/lib/aws/compute/function-destinations/function.js +1 -1
  47. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  48. package/lib/aws/compute/function-nodejs.js +1 -1
  49. package/lib/aws/compute/function-url.js +1 -1
  50. package/lib/aws/compute/function.js +1 -1
  51. package/lib/aws/compute/state-graph.js +1 -1
  52. package/lib/aws/compute/state-machine-fragment.js +1 -1
  53. package/lib/aws/compute/state-machine.js +4 -4
  54. package/lib/aws/compute/states/choice.js +1 -1
  55. package/lib/aws/compute/states/custom-state.js +1 -1
  56. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  57. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  58. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  59. package/lib/aws/compute/states/distributed-map.js +1 -1
  60. package/lib/aws/compute/states/fail.js +1 -1
  61. package/lib/aws/compute/states/map-base.js +1 -1
  62. package/lib/aws/compute/states/map.js +1 -1
  63. package/lib/aws/compute/states/parallel.js +1 -1
  64. package/lib/aws/compute/states/pass.js +2 -2
  65. package/lib/aws/compute/states/state.js +1 -1
  66. package/lib/aws/compute/states/succeed.js +1 -1
  67. package/lib/aws/compute/states/task-base.js +2 -2
  68. package/lib/aws/compute/states/task.js +1 -1
  69. package/lib/aws/compute/states/wait.js +2 -2
  70. package/lib/aws/compute/task-credentials.js +1 -1
  71. package/lib/aws/compute/task-input.js +1 -1
  72. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  73. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  74. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  75. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  76. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  77. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  78. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  79. package/lib/aws/compute/types.js +1 -1
  80. package/lib/aws/edge/certificate.js +1 -1
  81. package/lib/aws/edge/distribution.d.ts +5 -19
  82. package/lib/aws/edge/distribution.js +16 -26
  83. package/lib/aws/edge/dns-alias-record-targets.js +2 -2
  84. package/lib/aws/edge/dns-record.js +13 -13
  85. package/lib/aws/edge/dns-zone.js +1 -1
  86. package/lib/aws/edge/function.js +2 -2
  87. package/lib/aws/edge/index.d.ts +1 -0
  88. package/lib/aws/edge/index.js +2 -1
  89. package/lib/aws/edge/key-value-store.js +4 -4
  90. package/lib/aws/edge/origin.js +3 -3
  91. package/lib/aws/edge/response-headers-policy.d.ts +374 -0
  92. package/lib/aws/edge/response-headers-policy.js +220 -0
  93. package/lib/aws/encryption/alias.js +1 -1
  94. package/lib/aws/encryption/key.js +1 -1
  95. package/lib/aws/encryption/via-service-principal.js +1 -1
  96. package/lib/aws/iam/grant.js +2 -2
  97. package/lib/aws/iam/managed-policy.js +1 -1
  98. package/lib/aws/iam/oidc-provider.js +1 -1
  99. package/lib/aws/iam/policy-document.js +1 -1
  100. package/lib/aws/iam/policy-statement.js +1 -1
  101. package/lib/aws/iam/policy.js +1 -1
  102. package/lib/aws/iam/principals.js +20 -20
  103. package/lib/aws/iam/role.js +1 -1
  104. package/lib/aws/iam/saml-provider.js +2 -2
  105. package/lib/aws/iam/unknown-principal.js +1 -1
  106. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  107. package/lib/aws/network/subnet-group.js +3 -3
  108. package/lib/aws/network/subnet.js +4 -4
  109. package/lib/aws/notify/archive.js +1 -1
  110. package/lib/aws/notify/connection.js +3 -3
  111. package/lib/aws/notify/event-bus.js +3 -3
  112. package/lib/aws/notify/event-pattern.js +1 -1
  113. package/lib/aws/notify/input.js +2 -2
  114. package/lib/aws/notify/kinesis-stream.js +1 -1
  115. package/lib/aws/notify/queue-policy.js +1 -1
  116. package/lib/aws/notify/queue.js +1 -1
  117. package/lib/aws/notify/resource-policy.js +1 -1
  118. package/lib/aws/notify/rule.js +1 -1
  119. package/lib/aws/notify/schedule.js +1 -1
  120. package/lib/aws/notify/targets/event-bus.js +1 -1
  121. package/lib/aws/notify/targets/function.js +1 -1
  122. package/lib/aws/notify/targets/log-group.js +2 -2
  123. package/lib/aws/notify/targets/sqs.js +1 -1
  124. package/lib/aws/notify/targets/state-machine.js +1 -1
  125. package/lib/aws/storage/bucket-notifications.js +1 -1
  126. package/lib/aws/storage/bucket-policy.js +1 -1
  127. package/lib/aws/storage/bucket-source.js +1 -1
  128. package/lib/aws/storage/bucket.js +1 -1
  129. package/lib/aws/storage/notification-targets/function.js +1 -1
  130. package/lib/aws/storage/notification-targets/queue.js +1 -1
  131. package/lib/aws/storage/origin-access-identity.js +1 -1
  132. package/lib/construct-base.js +2 -2
  133. package/lib/duration.js +1 -1
  134. package/lib/size.js +1 -1
  135. package/lib/stack-base.js +1 -1
  136. package/package.json +1 -1
@@ -0,0 +1,374 @@
1
+ import { cloudfrontResponseHeadersPolicy } from "@cdktf/provider-aws";
2
+ import { Construct } from "constructs";
3
+ import { Duration } from "../../duration";
4
+ import { AwsConstructBase, AwsConstructProps } from "../aws-construct";
5
+ /**
6
+ * Represents a response headers policy.
7
+ */
8
+ export interface IResponseHeadersPolicy {
9
+ /**
10
+ * The ID of the response headers policy
11
+ * @attribute
12
+ **/
13
+ readonly responseHeadersPolicyId: string;
14
+ }
15
+ /**
16
+ * Properties for creating a Response Headers Policy
17
+ */
18
+ export interface ResponseHeadersPolicyProps extends AwsConstructProps {
19
+ /**
20
+ * A unique name to identify the response headers policy.
21
+ *
22
+ * @default - generated from the `id`
23
+ */
24
+ readonly responseHeadersPolicyName?: string;
25
+ /**
26
+ * A comment to describe the response headers policy.
27
+ *
28
+ * @default - no comment
29
+ */
30
+ readonly comment?: string;
31
+ /**
32
+ * A configuration for a set of HTTP response headers that are used for cross-origin resource sharing (CORS).
33
+ *
34
+ * @default - no cors behavior
35
+ */
36
+ readonly corsBehavior?: ResponseHeadersCorsBehavior;
37
+ /**
38
+ * A configuration for a set of custom HTTP response headers.
39
+ *
40
+ * @default - no custom headers behavior
41
+ */
42
+ readonly customHeadersBehavior?: ResponseCustomHeadersBehavior;
43
+ /**
44
+ * A configuration for a set of security-related HTTP response headers.
45
+ *
46
+ * @default - no security headers behavior
47
+ */
48
+ readonly securityHeadersBehavior?: ResponseSecurityHeadersBehavior;
49
+ /**
50
+ * A list of HTTP response headers that CloudFront removes from HTTP responses
51
+ * that it sends to viewers.
52
+ *
53
+ * @default - no headers are removed
54
+ */
55
+ readonly removeHeaders?: string[];
56
+ /**
57
+ * The percentage of responses that you want CloudFront to add the Server-Timing
58
+ * header to.
59
+ *
60
+ * @default - no Server-Timing header is added to HTTP responses
61
+ */
62
+ readonly serverTimingSamplingRate?: number;
63
+ }
64
+ /**
65
+ * A Response Headers Policy configuration
66
+ *
67
+ * @link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html
68
+ * @link https://registry.terraform.io/providers/hashicorp/aws/5.60.0/docs/resources/cloudfront_response_headers_policy
69
+ */
70
+ export declare class ResponseHeadersPolicy extends AwsConstructBase implements IResponseHeadersPolicy {
71
+ /**
72
+ * Import an existing Response Headers Policy from its ID.
73
+ */
74
+ static fromResponseHeadersPolicyId(scope: Construct, id: string, responseHeadersPolicyId: string): IResponseHeadersPolicy;
75
+ static fromManagedPolicyName(scope: Construct, id: string, managedResponseHeadersPolicyName: ManagedResponseHeadersPolicy): IResponseHeadersPolicy;
76
+ readonly resource: cloudfrontResponseHeadersPolicy.CloudfrontResponseHeadersPolicy;
77
+ readonly responseHeadersPolicyId: string;
78
+ readonly outputs: Record<string, any>;
79
+ constructor(scope: Construct, id: string, props?: ResponseHeadersPolicyProps);
80
+ private _renderCorsConfig;
81
+ private _renderCustomHeadersConfig;
82
+ private _renderSecurityHeadersConfig;
83
+ private _renderRemoveHeadersConfig;
84
+ private _renderServerTimingHeadersConfig;
85
+ }
86
+ /**
87
+ * Configuration for a set of HTTP response headers that are used for cross-origin resource sharing (CORS).
88
+ * CloudFront adds these headers to HTTP responses that it sends for CORS requests that match a cache behavior
89
+ * associated with this response headers policy.
90
+ */
91
+ export interface ResponseHeadersCorsBehavior {
92
+ /**
93
+ * A Boolean that CloudFront uses as the value for the Access-Control-Allow-Credentials HTTP response header.
94
+ */
95
+ readonly accessControlAllowCredentials: boolean;
96
+ /**
97
+ * A list of HTTP header names that CloudFront includes as values for the Access-Control-Allow-Headers HTTP response header.
98
+ * You can specify `['*']` to allow all headers.
99
+ */
100
+ readonly accessControlAllowHeaders: string[];
101
+ /**
102
+ * A list of HTTP methods that CloudFront includes as values for the Access-Control-Allow-Methods HTTP response header.
103
+ */
104
+ readonly accessControlAllowMethods: string[];
105
+ /**
106
+ * A list of origins (domain names) that CloudFront can use as the value for the Access-Control-Allow-Origin HTTP response header.
107
+ * You can specify `['*']` to allow all origins.
108
+ */
109
+ readonly accessControlAllowOrigins: string[];
110
+ /**
111
+ * A list of HTTP headers that CloudFront includes as values for the Access-Control-Expose-Headers HTTP response header.
112
+ * You can specify `['*']` to expose all headers.
113
+ *
114
+ * @default - no headers exposed
115
+ */
116
+ readonly accessControlExposeHeaders?: string[];
117
+ /**
118
+ * A number that CloudFront uses as the value for the Access-Control-Max-Age HTTP response header.
119
+ *
120
+ * @default - no max age
121
+ */
122
+ readonly accessControlMaxAge?: Duration;
123
+ /**
124
+ * A Boolean that determines whether CloudFront overrides HTTP response headers received from the origin with the ones specified in this response headers policy.
125
+ */
126
+ readonly originOverride: boolean;
127
+ }
128
+ /**
129
+ * Configuration for a set of HTTP response headers that are sent for requests that match a cache behavior
130
+ * that’s associated with this response headers policy.
131
+ */
132
+ export interface ResponseCustomHeadersBehavior {
133
+ /**
134
+ * The list of HTTP response headers and their values.
135
+ */
136
+ readonly customHeaders: ResponseCustomHeader[];
137
+ }
138
+ /**
139
+ * An HTTP response header name and its value.
140
+ * CloudFront includes this header in HTTP responses that it sends for requests that match a cache behavior that’s associated with this response headers policy.
141
+ */
142
+ export interface ResponseCustomHeader {
143
+ /**
144
+ * The HTTP response header name.
145
+ */
146
+ readonly header: string;
147
+ /**
148
+ * A Boolean that determines whether CloudFront overrides a response header with the same name
149
+ * received from the origin with the header specified here.
150
+ */
151
+ readonly override: boolean;
152
+ /**
153
+ * The value for the HTTP response header.
154
+ */
155
+ readonly value: string;
156
+ }
157
+ /**
158
+ * Configuration for a set of security-related HTTP response headers.
159
+ * CloudFront adds these headers to HTTP responses that it sends for requests that match a cache behavior
160
+ * associated with this response headers policy.
161
+ */
162
+ export interface ResponseSecurityHeadersBehavior {
163
+ /**
164
+ * The policy directives and their values that CloudFront includes as values for the Content-Security-Policy HTTP response header.
165
+ *
166
+ * @default - no content security policy
167
+ */
168
+ readonly contentSecurityPolicy?: ResponseHeadersContentSecurityPolicy;
169
+ /**
170
+ * Determines whether CloudFront includes the X-Content-Type-Options HTTP response header with its value set to nosniff.
171
+ *
172
+ * @default - no content type options
173
+ */
174
+ readonly contentTypeOptions?: ResponseHeadersContentTypeOptions;
175
+ /**
176
+ * Determines whether CloudFront includes the X-Frame-Options HTTP response header and the header’s value.
177
+ *
178
+ * @default - no frame options
179
+ */
180
+ readonly frameOptions?: ResponseHeadersFrameOptions;
181
+ /**
182
+ * Determines whether CloudFront includes the Referrer-Policy HTTP response header and the header’s value.
183
+ *
184
+ * @default - no referrer policy
185
+ */
186
+ readonly referrerPolicy?: ResponseHeadersReferrerPolicy;
187
+ /**
188
+ * Determines whether CloudFront includes the Strict-Transport-Security HTTP response header and the header’s value.
189
+ *
190
+ * @default - no strict transport security
191
+ */
192
+ readonly strictTransportSecurity?: ResponseHeadersStrictTransportSecurity;
193
+ /**
194
+ * Determines whether CloudFront includes the X-XSS-Protection HTTP response header and the header’s value.
195
+ *
196
+ * @default - no xss protection
197
+ */
198
+ readonly xssProtection?: ResponseHeadersXSSProtection;
199
+ }
200
+ /**
201
+ * The policy directives and their values that CloudFront includes as values for the Content-Security-Policy HTTP response header.
202
+ */
203
+ export interface ResponseHeadersContentSecurityPolicy {
204
+ /**
205
+ * The policy directives and their values that CloudFront includes as values for the Content-Security-Policy HTTP response header.
206
+ */
207
+ readonly contentSecurityPolicy: string;
208
+ /**
209
+ * A Boolean that determines whether CloudFront overrides the Content-Security-Policy HTTP response header
210
+ * received from the origin with the one specified in this response headers policy.
211
+ */
212
+ readonly override: boolean;
213
+ }
214
+ /**
215
+ * Determines whether CloudFront includes the X-Content-Type-Options HTTP response header with its value set to nosniff.
216
+ */
217
+ export interface ResponseHeadersContentTypeOptions {
218
+ /**
219
+ * A Boolean that determines whether CloudFront overrides the X-Content-Type-Options HTTP response header
220
+ * received from the origin with the one specified in this response headers policy.
221
+ */
222
+ readonly override: boolean;
223
+ }
224
+ /**
225
+ * Determines whether CloudFront includes the X-Frame-Options HTTP response header and the header’s value.
226
+ */
227
+ export interface ResponseHeadersFrameOptions {
228
+ /**
229
+ * The value of the X-Frame-Options HTTP response header.
230
+ */
231
+ readonly frameOption: HeadersFrameOption;
232
+ /**
233
+ * A Boolean that determines whether CloudFront overrides the X-Frame-Options HTTP response header
234
+ * received from the origin with the one specified in this response headers policy.
235
+ */
236
+ readonly override: boolean;
237
+ }
238
+ /**
239
+ * Determines whether CloudFront includes the Referrer-Policy HTTP response header and the header’s value.
240
+ */
241
+ export interface ResponseHeadersReferrerPolicy {
242
+ /**
243
+ * The value of the Referrer-Policy HTTP response header.
244
+ */
245
+ readonly referrerPolicy: HeadersReferrerPolicy;
246
+ /**
247
+ * A Boolean that determines whether CloudFront overrides the Referrer-Policy HTTP response header
248
+ * received from the origin with the one specified in this response headers policy.
249
+ */
250
+ readonly override: boolean;
251
+ }
252
+ /**
253
+ * Determines whether CloudFront includes the Strict-Transport-Security HTTP response header and the header’s value.
254
+ */
255
+ export interface ResponseHeadersStrictTransportSecurity {
256
+ /**
257
+ * A number that CloudFront uses as the value for the max-age directive in the Strict-Transport-Security HTTP response header.
258
+ */
259
+ readonly accessControlMaxAge: Duration;
260
+ /**
261
+ * A Boolean that determines whether CloudFront includes the includeSubDomains directive in the Strict-Transport-Security HTTP response header.
262
+ *
263
+ * @default false
264
+ */
265
+ readonly includeSubdomains?: boolean;
266
+ /**
267
+ * A Boolean that determines whether CloudFront overrides the Strict-Transport-Security HTTP response header
268
+ * received from the origin with the one specified in this response headers policy.
269
+ */
270
+ readonly override: boolean;
271
+ /**
272
+ * A Boolean that determines whether CloudFront includes the preload directive in the Strict-Transport-Security HTTP response header.
273
+ *
274
+ * @default false
275
+ */
276
+ readonly preload?: boolean;
277
+ }
278
+ /**
279
+ * Determines whether CloudFront includes the X-XSS-Protection HTTP response header and the header’s value.
280
+ */
281
+ export interface ResponseHeadersXSSProtection {
282
+ /**
283
+ * A Boolean that determines whether CloudFront includes the mode=block directive in the X-XSS-Protection header.
284
+ *
285
+ * @default false
286
+ */
287
+ readonly modeBlock?: boolean;
288
+ /**
289
+ * A Boolean that determines whether CloudFront overrides the X-XSS-Protection HTTP response header
290
+ * received from the origin with the one specified in this response headers policy.
291
+ */
292
+ readonly override: boolean;
293
+ /**
294
+ * A Boolean that determines the value of the X-XSS-Protection HTTP response header.
295
+ * When this setting is true, the value of the X-XSS-Protection header is 1.
296
+ * When this setting is false, the value of the X-XSS-Protection header is 0.
297
+ */
298
+ readonly protection: boolean;
299
+ /**
300
+ * A reporting URI, which CloudFront uses as the value of the report directive in the X-XSS-Protection header.
301
+ * You cannot specify a ReportUri when ModeBlock is true.
302
+ *
303
+ * @default - no report uri
304
+ */
305
+ readonly reportUri?: string;
306
+ }
307
+ /**
308
+ * Enum representing possible values of the X-Frame-Options HTTP response header.
309
+ */
310
+ export declare enum HeadersFrameOption {
311
+ /**
312
+ * The page can only be displayed in a frame on the same origin as the page itself.
313
+ */
314
+ DENY = "DENY",
315
+ /**
316
+ * The page can only be displayed in a frame on the specified origin.
317
+ */
318
+ SAMEORIGIN = "SAMEORIGIN"
319
+ }
320
+ /**
321
+ * Enum representing possible values of the Referrer-Policy HTTP response header.
322
+ */
323
+ export declare enum HeadersReferrerPolicy {
324
+ /**
325
+ * The referrer policy is not set.
326
+ */
327
+ NO_REFERRER = "no-referrer",
328
+ /**
329
+ * The referrer policy is no-referrer-when-downgrade.
330
+ */
331
+ NO_REFERRER_WHEN_DOWNGRADE = "no-referrer-when-downgrade",
332
+ /**
333
+ * The referrer policy is origin.
334
+ */
335
+ ORIGIN = "origin",
336
+ /**
337
+ * The referrer policy is origin-when-cross-origin.
338
+ */
339
+ ORIGIN_WHEN_CROSS_ORIGIN = "origin-when-cross-origin",
340
+ /**
341
+ * The referrer policy is same-origin.
342
+ */
343
+ SAME_ORIGIN = "same-origin",
344
+ /**
345
+ * The referrer policy is strict-origin.
346
+ */
347
+ STRICT_ORIGIN = "strict-origin",
348
+ /**
349
+ * The referrer policy is strict-origin-when-cross-origin.
350
+ */
351
+ STRICT_ORIGIN_WHEN_CROSS_ORIGIN = "strict-origin-when-cross-origin",
352
+ /**
353
+ * The referrer policy is unsafe-url.
354
+ */
355
+ UNSAFE_URL = "unsafe-url"
356
+ }
357
+ /**
358
+ * A Response Headers Policy configuration
359
+ *
360
+ * @link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html
361
+ * @link https://registry.terraform.io/providers/hashicorp/aws/5.60.0/docs/data-sources/cloudfront_response_headers_policy#aws-managed-policies
362
+ */
363
+ export declare enum ManagedResponseHeadersPolicy {
364
+ /** Use this managed policy to allow simple CORS requests from any origin. */
365
+ CORS_ALLOW_ALL_ORIGINS = "Managed-SimpleCORS",//60669652-455b-4ae9-85a4-c4c02393f86c
366
+ /** Use this managed policy to allow CORS requests from any origin, including preflight requests. */
367
+ CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT = "Managed-CORS-With-Preflight",//5cc3b908-e619-4b99-88e5-2cf7f45965bd
368
+ /** Use this managed policy to add a set of security headers to all responses that CloudFront sends to viewers. */
369
+ SECURITY_HEADERS = "Managed-SecurityHeadersPolicy",//67f7725c-6f97-4210-82d7-5512b31e9d03
370
+ /** Use this managed policy to allow simple CORS requests from any origin and add a set of security headers to all responses that CloudFront sends to viewers. */
371
+ CORS_ALLOW_ALL_ORIGINS_AND_SECURITY_HEADERS = "Managed-CORS-and-SecurityHeadersPolicy",//e61eb60c-9c35-4d20-a928-2b84e02af89c
372
+ /** Use this managed policy to allow CORS requests from any origin, including preflight requests, and add a set of security headers to all responses that CloudFront sends to viewers. */
373
+ CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS = "Managed-CORS-with-preflight-and-SecurityHeadersPolicy"
374
+ }
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ManagedResponseHeadersPolicy = exports.HeadersReferrerPolicy = exports.HeadersFrameOption = exports.ResponseHeadersPolicy = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // https://github.com/aws/aws-cdk/blob/0f077c0a6adc1e5258d073f6de232d09cbb7ae54/packages/aws-cdk-lib/aws-cloudfront/lib/response-headers-policy.ts
7
+ const provider_aws_1 = require("@cdktf/provider-aws");
8
+ const cdktf_1 = require("cdktf");
9
+ const aws_construct_1 = require("../aws-construct");
10
+ /**
11
+ * A Response Headers Policy configuration
12
+ *
13
+ * @link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html
14
+ * @link https://registry.terraform.io/providers/hashicorp/aws/5.60.0/docs/resources/cloudfront_response_headers_policy
15
+ */
16
+ class ResponseHeadersPolicy extends aws_construct_1.AwsConstructBase {
17
+ /**
18
+ * Import an existing Response Headers Policy from its ID.
19
+ */
20
+ static fromResponseHeadersPolicyId(scope, id, responseHeadersPolicyId) {
21
+ class Import extends aws_construct_1.AwsConstructBase {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.outputs = {};
25
+ this.responseHeadersPolicyId = responseHeadersPolicyId;
26
+ }
27
+ }
28
+ return new Import(scope, id);
29
+ }
30
+ static fromManagedPolicyName(scope, id, managedResponseHeadersPolicyName) {
31
+ class Import extends aws_construct_1.AwsConstructBase {
32
+ constructor() {
33
+ super(scope, id);
34
+ this.outputs = {};
35
+ this.resource =
36
+ new provider_aws_1.dataAwsCloudfrontResponseHeadersPolicy.DataAwsCloudfrontResponseHeadersPolicy(this, "Resource", {
37
+ name: managedResponseHeadersPolicyName,
38
+ });
39
+ this.responseHeadersPolicyId = this.resource.id;
40
+ }
41
+ }
42
+ return new Import();
43
+ }
44
+ constructor(scope, id, props = {}) {
45
+ super(scope, id, props);
46
+ this.outputs = {};
47
+ const responseHeadersPolicyName = props.responseHeadersPolicyName ||
48
+ this.stack.uniqueResourceName(this, {
49
+ prefix: this.gridUUID,
50
+ maxLength: 128,
51
+ });
52
+ this.resource =
53
+ new provider_aws_1.cloudfrontResponseHeadersPolicy.CloudfrontResponseHeadersPolicy(this, "Resource", {
54
+ name: responseHeadersPolicyName,
55
+ comment: props.comment,
56
+ corsConfig: props.corsBehavior
57
+ ? this._renderCorsConfig(props.corsBehavior)
58
+ : undefined,
59
+ customHeadersConfig: props.customHeadersBehavior
60
+ ? this._renderCustomHeadersConfig(props.customHeadersBehavior)
61
+ : undefined,
62
+ securityHeadersConfig: props.securityHeadersBehavior
63
+ ? this._renderSecurityHeadersConfig(props.securityHeadersBehavior)
64
+ : undefined,
65
+ removeHeadersConfig: props.removeHeaders
66
+ ? this._renderRemoveHeadersConfig(props.removeHeaders)
67
+ : undefined,
68
+ serverTimingHeadersConfig: props.serverTimingSamplingRate
69
+ ? this._renderServerTimingHeadersConfig(props.serverTimingSamplingRate)
70
+ : undefined,
71
+ });
72
+ this.responseHeadersPolicyId = this.resource.id;
73
+ }
74
+ _renderCorsConfig(behavior) {
75
+ return {
76
+ accessControlAllowCredentials: behavior.accessControlAllowCredentials,
77
+ accessControlAllowHeaders: { items: behavior.accessControlAllowHeaders },
78
+ accessControlAllowMethods: { items: behavior.accessControlAllowMethods },
79
+ accessControlAllowOrigins: { items: behavior.accessControlAllowOrigins },
80
+ accessControlExposeHeaders: behavior.accessControlExposeHeaders
81
+ ? { items: behavior.accessControlExposeHeaders }
82
+ : undefined,
83
+ accessControlMaxAgeSec: behavior.accessControlMaxAge
84
+ ? behavior.accessControlMaxAge.toSeconds()
85
+ : undefined,
86
+ originOverride: behavior.originOverride,
87
+ };
88
+ }
89
+ _renderCustomHeadersConfig(behavior) {
90
+ return {
91
+ items: behavior.customHeaders,
92
+ };
93
+ }
94
+ _renderSecurityHeadersConfig(behavior) {
95
+ return {
96
+ contentSecurityPolicy: behavior.contentSecurityPolicy,
97
+ contentTypeOptions: behavior.contentTypeOptions,
98
+ frameOptions: behavior.frameOptions,
99
+ referrerPolicy: behavior.referrerPolicy,
100
+ strictTransportSecurity: behavior.strictTransportSecurity
101
+ ? {
102
+ ...behavior.strictTransportSecurity,
103
+ accessControlMaxAgeSec: behavior.strictTransportSecurity.accessControlMaxAge.toSeconds(),
104
+ }
105
+ : undefined,
106
+ xssProtection: behavior.xssProtection,
107
+ };
108
+ }
109
+ _renderRemoveHeadersConfig(headers) {
110
+ const readonlyHeaders = [
111
+ "content-encoding",
112
+ "content-length",
113
+ "transfer-encoding",
114
+ "warning",
115
+ "via",
116
+ ];
117
+ return {
118
+ items: headers.map((header) => {
119
+ if (!cdktf_1.Token.isUnresolved(header) &&
120
+ readonlyHeaders.includes(header.toLowerCase())) {
121
+ throw new Error(`Cannot remove read-only header ${header}`);
122
+ }
123
+ return { header };
124
+ }),
125
+ };
126
+ }
127
+ _renderServerTimingHeadersConfig(samplingRate) {
128
+ if (!cdktf_1.Token.isUnresolved(samplingRate)) {
129
+ if (samplingRate < 0 || samplingRate > 100) {
130
+ throw new Error(`Sampling rate must be between 0 and 100 (inclusive), received ${samplingRate}`);
131
+ }
132
+ if (!hasMaxDecimalPlaces(samplingRate, 4)) {
133
+ throw new Error(`Sampling rate can have up to four decimal places, received ${samplingRate}`);
134
+ }
135
+ }
136
+ return {
137
+ enabled: true,
138
+ samplingRate,
139
+ };
140
+ }
141
+ }
142
+ exports.ResponseHeadersPolicy = ResponseHeadersPolicy;
143
+ _a = JSII_RTTI_SYMBOL_1;
144
+ ResponseHeadersPolicy[_a] = { fqn: "terraconstructs.aws.edge.ResponseHeadersPolicy", version: "0.0.10" };
145
+ /**
146
+ * Enum representing possible values of the X-Frame-Options HTTP response header.
147
+ */
148
+ var HeadersFrameOption;
149
+ (function (HeadersFrameOption) {
150
+ /**
151
+ * The page can only be displayed in a frame on the same origin as the page itself.
152
+ */
153
+ HeadersFrameOption["DENY"] = "DENY";
154
+ /**
155
+ * The page can only be displayed in a frame on the specified origin.
156
+ */
157
+ HeadersFrameOption["SAMEORIGIN"] = "SAMEORIGIN";
158
+ })(HeadersFrameOption || (exports.HeadersFrameOption = HeadersFrameOption = {}));
159
+ /**
160
+ * Enum representing possible values of the Referrer-Policy HTTP response header.
161
+ */
162
+ var HeadersReferrerPolicy;
163
+ (function (HeadersReferrerPolicy) {
164
+ /**
165
+ * The referrer policy is not set.
166
+ */
167
+ HeadersReferrerPolicy["NO_REFERRER"] = "no-referrer";
168
+ /**
169
+ * The referrer policy is no-referrer-when-downgrade.
170
+ */
171
+ HeadersReferrerPolicy["NO_REFERRER_WHEN_DOWNGRADE"] = "no-referrer-when-downgrade";
172
+ /**
173
+ * The referrer policy is origin.
174
+ */
175
+ HeadersReferrerPolicy["ORIGIN"] = "origin";
176
+ /**
177
+ * The referrer policy is origin-when-cross-origin.
178
+ */
179
+ HeadersReferrerPolicy["ORIGIN_WHEN_CROSS_ORIGIN"] = "origin-when-cross-origin";
180
+ /**
181
+ * The referrer policy is same-origin.
182
+ */
183
+ HeadersReferrerPolicy["SAME_ORIGIN"] = "same-origin";
184
+ /**
185
+ * The referrer policy is strict-origin.
186
+ */
187
+ HeadersReferrerPolicy["STRICT_ORIGIN"] = "strict-origin";
188
+ /**
189
+ * The referrer policy is strict-origin-when-cross-origin.
190
+ */
191
+ HeadersReferrerPolicy["STRICT_ORIGIN_WHEN_CROSS_ORIGIN"] = "strict-origin-when-cross-origin";
192
+ /**
193
+ * The referrer policy is unsafe-url.
194
+ */
195
+ HeadersReferrerPolicy["UNSAFE_URL"] = "unsafe-url";
196
+ })(HeadersReferrerPolicy || (exports.HeadersReferrerPolicy = HeadersReferrerPolicy = {}));
197
+ function hasMaxDecimalPlaces(num, decimals) {
198
+ const parts = num.toString().split(".");
199
+ return parts.length === 1 || parts[1].length <= decimals;
200
+ }
201
+ /**
202
+ * A Response Headers Policy configuration
203
+ *
204
+ * @link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html
205
+ * @link https://registry.terraform.io/providers/hashicorp/aws/5.60.0/docs/data-sources/cloudfront_response_headers_policy#aws-managed-policies
206
+ */
207
+ var ManagedResponseHeadersPolicy;
208
+ (function (ManagedResponseHeadersPolicy) {
209
+ /** Use this managed policy to allow simple CORS requests from any origin. */
210
+ ManagedResponseHeadersPolicy["CORS_ALLOW_ALL_ORIGINS"] = "Managed-SimpleCORS";
211
+ /** Use this managed policy to allow CORS requests from any origin, including preflight requests. */
212
+ ManagedResponseHeadersPolicy["CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT"] = "Managed-CORS-With-Preflight";
213
+ /** Use this managed policy to add a set of security headers to all responses that CloudFront sends to viewers. */
214
+ ManagedResponseHeadersPolicy["SECURITY_HEADERS"] = "Managed-SecurityHeadersPolicy";
215
+ /** Use this managed policy to allow simple CORS requests from any origin and add a set of security headers to all responses that CloudFront sends to viewers. */
216
+ ManagedResponseHeadersPolicy["CORS_ALLOW_ALL_ORIGINS_AND_SECURITY_HEADERS"] = "Managed-CORS-and-SecurityHeadersPolicy";
217
+ /** Use this managed policy to allow CORS requests from any origin, including preflight requests, and add a set of security headers to all responses that CloudFront sends to viewers. */
218
+ ManagedResponseHeadersPolicy["CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS"] = "Managed-CORS-with-preflight-and-SecurityHeadersPolicy";
219
+ })(ManagedResponseHeadersPolicy || (exports.ManagedResponseHeadersPolicy = ManagedResponseHeadersPolicy = {}));
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UtaGVhZGVycy1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2VkZ2UvcmVzcG9uc2UtaGVhZGVycy1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrSkFBa0o7QUFDbEosc0RBRzZCO0FBQzdCLGlDQUE4QjtBQUc5QixvREFBdUU7QUFxRXZFOzs7OztHQUtHO0FBQ0gsTUFBYSxxQkFDWCxTQUFRLGdDQUFnQjtJQUd4Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQywyQkFBMkIsQ0FDdkMsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLHVCQUErQjtRQUUvQixNQUFNLE1BQU8sU0FBUSxnQ0FBZ0I7WUFBckM7O2dCQUNrQixZQUFPLEdBQXdCLEVBQUUsQ0FBQztnQkFDbEMsNEJBQXVCLEdBQUcsdUJBQXVCLENBQUM7WUFDcEUsQ0FBQztTQUFBO1FBQ0QsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FDakMsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLGdDQUE4RDtRQUU5RCxNQUFNLE1BQU8sU0FBUSxnQ0FBZ0I7WUFJbkM7Z0JBQ0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFKSCxZQUFPLEdBQXdCLEVBQUUsQ0FBQztnQkFLaEQsSUFBSSxDQUFDLFFBQVE7b0JBQ1gsSUFBSSxxREFBc0MsQ0FBQyxzQ0FBc0MsQ0FDL0UsSUFBSSxFQUNKLFVBQVUsRUFDVjt3QkFDRSxJQUFJLEVBQUUsZ0NBQWdDO3FCQUN2QyxDQUNGLENBQUM7Z0JBQ0osSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2xELENBQUM7U0FDRjtRQUNELE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBTUQsWUFDRSxLQUFnQixF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RSw2RUFBNkMsQ0FBQTtJQUM3QyxvR0FBb0c7SUFDcEcscUdBQXFFLENBQUE7SUFDckUsa0hBQWtIO0lBQ2xILGtGQUFrRCxDQUFBO0lBQ2xELGlLQUFpSztJQUNqSyxzSEFBc0YsQ0FBQTtJQUN0Rix5TEFBeUw7SUFDekwsb0pBQW9ILENBQUE7QUFDdEgsQ0FBQyxFQVhXLDRCQUE0Qiw0Q0FBNUIsNEJBQTRCLFFBV3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvMGYwNzdjMGE2YWRjMWU1MjU4ZDA3M2Y2ZGUyMzJkMDljYmI3YWU1NC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC9saWIvcmVzcG9uc2UtaGVhZGVycy1wb2xpY3kudHNcbmltcG9ydCB7XG4gIGNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gIGRhdGFBd3NDbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgVG9rZW4gfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLi9kdXJhdGlvblwiO1xuaW1wb3J0IHsgQXdzQ29uc3RydWN0QmFzZSwgQXdzQ29uc3RydWN0UHJvcHMgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSByZXNwb25zZSBoZWFkZXJzIHBvbGljeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3lcbiAgICogQGF0dHJpYnV0ZVxuICAgKiovXG4gIHJlYWRvbmx5IHJlc3BvbnNlSGVhZGVyc1BvbGljeUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogQSB1bmlxdWUgbmFtZSB0byBpZGVudGlmeSB0aGUgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZ2VuZXJhdGVkIGZyb20gdGhlIGBpZGBcbiAgICovXG4gIHJlYWRvbmx5IHJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29tbWVudCB0byBkZXNjcmliZSB0aGUgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29tbWVudFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIGZvciBhIHNldCBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBhcmUgdXNlZCBmb3IgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHNoYXJpbmcgKENPUlMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvcnMgYmVoYXZpb3JcbiAgICovXG4gIHJlYWRvbmx5IGNvcnNCZWhhdmlvcj86IFJlc3BvbnNlSGVhZGVyc0NvcnNCZWhhdmlvcjtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIGZvciBhIHNldCBvZiBjdXN0b20gSFRUUCByZXNwb25zZSBoZWFkZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGN1c3RvbSBoZWFkZXJzIGJlaGF2aW9yXG4gICAqL1xuICByZWFkb25seSBjdXN0b21IZWFkZXJzQmVoYXZpb3I/OiBSZXNwb25zZUN1c3RvbUhlYWRlcnNCZWhhdmlvcjtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIGZvciBhIHNldCBvZiBzZWN1cml0eS1yZWxhdGVkIEhUVFAgcmVzcG9uc2UgaGVhZGVycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzZWN1cml0eSBoZWFkZXJzIGJlaGF2aW9yXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcj86IFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBDbG91ZEZyb250IHJlbW92ZXMgZnJvbSBIVFRQIHJlc3BvbnNlc1xuICAgKiB0aGF0IGl0IHNlbmRzIHRvIHZpZXdlcnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gaGVhZGVycyBhcmUgcmVtb3ZlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlSGVhZGVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyY2VudGFnZSBvZiByZXNwb25zZXMgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIGFkZCB0aGUgU2VydmVyLVRpbWluZ1xuICAgKiBoZWFkZXIgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gU2VydmVyLVRpbWluZyBoZWFkZXIgaXMgYWRkZWQgdG8gSFRUUCByZXNwb25zZXNcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlclRpbWluZ1NhbXBsaW5nUmF0ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5IGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWxcbiAqIEBsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjAuMC9kb2NzL3Jlc291cmNlcy9jbG91ZGZyb250X3Jlc3BvbnNlX2hlYWRlcnNfcG9saWN5XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZUhlYWRlcnNQb2xpY3lcbiAgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlXG4gIGltcGxlbWVudHMgSVJlc3BvbnNlSGVhZGVyc1BvbGljeVxue1xuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5IGZyb20gaXRzIElELlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeUlkOiBzdHJpbmcsXG4gICk6IElSZXNwb25zZUhlYWRlcnNQb2xpY3kge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvdXRwdXRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VIZWFkZXJzUG9saWN5SWQgPSByZXNwb25zZUhlYWRlcnNQb2xpY3lJZDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU1hbmFnZWRQb2xpY3lOYW1lKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBtYW5hZ2VkUmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZTogTWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgKTogSVJlc3BvbnNlSGVhZGVyc1BvbGljeSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElSZXNwb25zZUhlYWRlcnNQb2xpY3kge1xuICAgICAgcHVibGljIHJlYWRvbmx5IG91dHB1dHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHB1YmxpYyByZWFkb25seSByZXNwb25zZUhlYWRlcnNQb2xpY3lJZDogc3RyaW5nO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBkYXRhQXdzQ2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeS5EYXRhQXdzQ2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeTtcbiAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9XG4gICAgICAgICAgbmV3IGRhdGFBd3NDbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LkRhdGFBd3NDbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIFwiUmVzb3VyY2VcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogbWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzUG9saWN5SWQgPSB0aGlzLnJlc291cmNlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydCgpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBjbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LkNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3k7XG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZUhlYWRlcnNQb2xpY3lJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0czogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSA9XG4gICAgICBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lIHx8XG4gICAgICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogdGhpcy5ncmlkVVVJRCxcbiAgICAgICAgbWF4TGVuZ3RoOiAxMjgsXG4gICAgICB9KTtcblxuICAgIHRoaXMucmVzb3VyY2UgPVxuICAgICAgbmV3IGNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3kuQ2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJSZXNvdXJjZVwiLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSxcbiAgICAgICAgICBjb21tZW50OiBwcm9wcy5jb21tZW50LFxuICAgICAgICAgIGNvcnNDb25maWc6IHByb3BzLmNvcnNCZWhhdmlvclxuICAgICAgICAgICAgPyB0aGlzLl9yZW5kZXJDb3JzQ29uZmlnKHByb3BzLmNvcnNCZWhhdmlvcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGN1c3RvbUhlYWRlcnNDb25maWc6IHByb3BzLmN1c3RvbUhlYWRlcnNCZWhhdmlvclxuICAgICAgICAgICAgPyB0aGlzLl9yZW5kZXJDdXN0b21IZWFkZXJzQ29uZmlnKHByb3BzLmN1c3RvbUhlYWRlcnNCZWhhdmlvcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNlY3VyaXR5SGVhZGVyc0NvbmZpZzogcHJvcHMuc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3JcbiAgICAgICAgICAgID8gdGhpcy5fcmVuZGVyU2VjdXJpdHlIZWFkZXJzQ29uZmlnKHByb3BzLnNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVtb3ZlSGVhZGVyc0NvbmZpZzogcHJvcHMucmVtb3ZlSGVhZGVyc1xuICAgICAgICAgICAgPyB0aGlzLl9yZW5kZXJSZW1vdmVIZWFkZXJzQ29uZmlnKHByb3BzLnJlbW92ZUhlYWRlcnMpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzZXJ2ZXJUaW1pbmdIZWFkZXJzQ29uZmlnOiBwcm9wcy5zZXJ2ZXJUaW1pbmdTYW1wbGluZ1JhdGVcbiAgICAgICAgICAgID8gdGhpcy5fcmVuZGVyU2VydmVyVGltaW5nSGVhZGVyc0NvbmZpZyhcbiAgICAgICAgICAgICAgICBwcm9wcy5zZXJ2ZXJUaW1pbmdTYW1wbGluZ1JhdGUsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzUG9saWN5SWQgPSB0aGlzLnJlc291cmNlLmlkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQ29yc0NvbmZpZyhcbiAgICBiZWhhdmlvcjogUmVzcG9uc2VIZWFkZXJzQ29yc0JlaGF2aW9yLFxuICApOiBjbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LkNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3lDb3JzQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzQ29udHJvbEFsbG93Q3JlZGVudGlhbHM6IGJlaGF2aW9yLmFjY2Vzc0NvbnRyb2xBbGxvd0NyZWRlbnRpYWxzLFxuICAgICAgYWNjZXNzQ29udHJvbEFsbG93SGVhZGVyczogeyBpdGVtczogYmVoYXZpb3IuYWNjZXNzQ29udHJvbEFsbG93SGVhZGVycyB9LFxuICAgICAgYWNjZXNzQ29udHJvbEFsbG93TWV0aG9kczogeyBpdGVtczogYmVoYXZpb3IuYWNjZXNzQ29udHJvbEFsbG93TWV0aG9kcyB9LFxuICAgICAgYWNjZXNzQ29udHJvbEFsbG93T3JpZ2luczogeyBpdGVtczogYmVoYXZpb3IuYWNjZXNzQ29udHJvbEFsbG93T3JpZ2lucyB9LFxuICAgICAgYWNjZXNzQ29udHJvbEV4cG9zZUhlYWRlcnM6IGJlaGF2aW9yLmFjY2Vzc0NvbnRyb2xFeHBvc2VIZWFkZXJzXG4gICAgICAgID8geyBpdGVtczogYmVoYXZpb3IuYWNjZXNzQ29udHJvbEV4cG9zZUhlYWRlcnMgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGFjY2Vzc0NvbnRyb2xNYXhBZ2VTZWM6IGJlaGF2aW9yLmFjY2Vzc0NvbnRyb2xNYXhBZ2VcbiAgICAgICAgPyBiZWhhdmlvci5hY2Nlc3NDb250cm9sTWF4QWdlLnRvU2Vjb25kcygpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgb3JpZ2luT3ZlcnJpZGU6IGJlaGF2aW9yLm9yaWdpbk92ZXJyaWRlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJDdXN0b21IZWFkZXJzQ29uZmlnKFxuICAgIGJlaGF2aW9yOiBSZXNwb25zZUN1c3RvbUhlYWRlcnNCZWhhdmlvcixcbiAgKTogY2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeS5DbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5Q3VzdG9tSGVhZGVyc0NvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiBiZWhhdmlvci5jdXN0b21IZWFkZXJzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJTZWN1cml0eUhlYWRlcnNDb25maWcoXG4gICAgYmVoYXZpb3I6IFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICk6IGNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3kuQ2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeVNlY3VyaXR5SGVhZGVyc0NvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeTogYmVoYXZpb3IuY29udGVudFNlY3VyaXR5UG9saWN5LFxuICAgICAgY29udGVudFR5cGVPcHRpb25zOiBiZWhhdmlvci5jb250ZW50VHlwZU9wdGlvbnMsXG4gICAgICBmcmFtZU9wdGlvbnM6IGJlaGF2aW9yLmZyYW1lT3B0aW9ucyxcbiAgICAgIHJlZmVycmVyUG9saWN5OiBiZWhhdmlvci5yZWZlcnJlclBvbGljeSxcbiAgICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiBiZWhhdmlvci5zdHJpY3RUcmFuc3BvcnRTZWN1cml0eVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmJlaGF2aW9yLnN0cmljdFRyYW5zcG9ydFNlY3VyaXR5LFxuICAgICAgICAgICAgYWNjZXNzQ29udHJvbE1heEFnZVNlYzpcbiAgICAgICAgICAgICAgYmVoYXZpb3Iuc3RyaWN0VHJhbnNwb3J0U2VjdXJpdHkuYWNjZXNzQ29udHJvbE1heEFnZS50b1NlY29uZHMoKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgeHNzUHJvdGVjdGlvbjogYmVoYXZpb3IueHNzUHJvdGVjdGlvbixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyUmVtb3ZlSGVhZGVyc0NvbmZpZyhcbiAgICBoZWFkZXJzOiBzdHJpbmdbXSxcbiAgKTogY2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeS5DbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5UmVtb3ZlSGVhZGVyc0NvbmZpZyB7XG4gICAgY29uc3QgcmVhZG9ubHlIZWFkZXJzID0gW1xuICAgICAgXCJjb250ZW50LWVuY29kaW5nXCIsXG4gICAgICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICBcInRyYW5zZmVyLWVuY29kaW5nXCIsXG4gICAgICBcIndhcm5pbmdcIixcbiAgICAgIFwidmlhXCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogaGVhZGVycy5tYXAoKGhlYWRlcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChoZWFkZXIpICYmXG4gICAgICAgICAgcmVhZG9ubHlIZWFkZXJzLmluY2x1ZGVzKGhlYWRlci50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZW1vdmUgcmVhZC1vbmx5IGhlYWRlciAke2hlYWRlcn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBoZWFkZXIgfTtcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJTZXJ2ZXJUaW1pbmdIZWFkZXJzQ29uZmlnKFxuICAgIHNhbXBsaW5nUmF0ZTogbnVtYmVyLFxuICApOiBjbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LkNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3lTZXJ2ZXJUaW1pbmdIZWFkZXJzQ29uZmlnIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChzYW1wbGluZ1JhdGUpKSB7XG4gICAgICBpZiAoc2FtcGxpbmdSYXRlIDwgMCB8fCBzYW1wbGluZ1JhdGUgPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTYW1wbGluZyByYXRlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAgKGluY2x1c2l2ZSksIHJlY2VpdmVkICR7c2FtcGxpbmdSYXRlfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFzTWF4RGVjaW1hbFBsYWNlcyhzYW1wbGluZ1JhdGUsIDQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2FtcGxpbmcgcmF0ZSBjYW4gaGF2ZSB1cCB0byBmb3VyIGRlY2ltYWwgcGxhY2VzLCByZWNlaXZlZCAke3NhbXBsaW5nUmF0ZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgc2FtcGxpbmdSYXRlLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNldCBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBhcmUgdXNlZCBmb3IgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHNoYXJpbmcgKENPUlMpLlxuICogQ2xvdWRGcm9udCBhZGRzIHRoZXNlIGhlYWRlcnMgdG8gSFRUUCByZXNwb25zZXMgdGhhdCBpdCBzZW5kcyBmb3IgQ09SUyByZXF1ZXN0cyB0aGF0IG1hdGNoIGEgY2FjaGUgYmVoYXZpb3JcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlSGVhZGVyc0NvcnNCZWhhdmlvciB7XG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBDbG91ZEZyb250IHVzZXMgYXMgdGhlIHZhbHVlIGZvciB0aGUgQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NDb250cm9sQWxsb3dDcmVkZW50aWFsczogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIEhUVFAgaGVhZGVyIG5hbWVzIHRoYXQgQ2xvdWRGcm9udCBpbmNsdWRlcyBhcyB2YWx1ZXMgZm9yIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgYFsnKiddYCB0byBhbGxvdyBhbGwgaGVhZGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc0NvbnRyb2xBbGxvd0hlYWRlcnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgSFRUUCBtZXRob2RzIHRoYXQgQ2xvdWRGcm9udCBpbmNsdWRlcyBhcyB2YWx1ZXMgZm9yIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzQ29udHJvbEFsbG93TWV0aG9kczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBvcmlnaW5zIChkb21haW4gbmFtZXMpIHRoYXQgQ2xvdWRGcm9udCBjYW4gdXNlIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICogWW91IGNhbiBzcGVjaWZ5IGBbJyonXWAgdG8gYWxsb3cgYWxsIG9yaWdpbnMuXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NDb250cm9sQWxsb3dPcmlnaW5zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIEhUVFAgaGVhZGVycyB0aGF0IENsb3VkRnJvbnQgaW5jbHVkZXMgYXMgdmFsdWVzIGZvciB0aGUgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqIFlvdSBjYW4gc3BlY2lmeSBgWycqJ11gIHRvIGV4cG9zZSBhbGwgaGVhZGVycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBoZWFkZXJzIGV4cG9zZWRcbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc0NvbnRyb2xFeHBvc2VIZWFkZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbnVtYmVyIHRoYXQgQ2xvdWRGcm9udCB1c2VzIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIEFjY2Vzcy1Db250cm9sLU1heC1BZ2UgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbWF4IGFnZVxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzQ29udHJvbE1heEFnZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgSFRUUCByZXNwb25zZSBoZWFkZXJzIHJlY2VpdmVkIGZyb20gdGhlIG9yaWdpbiB3aXRoIHRoZSBvbmVzIHNwZWNpZmllZCBpbiB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luT3ZlcnJpZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzZXQgb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgZm9yIHJlcXVlc3RzIHRoYXQgbWF0Y2ggYSBjYWNoZSBiZWhhdmlvclxuICogdGhhdOKAmXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VDdXN0b21IZWFkZXJzQmVoYXZpb3Ige1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIGFuZCB0aGVpciB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21IZWFkZXJzOiBSZXNwb25zZUN1c3RvbUhlYWRlcltdO1xufVxuXG4vKipcbiAqIEFuIEhUVFAgcmVzcG9uc2UgaGVhZGVyIG5hbWUgYW5kIGl0cyB2YWx1ZS5cbiAqIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhpcyBoZWFkZXIgaW4gSFRUUCByZXNwb25zZXMgdGhhdCBpdCBzZW5kcyBmb3IgcmVxdWVzdHMgdGhhdCBtYXRjaCBhIGNhY2hlIGJlaGF2aW9yIHRoYXTigJlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlQ3VzdG9tSGVhZGVyIHtcbiAgLyoqXG4gICAqIFRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IG92ZXJyaWRlcyBhIHJlc3BvbnNlIGhlYWRlciB3aXRoIHRoZSBzYW1lIG5hbWVcbiAgICogcmVjZWl2ZWQgZnJvbSB0aGUgb3JpZ2luIHdpdGggdGhlIGhlYWRlciBzcGVjaWZpZWQgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgZm9yIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzZXQgb2Ygc2VjdXJpdHktcmVsYXRlZCBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuXG4gKiBDbG91ZEZyb250IGFkZHMgdGhlc2UgaGVhZGVycyB0byBIVFRQIHJlc3BvbnNlcyB0aGF0IGl0IHNlbmRzIGZvciByZXF1ZXN0cyB0aGF0IG1hdGNoIGEgY2FjaGUgYmVoYXZpb3JcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3Ige1xuICAvKipcbiAgICogVGhlIHBvbGljeSBkaXJlY3RpdmVzIGFuZCB0aGVpciB2YWx1ZXMgdGhhdCBDbG91ZEZyb250IGluY2x1ZGVzIGFzIHZhbHVlcyBmb3IgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5XG4gICAqL1xuICByZWFkb25seSBjb250ZW50U2VjdXJpdHlQb2xpY3k/OiBSZXNwb25zZUhlYWRlcnNDb250ZW50U2VjdXJpdHlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBYLUNvbnRlbnQtVHlwZS1PcHRpb25zIEhUVFAgcmVzcG9uc2UgaGVhZGVyIHdpdGggaXRzIHZhbHVlIHNldCB0byBub3NuaWZmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbnRlbnQgdHlwZSBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBjb250ZW50VHlwZU9wdGlvbnM/OiBSZXNwb25zZUhlYWRlcnNDb250ZW50VHlwZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBYLUZyYW1lLU9wdGlvbnMgSFRUUCByZXNwb25zZSBoZWFkZXIgYW5kIHRoZSBoZWFkZXLigJlzIHZhbHVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGZyYW1lIG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGZyYW1lT3B0aW9ucz86IFJlc3BvbnNlSGVhZGVyc0ZyYW1lT3B0aW9ucztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhlIFJlZmVycmVyLVBvbGljeSBIVFRQIHJlc3BvbnNlIGhlYWRlciBhbmQgdGhlIGhlYWRlcuKAmXMgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVmZXJyZXIgcG9saWN5XG4gICAqL1xuICByZWFkb25seSByZWZlcnJlclBvbGljeT86IFJlc3BvbnNlSGVhZGVyc1JlZmVycmVyUG9saWN5O1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBpbmNsdWRlcyB0aGUgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBIVFRQIHJlc3BvbnNlIGhlYWRlciBhbmQgdGhlIGhlYWRlcuKAmXMgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc3RyaWN0IHRyYW5zcG9ydCBzZWN1cml0eVxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaWN0VHJhbnNwb3J0U2VjdXJpdHk/OiBSZXNwb25zZUhlYWRlcnNTdHJpY3RUcmFuc3BvcnRTZWN1cml0eTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhlIFgtWFNTLVByb3RlY3Rpb24gSFRUUCByZXNwb25zZSBoZWFkZXIgYW5kIHRoZSBoZWFkZXLigJlzIHZhbHVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHhzcyBwcm90ZWN0aW9uXG4gICAqL1xuICByZWFkb25seSB4c3NQcm90ZWN0aW9uPzogUmVzcG9uc2VIZWFkZXJzWFNTUHJvdGVjdGlvbjtcbn1cblxuLyoqXG4gKiBUaGUgcG9saWN5IGRpcmVjdGl2ZXMgYW5kIHRoZWlyIHZhbHVlcyB0aGF0IENsb3VkRnJvbnQgaW5jbHVkZXMgYXMgdmFsdWVzIGZvciB0aGUgQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VIZWFkZXJzQ29udGVudFNlY3VyaXR5UG9saWN5IHtcbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kgZGlyZWN0aXZlcyBhbmQgdGhlaXIgdmFsdWVzIHRoYXQgQ2xvdWRGcm9udCBpbmNsdWRlcyBhcyB2YWx1ZXMgZm9yIHRoZSBDb250ZW50LVNlY3VyaXR5LVBvbGljeSBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRTZWN1cml0eVBvbGljeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IEhUVFAgcmVzcG9uc2UgaGVhZGVyXG4gICAqIHJlY2VpdmVkIGZyb20gdGhlIG9yaWdpbiB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoaXMgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBpbmNsdWRlcyB0aGUgWC1Db250ZW50LVR5cGUtT3B0aW9ucyBIVFRQIHJlc3BvbnNlIGhlYWRlciB3aXRoIGl0cyB2YWx1ZSBzZXQgdG8gbm9zbmlmZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUhlYWRlcnNDb250ZW50VHlwZU9wdGlvbnMge1xuICAvKipcbiAgICogQSBCb29sZWFuIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgb3ZlcnJpZGVzIHRoZSBYLUNvbnRlbnQtVHlwZS1PcHRpb25zIEhUVFAgcmVzcG9uc2UgaGVhZGVyXG4gICAqIHJlY2VpdmVkIGZyb20gdGhlIG9yaWdpbiB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoaXMgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBpbmNsdWRlcyB0aGUgWC1GcmFtZS1PcHRpb25zIEhUVFAgcmVzcG9uc2UgaGVhZGVyIGFuZCB0aGUgaGVhZGVy4oCZcyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUhlYWRlcnNGcmFtZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBYLUZyYW1lLU9wdGlvbnMgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqL1xuICByZWFkb25seSBmcmFtZU9wdGlvbjogSGVhZGVyc0ZyYW1lT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgdGhlIFgtRnJhbWUtT3B0aW9ucyBIVFRQIHJlc3BvbnNlIGhlYWRlclxuICAgKiByZWNlaXZlZCBmcm9tIHRoZSBvcmlnaW4gd2l0aCB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhlIFJlZmVycmVyLVBvbGljeSBIVFRQIHJlc3BvbnNlIGhlYWRlciBhbmQgdGhlIGhlYWRlcuKAmXMgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VIZWFkZXJzUmVmZXJyZXJQb2xpY3kge1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBSZWZlcnJlci1Qb2xpY3kgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqL1xuICByZWFkb25seSByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5O1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgdGhlIFJlZmVycmVyLVBvbGljeSBIVFRQIHJlc3BvbnNlIGhlYWRlclxuICAgKiByZWNlaXZlZCBmcm9tIHRoZSBvcmlnaW4gd2l0aCB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhlIFN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkgSFRUUCByZXNwb25zZSBoZWFkZXIgYW5kIHRoZSBoZWFkZXLigJlzIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlSGVhZGVyc1N0cmljdFRyYW5zcG9ydFNlY3VyaXR5IHtcbiAgLyoqXG4gICAqIEEgbnVtYmVyIHRoYXQgQ2xvdWRGcm9udCB1c2VzIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIG1heC1hZ2UgZGlyZWN0aXZlIGluIHRoZSBTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzQ29udHJvbE1heEFnZTogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBpbmNsdWRlU3ViRG9tYWlucyBkaXJlY3RpdmUgaW4gdGhlIFN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlU3ViZG9tYWlucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IG92ZXJyaWRlcyB0aGUgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBIVFRQIHJlc3BvbnNlIGhlYWRlclxuICAgKiByZWNlaXZlZCBmcm9tIHRoZSBvcmlnaW4gd2l0aCB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBwcmVsb2FkIGRpcmVjdGl2ZSBpbiB0aGUgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByZWxvYWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIEhUVFAgcmVzcG9uc2UgaGVhZGVyIGFuZCB0aGUgaGVhZGVy4oCZcyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUhlYWRlcnNYU1NQcm90ZWN0aW9uIHtcbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBtb2RlPWJsb2NrIGRpcmVjdGl2ZSBpbiB0aGUgWC1YU1MtUHJvdGVjdGlvbiBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBtb2RlQmxvY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgdGhlIFgtWFNTLVByb3RlY3Rpb24gSFRUUCByZXNwb25zZSBoZWFkZXJcbiAgICogcmVjZWl2ZWQgZnJvbSB0aGUgb3JpZ2luIHdpdGggdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhpcyByZXNwb25zZSBoZWFkZXJzIHBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHRoZSB2YWx1ZSBvZiB0aGUgWC1YU1MtUHJvdGVjdGlvbiBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICogV2hlbiB0aGlzIHNldHRpbmcgaXMgdHJ1ZSwgdGhlIHZhbHVlIG9mIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlciBpcyAxLlxuICAgKiBXaGVuIHRoaXMgc2V0dGluZyBpcyBmYWxzZSwgdGhlIHZhbHVlIG9mIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlciBpcyAwLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdGVjdGlvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByZXBvcnRpbmcgVVJJLCB3aGljaCBDbG91ZEZyb250IHVzZXMgYXMgdGhlIHZhbHVlIG9mIHRoZSByZXBvcnQgZGlyZWN0aXZlIGluIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlci5cbiAgICogWW91IGNhbm5vdCBzcGVjaWZ5IGEgUmVwb3J0VXJpIHdoZW4gTW9kZUJsb2NrIGlzIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVwb3J0IHVyaVxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0VXJpPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgWC1GcmFtZS1PcHRpb25zIEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICovXG5leHBvcnQgZW51bSBIZWFkZXJzRnJhbWVPcHRpb24ge1xuICAvKipcbiAgICogVGhlIHBhZ2UgY2FuIG9ubHkgYmUgZGlzcGxheWVkIGluIGEgZnJhbWUgb24gdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBwYWdlIGl0c2VsZi5cbiAgICovXG4gIERFTlkgPSBcIkRFTllcIixcblxuICAvKipcbiAgICogVGhlIHBhZ2UgY2FuIG9ubHkgYmUgZGlzcGxheWVkIGluIGEgZnJhbWUgb24gdGhlIHNwZWNpZmllZCBvcmlnaW4uXG4gICAqL1xuICBTQU1FT1JJR0lOID0gXCJTQU1FT1JJR0lOXCIsXG59XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBSZWZlcnJlci1Qb2xpY3kgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gKi9cbmV4cG9ydCBlbnVtIEhlYWRlcnNSZWZlcnJlclBvbGljeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVmZXJyZXIgcG9saWN5IGlzIG5vdCBzZXQuXG4gICAqL1xuICBOT19SRUZFUlJFUiA9IFwibm8tcmVmZXJyZXJcIixcblxuICAvKipcbiAgICogVGhlIHJlZmVycmVyIHBvbGljeSBpcyBuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZS5cbiAgICovXG4gIE5PX1JFRkVSUkVSX1dIRU5fRE9XTkdSQURFID0gXCJuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZVwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJyZXIgcG9saWN5IGlzIG9yaWdpbi5cbiAgICovXG4gIE9SSUdJTiA9IFwib3JpZ2luXCIsXG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcnJlciBwb2xpY3kgaXMgb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luLlxuICAgKi9cbiAgT1JJR0lOX1dIRU5fQ1JPU1NfT1JJR0lOID0gXCJvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW5cIixcblxuICAvKipcbiAgICogVGhlIHJlZmVycmVyIHBvbGljeSBpcyBzYW1lLW9yaWdpbi5cbiAgICovXG4gIFNBTUVfT1JJR0lOID0gXCJzYW1lLW9yaWdpblwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJyZXIgcG9saWN5IGlzIHN0cmljdC1vcmlnaW4uXG4gICAqL1xuICBTVFJJQ1RfT1JJR0lOID0gXCJzdHJpY3Qtb3JpZ2luXCIsXG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcnJlciBwb2xpY3kgaXMgc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbi5cbiAgICovXG4gIFNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU4gPSBcInN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW5cIixcblxuICAvKipcbiAgICogVGhlIHJlZmVycmVyIHBvbGljeSBpcyB1bnNhZmUtdXJsLlxuICAgKi9cbiAgVU5TQUZFX1VSTCA9IFwidW5zYWZlLXVybFwiLFxufVxuXG5mdW5jdGlvbiBoYXNNYXhEZWNpbWFsUGxhY2VzKG51bTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnRzID0gbnVtLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAxIHx8IHBhcnRzWzFdLmxlbmd0aCA8PSBkZWNpbWFscztcbn1cblxuLyoqXG4gKiBBIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5IGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWxcbiAqIEBsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjAuMC9kb2NzL2RhdGEtc291cmNlcy9jbG91ZGZyb250X3Jlc3BvbnNlX2hlYWRlcnNfcG9saWN5I2F3cy1tYW5hZ2VkLXBvbGljaWVzXG4gKi9cbmV4cG9ydCBlbnVtIE1hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kge1xuICAvKiogVXNlIHRoaXMgbWFuYWdlZCBwb2xpY3kgdG8gYWxsb3cgc2ltcGxlIENPUlMgcmVxdWVzdHMgZnJvbSBhbnkgb3JpZ2luLiAqL1xuICBDT1JTX0FMTE9XX0FMTF9PUklHSU5TID0gXCJNYW5hZ2VkLVNpbXBsZUNPUlNcIiwgLy82MDY2OTY1Mi00NTViLTRhZTktODVhNC1jNGMwMjM5M2Y4NmNcbiAgLyoqIFVzZSB0aGlzIG1hbmFnZWQgcG9saWN5IHRvIGFsbG93IENPUlMgcmVxdWVzdHMgZnJvbSBhbnkgb3JpZ2luLCBpbmNsdWRpbmcgcHJlZmxpZ2h0IHJlcXVlc3RzLiAqL1xuICBDT1JTX0FMTE9XX0FMTF9PUklHSU5TX1dJVEhfUFJFRkxJR0hUID0gXCJNYW5hZ2VkLUNPUlMtV2l0aC1QcmVmbGlnaHRcIiwgLy81Y2MzYjkwOC1lNjE5LTRiOTktODhlNS0yY2Y3ZjQ1OTY1YmRcbiAgLyoqIFVzZSB0aGlzIG1hbmFnZWQgcG9saWN5IHRvIGFkZCBhIHNldCBvZiBzZWN1cml0eSBoZWFkZXJzIHRvIGFsbCByZXNwb25zZXMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHZpZXdlcnMuICovXG4gIFNFQ1VSSVRZX0hFQURFUlMgPSBcIk1hbmFnZWQtU2VjdXJpdHlIZWFkZXJzUG9saWN5XCIsIC8vNjdmNzcyNWMtNmY5Ny00MjEwLTgyZDctNTUxMmIzMWU5ZDAzXG4gIC8qKiBVc2UgdGhpcyBtYW5hZ2VkIHBvbGljeSB0byBhbGxvdyBzaW1wbGUgQ09SUyByZXF1ZXN0cyBmcm9tIGFueSBvcmlnaW4gYW5kIGFkZCBhIHNldCBvZiBzZWN1cml0eSBoZWFkZXJzIHRvIGFsbCByZXNwb25zZXMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHZpZXdlcnMuICovXG4gIENPUlNfQUxMT1dfQUxMX09SSUdJTlNfQU5EX1NFQ1VSSVRZX0hFQURFUlMgPSBcIk1hbmFnZWQtQ09SUy1hbmQtU2VjdXJpdHlIZWFkZXJzUG9saWN5XCIsIC8vZTYxZWI2MGMtOWMzNS00ZDIwLWE5MjgtMmI4NGUwMmFmODljXG4gIC8qKiBVc2UgdGhpcyBtYW5hZ2VkIHBvbGljeSB0byBhbGxvdyBDT1JTIHJlcXVlc3RzIGZyb20gYW55IG9yaWdpbiwgaW5jbHVkaW5nIHByZWZsaWdodCByZXF1ZXN0cywgYW5kIGFkZCBhIHNldCBvZiBzZWN1cml0eSBoZWFkZXJzIHRvIGFsbCByZXNwb25zZXMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHZpZXdlcnMuICovXG4gIENPUlNfQUxMT1dfQUxMX09SSUdJTlNfV0lUSF9QUkVGTElHSFRfQU5EX1NFQ1VSSVRZX0hFQURFUlMgPSBcIk1hbmFnZWQtQ09SUy13aXRoLXByZWZsaWdodC1hbmQtU2VjdXJpdHlIZWFkZXJzUG9saWN5XCIsIC8vZWFhYjQzODEtZWQzMy00YTg2LTg4Y2EtZDk1NThkYzZjZDYzXG59XG4iXX0=