@microsoft/terraform-cdk-constructs 1.3.1 → 1.5.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.
- package/.jsii +32238 -27310
- package/API.md +43714 -35942
- package/lib/azure-actiongroup/lib/action-group.js +1 -1
- package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
- package/lib/azure-aks/lib/aks-cluster.js +1 -1
- package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
- package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
- package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
- package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
- package/lib/azure-dnszone/lib/dns-zone.js +1 -1
- package/lib/azure-metricalert/lib/metric-alert.js +1 -1
- package/lib/azure-networkinterface/lib/network-interface.js +1 -1
- package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
- package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
- package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
- package/lib/azure-privatednszone/lib/private-dns-zone.js +1 -1
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
- package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
- package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
- package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
- package/lib/azure-roledefinition/lib/role-definition.js +1 -1
- package/lib/azure-storageaccount/lib/storage-account.js +1 -1
- package/lib/azure-subnet/lib/subnet.js +1 -1
- package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
- package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
- package/lib/azure-virtualnetworkgateway/index.d.ts +4 -0
- package/lib/azure-virtualnetworkgateway/index.js +21 -0
- package/lib/azure-virtualnetworkgateway/lib/index.d.ts +5 -0
- package/lib/azure-virtualnetworkgateway/lib/index.js +22 -0
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +298 -0
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +368 -0
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +285 -0
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.integ.d.ts +12 -0
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.integ.js +129 -0
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.d.ts +8 -0
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +691 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/index.d.ts +5 -0
- package/lib/azure-virtualnetworkmanager/lib/index.js +6 -1
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-schemas.d.ts +24 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-schemas.js +169 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr-schemas.js +206 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.d.ts +170 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +214 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool.d.ts +175 -0
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +206 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/utils/cidr-validator.d.ts +225 -0
- package/lib/azure-virtualnetworkmanager/lib/utils/cidr-validator.js +389 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +56 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +29 -2
- package/lib/azure-virtualnetworkmanager/test/cidr-validator.spec.d.ts +6 -0
- package/lib/azure-virtualnetworkmanager/test/cidr-validator.spec.js +292 -0
- package/lib/azure-virtualnetworkmanager/test/ipam-pool-static-cidr.spec.d.ts +6 -0
- package/lib/azure-virtualnetworkmanager/test/ipam-pool-static-cidr.spec.js +430 -0
- package/lib/azure-virtualnetworkmanager/test/ipam-pool.spec.d.ts +6 -0
- package/lib/azure-virtualnetworkmanager/test/ipam-pool.spec.js +372 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +2 -1
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +30 -3
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +105 -1
- package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
- package/lib/core-azure/lib/azapi/azapi-resource.js +2 -2
- package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
- package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
- package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
- package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
- package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
- package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
- package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
- package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
- package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
- package/lib/index.d.ts +2 -0
- package/lib/index.js +4 -2
- package/lib/testing/index.js +2 -2
- package/lib/testing/lib/cleanup.js +1 -1
- package/lib/testing/lib/metadata.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.VirtualNetworkGateway = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
/**
|
|
7
|
+
* Azure Virtual Network Gateway implementation using AzapiResource framework
|
|
8
|
+
*
|
|
9
|
+
* This class provides a unified implementation for Azure Virtual Network Gateways that
|
|
10
|
+
* automatically handles version management, schema validation, and property
|
|
11
|
+
* transformation across all supported API versions.
|
|
12
|
+
*
|
|
13
|
+
* Supported API Versions:
|
|
14
|
+
* - 2024-01-01 (Active)
|
|
15
|
+
* - 2024-05-01 (Active, Latest)
|
|
16
|
+
*
|
|
17
|
+
* Features:
|
|
18
|
+
* - Automatic latest version resolution when no version is specified
|
|
19
|
+
* - Explicit version pinning for stability requirements
|
|
20
|
+
* - Schema-driven validation and transformation
|
|
21
|
+
* - Full backward compatibility
|
|
22
|
+
* - JSII compliance for multi-language support
|
|
23
|
+
*/
|
|
24
|
+
const cdktf = require("cdktf");
|
|
25
|
+
const virtual_network_gateway_schemas_1 = require("./virtual-network-gateway-schemas");
|
|
26
|
+
const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
|
|
27
|
+
/**
|
|
28
|
+
* Azure Virtual Network Gateway implementation
|
|
29
|
+
*
|
|
30
|
+
* This class provides a single, version-aware implementation that replaces
|
|
31
|
+
* version-specific Virtual Network Gateway classes. It automatically handles version
|
|
32
|
+
* resolution, schema validation, and property transformation while maintaining
|
|
33
|
+
* full backward compatibility.
|
|
34
|
+
*
|
|
35
|
+
* Virtual Network Gateways are used to send encrypted traffic between Azure virtual
|
|
36
|
+
* networks and on-premises locations over the public Internet (VPN) or through
|
|
37
|
+
* Azure ExpressRoute circuits (ExpressRoute).
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* // Basic VPN Gateway:
|
|
41
|
+
* const vpnGateway = new VirtualNetworkGateway(this, "vpnGateway", {
|
|
42
|
+
* name: "my-vpn-gateway",
|
|
43
|
+
* location: "eastus",
|
|
44
|
+
* resourceGroupId: resourceGroup.id,
|
|
45
|
+
* gatewayType: "Vpn",
|
|
46
|
+
* vpnType: "RouteBased",
|
|
47
|
+
* sku: {
|
|
48
|
+
* name: "VpnGw1",
|
|
49
|
+
* tier: "VpnGw1"
|
|
50
|
+
* },
|
|
51
|
+
* ipConfigurations: [{
|
|
52
|
+
* name: "default",
|
|
53
|
+
* subnetId: gatewaySubnet.id,
|
|
54
|
+
* publicIPAddressId: publicIp.id
|
|
55
|
+
* }]
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* // VPN Gateway with BGP:
|
|
60
|
+
* const vpnGateway = new VirtualNetworkGateway(this, "vpnGateway", {
|
|
61
|
+
* name: "my-vpn-gateway-bgp",
|
|
62
|
+
* location: "eastus",
|
|
63
|
+
* resourceGroupId: resourceGroup.id,
|
|
64
|
+
* gatewayType: "Vpn",
|
|
65
|
+
* vpnType: "RouteBased",
|
|
66
|
+
* sku: {
|
|
67
|
+
* name: "VpnGw1",
|
|
68
|
+
* tier: "VpnGw1"
|
|
69
|
+
* },
|
|
70
|
+
* enableBgp: true,
|
|
71
|
+
* bgpSettings: {
|
|
72
|
+
* asn: 65515,
|
|
73
|
+
* peerWeight: 0
|
|
74
|
+
* },
|
|
75
|
+
* ipConfigurations: [{
|
|
76
|
+
* name: "default",
|
|
77
|
+
* subnetId: gatewaySubnet.id,
|
|
78
|
+
* publicIPAddressId: publicIp.id
|
|
79
|
+
* }]
|
|
80
|
+
* });
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* // Active-Active VPN Gateway:
|
|
84
|
+
* const vpnGateway = new VirtualNetworkGateway(this, "vpnGateway", {
|
|
85
|
+
* name: "my-vpn-gateway-aa",
|
|
86
|
+
* location: "eastus",
|
|
87
|
+
* resourceGroupId: resourceGroup.id,
|
|
88
|
+
* gatewayType: "Vpn",
|
|
89
|
+
* vpnType: "RouteBased",
|
|
90
|
+
* sku: {
|
|
91
|
+
* name: "VpnGw1",
|
|
92
|
+
* tier: "VpnGw1"
|
|
93
|
+
* },
|
|
94
|
+
* activeActive: true,
|
|
95
|
+
* ipConfigurations: [
|
|
96
|
+
* {
|
|
97
|
+
* name: "config1",
|
|
98
|
+
* subnetId: gatewaySubnet.id,
|
|
99
|
+
* publicIPAddressId: publicIp1.id
|
|
100
|
+
* },
|
|
101
|
+
* {
|
|
102
|
+
* name: "config2",
|
|
103
|
+
* subnetId: gatewaySubnet.id,
|
|
104
|
+
* publicIPAddressId: publicIp2.id
|
|
105
|
+
* }
|
|
106
|
+
* ]
|
|
107
|
+
* });
|
|
108
|
+
*
|
|
109
|
+
* @stability stable
|
|
110
|
+
*/
|
|
111
|
+
class VirtualNetworkGateway extends azapi_resource_1.AzapiResource {
|
|
112
|
+
/**
|
|
113
|
+
* Creates a new Azure Virtual Network Gateway using the AzapiResource framework
|
|
114
|
+
*
|
|
115
|
+
* The constructor automatically handles version resolution, schema registration,
|
|
116
|
+
* validation, and resource creation. It maintains full backward compatibility
|
|
117
|
+
* with existing Virtual Network Gateway implementations.
|
|
118
|
+
*
|
|
119
|
+
* @param scope - The scope in which to define this construct
|
|
120
|
+
* @param id - The unique identifier for this instance
|
|
121
|
+
* @param props - Configuration properties for the Virtual Network Gateway
|
|
122
|
+
*/
|
|
123
|
+
constructor(scope, id, props) {
|
|
124
|
+
super(scope, id, props);
|
|
125
|
+
this.props = props;
|
|
126
|
+
// Add extended timeouts for gateway provisioning (30-45 minutes typical)
|
|
127
|
+
this.terraformResource.addOverride("timeouts", {
|
|
128
|
+
create: "60m",
|
|
129
|
+
update: "60m",
|
|
130
|
+
delete: "60m",
|
|
131
|
+
});
|
|
132
|
+
// Create Terraform outputs for easy access and referencing from other resources
|
|
133
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
134
|
+
value: this.id,
|
|
135
|
+
description: "The ID of the Virtual Network Gateway",
|
|
136
|
+
});
|
|
137
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
138
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
139
|
+
description: "The name of the Virtual Network Gateway",
|
|
140
|
+
});
|
|
141
|
+
this.locationOutput = new cdktf.TerraformOutput(this, "location", {
|
|
142
|
+
value: `\${${this.terraformResource.fqn}.location}`,
|
|
143
|
+
description: "The location of the Virtual Network Gateway",
|
|
144
|
+
});
|
|
145
|
+
this.tagsOutput = new cdktf.TerraformOutput(this, "tags", {
|
|
146
|
+
value: `\${${this.terraformResource.fqn}.tags}`,
|
|
147
|
+
description: "The tags assigned to the Virtual Network Gateway",
|
|
148
|
+
});
|
|
149
|
+
// Override logical IDs to match original naming convention
|
|
150
|
+
this.idOutput.overrideLogicalId("id");
|
|
151
|
+
this.nameOutput.overrideLogicalId("name");
|
|
152
|
+
this.locationOutput.overrideLogicalId("location");
|
|
153
|
+
this.tagsOutput.overrideLogicalId("tags");
|
|
154
|
+
// Apply ignore changes if specified
|
|
155
|
+
this._applyIgnoreChanges();
|
|
156
|
+
}
|
|
157
|
+
// =============================================================================
|
|
158
|
+
// REQUIRED ABSTRACT METHODS FROM VersionedAzapiResource
|
|
159
|
+
// =============================================================================
|
|
160
|
+
/**
|
|
161
|
+
* Gets the default API version to use when no explicit version is specified
|
|
162
|
+
* Returns the most recent stable version as the default
|
|
163
|
+
*/
|
|
164
|
+
defaultVersion() {
|
|
165
|
+
return "2024-05-01";
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Gets the Azure resource type for Virtual Network Gateways
|
|
169
|
+
*/
|
|
170
|
+
resourceType() {
|
|
171
|
+
return virtual_network_gateway_schemas_1.VIRTUAL_NETWORK_GATEWAY_TYPE;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Gets the API schema for the resolved version
|
|
175
|
+
* Uses the framework's schema resolution to get the appropriate schema
|
|
176
|
+
*/
|
|
177
|
+
apiSchema() {
|
|
178
|
+
return this.resolveSchema();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Indicates that location is required for Virtual Network Gateways
|
|
182
|
+
*/
|
|
183
|
+
requiresLocation() {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Creates the resource body for the Azure API call
|
|
188
|
+
* Transforms the input properties into the JSON format expected by Azure REST API
|
|
189
|
+
*/
|
|
190
|
+
createResourceBody(props) {
|
|
191
|
+
const typedProps = props;
|
|
192
|
+
// Transform IP configurations to Azure API format
|
|
193
|
+
const ipConfigurations = typedProps.ipConfigurations.map((config) => ({
|
|
194
|
+
name: config.name,
|
|
195
|
+
properties: {
|
|
196
|
+
privateIPAllocationMethod: config.privateIPAllocationMethod || "Dynamic",
|
|
197
|
+
subnet: {
|
|
198
|
+
id: config.subnetId,
|
|
199
|
+
},
|
|
200
|
+
publicIPAddress: {
|
|
201
|
+
id: config.publicIPAddressId,
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
}));
|
|
205
|
+
return {
|
|
206
|
+
location: this.location,
|
|
207
|
+
tags: this.allTags(),
|
|
208
|
+
properties: {
|
|
209
|
+
gatewayType: typedProps.gatewayType,
|
|
210
|
+
vpnType: typedProps.vpnType || "RouteBased",
|
|
211
|
+
enableBgp: typedProps.enableBgp || false,
|
|
212
|
+
activeActive: typedProps.activeActive || false,
|
|
213
|
+
sku: typedProps.sku,
|
|
214
|
+
ipConfigurations: ipConfigurations,
|
|
215
|
+
bgpSettings: typedProps.bgpSettings,
|
|
216
|
+
vpnGatewayGeneration: typedProps.vpnGatewayGeneration,
|
|
217
|
+
customRoutes: typedProps.customRoutes,
|
|
218
|
+
enablePrivateIpAddress: typedProps.enablePrivateIpAddress,
|
|
219
|
+
gatewayDefaultSite: typedProps.gatewayDefaultSite,
|
|
220
|
+
vpnClientConfiguration: typedProps.vpnClientConfiguration,
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
// =============================================================================
|
|
225
|
+
// PUBLIC METHODS FOR VIRTUAL NETWORK GATEWAY OPERATIONS
|
|
226
|
+
// =============================================================================
|
|
227
|
+
/**
|
|
228
|
+
* Get the subscription ID from the Virtual Network Gateway ID
|
|
229
|
+
* Extracts the subscription ID from the Azure resource ID format
|
|
230
|
+
*/
|
|
231
|
+
get subscriptionId() {
|
|
232
|
+
const idParts = this.id.split("/");
|
|
233
|
+
const subscriptionIndex = idParts.indexOf("subscriptions");
|
|
234
|
+
if (subscriptionIndex !== -1 && subscriptionIndex + 1 < idParts.length) {
|
|
235
|
+
return idParts[subscriptionIndex + 1];
|
|
236
|
+
}
|
|
237
|
+
throw new Error("Unable to extract subscription ID from Virtual Network Gateway ID");
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get the full resource identifier for use in other Azure resources
|
|
241
|
+
* Alias for the id property to match original interface
|
|
242
|
+
*/
|
|
243
|
+
get resourceId() {
|
|
244
|
+
return this.id;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Add a tag to the Virtual Network Gateway
|
|
248
|
+
* Note: This modifies the construct props but requires a new deployment to take effect
|
|
249
|
+
*/
|
|
250
|
+
addTag(key, value) {
|
|
251
|
+
if (!this.props.tags) {
|
|
252
|
+
this.props.tags = {};
|
|
253
|
+
}
|
|
254
|
+
this.props.tags[key] = value;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Remove a tag from the Virtual Network Gateway
|
|
258
|
+
* Note: This modifies the construct props but requires a new deployment to take effect
|
|
259
|
+
*/
|
|
260
|
+
removeTag(key) {
|
|
261
|
+
if (this.props.tags && this.props.tags[key]) {
|
|
262
|
+
delete this.props.tags[key];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// =============================================================================
|
|
266
|
+
// PRIVATE HELPER METHODS
|
|
267
|
+
// =============================================================================
|
|
268
|
+
/**
|
|
269
|
+
* Applies ignore changes lifecycle rules if specified in props
|
|
270
|
+
*/
|
|
271
|
+
_applyIgnoreChanges() {
|
|
272
|
+
if (this.props.ignoreChanges && this.props.ignoreChanges.length > 0) {
|
|
273
|
+
this.terraformResource.addOverride("lifecycle", {
|
|
274
|
+
ignore_changes: this.props.ignoreChanges,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
exports.VirtualNetworkGateway = VirtualNetworkGateway;
|
|
280
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
281
|
+
VirtualNetworkGateway[_a] = { fqn: "@microsoft/terraform-cdk-constructs.VirtualNetworkGateway", version: "1.5.0" };
|
|
282
|
+
(() => {
|
|
283
|
+
azapi_resource_1.AzapiResource.registerSchemas(virtual_network_gateway_schemas_1.VIRTUAL_NETWORK_GATEWAY_TYPE, virtual_network_gateway_schemas_1.ALL_VIRTUAL_NETWORK_GATEWAY_VERSIONS);
|
|
284
|
+
})();
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1uZXR3b3JrLWdhdGV3YXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXp1cmUtdmlydHVhbG5ldHdvcmtnYXRld2F5L2xpYi92aXJ0dWFsLW5ldHdvcmstZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILCtCQUErQjtBQUUvQix1RkFHMkM7QUFDM0MsOEVBR21EO0FBcU9uRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRkc7QUFDSCxNQUFhLHFCQUFzQixTQUFRLDhCQUFhO0lBbUJ0RDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQix5RUFBeUU7UUFDekUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDN0MsTUFBTSxFQUFFLEtBQUs7WUFDYixNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsZ0ZBQWdGO1FBQ2hGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDcEQsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2QsV0FBVyxFQUFFLHVDQUF1QztTQUNyRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQ3hELEtBQUssRUFBRSxNQUFNLElBQUksQ0FB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QUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELGdGQUFnRjtJQUNoRix5QkFBeUI7SUFDekIsZ0ZBQWdGO0lBRWhGOztPQUVHO0lBQ0ssbUJBQW1CO1FBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUM5QyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO2FBQ3pDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOztBQWxOSCxzREFtTkM7OztBQWxOQztJQUNFLDhCQUFhLENBQUMsZUFBZSxDQUMzQiw4REFBNEIsRUFDNUIsc0VBQW9DLENBQ3JDLENBQUM7QUFDSixDQUFDLEdBQUEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXp1cmUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgaW1wbGVtZW50YXRpb24gdXNpbmcgQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdW5pZmllZCBpbXBsZW1lbnRhdGlvbiBmb3IgQXp1cmUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXlzIHRoYXRcbiAqIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB2ZXJzaW9uIG1hbmFnZW1lbnQsIHNjaGVtYSB2YWxpZGF0aW9uLCBhbmQgcHJvcGVydHlcbiAqIHRyYW5zZm9ybWF0aW9uIGFjcm9zcyBhbGwgc3VwcG9ydGVkIEFQSSB2ZXJzaW9ucy5cbiAqXG4gKiBTdXBwb3J0ZWQgQVBJIFZlcnNpb25zOlxuICogLSAyMDI0LTAxLTAxIChBY3RpdmUpXG4gKiAtIDIwMjQtMDUtMDEgKEFjdGl2ZSwgTGF0ZXN0KVxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgbGF0ZXN0IHZlcnNpb24gcmVzb2x1dGlvbiB3aGVuIG5vIHZlcnNpb24gaXMgc3BlY2lmaWVkXG4gKiAtIEV4cGxpY2l0IHZlcnNpb24gcGlubmluZyBmb3Igc3RhYmlsaXR5IHJlcXVpcmVtZW50c1xuICogLSBTY2hlbWEtZHJpdmVuIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uXG4gKiAtIEZ1bGwgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogLSBKU0lJIGNvbXBsaWFuY2UgZm9yIG11bHRpLWxhbmd1YWdlIHN1cHBvcnRcbiAqL1xuXG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBBTExfVklSVFVBTF9ORVRXT1JLX0dBVEVXQVlfVkVSU0lPTlMsXG4gIFZJUlRVQUxfTkVUV09SS19HQVRFV0FZX1RZUEUsXG59IGZyb20gXCIuL3ZpcnR1YWwtbmV0d29yay1nYXRld2F5LXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBBcGlTY2hlbWEgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogU0tVIGNvbmZpZ3VyYXRpb24gZm9yIFZpcnR1YWwgTmV0d29yayBHYXRld2F5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbE5ldHdvcmtHYXRld2F5U2t1IHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIFNLVVxuICAgKiBAZXhhbXBsZSBcIkJhc2ljXCIsIFwiVnBuR3cxXCIsIFwiVnBuR3cyXCIsIFwiVnBuR3czXCIsIFwiVnBuR3c0XCIsIFwiVnBuR3c1XCIsIFwiRXJHdzFBWlwiLCBcIkVyR3cyQVpcIiwgXCJFckd3M0FaXCJcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGllciBvZiB0aGUgU0tVXG4gICAqIEBleGFtcGxlIFwiQmFzaWNcIiwgXCJWcG5HdzFcIiwgXCJWcG5HdzJcIiwgXCJWcG5HdzNcIiwgXCJWcG5HdzRcIiwgXCJWcG5HdzVcIiwgXCJFckd3MUFaXCIsIFwiRXJHdzJBWlwiLCBcIkVyR3czQVpcIlxuICAgKi9cbiAgcmVhZG9ubHkgdGllcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIElQIGNvbmZpZ3VyYXRpb24gZm9yIFZpcnR1YWwgTmV0d29yayBHYXRld2F5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbE5ldHdvcmtHYXRld2F5SXBDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIElQIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUHJpdmF0ZSBJUCBhbGxvY2F0aW9uIG1ldGhvZFxuICAgKiBAZGVmYXVsdFZhbHVlIFwiRHluYW1pY1wiXG4gICAqL1xuICByZWFkb25seSBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgc3VibmV0IHRvIHVzZSAobXVzdCBiZSBHYXRld2F5U3VibmV0KVxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSUQgb2YgdGhlIHB1YmxpYyBJUCBhZGRyZXNzIHRvIHVzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljSVBBZGRyZXNzSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBCR1Agc2V0dGluZ3MgZm9yIFZpcnR1YWwgTmV0d29yayBHYXRld2F5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbE5ldHdvcmtHYXRld2F5QmdwU2V0dGluZ3Mge1xuICAvKipcbiAgICogQkdQIEFTTiAoQXV0b25vbW91cyBTeXN0ZW0gTnVtYmVyKVxuICAgKiBAZXhhbXBsZSA2NTUxNVxuICAgKi9cbiAgcmVhZG9ubHkgYXNuPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCR1AgcGVlcmluZyBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSBiZ3BQZWVyaW5nQWRkcmVzcz86IHN0cmluZztcblxuICAvKipcbiAgICogV2VpZ2h0IGFkZGVkIHRvIHJvdXRlcyBsZWFybmVkIGZyb20gdGhpcyBCR1Agc3BlYWtlclxuICAgKi9cbiAgcmVhZG9ubHkgcGVlcldlaWdodD86IG51bWJlcjtcblxuICAvKipcbiAgICogQkdQIHBlZXJpbmcgYWRkcmVzc2VzIGZvciBhY3RpdmUtYWN0aXZlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGJncFBlZXJpbmdBZGRyZXNzZXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBWUE4gY2xpZW50IGFkZHJlc3MgcG9vbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbE5ldHdvcmtHYXRld2F5VnBuQ2xpZW50QWRkcmVzc1Bvb2wge1xuICAvKipcbiAgICogTGlzdCBvZiBhZGRyZXNzIHByZWZpeGVzIGZvciBWUE4gY2xpZW50IGNvbm5lY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBhZGRyZXNzUHJlZml4ZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFZQTiBjbGllbnQgY29uZmlndXJhdGlvbiBmb3IgcG9pbnQtdG8tc2l0ZSBjb25uZWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpcnR1YWxOZXR3b3JrR2F0ZXdheVZwbkNsaWVudENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVlBOIGNsaWVudCBhZGRyZXNzIHBvb2xcbiAgICovXG4gIHJlYWRvbmx5IHZwbkNsaWVudEFkZHJlc3NQb29sPzogVmlydHVhbE5ldHdvcmtHYXRld2F5VnBuQ2xpZW50QWRkcmVzc1Bvb2w7XG5cbiAgLyoqXG4gICAqIFZQTiBjbGllbnQgcHJvdG9jb2xzXG4gICAqIEBleGFtcGxlIFtcIklrZVYyXCIsIFwiU1NUUFwiLCBcIk9wZW5WUE5cIl1cbiAgICovXG4gIHJlYWRvbmx5IHZwbkNsaWVudFByb3RvY29scz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBWUE4gY2xpZW50IHJvb3QgY2VydGlmaWNhdGVzXG4gICAqL1xuICByZWFkb25seSB2cG5DbGllbnRSb290Q2VydGlmaWNhdGVzPzogYW55W107XG5cbiAgLyoqXG4gICAqIFZQTiBjbGllbnQgcmV2b2tlZCBjZXJ0aWZpY2F0ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZwbkNsaWVudFJldm9rZWRDZXJ0aWZpY2F0ZXM/OiBhbnlbXTtcblxuICAvKipcbiAgICogUmFkaXVzIHNlcnZlciBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSByYWRpdXNTZXJ2ZXJBZGRyZXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSYWRpdXMgc2VydmVyIHNlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgcmFkaXVzU2VydmVyU2VjcmV0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEN1c3RvbSByb3V0ZXMgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpcnR1YWxOZXR3b3JrR2F0ZXdheUN1c3RvbVJvdXRlcyB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIGFkZHJlc3MgcHJlZml4ZXNcbiAgICovXG4gIHJlYWRvbmx5IGFkZHJlc3NQcmVmaXhlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEdhdGV3YXkgZGVmYXVsdCBzaXRlIHJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpcnR1YWxOZXR3b3JrR2F0ZXdheURlZmF1bHRTaXRlIHtcbiAgLyoqXG4gICAqIFJlc291cmNlIElEIG9mIHRoZSBsb2NhbCBuZXR3b3JrIGdhdGV3YXkgdG8gdXNlIGFzIGRlZmF1bHQgc2l0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgQXp1cmUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXlcbiAqXG4gKiBFeHRlbmRzIEF6YXBpUmVzb3VyY2VQcm9wcyB3aXRoIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IHNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsTmV0d29ya0dhdGV3YXlQcm9wcyBleHRlbmRzIEF6YXBpUmVzb3VyY2VQcm9wcyB7XG4gIC8qKlxuICAgKiBHYXRld2F5IHR5cGVcbiAgICogTXVzdCBiZSBlaXRoZXIgXCJWcG5cIiBvciBcIkV4cHJlc3NSb3V0ZVwiXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5VHlwZTogXCJWcG5cIiB8IFwiRXhwcmVzc1JvdXRlXCI7XG5cbiAgLyoqXG4gICAqIFZQTiB0eXBlIGZvciBWUE4gZ2F0ZXdheXNcbiAgICogQGRlZmF1bHRWYWx1ZSBcIlJvdXRlQmFzZWRcIlxuICAgKi9cbiAgcmVhZG9ubHkgdnBuVHlwZT86IFwiUm91dGVCYXNlZFwiIHwgXCJQb2xpY3lCYXNlZFwiO1xuXG4gIC8qKlxuICAgKiBTS1UgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IHNrdTogVmlydHVhbE5ldHdvcmtHYXRld2F5U2t1O1xuXG4gIC8qKlxuICAgKiBJUCBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGdhdGV3YXlcbiAgICogQXQgbGVhc3Qgb25lIElQIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWRcbiAgICogVHdvIElQIGNvbmZpZ3VyYXRpb25zIGFyZSByZXF1aXJlZCBmb3IgYWN0aXZlLWFjdGl2ZSBtb2RlXG4gICAqL1xuICByZWFkb25seSBpcENvbmZpZ3VyYXRpb25zOiBWaXJ0dWFsTmV0d29ya0dhdGV3YXlJcENvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogRW5hYmxlIEJHUCBmb3IgdGhlIGdhdGV3YXlcbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlQmdwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIGFjdGl2ZS1hY3RpdmUgbW9kZSBmb3IgdGhlIGdhdGV3YXlcbiAgICogUmVxdWlyZXMgdHdvIElQIGNvbmZpZ3VyYXRpb25zXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZUFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJHUCBzZXR0aW5ncyBmb3IgdGhlIGdhdGV3YXlcbiAgICogUmVxdWlyZWQgaWYgZW5hYmxlQmdwIGlzIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGJncFNldHRpbmdzPzogVmlydHVhbE5ldHdvcmtHYXRld2F5QmdwU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFZQTiBnYXRld2F5IGdlbmVyYXRpb25cbiAgICogQGV4YW1wbGUgXCJHZW5lcmF0aW9uMVwiLCBcIkdlbmVyYXRpb24yXCJcbiAgICovXG4gIHJlYWRvbmx5IHZwbkdhdGV3YXlHZW5lcmF0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcm91dGVzIGZvciB0aGUgZ2F0ZXdheVxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tUm91dGVzPzogVmlydHVhbE5ldHdvcmtHYXRld2F5Q3VzdG9tUm91dGVzO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcHJpdmF0ZSBJUCBhZGRyZXNzIGZvciB0aGUgZ2F0ZXdheVxuICAgKiBAZGVmYXVsdFZhbHVlIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVQcml2YXRlSXBBZGRyZXNzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVmYXVsdCBzaXRlIGZvciBmb3JjZSB0dW5uZWxpbmdcbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXlEZWZhdWx0U2l0ZT86IFZpcnR1YWxOZXR3b3JrR2F0ZXdheURlZmF1bHRTaXRlO1xuXG4gIC8qKlxuICAgKiBWUE4gY2xpZW50IGNvbmZpZ3VyYXRpb24gZm9yIHBvaW50LXRvLXNpdGUgY29ubmVjdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHZwbkNsaWVudENvbmZpZ3VyYXRpb24/OiBWaXJ0dWFsTmV0d29ya0dhdGV3YXlWcG5DbGllbnRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBncm91cCBJRCB3aGVyZSB0aGUgR2F0ZXdheSB3aWxsIGJlIGNyZWF0ZWRcbiAgICogT3B0aW9uYWwgLSB3aWxsIHVzZSB0aGUgc3Vic2NyaXB0aW9uIHNjb3BlIGlmIG5vdCBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VHcm91cElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZWN5Y2xlIHJ1bGVzIHRvIGlnbm9yZSBjaGFuZ2VzXG4gICAqIFVzZWZ1bCBmb3IgcHJvcGVydGllcyB0aGF0IGFyZSBleHRlcm5hbGx5IG1hbmFnZWRcbiAgICpcbiAgICogQGV4YW1wbGUgW1widGFnc1wiXVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlQ2hhbmdlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEF6dXJlIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IGltcGxlbWVudGF0aW9uXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNpbmdsZSwgdmVyc2lvbi1hd2FyZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJlcGxhY2VzXG4gKiB2ZXJzaW9uLXNwZWNpZmljIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IGNsYXNzZXMuIEl0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB2ZXJzaW9uXG4gKiByZXNvbHV0aW9uLCBzY2hlbWEgdmFsaWRhdGlvbiwgYW5kIHByb3BlcnR5IHRyYW5zZm9ybWF0aW9uIHdoaWxlIG1haW50YWluaW5nXG4gKiBmdWxsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKlxuICogVmlydHVhbCBOZXR3b3JrIEdhdGV3YXlzIGFyZSB1c2VkIHRvIHNlbmQgZW5jcnlwdGVkIHRyYWZmaWMgYmV0d2VlbiBBenVyZSB2aXJ0dWFsXG4gKiBuZXR3b3JrcyBhbmQgb24tcHJlbWlzZXMgbG9jYXRpb25zIG92ZXIgdGhlIHB1YmxpYyBJbnRlcm5ldCAoVlBOKSBvciB0aHJvdWdoXG4gKiBBenVyZSBFeHByZXNzUm91dGUgY2lyY3VpdHMgKEV4cHJlc3NSb3V0ZSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIFZQTiBHYXRld2F5OlxuICogY29uc3QgdnBuR2F0ZXdheSA9IG5ldyBWaXJ0dWFsTmV0d29ya0dhdGV3YXkodGhpcywgXCJ2cG5HYXRld2F5XCIsIHtcbiAqICAgbmFtZTogXCJteS12cG4tZ2F0ZXdheVwiLFxuICogICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAqICAgcmVzb3VyY2VHcm91cElkOiByZXNvdXJjZUdyb3VwLmlkLFxuICogICBnYXRld2F5VHlwZTogXCJWcG5cIixcbiAqICAgdnBuVHlwZTogXCJSb3V0ZUJhc2VkXCIsXG4gKiAgIHNrdToge1xuICogICAgIG5hbWU6IFwiVnBuR3cxXCIsXG4gKiAgICAgdGllcjogXCJWcG5HdzFcIlxuICogICB9LFxuICogICBpcENvbmZpZ3VyYXRpb25zOiBbe1xuICogICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICogICAgIHN1Ym5ldElkOiBnYXRld2F5U3VibmV0LmlkLFxuICogICAgIHB1YmxpY0lQQWRkcmVzc0lkOiBwdWJsaWNJcC5pZFxuICogICB9XVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFZQTiBHYXRld2F5IHdpdGggQkdQOlxuICogY29uc3QgdnBuR2F0ZXdheSA9IG5ldyBWaXJ0dWFsTmV0d29ya0dhdGV3YXkodGhpcywgXCJ2cG5HYXRld2F5XCIsIHtcbiAqICAgbmFtZTogXCJteS12cG4tZ2F0ZXdheS1iZ3BcIixcbiAqICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gKiAgIHJlc291cmNlR3JvdXBJZDogcmVzb3VyY2VHcm91cC5pZCxcbiAqICAgZ2F0ZXdheVR5cGU6IFwiVnBuXCIsXG4gKiAgIHZwblR5cGU6IFwiUm91dGVCYXNlZFwiLFxuICogICBza3U6IHtcbiAqICAgICBuYW1lOiBcIlZwbkd3MVwiLFxuICogICAgIHRpZXI6IFwiVnBuR3cxXCJcbiAqICAgfSxcbiAqICAgZW5hYmxlQmdwOiB0cnVlLFxuICogICBiZ3BTZXR0aW5nczoge1xuICogICAgIGFzbjogNjU1MTUsXG4gKiAgICAgcGVlcldlaWdodDogMFxuICogICB9LFxuICogICBpcENvbmZpZ3VyYXRpb25zOiBbe1xuICogICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICogICAgIHN1Ym5ldElkOiBnYXRld2F5U3VibmV0LmlkLFxuICogICAgIHB1YmxpY0lQQWRkcmVzc0lkOiBwdWJsaWNJcC5pZFxuICogICB9XVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFjdGl2ZS1BY3RpdmUgVlBOIEdhdGV3YXk6XG4gKiBjb25zdCB2cG5HYXRld2F5ID0gbmV3IFZpcnR1YWxOZXR3b3JrR2F0ZXdheSh0aGlzLCBcInZwbkdhdGV3YXlcIiwge1xuICogICBuYW1lOiBcIm15LXZwbi1nYXRld2F5LWFhXCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gKiAgIGdhdGV3YXlUeXBlOiBcIlZwblwiLFxuICogICB2cG5UeXBlOiBcIlJvdXRlQmFzZWRcIixcbiAqICAgc2t1OiB7XG4gKiAgICAgbmFtZTogXCJWcG5HdzFcIixcbiAqICAgICB0aWVyOiBcIlZwbkd3MVwiXG4gKiAgIH0sXG4gKiAgIGFjdGl2ZUFjdGl2ZTogdHJ1ZSxcbiAqICAgaXBDb25maWd1cmF0aW9uczogW1xuICogICAgIHtcbiAqICAgICAgIG5hbWU6IFwiY29uZmlnMVwiLFxuICogICAgICAgc3VibmV0SWQ6IGdhdGV3YXlTdWJuZXQuaWQsXG4gKiAgICAgICBwdWJsaWNJUEFkZHJlc3NJZDogcHVibGljSXAxLmlkXG4gKiAgICAgfSxcbiAqICAgICB7XG4gKiAgICAgICBuYW1lOiBcImNvbmZpZzJcIixcbiAqICAgICAgIHN1Ym5ldElkOiBnYXRld2F5U3VibmV0LmlkLFxuICogICAgICAgcHVibGljSVBBZGRyZXNzSWQ6IHB1YmxpY0lwMi5pZFxuICogICAgIH1cbiAqICAgXVxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIFZpcnR1YWxOZXR3b3JrR2F0ZXdheSBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKFxuICAgICAgVklSVFVBTF9ORVRXT1JLX0dBVEVXQVlfVFlQRSxcbiAgICAgIEFMTF9WSVJUVUFMX05FVFdPUktfR0FURVdBWV9WRVJTSU9OUyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwcm9wZXJ0aWVzIGZvciB0aGlzIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvcHM6IFZpcnR1YWxOZXR3b3JrR2F0ZXdheVByb3BzO1xuXG4gIC8vIE91dHB1dCBwcm9wZXJ0aWVzIGZvciBlYXN5IGFjY2VzcyBhbmQgcmVmZXJlbmNpbmdcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBsb2NhdGlvbk91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgdGFnc091dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF6dXJlIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IHVzaW5nIHRoZSBBemFwaVJlc291cmNlIGZyYW1ld29ya1xuICAgKlxuICAgKiBUaGUgY29uc3RydWN0b3IgYXV0b21hdGljYWxseSBoYW5kbGVzIHZlcnNpb24gcmVzb2x1dGlvbiwgc2NoZW1hIHJlZ2lzdHJhdGlvbixcbiAgICogdmFsaWRhdGlvbiwgYW5kIHJlc291cmNlIGNyZWF0aW9uLiBJdCBtYWludGFpbnMgZnVsbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIHdpdGggZXhpc3RpbmcgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgaW1wbGVtZW50YXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YW5jZVxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFZpcnR1YWxOZXR3b3JrR2F0ZXdheVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICAvLyBBZGQgZXh0ZW5kZWQgdGltZW91dHMgZm9yIGdhdGV3YXkgcHJvdmlzaW9uaW5nICgzMC00NSBtaW51dGVzIHR5cGljYWwpXG4gICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5hZGRPdmVycmlkZShcInRpbWVvdXRzXCIsIHtcbiAgICAgIGNyZWF0ZTogXCI2MG1cIixcbiAgICAgIHVwZGF0ZTogXCI2MG1cIixcbiAgICAgIGRlbGV0ZTogXCI2MG1cIixcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBUZXJyYWZvcm0gb3V0cHV0cyBmb3IgZWFzeSBhY2Nlc3MgYW5kIHJlZmVyZW5jaW5nIGZyb20gb3RoZXIgcmVzb3VyY2VzXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXlcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheVwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2NhdGlvbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJsb2NhdGlvblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5sb2NhdGlvbn1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGxvY2F0aW9uIG9mIHRoZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheVwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy50YWdzT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcInRhZ3NcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0udGFnc31gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHRhZ3MgYXNzaWduZWQgdG8gdGhlIFZpcnR1YWwgTmV0d29yayBHYXRld2F5XCIsXG4gICAgfSk7XG5cbiAgICAvLyBPdmVycmlkZSBsb2dpY2FsIElEcyB0byBtYXRjaCBvcmlnaW5hbCBuYW1pbmcgY29udmVudGlvblxuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLm5hbWVPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJuYW1lXCIpO1xuICAgIHRoaXMubG9jYXRpb25PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJsb2NhdGlvblwiKTtcbiAgICB0aGlzLnRhZ3NPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJ0YWdzXCIpO1xuXG4gICAgLy8gQXBwbHkgaWdub3JlIGNoYW5nZXMgaWYgc3BlY2lmaWVkXG4gICAgdGhpcy5fYXBwbHlJZ25vcmVDaGFuZ2VzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVFVSVJFRCBBQlNUUkFDVCBNRVRIT0RTIEZST00gVmVyc2lvbmVkQXphcGlSZXNvdXJjZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkZWZhdWx0IEFQSSB2ZXJzaW9uIHRvIHVzZSB3aGVuIG5vIGV4cGxpY2l0IHZlcnNpb24gaXMgc3BlY2lmaWVkXG4gICAqIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIGFzIHRoZSBkZWZhdWx0XG4gICAqL1xuICBwcm90ZWN0ZWQgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCIyMDI0LTA1LTAxXCI7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQXp1cmUgcmVzb3VyY2UgdHlwZSBmb3IgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXlzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFZJUlRVQUxfTkVUV09SS19HQVRFV0FZX1RZUEU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICogVXNlcyB0aGUgZnJhbWV3b3JrJ3Mgc2NoZW1hIHJlc29sdXRpb24gdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBzY2hlbWFcbiAgICovXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIFZpcnR1YWwgTmV0d29yayBHYXRld2F5c1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcmVzb3VyY2UgYm9keSBmb3IgdGhlIEF6dXJlIEFQSSBjYWxsXG4gICAqIFRyYW5zZm9ybXMgdGhlIGlucHV0IHByb3BlcnRpZXMgaW50byB0aGUgSlNPTiBmb3JtYXQgZXhwZWN0ZWQgYnkgQXp1cmUgUkVTVCBBUElcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIFZpcnR1YWxOZXR3b3JrR2F0ZXdheVByb3BzO1xuXG4gICAgLy8gVHJhbnNmb3JtIElQIGNvbmZpZ3VyYXRpb25zIHRvIEF6dXJlIEFQSSBmb3JtYXRcbiAgICBjb25zdCBpcENvbmZpZ3VyYXRpb25zID0gdHlwZWRQcm9wcy5pcENvbmZpZ3VyYXRpb25zLm1hcCgoY29uZmlnKSA9PiAoe1xuICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6XG4gICAgICAgICAgY29uZmlnLnByaXZhdGVJUEFsbG9jYXRpb25NZXRob2QgfHwgXCJEeW5hbWljXCIsXG4gICAgICAgIHN1Ym5ldDoge1xuICAgICAgICAgIGlkOiBjb25maWcuc3VibmV0SWQsXG4gICAgICAgIH0sXG4gICAgICAgIHB1YmxpY0lQQWRkcmVzczoge1xuICAgICAgICAgIGlkOiBjb25maWcucHVibGljSVBBZGRyZXNzSWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbixcbiAgICAgIHRhZ3M6IHRoaXMuYWxsVGFncygpLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBnYXRld2F5VHlwZTogdHlwZWRQcm9wcy5nYXRld2F5VHlwZSxcbiAgICAgICAgdnBuVHlwZTogdHlwZWRQcm9wcy52cG5UeXBlIHx8IFwiUm91dGVCYXNlZFwiLFxuICAgICAgICBlbmFibGVCZ3A6IHR5cGVkUHJvcHMuZW5hYmxlQmdwIHx8IGZhbHNlLFxuICAgICAgICBhY3RpdmVBY3RpdmU6IHR5cGVkUHJvcHMuYWN0aXZlQWN0aXZlIHx8IGZhbHNlLFxuICAgICAgICBza3U6IHR5cGVkUHJvcHMuc2t1LFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBpcENvbmZpZ3VyYXRpb25zLFxuICAgICAgICBiZ3BTZXR0aW5nczogdHlwZWRQcm9wcy5iZ3BTZXR0aW5ncyxcbiAgICAgICAgdnBuR2F0ZXdheUdlbmVyYXRpb246IHR5cGVkUHJvcHMudnBuR2F0ZXdheUdlbmVyYXRpb24sXG4gICAgICAgIGN1c3RvbVJvdXRlczogdHlwZWRQcm9wcy5jdXN0b21Sb3V0ZXMsXG4gICAgICAgIGVuYWJsZVByaXZhdGVJcEFkZHJlc3M6IHR5cGVkUHJvcHMuZW5hYmxlUHJpdmF0ZUlwQWRkcmVzcyxcbiAgICAgICAgZ2F0ZXdheURlZmF1bHRTaXRlOiB0eXBlZFByb3BzLmdhdGV3YXlEZWZhdWx0U2l0ZSxcbiAgICAgICAgdnBuQ2xpZW50Q29uZmlndXJhdGlvbjogdHlwZWRQcm9wcy52cG5DbGllbnRDb25maWd1cmF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgRk9SIFZJUlRVQUwgTkVUV09SSyBHQVRFV0FZIE9QRVJBVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdWJzY3JpcHRpb24gSUQgZnJvbSB0aGUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgSURcbiAgICogRXh0cmFjdHMgdGhlIHN1YnNjcmlwdGlvbiBJRCBmcm9tIHRoZSBBenVyZSByZXNvdXJjZSBJRCBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3Vic2NyaXB0aW9uSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZFBhcnRzID0gdGhpcy5pZC5zcGxpdChcIi9cIik7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSW5kZXggPSBpZFBhcnRzLmluZGV4T2YoXCJzdWJzY3JpcHRpb25zXCIpO1xuICAgIGlmIChzdWJzY3JpcHRpb25JbmRleCAhPT0gLTEgJiYgc3Vic2NyaXB0aW9uSW5kZXggKyAxIDwgaWRQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBpZFBhcnRzW3N1YnNjcmlwdGlvbkluZGV4ICsgMV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiVW5hYmxlIHRvIGV4dHJhY3Qgc3Vic2NyaXB0aW9uIElEIGZyb20gVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgSURcIixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZnVsbCByZXNvdXJjZSBpZGVudGlmaWVyIGZvciB1c2UgaW4gb3RoZXIgQXp1cmUgcmVzb3VyY2VzXG4gICAqIEFsaWFzIGZvciB0aGUgaWQgcHJvcGVydHkgdG8gbWF0Y2ggb3JpZ2luYWwgaW50ZXJmYWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB0YWcgdG8gdGhlIFZpcnR1YWwgTmV0d29yayBHYXRld2F5XG4gICAqIE5vdGU6IFRoaXMgbW9kaWZpZXMgdGhlIGNvbnN0cnVjdCBwcm9wcyBidXQgcmVxdWlyZXMgYSBuZXcgZGVwbG95bWVudCB0byB0YWtlIGVmZmVjdFxuICAgKi9cbiAgcHVibGljIGFkZFRhZyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcm9wcy50YWdzKSB7XG4gICAgICAodGhpcy5wcm9wcyBhcyBhbnkpLnRhZ3MgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5wcm9wcy50YWdzIVtrZXldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdGFnIGZyb20gdGhlIFZpcnR1YWwgTmV0d29yayBHYXRld2F5XG4gICAqIE5vdGU6IFRoaXMgbW9kaWZpZXMgdGhlIGNvbnN0cnVjdCBwcm9wcyBidXQgcmVxdWlyZXMgYSBuZXcgZGVwbG95bWVudCB0byB0YWtlIGVmZmVjdFxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRhZyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzLnRhZ3MgJiYgdGhpcy5wcm9wcy50YWdzW2tleV0pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnByb3BzLnRhZ3Nba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIEhFTFBFUiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgaWdub3JlIGNoYW5nZXMgbGlmZWN5Y2xlIHJ1bGVzIGlmIHNwZWNpZmllZCBpbiBwcm9wc1xuICAgKi9cbiAgcHJpdmF0ZSBfYXBwbHlJZ25vcmVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzLmlnbm9yZUNoYW5nZXMgJiYgdGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVycmFmb3JtUmVzb3VyY2UuYWRkT3ZlcnJpZGUoXCJsaWZlY3ljbGVcIiwge1xuICAgICAgICBpZ25vcmVfY2hhbmdlczogdGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test for Azure Virtual Network Gateway
|
|
3
|
+
*
|
|
4
|
+
* This test demonstrates basic usage of the VirtualNetworkGateway construct
|
|
5
|
+
* and validates deployment, idempotency, and cleanup.
|
|
6
|
+
*
|
|
7
|
+
* Note: Virtual Network Gateways take 20-45 minutes to deploy, so this test
|
|
8
|
+
* has an extended timeout.
|
|
9
|
+
*
|
|
10
|
+
* Run with: npm run integration:nostream
|
|
11
|
+
*/
|
|
12
|
+
import "cdktf/lib/testing/adapters/jest";
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Integration test for Azure Virtual Network Gateway
|
|
4
|
+
*
|
|
5
|
+
* This test demonstrates basic usage of the VirtualNetworkGateway construct
|
|
6
|
+
* and validates deployment, idempotency, and cleanup.
|
|
7
|
+
*
|
|
8
|
+
* Note: Virtual Network Gateways take 20-45 minutes to deploy, so this test
|
|
9
|
+
* has an extended timeout.
|
|
10
|
+
*
|
|
11
|
+
* Run with: npm run integration:nostream
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
const cdktf_1 = require("cdktf");
|
|
15
|
+
require("cdktf/lib/testing/adapters/jest");
|
|
16
|
+
const azure_publicipaddress_1 = require("../../azure-publicipaddress");
|
|
17
|
+
const azure_resourcegroup_1 = require("../../azure-resourcegroup");
|
|
18
|
+
const azure_subnet_1 = require("../../azure-subnet");
|
|
19
|
+
const azure_virtualnetwork_1 = require("../../azure-virtualnetwork");
|
|
20
|
+
const provider_1 = require("../../core-azure/lib/azapi/providers-azapi/provider");
|
|
21
|
+
const testing_1 = require("../../testing");
|
|
22
|
+
const metadata_1 = require("../../testing/lib/metadata");
|
|
23
|
+
const virtual_network_gateway_1 = require("../lib/virtual-network-gateway");
|
|
24
|
+
// Generate unique test run metadata for this test suite
|
|
25
|
+
const testMetadata = new metadata_1.TestRunMetadata("virtual-network-gateway-integration", {
|
|
26
|
+
maxAgeHours: 4,
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Example stack demonstrating Virtual Network Gateway usage
|
|
30
|
+
*/
|
|
31
|
+
class VirtualNetworkGatewayExampleStack extends testing_1.BaseTestStack {
|
|
32
|
+
constructor(scope, id) {
|
|
33
|
+
super(scope, id, {
|
|
34
|
+
testRunOptions: {
|
|
35
|
+
maxAgeHours: testMetadata.maxAgeHours,
|
|
36
|
+
autoCleanup: testMetadata.autoCleanup,
|
|
37
|
+
cleanupPolicy: testMetadata.cleanupPolicy,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
// Configure AZAPI provider
|
|
41
|
+
new provider_1.AzapiProvider(this, "azapi", {});
|
|
42
|
+
// Generate unique names
|
|
43
|
+
const rgName = this.generateResourceName("Microsoft.Resources/resourceGroups", "vng");
|
|
44
|
+
// Create resource group
|
|
45
|
+
const resourceGroup = new azure_resourcegroup_1.ResourceGroup(this, "rg", {
|
|
46
|
+
name: rgName,
|
|
47
|
+
location: "eastus",
|
|
48
|
+
tags: {
|
|
49
|
+
...this.systemTags(),
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
// Create virtual network
|
|
53
|
+
const vnet = new azure_virtualnetwork_1.VirtualNetwork(this, "vnet", {
|
|
54
|
+
name: "vnet-gateway-example",
|
|
55
|
+
location: "eastus",
|
|
56
|
+
resourceGroupId: resourceGroup.id,
|
|
57
|
+
addressSpace: {
|
|
58
|
+
addressPrefixes: ["10.0.0.0/16"],
|
|
59
|
+
},
|
|
60
|
+
tags: {
|
|
61
|
+
...this.systemTags(),
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
// Create GatewaySubnet (required for VPN Gateway)
|
|
65
|
+
const gatewaySubnet = new azure_subnet_1.Subnet(this, "gateway-subnet", {
|
|
66
|
+
name: "GatewaySubnet", // Must be named "GatewaySubnet"
|
|
67
|
+
virtualNetworkName: "vnet-gateway-example",
|
|
68
|
+
virtualNetworkId: vnet.id,
|
|
69
|
+
resourceGroupId: resourceGroup.id,
|
|
70
|
+
addressPrefix: "10.0.1.0/24",
|
|
71
|
+
});
|
|
72
|
+
// Create public IP for the gateway
|
|
73
|
+
const publicIp = new azure_publicipaddress_1.PublicIPAddress(this, "public-ip", {
|
|
74
|
+
name: "pip-gateway-example",
|
|
75
|
+
location: "eastus",
|
|
76
|
+
resourceGroupId: resourceGroup.id,
|
|
77
|
+
sku: {
|
|
78
|
+
name: "Standard",
|
|
79
|
+
tier: "Regional",
|
|
80
|
+
},
|
|
81
|
+
publicIPAllocationMethod: "Static",
|
|
82
|
+
tags: {
|
|
83
|
+
...this.systemTags(),
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
// Example: Basic VPN Gateway
|
|
87
|
+
new virtual_network_gateway_1.VirtualNetworkGateway(this, "vpn-gateway", {
|
|
88
|
+
name: "vng-basic-example",
|
|
89
|
+
location: "eastus",
|
|
90
|
+
resourceGroupId: resourceGroup.id,
|
|
91
|
+
gatewayType: "Vpn",
|
|
92
|
+
vpnType: "RouteBased",
|
|
93
|
+
sku: {
|
|
94
|
+
name: "VpnGw1",
|
|
95
|
+
tier: "VpnGw1",
|
|
96
|
+
},
|
|
97
|
+
ipConfigurations: [
|
|
98
|
+
{
|
|
99
|
+
name: "default",
|
|
100
|
+
subnetId: gatewaySubnet.id,
|
|
101
|
+
publicIPAddressId: publicIp.id,
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
tags: {
|
|
105
|
+
...this.systemTags(),
|
|
106
|
+
example: "basic-vpn",
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
describe("Virtual Network Gateway Integration Test", () => {
|
|
112
|
+
// NOTE: Test is skipped due to 30-45 minute gateway provisioning time.
|
|
113
|
+
// This test has been validated and confirms the gateway deploys successfully.
|
|
114
|
+
// Run manually when needed: npx jest src/azure-virtualnetworkgateway/test/virtual-network-gateway.integ.ts
|
|
115
|
+
//
|
|
116
|
+
// Known issue: Cleanup may fail due to Terraform dependency ordering with the gateway resource.
|
|
117
|
+
// Manual cleanup may be required via Azure Portal if destroy fails.
|
|
118
|
+
it.skip("should deploy, validate idempotency, and cleanup virtual network gateway resources", () => {
|
|
119
|
+
const app = cdktf_1.Testing.app();
|
|
120
|
+
const stack = new VirtualNetworkGatewayExampleStack(app, "test-virtual-network-gateway");
|
|
121
|
+
const synthesized = cdktf_1.Testing.fullSynth(stack);
|
|
122
|
+
// This will:
|
|
123
|
+
// 1. Run terraform apply to deploy resources
|
|
124
|
+
// 2. Run terraform plan to check idempotency (no changes expected)
|
|
125
|
+
// 3. Run terraform destroy to cleanup resources
|
|
126
|
+
(0, testing_1.TerraformApplyCheckAndDestroy)(synthesized, { verifyCleanup: true });
|
|
127
|
+
}, 4500000); // Increased from 3600000 (60 min) to 4500000 (75 min) for gateway provisioning
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1uZXR3b3JrLWdhdGV3YXkuaW50ZWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXp1cmUtdmlydHVhbG5ldHdvcmtnYXRld2F5L3Rlc3QvdmlydHVhbC1uZXR3b3JrLWdhdGV3YXkuaW50ZWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7O0FBRUgsaUNBQWdDO0FBRWhDLDJDQUF5QztBQUN6Qyx1RUFBOEQ7QUFDOUQsbUVBQTBEO0FBQzFELHFEQUE0QztBQUM1QyxxRUFBNEQ7QUFDNUQsa0ZBQW9GO0FBQ3BGLDJDQUE2RTtBQUM3RSx5REFBNkQ7QUFDN0QsNEVBQXVFO0FBRXZFLHdEQUF3RDtBQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLDBCQUFlLENBQ3RDLHFDQUFxQyxFQUNyQztJQUNFLFdBQVcsRUFBRSxDQUFDO0NBQ2YsQ0FDRixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLGlDQUFrQyxTQUFRLHVCQUFhO0lBQzNELFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsY0FBYyxFQUFFO2dCQUNkLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztnQkFDckMsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxhQUFhLEVBQUUsWUFBWSxDQUFDLGFBQWE7YUFDMUM7U0FDRixDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsSUFBSSx3QkFBYSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFckMsd0JBQXdCO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FDdEMsb0NBQW9DLEVBQ3BDLEtBQUssQ0FDTixDQUFDO1FBRUYsd0JBQXdCO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLElBQUksbUNBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQ2xELElB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SUFDdEUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsK0VBQStFO0FBQzlGLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnRlZ3JhdGlvbiB0ZXN0IGZvciBBenVyZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheVxuICpcbiAqIFRoaXMgdGVzdCBkZW1vbnN0cmF0ZXMgYmFzaWMgdXNhZ2Ugb2YgdGhlIFZpcnR1YWxOZXR3b3JrR2F0ZXdheSBjb25zdHJ1Y3RcbiAqIGFuZCB2YWxpZGF0ZXMgZGVwbG95bWVudCwgaWRlbXBvdGVuY3ksIGFuZCBjbGVhbnVwLlxuICpcbiAqIE5vdGU6IFZpcnR1YWwgTmV0d29yayBHYXRld2F5cyB0YWtlIDIwLTQ1IG1pbnV0ZXMgdG8gZGVwbG95LCBzbyB0aGlzIHRlc3RcbiAqIGhhcyBhbiBleHRlbmRlZCB0aW1lb3V0LlxuICpcbiAqIFJ1biB3aXRoOiBucG0gcnVuIGludGVncmF0aW9uOm5vc3RyZWFtXG4gKi9cblxuaW1wb3J0IHsgVGVzdGluZyB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCBcImNka3RmL2xpYi90ZXN0aW5nL2FkYXB0ZXJzL2plc3RcIjtcbmltcG9ydCB7IFB1YmxpY0lQQWRkcmVzcyB9IGZyb20gXCIuLi8uLi9henVyZS1wdWJsaWNpcGFkZHJlc3NcIjtcbmltcG9ydCB7IFJlc291cmNlR3JvdXAgfSBmcm9tIFwiLi4vLi4vYXp1cmUtcmVzb3VyY2Vncm91cFwiO1xuaW1wb3J0IHsgU3VibmV0IH0gZnJvbSBcIi4uLy4uL2F6dXJlLXN1Ym5ldFwiO1xuaW1wb3J0IHsgVmlydHVhbE5ldHdvcmsgfSBmcm9tIFwiLi4vLi4vYXp1cmUtdmlydHVhbG5ldHdvcmtcIjtcbmltcG9ydCB7IEF6YXBpUHJvdmlkZXIgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvYXphcGkvcHJvdmlkZXJzLWF6YXBpL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBCYXNlVGVzdFN0YWNrLCBUZXJyYWZvcm1BcHBseUNoZWNrQW5kRGVzdHJveSB9IGZyb20gXCIuLi8uLi90ZXN0aW5nXCI7XG5pbXBvcnQgeyBUZXN0UnVuTWV0YWRhdGEgfSBmcm9tIFwiLi4vLi4vdGVzdGluZy9saWIvbWV0YWRhdGFcIjtcbmltcG9ydCB7IFZpcnR1YWxOZXR3b3JrR2F0ZXdheSB9IGZyb20gXCIuLi9saWIvdmlydHVhbC1uZXR3b3JrLWdhdGV3YXlcIjtcblxuLy8gR2VuZXJhdGUgdW5pcXVlIHRlc3QgcnVuIG1ldGFkYXRhIGZvciB0aGlzIHRlc3Qgc3VpdGVcbmNvbnN0IHRlc3RNZXRhZGF0YSA9IG5ldyBUZXN0UnVuTWV0YWRhdGEoXG4gIFwidmlydHVhbC1uZXR3b3JrLWdhdGV3YXktaW50ZWdyYXRpb25cIixcbiAge1xuICAgIG1heEFnZUhvdXJzOiA0LFxuICB9LFxuKTtcblxuLyoqXG4gKiBFeGFtcGxlIHN0YWNrIGRlbW9uc3RyYXRpbmcgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgdXNhZ2VcbiAqL1xuY2xhc3MgVmlydHVhbE5ldHdvcmtHYXRld2F5RXhhbXBsZVN0YWNrIGV4dGVuZHMgQmFzZVRlc3RTdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHRlc3RSdW5PcHRpb25zOiB7XG4gICAgICAgIG1heEFnZUhvdXJzOiB0ZXN0TWV0YWRhdGEubWF4QWdlSG91cnMsXG4gICAgICAgIGF1dG9DbGVhbnVwOiB0ZXN0TWV0YWRhdGEuYXV0b0NsZWFudXAsXG4gICAgICAgIGNsZWFudXBQb2xpY3k6IHRlc3RNZXRhZGF0YS5jbGVhbnVwUG9saWN5LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENvbmZpZ3VyZSBBWkFQSSBwcm92aWRlclxuICAgIG5ldyBBemFwaVByb3ZpZGVyKHRoaXMsIFwiYXphcGlcIiwge30pO1xuXG4gICAgLy8gR2VuZXJhdGUgdW5pcXVlIG5hbWVzXG4gICAgY29uc3QgcmdOYW1lID0gdGhpcy5nZW5lcmF0ZVJlc291cmNlTmFtZShcbiAgICAgIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiLFxuICAgICAgXCJ2bmdcIixcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIHJlc291cmNlIGdyb3VwXG4gICAgY29uc3QgcmVzb3VyY2VHcm91cCA9IG5ldyBSZXNvdXJjZUdyb3VwKHRoaXMsIFwicmdcIiwge1xuICAgICAgbmFtZTogcmdOYW1lLFxuICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICB0YWdzOiB7XG4gICAgICAgIC4uLnRoaXMuc3lzdGVtVGFncygpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSB2aXJ0dWFsIG5ldHdvcmtcbiAgICBjb25zdCB2bmV0ID0gbmV3IFZpcnR1YWxOZXR3b3JrKHRoaXMsIFwidm5ldFwiLCB7XG4gICAgICBuYW1lOiBcInZuZXQtZ2F0ZXdheS1leGFtcGxlXCIsXG4gICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgIHJlc291cmNlR3JvdXBJZDogcmVzb3VyY2VHcm91cC5pZCxcbiAgICAgIGFkZHJlc3NTcGFjZToge1xuICAgICAgICBhZGRyZXNzUHJlZml4ZXM6IFtcIjEwLjAuMC4wLzE2XCJdLFxuICAgICAgfSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgLi4udGhpcy5zeXN0ZW1UYWdzKCksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIEdhdGV3YXlTdWJuZXQgKHJlcXVpcmVkIGZvciBWUE4gR2F0ZXdheSlcbiAgICBjb25zdCBnYXRld2F5U3VibmV0ID0gbmV3IFN1Ym5ldCh0aGlzLCBcImdhdGV3YXktc3VibmV0XCIsIHtcbiAgICAgIG5hbWU6IFwiR2F0ZXdheVN1Ym5ldFwiLCAvLyBNdXN0IGJlIG5hbWVkIFwiR2F0ZXdheVN1Ym5ldFwiXG4gICAgICB2aXJ0dWFsTmV0d29ya05hbWU6IFwidm5ldC1nYXRld2F5LWV4YW1wbGVcIixcbiAgICAgIHZpcnR1YWxOZXR3b3JrSWQ6IHZuZXQuaWQsXG4gICAgICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gICAgICBhZGRyZXNzUHJlZml4OiBcIjEwLjAuMS4wLzI0XCIsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgcHVibGljIElQIGZvciB0aGUgZ2F0ZXdheVxuICAgIGNvbnN0IHB1YmxpY0lwID0gbmV3IFB1YmxpY0lQQWRkcmVzcyh0aGlzLCBcInB1YmxpYy1pcFwiLCB7XG4gICAgICBuYW1lOiBcInBpcC1nYXRld2F5LWV4YW1wbGVcIixcbiAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgcmVzb3VyY2VHcm91cElkOiByZXNvdXJjZUdyb3VwLmlkLFxuICAgICAgc2t1OiB7XG4gICAgICAgIG5hbWU6IFwiU3RhbmRhcmRcIixcbiAgICAgICAgdGllcjogXCJSZWdpb25hbFwiLFxuICAgICAgfSxcbiAgICAgIHB1YmxpY0lQQWxsb2NhdGlvbk1ldGhvZDogXCJTdGF0aWNcIixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgLi4udGhpcy5zeXN0ZW1UYWdzKCksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gRXhhbXBsZTogQmFzaWMgVlBOIEdhdGV3YXlcbiAgICBuZXcgVmlydHVhbE5ldHdvcmtHYXRld2F5KHRoaXMsIFwidnBuLWdhdGV3YXlcIiwge1xuICAgICAgbmFtZTogXCJ2bmctYmFzaWMtZXhhbXBsZVwiLFxuICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gICAgICBnYXRld2F5VHlwZTogXCJWcG5cIixcbiAgICAgIHZwblR5cGU6IFwiUm91dGVCYXNlZFwiLFxuICAgICAgc2t1OiB7XG4gICAgICAgIG5hbWU6IFwiVnBuR3cxXCIsXG4gICAgICAgIHRpZXI6IFwiVnBuR3cxXCIsXG4gICAgICB9LFxuICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgc3VibmV0SWQ6IGdhdGV3YXlTdWJuZXQuaWQsXG4gICAgICAgICAgcHVibGljSVBBZGRyZXNzSWQ6IHB1YmxpY0lwLmlkLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgLi4udGhpcy5zeXN0ZW1UYWdzKCksXG4gICAgICAgIGV4YW1wbGU6IFwiYmFzaWMtdnBuXCIsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmRlc2NyaWJlKFwiVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgSW50ZWdyYXRpb24gVGVzdFwiLCAoKSA9PiB7XG4gIC8vIE5PVEU6IFRlc3QgaXMgc2tpcHBlZCBkdWUgdG8gMzAtNDUgbWludXRlIGdhdGV3YXkgcHJvdmlzaW9uaW5nIHRpbWUuXG4gIC8vIFRoaXMgdGVzdCBoYXMgYmVlbiB2YWxpZGF0ZWQgYW5kIGNvbmZpcm1zIHRoZSBnYXRld2F5IGRlcGxveXMgc3VjY2Vzc2Z1bGx5LlxuICAvLyBSdW4gbWFudWFsbHkgd2hlbiBuZWVkZWQ6IG5weCBqZXN0IHNyYy9henVyZS12aXJ0dWFsbmV0d29ya2dhdGV3YXkvdGVzdC92aXJ0dWFsLW5ldHdvcmstZ2F0ZXdheS5pbnRlZy50c1xuICAvL1xuICAvLyBLbm93biBpc3N1ZTogQ2xlYW51cCBtYXkgZmFpbCBkdWUgdG8gVGVycmFmb3JtIGRlcGVuZGVuY3kgb3JkZXJpbmcgd2l0aCB0aGUgZ2F0ZXdheSByZXNvdXJjZS5cbiAgLy8gTWFudWFsIGNsZWFudXAgbWF5IGJlIHJlcXVpcmVkIHZpYSBBenVyZSBQb3J0YWwgaWYgZGVzdHJveSBmYWlscy5cbiAgaXQuc2tpcChcInNob3VsZCBkZXBsb3ksIHZhbGlkYXRlIGlkZW1wb3RlbmN5LCBhbmQgY2xlYW51cCB2aXJ0dWFsIG5ldHdvcmsgZ2F0ZXdheSByZXNvdXJjZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGFwcCA9IFRlc3RpbmcuYXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgVmlydHVhbE5ldHdvcmtHYXRld2F5RXhhbXBsZVN0YWNrKFxuICAgICAgYXBwLFxuICAgICAgXCJ0ZXN0LXZpcnR1YWwtbmV0d29yay1nYXRld2F5XCIsXG4gICAgKTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3RpbmcuZnVsbFN5bnRoKHN0YWNrKTtcblxuICAgIC8vIFRoaXMgd2lsbDpcbiAgICAvLyAxLiBSdW4gdGVycmFmb3JtIGFwcGx5IHRvIGRlcGxveSByZXNvdXJjZXNcbiAgICAvLyAyLiBSdW4gdGVycmFmb3JtIHBsYW4gdG8gY2hlY2sgaWRlbXBvdGVuY3kgKG5vIGNoYW5nZXMgZXhwZWN0ZWQpXG4gICAgLy8gMy4gUnVuIHRlcnJhZm9ybSBkZXN0cm95IHRvIGNsZWFudXAgcmVzb3VyY2VzXG4gICAgVGVycmFmb3JtQXBwbHlDaGVja0FuZERlc3Ryb3koc3ludGhlc2l6ZWQsIHsgdmVyaWZ5Q2xlYW51cDogdHJ1ZSB9KTtcbiAgfSwgNDUwMDAwMCk7IC8vIEluY3JlYXNlZCBmcm9tIDM2MDAwMDAgKDYwIG1pbikgdG8gNDUwMDAwMCAoNzUgbWluKSBmb3IgZ2F0ZXdheSBwcm92aXNpb25pbmdcbn0pO1xuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive tests for the Virtual Network Gateway implementation
|
|
3
|
+
*
|
|
4
|
+
* This test suite validates the VirtualNetworkGateway class using the AzapiResource framework.
|
|
5
|
+
* Tests cover automatic version resolution, explicit version pinning, schema validation,
|
|
6
|
+
* property transformation, and resource creation.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|