@microsoft/terraform-cdk-constructs 1.7.1 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/.jsii +46476 -27231
  2. package/API.md +68443 -28286
  3. package/lib/azure-actiongroup/lib/action-group.js +1 -1
  4. package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
  5. package/lib/azure-aks/lib/aks-cluster.js +1 -1
  6. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
  7. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
  8. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
  9. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
  10. package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
  11. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
  12. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
  13. package/lib/azure-dnszone/lib/dns-zone.js +1 -1
  14. package/lib/azure-dnszone/lib/index.d.ts +1 -0
  15. package/lib/azure-dnszone/lib/index.js +2 -1
  16. package/lib/azure-dnszone/lib/records/dns-record-schemas.d.ts +68 -0
  17. package/lib/azure-dnszone/lib/records/dns-record-schemas.js +813 -0
  18. package/lib/azure-dnszone/lib/records/dns-records.d.ts +688 -0
  19. package/lib/azure-dnszone/lib/records/dns-records.js +924 -0
  20. package/lib/azure-dnszone/lib/records/index.d.ts +19 -0
  21. package/lib/azure-dnszone/lib/records/index.js +38 -0
  22. package/lib/azure-dnszone/test/dns-records.integ.d.ts +21 -0
  23. package/lib/azure-dnszone/test/dns-records.integ.js +321 -0
  24. package/lib/azure-dnszone/test/dns-records.spec.d.ts +20 -0
  25. package/lib/azure-dnszone/test/dns-records.spec.js +950 -0
  26. package/lib/azure-loganalyticsworkspace/index.d.ts +6 -0
  27. package/lib/azure-loganalyticsworkspace/index.js +23 -0
  28. package/lib/azure-loganalyticsworkspace/lib/index.d.ts +5 -0
  29. package/lib/azure-loganalyticsworkspace/lib/index.js +22 -0
  30. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.d.ts +51 -0
  31. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.js +255 -0
  32. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.d.ts +301 -0
  33. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.js +213 -0
  34. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.d.ts +9 -0
  35. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.js +71 -0
  36. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.d.ts +8 -0
  37. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.js +504 -0
  38. package/lib/azure-metricalert/lib/metric-alert.js +1 -1
  39. package/lib/azure-networkinterface/lib/network-interface.js +1 -1
  40. package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
  41. package/lib/azure-networkwatcher/index.d.ts +14 -0
  42. package/lib/azure-networkwatcher/index.js +31 -0
  43. package/lib/azure-networkwatcher/lib/index.d.ts +5 -0
  44. package/lib/azure-networkwatcher/lib/index.js +22 -0
  45. package/lib/azure-networkwatcher/lib/network-watcher-schemas.d.ts +47 -0
  46. package/lib/azure-networkwatcher/lib/network-watcher-schemas.js +167 -0
  47. package/lib/azure-networkwatcher/lib/network-watcher.d.ts +181 -0
  48. package/lib/azure-networkwatcher/lib/network-watcher.js +187 -0
  49. package/lib/azure-networkwatcher/test/network-watcher.integ.d.ts +12 -0
  50. package/lib/azure-networkwatcher/test/network-watcher.integ.js +84 -0
  51. package/lib/azure-networkwatcher/test/network-watcher.spec.d.ts +8 -0
  52. package/lib/azure-networkwatcher/test/network-watcher.spec.js +312 -0
  53. package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
  54. package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
  55. package/lib/azure-policysetdefinition/index.d.ts +10 -0
  56. package/lib/azure-policysetdefinition/index.js +27 -0
  57. package/lib/azure-policysetdefinition/lib/index.d.ts +5 -0
  58. package/lib/azure-policysetdefinition/lib/index.js +22 -0
  59. package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.d.ts +50 -0
  60. package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.js +255 -0
  61. package/lib/azure-policysetdefinition/lib/policy-set-definition.d.ts +426 -0
  62. package/lib/azure-policysetdefinition/lib/policy-set-definition.js +255 -0
  63. package/lib/azure-policysetdefinition/test/policy-set-definition.integ.d.ts +9 -0
  64. package/lib/azure-policysetdefinition/test/policy-set-definition.integ.js +56 -0
  65. package/lib/azure-policysetdefinition/test/policy-set-definition.spec.d.ts +8 -0
  66. package/lib/azure-policysetdefinition/test/policy-set-definition.spec.js +745 -0
  67. package/lib/azure-privatednszone/lib/index.d.ts +1 -0
  68. package/lib/azure-privatednszone/lib/index.js +2 -1
  69. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +0 -2
  70. package/lib/azure-privatednszone/lib/private-dns-zone.js +6 -13
  71. package/lib/azure-privatednszone/lib/records/index.d.ts +7 -0
  72. package/lib/azure-privatednszone/lib/records/index.js +26 -0
  73. package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.d.ts +52 -0
  74. package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.js +683 -0
  75. package/lib/azure-privatednszone/lib/records/private-dns-records.d.ts +523 -0
  76. package/lib/azure-privatednszone/lib/records/private-dns-records.js +739 -0
  77. package/lib/azure-privatednszone/test/private-dns-records.integ.d.ts +19 -0
  78. package/lib/azure-privatednszone/test/private-dns-records.integ.js +245 -0
  79. package/lib/azure-privatednszone/test/private-dns-records.spec.d.ts +18 -0
  80. package/lib/azure-privatednszone/test/private-dns-records.spec.js +756 -0
  81. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +5 -5
  82. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
  83. package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
  84. package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
  85. package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
  86. package/lib/azure-roledefinition/lib/role-definition.js +1 -1
  87. package/lib/azure-storageaccount/lib/storage-account.js +1 -1
  88. package/lib/azure-subnet/lib/subnet.js +1 -1
  89. package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
  90. package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
  91. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +2 -2
  92. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +4 -2
  93. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +8 -5
  94. package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +109 -1
  95. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +1 -1
  96. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
  97. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
  98. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
  99. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
  100. package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
  101. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
  102. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
  103. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
  104. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +1 -1
  105. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
  106. package/lib/core-azure/lib/azapi/azapi-resource.js +4 -4
  107. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  108. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  109. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
  110. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  111. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  112. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  113. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
  114. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  115. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  116. package/lib/index.d.ts +23 -0
  117. package/lib/index.js +25 -2
  118. package/lib/testing/index.js +2 -2
  119. package/lib/testing/lib/cleanup.js +1 -1
  120. package/lib/testing/lib/metadata.js +1 -1
  121. package/package.json +1 -1
