@microsoft/terraform-cdk-constructs 1.8.0 → 1.10.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 +60376 -32133
- package/API.md +72290 -37038
- 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-applicationinsights/index.d.ts +7 -0
- package/lib/azure-applicationinsights/index.js +24 -0
- package/lib/azure-applicationinsights/lib/application-insights-schemas.d.ts +29 -0
- package/lib/azure-applicationinsights/lib/application-insights-schemas.js +162 -0
- package/lib/azure-applicationinsights/lib/application-insights.d.ts +206 -0
- package/lib/azure-applicationinsights/lib/application-insights.js +209 -0
- package/lib/azure-applicationinsights/lib/index.d.ts +5 -0
- package/lib/azure-applicationinsights/lib/index.js +22 -0
- package/lib/azure-applicationinsights/test/application-insights.integ.d.ts +9 -0
- package/lib/azure-applicationinsights/test/application-insights.integ.js +84 -0
- package/lib/azure-applicationinsights/test/application-insights.spec.d.ts +8 -0
- package/lib/azure-applicationinsights/test/application-insights.spec.js +209 -0
- package/lib/azure-containerapps/index.d.ts +1 -0
- package/lib/azure-containerapps/index.js +18 -0
- package/lib/azure-containerapps/lib/container-app-environment-schemas.d.ts +50 -0
- package/lib/azure-containerapps/lib/container-app-environment-schemas.js +522 -0
- package/lib/azure-containerapps/lib/container-app-environment.d.ts +374 -0
- package/lib/azure-containerapps/lib/container-app-environment.js +310 -0
- package/lib/azure-containerapps/lib/container-app-schemas.d.ts +48 -0
- package/lib/azure-containerapps/lib/container-app-schemas.js +466 -0
- package/lib/azure-containerapps/lib/container-app.d.ts +925 -0
- package/lib/azure-containerapps/lib/container-app.js +320 -0
- package/lib/azure-containerapps/lib/index.d.ts +4 -0
- package/lib/azure-containerapps/lib/index.js +21 -0
- package/lib/azure-containerapps/test/container-app-environment.integ.d.ts +10 -0
- package/lib/azure-containerapps/test/container-app-environment.integ.js +82 -0
- package/lib/azure-containerapps/test/container-app-environment.spec.d.ts +9 -0
- package/lib/azure-containerapps/test/container-app-environment.spec.js +412 -0
- package/lib/azure-containerapps/test/container-app.integ.d.ts +10 -0
- package/lib/azure-containerapps/test/container-app.integ.js +119 -0
- package/lib/azure-containerapps/test/container-app.spec.d.ts +9 -0
- package/lib/azure-containerapps/test/container-app.spec.js +839 -0
- package/lib/azure-containerregistry/index.d.ts +1 -0
- package/lib/azure-containerregistry/index.js +18 -0
- package/lib/azure-containerregistry/lib/container-registry-schemas.d.ts +32 -0
- package/lib/azure-containerregistry/lib/container-registry-schemas.js +316 -0
- package/lib/azure-containerregistry/lib/container-registry.d.ts +330 -0
- package/lib/azure-containerregistry/lib/container-registry.js +217 -0
- package/lib/azure-containerregistry/lib/index.d.ts +2 -0
- package/lib/azure-containerregistry/lib/index.js +19 -0
- package/lib/azure-containerregistry/test/container-registry.integ.d.ts +9 -0
- package/lib/azure-containerregistry/test/container-registry.integ.js +101 -0
- package/lib/azure-containerregistry/test/container-registry.spec.d.ts +4 -0
- package/lib/azure-containerregistry/test/container-registry.spec.js +425 -0
- package/lib/azure-cosmosdb/index.d.ts +1 -0
- package/lib/azure-cosmosdb/index.js +18 -0
- package/lib/azure-cosmosdb/lib/cosmos-db-schemas.d.ts +40 -0
- package/lib/azure-cosmosdb/lib/cosmos-db-schemas.js +330 -0
- package/lib/azure-cosmosdb/lib/cosmos-db.d.ts +290 -0
- package/lib/azure-cosmosdb/lib/cosmos-db.js +222 -0
- package/lib/azure-cosmosdb/lib/index.d.ts +2 -0
- package/lib/azure-cosmosdb/lib/index.js +19 -0
- package/lib/azure-cosmosdb/test/cosmos-db.integ.d.ts +9 -0
- package/lib/azure-cosmosdb/test/cosmos-db.integ.js +98 -0
- package/lib/azure-cosmosdb/test/cosmos-db.spec.d.ts +4 -0
- package/lib/azure-cosmosdb/test/cosmos-db.spec.js +339 -0
- 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-dnszone/lib/records/dns-records.js +10 -10
- package/lib/azure-functionapp/index.d.ts +1 -0
- package/lib/azure-functionapp/index.js +18 -0
- package/lib/azure-functionapp/lib/function-app-schemas.d.ts +32 -0
- package/lib/azure-functionapp/lib/function-app-schemas.js +303 -0
- package/lib/azure-functionapp/lib/function-app.d.ts +367 -0
- package/lib/azure-functionapp/lib/function-app.js +223 -0
- package/lib/azure-functionapp/lib/index.d.ts +2 -0
- package/lib/azure-functionapp/lib/index.js +19 -0
- package/lib/azure-functionapp/test/function-app.integ.d.ts +12 -0
- package/lib/azure-functionapp/test/function-app.integ.js +134 -0
- package/lib/azure-functionapp/test/function-app.spec.d.ts +4 -0
- package/lib/azure-functionapp/test/function-app.spec.js +566 -0
- package/lib/azure-keyvault/index.d.ts +1 -0
- package/lib/azure-keyvault/index.js +18 -0
- package/lib/azure-keyvault/lib/index.d.ts +2 -0
- package/lib/azure-keyvault/lib/index.js +19 -0
- package/lib/azure-keyvault/lib/key-vault-schemas.d.ts +40 -0
- package/lib/azure-keyvault/lib/key-vault-schemas.js +312 -0
- package/lib/azure-keyvault/lib/key-vault.d.ts +344 -0
- package/lib/azure-keyvault/lib/key-vault.js +243 -0
- package/lib/azure-keyvault/test/key-vault.integ.d.ts +9 -0
- package/lib/azure-keyvault/test/key-vault.integ.js +108 -0
- package/lib/azure-keyvault/test/key-vault.spec.d.ts +4 -0
- package/lib/azure-keyvault/test/key-vault.spec.js +264 -0
- package/lib/azure-loganalyticsworkspace/index.d.ts +6 -0
- package/lib/azure-loganalyticsworkspace/index.js +23 -0
- package/lib/azure-loganalyticsworkspace/lib/index.d.ts +5 -0
- package/lib/azure-loganalyticsworkspace/lib/index.js +22 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.d.ts +51 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.js +255 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.d.ts +301 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.js +213 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.d.ts +9 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.js +71 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.d.ts +8 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.js +504 -0
- 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-networkwatcher/index.d.ts +14 -0
- package/lib/azure-networkwatcher/index.js +31 -0
- package/lib/azure-networkwatcher/lib/index.d.ts +5 -0
- package/lib/azure-networkwatcher/lib/index.js +22 -0
- package/lib/azure-networkwatcher/lib/network-watcher-schemas.d.ts +47 -0
- package/lib/azure-networkwatcher/lib/network-watcher-schemas.js +167 -0
- package/lib/azure-networkwatcher/lib/network-watcher.d.ts +181 -0
- package/lib/azure-networkwatcher/lib/network-watcher.js +187 -0
- package/lib/azure-networkwatcher/test/network-watcher.integ.d.ts +12 -0
- package/lib/azure-networkwatcher/test/network-watcher.integ.js +84 -0
- package/lib/azure-networkwatcher/test/network-watcher.spec.d.ts +8 -0
- package/lib/azure-networkwatcher/test/network-watcher.spec.js +312 -0
- package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
- package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
- package/lib/azure-policysetdefinition/index.d.ts +10 -0
- package/lib/azure-policysetdefinition/index.js +27 -0
- package/lib/azure-policysetdefinition/lib/index.d.ts +5 -0
- package/lib/azure-policysetdefinition/lib/index.js +22 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.d.ts +50 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.js +255 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition.d.ts +426 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition.js +255 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.integ.d.ts +9 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.integ.js +56 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.spec.d.ts +8 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.spec.js +745 -0
- package/lib/azure-privatednszone/lib/private-dns-zone.js +1 -1
- package/lib/azure-privatednszone/lib/records/private-dns-records.js +8 -8
- 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-sreagent/index.d.ts +1 -0
- package/lib/azure-sreagent/index.js +18 -0
- package/lib/azure-sreagent/lib/index.d.ts +2 -0
- package/lib/azure-sreagent/lib/index.js +19 -0
- package/lib/azure-sreagent/lib/sre-agent-schemas.d.ts +29 -0
- package/lib/azure-sreagent/lib/sre-agent-schemas.js +296 -0
- package/lib/azure-sreagent/lib/sre-agent.d.ts +208 -0
- package/lib/azure-sreagent/lib/sre-agent.js +217 -0
- package/lib/azure-sreagent/test/sre-agent.integ.d.ts +9 -0
- package/lib/azure-sreagent/test/sre-agent.integ.js +78 -0
- package/lib/azure-sreagent/test/sre-agent.spec.d.ts +4 -0
- package/lib/azure-sreagent/test/sre-agent.spec.js +216 -0
- package/lib/azure-staticwebapp/index.d.ts +1 -0
- package/lib/azure-staticwebapp/index.js +18 -0
- package/lib/azure-staticwebapp/lib/index.d.ts +2 -0
- package/lib/azure-staticwebapp/lib/index.js +19 -0
- package/lib/azure-staticwebapp/lib/static-web-app-schemas.d.ts +40 -0
- package/lib/azure-staticwebapp/lib/static-web-app-schemas.js +236 -0
- package/lib/azure-staticwebapp/lib/static-web-app.d.ts +242 -0
- package/lib/azure-staticwebapp/lib/static-web-app.js +232 -0
- package/lib/azure-staticwebapp/test/static-web-app.integ.d.ts +9 -0
- package/lib/azure-staticwebapp/test/static-web-app.integ.js +76 -0
- package/lib/azure-staticwebapp/test/static-web-app.spec.d.ts +15 -0
- package/lib/azure-staticwebapp/test/static-web-app.spec.js +293 -0
- 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/lib/virtual-network-gateway-schemas.js +2 -2
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +4 -2
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +8 -5
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +109 -1
- package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
- 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/virtual-network-manager.js +1 -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 +25 -0
- package/lib/index.js +27 -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,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Azure Key Vault implementation using AzapiResource framework
|
|
3
|
+
*
|
|
4
|
+
* This class provides a version-aware implementation for Azure Key Vault
|
|
5
|
+
* (Microsoft.KeyVault/vaults) that automatically handles version management,
|
|
6
|
+
* schema validation, and property transformation across all supported API versions.
|
|
7
|
+
*
|
|
8
|
+
* Supported API Versions:
|
|
9
|
+
* - 2023-02-01 (Active)
|
|
10
|
+
* - 2023-07-01 (Active)
|
|
11
|
+
* - 2024-11-01 (Active, Latest)
|
|
12
|
+
*
|
|
13
|
+
* Features:
|
|
14
|
+
* - Automatic latest version resolution when no version is specified
|
|
15
|
+
* - Explicit version pinning for stability requirements
|
|
16
|
+
* - Schema-driven validation and transformation
|
|
17
|
+
* - Full JSII compliance for multi-language support
|
|
18
|
+
* - Configurable SKU, tenant, RBAC and access policies
|
|
19
|
+
* - Network ACLs and public network access control
|
|
20
|
+
* - Soft-delete and purge protection support
|
|
21
|
+
*/
|
|
22
|
+
import * as cdktf from "cdktf";
|
|
23
|
+
import { Construct } from "constructs";
|
|
24
|
+
import { AzapiResource, AzapiResourceProps } from "../../core-azure/lib/azapi/azapi-resource";
|
|
25
|
+
import { ApiSchema } from "../../core-azure/lib/version-manager/interfaces/version-interfaces";
|
|
26
|
+
/**
|
|
27
|
+
* SKU configuration for Key Vault
|
|
28
|
+
*/
|
|
29
|
+
export interface KeyVaultSku {
|
|
30
|
+
/**
|
|
31
|
+
* The SKU name (standard or premium)
|
|
32
|
+
*
|
|
33
|
+
* @default "standard"
|
|
34
|
+
*/
|
|
35
|
+
readonly name: "standard" | "premium";
|
|
36
|
+
/**
|
|
37
|
+
* The SKU family. Always "A" for Key Vault.
|
|
38
|
+
*
|
|
39
|
+
* @default "A"
|
|
40
|
+
*/
|
|
41
|
+
readonly family?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Permissions configuration for an access policy
|
|
45
|
+
*/
|
|
46
|
+
export interface KeyVaultAccessPolicyPermissions {
|
|
47
|
+
/**
|
|
48
|
+
* Permissions for keys (e.g. "get", "list", "create", "delete")
|
|
49
|
+
*/
|
|
50
|
+
readonly keys?: string[];
|
|
51
|
+
/**
|
|
52
|
+
* Permissions for secrets (e.g. "get", "list", "set", "delete")
|
|
53
|
+
*/
|
|
54
|
+
readonly secrets?: string[];
|
|
55
|
+
/**
|
|
56
|
+
* Permissions for certificates (e.g. "get", "list", "create", "delete")
|
|
57
|
+
*/
|
|
58
|
+
readonly certificates?: string[];
|
|
59
|
+
/**
|
|
60
|
+
* Permissions for storage (e.g. "get", "list", "set", "delete")
|
|
61
|
+
*/
|
|
62
|
+
readonly storage?: string[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Access policy configuration for the Key Vault
|
|
66
|
+
*/
|
|
67
|
+
export interface KeyVaultAccessPolicy {
|
|
68
|
+
/**
|
|
69
|
+
* The Azure Active Directory tenant ID
|
|
70
|
+
*/
|
|
71
|
+
readonly tenantId: string;
|
|
72
|
+
/**
|
|
73
|
+
* The object ID of a user, service principal, or security group in AAD
|
|
74
|
+
*/
|
|
75
|
+
readonly objectId: string;
|
|
76
|
+
/**
|
|
77
|
+
* The application ID of the client making the request on behalf of the user
|
|
78
|
+
*/
|
|
79
|
+
readonly applicationId?: string;
|
|
80
|
+
/**
|
|
81
|
+
* The permissions granted to the identity
|
|
82
|
+
*/
|
|
83
|
+
readonly permissions: KeyVaultAccessPolicyPermissions;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* IP rule for Key Vault network ACLs
|
|
87
|
+
*/
|
|
88
|
+
export interface KeyVaultIpRule {
|
|
89
|
+
/**
|
|
90
|
+
* IP address or CIDR range
|
|
91
|
+
*/
|
|
92
|
+
readonly value: string;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Virtual network rule for Key Vault network ACLs
|
|
96
|
+
*/
|
|
97
|
+
export interface KeyVaultVirtualNetworkRule {
|
|
98
|
+
/**
|
|
99
|
+
* Virtual network subnet resource ID
|
|
100
|
+
*/
|
|
101
|
+
readonly id: string;
|
|
102
|
+
/**
|
|
103
|
+
* Whether to ignore missing VNET service endpoint
|
|
104
|
+
*/
|
|
105
|
+
readonly ignoreMissingVnetServiceEndpoint?: boolean;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Network ACL configuration for the Key Vault
|
|
109
|
+
*/
|
|
110
|
+
export interface KeyVaultNetworkAcls {
|
|
111
|
+
/**
|
|
112
|
+
* Default action when no rule matches (Allow or Deny)
|
|
113
|
+
*
|
|
114
|
+
* @default "Allow"
|
|
115
|
+
*/
|
|
116
|
+
readonly defaultAction?: "Allow" | "Deny";
|
|
117
|
+
/**
|
|
118
|
+
* Tells what traffic can bypass network rules. Can be 'AzureServices' or 'None'.
|
|
119
|
+
*
|
|
120
|
+
* @default "AzureServices"
|
|
121
|
+
*/
|
|
122
|
+
readonly bypass?: "AzureServices" | "None";
|
|
123
|
+
/**
|
|
124
|
+
* IP rules for the Key Vault
|
|
125
|
+
*/
|
|
126
|
+
readonly ipRules?: KeyVaultIpRule[];
|
|
127
|
+
/**
|
|
128
|
+
* Virtual network subnet rules for the Key Vault
|
|
129
|
+
*/
|
|
130
|
+
readonly virtualNetworkRules?: KeyVaultVirtualNetworkRule[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Properties for the unified Azure Key Vault
|
|
134
|
+
*
|
|
135
|
+
* Extends AzapiResourceProps with Key Vault specific properties.
|
|
136
|
+
*/
|
|
137
|
+
export interface KeyVaultProps extends AzapiResourceProps {
|
|
138
|
+
/**
|
|
139
|
+
* Resource group ID where the Key Vault will be created
|
|
140
|
+
*/
|
|
141
|
+
readonly resourceGroupId?: string;
|
|
142
|
+
/**
|
|
143
|
+
* The SKU (pricing tier) for the Key Vault
|
|
144
|
+
*
|
|
145
|
+
* @default { name: "standard", family: "A" }
|
|
146
|
+
*/
|
|
147
|
+
readonly sku?: KeyVaultSku;
|
|
148
|
+
/**
|
|
149
|
+
* The Azure Active Directory tenant ID that should be used for authenticating
|
|
150
|
+
* requests to the Key Vault. If not provided, the current tenant ID from the
|
|
151
|
+
* AZAPI client configuration is used.
|
|
152
|
+
*/
|
|
153
|
+
readonly tenantId?: string;
|
|
154
|
+
/**
|
|
155
|
+
* Access policies for the Key Vault.
|
|
156
|
+
*
|
|
157
|
+
* Only applicable when `enableRbacAuthorization` is false.
|
|
158
|
+
*/
|
|
159
|
+
readonly accessPolicies?: KeyVaultAccessPolicy[];
|
|
160
|
+
/**
|
|
161
|
+
* Network ACL configuration for the Key Vault
|
|
162
|
+
*/
|
|
163
|
+
readonly networkAcls?: KeyVaultNetworkAcls;
|
|
164
|
+
/**
|
|
165
|
+
* Whether Azure Virtual Machines are permitted to retrieve certificates
|
|
166
|
+
* stored as secrets from the Key Vault.
|
|
167
|
+
*
|
|
168
|
+
* @default false
|
|
169
|
+
*/
|
|
170
|
+
readonly enabledForDeployment?: boolean;
|
|
171
|
+
/**
|
|
172
|
+
* Whether Azure Disk Encryption is permitted to retrieve secrets from the
|
|
173
|
+
* Key Vault and unwrap keys.
|
|
174
|
+
*
|
|
175
|
+
* @default false
|
|
176
|
+
*/
|
|
177
|
+
readonly enabledForDiskEncryption?: boolean;
|
|
178
|
+
/**
|
|
179
|
+
* Whether Azure Resource Manager is permitted to retrieve secrets from the
|
|
180
|
+
* Key Vault.
|
|
181
|
+
*
|
|
182
|
+
* @default false
|
|
183
|
+
*/
|
|
184
|
+
readonly enabledForTemplateDeployment?: boolean;
|
|
185
|
+
/**
|
|
186
|
+
* Whether Azure RBAC is used to authorize data actions instead of access
|
|
187
|
+
* policies.
|
|
188
|
+
*
|
|
189
|
+
* @default true
|
|
190
|
+
*/
|
|
191
|
+
readonly enableRbacAuthorization?: boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Whether soft-delete is enabled on the Key Vault.
|
|
194
|
+
*
|
|
195
|
+
* @default true
|
|
196
|
+
*/
|
|
197
|
+
readonly enableSoftDelete?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Number of days that items should be retained after soft-delete (7-90).
|
|
200
|
+
*
|
|
201
|
+
* @default 90
|
|
202
|
+
*/
|
|
203
|
+
readonly softDeleteRetentionInDays?: number;
|
|
204
|
+
/**
|
|
205
|
+
* Whether purge protection is enabled. Once enabled, this property cannot
|
|
206
|
+
* be disabled.
|
|
207
|
+
*/
|
|
208
|
+
readonly enablePurgeProtection?: boolean;
|
|
209
|
+
/**
|
|
210
|
+
* Whether the Key Vault accepts traffic from public networks.
|
|
211
|
+
*
|
|
212
|
+
* @default "Enabled"
|
|
213
|
+
*/
|
|
214
|
+
readonly publicNetworkAccess?: "Enabled" | "Disabled";
|
|
215
|
+
/**
|
|
216
|
+
* Properties to ignore during updates
|
|
217
|
+
*
|
|
218
|
+
* @example ["tags"]
|
|
219
|
+
*/
|
|
220
|
+
readonly ignoreChanges?: string[];
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Key Vault properties for the request body
|
|
224
|
+
*/
|
|
225
|
+
export interface KeyVaultBodyProperties {
|
|
226
|
+
readonly tenantId: string;
|
|
227
|
+
readonly sku: KeyVaultSku;
|
|
228
|
+
readonly accessPolicies?: KeyVaultAccessPolicy[];
|
|
229
|
+
readonly networkAcls?: KeyVaultNetworkAcls;
|
|
230
|
+
readonly enabledForDeployment?: boolean;
|
|
231
|
+
readonly enabledForDiskEncryption?: boolean;
|
|
232
|
+
readonly enabledForTemplateDeployment?: boolean;
|
|
233
|
+
readonly enableRbacAuthorization?: boolean;
|
|
234
|
+
readonly enableSoftDelete?: boolean;
|
|
235
|
+
readonly softDeleteRetentionInDays?: number;
|
|
236
|
+
readonly enablePurgeProtection?: boolean;
|
|
237
|
+
readonly publicNetworkAccess?: string;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* The resource body interface for Azure Key Vault API calls
|
|
241
|
+
*/
|
|
242
|
+
export interface KeyVaultBody {
|
|
243
|
+
readonly location: string;
|
|
244
|
+
readonly tags?: {
|
|
245
|
+
[key: string]: string;
|
|
246
|
+
};
|
|
247
|
+
readonly properties: KeyVaultBodyProperties;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Unified Azure Key Vault implementation
|
|
251
|
+
*
|
|
252
|
+
* This class provides a single, version-aware implementation that automatically
|
|
253
|
+
* handles version resolution, schema validation, and property transformation
|
|
254
|
+
* while maintaining full JSII compliance.
|
|
255
|
+
*
|
|
256
|
+
* Azure Key Vault is a cloud service for securely storing and accessing secrets,
|
|
257
|
+
* keys, and certificates with centralized management and access control.
|
|
258
|
+
*
|
|
259
|
+
* @example
|
|
260
|
+
* // Basic usage with automatic version resolution and current tenant:
|
|
261
|
+
* const keyVault = new KeyVault(this, "kv", {
|
|
262
|
+
* name: "my-keyvault-1234",
|
|
263
|
+
* location: "eastus",
|
|
264
|
+
* resourceGroupId: resourceGroup.id,
|
|
265
|
+
* });
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* // Usage with explicit version pinning and configuration:
|
|
269
|
+
* const keyVault = new KeyVault(this, "kv", {
|
|
270
|
+
* name: "my-keyvault-1234",
|
|
271
|
+
* location: "eastus",
|
|
272
|
+
* resourceGroupId: resourceGroup.id,
|
|
273
|
+
* sku: { name: "premium" },
|
|
274
|
+
* apiVersion: "2023-07-01",
|
|
275
|
+
* enablePurgeProtection: true,
|
|
276
|
+
* publicNetworkAccess: "Disabled",
|
|
277
|
+
* networkAcls: {
|
|
278
|
+
* defaultAction: "Deny",
|
|
279
|
+
* bypass: "AzureServices",
|
|
280
|
+
* },
|
|
281
|
+
* });
|
|
282
|
+
*
|
|
283
|
+
* @stability stable
|
|
284
|
+
*/
|
|
285
|
+
export declare class KeyVault extends AzapiResource {
|
|
286
|
+
/**
|
|
287
|
+
* The input properties for this Key Vault instance
|
|
288
|
+
*/
|
|
289
|
+
readonly props: KeyVaultProps;
|
|
290
|
+
readonly idOutput: cdktf.TerraformOutput;
|
|
291
|
+
readonly locationOutput: cdktf.TerraformOutput;
|
|
292
|
+
readonly nameOutput: cdktf.TerraformOutput;
|
|
293
|
+
readonly tagsOutput: cdktf.TerraformOutput;
|
|
294
|
+
readonly vaultUriOutput: cdktf.TerraformOutput;
|
|
295
|
+
/**
|
|
296
|
+
* Creates a new Azure Key Vault using the AzapiResource framework
|
|
297
|
+
*
|
|
298
|
+
* @param scope - The scope in which to define this construct
|
|
299
|
+
* @param id - The unique identifier for this instance
|
|
300
|
+
* @param props - Configuration properties for the Key Vault
|
|
301
|
+
*/
|
|
302
|
+
constructor(scope: Construct, id: string, props: KeyVaultProps);
|
|
303
|
+
/**
|
|
304
|
+
* Gets the default API version to use when no explicit version is specified
|
|
305
|
+
*/
|
|
306
|
+
protected defaultVersion(): string;
|
|
307
|
+
/**
|
|
308
|
+
* Gets the Azure resource type for Key Vault
|
|
309
|
+
*/
|
|
310
|
+
protected resourceType(): string;
|
|
311
|
+
/**
|
|
312
|
+
* Gets the API schema for the resolved version
|
|
313
|
+
*/
|
|
314
|
+
protected apiSchema(): ApiSchema;
|
|
315
|
+
/**
|
|
316
|
+
* Indicates that location is required for Key Vaults
|
|
317
|
+
*/
|
|
318
|
+
protected requiresLocation(): boolean;
|
|
319
|
+
/**
|
|
320
|
+
* Creates the resource body for the Azure API call
|
|
321
|
+
*/
|
|
322
|
+
protected createResourceBody(props: any): any;
|
|
323
|
+
/**
|
|
324
|
+
* Get the data plane URI of the Key Vault
|
|
325
|
+
*
|
|
326
|
+
* Returns the deterministic Azure public cloud Key Vault URI in the form
|
|
327
|
+
* `https://{name}.vault.azure.net/`. This avoids depending on the AZAPI
|
|
328
|
+
* resource `output` attribute which is only populated for properties listed
|
|
329
|
+
* in `response_export_values`.
|
|
330
|
+
*/
|
|
331
|
+
get vaultUri(): string;
|
|
332
|
+
/**
|
|
333
|
+
* Add a tag to the Key Vault
|
|
334
|
+
*/
|
|
335
|
+
addTag(key: string, value: string): void;
|
|
336
|
+
/**
|
|
337
|
+
* Remove a tag from the Key Vault
|
|
338
|
+
*/
|
|
339
|
+
removeTag(key: string): void;
|
|
340
|
+
/**
|
|
341
|
+
* Applies ignore changes lifecycle rules if specified in props
|
|
342
|
+
*/
|
|
343
|
+
private _applyIgnoreChanges;
|
|
344
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.KeyVault = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
/**
|
|
7
|
+
* Unified Azure Key Vault implementation using AzapiResource framework
|
|
8
|
+
*
|
|
9
|
+
* This class provides a version-aware implementation for Azure Key Vault
|
|
10
|
+
* (Microsoft.KeyVault/vaults) that automatically handles version management,
|
|
11
|
+
* schema validation, and property transformation across all supported API versions.
|
|
12
|
+
*
|
|
13
|
+
* Supported API Versions:
|
|
14
|
+
* - 2023-02-01 (Active)
|
|
15
|
+
* - 2023-07-01 (Active)
|
|
16
|
+
* - 2024-11-01 (Active, Latest)
|
|
17
|
+
*
|
|
18
|
+
* Features:
|
|
19
|
+
* - Automatic latest version resolution when no version is specified
|
|
20
|
+
* - Explicit version pinning for stability requirements
|
|
21
|
+
* - Schema-driven validation and transformation
|
|
22
|
+
* - Full JSII compliance for multi-language support
|
|
23
|
+
* - Configurable SKU, tenant, RBAC and access policies
|
|
24
|
+
* - Network ACLs and public network access control
|
|
25
|
+
* - Soft-delete and purge protection support
|
|
26
|
+
*/
|
|
27
|
+
const cdktf = require("cdktf");
|
|
28
|
+
const key_vault_schemas_1 = require("./key-vault-schemas");
|
|
29
|
+
const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
|
|
30
|
+
const data_azapi_client_config_1 = require("../../core-azure/lib/azapi/providers-azapi/data-azapi-client-config");
|
|
31
|
+
/**
|
|
32
|
+
* Unified Azure Key Vault implementation
|
|
33
|
+
*
|
|
34
|
+
* This class provides a single, version-aware implementation that automatically
|
|
35
|
+
* handles version resolution, schema validation, and property transformation
|
|
36
|
+
* while maintaining full JSII compliance.
|
|
37
|
+
*
|
|
38
|
+
* Azure Key Vault is a cloud service for securely storing and accessing secrets,
|
|
39
|
+
* keys, and certificates with centralized management and access control.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // Basic usage with automatic version resolution and current tenant:
|
|
43
|
+
* const keyVault = new KeyVault(this, "kv", {
|
|
44
|
+
* name: "my-keyvault-1234",
|
|
45
|
+
* location: "eastus",
|
|
46
|
+
* resourceGroupId: resourceGroup.id,
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* // Usage with explicit version pinning and configuration:
|
|
51
|
+
* const keyVault = new KeyVault(this, "kv", {
|
|
52
|
+
* name: "my-keyvault-1234",
|
|
53
|
+
* location: "eastus",
|
|
54
|
+
* resourceGroupId: resourceGroup.id,
|
|
55
|
+
* sku: { name: "premium" },
|
|
56
|
+
* apiVersion: "2023-07-01",
|
|
57
|
+
* enablePurgeProtection: true,
|
|
58
|
+
* publicNetworkAccess: "Disabled",
|
|
59
|
+
* networkAcls: {
|
|
60
|
+
* defaultAction: "Deny",
|
|
61
|
+
* bypass: "AzureServices",
|
|
62
|
+
* },
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* @stability stable
|
|
66
|
+
*/
|
|
67
|
+
class KeyVault extends azapi_resource_1.AzapiResource {
|
|
68
|
+
/**
|
|
69
|
+
* Creates a new Azure Key Vault using the AzapiResource framework
|
|
70
|
+
*
|
|
71
|
+
* @param scope - The scope in which to define this construct
|
|
72
|
+
* @param id - The unique identifier for this instance
|
|
73
|
+
* @param props - Configuration properties for the Key Vault
|
|
74
|
+
*/
|
|
75
|
+
constructor(scope, id, props) {
|
|
76
|
+
// Validate softDeleteRetentionInDays bounds before delegating to base class
|
|
77
|
+
if (props.softDeleteRetentionInDays !== undefined) {
|
|
78
|
+
if (props.softDeleteRetentionInDays < 7 ||
|
|
79
|
+
props.softDeleteRetentionInDays > 90) {
|
|
80
|
+
throw new Error("softDeleteRetentionInDays must be between 7 and 90 days");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// If tenantId is not provided, fall back to the current AZAPI client tenant.
|
|
84
|
+
// The DataAzapiClientConfig data source must be created on the parent scope
|
|
85
|
+
// so it is available before super() is called.
|
|
86
|
+
const resolvedTenantId = props.tenantId ??
|
|
87
|
+
(() => {
|
|
88
|
+
const clientConfig = new data_azapi_client_config_1.DataAzapiClientConfig(scope, `${id}_client_config`, {});
|
|
89
|
+
return `\${${clientConfig.fqn}.tenant_id}`;
|
|
90
|
+
})();
|
|
91
|
+
super(scope, id, { ...props, tenantId: resolvedTenantId });
|
|
92
|
+
this.props = props;
|
|
93
|
+
// Create Terraform outputs
|
|
94
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
95
|
+
value: this.id,
|
|
96
|
+
description: "The ID of the Key Vault",
|
|
97
|
+
});
|
|
98
|
+
this.locationOutput = new cdktf.TerraformOutput(this, "location", {
|
|
99
|
+
value: `\${${this.terraformResource.fqn}.location}`,
|
|
100
|
+
description: "The location of the Key Vault",
|
|
101
|
+
});
|
|
102
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
103
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
104
|
+
description: "The name of the Key Vault",
|
|
105
|
+
});
|
|
106
|
+
this.tagsOutput = new cdktf.TerraformOutput(this, "tags", {
|
|
107
|
+
value: `\${${this.terraformResource.fqn}.tags}`,
|
|
108
|
+
description: "The tags assigned to the Key Vault",
|
|
109
|
+
});
|
|
110
|
+
this.vaultUriOutput = new cdktf.TerraformOutput(this, "vault_uri", {
|
|
111
|
+
value: this.vaultUri,
|
|
112
|
+
description: "The URI of the Key Vault for performing data plane operations",
|
|
113
|
+
});
|
|
114
|
+
// Override logical IDs
|
|
115
|
+
this.idOutput.overrideLogicalId("id");
|
|
116
|
+
this.locationOutput.overrideLogicalId("location");
|
|
117
|
+
this.nameOutput.overrideLogicalId("name");
|
|
118
|
+
this.tagsOutput.overrideLogicalId("tags");
|
|
119
|
+
this.vaultUriOutput.overrideLogicalId("vault_uri");
|
|
120
|
+
// Apply ignore changes if specified
|
|
121
|
+
this._applyIgnoreChanges();
|
|
122
|
+
}
|
|
123
|
+
// =============================================================================
|
|
124
|
+
// REQUIRED ABSTRACT METHODS FROM AzapiResource
|
|
125
|
+
// =============================================================================
|
|
126
|
+
/**
|
|
127
|
+
* Gets the default API version to use when no explicit version is specified
|
|
128
|
+
*/
|
|
129
|
+
defaultVersion() {
|
|
130
|
+
return "2024-11-01";
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Gets the Azure resource type for Key Vault
|
|
134
|
+
*/
|
|
135
|
+
resourceType() {
|
|
136
|
+
return key_vault_schemas_1.KEY_VAULT_TYPE;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Gets the API schema for the resolved version
|
|
140
|
+
*/
|
|
141
|
+
apiSchema() {
|
|
142
|
+
return this.resolveSchema();
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Indicates that location is required for Key Vaults
|
|
146
|
+
*/
|
|
147
|
+
requiresLocation() {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Creates the resource body for the Azure API call
|
|
152
|
+
*/
|
|
153
|
+
createResourceBody(props) {
|
|
154
|
+
const typedProps = props;
|
|
155
|
+
const properties = {
|
|
156
|
+
tenantId: typedProps.tenantId,
|
|
157
|
+
sku: {
|
|
158
|
+
name: typedProps.sku?.name ?? "standard",
|
|
159
|
+
family: typedProps.sku?.family ?? "A",
|
|
160
|
+
},
|
|
161
|
+
enabledForDeployment: typedProps.enabledForDeployment ?? false,
|
|
162
|
+
enabledForDiskEncryption: typedProps.enabledForDiskEncryption ?? false,
|
|
163
|
+
enabledForTemplateDeployment: typedProps.enabledForTemplateDeployment ?? false,
|
|
164
|
+
enableRbacAuthorization: typedProps.enableRbacAuthorization ?? true,
|
|
165
|
+
enableSoftDelete: typedProps.enableSoftDelete ?? true,
|
|
166
|
+
softDeleteRetentionInDays: typedProps.softDeleteRetentionInDays ?? 90,
|
|
167
|
+
publicNetworkAccess: typedProps.publicNetworkAccess ?? "Enabled",
|
|
168
|
+
};
|
|
169
|
+
if (typedProps.enablePurgeProtection !== undefined) {
|
|
170
|
+
properties.enablePurgeProtection = typedProps.enablePurgeProtection;
|
|
171
|
+
}
|
|
172
|
+
// accessPolicies is only meaningful when RBAC authorization is disabled.
|
|
173
|
+
// Always include the array (Azure requires it) - default to empty.
|
|
174
|
+
properties.accessPolicies = typedProps.accessPolicies ?? [];
|
|
175
|
+
if (typedProps.networkAcls) {
|
|
176
|
+
properties.networkAcls = {
|
|
177
|
+
defaultAction: typedProps.networkAcls.defaultAction ?? "Allow",
|
|
178
|
+
bypass: typedProps.networkAcls.bypass ?? "AzureServices",
|
|
179
|
+
ipRules: typedProps.networkAcls.ipRules ?? [],
|
|
180
|
+
virtualNetworkRules: typedProps.networkAcls.virtualNetworkRules ?? [],
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
location: this.location,
|
|
185
|
+
tags: this.allTags(),
|
|
186
|
+
properties,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// =============================================================================
|
|
190
|
+
// PUBLIC METHODS FOR KEY VAULT OPERATIONS
|
|
191
|
+
// =============================================================================
|
|
192
|
+
/**
|
|
193
|
+
* Get the data plane URI of the Key Vault
|
|
194
|
+
*
|
|
195
|
+
* Returns the deterministic Azure public cloud Key Vault URI in the form
|
|
196
|
+
* `https://{name}.vault.azure.net/`. This avoids depending on the AZAPI
|
|
197
|
+
* resource `output` attribute which is only populated for properties listed
|
|
198
|
+
* in `response_export_values`.
|
|
199
|
+
*/
|
|
200
|
+
get vaultUri() {
|
|
201
|
+
return `https://\${${this.terraformResource.fqn}.name}.vault.azure.net/`;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Add a tag to the Key Vault
|
|
205
|
+
*/
|
|
206
|
+
addTag(key, value) {
|
|
207
|
+
if (!this.props.tags) {
|
|
208
|
+
this.props.tags = {};
|
|
209
|
+
}
|
|
210
|
+
this.props.tags[key] = value;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Remove a tag from the Key Vault
|
|
214
|
+
*/
|
|
215
|
+
removeTag(key) {
|
|
216
|
+
if (this.props.tags && this.props.tags[key]) {
|
|
217
|
+
delete this.props.tags[key];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// =============================================================================
|
|
221
|
+
// PRIVATE HELPER METHODS
|
|
222
|
+
// =============================================================================
|
|
223
|
+
/**
|
|
224
|
+
* Applies ignore changes lifecycle rules if specified in props
|
|
225
|
+
*/
|
|
226
|
+
_applyIgnoreChanges() {
|
|
227
|
+
if (this.props.ignoreChanges && this.props.ignoreChanges.length > 0) {
|
|
228
|
+
this.terraformResource.addOverride("lifecycle", [
|
|
229
|
+
{
|
|
230
|
+
ignore_changes: this.props.ignoreChanges,
|
|
231
|
+
},
|
|
232
|
+
]);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.KeyVault = KeyVault;
|
|
237
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
238
|
+
KeyVault[_a] = { fqn: "@microsoft/terraform-cdk-constructs.KeyVault", version: "1.10.0" };
|
|
239
|
+
// Static initializer runs once when the class is first loaded
|
|
240
|
+
(() => {
|
|
241
|
+
azapi_resource_1.AzapiResource.registerSchemas(key_vault_schemas_1.KEY_VAULT_TYPE, key_vault_schemas_1.ALL_KEY_VAULT_VERSIONS);
|
|
242
|
+
})();
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LXZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLWtleXZhdWx0L2xpYi9rZXktdmF1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCwrQkFBK0I7QUFFL0IsMkRBQTZFO0FBQzdFLDhFQUdtRDtBQUNuRCxrSEFBNEc7QUFpUTVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DRztBQUNILE1BQWEsUUFBUyxTQUFRLDhCQUFhO0lBa0J6Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELDRFQUE0RTtRQUM1RSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRCxJQUNFLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxDQUFDO2dCQUNuQyxLQUFLLENBQUMseUJBQXlCLEdBQUcsRUFBRSxFQUNwQyxDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IseURBQXlELENBQzFELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELDZFQUE2RTtRQUM3RSw0RUFBNEU7UUFDNUUsK0NBQStDO1FBQy9DLE1BQU0sZ0JBQWdCLEdBQ3BCLEtBQUssQ0FBQyxRQUFRO1lBQ2QsQ0FBQyxHQUFHLEVBQUU7Z0JBQ0osTUFBTSxZQUFZLEdBQUcsSUFBSSxnREFBcUIsQ0FDNUMsS0FBSyxFQUNMLEdBQUcsRUFBRSxnQkFBZ0IsRUFDckIsRUFBRSxDQUNILENBQUM7Z0JBQ0YsT0FBTyxNQUFNLFlBQVksQ0FBQyxHQUFHLGFBQWEsQ0FBQztZQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQW1CLENBQUMsQ0FBQztRQUU1RSxJ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Q0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFhLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxHQUFXO1FBQzFCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLHlCQUF5QjtJQUN6QixnRkFBZ0Y7SUFFaEY7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlDO29CQUNFLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7aUJBQ3pDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7O0FBOU5ILDRCQStOQzs7O0FBOU5DLDhEQUE4RDtBQUM5RDtJQUNFLDhCQUFhLENBQUMsZUFBZSxDQUFDLGtDQUFjLEVBQUUsMENBQXNCLENBQUMsQ0FBQztBQUN4RSxDQUFDLEdBQUEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pZmllZCBBenVyZSBLZXkgVmF1bHQgaW1wbGVtZW50YXRpb24gdXNpbmcgQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdmVyc2lvbi1hd2FyZSBpbXBsZW1lbnRhdGlvbiBmb3IgQXp1cmUgS2V5IFZhdWx0XG4gKiAoTWljcm9zb2Z0LktleVZhdWx0L3ZhdWx0cykgdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdmVyc2lvbiBtYW5hZ2VtZW50LFxuICogc2NoZW1hIHZhbGlkYXRpb24sIGFuZCBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbiBhY3Jvc3MgYWxsIHN1cHBvcnRlZCBBUEkgdmVyc2lvbnMuXG4gKlxuICogU3VwcG9ydGVkIEFQSSBWZXJzaW9uczpcbiAqIC0gMjAyMy0wMi0wMSAoQWN0aXZlKVxuICogLSAyMDIzLTA3LTAxIChBY3RpdmUpXG4gKiAtIDIwMjQtMTEtMDEgKEFjdGl2ZSwgTGF0ZXN0KVxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgbGF0ZXN0IHZlcnNpb24gcmVzb2x1dGlvbiB3aGVuIG5vIHZlcnNpb24gaXMgc3BlY2lmaWVkXG4gKiAtIEV4cGxpY2l0IHZlcnNpb24gcGlubmluZyBmb3Igc3RhYmlsaXR5IHJlcXVpcmVtZW50c1xuICogLSBTY2hlbWEtZHJpdmVuIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uXG4gKiAtIEZ1bGwgSlNJSSBjb21wbGlhbmNlIGZvciBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0XG4gKiAtIENvbmZpZ3VyYWJsZSBTS1UsIHRlbmFudCwgUkJBQyBhbmQgYWNjZXNzIHBvbGljaWVzXG4gKiAtIE5ldHdvcmsgQUNMcyBhbmQgcHVibGljIG5ldHdvcmsgYWNjZXNzIGNvbnRyb2xcbiAqIC0gU29mdC1kZWxldGUgYW5kIHB1cmdlIHByb3RlY3Rpb24gc3VwcG9ydFxuICovXG5cbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFMTF9LRVlfVkFVTFRfVkVSU0lPTlMsIEtFWV9WQVVMVF9UWVBFIH0gZnJvbSBcIi4va2V5LXZhdWx0LXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBEYXRhQXphcGlDbGllbnRDb25maWcgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvYXphcGkvcHJvdmlkZXJzLWF6YXBpL2RhdGEtYXphcGktY2xpZW50LWNvbmZpZ1wiO1xuaW1wb3J0IHsgQXBpU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL3ZlcnNpb24tbWFuYWdlci9pbnRlcmZhY2VzL3ZlcnNpb24taW50ZXJmYWNlc1wiO1xuXG4vKipcbiAqIFNLVSBjb25maWd1cmF0aW9uIGZvciBLZXkgVmF1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlWYXVsdFNrdSB7XG4gIC8qKlxuICAgKiBUaGUgU0tVIG5hbWUgKHN0YW5kYXJkIG9yIHByZW1pdW0pXG4gICAqXG4gICAqIEBkZWZhdWx0IFwic3RhbmRhcmRcIlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogXCJzdGFuZGFyZFwiIHwgXCJwcmVtaXVtXCI7XG5cbiAgLyoqXG4gICAqIFRoZSBTS1UgZmFtaWx5LiBBbHdheXMgXCJBXCIgZm9yIEtleSBWYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJBXCJcbiAgICovXG4gIHJlYWRvbmx5IGZhbWlseT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9ucyBjb25maWd1cmF0aW9uIGZvciBhbiBhY2Nlc3MgcG9saWN5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHRBY2Nlc3NQb2xpY3lQZXJtaXNzaW9ucyB7XG4gIC8qKlxuICAgKiBQZXJtaXNzaW9ucyBmb3Iga2V5cyAoZS5nLiBcImdldFwiLCBcImxpc3RcIiwgXCJjcmVhdGVcIiwgXCJkZWxldGVcIilcbiAgICovXG4gIHJlYWRvbmx5IGtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUGVybWlzc2lvbnMgZm9yIHNlY3JldHMgKGUuZy4gXCJnZXRcIiwgXCJsaXN0XCIsIFwic2V0XCIsIFwiZGVsZXRlXCIpXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFBlcm1pc3Npb25zIGZvciBjZXJ0aWZpY2F0ZXMgKGUuZy4gXCJnZXRcIiwgXCJsaXN0XCIsIFwiY3JlYXRlXCIsIFwiZGVsZXRlXCIpXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUGVybWlzc2lvbnMgZm9yIHN0b3JhZ2UgKGUuZy4gXCJnZXRcIiwgXCJsaXN0XCIsIFwic2V0XCIsIFwiZGVsZXRlXCIpXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQWNjZXNzIHBvbGljeSBjb25maWd1cmF0aW9uIGZvciB0aGUgS2V5IFZhdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHRBY2Nlc3NQb2xpY3kge1xuICAvKipcbiAgICogVGhlIEF6dXJlIEFjdGl2ZSBEaXJlY3RvcnkgdGVuYW50IElEXG4gICAqL1xuICByZWFkb25seSB0ZW5hbnRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IElEIG9mIGEgdXNlciwgc2VydmljZSBwcmluY2lwYWwsIG9yIHNlY3VyaXR5IGdyb3VwIGluIEFBRFxuICAgKi9cbiAgcmVhZG9ubHkgb2JqZWN0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIElEIG9mIHRoZSBjbGllbnQgbWFraW5nIHRoZSByZXF1ZXN0IG9uIGJlaGFsZiBvZiB0aGUgdXNlclxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25JZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIGlkZW50aXR5XG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uczogS2V5VmF1bHRBY2Nlc3NQb2xpY3lQZXJtaXNzaW9ucztcbn1cblxuLyoqXG4gKiBJUCBydWxlIGZvciBLZXkgVmF1bHQgbmV0d29yayBBQ0xzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHRJcFJ1bGUge1xuICAvKipcbiAgICogSVAgYWRkcmVzcyBvciBDSURSIHJhbmdlXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZpcnR1YWwgbmV0d29yayBydWxlIGZvciBLZXkgVmF1bHQgbmV0d29yayBBQ0xzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHRWaXJ0dWFsTmV0d29ya1J1bGUge1xuICAvKipcbiAgICogVmlydHVhbCBuZXR3b3JrIHN1Ym5ldCByZXNvdXJjZSBJRFxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgbWlzc2luZyBWTkVUIHNlcnZpY2UgZW5kcG9pbnRcbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZU1pc3NpbmdWbmV0U2VydmljZUVuZHBvaW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBOZXR3b3JrIEFDTCBjb25maWd1cmF0aW9uIGZvciB0aGUgS2V5IFZhdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmF1bHROZXR3b3JrQWNscyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IGFjdGlvbiB3aGVuIG5vIHJ1bGUgbWF0Y2hlcyAoQWxsb3cgb3IgRGVueSlcbiAgICpcbiAgICogQGRlZmF1bHQgXCJBbGxvd1wiXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QWN0aW9uPzogXCJBbGxvd1wiIHwgXCJEZW55XCI7XG5cbiAgLyoqXG4gICAqIFRlbGxzIHdoYXQgdHJhZmZpYyBjYW4gYnlwYXNzIG5ldHdvcmsgcnVsZXMuIENhbiBiZSAnQXp1cmVTZXJ2aWNlcycgb3IgJ05vbmUnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkF6dXJlU2VydmljZXNcIlxuICAgKi9cbiAgcmVhZG9ubHkgYnlwYXNzPzogXCJBenVyZVNlcnZpY2VzXCIgfCBcIk5vbmVcIjtcblxuICAvKipcbiAgICogSVAgcnVsZXMgZm9yIHRoZSBLZXkgVmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlwUnVsZXM/OiBLZXlWYXVsdElwUnVsZVtdO1xuXG4gIC8qKlxuICAgKiBWaXJ0dWFsIG5ldHdvcmsgc3VibmV0IHJ1bGVzIGZvciB0aGUgS2V5IFZhdWx0XG4gICAqL1xuICByZWFkb25seSB2aXJ0dWFsTmV0d29ya1J1bGVzPzogS2V5VmF1bHRWaXJ0dWFsTmV0d29ya1J1bGVbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgdW5pZmllZCBBenVyZSBLZXkgVmF1bHRcbiAqXG4gKiBFeHRlbmRzIEF6YXBpUmVzb3VyY2VQcm9wcyB3aXRoIEtleSBWYXVsdCBzcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleVZhdWx0UHJvcHMgZXh0ZW5kcyBBemFwaVJlc291cmNlUHJvcHMge1xuICAvKipcbiAgICogUmVzb3VyY2UgZ3JvdXAgSUQgd2hlcmUgdGhlIEtleSBWYXVsdCB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlR3JvdXBJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFNLVSAocHJpY2luZyB0aWVyKSBmb3IgdGhlIEtleSBWYXVsdFxuICAgKlxuICAgKiBAZGVmYXVsdCB7IG5hbWU6IFwic3RhbmRhcmRcIiwgZmFtaWx5OiBcIkFcIiB9XG4gICAqL1xuICByZWFkb25seSBza3U/OiBLZXlWYXVsdFNrdTtcblxuICAvKipcbiAgICogVGhlIEF6dXJlIEFjdGl2ZSBEaXJlY3RvcnkgdGVuYW50IElEIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW5nXG4gICAqIHJlcXVlc3RzIHRvIHRoZSBLZXkgVmF1bHQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgdGVuYW50IElEIGZyb20gdGhlXG4gICAqIEFaQVBJIGNsaWVudCBjb25maWd1cmF0aW9uIGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSB0ZW5hbnRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQWNjZXNzIHBvbGljaWVzIGZvciB0aGUgS2V5IFZhdWx0LlxuICAgKlxuICAgKiBPbmx5IGFwcGxpY2FibGUgd2hlbiBgZW5hYmxlUmJhY0F1dGhvcml6YXRpb25gIGlzIGZhbHNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzUG9saWNpZXM/OiBLZXlWYXVsdEFjY2Vzc1BvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIEFDTCBjb25maWd1cmF0aW9uIGZvciB0aGUgS2V5IFZhdWx0XG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQWNscz86IEtleVZhdWx0TmV0d29ya0FjbHM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQXp1cmUgVmlydHVhbCBNYWNoaW5lcyBhcmUgcGVybWl0dGVkIHRvIHJldHJpZXZlIGNlcnRpZmljYXRlc1xuICAgKiBzdG9yZWQgYXMgc2VjcmV0cyBmcm9tIHRoZSBLZXkgVmF1bHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkRm9yRGVwbG95bWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQXp1cmUgRGlzayBFbmNyeXB0aW9uIGlzIHBlcm1pdHRlZCB0byByZXRyaWV2ZSBzZWNyZXRzIGZyb20gdGhlXG4gICAqIEtleSBWYXVsdCBhbmQgdW53cmFwIGtleXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkRm9yRGlza0VuY3J5cHRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEF6dXJlIFJlc291cmNlIE1hbmFnZXIgaXMgcGVybWl0dGVkIHRvIHJldHJpZXZlIHNlY3JldHMgZnJvbSB0aGVcbiAgICogS2V5IFZhdWx0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZEZvclRlbXBsYXRlRGVwbG95bWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQXp1cmUgUkJBQyBpcyB1c2VkIHRvIGF1dGhvcml6ZSBkYXRhIGFjdGlvbnMgaW5zdGVhZCBvZiBhY2Nlc3NcbiAgICogcG9saWNpZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVJiYWNBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBzb2Z0LWRlbGV0ZSBpcyBlbmFibGVkIG9uIHRoZSBLZXkgVmF1bHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVNvZnREZWxldGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGF5cyB0aGF0IGl0ZW1zIHNob3VsZCBiZSByZXRhaW5lZCBhZnRlciBzb2Z0LWRlbGV0ZSAoNy05MCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IDkwXG4gICAqL1xuICByZWFkb25seSBzb2Z0RGVsZXRlUmV0ZW50aW9uSW5EYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHB1cmdlIHByb3RlY3Rpb24gaXMgZW5hYmxlZC4gT25jZSBlbmFibGVkLCB0aGlzIHByb3BlcnR5IGNhbm5vdFxuICAgKiBiZSBkaXNhYmxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVB1cmdlUHJvdGVjdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIEtleSBWYXVsdCBhY2NlcHRzIHRyYWZmaWMgZnJvbSBwdWJsaWMgbmV0d29ya3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiRW5hYmxlZFwiXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNOZXR3b3JrQWNjZXNzPzogXCJFbmFibGVkXCIgfCBcIkRpc2FibGVkXCI7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdG8gaWdub3JlIGR1cmluZyB1cGRhdGVzXG4gICAqXG4gICAqIEBleGFtcGxlIFtcInRhZ3NcIl1cbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZUNoYW5nZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBLZXkgVmF1bHQgcHJvcGVydGllcyBmb3IgdGhlIHJlcXVlc3QgYm9keVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleVZhdWx0Qm9keVByb3BlcnRpZXMge1xuICByZWFkb25seSB0ZW5hbnRJZDogc3RyaW5nO1xuICByZWFkb25seSBza3U6IEtleVZhdWx0U2t1O1xuICByZWFkb25seSBhY2Nlc3NQb2xpY2llcz86IEtleVZhdWx0QWNjZXNzUG9saWN5W107XG4gIHJlYWRvbmx5IG5ldHdvcmtBY2xzPzogS2V5VmF1bHROZXR3b3JrQWNscztcbiAgcmVhZG9ubHkgZW5hYmxlZEZvckRlcGxveW1lbnQ/OiBib29sZWFuO1xuICByZWFkb25seSBlbmFibGVkRm9yRGlza0VuY3J5cHRpb24/OiBib29sZWFuO1xuICByZWFkb25seSBlbmFibGVkRm9yVGVtcGxhdGVEZXBsb3ltZW50PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW5hYmxlUmJhY0F1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICByZWFkb25seSBlbmFibGVTb2Z0RGVsZXRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc29mdERlbGV0ZVJldGVudGlvbkluRGF5cz86IG51bWJlcjtcbiAgcmVhZG9ubHkgZW5hYmxlUHVyZ2VQcm90ZWN0aW9uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcHVibGljTmV0d29ya0FjY2Vzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgYm9keSBpbnRlcmZhY2UgZm9yIEF6dXJlIEtleSBWYXVsdCBBUEkgY2FsbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlWYXVsdEJvZHkge1xuICByZWFkb25seSBsb2NhdGlvbjogc3RyaW5nO1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgcHJvcGVydGllczogS2V5VmF1bHRCb2R5UHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBVbmlmaWVkIEF6dXJlIEtleSBWYXVsdCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW5nbGUsIHZlcnNpb24tYXdhcmUgaW1wbGVtZW50YXRpb24gdGhhdCBhdXRvbWF0aWNhbGx5XG4gKiBoYW5kbGVzIHZlcnNpb24gcmVzb2x1dGlvbiwgc2NoZW1hIHZhbGlkYXRpb24sIGFuZCBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvblxuICogd2hpbGUgbWFpbnRhaW5pbmcgZnVsbCBKU0lJIGNvbXBsaWFuY2UuXG4gKlxuICogQXp1cmUgS2V5IFZhdWx0IGlzIGEgY2xvdWQgc2VydmljZSBmb3Igc2VjdXJlbHkgc3RvcmluZyBhbmQgYWNjZXNzaW5nIHNlY3JldHMsXG4gKiBrZXlzLCBhbmQgY2VydGlmaWNhdGVzIHdpdGggY2VudHJhbGl6ZWQgbWFuYWdlbWVudCBhbmQgYWNjZXNzIGNvbnRyb2wuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIHZlcnNpb24gcmVzb2x1dGlvbiBhbmQgY3VycmVudCB0ZW5hbnQ6XG4gKiBjb25zdCBrZXlWYXVsdCA9IG5ldyBLZXlWYXVsdCh0aGlzLCBcImt2XCIsIHtcbiAqICAgbmFtZTogXCJteS1rZXl2YXVsdC0xMjM0XCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVXNhZ2Ugd2l0aCBleHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcgYW5kIGNvbmZpZ3VyYXRpb246XG4gKiBjb25zdCBrZXlWYXVsdCA9IG5ldyBLZXlWYXVsdCh0aGlzLCBcImt2XCIsIHtcbiAqICAgbmFtZTogXCJteS1rZXl2YXVsdC0xMjM0XCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gKiAgIHNrdTogeyBuYW1lOiBcInByZW1pdW1cIiB9LFxuICogICBhcGlWZXJzaW9uOiBcIjIwMjMtMDctMDFcIixcbiAqICAgZW5hYmxlUHVyZ2VQcm90ZWN0aW9uOiB0cnVlLFxuICogICBwdWJsaWNOZXR3b3JrQWNjZXNzOiBcIkRpc2FibGVkXCIsXG4gKiAgIG5ldHdvcmtBY2xzOiB7XG4gKiAgICAgZGVmYXVsdEFjdGlvbjogXCJEZW55XCIsXG4gKiAgICAgYnlwYXNzOiBcIkF6dXJlU2VydmljZXNcIixcbiAqICAgfSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXlWYXVsdCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgcnVucyBvbmNlIHdoZW4gdGhlIGNsYXNzIGlzIGZpcnN0IGxvYWRlZFxuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKEtFWV9WQVVMVF9UWVBFLCBBTExfS0VZX1ZBVUxUX1ZFUlNJT05TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcHJvcGVydGllcyBmb3IgdGhpcyBLZXkgVmF1bHQgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogS2V5VmF1bHRQcm9wcztcblxuICAvLyBPdXRwdXQgcHJvcGVydGllcyBmb3IgZWFzeSBhY2Nlc3MgYW5kIHJlZmVyZW5jaW5nXG4gIHB1YmxpYyByZWFkb25seSBpZE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgbG9jYXRpb25PdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IHRhZ3NPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IHZhdWx0VXJpT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXp1cmUgS2V5IFZhdWx0IHVzaW5nIHRoZSBBemFwaVJlc291cmNlIGZyYW1ld29ya1xuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YW5jZVxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBLZXkgVmF1bHRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBLZXlWYXVsdFByb3BzKSB7XG4gICAgLy8gVmFsaWRhdGUgc29mdERlbGV0ZVJldGVudGlvbkluRGF5cyBib3VuZHMgYmVmb3JlIGRlbGVnYXRpbmcgdG8gYmFzZSBjbGFzc1xuICAgIGlmIChwcm9wcy5zb2Z0RGVsZXRlUmV0ZW50aW9uSW5EYXlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMuc29mdERlbGV0ZVJldGVudGlvbkluRGF5cyA8IDcgfHxcbiAgICAgICAgcHJvcHMuc29mdERlbGV0ZVJldGVudGlvbkluRGF5cyA+IDkwXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwic29mdERlbGV0ZVJldGVudGlvbkluRGF5cyBtdXN0IGJlIGJldHdlZW4gNyBhbmQgOTAgZGF5c1wiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRlbmFudElkIGlzIG5vdCBwcm92aWRlZCwgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IEFaQVBJIGNsaWVudCB0ZW5hbnQuXG4gICAgLy8gVGhlIERhdGFBemFwaUNsaWVudENvbmZpZyBkYXRhIHNvdXJjZSBtdXN0IGJlIGNyZWF0ZWQgb24gdGhlIHBhcmVudCBzY29wZVxuICAgIC8vIHNvIGl0IGlzIGF2YWlsYWJsZSBiZWZvcmUgc3VwZXIoKSBpcyBjYWxsZWQuXG4gICAgY29uc3QgcmVzb2x2ZWRUZW5hbnRJZCA9XG4gICAgICBwcm9wcy50ZW5hbnRJZCA/P1xuICAgICAgKCgpID0+IHtcbiAgICAgICAgY29uc3QgY2xpZW50Q29uZmlnID0gbmV3IERhdGFBemFwaUNsaWVudENvbmZpZyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICBgJHtpZH1fY2xpZW50X2NvbmZpZ2AsXG4gICAgICAgICAge30sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBgXFwkeyR7Y2xpZW50Q29uZmlnLmZxbn0udGVuYW50X2lkfWA7XG4gICAgICB9KSgpO1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7IC4uLnByb3BzLCB0ZW5hbnRJZDogcmVzb2x2ZWRUZW5hbnRJZCB9IGFzIEtleVZhdWx0UHJvcHMpO1xuXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgLy8gQ3JlYXRlIFRlcnJhZm9ybSBvdXRwdXRzXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgS2V5IFZhdWx0XCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvY2F0aW9uT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImxvY2F0aW9uXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59LmxvY2F0aW9ufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbG9jYXRpb24gb2YgdGhlIEtleSBWYXVsdFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIEtleSBWYXVsdFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy50YWdzT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcInRhZ3NcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0udGFnc31gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHRhZ3MgYXNzaWduZWQgdG8gdGhlIEtleSBWYXVsdFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy52YXVsdFVyaU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJ2YXVsdF91cmlcIiwge1xuICAgICAgdmFsdWU6IHRoaXMudmF1bHRVcmksXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJUaGUgVVJJIG9mIHRoZSBLZXkgVmF1bHQgZm9yIHBlcmZvcm1pbmcgZGF0YSBwbGFuZSBvcGVyYXRpb25zXCIsXG4gICAgfSk7XG5cbiAgICAvLyBPdmVycmlkZSBsb2dpY2FsIElEc1xuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLmxvY2F0aW9uT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibG9jYXRpb25cIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLnRhZ3NPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJ0YWdzXCIpO1xuICAgIHRoaXMudmF1bHRVcmlPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJ2YXVsdF91cmlcIik7XG5cbiAgICAvLyBBcHBseSBpZ25vcmUgY2hhbmdlcyBpZiBzcGVjaWZpZWRcbiAgICB0aGlzLl9hcHBseUlnbm9yZUNoYW5nZXMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFUVVJUkVEIEFCU1RSQUNUIE1FVEhPRFMgRlJPTSBBemFwaVJlc291cmNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRlZmF1bHQgQVBJIHZlcnNpb24gdG8gdXNlIHdoZW4gbm8gZXhwbGljaXQgdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMjQtMTEtMDFcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBenVyZSByZXNvdXJjZSB0eXBlIGZvciBLZXkgVmF1bHRcbiAgICovXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gS0VZX1ZBVUxUX1RZUEU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICovXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIEtleSBWYXVsdHNcbiAgICovXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHJlc291cmNlIGJvZHkgZm9yIHRoZSBBenVyZSBBUEkgY2FsbFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc291cmNlQm9keShwcm9wczogYW55KTogYW55IHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgS2V5VmF1bHRQcm9wcztcblxuICAgIGNvbnN0IHByb3BlcnRpZXM6IGFueSA9IHtcbiAgICAgIHRlbmFudElkOiB0eXBlZFByb3BzLnRlbmFudElkLFxuICAgICAgc2t1OiB7XG4gICAgICAgIG5hbWU6IHR5cGVkUHJvcHMuc2t1Py5uYW1lID8/IFwic3RhbmRhcmRcIixcbiAgICAgICAgZmFtaWx5OiB0eXBlZFByb3BzLnNrdT8uZmFtaWx5ID8/IFwiQVwiLFxuICAgICAgfSxcbiAgICAgIGVuYWJsZWRGb3JEZXBsb3ltZW50OiB0eXBlZFByb3BzLmVuYWJsZWRGb3JEZXBsb3ltZW50ID8/IGZhbHNlLFxuICAgICAgZW5hYmxlZEZvckRpc2tFbmNyeXB0aW9uOiB0eXBlZFByb3BzLmVuYWJsZWRGb3JEaXNrRW5jcnlwdGlvbiA/PyBmYWxzZSxcbiAgICAgIGVuYWJsZWRGb3JUZW1wbGF0ZURlcGxveW1lbnQ6XG4gICAgICAgIHR5cGVkUHJvcHMuZW5hYmxlZEZvclRlbXBsYXRlRGVwbG95bWVudCA/PyBmYWxzZSxcbiAgICAgIGVuYWJsZVJiYWNBdXRob3JpemF0aW9uOiB0eXBlZFByb3BzLmVuYWJsZVJiYWNBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBlbmFibGVTb2Z0RGVsZXRlOiB0eXBlZFByb3BzLmVuYWJsZVNvZnREZWxldGUgPz8gdHJ1ZSxcbiAgICAgIHNvZnREZWxldGVSZXRlbnRpb25JbkRheXM6IHR5cGVkUHJvcHMuc29mdERlbGV0ZVJldGVudGlvbkluRGF5cyA/PyA5MCxcbiAgICAgIHB1YmxpY05ldHdvcmtBY2Nlc3M6IHR5cGVkUHJvcHMucHVibGljTmV0d29ya0FjY2VzcyA/PyBcIkVuYWJsZWRcIixcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVkUHJvcHMuZW5hYmxlUHVyZ2VQcm90ZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BlcnRpZXMuZW5hYmxlUHVyZ2VQcm90ZWN0aW9uID0gdHlwZWRQcm9wcy5lbmFibGVQdXJnZVByb3RlY3Rpb247XG4gICAgfVxuXG4gICAgLy8gYWNjZXNzUG9saWNpZXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gUkJBQyBhdXRob3JpemF0aW9uIGlzIGRpc2FibGVkLlxuICAgIC8vIEFsd2F5cyBpbmNsdWRlIHRoZSBhcnJheSAoQXp1cmUgcmVxdWlyZXMgaXQpIC0gZGVmYXVsdCB0byBlbXB0eS5cbiAgICBwcm9wZXJ0aWVzLmFjY2Vzc1BvbGljaWVzID0gdHlwZWRQcm9wcy5hY2Nlc3NQb2xpY2llcyA/PyBbXTtcblxuICAgIGlmICh0eXBlZFByb3BzLm5ldHdvcmtBY2xzKSB7XG4gICAgICBwcm9wZXJ0aWVzLm5ldHdvcmtBY2xzID0ge1xuICAgICAgICBkZWZhdWx0QWN0aW9uOiB0eXBlZFByb3BzLm5ldHdvcmtBY2xzLmRlZmF1bHRBY3Rpb24gPz8gXCJBbGxvd1wiLFxuICAgICAgICBieXBhc3M6IHR5cGVkUHJvcHMubmV0d29ya0FjbHMuYnlwYXNzID8/IFwiQXp1cmVTZXJ2aWNlc1wiLFxuICAgICAgICBpcFJ1bGVzOiB0eXBlZFByb3BzLm5ldHdvcmtBY2xzLmlwUnVsZXMgPz8gW10sXG4gICAgICAgIHZpcnR1YWxOZXR3b3JrUnVsZXM6IHR5cGVkUHJvcHMubmV0d29ya0FjbHMudmlydHVhbE5ldHdvcmtSdWxlcyA/PyBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB0aGlzLmxvY2F0aW9uLFxuICAgICAgdGFnczogdGhpcy5hbGxUYWdzKCksXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQVUJMSUMgTUVUSE9EUyBGT1IgS0VZIFZBVUxUIE9QRVJBVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXRhIHBsYW5lIFVSSSBvZiB0aGUgS2V5IFZhdWx0XG4gICAqXG4gICAqIFJldHVybnMgdGhlIGRldGVybWluaXN0aWMgQXp1cmUgcHVibGljIGNsb3VkIEtleSBWYXVsdCBVUkkgaW4gdGhlIGZvcm1cbiAgICogYGh0dHBzOi8ve25hbWV9LnZhdWx0LmF6dXJlLm5ldC9gLiBUaGlzIGF2b2lkcyBkZXBlbmRpbmcgb24gdGhlIEFaQVBJXG4gICAqIHJlc291cmNlIGBvdXRwdXRgIGF0dHJpYnV0ZSB3aGljaCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgcHJvcGVydGllcyBsaXN0ZWRcbiAgICogaW4gYHJlc3BvbnNlX2V4cG9ydF92YWx1ZXNgLlxuICAgKi9cbiAgcHVibGljIGdldCB2YXVsdFVyaSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaHR0cHM6Ly9cXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX0udmF1bHQuYXp1cmUubmV0L2A7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdGFnIHRvIHRoZSBLZXkgVmF1bHRcbiAgICovXG4gIHB1YmxpYyBhZGRUYWcoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvcHMudGFncykge1xuICAgICAgKHRoaXMucHJvcHMgYXMgYW55KS50YWdzID0ge307XG4gICAgfVxuICAgIHRoaXMucHJvcHMudGFncyFba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhZyBmcm9tIHRoZSBLZXkgVmF1bHRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVUYWcoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcy50YWdzICYmIHRoaXMucHJvcHMudGFnc1trZXldKSB7XG4gICAgICBkZWxldGUgdGhpcy5wcm9wcy50YWdzW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBIRUxQRVIgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGlnbm9yZSBjaGFuZ2VzIGxpZmVjeWNsZSBydWxlcyBpZiBzcGVjaWZpZWQgaW4gcHJvcHNcbiAgICovXG4gIHByaXZhdGUgX2FwcGx5SWdub3JlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzICYmIHRoaXMucHJvcHMuaWdub3JlQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRlcnJhZm9ybVJlc291cmNlLmFkZE92ZXJyaWRlKFwibGlmZWN5Y2xlXCIsIFtcbiAgICAgICAge1xuICAgICAgICAgIGlnbm9yZV9jaGFuZ2VzOiB0aGlzLnByb3BzLmlnbm9yZUNoYW5nZXMsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test for Azure Key Vault
|
|
3
|
+
*
|
|
4
|
+
* This test demonstrates basic usage of the KeyVault construct
|
|
5
|
+
* and validates deployment, idempotency, and cleanup.
|
|
6
|
+
*
|
|
7
|
+
* Run with: npm run integration:nostream
|
|
8
|
+
*/
|
|
9
|
+
import "cdktf/lib/testing/adapters/jest";
|