@@ -0,0 +1,739 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e, _f, _g, _h;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PrivateDnsTxtRecord = exports.PrivateDnsSrvRecord = exports.PrivateDnsSoaRecord = exports.PrivateDnsPtrRecord = exports.PrivateDnsMxRecord = exports.PrivateDnsCnameRecord = exports.PrivateDnsAaaaRecord = exports.PrivateDnsARecord = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ /**
7
+ * Azure Private DNS Zone Record implementations using AzapiResource framework
8
+ *
9
+ * This file provides implementations for all Private DNS Zone record types:
10
+ * - PrivateDnsARecord (A records with IPv4 addresses)
11
+ * - PrivateDnsAaaaRecord (AAAA records with IPv6 addresses)
12
+ * - PrivateDnsCnameRecord (CNAME records)
13
+ * - PrivateDnsMxRecord (MX records with exchange and preference)
14
+ * - PrivateDnsPtrRecord (PTR records)
15
+ * - PrivateDnsSoaRecord (SOA records)
16
+ * - PrivateDnsSrvRecord (SRV records with priority, weight, port, target)
17
+ * - PrivateDnsTxtRecord (TXT records)
18
+ *
19
+ * API Version: 2024-06-01
20
+ */
21
+ const cdktf = require("cdktf");
22
+ const private_dns_record_schemas_1 = require("./private-dns-record-schemas");
23
+ const azapi_resource_1 = require("../../../core-azure/lib/azapi/azapi-resource");
24
+ /**
25
+ * Azure Private DNS A Record implementation
26
+ *
27
+ * A records map a hostname to one or more IPv4 addresses.
28
+ *
29
+ * @example
30
+ * // Create an A record with multiple IP addresses:
31
+ * const aRecord = new PrivateDnsARecord(this, "web-a-record", {
32
+ * name: "www",
33
+ * privateDnsZoneId: zone.id,
34
+ * ttl: 300,
35
+ * records: [
36
+ * { ipv4Address: "10.0.1.4" },
37
+ * { ipv4Address: "10.0.1.5" },
38
+ * ],
39
+ * });
40
+ *
41
+ * @stability stable
42
+ */
43
+ class PrivateDnsARecord extends azapi_resource_1.AzapiResource {
44
+ constructor(scope, id, props) {
45
+ super(scope, id, props);
46
+ this.props = props;
47
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
48
+ value: this.id,
49
+ description: "The ID of the A Record",
50
+ });
51
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
52
+ value: `\${${this.terraformResource.fqn}.name}`,
53
+ description: "The name of the A Record",
54
+ });
55
+ this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
56
+ value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
57
+ description: "The FQDN of the A Record",
58
+ });
59
+ this.idOutput.overrideLogicalId("id");
60
+ this.nameOutput.overrideLogicalId("name");
61
+ this.fqdnOutput.overrideLogicalId("fqdn");
62
+ }
63
+ resolveParentId(props) {
64
+ const typedProps = props;
65
+ return typedProps.privateDnsZoneId;
66
+ }
67
+ defaultVersion() {
68
+ return "2024-06-01";
69
+ }
70
+ resourceType() {
71
+ return private_dns_record_schemas_1.PRIVATE_DNS_A_RECORD_TYPE;
72
+ }
73
+ apiSchema() {
74
+ return this.resolveSchema();
75
+ }
76
+ requiresLocation() {
77
+ return false;
78
+ }
79
+ supportsTags() {
80
+ return false;
81
+ }
82
+ createResourceBody(props) {
83
+ const typedProps = props;
84
+ const body = {
85
+ properties: {
86
+ ttl: typedProps.ttl ?? 3600,
87
+ aRecords: typedProps.records.map((r) => ({
88
+ ipv4Address: r.ipv4Address,
89
+ })),
90
+ },
91
+ };
92
+ if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
93
+ body.properties.metadata =
94
+ typedProps.metadata;
95
+ }
96
+ return body;
97
+ }
98
+ /**
99
+ * Get the FQDN of the record
100
+ */
101
+ get fqdn() {
102
+ return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
103
+ }
104
+ }
105
+ exports.PrivateDnsARecord = PrivateDnsARecord;
106
+ _a = JSII_RTTI_SYMBOL_1;
107
+ PrivateDnsARecord[_a] = { fqn: "@microsoft/terraform-cdk-constructs.PrivateDnsARecord", version: "1.9.0" };
108
+ (() => {
109
+ azapi_resource_1.AzapiResource.registerSchemas(private_dns_record_schemas_1.PRIVATE_DNS_A_RECORD_TYPE, private_dns_record_schemas_1.ALL_PRIVATE_DNS_A_RECORD_VERSIONS);
110
+ })();
111
+ /**
112
+ * Azure Private DNS AAAA Record implementation
113
+ *
114
+ * AAAA records map a hostname to one or more IPv6 addresses.
115
+ *
116
+ * @example
117
+ * // Create an AAAA record:
118
+ * const aaaaRecord = new PrivateDnsAaaaRecord(this, "web-aaaa-record", {
119
+ * name: "www",
120
+ * privateDnsZoneId: zone.id,
121
+ * ttl: 300,
122
+ * records: [
123
+ * { ipv6Address: "2001:db8::1" },
124
+ * ],
125
+ * });
126
+ *
127
+ * @stability stable
128
+ */
129
+ class PrivateDnsAaaaRecord extends azapi_resource_1.AzapiResource {
130
+ constructor(scope, id, props) {
131
+ super(scope, id, props);
132
+ this.props = props;
133
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
134
+ value: this.id,
135
+ description: "The ID of the AAAA Record",
136
+ });
137
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
138
+ value: `\${${this.terraformResource.fqn}.name}`,
139
+ description: "The name of the AAAA Record",
140
+ });
141
+ this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
142
+ value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
143
+ description: "The FQDN of the AAAA Record",
144
+ });
145
+ this.idOutput.overrideLogicalId("id");
146
+ this.nameOutput.overrideLogicalId("name");
147
+ this.fqdnOutput.overrideLogicalId("fqdn");
148
+ }
149
+ resolveParentId(props) {
150
+ const typedProps = props;
151
+ return typedProps.privateDnsZoneId;
152
+ }
153
+ defaultVersion() {
154
+ return "2024-06-01";
155
+ }
156
+ resourceType() {
157
+ return private_dns_record_schemas_1.PRIVATE_DNS_AAAA_RECORD_TYPE;
158
+ }
159
+ apiSchema() {
160
+ return this.resolveSchema();
161
+ }
162
+ requiresLocation() {
163
+ return false;
164
+ }
165
+ supportsTags() {
166
+ return false;
167
+ }
168
+ createResourceBody(props) {
169
+ const typedProps = props;
170
+ const body = {
171
+ properties: {
172
+ ttl: typedProps.ttl ?? 3600,
173
+ aaaaRecords: typedProps.records.map((r) => ({
174
+ ipv6Address: r.ipv6Address,
175
+ })),
176
+ },
177
+ };
178
+ if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
179
+ body.properties.metadata =
180
+ typedProps.metadata;
181
+ }
182
+ return body;
183
+ }
184
+ /**
185
+ * Get the FQDN of the record
186
+ */
187
+ get fqdn() {
188
+ return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
189
+ }
190
+ }
191
+ exports.PrivateDnsAaaaRecord = PrivateDnsAaaaRecord;
192
+ _b = JSII_RTTI_SYMBOL_1;
193
+ PrivateDnsAaaaRecord[_b] = { fqn: "@microsoft/terraform-cdk-constructs.PrivateDnsAaaaRecord", version: "1.9.0" };
194
+ (() => {
195
+ azapi_resource_1.AzapiResource.registerSchemas(private_dns_record_schemas_1.PRIVATE_DNS_AAAA_RECORD_TYPE, private_dns_record_schemas_1.ALL_PRIVATE_DNS_AAAA_RECORD_VERSIONS);
196
+ })();
197
+ /**
198
+ * Azure Private DNS CNAME Record implementation
199
+ *
200
+ * CNAME records create an alias from one hostname to another.
201
+ * Note: CNAME records cannot coexist with other record types at the same name.
202
+ *
203
+ * @example
204
+ * // Create a CNAME record:
205
+ * const cnameRecord = new PrivateDnsCnameRecord(this, "alias-record", {
206
+ * name: "app",
207
+ * privateDnsZoneId: zone.id,
208
+ * ttl: 3600,
209
+ * cname: "www.internal.example.com",
210
+ * });
211
+ *
212
+ * @stability stable
213
+ */
214
+ class PrivateDnsCnameRecord extends azapi_resource_1.AzapiResource {
215
+ constructor(scope, id, props) {
216
+ super(scope, id, props);
217
+ this.props = props;
218
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
219
+ value: this.id,
220
+ description: "The ID of the CNAME Record",
221
+ });
222
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
223
+ value: `\${${this.terraformResource.fqn}.name}`,
224
+ description: "The name of the CNAME Record",
225
+ });
226
+ this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
227
+ value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
228
+ description: "The FQDN of the CNAME Record",
229
+ });
230
+ this.idOutput.overrideLogicalId("id");
231
+ this.nameOutput.overrideLogicalId("name");
232
+ this.fqdnOutput.overrideLogicalId("fqdn");
233
+ }
234
+ resolveParentId(props) {
235
+ const typedProps = props;
236
+ return typedProps.privateDnsZoneId;
237
+ }
238
+ defaultVersion() {
239
+ return "2024-06-01";
240
+ }
241
+ resourceType() {
242
+ return private_dns_record_schemas_1.PRIVATE_DNS_CNAME_RECORD_TYPE;
243
+ }
244
+ apiSchema() {
245
+ return this.resolveSchema();
246
+ }
247
+ requiresLocation() {
248
+ return false;
249
+ }
250
+ supportsTags() {
251
+ return false;
252
+ }
253
+ createResourceBody(props) {
254
+ const typedProps = props;
255
+ const body = {
256
+ properties: {
257
+ ttl: typedProps.ttl ?? 3600,
258
+ cnameRecord: {
259
+ cname: typedProps.cname,
260
+ },
261
+ },
262
+ };
263
+ if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
264
+ body.properties.metadata =
265
+ typedProps.metadata;
266
+ }
267
+ return body;
268
+ }
269
+ /**
270
+ * Get the FQDN of the record
271
+ */
272
+ get fqdn() {
273
+ return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
274
+ }
275
+ }
276
+ exports.PrivateDnsCnameRecord = PrivateDnsCnameRecord;
277
+ _c = JSII_RTTI_SYMBOL_1;
278
+ PrivateDnsCnameRecord[_c] = { fqn: "@microsoft/terraform-cdk-constructs.PrivateDnsCnameRecord", version: "1.9.0" };
279
+ (() => {
280
+ azapi_resource_1.AzapiResource.registerSchemas(private_dns_record_schemas_1.PRIVATE_DNS_CNAME_RECORD_TYPE, private_dns_record_schemas_1.ALL_PRIVATE_DNS_CNAME_RECORD_VERSIONS);
281
+ })();
282
+ /**
283
+ * Azure Private DNS MX Record implementation
284
+ *
285
+ * MX records specify mail exchange servers for a domain.
286
+ *
287
+ * @example
288
+ * // Create an MX record:
289
+ * const mxRecord = new PrivateDnsMxRecord(this, "mail-record", {
290
+ * name: "@",
291
+ * privateDnsZoneId: zone.id,
292
+ * ttl: 3600,
293
+ * records: [
294
+ * { preference: 10, exchange: "mail1.internal.example.com" },
295
+ * { preference: 20, exchange: "mail2.internal.example.com" },
296
+ * ],
297
+ * });
298
+ *
299
+ * @stability stable
300
+ */
301
+ class PrivateDnsMxRecord extends azapi_resource_1.AzapiResource {
302
+ constructor(scope, id, props) {
303
+ super(scope, id, props);
304
+ this.props = props;
305
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
306
+ value: this.id,
307
+ description: "The ID of the MX Record",
308
+ });
309
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
310
+ value: `\${${this.terraformResource.fqn}.name}`,
311
+ description: "The name of the MX Record",
312
+ });
313
+ this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
314
+ value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
315
+ description: "The FQDN of the MX Record",
316
+ });
317
+ this.idOutput.overrideLogicalId("id");
318
+ this.nameOutput.overrideLogicalId("name");
319
+ this.fqdnOutput.overrideLogicalId("fqdn");
320
+ }
321
+ resolveParentId(props) {
322
+ const typedProps = props;
323
+ return typedProps.privateDnsZoneId;
324
+ }
325
+ defaultVersion() {
326
+ return "2024-06-01";
327
+ }
328
+ resourceType() {
329
+ return private_dns_record_schemas_1.PRIVATE_DNS_MX_RECORD_TYPE;
330
+ }
331
+ apiSchema() {
332
+ return this.resolveSchema();
333
+ }
334
+ requiresLocation() {
335
+ return false;
336
+ }
337
+ supportsTags() {
338
+ return false;
339
+ }
340
+ createResourceBody(props) {
341
+ const typedProps = props;
342
+ const body = {
343
+ properties: {
344
+ ttl: typedProps.ttl ?? 3600,
345
+ mxRecords: typedProps.records.map((r) => ({
346
+ preference: r.preference,
347
+ exchange: r.exchange,
348
+ })),
349
+ },
350
+ };
351
+ if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
352
+ body.properties.metadata =
353
+ typedProps.metadata;
354
+ }
355
+ return body;
356
+ }
357
+ /**
358
+ * Get the FQDN of the record
359
+ */
360
+ get fqdn() {
361
+ return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
362
+ }
363
+ }
364
+ exports.PrivateDnsMxRecord = PrivateDnsMxRecord;
365
+ _d = JSII_RTTI_SYMBOL_1;
366
+ PrivateDnsMxRecord[_d] = { fqn: "@microsoft/terraform-cdk-constructs.PrivateDnsMxRecord", version: "1.9.0" };
367
+ (() => {
368
+ azapi_resource_1.AzapiResource.registerSchemas(private_dns_record_schemas_1.PRIVATE_DNS_MX_RECORD_TYPE, private_dns_record_schemas_1.ALL_PRIVATE_DNS_MX_RECORD_VERSIONS);
369
+ })();
370
+ /**
371
+ * Azure Private DNS PTR Record implementation
372
+ *
373
+ * PTR records are used for reverse DNS lookups, mapping IP addresses to hostnames.
374
+ *
375
+ * @example
376
+ * // Create a PTR record:
377
+ * const ptrRecord = new PrivateDnsPtrRecord(this, "ptr-record", {
378
+ * name: "4.1.0.10.in-addr.arpa",
379
+ * privateDnsZoneId: reverseZone.id,
380
+ * ttl: 3600,
381
+ * records: [
382
+ * { ptrdname: "server1.internal.example.com" },
383
+ * ],
384
+ * });
385
+ *
386
+ * @stability stable
387
+ */
388
+ class PrivateDnsPtrRecord extends azapi_resource_1.AzapiResource {
389
+ constructor(scope, id, props) {
390
+ super(scope, id, props);
391
+ this.props = props;
392
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
393
+ value: this.id,
394
+ description: "The ID of the PTR Record",
395
+ });
396
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
397
+ value: `\${${this.terraformResource.fqn}.name}`,
398
+ description: "The name of the PTR Record",
399
+ });
400
+ this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
401
+ value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
402
+ description: "The FQDN of the PTR Record",
403
+ });
404
+ this.idOutput.overrideLogicalId("id");
405
+ this.nameOutput.overrideLogicalId("name");
406
+ this.fqdnOutput.overrideLogicalId("fqdn");
407
+ }
408
+ resolveParentId(props) {
409
+ const typedProps = props;
410
+ return typedProps.privateDnsZoneId;
411
+ }
412
+ defaultVersion() {
413
+ return "2024-06-01";
414
+ }
415
+ resourceType() {
416
+ return private_dns_record_schemas_1.PRIVATE_DNS_PTR_RECORD_TYPE;
417
+ }
418
+ apiSchema() {
419
+ return this.resolveSchema();
420
+ }
421
+ requiresLocation() {
422
+ return false;
423
+ }
424
+ supportsTags() {
425
+ return false;
426
+ }
427
+ createResourceBody(props) {
428
+ const typedProps = props;
429
+ const body = {
430
+ properties: {
431
+ ttl: typedProps.ttl ?? 3600,
432
+ ptrRecords: typedProps.records.map((r) => ({ ptrdname: r.ptrdname })),
433
+ },
434
+ };
435
+ if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
436
+ body.properties.metadata =
437
+ typedProps.metadata;
438
+ }
439
+ return body;
440
+ }
441
+ /**
442
+ * Get the FQDN of the record
443
+ */
444
+ get fqdn() {
445
+ return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
446
+ }
447
+ }
448
+ exports.PrivateDnsPtrRecord = PrivateDnsPtrRecord;
449
+ _e = JSII_RTTI_SYMBOL_1;
450
+ PrivateDnsPtrRecord[_e] = { fqn: "@microsoft/terraform-cdk-constructs.PrivateDnsPtrRecord", version: "1.9.0" };
451
+ (() => {
452
+ azapi_resource_1.AzapiResource.registerSchemas(private_dns_record_schemas_1.PRIVATE_DNS_PTR_RECORD_TYPE, private_dns_record_schemas_1.ALL_PRIVATE_DNS_PTR_RECORD_VERSIONS);
453
+ })();
454
+ /**
455
+ * Azure Private DNS SOA Record implementation
456
+ *
457
+ * SOA records contain administrative information about a DNS zone.
458
+ * Note: Each zone automatically has an SOA record; this is typically used to update it.
459
+ *
460
+ * @example
461
+ * // Update the SOA record:
462
+ * const soaRecord = new PrivateDnsSoaRecord(this, "soa-record", {
463
+ * name: "@",
464
+ * privateDnsZoneId: zone.id,
465
+ * ttl: 3600,
466
+ * soaRecord: {
467
+ * email: "admin.example.com",
468
+ * refreshTime: 3600,
469
+ * retryTime: 300,
470
+ * expireTime: 2419200,
471
+ * minimumTtl: 300,
472
+ * },
473
+ * });
474
+ *
475
+ * @stability stable
476
+ */
477
+ class PrivateDnsSoaRecord extends azapi_resource_1.AzapiResource {
478
+ constructor(scope, id, props) {
479
+ super(scope, id, props);
480
+ this.props = props;
481
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
482
+ value: this.id,
483
+ description: "The ID of the SOA Record",
484
+ });
485
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
486
+ value: `\${${this.terraformResource.fqn}.name}`,
487
+ description: "The name of the SOA Record",
488
+ });
489
+ this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
490
+ value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
491
+ description: "The FQDN of the SOA Record",
492
+ });
493
+ this.idOutput.overrideLogicalId("id");
494
+ this.nameOutput.overrideLogicalId("name");
495
+ this.fqdnOutput.overrideLogicalId("fqdn");
496
+ }
497
+ resolveParentId(props) {
498
+ const typedProps = props;
499
+ return typedProps.privateDnsZoneId;
500
+ }
501
+ defaultVersion() {
502
+ return "2024-06-01";
503
+ }
504
+ resourceType() {
505
+ return private_dns_record_schemas_1.PRIVATE_DNS_SOA_RECORD_TYPE;
506
+ }
507
+ apiSchema() {
508
+ return this.resolveSchema();
509
+ }
510
+ requiresLocation() {
511
+ return false;
512
+ }
513
+ supportsTags() {
514
+ return false;
515
+ }
516
+ createResourceBody(props) {
517
+ const typedProps = props;
518
+ const soaRecord = {};
519
+ if (typedProps.soaRecord.host !== undefined) {
520
+ soaRecord.host = typedProps.soaRecord.host;
521
+ }
522
+ if (typedProps.soaRecord.email !== undefined) {
523
+ soaRecord.email = typedProps.soaRecord.email;
524
+ }
525
+ if (typedProps.soaRecord.serialNumber !== undefined) {
526
+ soaRecord.serialNumber = typedProps.soaRecord.serialNumber;
527
+ }
528
+ if (typedProps.soaRecord.refreshTime !== undefined) {
529
+ soaRecord.refreshTime = typedProps.soaRecord.refreshTime;
530
+ }
531
+ if (typedProps.soaRecord.retryTime !== undefined) {
532
+ soaRecord.retryTime = typedProps.soaRecord.retryTime;
533
+ }
534
+ if (typedProps.soaRecord.expireTime !== undefined) {
535
+ soaRecord.expireTime = typedProps.soaRecord.expireTime;
536
+ }
537
+ if (typedProps.soaRecord.minimumTtl !== undefined) {
538
+ soaRecord.minimumTtl = typedProps.soaRecord.minimumTtl;
539
+ }
540
+ const body = {
541
+ properties: {
542
+ ttl: typedProps.ttl ?? 3600,
543
+ soaRecord: soaRecord,
544
+ },
545
+ };
546
+ if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
547
+ body.properties.metadata =
548
+ typedProps.metadata;
549
+ }
550
+ return body;
551
+ }
552
+ /**
553
+ * Get the FQDN of the record
554
+ */
555
+ get fqdn() {
556
+ return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
557
+ }
558
+ }
559
+ exports.PrivateDnsSoaRecord = PrivateDnsSoaRecord;
560
+ _f = JSII_RTTI_SYMBOL_1;
561
+ PrivateDnsSoaRecord[_f] = { fqn: "@microsoft/terraform-cdk-constructs.PrivateDnsSoaRecord", version: "1.9.0" };
562
+ (() => {
563
+ azapi_resource_1.AzapiResource.registerSchemas(private_dns_record_schemas_1.PRIVATE_DNS_SOA_RECORD_TYPE, private_dns_record_schemas_1.ALL_PRIVATE_DNS_SOA_RECORD_VERSIONS);
564
+ })();
565
+ /**
566
+ * Azure Private DNS SRV Record implementation
567
+ *
568
+ * SRV records specify the location of services like SIP, XMPP, etc.
569
+ *
570
+ * @example
571
+ * // Create an SRV record for a SIP service:
572
+ * const srvRecord = new PrivateDnsSrvRecord(this, "sip-record", {
573
+ * name: "_sip._tcp",
574
+ * privateDnsZoneId: zone.id,
575
+ * ttl: 3600,
576
+ * records: [
577
+ * { priority: 10, weight: 60, port: 5060, target: "sipserver1.internal.example.com" },
578
+ * { priority: 10, weight: 40, port: 5060, target: "sipserver2.internal.example.com" },
579
+ * ],
580
+ * });
581
+ *
582
+ * @stability stable
583
+ */
584
+ class PrivateDnsSrvRecord extends azapi_resource_1.AzapiResource {
585
+ constructor(scope, id, props) {
586
+ super(scope, id, props);
587
+ this.props = props;
588
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
589
+ value: this.id,
590
+ description: "The ID of the SRV Record",
591
+ });
592
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
593
+ value: `\${${this.terraformResource.fqn}.name}`,
594
+ description: "The name of the SRV Record",
595
+ });
596
+ this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
597
+ value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
598
+ description: "The FQDN of the SRV Record",
599
+ });
600
+ this.idOutput.overrideLogicalId("id");
601
+ this.nameOutput.overrideLogicalId("name");
602
+ this.fqdnOutput.overrideLogicalId("fqdn");
603
+ }
604
+ resolveParentId(props) {
605
+ const typedProps = props;
606
+ return typedProps.privateDnsZoneId;
607
+ }
608
+ defaultVersion() {
609
+ return "2024-06-01";
610
+ }
611
+ resourceType() {
612
+ return private_dns_record_schemas_1.PRIVATE_DNS_SRV_RECORD_TYPE;
613
+ }
614
+ apiSchema() {
615
+ return this.resolveSchema();
616
+ }
617
+ requiresLocation() {
618
+ return false;
619
+ }
620
+ supportsTags() {
621
+ return false;
622
+ }
623
+ createResourceBody(props) {
624
+ const typedProps = props;
625
+ const body = {
626
+ properties: {
627
+ ttl: typedProps.ttl ?? 3600,
628
+ srvRecords: typedProps.records.map((r) => ({
629
+ priority: r.priority,
630
+ weight: r.weight,
631
+ port: r.port,
632
+ target: r.target,
633
+ })),
634
+ },
635
+ };
636
+ if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
637
+ body.properties.metadata =
638
+ typedProps.metadata;
639
+ }
640
+ return body;
641
+ }
642
+ /**
643
+ * Get the FQDN of the record
644
+ */
645
+ get fqdn() {
646
+ return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
647
+ }
648
+ }
649
+ exports.PrivateDnsSrvRecord = PrivateDnsSrvRecord;
650
+ _g = JSII_RTTI_SYMBOL_1;
651
+ PrivateDnsSrvRecord[_g] = { fqn: "@microsoft/terraform-cdk-constructs.PrivateDnsSrvRecord", version: "1.9.0" };
652
+ (() => {
653
+ azapi_resource_1.AzapiResource.registerSchemas(private_dns_record_schemas_1.PRIVATE_DNS_SRV_RECORD_TYPE, private_dns_record_schemas_1.ALL_PRIVATE_DNS_SRV_RECORD_VERSIONS);
654
+ })();
655
+ /**
656
+ * Azure Private DNS TXT Record implementation
657
+ *
658
+ * TXT records store arbitrary text data, commonly used for SPF, DKIM, etc.
659
+ *
660
+ * @example
661
+ * // Create a TXT record for SPF:
662
+ * const txtRecord = new PrivateDnsTxtRecord(this, "spf-record", {
663
+ * name: "@",
664
+ * privateDnsZoneId: zone.id,
665
+ * ttl: 3600,
666
+ * records: [
667
+ * { value: ["v=spf1 include:spf.protection.outlook.com -all"] },
668
+ * ],
669
+ * });
670
+ *
671
+ * @stability stable
672
+ */
673
+ class PrivateDnsTxtRecord extends azapi_resource_1.AzapiResource {
674
+ constructor(scope, id, props) {
675
+ super(scope, id, props);
676
+ this.props = props;
677
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
678
+ value: this.id,
679
+ description: "The ID of the TXT Record",
680
+ });
681
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
682
+ value: `\${${this.terraformResource.fqn}.name}`,
683
+ description: "The name of the TXT Record",
684
+ });
685
+ this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
686
+ value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
687
+ description: "The FQDN of the TXT Record",
688
+ });
689
+ this.idOutput.overrideLogicalId("id");
690
+ this.nameOutput.overrideLogicalId("name");
691
+ this.fqdnOutput.overrideLogicalId("fqdn");
692
+ }
693
+ resolveParentId(props) {
694
+ const typedProps = props;
695
+ return typedProps.privateDnsZoneId;
696
+ }
697
+ defaultVersion() {
698
+ return "2024-06-01";
699
+ }
700
+ resourceType() {
701
+ return private_dns_record_schemas_1.PRIVATE_DNS_TXT_RECORD_TYPE;
702
+ }
703
+ apiSchema() {
704
+ return this.resolveSchema();
705
+ }
706
+ requiresLocation() {
707
+ return false;
708
+ }
709
+ supportsTags() {
710
+ return false;
711
+ }
712
+ createResourceBody(props) {
713
+ const typedProps = props;
714
+ const body = {
715
+ properties: {
716
+ ttl: typedProps.ttl ?? 3600,
717
+ txtRecords: typedProps.records.map((r) => ({ value: r.value })),
718
+ },
719
+ };
720
+ if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
721
+ body.properties.metadata =
722
+ typedProps.metadata;
723
+ }
724
+ return body;
725
+ }
726
+ /**
727
+ * Get the FQDN of the record
728
+ */
729
+ get fqdn() {
730
+ return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
731
+ }
732
+ }
733
+ exports.PrivateDnsTxtRecord = PrivateDnsTxtRecord;
734
+ _h = JSII_RTTI_SYMBOL_1;
735
+ PrivateDnsTxtRecord[_h] = { fqn: "@microsoft/terraform-cdk-constructs.PrivateDnsTxtRecord", version: "1.9.0" };
736
+ (() => {
737
+ azapi_resource_1.AzapiResource.registerSchemas(private_dns_record_schemas_1.PRIVATE_DNS_TXT_RECORD_TYPE, private_dns_record_schemas_1.ALL_PRIVATE_DNS_TXT_RECORD_VERSIONS);
738
+ })();
739
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS1kbnMtcmVjb3Jkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9henVyZS1wcml2YXRlZG5zem9uZS9saWIvcmVjb3Jkcy9wcml2YXRlLWRucy1yZWNvcmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCwrQkFBK0I7QUFFL0IsNkVBaUJzQztBQUN0QyxpRkFHc0Q7QUF5RHREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFhLGlCQUFrQixTQUFRLDhCQUFhO0lBYWxELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUNwRCxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDZCxXQUFXLEVBQUUsd0JBQXdCO1NBQ3RDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDeEQsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsUUFBUTtZQUMvQyxXQUFXLEVBQUUsMEJBQTBCO1NBQ3hDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDeEQsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsMEJBQTBCO1lBQ2pFLFdBQVcsRUFBRSwwQkFBMEI7U0FDeEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFD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QUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLElBQUk7UUFDYixPQUFPLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsMEJBQTBCLENBQUM7SUFDcEUsQ0FBQzs7QUFwRkgsa0RBcUZDOzs7QUFwRkM7SUFDRSw4QkFBYSxDQUFDLGVBQWUsQ0FDM0Isd0RBQTJCLEVBQzNCLGdFQUFtQyxDQUNwQyxDQUFDO0FBQ0osQ0FBQyxHQUFBLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF6dXJlIFByaXZhdGUgRE5TIFpvbmUgUmVjb3JkIGltcGxlbWVudGF0aW9ucyB1c2luZyBBemFwaVJlc291cmNlIGZyYW1ld29ya1xuICpcbiAqIFRoaXMgZmlsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIGFsbCBQcml2YXRlIEROUyBab25lIHJlY29yZCB0eXBlczpcbiAqIC0gUHJpdmF0ZURuc0FSZWNvcmQgKEEgcmVjb3JkcyB3aXRoIElQdjQgYWRkcmVzc2VzKVxuICogLSBQcml2YXRlRG5zQWFhYVJlY29yZCAoQUFBQSByZWNvcmRzIHdpdGggSVB2NiBhZGRyZXNzZXMpXG4gKiAtIFByaXZhdGVEbnNDbmFtZVJlY29yZCAoQ05BTUUgcmVjb3JkcylcbiAqIC0gUHJpdmF0ZURuc014UmVjb3JkIChNWCByZWNvcmRzIHdpdGggZXhjaGFuZ2UgYW5kIHByZWZlcmVuY2UpXG4gKiAtIFByaXZhdGVEbnNQdHJSZWNvcmQgKFBUUiByZWNvcmRzKVxuICogLSBQcml2YXRlRG5zU29hUmVjb3JkIChTT0EgcmVjb3JkcylcbiAqIC0gUHJpdmF0ZURuc1NydlJlY29yZCAoU1JWIHJlY29yZHMgd2l0aCBwcmlvcml0eSwgd2VpZ2h0LCBwb3J0LCB0YXJnZXQpXG4gKiAtIFByaXZhdGVEbnNUeHRSZWNvcmQgKFRYVCByZWNvcmRzKVxuICpcbiAqIEFQSSBWZXJzaW9uOiAyMDI0LTA2LTAxXG4gKi9cblxuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgQUxMX1BSSVZBVEVfRE5TX0FfUkVDT1JEX1ZFUlNJT05TLFxuICBBTExfUFJJVkFURV9ETlNfQUFBQV9SRUNPUkRfVkVSU0lPTlMsXG4gIEFMTF9QUklWQVRFX0ROU19DTkFNRV9SRUNPUkRfVkVSU0lPTlMsXG4gIEFMTF9QUklWQVRFX0ROU19NWF9SRUNPUkRfVkVSU0lPTlMsXG4gIEFMTF9QUklWQVRFX0ROU19QVFJfUkVDT1JEX1ZFUlNJT05TLFxuICBBTExfUFJJVkFURV9ETlNfU09BX1JFQ09SRF9WRVJTSU9OUyxcbiAgQUxMX1BSSVZBVEVfRE5TX1NSVl9SRUNPUkRfVkVSU0lPTlMsXG4gIEFMTF9QUklWQVRFX0ROU19UWFRfUkVDT1JEX1ZFUlNJT05TLFxuICBQUklWQVRFX0ROU19BX1JFQ09SRF9UWVBFLFxuICBQUklWQVRFX0ROU19BQUFBX1JFQ09SRF9UWVBFLFxuICBQUklWQVRFX0ROU19DTkFNRV9SRUNPUkRfVFlQRSxcbiAgUFJJVkFURV9ETlNfTVhfUkVDT1JEX1RZUEUsXG4gIFBSSVZBVEVfRE5TX1BUUl9SRUNPUkRfVFlQRSxcbiAgUFJJVkFURV9ETlNfU09BX1JFQ09SRF9UWVBFLFxuICBQUklWQVRFX0ROU19TUlZfUkVDT1JEX1RZUEUsXG4gIFBSSVZBVEVfRE5TX1RYVF9SRUNPUkRfVFlQRSxcbn0gZnJvbSBcIi4vcHJpdmF0ZS1kbnMtcmVjb3JkLXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBBcGlTY2hlbWEgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS1henVyZS9saWIvdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDT01NT04gSU5URVJGQUNFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCYXNlIHByb3BlcnRpZXMgc2hhcmVkIGJ5IGFsbCBQcml2YXRlIEROUyByZWNvcmQgdHlwZXNcbiAqXG4gKiBOb3RlOiBUaGUgYG5hbWVgIHByb3BlcnR5IGlzIGluaGVyaXRlZCBmcm9tIEF6YXBpUmVzb3VyY2VQcm9wcy5cbiAqIEZvciBETlMgcmVjb3JkcywgdXNlIEAgZm9yIGFwZXggcmVjb3JkcyBvciBwcm92aWRlIGEgcmVsYXRpdmUgbmFtZSBsaWtlIFwid3d3XCIgb3IgXCJtYWlsXCIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZURuc1JlY29yZEJhc2VQcm9wcyBleHRlbmRzIEF6YXBpUmVzb3VyY2VQcm9wcyB7XG4gIC8qKlxuICAgKiBSZXNvdXJjZSBJRCBvZiB0aGUgcGFyZW50IFByaXZhdGUgRE5TIFpvbmVcbiAgICogQGV4YW1wbGUgem9uZS5pZCBvciBcIi9zdWJzY3JpcHRpb25zLy4uLi9wcm92aWRlcnMvTWljcm9zb2Z0Lk5ldHdvcmsvcHJpdmF0ZURuc1pvbmVzL2V4YW1wbGUuY29tXCJcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVEbnNab25lSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGltZSB0byBMaXZlIGluIHNlY29uZHNcbiAgICogQGRlZmF1bHQgMzYwMFxuICAgKi9cbiAgcmVhZG9ubHkgdHRsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSByZWNvcmQgc2V0XG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBIFJFQ09SRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFbnRyeSBmb3IgYW4gQSByZWNvcmQgd2l0aCBJUHY0IGFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBUmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIElQdjQgYWRkcmVzcyBvZiB0aGlzIEEgcmVjb3JkXG4gICAqIEBleGFtcGxlIFwiMTAuMC4xLjRcIlxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NEFkZHJlc3M6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQcml2YXRlIEROUyBBIFJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVEbnNBUmVjb3JkUHJvcHMgZXh0ZW5kcyBQcml2YXRlRG5zUmVjb3JkQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEFycmF5IG9mIEEgcmVjb3JkcyB3aXRoIElQdjQgYWRkcmVzc2VzXG4gICAqL1xuICByZWFkb25seSByZWNvcmRzOiBBUmVjb3JkRW50cnlbXTtcbn1cblxuLyoqXG4gKiBBenVyZSBQcml2YXRlIEROUyBBIFJlY29yZCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIEEgcmVjb3JkcyBtYXAgYSBob3N0bmFtZSB0byBvbmUgb3IgbW9yZSBJUHY0IGFkZHJlc3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFuIEEgcmVjb3JkIHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzOlxuICogY29uc3QgYVJlY29yZCA9IG5ldyBQcml2YXRlRG5zQVJlY29yZCh0aGlzLCBcIndlYi1hLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwid3d3XCIsXG4gKiAgIHByaXZhdGVEbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzAwLFxuICogICByZWNvcmRzOiBbXG4gKiAgICAgeyBpcHY0QWRkcmVzczogXCIxMC4wLjEuNFwiIH0sXG4gKiAgICAgeyBpcHY0QWRkcmVzczogXCIxMC4wLjEuNVwiIH0sXG4gKiAgIF0sXG4gKiB9KTtcbiAqXG4gKiBAc3RhYmlsaXR5IHN0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZURuc0FSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIFBSSVZBVEVfRE5TX0FfUkVDT1JEX1RZUEUsXG4gICAgICBBTExfUFJJVkFURV9ETlNfQV9SRUNPUkRfVkVSU0lPTlMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogUHJpdmF0ZURuc0FSZWNvcmRQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBmcWRuT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFByaXZhdGVEbnNBUmVjb3JkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBBIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIEEgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgQSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLm5hbWVPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJuYW1lXCIpO1xuICAgIHRoaXMuZnFkbk91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImZxZG5cIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zQVJlY29yZFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLnByaXZhdGVEbnNab25lSWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCIyMDI0LTA2LTAxXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFBSSVZBVEVfRE5TX0FfUkVDT1JEX1RZUEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRzVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zQVJlY29yZFByb3BzO1xuICAgIGNvbnN0IGJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0IH0gPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHR0bDogdHlwZWRQcm9wcy50dGwgPz8gMzYwMCxcbiAgICAgICAgYVJlY29yZHM6IHR5cGVkUHJvcHMucmVjb3Jkcy5tYXAoKHIpID0+ICh7XG4gICAgICAgICAgaXB2NEFkZHJlc3M6IHIuaXB2NEFkZHJlc3MsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKHR5cGVkUHJvcHMubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIChib2R5LnByb3BlcnRpZXMgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pLm1ldGFkYXRhID1cbiAgICAgICAgdHlwZWRQcm9wcy5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEZRRE4gb2YgdGhlIHJlY29yZFxuICAgKi9cbiAgcHVibGljIGdldCBmcWRuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBQUFBIFJFQ09SRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFbnRyeSBmb3IgYW4gQUFBQSByZWNvcmQgd2l0aCBJUHY2IGFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBYWFhUmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIElQdjYgYWRkcmVzcyBvZiB0aGlzIEFBQUEgcmVjb3JkXG4gICAqIEBleGFtcGxlIFwiMjAwMTpkYjg6OjFcIlxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NkFkZHJlc3M6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQcml2YXRlIEROUyBBQUFBIFJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVEbnNBYWFhUmVjb3JkUHJvcHMgZXh0ZW5kcyBQcml2YXRlRG5zUmVjb3JkQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEFycmF5IG9mIEFBQUEgcmVjb3JkcyB3aXRoIElQdjYgYWRkcmVzc2VzXG4gICAqL1xuICByZWFkb25seSByZWNvcmRzOiBBYWFhUmVjb3JkRW50cnlbXTtcbn1cblxuLyoqXG4gKiBBenVyZSBQcml2YXRlIEROUyBBQUFBIFJlY29yZCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIEFBQUEgcmVjb3JkcyBtYXAgYSBob3N0bmFtZSB0byBvbmUgb3IgbW9yZSBJUHY2IGFkZHJlc3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFuIEFBQUEgcmVjb3JkOlxuICogY29uc3QgYWFhYVJlY29yZCA9IG5ldyBQcml2YXRlRG5zQWFhYVJlY29yZCh0aGlzLCBcIndlYi1hYWFhLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwid3d3XCIsXG4gKiAgIHByaXZhdGVEbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzAwLFxuICogICByZWNvcmRzOiBbXG4gKiAgICAgeyBpcHY2QWRkcmVzczogXCIyMDAxOmRiODo6MVwiIH0sXG4gKiAgIF0sXG4gKiB9KTtcbiAqXG4gKiBAc3RhYmlsaXR5IHN0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZURuc0FhYWFSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIFBSSVZBVEVfRE5TX0FBQUFfUkVDT1JEX1RZUEUsXG4gICAgICBBTExfUFJJVkFURV9ETlNfQUFBQV9SRUNPUkRfVkVSU0lPTlMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogUHJpdmF0ZURuc0FhYWFSZWNvcmRQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBmcWRuT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFByaXZhdGVEbnNBYWFhUmVjb3JkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBBQUFBIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIEFBQUEgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgQUFBQSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLm5hbWVPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJuYW1lXCIpO1xuICAgIHRoaXMuZnFkbk91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImZxZG5cIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zQWFhYVJlY29yZFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLnByaXZhdGVEbnNab25lSWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCIyMDI0LTA2LTAxXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFBSSVZBVEVfRE5TX0FBQUFfUkVDT1JEX1RZUEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRzVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zQWFhYVJlY29yZFByb3BzO1xuICAgIGNvbnN0IGJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0IH0gPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHR0bDogdHlwZWRQcm9wcy50dGwgPz8gMzYwMCxcbiAgICAgICAgYWFhYVJlY29yZHM6IHR5cGVkUHJvcHMucmVjb3Jkcy5tYXAoKHIpID0+ICh7XG4gICAgICAgICAgaXB2NkFkZHJlc3M6IHIuaXB2NkFkZHJlc3MsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKHR5cGVkUHJvcHMubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIChib2R5LnByb3BlcnRpZXMgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pLm1ldGFkYXRhID1cbiAgICAgICAgdHlwZWRQcm9wcy5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEZRRE4gb2YgdGhlIHJlY29yZFxuICAgKi9cbiAgcHVibGljIGdldCBmcWRuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDTkFNRSBSRUNPUkRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUHJpdmF0ZSBETlMgQ05BTUUgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZURuc0NuYW1lUmVjb3JkUHJvcHMgZXh0ZW5kcyBQcml2YXRlRG5zUmVjb3JkQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBjYW5vbmljYWwgbmFtZSBmb3IgdGhpcyBDTkFNRSByZWNvcmRcbiAgICogQGV4YW1wbGUgXCJ3d3cuY29udG9zby5jb21cIlxuICAgKi9cbiAgcmVhZG9ubHkgY25hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBenVyZSBQcml2YXRlIEROUyBDTkFNRSBSZWNvcmQgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBDTkFNRSByZWNvcmRzIGNyZWF0ZSBhbiBhbGlhcyBmcm9tIG9uZSBob3N0bmFtZSB0byBhbm90aGVyLlxuICogTm90ZTogQ05BTUUgcmVjb3JkcyBjYW5ub3QgY29leGlzdCB3aXRoIG90aGVyIHJlY29yZCB0eXBlcyBhdCB0aGUgc2FtZSBuYW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBDTkFNRSByZWNvcmQ6XG4gKiBjb25zdCBjbmFtZVJlY29yZCA9IG5ldyBQcml2YXRlRG5zQ25hbWVSZWNvcmQodGhpcywgXCJhbGlhcy1yZWNvcmRcIiwge1xuICogICBuYW1lOiBcImFwcFwiLFxuICogICBwcml2YXRlRG5zWm9uZUlkOiB6b25lLmlkLFxuICogICB0dGw6IDM2MDAsXG4gKiAgIGNuYW1lOiBcInd3dy5pbnRlcm5hbC5leGFtcGxlLmNvbVwiLFxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVEbnNDbmFtZVJlY29yZCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKFxuICAgICAgUFJJVkFURV9ETlNfQ05BTUVfUkVDT1JEX1RZUEUsXG4gICAgICBBTExfUFJJVkFURV9ETlNfQ05BTUVfUkVDT1JEX1ZFUlNJT05TLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgcHJvcHM6IFByaXZhdGVEbnNDbmFtZVJlY29yZFByb3BzO1xuICBwdWJsaWMgcmVhZG9ubHkgaWRPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IGZxZG5PdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUHJpdmF0ZURuc0NuYW1lUmVjb3JkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBDTkFNRSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBDTkFNRSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuZnFkbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJmcWRuXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBGUUROIG9mIHRoZSBDTkFNRSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLm5hbWVPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJuYW1lXCIpO1xuICAgIHRoaXMuZnFkbk91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImZxZG5cIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zQ25hbWVSZWNvcmRQcm9wcztcbiAgICByZXR1cm4gdHlwZWRQcm9wcy5wcml2YXRlRG5zWm9uZUlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiMjAyNC0wNi0wMVwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBQUklWQVRFX0ROU19DTkFNRV9SRUNPUkRfVFlQRTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWlyZXNMb2NhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3VwcG9ydHNUYWdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIFByaXZhdGVEbnNDbmFtZVJlY29yZFByb3BzO1xuICAgIGNvbnN0IGJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0IH0gPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHR0bDogdHlwZWRQcm9wcy50dGwgPz8gMzYwMCxcbiAgICAgICAgY25hbWVSZWNvcmQ6IHtcbiAgICAgICAgICBjbmFtZTogdHlwZWRQcm9wcy5jbmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKHR5cGVkUHJvcHMubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIChib2R5LnByb3BlcnRpZXMgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pLm1ldGFkYXRhID1cbiAgICAgICAgdHlwZWRQcm9wcy5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEZRRE4gb2YgdGhlIHJlY29yZFxuICAgKi9cbiAgcHVibGljIGdldCBmcWRuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNWCBSRUNPUkRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRW50cnkgZm9yIGFuIE1YIHJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE14UmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIHByZWZlcmVuY2UgdmFsdWUgZm9yIHRoaXMgTVggcmVjb3JkIChsb3dlciB2YWx1ZXMgaGF2ZSBoaWdoZXIgcHJpb3JpdHkpXG4gICAqIEBleGFtcGxlIDEwXG4gICAqL1xuICByZWFkb25seSBwcmVmZXJlbmNlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWlsIGV4Y2hhbmdlIHNlcnZlciBob3N0bmFtZVxuICAgKiBAZXhhbXBsZSBcIm1haWwxLmV4YW1wbGUuY29tXCJcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2hhbmdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUHJpdmF0ZSBETlMgTVggUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZURuc014UmVjb3JkUHJvcHMgZXh0ZW5kcyBQcml2YXRlRG5zUmVjb3JkQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEFycmF5IG9mIE1YIHJlY29yZHMgd2l0aCBleGNoYW5nZSBhbmQgcHJlZmVyZW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3JkczogTXhSZWNvcmRFbnRyeVtdO1xufVxuXG4vKipcbiAqIEF6dXJlIFByaXZhdGUgRE5TIE1YIFJlY29yZCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIE1YIHJlY29yZHMgc3BlY2lmeSBtYWlsIGV4Y2hhbmdlIHNlcnZlcnMgZm9yIGEgZG9tYWluLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYW4gTVggcmVjb3JkOlxuICogY29uc3QgbXhSZWNvcmQgPSBuZXcgUHJpdmF0ZURuc014UmVjb3JkKHRoaXMsIFwibWFpbC1yZWNvcmRcIiwge1xuICogICBuYW1lOiBcIkBcIixcbiAqICAgcHJpdmF0ZURuc1pvbmVJZDogem9uZS5pZCxcbiAqICAgdHRsOiAzNjAwLFxuICogICByZWNvcmRzOiBbXG4gKiAgICAgeyBwcmVmZXJlbmNlOiAxMCwgZXhjaGFuZ2U6IFwibWFpbDEuaW50ZXJuYWwuZXhhbXBsZS5jb21cIiB9LFxuICogICAgIHsgcHJlZmVyZW5jZTogMjAsIGV4Y2hhbmdlOiBcIm1haWwyLmludGVybmFsLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgXSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlRG5zTXhSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIFBSSVZBVEVfRE5TX01YX1JFQ09SRF9UWVBFLFxuICAgICAgQUxMX1BSSVZBVEVfRE5TX01YX1JFQ09SRF9WRVJTSU9OUyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHByb3BzOiBQcml2YXRlRG5zTXhSZWNvcmRQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBmcWRuT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFByaXZhdGVEbnNNeFJlY29yZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgTVggUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWVPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbmFtZSBvZiB0aGUgTVggUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgTVggUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmZxZG5PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJmcWRuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgUHJpdmF0ZURuc014UmVjb3JkUHJvcHM7XG4gICAgcmV0dXJuIHR5cGVkUHJvcHMucHJpdmF0ZURuc1pvbmVJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMjQtMDYtMDFcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gUFJJVkFURV9ETlNfTVhfUkVDT1JEX1RZUEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRzVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zTXhSZWNvcmRQcm9wcztcbiAgICBjb25zdCBib2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdCB9ID0ge1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICB0dGw6IHR5cGVkUHJvcHMudHRsID8/IDM2MDAsXG4gICAgICAgIG14UmVjb3JkczogdHlwZWRQcm9wcy5yZWNvcmRzLm1hcCgocikgPT4gKHtcbiAgICAgICAgICBwcmVmZXJlbmNlOiByLnByZWZlcmVuY2UsXG4gICAgICAgICAgZXhjaGFuZ2U6IHIuZXhjaGFuZ2UsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKHR5cGVkUHJvcHMubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIChib2R5LnByb3BlcnRpZXMgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pLm1ldGFkYXRhID1cbiAgICAgICAgdHlwZWRQcm9wcy5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEZRRE4gb2YgdGhlIHJlY29yZFxuICAgKi9cbiAgcHVibGljIGdldCBmcWRuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQVFIgUkVDT1JEXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVudHJ5IGZvciBhIFBUUiByZWNvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdHJSZWNvcmRFbnRyeSB7XG4gIC8qKlxuICAgKiBUaGUgUFRSIHRhcmdldCBkb21haW4gbmFtZVxuICAgKiBAZXhhbXBsZSBcInNlcnZlcjEuaW50ZXJuYWwuZXhhbXBsZS5jb21cIlxuICAgKi9cbiAgcmVhZG9ubHkgcHRyZG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQcml2YXRlIEROUyBQVFIgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZURuc1B0clJlY29yZFByb3BzIGV4dGVuZHMgUHJpdmF0ZURuc1JlY29yZEJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBQVFIgcmVjb3JkcyB3aXRoIHB0cmRuYW1lIHZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3JkczogUHRyUmVjb3JkRW50cnlbXTtcbn1cblxuLyoqXG4gKiBBenVyZSBQcml2YXRlIEROUyBQVFIgUmVjb3JkIGltcGxlbWVudGF0aW9uXG4gKlxuICogUFRSIHJlY29yZHMgYXJlIHVzZWQgZm9yIHJldmVyc2UgRE5TIGxvb2t1cHMsIG1hcHBpbmcgSVAgYWRkcmVzc2VzIHRvIGhvc3RuYW1lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgUFRSIHJlY29yZDpcbiAqIGNvbnN0IHB0clJlY29yZCA9IG5ldyBQcml2YXRlRG5zUHRyUmVjb3JkKHRoaXMsIFwicHRyLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwiNC4xLjAuMTAuaW4tYWRkci5hcnBhXCIsXG4gKiAgIHByaXZhdGVEbnNab25lSWQ6IHJldmVyc2Vab25lLmlkLFxuICogICB0dGw6IDM2MDAsXG4gKiAgIHJlY29yZHM6IFtcbiAqICAgICB7IHB0cmRuYW1lOiBcInNlcnZlcjEuaW50ZXJuYWwuZXhhbXBsZS5jb21cIiB9LFxuICogICBdLFxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVEbnNQdHJSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIFBSSVZBVEVfRE5TX1BUUl9SRUNPUkRfVFlQRSxcbiAgICAgIEFMTF9QUklWQVRFX0ROU19QVFJfUkVDT1JEX1ZFUlNJT05TLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgcHJvcHM6IFByaXZhdGVEbnNQdHJSZWNvcmRQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBmcWRuT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFByaXZhdGVEbnNQdHJSZWNvcmRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMuaWRPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiaWRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgSUQgb2YgdGhlIFBUUiBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBQVFIgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgUFRSIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pZE91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImlkXCIpO1xuICAgIHRoaXMubmFtZU91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcIm5hbWVcIik7XG4gICAgdGhpcy5mcWRuT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiZnFkblwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlUGFyZW50SWQocHJvcHM6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIFByaXZhdGVEbnNQdHJSZWNvcmRQcm9wcztcbiAgICByZXR1cm4gdHlwZWRQcm9wcy5wcml2YXRlRG5zWm9uZUlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiMjAyNC0wNi0wMVwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBQUklWQVRFX0ROU19QVFJfUkVDT1JEX1RZUEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRzVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zUHRyUmVjb3JkUHJvcHM7XG4gICAgY29uc3QgYm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3QgfSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdHRsOiB0eXBlZFByb3BzLnR0bCA/PyAzNjAwLFxuICAgICAgICBwdHJSZWNvcmRzOiB0eXBlZFByb3BzLnJlY29yZHMubWFwKChyKSA9PiAoeyBwdHJkbmFtZTogci5wdHJkbmFtZSB9KSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAodHlwZWRQcm9wcy5tZXRhZGF0YSAmJiBPYmplY3Qua2V5cyh0eXBlZFByb3BzLm1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAoYm9keS5wcm9wZXJ0aWVzIGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KS5tZXRhZGF0YSA9XG4gICAgICAgIHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBGUUROIG9mIHRoZSByZWNvcmRcbiAgICovXG4gIHB1YmxpYyBnZXQgZnFkbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU09BIFJFQ09SRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTT0EgcmVjb3JkIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2FSZWNvcmRDb25maWcge1xuICAvKipcbiAgICogVGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBhdXRob3JpdGF0aXZlIG5hbWUgc2VydmVyXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW1haWwgY29udGFjdCBmb3IgdGhpcyB6b25lICh3aXRoIEAgcmVwbGFjZWQgYnkgLilcbiAgICogQGV4YW1wbGUgXCJhZG1pbi5leGFtcGxlLmNvbVwiIChmb3IgYWRtaW5AZXhhbXBsZS5jb20pXG4gICAqL1xuICByZWFkb25seSBlbWFpbD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNlcmlhbCBudW1iZXIgZm9yIHRoaXMgem9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VyaWFsTnVtYmVyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmcmVzaCB0aW1lIGluIHNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IHJlZnJlc2hUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV0cnkgdGltZSBpbiBzZWNvbmRzXG4gICAqL1xuICByZWFkb25seSByZXRyeVRpbWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBleHBpcmUgdGltZSBpbiBzZWNvbmRzXG4gICAqL1xuICByZWFkb25seSBleHBpcmVUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBUVEwgaW4gc2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bVR0bD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQcml2YXRlIEROUyBTT0EgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZURuc1NvYVJlY29yZFByb3BzIGV4dGVuZHMgUHJpdmF0ZURuc1JlY29yZEJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBTT0EgcmVjb3JkIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHNvYVJlY29yZDogU29hUmVjb3JkQ29uZmlnO1xufVxuXG4vKipcbiAqIEF6dXJlIFByaXZhdGUgRE5TIFNPQSBSZWNvcmQgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBTT0EgcmVjb3JkcyBjb250YWluIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uIGFib3V0IGEgRE5TIHpvbmUuXG4gKiBOb3RlOiBFYWNoIHpvbmUgYXV0b21hdGljYWxseSBoYXMgYW4gU09BIHJlY29yZDsgdGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byB1cGRhdGUgaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFVwZGF0ZSB0aGUgU09BIHJlY29yZDpcbiAqIGNvbnN0IHNvYVJlY29yZCA9IG5ldyBQcml2YXRlRG5zU29hUmVjb3JkKHRoaXMsIFwic29hLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwiQFwiLFxuICogICBwcml2YXRlRG5zWm9uZUlkOiB6b25lLmlkLFxuICogICB0dGw6IDM2MDAsXG4gKiAgIHNvYVJlY29yZDoge1xuICogICAgIGVtYWlsOiBcImFkbWluLmV4YW1wbGUuY29tXCIsXG4gKiAgICAgcmVmcmVzaFRpbWU6IDM2MDAsXG4gKiAgICAgcmV0cnlUaW1lOiAzMDAsXG4gKiAgICAgZXhwaXJlVGltZTogMjQxOTIwMCxcbiAqICAgICBtaW5pbXVtVHRsOiAzMDAsXG4gKiAgIH0sXG4gKiB9KTtcbiAqXG4gKiBAc3RhYmlsaXR5IHN0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZURuc1NvYVJlY29yZCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKFxuICAgICAgUFJJVkFURV9ETlNfU09BX1JFQ09SRF9UWVBFLFxuICAgICAgQUxMX1BSSVZBVEVfRE5TX1NPQV9SRUNPUkRfVkVSU0lPTlMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogUHJpdmF0ZURuc1NvYVJlY29yZFByb3BzO1xuICBwdWJsaWMgcmVhZG9ubHkgaWRPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IGZxZG5PdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUHJpdmF0ZURuc1NvYVJlY29yZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgU09BIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIFNPQSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuZnFkbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJmcWRuXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBGUUROIG9mIHRoZSBTT0EgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmZxZG5PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJmcWRuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgUHJpdmF0ZURuc1NvYVJlY29yZFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLnByaXZhdGVEbnNab25lSWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCIyMDI0LTA2LTAxXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFBSSVZBVEVfRE5TX1NPQV9SRUNPUkRfVFlQRTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWlyZXNMb2NhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3VwcG9ydHNUYWdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIFByaXZhdGVEbnNTb2FSZWNvcmRQcm9wcztcbiAgICBjb25zdCBzb2FSZWNvcmQ6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge307XG5cbiAgICBpZiAodHlwZWRQcm9wcy5zb2FSZWNvcmQuaG9zdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb2FSZWNvcmQuaG9zdCA9IHR5cGVkUHJvcHMuc29hUmVjb3JkLmhvc3Q7XG4gICAgfVxuICAgIGlmICh0eXBlZFByb3BzLnNvYVJlY29yZC5lbWFpbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb2FSZWNvcmQuZW1haWwgPSB0eXBlZFByb3BzLnNvYVJlY29yZC5lbWFpbDtcbiAgICB9XG4gICAgaWYgKHR5cGVkUHJvcHMuc29hUmVjb3JkLnNlcmlhbE51bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb2FSZWNvcmQuc2VyaWFsTnVtYmVyID0gdHlwZWRQcm9wcy5zb2FSZWNvcmQuc2VyaWFsTnVtYmVyO1xuICAgIH1cbiAgICBpZiAodHlwZWRQcm9wcy5zb2FSZWNvcmQucmVmcmVzaFRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc29hUmVjb3JkLnJlZnJlc2hUaW1lID0gdHlwZWRQcm9wcy5zb2FSZWNvcmQucmVmcmVzaFRpbWU7XG4gICAgfVxuICAgIGlmICh0eXBlZFByb3BzLnNvYVJlY29yZC5yZXRyeVRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc29hUmVjb3JkLnJldHJ5VGltZSA9IHR5cGVkUHJvcHMuc29hUmVjb3JkLnJldHJ5VGltZTtcbiAgICB9XG4gICAgaWYgKHR5cGVkUHJvcHMuc29hUmVjb3JkLmV4cGlyZVRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc29hUmVjb3JkLmV4cGlyZVRpbWUgPSB0eXBlZFByb3BzLnNvYVJlY29yZC5leHBpcmVUaW1lO1xuICAgIH1cbiAgICBpZiAodHlwZWRQcm9wcy5zb2FSZWNvcmQubWluaW11bVR0bCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb2FSZWNvcmQubWluaW11bVR0bCA9IHR5cGVkUHJvcHMuc29hUmVjb3JkLm1pbmltdW1UdGw7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3QgfSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdHRsOiB0eXBlZFByb3BzLnR0bCA/PyAzNjAwLFxuICAgICAgICBzb2FSZWNvcmQ6IHNvYVJlY29yZCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKHR5cGVkUHJvcHMubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIChib2R5LnByb3BlcnRpZXMgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pLm1ldGFkYXRhID1cbiAgICAgICAgdHlwZWRQcm9wcy5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEZRRE4gb2YgdGhlIHJlY29yZFxuICAgKi9cbiAgcHVibGljIGdldCBmcWRuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTUlYgUkVDT1JEXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVudHJ5IGZvciBhbiBTUlYgcmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3J2UmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIHByaW9yaXR5IG9mIHRoaXMgU1JWIHJlY29yZCAobG93ZXIgdmFsdWVzIGhhdmUgaGlnaGVyIHByaW9yaXR5KVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpb3JpdHk6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHdlaWdodCBvZiB0aGlzIFNSViByZWNvcmQgKHVzZWQgZm9yIGxvYWQgYmFsYW5jaW5nIGFtb25nIHJlY29yZHMgd2l0aCBzYW1lIHByaW9yaXR5KVxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3J0IG51bWJlciBmb3IgdGhlIHNlcnZpY2VcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBob3N0bmFtZSBwcm92aWRpbmcgdGhlIHNlcnZpY2VcbiAgICogQGV4YW1wbGUgXCJzaXBzZXJ2ZXIuaW50ZXJuYWwuZXhhbXBsZS5jb21cIlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUHJpdmF0ZSBETlMgU1JWIFJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVEbnNTcnZSZWNvcmRQcm9wcyBleHRlbmRzIFByaXZhdGVEbnNSZWNvcmRCYXNlUHJvcHMge1xuICAvKipcbiAgICogQXJyYXkgb2YgU1JWIHJlY29yZHMgd2l0aCBwcmlvcml0eSwgd2VpZ2h0LCBwb3J0LCBhbmQgdGFyZ2V0XG4gICAqL1xuICByZWFkb25seSByZWNvcmRzOiBTcnZSZWNvcmRFbnRyeVtdO1xufVxuXG4vKipcbiAqIEF6dXJlIFByaXZhdGUgRE5TIFNSViBSZWNvcmQgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBTUlYgcmVjb3JkcyBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBzZXJ2aWNlcyBsaWtlIFNJUCwgWE1QUCwgZXRjLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYW4gU1JWIHJlY29yZCBmb3IgYSBTSVAgc2VydmljZTpcbiAqIGNvbnN0IHNydlJlY29yZCA9IG5ldyBQcml2YXRlRG5zU3J2UmVjb3JkKHRoaXMsIFwic2lwLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwiX3NpcC5fdGNwXCIsXG4gKiAgIHByaXZhdGVEbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzYwMCxcbiAqICAgcmVjb3JkczogW1xuICogICAgIHsgcHJpb3JpdHk6IDEwLCB3ZWlnaHQ6IDYwLCBwb3J0OiA1MDYwLCB0YXJnZXQ6IFwic2lwc2VydmVyMS5pbnRlcm5hbC5leGFtcGxlLmNvbVwiIH0sXG4gKiAgICAgeyBwcmlvcml0eTogMTAsIHdlaWdodDogNDAsIHBvcnQ6IDUwNjAsIHRhcmdldDogXCJzaXBzZXJ2ZXIyLmludGVybmFsLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgXSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlRG5zU3J2UmVjb3JkIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gIHN0YXRpYyB7XG4gICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoXG4gICAgICBQUklWQVRFX0ROU19TUlZfUkVDT1JEX1RZUEUsXG4gICAgICBBTExfUFJJVkFURV9ETlNfU1JWX1JFQ09SRF9WRVJTSU9OUyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHByb3BzOiBQcml2YXRlRG5zU3J2UmVjb3JkUHJvcHM7XG4gIHB1YmxpYyByZWFkb25seSBpZE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZU91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgZnFkbk91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQcml2YXRlRG5zU3J2UmVjb3JkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBTUlYgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWVPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbmFtZSBvZiB0aGUgU1JWIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mcWRuT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImZxZG5cIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIEZRRE4gb2YgdGhlIFNSViBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLm5hbWVPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJuYW1lXCIpO1xuICAgIHRoaXMuZnFkbk91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImZxZG5cIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zU3J2UmVjb3JkUHJvcHM7XG4gICAgcmV0dXJuIHR5cGVkUHJvcHMucHJpdmF0ZURuc1pvbmVJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMjQtMDYtMDFcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gUFJJVkFURV9ETlNfU1JWX1JFQ09SRF9UWVBFO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFwaVNjaGVtYSgpOiBBcGlTY2hlbWEge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTY2hlbWEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdXBwb3J0c1RhZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc291cmNlQm9keShwcm9wczogYW55KTogYW55IHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgUHJpdmF0ZURuc1NydlJlY29yZFByb3BzO1xuICAgIGNvbnN0IGJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0IH0gPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHR0bDogdHlwZWRQcm9wcy50dGwgPz8gMzYwMCxcbiAgICAgICAgc3J2UmVjb3JkczogdHlwZWRQcm9wcy5yZWNvcmRzLm1hcCgocikgPT4gKHtcbiAgICAgICAgICBwcmlvcml0eTogci5wcmlvcml0eSxcbiAgICAgICAgICB3ZWlnaHQ6IHIud2VpZ2h0LFxuICAgICAgICAgIHBvcnQ6IHIucG9ydCxcbiAgICAgICAgICB0YXJnZXQ6IHIudGFyZ2V0LFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAodHlwZWRQcm9wcy5tZXRhZGF0YSAmJiBPYmplY3Qua2V5cyh0eXBlZFByb3BzLm1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAoYm9keS5wcm9wZXJ0aWVzIGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KS5tZXRhZGF0YSA9XG4gICAgICAgIHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBGUUROIG9mIHRoZSByZWNvcmRcbiAgICovXG4gIHB1YmxpYyBnZXQgZnFkbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFhUIFJFQ09SRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFbnRyeSBmb3IgYSBUWFQgcmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHh0UmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhpcyBUWFQgcmVjb3JkIChhcnJheSBvZiBzdHJpbmdzLCBlYWNoIHVwIHRvIDI1NSBjaGFycylcbiAgICogTG9uZyB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkgc3BsaXQgaW50byBtdWx0aXBsZSBzdHJpbmdzXG4gICAqIEBleGFtcGxlIFtcInY9c3BmMSBpbmNsdWRlOnNwZi5wcm90ZWN0aW9uLm91dGxvb2suY29tIC1hbGxcIl1cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQcml2YXRlIEROUyBUWFQgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZURuc1R4dFJlY29yZFByb3BzIGV4dGVuZHMgUHJpdmF0ZURuc1JlY29yZEJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBUWFQgcmVjb3JkcyB3aXRoIHN0cmluZyB2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZHM6IFR4dFJlY29yZEVudHJ5W107XG59XG5cbi8qKlxuICogQXp1cmUgUHJpdmF0ZSBETlMgVFhUIFJlY29yZCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFRYVCByZWNvcmRzIHN0b3JlIGFyYml0cmFyeSB0ZXh0IGRhdGEsIGNvbW1vbmx5IHVzZWQgZm9yIFNQRiwgREtJTSwgZXRjLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBUWFQgcmVjb3JkIGZvciBTUEY6XG4gKiBjb25zdCB0eHRSZWNvcmQgPSBuZXcgUHJpdmF0ZURuc1R4dFJlY29yZCh0aGlzLCBcInNwZi1yZWNvcmRcIiwge1xuICogICBuYW1lOiBcIkBcIixcbiAqICAgcHJpdmF0ZURuc1pvbmVJZDogem9uZS5pZCxcbiAqICAgdHRsOiAzNjAwLFxuICogICByZWNvcmRzOiBbXG4gKiAgICAgeyB2YWx1ZTogW1widj1zcGYxIGluY2x1ZGU6c3BmLnByb3RlY3Rpb24ub3V0bG9vay5jb20gLWFsbFwiXSB9LFxuICogICBdLFxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVEbnNUeHRSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIFBSSVZBVEVfRE5TX1RYVF9SRUNPUkRfVFlQRSxcbiAgICAgIEFMTF9QUklWQVRFX0ROU19UWFRfUkVDT1JEX1ZFUlNJT05TLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgcHJvcHM6IFByaXZhdGVEbnNUeHRSZWNvcmRQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBmcWRuT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFByaXZhdGVEbnNUeHRSZWNvcmRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMuaWRPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiaWRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgSUQgb2YgdGhlIFRYVCBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBUWFQgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgVFhUIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pZE91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImlkXCIpO1xuICAgIHRoaXMubmFtZU91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcIm5hbWVcIik7XG4gICAgdGhpcy5mcWRuT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiZnFkblwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlUGFyZW50SWQocHJvcHM6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIFByaXZhdGVEbnNUeHRSZWNvcmRQcm9wcztcbiAgICByZXR1cm4gdHlwZWRQcm9wcy5wcml2YXRlRG5zWm9uZUlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiMjAyNC0wNi0wMVwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBQUklWQVRFX0ROU19UWFRfUkVDT1JEX1RZUEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRzVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQcml2YXRlRG5zVHh0UmVjb3JkUHJvcHM7XG4gICAgY29uc3QgYm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3QgfSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdHRsOiB0eXBlZFByb3BzLnR0bCA/PyAzNjAwLFxuICAgICAgICB0eHRSZWNvcmRzOiB0eXBlZFByb3BzLnJlY29yZHMubWFwKChyKSA9PiAoeyB2YWx1ZTogci52YWx1ZSB9KSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAodHlwZWRQcm9wcy5tZXRhZGF0YSAmJiBPYmplY3Qua2V5cyh0eXBlZFByb3BzLm1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAoYm9keS5wcm9wZXJ0aWVzIGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KS5tZXRhZGF0YSA9XG4gICAgICAgIHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBGUUROIG9mIHRoZSByZWNvcmRcbiAgICovXG4gIHB1YmxpYyBnZXQgZnFkbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YDtcbiAgfVxufVxuIl19