@microsoft/terraform-cdk-constructs 1.2.0 → 1.3.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 +54846 -26661
- package/API.md +72091 -23784
- package/lib/azure-actiongroup/index.d.ts +0 -10
- package/lib/azure-actiongroup/index.js +1 -11
- package/lib/azure-actiongroup/lib/action-group.d.ts +0 -10
- package/lib/azure-actiongroup/lib/action-group.js +6 -32
- package/lib/azure-actiongroup/lib/index.d.ts +1 -4
- package/lib/azure-actiongroup/lib/index.js +2 -5
- package/lib/azure-activitylogalert/index.d.ts +0 -10
- package/lib/azure-activitylogalert/index.js +1 -11
- package/lib/azure-activitylogalert/lib/activity-log-alert.d.ts +0 -10
- package/lib/azure-activitylogalert/lib/activity-log-alert.js +6 -32
- package/lib/azure-activitylogalert/lib/index.d.ts +1 -4
- package/lib/azure-activitylogalert/lib/index.js +2 -5
- package/lib/azure-aks/index.d.ts +0 -8
- package/lib/azure-aks/index.js +1 -11
- package/lib/azure-aks/lib/aks-cluster.d.ts +4 -13
- package/lib/azure-aks/lib/aks-cluster.js +13 -36
- package/lib/azure-aks/lib/index.d.ts +1 -10
- package/lib/azure-aks/lib/index.js +2 -21
- package/lib/azure-diagnosticsettings/index.d.ts +0 -6
- package/lib/azure-diagnosticsettings/index.js +1 -7
- package/lib/azure-diagnosticsettings/lib/diagnostic-settings.d.ts +0 -10
- package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +6 -32
- package/lib/azure-diagnosticsettings/lib/index.d.ts +1 -7
- package/lib/azure-diagnosticsettings/lib/index.js +2 -8
- package/lib/azure-dnsforwardingruleset/index.d.ts +1 -0
- package/lib/azure-dnsforwardingruleset/index.js +18 -0
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.d.ts +24 -0
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.js +206 -0
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.d.ts +174 -0
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +214 -0
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.d.ts +24 -0
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.js +242 -0
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.d.ts +193 -0
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +193 -0
- package/lib/azure-dnsforwardingruleset/lib/index.d.ts +6 -0
- package/lib/azure-dnsforwardingruleset/lib/index.js +23 -0
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.d.ts +24 -0
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.js +199 -0
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.d.ts +160 -0
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +178 -0
- package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.d.ts +9 -0
- package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.js +133 -0
- package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.d.ts +9 -0
- package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.js +350 -0
- package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.d.ts +9 -0
- package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.js +397 -0
- package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.d.ts +9 -0
- package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.js +285 -0
- package/lib/azure-dnsresolver/index.d.ts +1 -0
- package/lib/azure-dnsresolver/index.js +18 -0
- package/lib/azure-dnsresolver/lib/dns-resolver-schemas.d.ts +24 -0
- package/lib/azure-dnsresolver/lib/dns-resolver-schemas.js +218 -0
- package/lib/azure-dnsresolver/lib/dns-resolver.d.ts +170 -0
- package/lib/azure-dnsresolver/lib/dns-resolver.js +236 -0
- package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.d.ts +24 -0
- package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.js +261 -0
- package/lib/azure-dnsresolver/lib/inbound-endpoint.d.ts +189 -0
- package/lib/azure-dnsresolver/lib/inbound-endpoint.js +243 -0
- package/lib/azure-dnsresolver/lib/index.d.ts +6 -0
- package/lib/azure-dnsresolver/lib/index.js +23 -0
- package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.d.ts +24 -0
- package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.js +231 -0
- package/lib/azure-dnsresolver/lib/outbound-endpoint.d.ts +175 -0
- package/lib/azure-dnsresolver/lib/outbound-endpoint.js +234 -0
- package/lib/azure-dnsresolver/test/dns-resolver.integ.d.ts +14 -0
- package/lib/azure-dnsresolver/test/dns-resolver.integ.js +117 -0
- package/lib/azure-dnsresolver/test/dns-resolver.spec.d.ts +9 -0
- package/lib/azure-dnsresolver/test/dns-resolver.spec.js +353 -0
- package/lib/azure-dnsresolver/test/inbound-endpoint.integ.d.ts +9 -0
- package/lib/azure-dnsresolver/test/inbound-endpoint.integ.js +151 -0
- package/lib/azure-dnsresolver/test/inbound-endpoint.spec.d.ts +9 -0
- package/lib/azure-dnsresolver/test/inbound-endpoint.spec.js +441 -0
- package/lib/azure-dnsresolver/test/outbound-endpoint.integ.d.ts +9 -0
- package/lib/azure-dnsresolver/test/outbound-endpoint.integ.js +149 -0
- package/lib/azure-dnsresolver/test/outbound-endpoint.spec.d.ts +9 -0
- package/lib/azure-dnsresolver/test/outbound-endpoint.spec.js +301 -0
- package/lib/azure-dnszone/index.d.ts +1 -0
- package/lib/azure-dnszone/index.js +18 -0
- package/lib/azure-dnszone/lib/dns-zone-schemas.d.ts +24 -0
- package/lib/azure-dnszone/lib/dns-zone-schemas.js +191 -0
- package/lib/azure-dnszone/lib/dns-zone.d.ts +182 -0
- package/lib/azure-dnszone/lib/dns-zone.js +228 -0
- package/lib/azure-dnszone/lib/index.d.ts +2 -0
- package/lib/azure-dnszone/lib/index.js +19 -0
- package/lib/azure-dnszone/test/dns-zone.integ.d.ts +9 -0
- package/lib/azure-dnszone/test/dns-zone.integ.js +85 -0
- package/lib/azure-dnszone/test/dns-zone.spec.d.ts +9 -0
- package/lib/azure-dnszone/test/dns-zone.spec.js +285 -0
- package/lib/azure-metricalert/index.d.ts +0 -10
- package/lib/azure-metricalert/index.js +1 -11
- package/lib/azure-metricalert/lib/index.d.ts +1 -4
- package/lib/azure-metricalert/lib/index.js +2 -5
- package/lib/azure-metricalert/lib/metric-alert.d.ts +0 -10
- package/lib/azure-metricalert/lib/metric-alert.js +6 -32
- package/lib/azure-networkinterface/index.d.ts +0 -3
- package/lib/azure-networkinterface/index.js +1 -4
- package/lib/azure-networkinterface/lib/index.d.ts +1 -5
- package/lib/azure-networkinterface/lib/index.js +2 -5
- package/lib/azure-networkinterface/lib/network-interface.d.ts +4 -9
- package/lib/azure-networkinterface/lib/network-interface.js +14 -29
- package/lib/azure-networkinterface/test/network-interface.integ.js +20 -6
- package/lib/azure-networksecuritygroup/index.d.ts +0 -5
- package/lib/azure-networksecuritygroup/index.js +1 -6
- package/lib/azure-networksecuritygroup/lib/index.d.ts +2 -5
- package/lib/azure-networksecuritygroup/lib/index.js +17 -14
- package/lib/azure-networksecuritygroup/lib/network-security-group.d.ts +4 -13
- package/lib/azure-networksecuritygroup/lib/network-security-group.js +14 -36
- package/lib/azure-policyassignment/index.d.ts +1 -0
- package/lib/azure-policyassignment/index.js +18 -0
- package/lib/azure-policyassignment/lib/index.d.ts +2 -0
- package/lib/azure-policyassignment/lib/index.js +19 -0
- package/lib/azure-policyassignment/lib/policy-assignment-schemas.d.ts +25 -0
- package/lib/azure-policyassignment/lib/policy-assignment-schemas.js +260 -0
- package/lib/azure-policyassignment/lib/policy-assignment.d.ts +342 -0
- package/lib/azure-policyassignment/lib/policy-assignment.js +228 -0
- package/lib/azure-policyassignment/test/policy-assignment.integ.d.ts +13 -0
- package/lib/azure-policyassignment/test/policy-assignment.integ.js +153 -0
- package/lib/azure-policyassignment/test/policy-assignment.spec.d.ts +9 -0
- package/lib/azure-policyassignment/test/policy-assignment.spec.js +651 -0
- package/lib/azure-policydefinition/index.d.ts +1 -0
- package/lib/azure-policydefinition/index.js +18 -0
- package/lib/azure-policydefinition/lib/index.d.ts +2 -0
- package/lib/azure-policydefinition/lib/index.js +19 -0
- package/lib/azure-policydefinition/lib/policy-definition-schemas.d.ts +25 -0
- package/lib/azure-policydefinition/lib/policy-definition-schemas.js +210 -0
- package/lib/azure-policydefinition/lib/policy-definition.d.ts +260 -0
- package/lib/azure-policydefinition/lib/policy-definition.js +199 -0
- package/lib/azure-policydefinition/test/policy-definition.integ.d.ts +9 -0
- package/lib/azure-policydefinition/test/policy-definition.integ.js +137 -0
- package/lib/azure-policydefinition/test/policy-definition.spec.d.ts +9 -0
- package/lib/azure-policydefinition/test/policy-definition.spec.js +596 -0
- package/lib/azure-privatednszone/index.d.ts +1 -0
- package/lib/azure-privatednszone/index.js +18 -0
- package/lib/azure-privatednszone/lib/index.d.ts +2 -0
- package/lib/azure-privatednszone/lib/index.js +19 -0
- package/lib/azure-privatednszone/lib/private-dns-zone-schemas.d.ts +24 -0
- package/lib/azure-privatednszone/lib/private-dns-zone-schemas.js +254 -0
- package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +178 -0
- package/lib/azure-privatednszone/lib/private-dns-zone.js +272 -0
- package/lib/azure-privatednszone/test/private-dns-zone.integ.d.ts +9 -0
- package/lib/azure-privatednszone/test/private-dns-zone.integ.js +84 -0
- package/lib/azure-privatednszone/test/private-dns-zone.spec.d.ts +9 -0
- package/lib/azure-privatednszone/test/private-dns-zone.spec.js +341 -0
- package/lib/azure-privatednszonelink/index.d.ts +1 -0
- package/lib/azure-privatednszonelink/index.js +18 -0
- package/lib/azure-privatednszonelink/lib/index.d.ts +2 -0
- package/lib/azure-privatednszonelink/lib/index.js +19 -0
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.d.ts +24 -0
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.js +262 -0
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link.d.ts +202 -0
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +250 -0
- package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.d.ts +9 -0
- package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.js +110 -0
- package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.d.ts +9 -0
- package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.js +465 -0
- package/lib/azure-publicipaddress/index.d.ts +0 -5
- package/lib/azure-publicipaddress/index.js +1 -6
- package/lib/azure-publicipaddress/lib/index.d.ts +2 -9
- package/lib/azure-publicipaddress/lib/index.js +17 -17
- package/lib/azure-publicipaddress/lib/public-ip-address.d.ts +4 -13
- package/lib/azure-publicipaddress/lib/public-ip-address.js +14 -36
- package/lib/azure-resourcegroup/index.d.ts +0 -37
- package/lib/azure-resourcegroup/index.js +1 -39
- package/lib/azure-resourcegroup/lib/index.d.ts +1 -44
- package/lib/azure-resourcegroup/lib/index.js +2 -43
- package/lib/azure-resourcegroup/lib/resource-group.d.ts +9 -23
- package/lib/azure-resourcegroup/lib/resource-group.js +23 -56
- package/lib/azure-resourcegroup/test/resource-group.spec.js +13 -19
- package/lib/azure-roleassignment/index.d.ts +1 -0
- package/lib/azure-roleassignment/index.js +18 -0
- package/lib/azure-roleassignment/lib/index.d.ts +2 -0
- package/lib/azure-roleassignment/lib/index.js +19 -0
- package/lib/azure-roleassignment/lib/role-assignment-schemas.d.ts +25 -0
- package/lib/azure-roleassignment/lib/role-assignment-schemas.js +238 -0
- package/lib/azure-roleassignment/lib/role-assignment.d.ts +294 -0
- package/lib/azure-roleassignment/lib/role-assignment.js +257 -0
- package/lib/azure-roleassignment/test/role-assignment.integ.d.ts +12 -0
- package/lib/azure-roleassignment/test/role-assignment.integ.js +101 -0
- package/lib/azure-roleassignment/test/role-assignment.spec.d.ts +9 -0
- package/lib/azure-roleassignment/test/role-assignment.spec.js +633 -0
- package/lib/azure-roledefinition/index.d.ts +1 -0
- package/lib/azure-roledefinition/index.js +18 -0
- package/lib/azure-roledefinition/lib/index.d.ts +2 -0
- package/lib/azure-roledefinition/lib/index.js +19 -0
- package/lib/azure-roledefinition/lib/role-definition-schemas.d.ts +25 -0
- package/lib/azure-roledefinition/lib/role-definition-schemas.js +195 -0
- package/lib/azure-roledefinition/lib/role-definition.d.ts +236 -0
- package/lib/azure-roledefinition/lib/role-definition.js +192 -0
- package/lib/azure-roledefinition/test/role-definition.integ.d.ts +12 -0
- package/lib/azure-roledefinition/test/role-definition.integ.js +142 -0
- package/lib/azure-roledefinition/test/role-definition.spec.d.ts +9 -0
- package/lib/azure-roledefinition/test/role-definition.spec.js +946 -0
- package/lib/azure-storageaccount/index.d.ts +0 -19
- package/lib/azure-storageaccount/index.js +1 -20
- package/lib/azure-storageaccount/lib/index.d.ts +1 -7
- package/lib/azure-storageaccount/lib/index.js +2 -8
- package/lib/azure-storageaccount/lib/storage-account.d.ts +4 -9
- package/lib/azure-storageaccount/lib/storage-account.js +15 -29
- package/lib/azure-subnet/index.d.ts +0 -3
- package/lib/azure-subnet/index.js +1 -4
- package/lib/azure-subnet/lib/index.d.ts +1 -4
- package/lib/azure-subnet/lib/index.js +2 -5
- package/lib/azure-subnet/lib/subnet.d.ts +3 -14
- package/lib/azure-subnet/lib/subnet.js +28 -47
- package/lib/azure-subnet/test/subnet.integ.js +19 -7
- package/lib/azure-subnet/test/subnet.spec.js +1 -2
- package/lib/azure-virtualmachine/index.d.ts +0 -6
- package/lib/azure-virtualmachine/index.js +1 -7
- package/lib/azure-virtualmachine/lib/index.d.ts +1 -10
- package/lib/azure-virtualmachine/lib/index.js +2 -21
- package/lib/azure-virtualmachine/lib/virtual-machine.d.ts +4 -13
- package/lib/azure-virtualmachine/lib/virtual-machine.js +15 -36
- package/lib/azure-virtualnetwork/index.d.ts +0 -9
- package/lib/azure-virtualnetwork/index.js +1 -11
- package/lib/azure-virtualnetwork/lib/index.d.ts +2 -9
- package/lib/azure-virtualnetwork/lib/index.js +17 -20
- package/lib/azure-virtualnetwork/lib/virtual-network.d.ts +4 -13
- package/lib/azure-virtualnetwork/lib/virtual-network.js +15 -36
- package/lib/azure-virtualnetworkmanager/index.d.ts +1 -0
- package/lib/azure-virtualnetworkmanager/index.js +18 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.d.ts +48 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.js +265 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.d.ts +185 -0
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +206 -0
- package/lib/azure-virtualnetworkmanager/lib/index.d.ts +14 -0
- package/lib/azure-virtualnetworkmanager/lib/index.js +31 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.js +189 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.js +201 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.d.ts +135 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +163 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group.d.ts +139 -0
- package/lib/azure-virtualnetworkmanager/lib/network-group.js +158 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.js +182 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.d.ts +144 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +164 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.d.ts +38 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.js +206 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.d.ts +142 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +162 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.d.ts +39 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.js +359 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.d.ts +221 -0
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +204 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.d.ts +32 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.js +236 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +337 -0
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +283 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +25 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +402 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.d.ts +9 -0
- package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +1652 -0
- package/lib/azure-vmss/index.d.ts +0 -5
- package/lib/azure-vmss/index.js +1 -6
- package/lib/azure-vmss/lib/index.d.ts +0 -7
- package/lib/azure-vmss/lib/index.js +1 -21
- package/lib/azure-vmss/lib/virtual-machine-scale-set.d.ts +5 -13
- package/lib/azure-vmss/lib/virtual-machine-scale-set.js +29 -53
- package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.d.ts +10 -0
- package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.js +218 -0
- package/lib/core-azure/lib/azapi/azapi-resource.d.ts +178 -26
- package/lib/core-azure/lib/azapi/azapi-resource.js +328 -90
- package/lib/core-azure/lib/azapi/azapi-resource.spec.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 +5 -3
- 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/resource-schema-validator.d.ts +118 -0
- package/lib/core-azure/lib/azapi/resource-schema-validator.js +236 -0
- package/lib/core-azure/lib/azapi/resource-version-manager.d.ts +103 -0
- package/lib/core-azure/lib/azapi/resource-version-manager.js +168 -0
- package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +11 -6
- package/lib/core-azure/lib/index.d.ts +2 -2
- package/lib/core-azure/lib/index.js +5 -5
- 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 +19 -0
- package/lib/index.js +21 -2
- package/lib/testing/index.js +2 -2
- package/lib/testing/lib/cleanup.d.ts +1 -0
- package/lib/testing/lib/cleanup.js +19 -12
- package/lib/testing/lib/metadata.js +19 -16
- package/package.json +1 -1
- package/scripts/cleanup-test-resources.ts +22 -4
- package/scripts/generate-index.js +25 -8
|
@@ -27,9 +27,9 @@ const cdktf = require("cdktf");
|
|
|
27
27
|
const constructs_1 = require("constructs");
|
|
28
28
|
const data_azapi_client_config_1 = require("./providers-azapi/data-azapi-client-config");
|
|
29
29
|
const resource_1 = require("./providers-azapi/resource");
|
|
30
|
-
const
|
|
30
|
+
const resource_schema_validator_1 = require("./resource-schema-validator");
|
|
31
|
+
const resource_version_manager_1 = require("./resource-version-manager");
|
|
31
32
|
const api_version_manager_1 = require("../version-manager/api-version-manager");
|
|
32
|
-
const version_interfaces_1 = require("../version-manager/interfaces/version-interfaces");
|
|
33
33
|
/**
|
|
34
34
|
* Abstract base class for version-aware Azure resource management
|
|
35
35
|
*
|
|
@@ -77,6 +77,37 @@ const version_interfaces_1 = require("../version-manager/interfaces/version-inte
|
|
|
77
77
|
* @stability stable
|
|
78
78
|
*/
|
|
79
79
|
class AzapiResource extends constructs_1.Construct {
|
|
80
|
+
/**
|
|
81
|
+
* Static helper for child classes to register their schemas in static initializers
|
|
82
|
+
*
|
|
83
|
+
* This method should be called in a static initializer block of each child class
|
|
84
|
+
* to register all supported API versions and their schemas with the ApiVersionManager.
|
|
85
|
+
* The static block runs once when the class is first loaded, ensuring schemas are
|
|
86
|
+
* registered before any instances are created.
|
|
87
|
+
*
|
|
88
|
+
* @param resourceType - The Azure resource type (e.g., "Microsoft.Network/virtualNetworks")
|
|
89
|
+
* @param versions - Array of version configurations containing schemas
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* static {
|
|
93
|
+
* AzapiResource.registerSchemas(
|
|
94
|
+
* "Microsoft.Network/virtualNetworks",
|
|
95
|
+
* ALL_VIRTUAL_NETWORK_VERSIONS
|
|
96
|
+
* );
|
|
97
|
+
* }
|
|
98
|
+
*/
|
|
99
|
+
static registerSchemas(resourceType, versions) {
|
|
100
|
+
api_version_manager_1.ApiVersionManager.instance().registerResourceType(resourceType, versions);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The Azure resource ID
|
|
104
|
+
*
|
|
105
|
+
* This property is automatically derived from the underlying Terraform resource.
|
|
106
|
+
* Child classes no longer need to implement this property.
|
|
107
|
+
*/
|
|
108
|
+
get id() {
|
|
109
|
+
return `\${${this.terraformResource.fqn}.id}`;
|
|
110
|
+
}
|
|
80
111
|
/**
|
|
81
112
|
* Creates a new AzapiResource instance
|
|
82
113
|
*
|
|
@@ -95,50 +126,141 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
95
126
|
this.monitoringActionGroups = [];
|
|
96
127
|
this.monitoringMetricAlerts = [];
|
|
97
128
|
this.monitoringActivityLogAlerts = [];
|
|
98
|
-
// Initialize basic properties
|
|
99
|
-
|
|
100
|
-
|
|
129
|
+
// Initialize basic properties that don't require abstract methods
|
|
130
|
+
// Use props.name if provided, otherwise fall back to construct ID
|
|
131
|
+
// This supports both explicit naming and automatic ID-based naming
|
|
132
|
+
this.name = this.resolveName(props);
|
|
133
|
+
this.location = this.resolveLocation(props);
|
|
101
134
|
// Initialize the API version manager
|
|
102
135
|
this._apiVersionManager = api_version_manager_1.ApiVersionManager.instance();
|
|
103
|
-
//
|
|
104
|
-
this.
|
|
105
|
-
//
|
|
136
|
+
// Initialize tags storage with empty object (will be populated in initialize())
|
|
137
|
+
this._tags = {};
|
|
138
|
+
// Note: We cannot initialize version manager here because it requires
|
|
139
|
+
// calling abstract methods (resourceType() and defaultVersion())
|
|
140
|
+
// which are not yet available in the base constructor.
|
|
141
|
+
// Version resolution is deferred to initialize() method.
|
|
142
|
+
// Step 1: Resolve the API version to use (doesn't call abstract methods yet)
|
|
143
|
+
// This is a placeholder that will be properly set in initialize()
|
|
144
|
+
this.resolvedApiVersion = props.apiVersion || "";
|
|
145
|
+
this.apiVersion = this.resolvedApiVersion;
|
|
146
|
+
// Step 2: Call initialize() to complete initialization after child class is ready
|
|
147
|
+
this.initialize(props);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Protected initialization method called after the constructor completes
|
|
151
|
+
*
|
|
152
|
+
* This method is called at the end of the constructor to perform initialization
|
|
153
|
+
* that requires calling abstract methods. Child classes can override this method
|
|
154
|
+
* if they need to extend initialization logic, but they MUST call super.initialize(props).
|
|
155
|
+
*
|
|
156
|
+
* @param props - Configuration properties for the resource
|
|
157
|
+
*/
|
|
158
|
+
initialize(props) {
|
|
159
|
+
// Step 2: Set required abstract properties (now safe to call abstract methods)
|
|
106
160
|
this._resourceType = this.resourceType();
|
|
161
|
+
// Step 3: Initialize the version manager and resolve the API version
|
|
162
|
+
this._versionManager = new resource_version_manager_1.ResourceVersionManager(this._resourceType, this.defaultVersion());
|
|
163
|
+
this.resolvedApiVersion = this._versionManager.resolveApiVersion(props.apiVersion);
|
|
107
164
|
this.apiVersion = this.resolvedApiVersion;
|
|
108
|
-
// Step 3:
|
|
109
|
-
|
|
110
|
-
|
|
165
|
+
// Step 3.5: Initialize tags from props
|
|
166
|
+
// This creates a mutable copy separate from the readonly props
|
|
167
|
+
this._tags = { ...(props.tags || {}) };
|
|
168
|
+
// Step 4: Load the schema and version configuration using the version manager
|
|
169
|
+
this.schema = this._versionManager.schemaForVersion(this.resolvedApiVersion);
|
|
170
|
+
const versionConfig = this._versionManager.versionConfig(this.resolvedApiVersion);
|
|
111
171
|
if (!versionConfig) {
|
|
112
172
|
throw new Error(`Version configuration not found for ${this.resourceType()}@${this.resolvedApiVersion}. ` +
|
|
113
173
|
`Please ensure the version is registered with the ApiVersionManager.`);
|
|
114
174
|
}
|
|
115
175
|
this.versionConfig = versionConfig;
|
|
116
|
-
// Step
|
|
117
|
-
this.
|
|
118
|
-
// Step
|
|
176
|
+
// Step 5: Initialize the schema validator
|
|
177
|
+
this._schemaValidator = new resource_schema_validator_1.ResourceSchemaValidator(this.schema);
|
|
178
|
+
// Step 6: Process properties through the framework pipeline
|
|
119
179
|
const processedProps = this._processProperties(props);
|
|
120
|
-
// Step
|
|
180
|
+
// Step 7: Perform validation if enabled
|
|
121
181
|
if (props.enableValidation !== false) {
|
|
122
|
-
this.validationResult =
|
|
182
|
+
this.validationResult =
|
|
183
|
+
this._schemaValidator.validateProps(processedProps);
|
|
123
184
|
if (!this.validationResult.valid) {
|
|
124
|
-
throw new Error(`Property validation failed for ${this.resourceType}:\n` +
|
|
125
|
-
this.
|
|
185
|
+
throw new Error(`Property validation failed for ${this.resourceType()}:\n` +
|
|
186
|
+
this._schemaValidator
|
|
187
|
+
.formatValidationErrors(this.validationResult)
|
|
188
|
+
.join("\n"));
|
|
126
189
|
}
|
|
127
190
|
}
|
|
128
|
-
// Step
|
|
191
|
+
// Step 8: Perform migration analysis if enabled
|
|
129
192
|
if (props.enableMigrationAnalysis !== false) {
|
|
130
193
|
this.migrationAnalysis = this._performMigrationAnalysis();
|
|
131
194
|
}
|
|
132
|
-
// Step
|
|
195
|
+
// Step 9: Create the Azure resource
|
|
133
196
|
this._createAzureResource(processedProps);
|
|
134
|
-
// Step
|
|
197
|
+
// Step 10: Create monitoring resources if configured
|
|
135
198
|
// Note: Monitoring resources are created lazily to avoid circular dependencies
|
|
136
199
|
if (props.monitoring) {
|
|
137
200
|
void this.createMonitoringResources(props.monitoring);
|
|
138
201
|
}
|
|
139
|
-
// Step
|
|
202
|
+
// Step 11: Log warnings and migration guidance
|
|
140
203
|
this._logFrameworkMessages();
|
|
141
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* Override in child classes to provide default location
|
|
207
|
+
* @returns Default location or undefined
|
|
208
|
+
*/
|
|
209
|
+
defaultLocation() {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Override in child classes to indicate if location is required
|
|
214
|
+
* @returns true if location is mandatory for this resource type
|
|
215
|
+
*/
|
|
216
|
+
requiresLocation() {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Override in child classes to specify parent resource for location inheritance
|
|
221
|
+
* @returns Parent resource or undefined
|
|
222
|
+
*/
|
|
223
|
+
parentResourceForLocation() {
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Resolves location using template method pattern
|
|
228
|
+
* Priority: props.location > parent location > default location > validation
|
|
229
|
+
*/
|
|
230
|
+
resolveLocation(props) {
|
|
231
|
+
// 1. Explicit location in props
|
|
232
|
+
if (props.location) {
|
|
233
|
+
return props.location;
|
|
234
|
+
}
|
|
235
|
+
// 2. Inherit from parent resource
|
|
236
|
+
const parent = this.parentResourceForLocation();
|
|
237
|
+
if (parent && parent.location) {
|
|
238
|
+
return parent.location;
|
|
239
|
+
}
|
|
240
|
+
// 3. Use child class default
|
|
241
|
+
const defaultLoc = this.defaultLocation();
|
|
242
|
+
if (defaultLoc) {
|
|
243
|
+
return defaultLoc;
|
|
244
|
+
}
|
|
245
|
+
// 4. Validate if required
|
|
246
|
+
if (this.requiresLocation()) {
|
|
247
|
+
throw new Error(`Location is required for ${this.resourceType()} but was not provided ` +
|
|
248
|
+
`and could not be inherited from parent resource.`);
|
|
249
|
+
}
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Resolves the name for this resource
|
|
254
|
+
*
|
|
255
|
+
* This method centralizes name resolution logic. By default, it uses the
|
|
256
|
+
* provided name or falls back to the construct ID.
|
|
257
|
+
*
|
|
258
|
+
* @param props - The resource properties
|
|
259
|
+
* @returns The resolved resource name
|
|
260
|
+
*/
|
|
261
|
+
resolveName(props) {
|
|
262
|
+
return props.name || this.node.id;
|
|
263
|
+
}
|
|
142
264
|
/**
|
|
143
265
|
* Helper method for standard schema resolution
|
|
144
266
|
*
|
|
@@ -166,7 +288,9 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
166
288
|
* @returns The latest available version, or undefined if none found
|
|
167
289
|
*/
|
|
168
290
|
latestVersion() {
|
|
169
|
-
return this.
|
|
291
|
+
return this._versionManager
|
|
292
|
+
? this._versionManager.latestVersion()
|
|
293
|
+
: this._apiVersionManager.latestVersion(this.resourceType());
|
|
170
294
|
}
|
|
171
295
|
/**
|
|
172
296
|
* Gets all supported versions for this resource type
|
|
@@ -177,7 +301,9 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
177
301
|
* @returns Array of supported version strings, sorted by release date
|
|
178
302
|
*/
|
|
179
303
|
supportedVersions() {
|
|
180
|
-
return this.
|
|
304
|
+
return this._versionManager
|
|
305
|
+
? this._versionManager.supportedVersions()
|
|
306
|
+
: this._apiVersionManager.supportedVersions(this.resourceType());
|
|
181
307
|
}
|
|
182
308
|
/**
|
|
183
309
|
* Analyzes migration from current version to a target version
|
|
@@ -194,39 +320,18 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
194
320
|
// =============================================================================
|
|
195
321
|
// PRIVATE IMPLEMENTATION METHODS
|
|
196
322
|
// =============================================================================
|
|
197
|
-
/**
|
|
198
|
-
* Resolves the API version to use for this resource instance
|
|
199
|
-
*/
|
|
200
|
-
_resolveApiVersion(explicitVersion) {
|
|
201
|
-
if (explicitVersion) {
|
|
202
|
-
// Validate that the explicit version is supported
|
|
203
|
-
if (!this._apiVersionManager.validateVersionSupport(this.resourceType(), explicitVersion)) {
|
|
204
|
-
const supportedVersions = this._apiVersionManager.supportedVersions(this.resourceType());
|
|
205
|
-
throw new Error(`Unsupported API version '${explicitVersion}' for resource type '${this.resourceType()}'. ` +
|
|
206
|
-
`Supported versions: ${supportedVersions.join(", ")}`);
|
|
207
|
-
}
|
|
208
|
-
return explicitVersion;
|
|
209
|
-
}
|
|
210
|
-
// Try to get the latest version from the manager
|
|
211
|
-
const latestVersion = this._apiVersionManager.latestVersion(this.resourceType());
|
|
212
|
-
if (latestVersion) {
|
|
213
|
-
return latestVersion;
|
|
214
|
-
}
|
|
215
|
-
// Fall back to the default version
|
|
216
|
-
const defaultVersion = this.defaultVersion();
|
|
217
|
-
// Warn that we're using the default version
|
|
218
|
-
console.warn(`No versions registered for ${this.resourceType()}. ` +
|
|
219
|
-
`Using default version: ${defaultVersion}. ` +
|
|
220
|
-
`Consider registering versions with ApiVersionManager for better version management.`);
|
|
221
|
-
return defaultVersion;
|
|
222
|
-
}
|
|
223
323
|
/**
|
|
224
324
|
* Processes properties through the framework pipeline
|
|
225
325
|
*/
|
|
226
326
|
_processProperties(props) {
|
|
227
327
|
let processedProps = { ...props };
|
|
228
|
-
//
|
|
229
|
-
|
|
328
|
+
// Ensure name is set before processing
|
|
329
|
+
// This is critical for validation to work correctly
|
|
330
|
+
if (!processedProps.name) {
|
|
331
|
+
processedProps.name = this.resolveName(props);
|
|
332
|
+
}
|
|
333
|
+
// Apply default values from the schema using the validator
|
|
334
|
+
processedProps = this._schemaValidator.applyDefaults(processedProps);
|
|
230
335
|
// Apply property transformations if enabled
|
|
231
336
|
if (props.enableTransformation !== false) {
|
|
232
337
|
// For transformation, we would need a source schema, but since we're not
|
|
@@ -235,20 +340,13 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
235
340
|
}
|
|
236
341
|
return processedProps;
|
|
237
342
|
}
|
|
238
|
-
/**
|
|
239
|
-
* Validates properties against the schema
|
|
240
|
-
*/
|
|
241
|
-
_validateProperties(props) {
|
|
242
|
-
return this._schemaMapper.validateProperties(props);
|
|
243
|
-
}
|
|
244
343
|
/**
|
|
245
344
|
* Performs migration analysis for the current version
|
|
246
345
|
*/
|
|
247
346
|
_performMigrationAnalysis() {
|
|
248
|
-
// Check if the current version is deprecated
|
|
249
|
-
if (this.
|
|
250
|
-
|
|
251
|
-
const latestVersion = this.latestVersion();
|
|
347
|
+
// Check if the current version is deprecated using the version manager
|
|
348
|
+
if (this._versionManager.isDeprecated(this.resolvedApiVersion)) {
|
|
349
|
+
const latestVersion = this._versionManager.latestVersion();
|
|
252
350
|
if (latestVersion && latestVersion !== this.resolvedApiVersion) {
|
|
253
351
|
return this._apiVersionManager.analyzeMigration(this.resourceType(), this.resolvedApiVersion, latestVersion);
|
|
254
352
|
}
|
|
@@ -259,12 +357,74 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
259
357
|
* Creates the underlying Azure resource
|
|
260
358
|
*/
|
|
261
359
|
_createAzureResource(props) {
|
|
360
|
+
// Ensure name is set in props for validation
|
|
361
|
+
const propsWithName = {
|
|
362
|
+
...props,
|
|
363
|
+
name: props.name || this.resolveName(props),
|
|
364
|
+
};
|
|
262
365
|
// Create the resource body using the subclass implementation
|
|
263
|
-
const resourceBody = this.createResourceBody(
|
|
366
|
+
const resourceBody = this.createResourceBody(propsWithName);
|
|
264
367
|
// Determine the parent ID using the overrideable method
|
|
265
|
-
const parentId = this.resolveParentId(
|
|
368
|
+
const parentId = this.resolveParentId(propsWithName);
|
|
369
|
+
// Find parent AzapiResource construct if parent ID references a resource
|
|
370
|
+
const parentResource = this._findParentAzapiResource(parentId);
|
|
266
371
|
// Create the AZAPI resource using the base class method
|
|
267
|
-
|
|
372
|
+
const resourceName = this.resolveName(props);
|
|
373
|
+
this.terraformResource = this.createAzapiResource(resourceBody, parentId, resourceName, this.location, parentResource, propsWithName.dependsOn, this._tags);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Finds the parent AzapiResource construct if the parentId references a resource
|
|
377
|
+
* Returns undefined if parentId is a static string or parent not found
|
|
378
|
+
* @private
|
|
379
|
+
*/
|
|
380
|
+
_findParentAzapiResource(parentId) {
|
|
381
|
+
// Check if the parent is a string interpolation referencing another resource
|
|
382
|
+
// Pattern: ${azapi_resource.resource_name_HASH.id} or ${construct.fqn}.id
|
|
383
|
+
if (!parentId.includes("${")) {
|
|
384
|
+
return undefined; // Parent is a static string ID, not a resource reference
|
|
385
|
+
}
|
|
386
|
+
// Try to find the parent AzapiResource in the construct tree
|
|
387
|
+
// We need to search the entire tree to find the matching parent
|
|
388
|
+
const root = this._findRoot();
|
|
389
|
+
return this._findParentResource(root, parentId);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Finds the root of the construct tree
|
|
393
|
+
* @private
|
|
394
|
+
*/
|
|
395
|
+
_findRoot() {
|
|
396
|
+
let current = this;
|
|
397
|
+
while (current.node.scope) {
|
|
398
|
+
current = current.node.scope;
|
|
399
|
+
}
|
|
400
|
+
return current;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Recursively searches for a parent resource by matching parentId patterns
|
|
404
|
+
* Enhanced to better handle Terraform interpolation syntax
|
|
405
|
+
* @private
|
|
406
|
+
*/
|
|
407
|
+
_findParentResource(scope, parentId) {
|
|
408
|
+
// Check all children of this scope
|
|
409
|
+
for (const child of scope.node.children) {
|
|
410
|
+
if (child instanceof AzapiResource &&
|
|
411
|
+
child !== this &&
|
|
412
|
+
child.terraformResource) {
|
|
413
|
+
const childFqn = child.terraformResource.fqn;
|
|
414
|
+
// Match if the child's FQN appears anywhere in the parentId string
|
|
415
|
+
// This handles cases like: ${azapi_resource.dns-resolver_resource_F1517BE4.id}
|
|
416
|
+
// where childFqn would be: azapi_resource.dns-resolver_resource_F1517BE4
|
|
417
|
+
if (parentId.includes(childFqn)) {
|
|
418
|
+
return child;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// Recursively search in child's subtree
|
|
422
|
+
const found = this._findParentResource(child, parentId);
|
|
423
|
+
if (found) {
|
|
424
|
+
return found;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return undefined;
|
|
268
428
|
}
|
|
269
429
|
/**
|
|
270
430
|
* Resolves the parent resource ID for this resource.
|
|
@@ -282,23 +442,19 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
282
442
|
/**
|
|
283
443
|
* Determines the parent ID for the resource (internal implementation)
|
|
284
444
|
*
|
|
285
|
-
* This method provides the default parent ID resolution logic
|
|
286
|
-
*
|
|
445
|
+
* This method provides the default parent ID resolution logic.
|
|
446
|
+
* Resource-specific logic should be implemented in the overrideable resolveParentId() method.
|
|
447
|
+
*
|
|
448
|
+
* Default behavior:
|
|
449
|
+
* - If resourceGroupId is provided in props, use it
|
|
450
|
+
* - Otherwise, default to subscription scope
|
|
287
451
|
*/
|
|
288
452
|
_determineParentId(props) {
|
|
289
|
-
//
|
|
290
|
-
// resource-type specific and could be made abstract or configurable
|
|
291
|
-
// For resource groups, parent is subscription
|
|
292
|
-
if (this.resourceType() === "Microsoft.Resources/resourceGroups") {
|
|
293
|
-
// Use AZAPI client config to get subscription ID
|
|
294
|
-
const clientConfig = new data_azapi_client_config_1.DataAzapiClientConfig(this, "client_config", {});
|
|
295
|
-
return `/subscriptions/\${${clientConfig.fqn}.subscription_id}`;
|
|
296
|
-
}
|
|
297
|
-
// For other resources, parent might be resource group
|
|
453
|
+
// If resource group ID is provided, use it as parent
|
|
298
454
|
if (props.resourceGroupId) {
|
|
299
455
|
return props.resourceGroupId;
|
|
300
456
|
}
|
|
301
|
-
// Default to subscription
|
|
457
|
+
// Default to subscription scope for resources without explicit parent
|
|
302
458
|
const clientConfig = new data_azapi_client_config_1.DataAzapiClientConfig(this, "client_config_default", {});
|
|
303
459
|
return `/subscriptions/\${${clientConfig.fqn}.subscription_id}`;
|
|
304
460
|
}
|
|
@@ -311,12 +467,13 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
311
467
|
const YELLOW = "\x1b[33m";
|
|
312
468
|
const RESET = "\x1b[0m";
|
|
313
469
|
const BOLD = "\x1b[1m";
|
|
314
|
-
// Log deprecation warnings
|
|
315
|
-
if (this.
|
|
470
|
+
// Log deprecation warnings using the version manager
|
|
471
|
+
if (this._versionManager.isDeprecated(this.resolvedApiVersion) &&
|
|
472
|
+
!this._versionManager.isSunset(this.resolvedApiVersion)) {
|
|
316
473
|
console.warn(`${YELLOW}⚠️ API version ${this.resolvedApiVersion} for ${this.resourceType()} is deprecated. ` +
|
|
317
474
|
`Consider upgrading to the latest version: ${this.latestVersion()}${RESET}`);
|
|
318
475
|
}
|
|
319
|
-
if (this.
|
|
476
|
+
if (this._versionManager.isSunset(this.resolvedApiVersion)) {
|
|
320
477
|
console.error(`${RED}${BOLD}🚨 API version ${this.resolvedApiVersion} for ${this.resourceType()} has reached sunset. ` +
|
|
321
478
|
`Immediate migration to ${this.latestVersion()} is required.${RESET}`);
|
|
322
479
|
}
|
|
@@ -400,23 +557,57 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
400
557
|
/**
|
|
401
558
|
* Creates the underlying AZAPI Terraform resource using the generated provider classes
|
|
402
559
|
*
|
|
403
|
-
* @param properties - The properties object to send to the Azure API
|
|
560
|
+
* @param properties - The properties object to send to the Azure API (should include location if needed)
|
|
404
561
|
* @param parentId - The parent resource ID (e.g., subscription or resource group)
|
|
405
562
|
* @param name - The name of the resource
|
|
406
|
-
* @param location - The location of the resource (optional,
|
|
563
|
+
* @param location - The location of the resource (optional, only for top-level resources without location in body)
|
|
564
|
+
* @param parentResource - The parent resource for dependency tracking
|
|
565
|
+
* @param dependsOn - Explicit dependencies for this resource
|
|
566
|
+
* @param tags - Tags to apply to the resource (passed separately from body for proper idempotency)
|
|
407
567
|
* @returns The created AZAPI resource
|
|
408
568
|
*/
|
|
409
|
-
createAzapiResource(properties, parentId, name, location) {
|
|
569
|
+
createAzapiResource(properties, parentId, name, location, parentResource, dependsOn, tags) {
|
|
570
|
+
// Determine if this is a child resource by counting path segments
|
|
571
|
+
// Child resources have multiple segments (e.g., "Microsoft.Network/virtualNetworks/subnets")
|
|
572
|
+
// Top-level resources have one segment (e.g., "Microsoft.Network/virtualNetworks")
|
|
573
|
+
const resourceTypeParts = this._resourceType.split("/");
|
|
574
|
+
const isChildResource = resourceTypeParts.length > 2;
|
|
575
|
+
// Remove tags from properties to avoid duplicate specification error
|
|
576
|
+
// The AZAPI provider requires tags at the top level only, not in the body
|
|
577
|
+
// This prevents: "can't specify both the argument 'tags' and 'tags' in the argument 'body'"
|
|
578
|
+
// Tags are now passed as a separate parameter for better clarity and idempotency
|
|
579
|
+
const bodyWithoutTags = { ...properties };
|
|
580
|
+
delete bodyWithoutTags.tags;
|
|
410
581
|
// Build the configuration object for the generated AZAPI Resource class
|
|
582
|
+
// Add location only if:
|
|
583
|
+
// 1. This is a top-level resource (not a child resource)
|
|
584
|
+
// 2. Location is provided as parameter
|
|
585
|
+
// 3. Location is not already in the body
|
|
586
|
+
// Child resources inherit location from their parent and should not specify it
|
|
587
|
+
// Combine dependsOn arrays: explicit dependencies + parent resource dependency
|
|
588
|
+
const combinedDependsOn = [];
|
|
589
|
+
if (dependsOn && dependsOn.length > 0) {
|
|
590
|
+
combinedDependsOn.push(...dependsOn);
|
|
591
|
+
}
|
|
592
|
+
// CRITICAL: Always add parent dependency when parent_id contains interpolations
|
|
593
|
+
// This ensures proper destroy-time ordering even if parent detection fails
|
|
594
|
+
if (parentResource?.terraformResource) {
|
|
595
|
+
combinedDependsOn.push(parentResource.terraformResource);
|
|
596
|
+
}
|
|
411
597
|
const config = {
|
|
412
598
|
type: `${this._resourceType}@${this.apiVersion}`,
|
|
413
599
|
name: name,
|
|
414
600
|
parentId: parentId,
|
|
415
|
-
body:
|
|
416
|
-
|
|
417
|
-
|
|
601
|
+
body: bodyWithoutTags,
|
|
602
|
+
...(!isChildResource && location && !properties.location && { location }),
|
|
603
|
+
// Add tags at the top level if they exist
|
|
604
|
+
// Tags are passed as a separate parameter and added here to ensure they're in the
|
|
605
|
+
// initial Terraform configuration, providing proper idempotency
|
|
606
|
+
...(tags && Object.keys(tags).length > 0 && { tags }),
|
|
607
|
+
// Add depends_on for explicit dependencies and parent resource
|
|
608
|
+
...(combinedDependsOn.length > 0 && { dependsOn: combinedDependsOn }),
|
|
418
609
|
};
|
|
419
|
-
// Create
|
|
610
|
+
// Create the AZAPI resource using the generated provider class
|
|
420
611
|
return new resource_1.Resource(this, "resource", config);
|
|
421
612
|
}
|
|
422
613
|
/**
|
|
@@ -452,6 +643,13 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
452
643
|
get resourceId() {
|
|
453
644
|
return this.terraformResource?.fqn || this.id;
|
|
454
645
|
}
|
|
646
|
+
/**
|
|
647
|
+
* Gets the underlying Terraform resource for use in dependency declarations
|
|
648
|
+
* This allows explicit dependency management between resources
|
|
649
|
+
*/
|
|
650
|
+
get resource() {
|
|
651
|
+
return this.terraformResource;
|
|
652
|
+
}
|
|
455
653
|
/**
|
|
456
654
|
* Gets the resource as a Terraform output value
|
|
457
655
|
*/
|
|
@@ -475,10 +673,50 @@ class AzapiResource extends constructs_1.Construct {
|
|
|
475
673
|
scope: this.resourceId,
|
|
476
674
|
});
|
|
477
675
|
}
|
|
676
|
+
/**
|
|
677
|
+
* Adds a tag to this resource. The tag will be included in the Azure resource.
|
|
678
|
+
*
|
|
679
|
+
* This method provides proper immutability by storing tags separately from props.
|
|
680
|
+
* Tags added via this method are combined with tags from props and included in
|
|
681
|
+
* the deployed Azure resource.
|
|
682
|
+
*
|
|
683
|
+
* **Important:** In CDK for Terraform, tags should ideally be set during resource
|
|
684
|
+
* construction via props. While this method allows adding tags after construction,
|
|
685
|
+
* those tags are only included if added before the Terraform configuration is
|
|
686
|
+
* synthesized. For best results, add all tags via props or call addTag() in the
|
|
687
|
+
* same scope where the resource is created.
|
|
688
|
+
*
|
|
689
|
+
* @param key - The tag key
|
|
690
|
+
* @param value - The tag value
|
|
691
|
+
*/
|
|
692
|
+
addTag(key, value) {
|
|
693
|
+
this._tags[key] = value;
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* All tags on this resource (readonly view)
|
|
697
|
+
*
|
|
698
|
+
* This getter provides convenient access to all tags including those from props
|
|
699
|
+
* and those added dynamically via addTag(). Returns a copy to maintain immutability.
|
|
700
|
+
*/
|
|
701
|
+
get tags() {
|
|
702
|
+
return { ...this._tags };
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* Protected method to retrieve all tags for use in createResourceBody implementations
|
|
706
|
+
*
|
|
707
|
+
* Subclasses should use this method when creating resource bodies to ensure
|
|
708
|
+
* all tags (from props and addTag()) are included in the Azure resource.
|
|
709
|
+
* Uses a non-getter name to avoid JSII conflicts with the tags property.
|
|
710
|
+
*
|
|
711
|
+
* @returns Object containing all tags
|
|
712
|
+
*/
|
|
713
|
+
allTags() {
|
|
714
|
+
return { ...this._tags };
|
|
715
|
+
}
|
|
478
716
|
}
|
|
479
717
|
exports.AzapiResource = AzapiResource;
|
|
480
718
|
_a = JSII_RTTI_SYMBOL_1;
|
|
481
|
-
AzapiResource[_a] = { fqn: "@microsoft/terraform-cdk-constructs.AzapiResource", version: "1.
|
|
719
|
+
AzapiResource[_a] = { fqn: "@microsoft/terraform-cdk-constructs.AzapiResource", version: "1.3.0" };
|
|
482
720
|
/**
|
|
483
721
|
* AZAPI-based role assignment construct
|
|
484
722
|
*/
|
|
@@ -501,5 +739,5 @@ class AzapiRoleAssignment extends constructs_1.Construct {
|
|
|
501
739
|
}
|
|
502
740
|
exports.AzapiRoleAssignment = AzapiRoleAssignment;
|
|
503
741
|
_b = JSII_RTTI_SYMBOL_1;
|
|
504
|
-
AzapiRoleAssignment[_b] = { fqn: "@microsoft/terraform-cdk-constructs.AzapiRoleAssignment", version: "1.
|
|
505
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXphcGktcmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS1henVyZS9saWIvYXphcGkvYXphcGktcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILCtCQUErQjtBQUMvQiwyQ0FBdUM7QUFDdkMseUZBQW1GO0FBQ25GLHlEQUFzRTtBQUN0RSxpRUFBNkQ7QUFPN0QsZ0ZBQTJFO0FBQzNFLHlGQU0wRDtBQStKMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRztBQUNILE1BQXNCLGFBQWMsU0FBUSxzQkFBUztJQWtGbkQ7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBNEIsRUFBRTtRQUN0RSxnQ0FBZ0M7UUFDaEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQWxCbkIsdURBQXVEO1FBQ3BDLDJCQUFzQixHQUFnQixFQUFFLENBQUM7UUFDekMsMkJBQXNCLEdBQWdCLEVBQUUsQ0FBQztRQUN6QyxnQ0FBMkIsR0FBZ0IsRUFBRSxDQUFDO1FBaUIvRCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUM7UUFFM0MscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyx1Q0FBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV2RCx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFcEUsNkRBQTZEO1FBQzdELElBQUks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QUUsSUFBSSxDQUFDLFVBQVU7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF2cEJILHNDQXdwQkM7OztBQWVEOztHQUVHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUztJQUNoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxVQUFVLEdBQUc7WUFDakIsV0FBVyxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQzNCLGdCQUFnQixFQUFFLHdGQUF3RixLQUFLLENBQUMsa0JBQWtCLE1BQU07WUFDeEksS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQ25CLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBbUI7WUFDN0IsSUFBSSxFQUFFLHlDQUF5QztZQUMvQyxJQUFJLEVBQUUsVUFBVTtZQUNoQixRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDckIsSUFBSSxFQUFFLFVBQVU7U0FDakIsQ0FBQztRQUNGLElBQUksbUJBQVEsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7QUFqQkgsa0RBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBemFwaVJlc291cmNlIC0gQSB1bmlmaWVkIGZyYW1ld29yayBmb3IgdmVyc2lvbi1hd2FyZSBBenVyZSByZXNvdXJjZSBtYW5hZ2VtZW50XG4gKlxuICogVGhpcyBhYnN0cmFjdCBiYXNlIGNsYXNzIHByb3ZpZGVzIGEgc2VsZi1jb250YWluZWQgdW5pZmllZCBmcmFtZXdvcmsgYXBwcm9hY2hcbiAqIGZvciBBenVyZSByZXNvdXJjZSBtYW5hZ2VtZW50IHdpdGggYXV0b21hdGljIHZlcnNpb24gbWFuYWdlbWVudCwgc2NoZW1hLWRyaXZlblxuICogcHJvcGVydHkgdHJhbnNmb3JtYXRpb24sIGFuZCBtaWdyYXRpb24gYW5hbHlzaXMgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGxhdGVzdCB2ZXJzaW9uIHJlc29sdXRpb24gd2hlbiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICogLSBTdXBwb3J0IGZvciBleHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcgZm9yIHN0YWJpbGl0eVxuICogLSBTY2hlbWEtZHJpdmVuIHByb3BlcnR5IHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gdmVyc2lvbnNcbiAqIC0gTWlncmF0aW9uIGFuYWx5c2lzIGFuZCBkZXByZWNhdGlvbiB3YXJuaW5nc1xuICogLSBCdWlsdC1pbiByb2xlIGFzc2lnbm1lbnQgYW5kIGRpYWdub3N0aWMgc2V0dGluZ3Mgc3VwcG9ydFxuICogLSBKU0lJLWNvbXBsaWFudCBkZXNpZ24gZm9yIG11bHRpLWxhbmd1YWdlIHN1cHBvcnRcbiAqXG4gKiBUaGlzIGNsYXNzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBkdWFsLWNsYXNzIGFwcHJvYWNoIChBemFwaVJlc291cmNlICsgQXphcGlSZXNvdXJjZSlcbiAqIHdpdGggYSBzaW5nbGUsIHNlbGYtY29udGFpbmVkIGltcGxlbWVudGF0aW9uIHRoYXQgaGFuZGxlcyBhbGwgcmVzb3VyY2UgbWFuYWdlbWVudCBuZWVkcy5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEYXRhQXphcGlDbGllbnRDb25maWcgfSBmcm9tIFwiLi9wcm92aWRlcnMtYXphcGkvZGF0YS1hemFwaS1jbGllbnQtY29uZmlnXCI7XG5pbXBvcnQgeyBSZXNvdXJjZSwgUmVzb3VyY2VDb25maWcgfSBmcm9tIFwiLi9wcm92aWRlcnMtYXphcGkvcmVzb3VyY2VcIjtcbmltcG9ydCB7IFNjaGVtYU1hcHBlciB9IGZyb20gXCIuL3NjaGVtYS1tYXBwZXIvc2NoZW1hLW1hcHBlclwiO1xuXG4vLyBUeXBlLW9ubHkgaW1wb3J0cyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbmltcG9ydCB0eXBlIHsgQWN0aW9uR3JvdXBQcm9wcyB9IGZyb20gXCIuLi8uLi8uLi9henVyZS1hY3Rpb25ncm91cC9saWIvYWN0aW9uLWdyb3VwXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGl2aXR5TG9nQWxlcnRQcm9wcyB9IGZyb20gXCIuLi8uLi8uLi9henVyZS1hY3Rpdml0eWxvZ2FsZXJ0L2xpYi9hY3Rpdml0eS1sb2ctYWxlcnRcIjtcbmltcG9ydCB0eXBlIHsgRGlhZ25vc3RpY1NldHRpbmdzUHJvcHMgfSBmcm9tIFwiLi4vLi4vLi4vYXp1cmUtZGlhZ25vc3RpY3NldHRpbmdzL2xpYi9kaWFnbm9zdGljLXNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY0FsZXJ0UHJvcHMgfSBmcm9tIFwiLi4vLi4vLi4vYXp1cmUtbWV0cmljYWxlcnQvbGliL21ldHJpYy1hbGVydFwiO1xuaW1wb3J0IHsgQXBpVmVyc2lvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmVyc2lvbi1tYW5hZ2VyL2FwaS12ZXJzaW9uLW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEFwaVNjaGVtYSxcbiAgVmVyc2lvbkNvbmZpZyxcbiAgVmFsaWRhdGlvblJlc3VsdCxcbiAgTWlncmF0aW9uQW5hbHlzaXMsXG4gIFZlcnNpb25TdXBwb3J0TGV2ZWwsXG59IGZyb20gXCIuLi92ZXJzaW9uLW1hbmFnZXIvaW50ZXJmYWNlcy92ZXJzaW9uLWludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBSZXRlbnRpb24gcG9saWN5IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRlbnRpb25Qb2xpY3lDb25maWcge1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICByZWFkb25seSBkYXlzOiBudW1iZXI7XG59XG5cbi8qKlxuICogTG9nIGNvbmZpZ3VyYXRpb24gZm9yIGRpYWdub3N0aWMgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljTG9nQ29uZmlnIHtcbiAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhdGVnb3J5R3JvdXA/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJldGVudGlvblBvbGljeT86IFJldGVudGlvblBvbGljeUNvbmZpZztcbn1cblxuLyoqXG4gKiBNZXRyaWMgY29uZmlndXJhdGlvbiBmb3IgZGlhZ25vc3RpYyBzZXR0aW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERpYWdub3N0aWNNZXRyaWNDb25maWcge1xuICAvKiogTWV0cmljIGNhdGVnb3J5IG5hbWUgKHVzZWQgaW4gbmV3ZXIgQVBJIHZlcnNpb25zKSAqL1xuICByZWFkb25seSBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIFRpbWUgZ3JhaW4gZm9yIG1ldHJpY3MgaW4gSVNPIDg2MDEgZHVyYXRpb24gZm9ybWF0ICh1c2VkIGluIEFQSSB2ZXJzaW9uIDIwMTYtMDktMDEsIGUuZy4sIFwiUFQxTVwiKSAqL1xuICByZWFkb25seSB0aW1lR3JhaW4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJldGVudGlvblBvbGljeT86IFJldGVudGlvblBvbGljeUNvbmZpZztcbn1cblxuLyoqXG4gKiBNb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gZm9yIEF6dXJlIHJlc291cmNlc1xuICpcbiAqIFByb3ZpZGVzIGludGVncmF0ZWQgbW9uaXRvcmluZyBjYXBhYmlsaXRpZXMgaW5jbHVkaW5nIGRpYWdub3N0aWMgc2V0dGluZ3MsXG4gKiBtZXRyaWMgYWxlcnRzLCBhbmQgYWN0aXZpdHkgbG9nIGFsZXJ0cy4gQWxsIG1vbml0b3JpbmcgaXMgb3B0aW9uYWwgYW5kXG4gKiBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciBtb25pdG9yaW5nIGlzIGVuYWJsZWRcbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlhZ25vc3RpYyBzZXR0aW5ncyBjb25maWd1cmF0aW9uXG4gICAqIFVzZXMgdGhlIGZ1bGwgRGlhZ25vc3RpY1NldHRpbmdzIGNvbnN0cnVjdCBmb3IgY29uc2lzdGVuY3lcbiAgICovXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNTZXR0aW5ncz86IERpYWdub3N0aWNTZXR0aW5nc1Byb3BzO1xuXG4gIC8qKlxuICAgKiBBY3Rpb24gZ3JvdXBzIHRvIGNyZWF0ZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKiBDcmVhdGVzIG5ldyBBY3Rpb25Hcm91cCBpbnN0YW5jZXMgYXMgY2hpbGQgY29uc3RydWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uR3JvdXBzPzogQWN0aW9uR3JvdXBQcm9wc1tdO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgYWxlcnRzIGNvbmZpZ3VyYXRpb25cbiAgICogQ3JlYXRlcyBNZXRyaWNBbGVydCBpbnN0YW5jZXMgc2NvcGVkIHRvIHRoaXMgcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY0FsZXJ0cz86IE1ldHJpY0FsZXJ0UHJvcHNbXTtcblxuICAvKipcbiAgICogQWN0aXZpdHkgbG9nIGFsZXJ0cyBjb25maWd1cmF0aW9uXG4gICAqIENyZWF0ZXMgQWN0aXZpdHlMb2dBbGVydCBpbnN0YW5jZXMgZm9yIHRoaXMgcmVzb3VyY2UncyBvcGVyYXRpb25zXG4gICAqL1xuICByZWFkb25seSBhY3Rpdml0eUxvZ0FsZXJ0cz86IEFjdGl2aXR5TG9nQWxlcnRQcm9wc1tdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHZlcnNpb25lZCBBenVyZSByZXNvdXJjZXNcbiAqXG4gKiBDb21iaW5lcyBiYXNlIHJlc291cmNlIHByb3BlcnRpZXMgd2l0aCB2ZXJzaW9uIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzXG4gKiBhbmQgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgdW5pZmllZCBmcmFtZXdvcmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXphcGlSZXNvdXJjZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhZ3MgdG8gYXBwbHkgdG8gdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIEV4cGxpY2l0IEFQSSB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgbGF0ZXN0IGFjdGl2ZSB2ZXJzaW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXNvbHZlZC5cbiAgICogVXNlIHRoaXMgZm9yIHZlcnNpb24gcGlubmluZyB3aGVuIHN0YWJpbGl0eSBpcyByZXF1aXJlZCBvdmVyIGxhdGVzdCBmZWF0dXJlcy5cbiAgICpcbiAgICogQGV4YW1wbGUgXCIyMDI0LTExLTAxXCJcbiAgICogQGRlZmF1bHRWYWx1ZSBMYXRlc3QgYWN0aXZlIHZlcnNpb24gZnJvbSBBcGlWZXJzaW9uTWFuYWdlclxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgbWlncmF0aW9uIGFuYWx5c2lzIHdhcm5pbmdzXG4gICAqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGZyYW1ld29yayB3aWxsIGFuYWx5emUgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZGVwcmVjYXRpb25cbiAgICogc3RhdHVzIGFuZCBwcm92aWRlIG1pZ3JhdGlvbiByZWNvbW1lbmRhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZU1pZ3JhdGlvbkFuYWx5c2lzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB2YWxpZGF0ZSBwcm9wZXJ0aWVzIGFnYWluc3QgdGhlIHNjaGVtYVxuICAgKlxuICAgKiBXaGVuIHRydWUsIGFsbCBwcm9wZXJ0aWVzIHdpbGwgYmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlIEFQSSBzY2hlbWEgYmVmb3JlXG4gICAqIHJlc291cmNlIGNyZWF0aW9uLiBWYWxpZGF0aW9uIGVycm9ycyB3aWxsIGNhdXNlIGRlcGxveW1lbnQgZmFpbHVyZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlVmFsaWRhdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXBwbHkgcHJvcGVydHkgdHJhbnNmb3JtYXRpb25zIGF1dG9tYXRpY2FsbHlcbiAgICpcbiAgICogV2hlbiB0cnVlLCBwcm9wZXJ0aWVzIHdpbGwgYmUgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCBhY2NvcmRpbmcgdG8gdGhlXG4gICAqIHRhcmdldCBzY2hlbWEncyB0cmFuc2Zvcm1hdGlvbiBydWxlcy4gVGhpcyBlbmFibGVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlVHJhbnNmb3JtYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcmVzb3VyY2VcbiAgICpcbiAgICogRW5hYmxlcyBpbnRlZ3JhdGVkIG1vbml0b3Jpbmcgd2l0aCBkaWFnbm9zdGljIHNldHRpbmdzLCBtZXRyaWMgYWxlcnRzLFxuICAgKiBhbmQgYWN0aXZpdHkgbG9nIGFsZXJ0cy4gQWxsIG1vbml0b3JpbmcgaXMgb3B0aW9uYWwgYW5kIGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG1vbml0b3Jpbmc6IHtcbiAgICogICBlbmFibGVkOiB0cnVlLFxuICAgKiAgIGRpYWdub3N0aWNTZXR0aW5nczoge1xuICAgKiAgICAgd29ya3NwYWNlSWQ6IGxvZ0FuYWx5dGljcy5pZCxcbiAgICogICAgIG1ldHJpY3M6IFsnQWxsTWV0cmljcyddLFxuICAgKiAgICAgbG9nczogWydBdWRpdExvZ3MnXVxuICAgKiAgIH0sXG4gICAqICAgbWV0cmljQWxlcnRzOiBbe1xuICAgKiAgICAgbmFtZTogJ2hpZ2gtY3B1LWFsZXJ0JyxcbiAgICogICAgIHNldmVyaXR5OiAyLFxuICAgKiAgICAgc2NvcGVzOiBbXSwgLy8gQXV0b21hdGljYWxseSBzZXQgdG8gdGhpcyByZXNvdXJjZVxuICAgKiAgICAgY3JpdGVyaWE6IHsgLi4uIH0sXG4gICAqICAgICBhY3Rpb25zOiBbeyBhY3Rpb25Hcm91cElkOiBhY3Rpb25Hcm91cC5pZCB9XVxuICAgKiAgIH1dXG4gICAqIH1cbiAgICovXG4gIHJlYWRvbmx5IG1vbml0b3Jpbmc/OiBNb25pdG9yaW5nQ29uZmlnO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHZlcnNpb24tYXdhcmUgQXp1cmUgcmVzb3VyY2UgbWFuYWdlbWVudFxuICpcbiAqIEF6YXBpUmVzb3VyY2UgcHJvdmlkZXMgYSB1bmlmaWVkIGZyYW1ld29yayBmb3IgY3JlYXRpbmcgQXp1cmUgcmVzb3VyY2VzXG4gKiB3aXRoIGF1dG9tYXRpYyB2ZXJzaW9uIG1hbmFnZW1lbnQsIHNjaGVtYSB2YWxpZGF0aW9uLCBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbixcbiAqIGFuZCBtaWdyYXRpb24gYW5hbHlzaXMuIEl0IGV4dGVuZHMgdGhlIGV4aXN0aW5nIEF6YXBpUmVzb3VyY2UgY2xhc3Mgd2hpbGVcbiAqIG1haW50YWluaW5nIGZ1bGwgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNvcmUgZnJhbWV3b3JrIHRoYXQgZW5hYmxlczpcbiAqIC0gQXV0b21hdGljIHJlc29sdXRpb24gb2YgdGhlIGxhdGVzdCBBUEkgdmVyc2lvbiB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkXG4gKiAtIEV4cGxpY2l0IHZlcnNpb24gcGlubmluZyBmb3IgZW52aXJvbm1lbnRzIHJlcXVpcmluZyBzdGFiaWxpdHlcbiAqIC0gU2NoZW1hLWRyaXZlbiBwcm9wZXJ0eSB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvblxuICogLSBNaWdyYXRpb24gYW5hbHlzaXMgd2l0aCBicmVha2luZyBjaGFuZ2UgZGV0ZWN0aW9uXG4gKiAtIERlcHJlY2F0aW9uIHdhcm5pbmdzIGFuZCB1cGdyYWRlIHJlY29tbWVuZGF0aW9uc1xuICpcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFic3RyYWN0IG1ldGhvZHMgdG8gcHJvdmlkZSByZXNvdXJjZS1zcGVjaWZpY1xuICogY29uZmlndXJhdGlvbiB3aGlsZSB0aGUgZnJhbWV3b3JrIGhhbmRsZXMgYWxsIHZlcnNpb24gbWFuYWdlbWVudCBjb21wbGV4aXR5LlxuICpcbiAqIEBleGFtcGxlIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIHZlcnNpb24gcmVzb2x1dGlvbjpcbiAqIGNsYXNzIE15UmVzb3VyY2UgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAqICAgcHJvdGVjdGVkIGdldERlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIFwiMjAyNC0xMS0wMVwiOyAvLyBmYWxsYmFjayBpZiBubyB2ZXJzaW9ucyByZWdpc3RlcmVkXG4gKiAgIH1cbiAqXG4gKiAgIHByb3RlY3RlZCBnZXRSZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gXCJNaWNyb3NvZnQuUmVzb3VyY2VzL3Jlc291cmNlR3JvdXBzXCI7XG4gKiAgIH1cbiAqXG4gKiAgIHByb3RlY3RlZCBnZXRBcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAqICAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gKiAgIH1cbiAqXG4gKiAgIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gKiAgICAgcmV0dXJuIHsgbG9jYXRpb246IHByb3BzLmxvY2F0aW9uLCB0YWdzOiBwcm9wcy50YWdzIHx8IHt9IH07XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAZXhhbXBsZSBVc2FnZSB3aXRoIGV4cGxpY2l0IHZlcnNpb24gcGlubmluZzpcbiAqIG5ldyBNeVJlc291cmNlKHRoaXMsIFwicmVzb3VyY2VcIiwge1xuICogICBuYW1lOiBcIm15LXJlc291cmNlXCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICBhcGlWZXJzaW9uOiBcIjIwMjQtMDEtMDFcIiAvLyBQaW4gdG8gc3BlY2lmaWMgdmVyc2lvblxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF6YXBpUmVzb3VyY2UgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUEkgdmVyc2lvbiB0byB1c2UgZm9yIHRoaXMgcmVzb3VyY2VcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmRlcmx5aW5nIEFaQVBJIFRlcnJhZm9ybSByZXNvdXJjZVxuICAgKi9cbiAgcHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlITogY2RrdGYuVGVycmFmb3JtUmVzb3VyY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvY2F0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBJRCAoYWJzdHJhY3QgLSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMpXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIEFQSSB2ZXJzaW9uIGJlaW5nIHVzZWQgZm9yIHRoaXMgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICpcbiAgICogVGhpcyBpcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBBenVyZSBBUEkgY2FsbCxcbiAgICogZWl0aGVyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHByb3BzIG9yIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZWQgdG9cbiAgICogdGhlIGxhdGVzdCBhY3RpdmUgdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvbHZlZEFwaVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqXG4gICAqIENvbnRhaW5zIHRoZSBjb21wbGV0ZSBzY2hlbWEgZGVmaW5pdGlvbiBpbmNsdWRpbmcgcHJvcGVydGllcywgdmFsaWRhdGlvblxuICAgKiBydWxlcywgYW5kIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmdzIGZvciB0aGUgcmVzb2x2ZWQgQVBJIHZlcnNpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hOiBBcGlTY2hlbWE7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqXG4gICAqIENvbnRhaW5zIGxpZmVjeWNsZSBpbmZvcm1hdGlvbiwgYnJlYWtpbmcgY2hhbmdlcywgYW5kIG1pZ3JhdGlvbiBtZXRhZGF0YVxuICAgKiBmb3IgdGhlIHJlc29sdmVkIEFQSSB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb25Db25maWc6IFZlcnNpb25Db25maWc7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcmVzdWx0cyBmb3IgdGhlIHJlc291cmNlIHByb3BlcnRpZXNcbiAgICpcbiAgICogQXZhaWxhYmxlIGFmdGVyIGNvbnN0cnVjdGlvbiBpZiB2YWxpZGF0aW9uIGlzIGVuYWJsZWQuIENvbnRhaW5zIGRldGFpbGVkXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IGFueSB2YWxpZGF0aW9uIGVycm9ycyBvciB3YXJuaW5ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2YWxpZGF0aW9uUmVzdWx0PzogVmFsaWRhdGlvblJlc3VsdDtcblxuICAvKipcbiAgICogTWlncmF0aW9uIGFuYWx5c2lzIHJlc3VsdHNcbiAgICpcbiAgICogQXZhaWxhYmxlIGFmdGVyIGNvbnN0cnVjdGlvbiBpZiBtaWdyYXRpb24gYW5hbHlzaXMgaXMgZW5hYmxlZCBhbmQgYVxuICAgKiBwcmV2aW91cyB2ZXJzaW9uIGNhbiBiZSBkZXRlcm1pbmVkIGZvciBjb21wYXJpc29uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1pZ3JhdGlvbkFuYWx5c2lzPzogTWlncmF0aW9uQW5hbHlzaXM7XG5cbiAgLy8gRnJhbWV3b3JrIGNvbXBvbmVudHNcbiAgcHJpdmF0ZSByZWFkb25seSBfYXBpVmVyc2lvbk1hbmFnZXI6IEFwaVZlcnNpb25NYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zY2hlbWFNYXBwZXI6IFNjaGVtYU1hcHBlcjtcblxuICAvLyBNb25pdG9yaW5nIHJlc291cmNlcyAocHJvdGVjdGVkIGZvciBzdWJjbGFzcyBhY2Nlc3MpXG4gIHByb3RlY3RlZCByZWFkb25seSBtb25pdG9yaW5nQWN0aW9uR3JvdXBzOiBDb25zdHJ1Y3RbXSA9IFtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9uaXRvcmluZ01ldHJpY0FsZXJ0czogQ29uc3RydWN0W10gPSBbXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbml0b3JpbmdBY3Rpdml0eUxvZ0FsZXJ0czogQ29uc3RydWN0W10gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBBemFwaVJlc291cmNlIGluc3RhbmNlXG4gICAqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciBoYW5kbGVzIGFsbCBmcmFtZXdvcmsgaW5pdGlhbGl6YXRpb24gaW5jbHVkaW5nIHZlcnNpb24gcmVzb2x1dGlvbixcbiAgICogc2NoZW1hIGxvYWRpbmcsIHByb3BlcnR5IHZhbGlkYXRpb24sIHRyYW5zZm9ybWF0aW9uLCBhbmQgbWlncmF0aW9uIGFuYWx5c2lzLlxuICAgKiBJdCBtYWludGFpbnMgZnVsbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEF6YXBpUmVzb3VyY2UgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbmNlXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIHJlc291cmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXphcGlSZXNvdXJjZVByb3BzID0ge30pIHtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBiYXNlIENvbnN0cnVjdFxuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGJhc2ljIHByb3BlcnRpZXNcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lIHx8IHRoaXMubm9kZS5pZDtcbiAgICB0aGlzLmxvY2F0aW9uID0gcHJvcHMubG9jYXRpb24gfHwgXCJlYXN0dXNcIjtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIEFQSSB2ZXJzaW9uIG1hbmFnZXJcbiAgICB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlciA9IEFwaVZlcnNpb25NYW5hZ2VyLmluc3RhbmNlKCk7XG5cbiAgICAvLyBTdGVwIDE6IFJlc29sdmUgdGhlIEFQSSB2ZXJzaW9uIHRvIHVzZVxuICAgIHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uID0gdGhpcy5fcmVzb2x2ZUFwaVZlcnNpb24ocHJvcHMuYXBpVmVyc2lvbik7XG5cbiAgICAvLyBTdGVwIDI6IFNldCByZXF1aXJlZCBhYnN0cmFjdCBwcm9wZXJ0aWVzIGZvciBBemFwaVJlc291cmNlXG4gICAgdGhpcy5fcmVzb3VyY2VUeXBlID0gdGhpcy5yZXNvdXJjZVR5cGUoKTtcbiAgICB0aGlzLmFwaVZlcnNpb24gPSB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbjtcblxuICAgIC8vIFN0ZXAgMzogTG9hZCB0aGUgc2NoZW1hIGFuZCB2ZXJzaW9uIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnNjaGVtYSA9IHRoaXMuYXBpU2NoZW1hKCk7XG4gICAgY29uc3QgdmVyc2lvbkNvbmZpZyA9IHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyLnZlcnNpb25Db25maWcoXG4gICAgICB0aGlzLl9yZXNvdXJjZVR5cGUsXG4gICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICApO1xuXG4gICAgaWYgKCF2ZXJzaW9uQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWZXJzaW9uIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9QCR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259LiBgICtcbiAgICAgICAgICBgUGxlYXNlIGVuc3VyZSB0aGUgdmVyc2lvbiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIEFwaVZlcnNpb25NYW5hZ2VyLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZlcnNpb25Db25maWcgPSB2ZXJzaW9uQ29uZmlnO1xuXG4gICAgLy8gU3RlcCA0OiBJbml0aWFsaXplIHRoZSBzY2hlbWEgbWFwcGVyXG4gICAgdGhpcy5fc2NoZW1hTWFwcGVyID0gU2NoZW1hTWFwcGVyLmNyZWF0ZSh0aGlzLnNjaGVtYSk7XG5cbiAgICAvLyBTdGVwIDU6IFByb2Nlc3MgcHJvcGVydGllcyB0aHJvdWdoIHRoZSBmcmFtZXdvcmsgcGlwZWxpbmVcbiAgICBjb25zdCBwcm9jZXNzZWRQcm9wcyA9IHRoaXMuX3Byb2Nlc3NQcm9wZXJ0aWVzKHByb3BzKTtcblxuICAgIC8vIFN0ZXAgNjogUGVyZm9ybSB2YWxpZGF0aW9uIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlVmFsaWRhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuX3ZhbGlkYXRlUHJvcGVydGllcyhwcm9jZXNzZWRQcm9wcyk7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGlvblJlc3VsdC52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFByb3BlcnR5IHZhbGlkYXRpb24gZmFpbGVkIGZvciAke3RoaXMucmVzb3VyY2VUeXBlfTpcXG5gICtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGVwIDc6IFBlcmZvcm0gbWlncmF0aW9uIGFuYWx5c2lzIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlTWlncmF0aW9uQW5hbHlzaXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1pZ3JhdGlvbkFuYWx5c2lzID0gdGhpcy5fcGVyZm9ybU1pZ3JhdGlvbkFuYWx5c2lzKCk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCA4OiBDcmVhdGUgdGhlIEF6dXJlIHJlc291cmNlXG4gICAgdGhpcy5fY3JlYXRlQXp1cmVSZXNvdXJjZShwcm9jZXNzZWRQcm9wcyk7XG5cbiAgICAvLyBTdGVwIDk6IENyZWF0ZSBtb25pdG9yaW5nIHJlc291cmNlcyBpZiBjb25maWd1cmVkXG4gICAgLy8gTm90ZTogTW9uaXRvcmluZyByZXNvdXJjZXMgYXJlIGNyZWF0ZWQgbGF6aWx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICAgIGlmIChwcm9wcy5tb25pdG9yaW5nKSB7XG4gICAgICB2b2lkIHRoaXMuY3JlYXRlTW9uaXRvcmluZ1Jlc291cmNlcyhwcm9wcy5tb25pdG9yaW5nKTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDEwOiBMb2cgd2FybmluZ3MgYW5kIG1pZ3JhdGlvbiBndWlkYW5jZVxuICAgIHRoaXMuX2xvZ0ZyYW1ld29ya01lc3NhZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGVmYXVsdCBBUEkgdmVyc2lvbiB0byB1c2Ugd2hlbiBubyBleHBsaWNpdCB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgc2Vuc2libGUgZGVmYXVsdCB2ZXJzaW9uIHRoYXQgY2FuIGJlIHVzZWRcbiAgICogYXMgYSBmYWxsYmFjayBpZiB0aGUgQXBpVmVyc2lvbk1hbmFnZXIgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9ucyByZWdpc3RlcmVkXG4gICAqIGZvciB0aGlzIHJlc291cmNlIHR5cGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IEFQSSB2ZXJzaW9uIHN0cmluZyAoZS5nLiwgXCIyMDI0LTExLTAxXCIpXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBenVyZSByZXNvdXJjZSB0eXBlIGZvciB0aGlzIHJlc291cmNlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIGZ1bGwgQXp1cmUgcmVzb3VyY2UgdHlwZSBpZGVudGlmaWVyIHRoYXRcbiAgICogd2lsbCBiZSB1c2VkIGZvciBBUEkgY2FsbHMgYW5kIHZlcnNpb24gbWFuYWdlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlc291cmNlVHlwZSgpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIGNvbXBsZXRlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uLFxuICAgKiBpbmNsdWRpbmcgYWxsIHByb3BlcnR5IGRlZmluaXRpb25zLCB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgdHJhbnNmb3JtYXRpb25cbiAgICogbWFwcGluZ3MuIFVzZSB0aGUgcmVzb2x2ZVNjaGVtYSgpIGhlbHBlciBtZXRob2QgZm9yIHN0YW5kYXJkIHNjaGVtYSByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByZXNvdXJjZSBib2R5IGZvciB0aGUgQXp1cmUgQVBJIGNhbGxcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIHRyYW5zZm9ybSB0aGUgaW5wdXQgcHJvcGVydGllcyBpbnRvIHRoZSBKU09OIGJvZHkgZm9ybWF0XG4gICAqIGV4cGVjdGVkIGJ5IHRoZSBBenVyZSBSRVNUIEFQSSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb24uIFRoZSBmcmFtZXdvcmsgd2lsbFxuICAgKiBoYXZlIGFscmVhZHkgYXBwbGllZCBhbnkgbmVjZXNzYXJ5IHByb3BlcnR5IHRyYW5zZm9ybWF0aW9ucyBhbmQgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gVGhlIHByb2Nlc3NlZCBhbmQgdmFsaWRhdGVkIHByb3BlcnRpZXMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcmV0dXJucyBUaGUgcmVzb3VyY2UgYm9keSBvYmplY3QgdG8gc2VuZCB0byBBenVyZSBBUElcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueTtcblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3Igc3RhbmRhcmQgc2NoZW1hIHJlc29sdXRpb25cbiAgICpcbiAgICogU3ViY2xhc3NlcyBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIHJlc29sdmUgdGhlIHNjaGVtYSBmb3IgdGhlIGN1cnJlbnQgdmVyc2lvblxuICAgKiBmcm9tIHRoZSBBcGlWZXJzaW9uTWFuYWdlci4gVGhpcyBwcm92aWRlcyBhIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIHRoYXRcbiAgICogbW9zdCByZXNvdXJjZXMgY2FuIHVzZSB3aXRob3V0IGN1c3RvbSBsb2dpYy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWRcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgY29uc3QgdmVyc2lvbkNvbmZpZyA9IHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyLnZlcnNpb25Db25maWcoXG4gICAgICB0aGlzLnJlc291cmNlVHlwZSgpLFxuICAgICAgdGhpcy5yZXNvbHZlZEFwaVZlcnNpb24sXG4gICAgKTtcblxuICAgIGlmICghdmVyc2lvbkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc29sdmUgc2NoZW1hOiB2ZXJzaW9uIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGZvciBgICtcbiAgICAgICAgICBgJHt0aGlzLnJlc291cmNlVHlwZSgpfUAke3RoaXMucmVzb2x2ZWRBcGlWZXJzaW9ufWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJzaW9uQ29uZmlnLnNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXRlc3QgYXZhaWxhYmxlIHZlcnNpb24gZm9yIHRoaXMgcmVzb3VyY2UgdHlwZVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIHJlc29sdXRpb24gbG9naWNcbiAgICogZm9yIHVzZSBpbiBzdWJjbGFzc2VzIG9yIGV4dGVybmFsIHRvb2xpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsYXRlc3QgYXZhaWxhYmxlIHZlcnNpb24sIG9yIHVuZGVmaW5lZCBpZiBub25lIGZvdW5kXG4gICAqL1xuICBwdWJsaWMgbGF0ZXN0VmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5sYXRlc3RWZXJzaW9uKHRoaXMucmVzb3VyY2VUeXBlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHN1cHBvcnRlZCB2ZXJzaW9ucyBmb3IgdGhpcyByZXNvdXJjZSB0eXBlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdmVyc2lvbiByZWdpc3RyeSBmb3IgdXNlIGluXG4gICAqIHN1YmNsYXNzZXMgb3IgZXh0ZXJuYWwgdG9vbGluZy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc3VwcG9ydGVkIHZlcnNpb24gc3RyaW5ncywgc29ydGVkIGJ5IHJlbGVhc2UgZGF0ZVxuICAgKi9cbiAgcHVibGljIHN1cHBvcnRlZFZlcnNpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVmVyc2lvbk1hbmFnZXIuc3VwcG9ydGVkVmVyc2lvbnModGhpcy5yZXNvdXJjZVR5cGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQW5hbHl6ZXMgbWlncmF0aW9uIGZyb20gY3VycmVudCB2ZXJzaW9uIHRvIGEgdGFyZ2V0IHZlcnNpb25cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZW5hYmxlcyBleHRlcm5hbCB0b29scyB0byBhbmFseXplIG1pZ3JhdGlvbiByZXF1aXJlbWVudHNcbiAgICogYmV0d2VlbiB2ZXJzaW9ucyBmb3IgcGxhbm5pbmcgYW5kIGF1dG9tYXRpb24gcHVycG9zZXMuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXRWZXJzaW9uIC0gVGhlIHRhcmdldCB2ZXJzaW9uIHRvIGFuYWx5emUgbWlncmF0aW9uIHRvXG4gICAqIEByZXR1cm5zIERldGFpbGVkIG1pZ3JhdGlvbiBhbmFseXNpcyByZXN1bHRzXG4gICAqL1xuICBwdWJsaWMgYW5hbHl6ZU1pZ3JhdGlvblRvKHRhcmdldFZlcnNpb246IHN0cmluZyk6IE1pZ3JhdGlvbkFuYWx5c2lzIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVmVyc2lvbk1hbmFnZXIuYW5hbHl6ZU1pZ3JhdGlvbihcbiAgICAgIHRoaXMucmVzb3VyY2VUeXBlKCksXG4gICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICAgIHRhcmdldFZlcnNpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgSU1QTEVNRU5UQVRJT04gTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgQVBJIHZlcnNpb24gdG8gdXNlIGZvciB0aGlzIHJlc291cmNlIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIF9yZXNvbHZlQXBpVmVyc2lvbihleHBsaWNpdFZlcnNpb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChleHBsaWNpdFZlcnNpb24pIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGV4cGxpY2l0IHZlcnNpb24gaXMgc3VwcG9ydGVkXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci52YWxpZGF0ZVZlcnNpb25TdXBwb3J0KFxuICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlKCksXG4gICAgICAgICAgZXhwbGljaXRWZXJzaW9uLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbnMgPSB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5zdXBwb3J0ZWRWZXJzaW9ucyhcbiAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZSgpLFxuICAgICAgICApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIEFQSSB2ZXJzaW9uICcke2V4cGxpY2l0VmVyc2lvbn0nIGZvciByZXNvdXJjZSB0eXBlICcke3RoaXMucmVzb3VyY2VUeXBlKCl9Jy4gYCArXG4gICAgICAgICAgICBgU3VwcG9ydGVkIHZlcnNpb25zOiAke3N1cHBvcnRlZFZlcnNpb25zLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4cGxpY2l0VmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZSBtYW5hZ2VyXG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyLmxhdGVzdFZlcnNpb24oXG4gICAgICB0aGlzLnJlc291cmNlVHlwZSgpLFxuICAgICk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCB2ZXJzaW9uXG4gICAgY29uc3QgZGVmYXVsdFZlcnNpb24gPSB0aGlzLmRlZmF1bHRWZXJzaW9uKCk7XG5cbiAgICAvLyBXYXJuIHRoYXQgd2UncmUgdXNpbmcgdGhlIGRlZmF1bHQgdmVyc2lvblxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBObyB2ZXJzaW9ucyByZWdpc3RlcmVkIGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9LiBgICtcbiAgICAgICAgYFVzaW5nIGRlZmF1bHQgdmVyc2lvbjogJHtkZWZhdWx0VmVyc2lvbn0uIGAgK1xuICAgICAgICBgQ29uc2lkZXIgcmVnaXN0ZXJpbmcgdmVyc2lvbnMgd2l0aCBBcGlWZXJzaW9uTWFuYWdlciBmb3IgYmV0dGVyIHZlcnNpb24gbWFuYWdlbWVudC5gLFxuICAgICk7XG5cbiAgICByZXR1cm4gZGVmYXVsdFZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIHByb3BlcnRpZXMgdGhyb3VnaCB0aGUgZnJhbWV3b3JrIHBpcGVsaW5lXG4gICAqL1xuICBwcml2YXRlIF9wcm9jZXNzUHJvcGVydGllcyhwcm9wczogQXphcGlSZXNvdXJjZVByb3BzKTogYW55IHtcbiAgICBsZXQgcHJvY2Vzc2VkUHJvcHMgPSB7IC4uLnByb3BzIH07XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBzY2hlbWFcbiAgICBwcm9jZXNzZWRQcm9wcyA9IHRoaXMuX3NjaGVtYU1hcHBlci5hcHBseURlZmF1bHRzKHByb2Nlc3NlZFByb3BzKTtcblxuICAgIC8vIEFwcGx5IHByb3BlcnR5IHRyYW5zZm9ybWF0aW9ucyBpZiBlbmFibGVkXG4gICAgaWYgKHByb3BzLmVuYWJsZVRyYW5zZm9ybWF0aW9uICE9PSBmYWxzZSkge1xuICAgICAgLy8gRm9yIHRyYW5zZm9ybWF0aW9uLCB3ZSB3b3VsZCBuZWVkIGEgc291cmNlIHNjaGVtYSwgYnV0IHNpbmNlIHdlJ3JlIG5vdFxuICAgICAgLy8gbWlncmF0aW5nIGZyb20gYSBkaWZmZXJlbnQgdmVyc2lvbiBpbiB0aGlzIGNvbnRleHQsIHdlJ2xsIHNraXAgdHJhbnNmb3JtYXRpb25cbiAgICAgIC8vIFRoaXMgd291bGQgYmUgdXNlZCB3aGVuIHVwZ3JhZGluZyBmcm9tIG9uZSB2ZXJzaW9uIHRvIGFub3RoZXJcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkUHJvcHM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHByb3BlcnRpZXMgYWdhaW5zdCB0aGUgc2NoZW1hXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZVByb3BlcnRpZXMocHJvcHM6IGFueSk6IFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWFNYXBwZXIudmFsaWRhdGVQcm9wZXJ0aWVzKHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBtaWdyYXRpb24gYW5hbHlzaXMgZm9yIHRoZSBjdXJyZW50IHZlcnNpb25cbiAgICovXG4gIHByaXZhdGUgX3BlcmZvcm1NaWdyYXRpb25BbmFseXNpcygpOiBNaWdyYXRpb25BbmFseXNpcyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBkZXByZWNhdGVkXG4gICAgaWYgKFxuICAgICAgdGhpcy52ZXJzaW9uQ29uZmlnLnN1cHBvcnRMZXZlbCA9PT0gVmVyc2lvblN1cHBvcnRMZXZlbC5ERVBSRUNBVEVEIHx8XG4gICAgICB0aGlzLnZlcnNpb25Db25maWcuc3VwcG9ydExldmVsID09PSBWZXJzaW9uU3VwcG9ydExldmVsLlNVTlNFVFxuICAgICkge1xuICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRoaXMubGF0ZXN0VmVyc2lvbigpO1xuICAgICAgaWYgKGxhdGVzdFZlcnNpb24gJiYgbGF0ZXN0VmVyc2lvbiAhPT0gdGhpcy5yZXNvbHZlZEFwaVZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyLmFuYWx5emVNaWdyYXRpb24oXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGUoKSxcbiAgICAgICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICAgICAgICBsYXRlc3RWZXJzaW9uLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyBBenVyZSByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlQXp1cmVSZXNvdXJjZShwcm9wczogYW55KTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIHRoZSByZXNvdXJjZSBib2R5IHVzaW5nIHRoZSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgIGNvbnN0IHJlc291cmNlQm9keSA9IHRoaXMuY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgcGFyZW50IElEIHVzaW5nIHRoZSBvdmVycmlkZWFibGUgbWV0aG9kXG4gICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnJlc29sdmVQYXJlbnRJZChwcm9wcyk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIEFaQVBJIHJlc291cmNlIHVzaW5nIHRoZSBiYXNlIGNsYXNzIG1ldGhvZFxuICAgIHRoaXMudGVycmFmb3JtUmVzb3VyY2UgPSB0aGlzLmNyZWF0ZUF6YXBpUmVzb3VyY2UoXG4gICAgICByZXNvdXJjZUJvZHksXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMubG9jYXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcGFyZW50IHJlc291cmNlIElEIGZvciB0aGlzIHJlc291cmNlLlxuICAgKlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBjaGlsZCByZXNvdXJjZSBjbGFzc2VzIChsaWtlIFN1Ym5ldCkgdGhhdCBuZWVkXG4gICAqIGN1c3RvbSBwYXJlbnQgSUQgcmVzb2x1dGlvbiBsb2dpYy4gQnkgZGVmYXVsdCwgdGhpcyBkZWxlZ2F0ZXMgdG8gdGhlXG4gICAqIHByaXZhdGUgX2RldGVybWluZVBhcmVudElkIG1ldGhvZCB3aGljaCBoYW5kbGVzIHN0YW5kYXJkIHJlc291cmNlIHR5cGVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBUaGUgcGFyZW50IHJlc291cmNlIElEXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXRlcm1pbmVQYXJlbnRJZChwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgcGFyZW50IElEIGZvciB0aGUgcmVzb3VyY2UgKGludGVybmFsIGltcGxlbWVudGF0aW9uKVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyB0aGUgZGVmYXVsdCBwYXJlbnQgSUQgcmVzb2x1dGlvbiBsb2dpYyBmb3IgbW9zdCByZXNvdXJjZXMuXG4gICAqIENoaWxkIHJlc291cmNlcyBzaG91bGQgb3ZlcnJpZGUgcmVzb2x2ZVBhcmVudElkKCkgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgX2RldGVybWluZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIC8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGltcGxlbWVudGF0aW9uIC0gcmVhbCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZVxuICAgIC8vIHJlc291cmNlLXR5cGUgc3BlY2lmaWMgYW5kIGNvdWxkIGJlIG1hZGUgYWJzdHJhY3Qgb3IgY29uZmlndXJhYmxlXG5cbiAgICAvLyBGb3IgcmVzb3VyY2UgZ3JvdXBzLCBwYXJlbnQgaXMgc3Vic2NyaXB0aW9uXG4gICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlKCkgPT09IFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiKSB7XG4gICAgICAvLyBVc2UgQVpBUEkgY2xpZW50IGNvbmZpZyB0byBnZXQgc3Vic2NyaXB0aW9uIElEXG4gICAgICBjb25zdCBjbGllbnRDb25maWcgPSBuZXcgRGF0YUF6YXBpQ2xpZW50Q29uZmlnKHRoaXMsIFwiY2xpZW50X2NvbmZpZ1wiLCB7fSk7XG4gICAgICByZXR1cm4gYC9zdWJzY3JpcHRpb25zL1xcJHske2NsaWVudENvbmZpZy5mcW59LnN1YnNjcmlwdGlvbl9pZH1gO1xuICAgIH1cblxuICAgIC8vIEZvciBvdGhlciByZXNvdXJjZXMsIHBhcmVudCBtaWdodCBiZSByZXNvdXJjZSBncm91cFxuICAgIGlmIChwcm9wcy5yZXNvdXJjZUdyb3VwSWQpIHtcbiAgICAgIHJldHVybiBwcm9wcy5yZXNvdXJjZUdyb3VwSWQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byBzdWJzY3JpcHRpb25cbiAgICBjb25zdCBjbGllbnRDb25maWcgPSBuZXcgRGF0YUF6YXBpQ2xpZW50Q29uZmlnKFxuICAgICAgdGhpcyxcbiAgICAgIFwiY2xpZW50X2NvbmZpZ19kZWZhdWx0XCIsXG4gICAgICB7fSxcbiAgICApO1xuICAgIHJldHVybiBgL3N1YnNjcmlwdGlvbnMvXFwkeyR7Y2xpZW50Q29uZmlnLmZxbn0uc3Vic2NyaXB0aW9uX2lkfWA7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBmcmFtZXdvcmsgbWVzc2FnZXMgaW5jbHVkaW5nIHdhcm5pbmdzIGFuZCBtaWdyYXRpb24gZ3VpZGFuY2VcbiAgICovXG4gIHByaXZhdGUgX2xvZ0ZyYW1ld29ya01lc3NhZ2VzKCk6IHZvaWQge1xuICAgIC8vIEFOU0kgY29sb3IgY29kZXMgZm9yIHRlcm1pbmFsIG91dHB1dFxuICAgIGNvbnN0IFJFRCA9IFwiXFx4MWJbMzFtXCI7XG4gICAgY29uc3QgWUVMTE9XID0gXCJcXHgxYlszM21cIjtcbiAgICBjb25zdCBSRVNFVCA9IFwiXFx4MWJbMG1cIjtcbiAgICBjb25zdCBCT0xEID0gXCJcXHgxYlsxbVwiO1xuXG4gICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmdzXG4gICAgaWYgKHRoaXMudmVyc2lvbkNvbmZpZy5zdXBwb3J0TGV2ZWwgPT09IFZlcnNpb25TdXBwb3J0TGV2ZWwuREVQUkVDQVRFRCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtZRUxMT1d94pqg77iPICBBUEkgdmVyc2lvbiAke3RoaXMucmVzb2x2ZWRBcGlWZXJzaW9ufSBmb3IgJHt0aGlzLnJlc291cmNlVHlwZSgpfSBpcyBkZXByZWNhdGVkLiBgICtcbiAgICAgICAgICBgQ29uc2lkZXIgdXBncmFkaW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbjogJHt0aGlzLmxhdGVzdFZlcnNpb24oKX0ke1JFU0VUfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZlcnNpb25Db25maWcuc3VwcG9ydExldmVsID09PSBWZXJzaW9uU3VwcG9ydExldmVsLlNVTlNFVCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYCR7UkVEfSR7Qk9MRH3wn5qoIEFQSSB2ZXJzaW9uICR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259IGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9IGhhcyByZWFjaGVkIHN1bnNldC4gYCArXG4gICAgICAgICAgYEltbWVkaWF0ZSBtaWdyYXRpb24gdG8gJHt0aGlzLmxhdGVzdFZlcnNpb24oKX0gaXMgcmVxdWlyZWQuJHtSRVNFVH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgbWlncmF0aW9uIGFuYWx5c2lzIHJlc3VsdHNcbiAgICBpZiAodGhpcy5taWdyYXRpb25BbmFseXNpcyAmJiAhdGhpcy5taWdyYXRpb25BbmFseXNpcy5jb21wYXRpYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke1lFTExPV31NaWdyYXRpb24gZnJvbSAke3RoaXMubWlncmF0aW9uQW5hbHlzaXMuZnJvbVZlcnNpb259IHRvICR7dGhpcy5taWdyYXRpb25BbmFseXNpcy50b1ZlcnNpb259IGAgK1xuICAgICAgICAgIGBoYXMgJHt0aGlzLm1pZ3JhdGlvbkFuYWx5c2lzLmJyZWFraW5nQ2hhbmdlcy5sZW5ndGh9IGJyZWFraW5nIGNoYW5nZXMuIGAgK1xuICAgICAgICAgIGBFc3RpbWF0ZWQgZWZmb3J0OiAke3RoaXMubWlncmF0aW9uQW5hbHlzaXMuZXN0aW1hdGVkRWZmb3J0fSR7UkVTRVR9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHZhbGlkYXRpb24gd2FybmluZ3NcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uUmVzdWx0Py53YXJuaW5ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtZRUxMT1d9UHJvcGVydHkgdmFsaWRhdGlvbiB3YXJuaW5nOiAke3dhcm5pbmd9JHtSRVNFVH1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTU9OSVRPUklORyBJTlRFR1JBVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbW9uaXRvcmluZyByZXNvdXJjZXMgYmFzZWQgb24gdGhlIG1vbml0b3JpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBkdXJpbmcgY29uc3RydWN0aW9uIGlmIG1vbml0b3JpbmcgaXMgY29uZmlndXJlZC5cbiAgICogSXQgY3JlYXRlcyBhY3Rpb24gZ3JvdXBzLCBtZXRyaWMgYWxlcnRzLCBhbmQgYWN0aXZpdHkgbG9nIGFsZXJ0cyBhcyBjaGlsZCBjb25zdHJ1Y3RzLlxuICAgKlxuICAgKiBQcm90ZWN0ZWQgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBvdmVycmlkZSBvciBleHRlbmQgbW9uaXRvcmluZyBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBtb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBwcm9wc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZU1vbml0b3JpbmdSZXNvdXJjZXMoXG4gICAgY29uZmlnOiBNb25pdG9yaW5nQ29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTa2lwIGlmIG1vbml0b3JpbmcgaXMgZXhwbGljaXRseSBkaXNhYmxlZFxuICAgIGlmIChjb25maWcuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZGlhZ25vc3RpYyBzZXR0aW5ncyB1c2luZyBkeW5hbWljIGltcG9ydCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgaWYgKGNvbmZpZy5kaWFnbm9zdGljU2V0dGluZ3MpIHtcbiAgICAgIGNvbnN0IHsgRGlhZ25vc3RpY1NldHRpbmdzIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi4vLi4vLi4vYXp1cmUtZGlhZ25vc3RpY3NldHRpbmdzL2xpYi9kaWFnbm9zdGljLXNldHRpbmdzXCJcbiAgICAgICk7XG4gICAgICBuZXcgRGlhZ25vc3RpY1NldHRpbmdzKHRoaXMsIFwibW9uaXRvcmluZy1kaWFnbm9zdGljLXNldHRpbmdzXCIsIHtcbiAgICAgICAgLi4uY29uZmlnLmRpYWdub3N0aWNTZXR0aW5ncyxcbiAgICAgICAgdGFyZ2V0UmVzb3VyY2VJZDogdGhpcy5yZXNvdXJjZUlkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFjdGlvbiBncm91cHMgdXNpbmcgZHluYW1pYyBpbXBvcnRcbiAgICBpZiAoY29uZmlnLmFjdGlvbkdyb3VwcyAmJiBjb25maWcuYWN0aW9uR3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgQWN0aW9uR3JvdXAgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgXCIuLi8uLi8uLi9henVyZS1hY3Rpb25ncm91cC9saWIvYWN0aW9uLWdyb3VwXCJcbiAgICAgICk7XG4gICAgICBjb25maWcuYWN0aW9uR3JvdXBzLmZvckVhY2goKGFjdGlvbkdyb3VwUHJvcHMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkdyb3VwID0gbmV3IEFjdGlvbkdyb3VwKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYG1vbml0b3JpbmctYWN0aW9uLWdyb3VwLSR7aW5kZXh9YCxcbiAgICAgICAgICBhY3Rpb25Hcm91cFByb3BzLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1vbml0b3JpbmdBY3Rpb25Hcm91cHMucHVzaChhY3Rpb25Hcm91cCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbWV0cmljIGFsZXJ0cyB1c2luZyBkeW5hbWljIGltcG9ydFxuICAgIGlmIChjb25maWcubWV0cmljQWxlcnRzICYmIGNvbmZpZy5tZXRyaWNBbGVydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBNZXRyaWNBbGVydCB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICBcIi4uLy4uLy4uL2F6dXJlLW1ldHJpY2FsZXJ0L2xpYi9tZXRyaWMtYWxlcnRcIlxuICAgICAgKTtcbiAgICAgIGNvbmZpZy5tZXRyaWNBbGVydHMuZm9yRWFjaCgobWV0cmljQWxlcnRQcm9wcywgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gSWYgc2NvcGVzIG5vdCBwcm92aWRlZCwgZGVmYXVsdCB0byB0aGlzIHJlc291cmNlXG4gICAgICAgIGNvbnN0IHByb3BzV2l0aFNjb3BlOiBNZXRyaWNBbGVydFByb3BzID0ge1xuICAgICAgICAgIC4uLm1ldHJpY0FsZXJ0UHJvcHMsXG4gICAgICAgICAgc2NvcGVzOiBtZXRyaWNBbGVydFByb3BzLnNjb3BlcyB8fCBbdGhpcy5yZXNvdXJjZUlkXSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtZXRyaWNBbGVydCA9IG5ldyBNZXRyaWNBbGVydChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBtb25pdG9yaW5nLW1ldHJpYy1hbGVydC0ke2luZGV4fWAsXG4gICAgICAgICAgcHJvcHNXaXRoU2NvcGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9uaXRvcmluZ01ldHJpY0FsZXJ0cy5wdXNoKG1ldHJpY0FsZXJ0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhY3Rpdml0eSBsb2cgYWxlcnRzIHVzaW5nIGR5bmFtaWMgaW1wb3J0XG4gICAgaWYgKGNvbmZpZy5hY3Rpdml0eUxvZ0FsZXJ0cyAmJiBjb25maWcuYWN0aXZpdHlMb2dBbGVydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBBY3Rpdml0eUxvZ0FsZXJ0IH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi4vLi4vLi4vYXp1cmUtYWN0aXZpdHlsb2dhbGVydC9saWIvYWN0aXZpdHktbG9nLWFsZXJ0XCJcbiAgICAgICk7XG4gICAgICBjb25maWcuYWN0aXZpdHlMb2dBbGVydHMuZm9yRWFjaCgoYWN0aXZpdHlMb2dBbGVydFByb3BzLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBJZiBzY29wZXMgbm90IHByb3ZpZGVkLCBkZWZhdWx0IHRvIHRoaXMgcmVzb3VyY2VcbiAgICAgICAgY29uc3QgcHJvcHNXaXRoU2NvcGU6IEFjdGl2aXR5TG9nQWxlcnRQcm9wcyA9IHtcbiAgICAgICAgICAuLi5hY3Rpdml0eUxvZ0FsZXJ0UHJvcHMsXG4gICAgICAgICAgc2NvcGVzOiBhY3Rpdml0eUxvZ0FsZXJ0UHJvcHMuc2NvcGVzIHx8IFt0aGlzLnJlc291cmNlSWRdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5TG9nQWxlcnQgPSBuZXcgQWN0aXZpdHlMb2dBbGVydChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBtb25pdG9yaW5nLWFjdGl2aXR5LWxvZy1hbGVydC0ke2luZGV4fWAsXG4gICAgICAgICAgcHJvcHNXaXRoU2NvcGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9uaXRvcmluZ0FjdGl2aXR5TG9nQWxlcnRzLnB1c2goYWN0aXZpdHlMb2dBbGVydCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVNPVVJDRSBNQU5BR0VNRU5UIE1FVEhPRFMgKGZyb20gQXphcGlSZXNvdXJjZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyBBWkFQSSBUZXJyYWZvcm0gcmVzb3VyY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBwcm92aWRlciBjbGFzc2VzXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gVGhlIHByb3BlcnRpZXMgb2JqZWN0IHRvIHNlbmQgdG8gdGhlIEF6dXJlIEFQSVxuICAgKiBAcGFyYW0gcGFyZW50SWQgLSBUaGUgcGFyZW50IHJlc291cmNlIElEIChlLmcuLCBzdWJzY3JpcHRpb24gb3IgcmVzb3VyY2UgZ3JvdXApXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSBsb2NhdGlvbiAtIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgKG9wdGlvbmFsLCBjYW4gYmUgaW4gcHJvcGVydGllcylcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgQVpBUEkgcmVzb3VyY2VcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBemFwaVJlc291cmNlKFxuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGFyZW50SWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbG9jYXRpb24/OiBzdHJpbmcsXG4gICk6IGNka3RmLlRlcnJhZm9ybVJlc291cmNlIHtcbiAgICAvLyBCdWlsZCB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBnZW5lcmF0ZWQgQVpBUEkgUmVzb3VyY2UgY2xhc3NcbiAgICBjb25zdCBjb25maWc6IFJlc291cmNlQ29uZmlnID0ge1xuICAgICAgdHlwZTogYCR7dGhpcy5fcmVzb3VyY2VUeXBlfUAke3RoaXMuYXBpVmVyc2lvbn1gLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHBhcmVudElkOiBwYXJlbnRJZCxcbiAgICAgIGJvZHk6IHByb3BlcnRpZXMsXG4gICAgICAvLyBBZGQgbG9jYXRpb24gY29uZGl0aW9uYWxseSBpZiBwcm92aWRlZCBhbmQgbm90IGFscmVhZHkgaW4gcHJvcGVydGllc1xuICAgICAgLi4uKGxvY2F0aW9uICYmICFwcm9wZXJ0aWVzLmxvY2F0aW9uICYmIHsgbG9jYXRpb246IGxvY2F0aW9uIH0pLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYW5kIHJldHVybiB0aGUgQVpBUEkgcmVzb3VyY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBwcm92aWRlciBjbGFzc1xuICAgIHJldHVybiBuZXcgUmVzb3VyY2UodGhpcywgXCJyZXNvdXJjZVwiLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQVpBUEkgZGF0YSBzb3VyY2UgZm9yIHJlYWRpbmcgZXhpc3RpbmcgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZUlkIC0gVGhlIGZ1bGwgcmVzb3VyY2UgSURcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgVGVycmFmb3JtIGRhdGEgc291cmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQXphcGlEYXRhU291cmNlKFxuICAgIHJlc291cmNlSWQ6IHN0cmluZyxcbiAgKTogY2RrdGYuVGVycmFmb3JtRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1EYXRhU291cmNlKHRoaXMsIFwiZGF0YVwiLCB7XG4gICAgICB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwiYXphcGlfcmVzb3VyY2VcIixcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogXCJhemFwaVwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGRhdGFTb3VyY2UuYWRkT3ZlcnJpZGUoXCJ0eXBlXCIsIHRoaXMuX3Jlc291cmNlVHlwZSk7XG4gICAgZGF0YVNvdXJjZS5hZGRPdmVycmlkZShcInJlc291cmNlX2lkXCIsIHJlc291cmNlSWQpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcmVzb3VyY2Ugd2l0aCBuZXcgcHJvcGVydGllc1xuICAgKlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIFRoZSBuZXcgcHJvcGVydGllcyB0byBhcHBseVxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUF6YXBpUmVzb3VyY2UocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGlmICh0aGlzLnRlcnJhZm9ybVJlc291cmNlKSB7XG4gICAgICB0aGlzLnRlcnJhZm9ybVJlc291cmNlLmFkZE92ZXJyaWRlKFwiYm9keVwiLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZnVsbCByZXNvdXJjZSBJRFxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVycmFmb3JtUmVzb3VyY2U/LmZxbiB8fCB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlc291cmNlIGFzIGEgVGVycmFmb3JtIG91dHB1dCB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBvdXRwdXQoKTogY2RrdGYuVGVycmFmb3JtT3V0cHV0IHtcbiAgICByZXR1cm4gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm91dHB1dFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy50ZXJyYWZvcm1SZXNvdXJjZT8uZnFuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gYWNjZXNzIHJvbGUgYXNzaWdubWVudCBmb3IgYSBzcGVjaWZpZWQgQXp1cmUgQUQgb2JqZWN0XG4gICAqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIGNyZWF0ZXMgcm9sZSBhc3NpZ25tZW50cyB1c2luZyBBWkFQSSBpbnN0ZWFkIG9mIEF6dXJlUk0gcHJvdmlkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvYmplY3RJZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQXp1cmUgQUQgb2JqZWN0XG4gICAqIEBwYXJhbSByb2xlRGVmaW5pdGlvbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgQXp1cmUgUkJBQyByb2xlIHRvIGJlIGFzc2lnbmVkXG4gICAqL1xuICBwdWJsaWMgYWRkQWNjZXNzKG9iamVjdElkOiBzdHJpbmcsIHJvbGVEZWZpbml0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEF6YXBpUm9sZUFzc2lnbm1lbnQodGhpcywgYHJiYWMtJHtvYmplY3RJZH0tJHtyb2xlRGVmaW5pdGlvbk5hbWV9YCwge1xuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkLFxuICAgICAgcm9sZURlZmluaXRpb25OYW1lOiByb2xlRGVmaW5pdGlvbk5hbWUsXG4gICAgICBzY29wZTogdGhpcy5yZXNvdXJjZUlkLFxuICAgIH0pO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVIgQ0xBU1NFUyBBTkQgSU5URVJGQUNFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBBWkFQSSByb2xlIGFzc2lnbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBemFwaVJvbGVBc3NpZ25tZW50UHJvcHMge1xuICByZWFkb25seSBvYmplY3RJZDogc3RyaW5nO1xuICByZWFkb25seSByb2xlRGVmaW5pdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBWkFQSS1iYXNlZCByb2xlIGFzc2lnbm1lbnQgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBBemFwaVJvbGVBc3NpZ25tZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEF6YXBpUm9sZUFzc2lnbm1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgcHJpbmNpcGFsSWQ6IHByb3BzLm9iamVjdElkLFxuICAgICAgcm9sZURlZmluaXRpb25JZDogYFtzdWJzY3JpcHRpb25SZXNvdXJjZUlkKCdNaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMnLCByb2xlRGVmaW5pdGlvbklkKCcke3Byb3BzLnJvbGVEZWZpbml0aW9uTmFtZX0nKSldYCxcbiAgICAgIHNjb3BlOiBwcm9wcy5zY29wZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29uZmlnOiBSZXNvdXJjZUNvbmZpZyA9IHtcbiAgICAgIHR5cGU6IFwiTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcm9sZUFzc2lnbm1lbnRzXCIsXG4gICAgICBuYW1lOiBcIltndWlkKCldXCIsXG4gICAgICBwYXJlbnRJZDogcHJvcHMuc2NvcGUsXG4gICAgICBib2R5OiBwcm9wZXJ0aWVzLFxuICAgIH07XG4gICAgbmV3IFJlc291cmNlKHRoaXMsIFwicm9sZS1hc3NpZ25tZW50XCIsIGNvbmZpZyk7XG4gIH1cbn1cbiJdfQ==
|
|
742
|
+
AzapiRoleAssignment[_b] = { fqn: "@microsoft/terraform-cdk-constructs.AzapiRoleAssignment", version: "1.3.0" };
|
|
743
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXphcGktcmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS1henVyZS9saWIvYXphcGkvYXphcGktcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILCtCQUErQjtBQUMvQiwyQ0FBdUM7QUFDdkMseUZBQW1GO0FBQ25GLHlEQUFzRTtBQUN0RSwyRUFBc0U7QUFDdEUseUVBQW9FO0FBT3BFLGdGQUEyRTtBQTRMM0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRztBQUNILE1BQXNCLGFBQWMsU0FBUSxzQkFBUztJQUNuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ08sTUFBTSxDQUFDLGVBQWUsQ0FDOUIsWUFBb0IsRUFDcEIsUUFBeUI7UUFFekIsdUNBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUE2QkQ7Ozs7O09BS0c7SUFDSCxJQUFXLEVBQUU7UUFDWCxPQUFPLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2hELENBQUM7SUEyREQ7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBNEIsRUFBRTtRQUN0RSxnQ0FBZ0M7UUFDaEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQWxCbkIsdURBQXVEO1FBQ3BDLDJCQUFzQixHQUFnQixFQUFFLENBQUM7UUFDekMsMkJBQXNCLEdBQWdCLEVBQUUsQ0FBQztRQUN6QyxnQ0FBMkIsR0FBZ0IsRUFBRSxDQUFDO1FBaUIvRCxrRUFBa0U7UUFDbEUsa0VBQWtFO1FBQ2xFLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFX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QUFlRDs7R0FFRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsc0JBQVM7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUMzQixnQkFBZ0IsRUFBRSx3RkFBd0YsS0FBSyxDQUFDLGtCQUFrQixNQUFNO1lBQ3hJLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztTQUNuQixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQW1CO1lBQzdCLElBQUksRUFBRSx5Q0FBeUM7WUFDL0MsSUFBSSxFQUFFLFVBQVU7WUFDaEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ3JCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUM7UUFDRixJQUFJLG1CQUFRLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7O0FBakJILGtEQWtCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXphcGlSZXNvdXJjZSAtIEEgdW5pZmllZCBmcmFtZXdvcmsgZm9yIHZlcnNpb24tYXdhcmUgQXp1cmUgcmVzb3VyY2UgbWFuYWdlbWVudFxuICpcbiAqIFRoaXMgYWJzdHJhY3QgYmFzZSBjbGFzcyBwcm92aWRlcyBhIHNlbGYtY29udGFpbmVkIHVuaWZpZWQgZnJhbWV3b3JrIGFwcHJvYWNoXG4gKiBmb3IgQXp1cmUgcmVzb3VyY2UgbWFuYWdlbWVudCB3aXRoIGF1dG9tYXRpYyB2ZXJzaW9uIG1hbmFnZW1lbnQsIHNjaGVtYS1kcml2ZW5cbiAqIHByb3BlcnR5IHRyYW5zZm9ybWF0aW9uLCBhbmQgbWlncmF0aW9uIGFuYWx5c2lzIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBsYXRlc3QgdmVyc2lvbiByZXNvbHV0aW9uIHdoZW4gbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAqIC0gU3VwcG9ydCBmb3IgZXhwbGljaXQgdmVyc2lvbiBwaW5uaW5nIGZvciBzdGFiaWxpdHlcbiAqIC0gU2NoZW1hLWRyaXZlbiBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIHZlcnNpb25zXG4gKiAtIE1pZ3JhdGlvbiBhbmFseXNpcyBhbmQgZGVwcmVjYXRpb24gd2FybmluZ3NcbiAqIC0gQnVpbHQtaW4gcm9sZSBhc3NpZ25tZW50IGFuZCBkaWFnbm9zdGljIHNldHRpbmdzIHN1cHBvcnRcbiAqIC0gSlNJSS1jb21wbGlhbnQgZGVzaWduIGZvciBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0XG4gKlxuICogVGhpcyBjbGFzcyByZXBsYWNlcyB0aGUgcHJldmlvdXMgZHVhbC1jbGFzcyBhcHByb2FjaCAoQXphcGlSZXNvdXJjZSArIEF6YXBpUmVzb3VyY2UpXG4gKiB3aXRoIGEgc2luZ2xlLCBzZWxmLWNvbnRhaW5lZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZXMgYWxsIHJlc291cmNlIG1hbmFnZW1lbnQgbmVlZHMuXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRGF0YUF6YXBpQ2xpZW50Q29uZmlnIH0gZnJvbSBcIi4vcHJvdmlkZXJzLWF6YXBpL2RhdGEtYXphcGktY2xpZW50LWNvbmZpZ1wiO1xuaW1wb3J0IHsgUmVzb3VyY2UsIFJlc291cmNlQ29uZmlnIH0gZnJvbSBcIi4vcHJvdmlkZXJzLWF6YXBpL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVNjaGVtYVZhbGlkYXRvciB9IGZyb20gXCIuL3Jlc291cmNlLXNjaGVtYS12YWxpZGF0b3JcIjtcbmltcG9ydCB7IFJlc291cmNlVmVyc2lvbk1hbmFnZXIgfSBmcm9tIFwiLi9yZXNvdXJjZS12ZXJzaW9uLW1hbmFnZXJcIjtcblxuLy8gVHlwZS1vbmx5IGltcG9ydHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG5pbXBvcnQgdHlwZSB7IEFjdGlvbkdyb3VwUHJvcHMgfSBmcm9tIFwiLi4vLi4vLi4vYXp1cmUtYWN0aW9uZ3JvdXAvbGliL2FjdGlvbi1ncm91cFwiO1xuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eUxvZ0FsZXJ0UHJvcHMgfSBmcm9tIFwiLi4vLi4vLi4vYXp1cmUtYWN0aXZpdHlsb2dhbGVydC9saWIvYWN0aXZpdHktbG9nLWFsZXJ0XCI7XG5pbXBvcnQgdHlwZSB7IERpYWdub3N0aWNTZXR0aW5nc1Byb3BzIH0gZnJvbSBcIi4uLy4uLy4uL2F6dXJlLWRpYWdub3N0aWNzZXR0aW5ncy9saWIvZGlhZ25vc3RpYy1zZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNBbGVydFByb3BzIH0gZnJvbSBcIi4uLy4uLy4uL2F6dXJlLW1ldHJpY2FsZXJ0L2xpYi9tZXRyaWMtYWxlcnRcIjtcbmltcG9ydCB7IEFwaVZlcnNpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3ZlcnNpb24tbWFuYWdlci9hcGktdmVyc2lvbi1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBcGlTY2hlbWEsXG4gIFZlcnNpb25Db25maWcsXG4gIFZhbGlkYXRpb25SZXN1bHQsXG4gIE1pZ3JhdGlvbkFuYWx5c2lzLFxufSBmcm9tIFwiLi4vdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogUmV0ZW50aW9uIHBvbGljeSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0ZW50aW9uUG9saWN5Q29uZmlnIHtcbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGF5czogbnVtYmVyO1xufVxuXG4vKipcbiAqIExvZyBjb25maWd1cmF0aW9uIGZvciBkaWFnbm9zdGljIHNldHRpbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlhZ25vc3RpY0xvZ0NvbmZpZyB7XG4gIHJlYWRvbmx5IGNhdGVnb3J5Pzogc3RyaW5nO1xuICByZWFkb25seSBjYXRlZ29yeUdyb3VwPzogc3RyaW5nO1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICByZWFkb25seSByZXRlbnRpb25Qb2xpY3k/OiBSZXRlbnRpb25Qb2xpY3lDb25maWc7XG59XG5cbi8qKlxuICogTWV0cmljIGNvbmZpZ3VyYXRpb24gZm9yIGRpYWdub3N0aWMgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljTWV0cmljQ29uZmlnIHtcbiAgLyoqIE1ldHJpYyBjYXRlZ29yeSBuYW1lICh1c2VkIGluIG5ld2VyIEFQSSB2ZXJzaW9ucykgKi9cbiAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIC8qKiBUaW1lIGdyYWluIGZvciBtZXRyaWNzIGluIElTTyA4NjAxIGR1cmF0aW9uIGZvcm1hdCAodXNlZCBpbiBBUEkgdmVyc2lvbiAyMDE2LTA5LTAxLCBlLmcuLCBcIlBUMU1cIikgKi9cbiAgcmVhZG9ubHkgdGltZUdyYWluPzogc3RyaW5nO1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICByZWFkb25seSByZXRlbnRpb25Qb2xpY3k/OiBSZXRlbnRpb25Qb2xpY3lDb25maWc7XG59XG5cbi8qKlxuICogTW9uaXRvcmluZyBjb25maWd1cmF0aW9uIGZvciBBenVyZSByZXNvdXJjZXNcbiAqXG4gKiBQcm92aWRlcyBpbnRlZ3JhdGVkIG1vbml0b3JpbmcgY2FwYWJpbGl0aWVzIGluY2x1ZGluZyBkaWFnbm9zdGljIHNldHRpbmdzLFxuICogbWV0cmljIGFsZXJ0cywgYW5kIGFjdGl2aXR5IGxvZyBhbGVydHMuIEFsbCBtb25pdG9yaW5nIGlzIG9wdGlvbmFsIGFuZFxuICogZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgbW9uaXRvcmluZyBpcyBlbmFibGVkXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpYWdub3N0aWMgc2V0dGluZ3MgY29uZmlndXJhdGlvblxuICAgKiBVc2VzIHRoZSBmdWxsIERpYWdub3N0aWNTZXR0aW5ncyBjb25zdHJ1Y3QgZm9yIGNvbnNpc3RlbmN5XG4gICAqL1xuICByZWFkb25seSBkaWFnbm9zdGljU2V0dGluZ3M/OiBEaWFnbm9zdGljU2V0dGluZ3NQcm9wcztcblxuICAvKipcbiAgICogQWN0aW9uIGdyb3VwcyB0byBjcmVhdGUgZm9yIHRoaXMgcmVzb3VyY2VcbiAgICogQ3JlYXRlcyBuZXcgQWN0aW9uR3JvdXAgaW5zdGFuY2VzIGFzIGNoaWxkIGNvbnN0cnVjdHNcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbkdyb3Vwcz86IEFjdGlvbkdyb3VwUHJvcHNbXTtcblxuICAvKipcbiAgICogTWV0cmljIGFsZXJ0cyBjb25maWd1cmF0aW9uXG4gICAqIENyZWF0ZXMgTWV0cmljQWxlcnQgaW5zdGFuY2VzIHNjb3BlZCB0byB0aGlzIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNBbGVydHM/OiBNZXRyaWNBbGVydFByb3BzW107XG5cbiAgLyoqXG4gICAqIEFjdGl2aXR5IGxvZyBhbGVydHMgY29uZmlndXJhdGlvblxuICAgKiBDcmVhdGVzIEFjdGl2aXR5TG9nQWxlcnQgaW5zdGFuY2VzIGZvciB0aGlzIHJlc291cmNlJ3Mgb3BlcmF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYWN0aXZpdHlMb2dBbGVydHM/OiBBY3Rpdml0eUxvZ0FsZXJ0UHJvcHNbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB2ZXJzaW9uZWQgQXp1cmUgcmVzb3VyY2VzXG4gKlxuICogQ29tYmluZXMgYmFzZSByZXNvdXJjZSBwcm9wZXJ0aWVzIHdpdGggdmVyc2lvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllc1xuICogYW5kIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHVuaWZpZWQgZnJhbWV3b3JrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF6YXBpUmVzb3VyY2VQcm9wcyBleHRlbmRzIGNka3RmLlRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlc291cmNlIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIExvY2F0aW9uIGhhbmRsaW5nIHZhcmllcyBieSByZXNvdXJjZSB0eXBlOlxuICAgKiAtICoqVG9wLWxldmVsIHJlc291cmNlcyoqOiBNb3N0IHJlcXVpcmUgYW4gZXhwbGljaXQgbG9jYXRpb24gKGUuZy4sIFwiZWFzdHVzXCIsIFwid2VzdHVzXCIpXG4gICAqIC0gKipHbG9iYWwgcmVzb3VyY2VzKio6IFNvbWUgdXNlIFwiZ2xvYmFsXCIgYXMgbG9jYXRpb24gKGUuZy4sIFByaXZhdGUgRE5TIFpvbmVzKVxuICAgKiAtICoqQ2hpbGQgcmVzb3VyY2VzKio6IEluaGVyaXQgbG9jYXRpb24gZnJvbSBwYXJlbnQgYW5kIHNob3VsZCBOT1Qgc2V0IHRoaXMgcHJvcGVydHlcbiAgICpcbiAgICogRWFjaCByZXNvdXJjZSB0eXBlIG1heSBwcm92aWRlIGl0cyBvd24gZGVmYXVsdCB0aHJvdWdoIHRoZSBgcmVzb2x2ZUxvY2F0aW9uKClgIG1ldGhvZC5cbiAgICogSWYgbm8gbG9jYXRpb24gaXMgc3BlY2lmaWVkIGFuZCBubyBkZWZhdWx0IGV4aXN0cywgcmVzb3VyY2UgY3JlYXRpb24gbWF5IGZhaWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEV4cGxpY2l0IGxvY2F0aW9uIGZvciBtb3N0IHJlc291cmNlc1xuICAgKiBsb2NhdGlvbjogXCJlYXN0dXNcIlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBHbG9iYWwgcmVzb3VyY2UgKFByaXZhdGUgRE5TIFpvbmUpXG4gICAqIGxvY2F0aW9uOiBcImdsb2JhbFwiXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENoaWxkIHJlc291cmNlIChTdWJuZXQpIC0gZG8gbm90IHNldCBsb2NhdGlvblxuICAgKiAvLyBsb2NhdGlvbjogdW5kZWZpbmVkIChpbmhlcml0ZWQgZnJvbSBwYXJlbnQgVmlydHVhbCBOZXR3b3JrKVxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIFZhcmllcyBieSByZXNvdXJjZSB0eXBlIC0gc2VlIHNwZWNpZmljIHJlc291cmNlIGRvY3VtZW50YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYWdzIHRvIGFwcGx5IHRvIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBBUEkgdmVyc2lvbiB0byB1c2UgZm9yIHRoaXMgcmVzb3VyY2VcbiAgICpcbiAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIGxhdGVzdCBhY3RpdmUgdmVyc2lvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZWQuXG4gICAqIFVzZSB0aGlzIGZvciB2ZXJzaW9uIHBpbm5pbmcgd2hlbiBzdGFiaWxpdHkgaXMgcmVxdWlyZWQgb3ZlciBsYXRlc3QgZmVhdHVyZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiMjAyNC0xMS0wMVwiXG4gICAqIEBkZWZhdWx0VmFsdWUgTGF0ZXN0IGFjdGl2ZSB2ZXJzaW9uIGZyb20gQXBpVmVyc2lvbk1hbmFnZXJcbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIG1pZ3JhdGlvbiBhbmFseXNpcyB3YXJuaW5nc1xuICAgKlxuICAgKiBXaGVuIHRydWUsIHRoZSBmcmFtZXdvcmsgd2lsbCBhbmFseXplIHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGRlcHJlY2F0aW9uXG4gICAqIHN0YXR1cyBhbmQgcHJvdmlkZSBtaWdyYXRpb24gcmVjb21tZW5kYXRpb25zIGluIHRoZSBkZXBsb3ltZW50IG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVNaWdyYXRpb25BbmFseXNpcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdmFsaWRhdGUgcHJvcGVydGllcyBhZ2FpbnN0IHRoZSBzY2hlbWFcbiAgICpcbiAgICogV2hlbiB0cnVlLCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBBUEkgc2NoZW1hIGJlZm9yZVxuICAgKiByZXNvdXJjZSBjcmVhdGlvbi4gVmFsaWRhdGlvbiBlcnJvcnMgd2lsbCBjYXVzZSBkZXBsb3ltZW50IGZhaWx1cmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVZhbGlkYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFwcGx5IHByb3BlcnR5IHRyYW5zZm9ybWF0aW9ucyBhdXRvbWF0aWNhbGx5XG4gICAqXG4gICAqIFdoZW4gdHJ1ZSwgcHJvcGVydGllcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZVxuICAgKiB0YXJnZXQgc2NoZW1hJ3MgdHJhbnNmb3JtYXRpb24gcnVsZXMuIFRoaXMgZW5hYmxlcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVRyYW5zZm9ybWF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTW9uaXRvcmluZyBjb25maWd1cmF0aW9uIGZvciB0aGlzIHJlc291cmNlXG4gICAqXG4gICAqIEVuYWJsZXMgaW50ZWdyYXRlZCBtb25pdG9yaW5nIHdpdGggZGlhZ25vc3RpYyBzZXR0aW5ncywgbWV0cmljIGFsZXJ0cyxcbiAgICogYW5kIGFjdGl2aXR5IGxvZyBhbGVydHMuIEFsbCBtb25pdG9yaW5nIGlzIG9wdGlvbmFsIGFuZCBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBtb25pdG9yaW5nOiB7XG4gICAqICAgZW5hYmxlZDogdHJ1ZSxcbiAgICogICBkaWFnbm9zdGljU2V0dGluZ3M6IHtcbiAgICogICAgIHdvcmtzcGFjZUlkOiBsb2dBbmFseXRpY3MuaWQsXG4gICAqICAgICBtZXRyaWNzOiBbJ0FsbE1ldHJpY3MnXSxcbiAgICogICAgIGxvZ3M6IFsnQXVkaXRMb2dzJ11cbiAgICogICB9LFxuICAgKiAgIG1ldHJpY0FsZXJ0czogW3tcbiAgICogICAgIG5hbWU6ICdoaWdoLWNwdS1hbGVydCcsXG4gICAqICAgICBzZXZlcml0eTogMixcbiAgICogICAgIHNjb3BlczogW10sIC8vIEF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoaXMgcmVzb3VyY2VcbiAgICogICAgIGNyaXRlcmlhOiB7IC4uLiB9LFxuICAgKiAgICAgYWN0aW9uczogW3sgYWN0aW9uR3JvdXBJZDogYWN0aW9uR3JvdXAuaWQgfV1cbiAgICogICB9XVxuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogTW9uaXRvcmluZ0NvbmZpZztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB2ZXJzaW9uLWF3YXJlIEF6dXJlIHJlc291cmNlIG1hbmFnZW1lbnRcbiAqXG4gKiBBemFwaVJlc291cmNlIHByb3ZpZGVzIGEgdW5pZmllZCBmcmFtZXdvcmsgZm9yIGNyZWF0aW5nIEF6dXJlIHJlc291cmNlc1xuICogd2l0aCBhdXRvbWF0aWMgdmVyc2lvbiBtYW5hZ2VtZW50LCBzY2hlbWEgdmFsaWRhdGlvbiwgcHJvcGVydHkgdHJhbnNmb3JtYXRpb24sXG4gKiBhbmQgbWlncmF0aW9uIGFuYWx5c2lzLiBJdCBleHRlbmRzIHRoZSBleGlzdGluZyBBemFwaVJlc291cmNlIGNsYXNzIHdoaWxlXG4gKiBtYWludGFpbmluZyBmdWxsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb3JlIGZyYW1ld29yayB0aGF0IGVuYWJsZXM6XG4gKiAtIEF1dG9tYXRpYyByZXNvbHV0aW9uIG9mIHRoZSBsYXRlc3QgQVBJIHZlcnNpb24gd2hlbiBub25lIGlzIHNwZWNpZmllZFxuICogLSBFeHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcgZm9yIGVudmlyb25tZW50cyByZXF1aXJpbmcgc3RhYmlsaXR5XG4gKiAtIFNjaGVtYS1kcml2ZW4gcHJvcGVydHkgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb25cbiAqIC0gTWlncmF0aW9uIGFuYWx5c2lzIHdpdGggYnJlYWtpbmcgY2hhbmdlIGRldGVjdGlvblxuICogLSBEZXByZWNhdGlvbiB3YXJuaW5ncyBhbmQgdXBncmFkZSByZWNvbW1lbmRhdGlvbnNcbiAqXG4gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhYnN0cmFjdCBtZXRob2RzIHRvIHByb3ZpZGUgcmVzb3VyY2Utc3BlY2lmaWNcbiAqIGNvbmZpZ3VyYXRpb24gd2hpbGUgdGhlIGZyYW1ld29yayBoYW5kbGVzIGFsbCB2ZXJzaW9uIG1hbmFnZW1lbnQgY29tcGxleGl0eS5cbiAqXG4gKiBAZXhhbXBsZSBCYXNpYyB1c2FnZSB3aXRoIGF1dG9tYXRpYyB2ZXJzaW9uIHJlc29sdXRpb246XG4gKiBjbGFzcyBNeVJlc291cmNlIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gKiAgIHByb3RlY3RlZCBnZXREZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICogICAgIHJldHVybiBcIjIwMjQtMTEtMDFcIjsgLy8gZmFsbGJhY2sgaWYgbm8gdmVyc2lvbnMgcmVnaXN0ZXJlZFxuICogICB9XG4gKlxuICogICBwcm90ZWN0ZWQgZ2V0UmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiO1xuICogICB9XG4gKlxuICogICBwcm90ZWN0ZWQgZ2V0QXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gKiAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICogICB9XG4gKlxuICogICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICogICAgIHJldHVybiB7IGxvY2F0aW9uOiBwcm9wcy5sb2NhdGlvbiwgdGFnczogcHJvcHMudGFncyB8fCB7fSB9O1xuICogICB9XG4gKiB9XG4gKlxuICogQGV4YW1wbGUgVXNhZ2Ugd2l0aCBleHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmc6XG4gKiBuZXcgTXlSZXNvdXJjZSh0aGlzLCBcInJlc291cmNlXCIsIHtcbiAqICAgbmFtZTogXCJteS1yZXNvdXJjZVwiLFxuICogICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAqICAgYXBpVmVyc2lvbjogXCIyMDI0LTAxLTAxXCIgLy8gUGluIHRvIHNwZWNpZmljIHZlcnNpb25cbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBemFwaVJlc291cmNlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFN0YXRpYyBoZWxwZXIgZm9yIGNoaWxkIGNsYXNzZXMgdG8gcmVnaXN0ZXIgdGhlaXIgc2NoZW1hcyBpbiBzdGF0aWMgaW5pdGlhbGl6ZXJzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gYSBzdGF0aWMgaW5pdGlhbGl6ZXIgYmxvY2sgb2YgZWFjaCBjaGlsZCBjbGFzc1xuICAgKiB0byByZWdpc3RlciBhbGwgc3VwcG9ydGVkIEFQSSB2ZXJzaW9ucyBhbmQgdGhlaXIgc2NoZW1hcyB3aXRoIHRoZSBBcGlWZXJzaW9uTWFuYWdlci5cbiAgICogVGhlIHN0YXRpYyBibG9jayBydW5zIG9uY2Ugd2hlbiB0aGUgY2xhc3MgaXMgZmlyc3QgbG9hZGVkLCBlbnN1cmluZyBzY2hlbWFzIGFyZVxuICAgKiByZWdpc3RlcmVkIGJlZm9yZSBhbnkgaW5zdGFuY2VzIGFyZSBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIC0gVGhlIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sIFwiTWljcm9zb2Z0Lk5ldHdvcmsvdmlydHVhbE5ldHdvcmtzXCIpXG4gICAqIEBwYXJhbSB2ZXJzaW9ucyAtIEFycmF5IG9mIHZlcnNpb24gY29uZmlndXJhdGlvbnMgY29udGFpbmluZyBzY2hlbWFzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHN0YXRpYyB7XG4gICAqICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoXG4gICAqICAgICBcIk1pY3Jvc29mdC5OZXR3b3JrL3ZpcnR1YWxOZXR3b3Jrc1wiLFxuICAgKiAgICAgQUxMX1ZJUlRVQUxfTkVUV09SS19WRVJTSU9OU1xuICAgKiAgICk7XG4gICAqIH1cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVnaXN0ZXJTY2hlbWFzKFxuICAgIHJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIHZlcnNpb25zOiBWZXJzaW9uQ29uZmlnW10sXG4gICk6IHZvaWQge1xuICAgIEFwaVZlcnNpb25NYW5hZ2VyLmluc3RhbmNlKCkucmVnaXN0ZXJSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlLCB2ZXJzaW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfcmVzb3VyY2VUeXBlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVBJIHZlcnNpb24gdG8gdXNlIGZvciB0aGlzIHJlc291cmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5kZXJseWluZyBBWkFQSSBUZXJyYWZvcm0gcmVzb3VyY2VcbiAgICovXG4gIHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZSE6IGNka3RmLlRlcnJhZm9ybVJlc291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgKG9wdGlvbmFsIC0gbm90IGFsbCByZXNvdXJjZXMgaGF2ZSBhIGxvY2F0aW9uKVxuICAgKiBDaGlsZCByZXNvdXJjZXMgdHlwaWNhbGx5IGluaGVyaXQgbG9jYXRpb24gZnJvbSB0aGVpciBwYXJlbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2NhdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEF6dXJlIHJlc291cmNlIElEXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBkZXJpdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgVGVycmFmb3JtIHJlc291cmNlLlxuICAgKiBDaGlsZCBjbGFzc2VzIG5vIGxvbmdlciBuZWVkIHRvIGltcGxlbWVudCB0aGlzIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59LmlkfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIEFQSSB2ZXJzaW9uIGJlaW5nIHVzZWQgZm9yIHRoaXMgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICpcbiAgICogVGhpcyBpcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBBenVyZSBBUEkgY2FsbCxcbiAgICogZWl0aGVyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHByb3BzIG9yIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZWQgdG9cbiAgICogdGhlIGxhdGVzdCBhY3RpdmUgdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlZEFwaVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqXG4gICAqIENvbnRhaW5zIHRoZSBjb21wbGV0ZSBzY2hlbWEgZGVmaW5pdGlvbiBpbmNsdWRpbmcgcHJvcGVydGllcywgdmFsaWRhdGlvblxuICAgKiBydWxlcywgYW5kIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmdzIGZvciB0aGUgcmVzb2x2ZWQgQVBJIHZlcnNpb24uXG4gICAqL1xuICBwdWJsaWMgc2NoZW1hITogQXBpU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvblxuICAgKlxuICAgKiBDb250YWlucyBsaWZlY3ljbGUgaW5mb3JtYXRpb24sIGJyZWFraW5nIGNoYW5nZXMsIGFuZCBtaWdyYXRpb24gbWV0YWRhdGFcbiAgICogZm9yIHRoZSByZXNvbHZlZCBBUEkgdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyB2ZXJzaW9uQ29uZmlnITogVmVyc2lvbkNvbmZpZztcblxuICAvKipcbiAgICogVmFsaWRhdGlvbiByZXN1bHRzIGZvciB0aGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKlxuICAgKiBBdmFpbGFibGUgYWZ0ZXIgY29uc3RydWN0aW9uIGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZC4gQ29udGFpbnMgZGV0YWlsZWRcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgYW55IHZhbGlkYXRpb24gZXJyb3JzIG9yIHdhcm5pbmdzLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRpb25SZXN1bHQ/OiBWYWxpZGF0aW9uUmVzdWx0O1xuXG4gIC8qKlxuICAgKiBNaWdyYXRpb24gYW5hbHlzaXMgcmVzdWx0c1xuICAgKlxuICAgKiBBdmFpbGFibGUgYWZ0ZXIgY29uc3RydWN0aW9uIGlmIG1pZ3JhdGlvbiBhbmFseXNpcyBpcyBlbmFibGVkIGFuZCBhXG4gICAqIHByZXZpb3VzIHZlcnNpb24gY2FuIGJlIGRldGVybWluZWQgZm9yIGNvbXBhcmlzb24uXG4gICAqL1xuICBwdWJsaWMgbWlncmF0aW9uQW5hbHlzaXM/OiBNaWdyYXRpb25BbmFseXNpcztcblxuICAvLyBGcmFtZXdvcmsgY29tcG9uZW50c1xuICBwcml2YXRlIHJlYWRvbmx5IF9hcGlWZXJzaW9uTWFuYWdlcjogQXBpVmVyc2lvbk1hbmFnZXI7XG4gIHByaXZhdGUgX3ZlcnNpb25NYW5hZ2VyITogUmVzb3VyY2VWZXJzaW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSBfc2NoZW1hVmFsaWRhdG9yITogUmVzb3VyY2VTY2hlbWFWYWxpZGF0b3I7XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG11dGFibGUgdGFncyBzdG9yYWdlIHNlcGFyYXRlIGZyb20gaW5wdXQgcHJvcHNcbiAgICogQ29tYmluZXMgcHJvcHMudGFncyB3aXRoIGR5bmFtaWNhbGx5IGFkZGVkIHRhZ3MgdmlhIGFkZFRhZygpXG4gICAqL1xuICBwcml2YXRlIF90YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8vIE1vbml0b3JpbmcgcmVzb3VyY2VzIChwcm90ZWN0ZWQgZm9yIHN1YmNsYXNzIGFjY2VzcylcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbml0b3JpbmdBY3Rpb25Hcm91cHM6IENvbnN0cnVjdFtdID0gW107XG4gIHByb3RlY3RlZCByZWFkb25seSBtb25pdG9yaW5nTWV0cmljQWxlcnRzOiBDb25zdHJ1Y3RbXSA9IFtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9uaXRvcmluZ0FjdGl2aXR5TG9nQWxlcnRzOiBDb25zdHJ1Y3RbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF6YXBpUmVzb3VyY2UgaW5zdGFuY2VcbiAgICpcbiAgICogVGhlIGNvbnN0cnVjdG9yIGhhbmRsZXMgYWxsIGZyYW1ld29yayBpbml0aWFsaXphdGlvbiBpbmNsdWRpbmcgdmVyc2lvbiByZXNvbHV0aW9uLFxuICAgKiBzY2hlbWEgbG9hZGluZywgcHJvcGVydHkgdmFsaWRhdGlvbiwgdHJhbnNmb3JtYXRpb24sIGFuZCBtaWdyYXRpb24gYW5hbHlzaXMuXG4gICAqIEl0IG1haW50YWlucyBmdWxsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQXphcGlSZXNvdXJjZSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFuY2VcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgcmVzb3VyY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMgPSB7fSkge1xuICAgIC8vIEluaXRpYWxpemUgdGhlIGJhc2UgQ29uc3RydWN0XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEluaXRpYWxpemUgYmFzaWMgcHJvcGVydGllcyB0aGF0IGRvbid0IHJlcXVpcmUgYWJzdHJhY3QgbWV0aG9kc1xuICAgIC8vIFVzZSBwcm9wcy5uYW1lIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGNvbnN0cnVjdCBJRFxuICAgIC8vIFRoaXMgc3VwcG9ydHMgYm90aCBleHBsaWNpdCBuYW1pbmcgYW5kIGF1dG9tYXRpYyBJRC1iYXNlZCBuYW1pbmdcbiAgICB0aGlzLm5hbWUgPSB0aGlzLnJlc29sdmVOYW1lKHByb3BzKTtcbiAgICB0aGlzLmxvY2F0aW9uID0gdGhpcy5yZXNvbHZlTG9jYXRpb24ocHJvcHMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgQVBJIHZlcnNpb24gbWFuYWdlclxuICAgIHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyID0gQXBpVmVyc2lvbk1hbmFnZXIuaW5zdGFuY2UoKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGFncyBzdG9yYWdlIHdpdGggZW1wdHkgb2JqZWN0ICh3aWxsIGJlIHBvcHVsYXRlZCBpbiBpbml0aWFsaXplKCkpXG4gICAgdGhpcy5fdGFncyA9IHt9O1xuXG4gICAgLy8gTm90ZTogV2UgY2Fubm90IGluaXRpYWxpemUgdmVyc2lvbiBtYW5hZ2VyIGhlcmUgYmVjYXVzZSBpdCByZXF1aXJlc1xuICAgIC8vIGNhbGxpbmcgYWJzdHJhY3QgbWV0aG9kcyAocmVzb3VyY2VUeXBlKCkgYW5kIGRlZmF1bHRWZXJzaW9uKCkpXG4gICAgLy8gd2hpY2ggYXJlIG5vdCB5ZXQgYXZhaWxhYmxlIGluIHRoZSBiYXNlIGNvbnN0cnVjdG9yLlxuICAgIC8vIFZlcnNpb24gcmVzb2x1dGlvbiBpcyBkZWZlcnJlZCB0byBpbml0aWFsaXplKCkgbWV0aG9kLlxuXG4gICAgLy8gU3RlcCAxOiBSZXNvbHZlIHRoZSBBUEkgdmVyc2lvbiB0byB1c2UgKGRvZXNuJ3QgY2FsbCBhYnN0cmFjdCBtZXRob2RzIHlldClcbiAgICAvLyBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgdGhhdCB3aWxsIGJlIHByb3Blcmx5IHNldCBpbiBpbml0aWFsaXplKClcbiAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbiA9IHByb3BzLmFwaVZlcnNpb24gfHwgXCJcIjtcbiAgICB0aGlzLmFwaVZlcnNpb24gPSB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbjtcblxuICAgIC8vIFN0ZXAgMjogQ2FsbCBpbml0aWFsaXplKCkgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgY2hpbGQgY2xhc3MgaXMgcmVhZHlcbiAgICB0aGlzLmluaXRpYWxpemUocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBpbml0aWFsaXphdGlvbiBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBjb21wbGV0ZXNcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnN0cnVjdG9yIHRvIHBlcmZvcm0gaW5pdGlhbGl6YXRpb25cbiAgICogdGhhdCByZXF1aXJlcyBjYWxsaW5nIGFic3RyYWN0IG1ldGhvZHMuIENoaWxkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kXG4gICAqIGlmIHRoZXkgbmVlZCB0byBleHRlbmQgaW5pdGlhbGl6YXRpb24gbG9naWMsIGJ1dCB0aGV5IE1VU1QgY2FsbCBzdXBlci5pbml0aWFsaXplKHByb3BzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgcmVzb3VyY2VcbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsaXplKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiB2b2lkIHtcbiAgICAvLyBTdGVwIDI6IFNldCByZXF1aXJlZCBhYnN0cmFjdCBwcm9wZXJ0aWVzIChub3cgc2FmZSB0byBjYWxsIGFic3RyYWN0IG1ldGhvZHMpXG4gICAgdGhpcy5fcmVzb3VyY2VUeXBlID0gdGhpcy5yZXNvdXJjZVR5cGUoKTtcblxuICAgIC8vIFN0ZXAgMzogSW5pdGlhbGl6ZSB0aGUgdmVyc2lvbiBtYW5hZ2VyIGFuZCByZXNvbHZlIHRoZSBBUEkgdmVyc2lvblxuICAgIHRoaXMuX3ZlcnNpb25NYW5hZ2VyID0gbmV3IFJlc291cmNlVmVyc2lvbk1hbmFnZXIoXG4gICAgICB0aGlzLl9yZXNvdXJjZVR5cGUsXG4gICAgICB0aGlzLmRlZmF1bHRWZXJzaW9uKCksXG4gICAgKTtcbiAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb25NYW5hZ2VyLnJlc29sdmVBcGlWZXJzaW9uKFxuICAgICAgcHJvcHMuYXBpVmVyc2lvbixcbiAgICApO1xuICAgIHRoaXMuYXBpVmVyc2lvbiA9IHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uO1xuXG4gICAgLy8gU3RlcCAzLjU6IEluaXRpYWxpemUgdGFncyBmcm9tIHByb3BzXG4gICAgLy8gVGhpcyBjcmVhdGVzIGEgbXV0YWJsZSBjb3B5IHNlcGFyYXRlIGZyb20gdGhlIHJlYWRvbmx5IHByb3BzXG4gICAgdGhpcy5fdGFncyA9IHsgLi4uKHByb3BzLnRhZ3MgfHwge30pIH07XG5cbiAgICAvLyBTdGVwIDQ6IExvYWQgdGhlIHNjaGVtYSBhbmQgdmVyc2lvbiBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSB2ZXJzaW9uIG1hbmFnZXJcbiAgICB0aGlzLnNjaGVtYSA9IHRoaXMuX3ZlcnNpb25NYW5hZ2VyLnNjaGVtYUZvclZlcnNpb24oXG4gICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICApO1xuICAgIGNvbnN0IHZlcnNpb25Db25maWcgPSB0aGlzLl92ZXJzaW9uTWFuYWdlci52ZXJzaW9uQ29uZmlnKFxuICAgICAgdGhpcy5yZXNvbHZlZEFwaVZlcnNpb24sXG4gICAgKTtcblxuICAgIGlmICghdmVyc2lvbkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmVyc2lvbiBjb25maWd1cmF0aW9uIG5vdCBmb3VuZCBmb3IgJHt0aGlzLnJlc291cmNlVHlwZSgpfUAke3RoaXMucmVzb2x2ZWRBcGlWZXJzaW9ufS4gYCArXG4gICAgICAgICAgYFBsZWFzZSBlbnN1cmUgdGhlIHZlcnNpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBBcGlWZXJzaW9uTWFuYWdlci5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52ZXJzaW9uQ29uZmlnID0gdmVyc2lvbkNvbmZpZztcblxuICAgIC8vIFN0ZXAgNTogSW5pdGlhbGl6ZSB0aGUgc2NoZW1hIHZhbGlkYXRvclxuICAgIHRoaXMuX3NjaGVtYVZhbGlkYXRvciA9IG5ldyBSZXNvdXJjZVNjaGVtYVZhbGlkYXRvcih0aGlzLnNjaGVtYSk7XG5cbiAgICAvLyBTdGVwIDY6IFByb2Nlc3MgcHJvcGVydGllcyB0aHJvdWdoIHRoZSBmcmFtZXdvcmsgcGlwZWxpbmVcbiAgICBjb25zdCBwcm9jZXNzZWRQcm9wcyA9IHRoaXMuX3Byb2Nlc3NQcm9wZXJ0aWVzKHByb3BzKTtcblxuICAgIC8vIFN0ZXAgNzogUGVyZm9ybSB2YWxpZGF0aW9uIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlVmFsaWRhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdCA9XG4gICAgICAgIHRoaXMuX3NjaGVtYVZhbGlkYXRvci52YWxpZGF0ZVByb3BzKHByb2Nlc3NlZFByb3BzKTtcbiAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uUmVzdWx0LnZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUHJvcGVydHkgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICR7dGhpcy5yZXNvdXJjZVR5cGUoKX06XFxuYCArXG4gICAgICAgICAgICB0aGlzLl9zY2hlbWFWYWxpZGF0b3JcbiAgICAgICAgICAgICAgLmZvcm1hdFZhbGlkYXRpb25FcnJvcnModGhpcy52YWxpZGF0aW9uUmVzdWx0KVxuICAgICAgICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGVwIDg6IFBlcmZvcm0gbWlncmF0aW9uIGFuYWx5c2lzIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlTWlncmF0aW9uQW5hbHlzaXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1pZ3JhdGlvbkFuYWx5c2lzID0gdGhpcy5fcGVyZm9ybU1pZ3JhdGlvbkFuYWx5c2lzKCk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCA5OiBDcmVhdGUgdGhlIEF6dXJlIHJlc291cmNlXG4gICAgdGhpcy5fY3JlYXRlQXp1cmVSZXNvdXJjZShwcm9jZXNzZWRQcm9wcyk7XG5cbiAgICAvLyBTdGVwIDEwOiBDcmVhdGUgbW9uaXRvcmluZyByZXNvdXJjZXMgaWYgY29uZmlndXJlZFxuICAgIC8vIE5vdGU6IE1vbml0b3JpbmcgcmVzb3VyY2VzIGFyZSBjcmVhdGVkIGxhemlseSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAgICBpZiAocHJvcHMubW9uaXRvcmluZykge1xuICAgICAgdm9pZCB0aGlzLmNyZWF0ZU1vbml0b3JpbmdSZXNvdXJjZXMocHJvcHMubW9uaXRvcmluZyk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAxMTogTG9nIHdhcm5pbmdzIGFuZCBtaWdyYXRpb24gZ3VpZGFuY2VcbiAgICB0aGlzLl9sb2dGcmFtZXdvcmtNZXNzYWdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRlZmF1bHQgQVBJIHZlcnNpb24gdG8gdXNlIHdoZW4gbm8gZXhwbGljaXQgdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIHNlbnNpYmxlIGRlZmF1bHQgdmVyc2lvbiB0aGF0IGNhbiBiZSB1c2VkXG4gICAqIGFzIGEgZmFsbGJhY2sgaWYgdGhlIEFwaVZlcnNpb25NYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBhbnkgdmVyc2lvbnMgcmVnaXN0ZXJlZFxuICAgKiBmb3IgdGhpcyByZXNvdXJjZSB0eXBlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBBUEkgdmVyc2lvbiBzdHJpbmcgKGUuZy4sIFwiMjAyNC0xMS0wMVwiKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZztcblxuICAvKipcbiAgICogR2V0cyB0aGUgQXp1cmUgcmVzb3VyY2UgdHlwZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBmdWxsIEF6dXJlIHJlc291cmNlIHR5cGUgaWRlbnRpZmllciB0aGF0XG4gICAqIHdpbGwgYmUgdXNlZCBmb3IgQVBJIGNhbGxzIGFuZCB2ZXJzaW9uIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBBenVyZSByZXNvdXJjZSB0eXBlIChlLmcuLCBcIk1pY3Jvc29mdC5SZXNvdXJjZXMvcmVzb3VyY2VHcm91cHNcIilcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZXNvdXJjZVR5cGUoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBUEkgc2NoZW1hIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvblxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBjb21wbGV0ZSBBUEkgc2NoZW1hIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvbixcbiAgICogaW5jbHVkaW5nIGFsbCBwcm9wZXJ0eSBkZWZpbml0aW9ucywgdmFsaWRhdGlvbiBydWxlcywgYW5kIHRyYW5zZm9ybWF0aW9uXG4gICAqIG1hcHBpbmdzLiBVc2UgdGhlIHJlc29sdmVTY2hlbWEoKSBoZWxwZXIgbWV0aG9kIGZvciBzdGFuZGFyZCBzY2hlbWEgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYTtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcmVzb3VyY2UgYm9keSBmb3IgdGhlIEF6dXJlIEFQSSBjYWxsXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCB0cmFuc2Zvcm0gdGhlIGlucHV0IHByb3BlcnRpZXMgaW50byB0aGUgSlNPTiBib2R5IGZvcm1hdFxuICAgKiBleHBlY3RlZCBieSB0aGUgQXp1cmUgUkVTVCBBUEkgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uLiBUaGUgZnJhbWV3b3JrIHdpbGxcbiAgICogaGF2ZSBhbHJlYWR5IGFwcGxpZWQgYW55IG5lY2Vzc2FyeSBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbnMgYW5kIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRoZSBwcm9jZXNzZWQgYW5kIHZhbGlkYXRlZCBwcm9wZXJ0aWVzIGZvciB0aGUgcmVzb3VyY2VcbiAgICogQHJldHVybnMgVGhlIHJlc291cmNlIGJvZHkgb2JqZWN0IHRvIHNlbmQgdG8gQXp1cmUgQVBJXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnk7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIGNoaWxkIGNsYXNzZXMgdG8gcHJvdmlkZSBkZWZhdWx0IGxvY2F0aW9uXG4gICAqIEByZXR1cm5zIERlZmF1bHQgbG9jYXRpb24gb3IgdW5kZWZpbmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVmYXVsdExvY2F0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBjaGlsZCBjbGFzc2VzIHRvIGluZGljYXRlIGlmIGxvY2F0aW9uIGlzIHJlcXVpcmVkXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbG9jYXRpb24gaXMgbWFuZGF0b3J5IGZvciB0aGlzIHJlc291cmNlIHR5cGVcbiAgICovXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBjaGlsZCBjbGFzc2VzIHRvIHNwZWNpZnkgcGFyZW50IHJlc291cmNlIGZvciBsb2NhdGlvbiBpbmhlcml0YW5jZVxuICAgKiBAcmV0dXJucyBQYXJlbnQgcmVzb3VyY2Ugb3IgdW5kZWZpbmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyZW50UmVzb3VyY2VGb3JMb2NhdGlvbigpOiBBemFwaVJlc291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGxvY2F0aW9uIHVzaW5nIHRlbXBsYXRlIG1ldGhvZCBwYXR0ZXJuXG4gICAqIFByaW9yaXR5OiBwcm9wcy5sb2NhdGlvbiA+IHBhcmVudCBsb2NhdGlvbiA+IGRlZmF1bHQgbG9jYXRpb24gPiB2YWxpZGF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUxvY2F0aW9uKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIDEuIEV4cGxpY2l0IGxvY2F0aW9uIGluIHByb3BzXG4gICAgaWYgKHByb3BzLmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gcHJvcHMubG9jYXRpb247XG4gICAgfVxuXG4gICAgLy8gMi4gSW5oZXJpdCBmcm9tIHBhcmVudCByZXNvdXJjZVxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50UmVzb3VyY2VGb3JMb2NhdGlvbigpO1xuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gcGFyZW50LmxvY2F0aW9uO1xuICAgIH1cblxuICAgIC8vIDMuIFVzZSBjaGlsZCBjbGFzcyBkZWZhdWx0XG4gICAgY29uc3QgZGVmYXVsdExvYyA9IHRoaXMuZGVmYXVsdExvY2F0aW9uKCk7XG4gICAgaWYgKGRlZmF1bHRMb2MpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TG9jO1xuICAgIH1cblxuICAgIC8vIDQuIFZhbGlkYXRlIGlmIHJlcXVpcmVkXG4gICAgaWYgKHRoaXMucmVxdWlyZXNMb2NhdGlvbigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBMb2NhdGlvbiBpcyByZXF1aXJlZCBmb3IgJHt0aGlzLnJlc291cmNlVHlwZSgpfSBidXQgd2FzIG5vdCBwcm92aWRlZCBgICtcbiAgICAgICAgICBgYW5kIGNvdWxkIG5vdCBiZSBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgcmVzb3VyY2UuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbmFtZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjZW50cmFsaXplcyBuYW1lIHJlc29sdXRpb24gbG9naWMuIEJ5IGRlZmF1bHQsIGl0IHVzZXMgdGhlXG4gICAqIHByb3ZpZGVkIG5hbWUgb3IgZmFsbHMgYmFjayB0byB0aGUgY29uc3RydWN0IElELlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgcmVzb3VyY2UgbmFtZVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVOYW1lKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9wcy5uYW1lIHx8IHRoaXMubm9kZS5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIGZvciBzdGFuZGFyZCBzY2hlbWEgcmVzb2x1dGlvblxuICAgKlxuICAgKiBTdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gcmVzb2x2ZSB0aGUgc2NoZW1hIGZvciB0aGUgY3VycmVudCB2ZXJzaW9uXG4gICAqIGZyb20gdGhlIEFwaVZlcnNpb25NYW5hZ2VyLiBUaGlzIHByb3ZpZGVzIGEgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gdGhhdFxuICAgKiBtb3N0IHJlc291cmNlcyBjYW4gdXNlIHdpdGhvdXQgY3VzdG9tIGxvZ2ljLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgc2NoZW1hIGNhbm5vdCBiZSByZXNvbHZlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICBjb25zdCB2ZXJzaW9uQ29uZmlnID0gdGhpcy5fYXBpVmVyc2lvbk1hbmFnZXIudmVyc2lvbkNvbmZpZyhcbiAgICAgIHRoaXMucmVzb3VyY2VUeXBlKCksXG4gICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICApO1xuXG4gICAgaWYgKCF2ZXJzaW9uQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzb2x2ZSBzY2hlbWE6IHZlcnNpb24gY29uZmlndXJhdGlvbiBub3QgZm91bmQgZm9yIGAgK1xuICAgICAgICAgIGAke3RoaXMucmVzb3VyY2VUeXBlKCl9QCR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcnNpb25Db25maWcuc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgdmVyc2lvbiBmb3IgdGhpcyByZXNvdXJjZSB0eXBlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gcmVzb2x1dGlvbiBsb2dpY1xuICAgKiBmb3IgdXNlIGluIHN1YmNsYXNzZXMgb3IgZXh0ZXJuYWwgdG9vbGluZy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxhdGVzdCBhdmFpbGFibGUgdmVyc2lvbiwgb3IgdW5kZWZpbmVkIGlmIG5vbmUgZm91bmRcbiAgICovXG4gIHB1YmxpYyBsYXRlc3RWZXJzaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25NYW5hZ2VyXG4gICAgICA/IHRoaXMuX3ZlcnNpb25NYW5hZ2VyLmxhdGVzdFZlcnNpb24oKVxuICAgICAgOiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5sYXRlc3RWZXJzaW9uKHRoaXMucmVzb3VyY2VUeXBlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHN1cHBvcnRlZCB2ZXJzaW9ucyBmb3IgdGhpcyByZXNvdXJjZSB0eXBlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdmVyc2lvbiByZWdpc3RyeSBmb3IgdXNlIGluXG4gICAqIHN1YmNsYXNzZXMgb3IgZXh0ZXJuYWwgdG9vbGluZy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc3VwcG9ydGVkIHZlcnNpb24gc3RyaW5ncywgc29ydGVkIGJ5IHJlbGVhc2UgZGF0ZVxuICAgKi9cbiAgcHVibGljIHN1cHBvcnRlZFZlcnNpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbk1hbmFnZXJcbiAgICAgID8gdGhpcy5fdmVyc2lvbk1hbmFnZXIuc3VwcG9ydGVkVmVyc2lvbnMoKVxuICAgICAgOiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5zdXBwb3J0ZWRWZXJzaW9ucyh0aGlzLnJlc291cmNlVHlwZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmFseXplcyBtaWdyYXRpb24gZnJvbSBjdXJyZW50IHZlcnNpb24gdG8gYSB0YXJnZXQgdmVyc2lvblxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIGV4dGVybmFsIHRvb2xzIHRvIGFuYWx5emUgbWlncmF0aW9uIHJlcXVpcmVtZW50c1xuICAgKiBiZXR3ZWVuIHZlcnNpb25zIGZvciBwbGFubmluZyBhbmQgYXV0b21hdGlvbiBwdXJwb3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldFZlcnNpb24gLSBUaGUgdGFyZ2V0IHZlcnNpb24gdG8gYW5hbHl6ZSBtaWdyYXRpb24gdG9cbiAgICogQHJldHVybnMgRGV0YWlsZWQgbWlncmF0aW9uIGFuYWx5c2lzIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBhbmFseXplTWlncmF0aW9uVG8odGFyZ2V0VmVyc2lvbjogc3RyaW5nKTogTWlncmF0aW9uQW5hbHlzaXMge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5hbmFseXplTWlncmF0aW9uKFxuICAgICAgdGhpcy5yZXNvdXJjZVR5cGUoKSxcbiAgICAgIHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uLFxuICAgICAgdGFyZ2V0VmVyc2lvbixcbiAgICApO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgSU1QTEVNRU5UQVRJT04gTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgcHJvcGVydGllcyB0aHJvdWdoIHRoZSBmcmFtZXdvcmsgcGlwZWxpbmVcbiAgICovXG4gIHByaXZhdGUgX3Byb2Nlc3NQcm9wZXJ0aWVzKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiBhbnkge1xuICAgIGxldCBwcm9jZXNzZWRQcm9wcyA9IHsgLi4ucHJvcHMgfTtcblxuICAgIC8vIEVuc3VyZSBuYW1lIGlzIHNldCBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIC8vIFRoaXMgaXMgY3JpdGljYWwgZm9yIHZhbGlkYXRpb24gdG8gd29yayBjb3JyZWN0bHlcbiAgICBpZiAoIXByb2Nlc3NlZFByb3BzLm5hbWUpIHtcbiAgICAgIHByb2Nlc3NlZFByb3BzLm5hbWUgPSB0aGlzLnJlc29sdmVOYW1lKHByb3BzKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBzY2hlbWEgdXNpbmcgdGhlIHZhbGlkYXRvclxuICAgIHByb2Nlc3NlZFByb3BzID0gdGhpcy5fc2NoZW1hVmFsaWRhdG9yLmFwcGx5RGVmYXVsdHMocHJvY2Vzc2VkUHJvcHMpO1xuXG4gICAgLy8gQXBwbHkgcHJvcGVydHkgdHJhbnNmb3JtYXRpb25zIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlVHJhbnNmb3JtYXRpb24gIT09IGZhbHNlKSB7XG4gICAgICAvLyBGb3IgdHJhbnNmb3JtYXRpb24sIHdlIHdvdWxkIG5lZWQgYSBzb3VyY2Ugc2NoZW1hLCBidXQgc2luY2Ugd2UncmUgbm90XG4gICAgICAvLyBtaWdyYXRpbmcgZnJvbSBhIGRpZmZlcmVudCB2ZXJzaW9uIGluIHRoaXMgY29udGV4dCwgd2UnbGwgc2tpcCB0cmFuc2Zvcm1hdGlvblxuICAgICAgLy8gVGhpcyB3b3VsZCBiZSB1c2VkIHdoZW4gdXBncmFkaW5nIGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlclxuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZWRQcm9wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBtaWdyYXRpb24gYW5hbHlzaXMgZm9yIHRoZSBjdXJyZW50IHZlcnNpb25cbiAgICovXG4gIHByaXZhdGUgX3BlcmZvcm1NaWdyYXRpb25BbmFseXNpcygpOiBNaWdyYXRpb25BbmFseXNpcyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBkZXByZWNhdGVkIHVzaW5nIHRoZSB2ZXJzaW9uIG1hbmFnZXJcbiAgICBpZiAodGhpcy5fdmVyc2lvbk1hbmFnZXIuaXNEZXByZWNhdGVkKHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uKSkge1xuICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb25NYW5hZ2VyLmxhdGVzdFZlcnNpb24oKTtcbiAgICAgIGlmIChsYXRlc3RWZXJzaW9uICYmIGxhdGVzdFZlcnNpb24gIT09IHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5hbmFseXplTWlncmF0aW9uKFxuICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlKCksXG4gICAgICAgICAgdGhpcy5yZXNvbHZlZEFwaVZlcnNpb24sXG4gICAgICAgICAgbGF0ZXN0VmVyc2lvbixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgQXp1cmUgcmVzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZUF6dXJlUmVzb3VyY2UocHJvcHM6IGFueSk6IHZvaWQge1xuICAgIC8vIEVuc3VyZSBuYW1lIGlzIHNldCBpbiBwcm9wcyBmb3IgdmFsaWRhdGlvblxuICAgIGNvbnN0IHByb3BzV2l0aE5hbWUgPSB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIG5hbWU6IHByb3BzLm5hbWUgfHwgdGhpcy5yZXNvbHZlTmFtZShwcm9wcyksXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcmVzb3VyY2UgYm9keSB1c2luZyB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICBjb25zdCByZXNvdXJjZUJvZHkgPSB0aGlzLmNyZWF0ZVJlc291cmNlQm9keShwcm9wc1dpdGhOYW1lKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgcGFyZW50IElEIHVzaW5nIHRoZSBvdmVycmlkZWFibGUgbWV0aG9kXG4gICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnJlc29sdmVQYXJlbnRJZChwcm9wc1dpdGhOYW1lKTtcblxuICAgIC8vIEZpbmQgcGFyZW50IEF6YXBpUmVzb3VyY2UgY29uc3RydWN0IGlmIHBhcmVudCBJRCByZWZlcmVuY2VzIGEgcmVzb3VyY2VcbiAgICBjb25zdCBwYXJlbnRSZXNvdXJjZSA9IHRoaXMuX2ZpbmRQYXJlbnRBemFwaVJlc291cmNlKHBhcmVudElkKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgQVpBUEkgcmVzb3VyY2UgdXNpbmcgdGhlIGJhc2UgY2xhc3MgbWV0aG9kXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gdGhpcy5yZXNvbHZlTmFtZShwcm9wcyk7XG4gICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZSA9IHRoaXMuY3JlYXRlQXphcGlSZXNvdXJjZShcbiAgICAgIHJlc291cmNlQm9keSxcbiAgICAgIHBhcmVudElkLFxuICAgICAgcmVzb3VyY2VOYW1lLFxuICAgICAgdGhpcy5sb2NhdGlvbixcbiAgICAgIHBhcmVudFJlc291cmNlLFxuICAgICAgcHJvcHNXaXRoTmFtZS5kZXBlbmRzT24sXG4gICAgICB0aGlzLl90YWdzLCAvLyBQYXNzIHRhZ3MgZGlyZWN0bHkgaW5zdGVhZCBvZiBleHRyYWN0aW5nIGZyb20gYm9keVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIHBhcmVudCBBemFwaVJlc291cmNlIGNvbnN0cnVjdCBpZiB0aGUgcGFyZW50SWQgcmVmZXJlbmNlcyBhIHJlc291cmNlXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHBhcmVudElkIGlzIGEgc3RhdGljIHN0cmluZyBvciBwYXJlbnQgbm90IGZvdW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9maW5kUGFyZW50QXphcGlSZXNvdXJjZShcbiAgICBwYXJlbnRJZDogc3RyaW5nLFxuICApOiBBemFwaVJlc291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGFyZW50IGlzIGEgc3RyaW5nIGludGVycG9sYXRpb24gcmVmZXJlbmNpbmcgYW5vdGhlciByZXNvdXJjZVxuICAgIC8vIFBhdHRlcm46ICR7YXphcGlfcmVzb3VyY2UucmVzb3VyY2VfbmFtZV9IQVNILmlkfSBvciAke2NvbnN0cnVjdC5mcW59LmlkXG4gICAgaWYgKCFwYXJlbnRJZC5pbmNsdWRlcyhcIiR7XCIpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBQYXJlbnQgaXMgYSBzdGF0aWMgc3RyaW5nIElELCBub3QgYSByZXNvdXJjZSByZWZlcmVuY2VcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZmluZCB0aGUgcGFyZW50IEF6YXBpUmVzb3VyY2UgaW4gdGhlIGNvbnN0cnVjdCB0cmVlXG4gICAgLy8gV2UgbmVlZCB0byBzZWFyY2ggdGhlIGVudGlyZSB0cmVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIHBhcmVudFxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9maW5kUm9vdCgpO1xuICAgIHJldHVybiB0aGlzLl9maW5kUGFyZW50UmVzb3VyY2Uocm9vdCwgcGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSByb290IG9mIHRoZSBjb25zdHJ1Y3QgdHJlZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfZmluZFJvb3QoKTogQ29uc3RydWN0IHtcbiAgICBsZXQgY3VycmVudDogQ29uc3RydWN0ID0gdGhpcztcbiAgICB3aGlsZSAoY3VycmVudC5ub2RlLnNjb3BlKSB7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5ub2RlLnNjb3BlO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgYSBwYXJlbnQgcmVzb3VyY2UgYnkgbWF0Y2hpbmcgcGFyZW50SWQgcGF0dGVybnNcbiAgICogRW5oYW5jZWQgdG8gYmV0dGVyIGhhbmRsZSBUZXJyYWZvcm0gaW50ZXJwb2xhdGlvbiBzeW50YXhcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2ZpbmRQYXJlbnRSZXNvdXJjZShcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIHBhcmVudElkOiBzdHJpbmcsXG4gICk6IEF6YXBpUmVzb3VyY2UgfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGFsbCBjaGlsZHJlbiBvZiB0aGlzIHNjb3BlXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBzY29wZS5ub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkIGluc3RhbmNlb2YgQXphcGlSZXNvdXJjZSAmJlxuICAgICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgICBjaGlsZC50ZXJyYWZvcm1SZXNvdXJjZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRnFuID0gY2hpbGQudGVycmFmb3JtUmVzb3VyY2UuZnFuO1xuXG4gICAgICAgIC8vIE1hdGNoIGlmIHRoZSBjaGlsZCdzIEZRTiBhcHBlYXJzIGFueXdoZXJlIGluIHRoZSBwYXJlbnRJZCBzdHJpbmdcbiAgICAgICAgLy8gVGhpcyBoYW5kbGVzIGNhc2VzIGxpa2U6ICR7YXphcGlfcmVzb3VyY2UuZG5zLXJlc29sdmVyX3Jlc291cmNlX0YxNTE3QkU0LmlkfVxuICAgICAgICAvLyB3aGVyZSBjaGlsZEZxbiB3b3VsZCBiZTogYXphcGlfcmVzb3VyY2UuZG5zLXJlc29sdmVyX3Jlc291cmNlX0YxNTE3QkU0XG4gICAgICAgIGlmIChwYXJlbnRJZC5pbmNsdWRlcyhjaGlsZEZxbikpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGluIGNoaWxkJ3Mgc3VidHJlZVxuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLl9maW5kUGFyZW50UmVzb3VyY2UoY2hpbGQsIHBhcmVudElkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcGFyZW50IHJlc291cmNlIElEIGZvciB0aGlzIHJlc291cmNlLlxuICAgKlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBjaGlsZCByZXNvdXJjZSBjbGFzc2VzIChsaWtlIFN1Ym5ldCkgdGhhdCBuZWVkXG4gICAqIGN1c3RvbSBwYXJlbnQgSUQgcmVzb2x1dGlvbiBsb2dpYy4gQnkgZGVmYXVsdCwgdGhpcyBkZWxlZ2F0ZXMgdG8gdGhlXG4gICAqIHByaXZhdGUgX2RldGVybWluZVBhcmVudElkIG1ldGhvZCB3aGljaCBoYW5kbGVzIHN0YW5kYXJkIHJlc291cmNlIHR5cGVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBUaGUgcGFyZW50IHJlc291cmNlIElEXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXRlcm1pbmVQYXJlbnRJZChwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgcGFyZW50IElEIGZvciB0aGUgcmVzb3VyY2UgKGludGVybmFsIGltcGxlbWVudGF0aW9uKVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyB0aGUgZGVmYXVsdCBwYXJlbnQgSUQgcmVzb2x1dGlvbiBsb2dpYy5cbiAgICogUmVzb3VyY2Utc3BlY2lmaWMgbG9naWMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSBvdmVycmlkZWFibGUgcmVzb2x2ZVBhcmVudElkKCkgbWV0aG9kLlxuICAgKlxuICAgKiBEZWZhdWx0IGJlaGF2aW9yOlxuICAgKiAtIElmIHJlc291cmNlR3JvdXBJZCBpcyBwcm92aWRlZCBpbiBwcm9wcywgdXNlIGl0XG4gICAqIC0gT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIHN1YnNjcmlwdGlvbiBzY29wZVxuICAgKi9cbiAgcHJpdmF0ZSBfZGV0ZXJtaW5lUGFyZW50SWQocHJvcHM6IGFueSk6IHN0cmluZyB7XG4gICAgLy8gSWYgcmVzb3VyY2UgZ3JvdXAgSUQgaXMgcHJvdmlkZWQsIHVzZSBpdCBhcyBwYXJlbnRcbiAgICBpZiAocHJvcHMucmVzb3VyY2VHcm91cElkKSB7XG4gICAgICByZXR1cm4gcHJvcHMucmVzb3VyY2VHcm91cElkO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gc3Vic2NyaXB0aW9uIHNjb3BlIGZvciByZXNvdXJjZXMgd2l0aG91dCBleHBsaWNpdCBwYXJlbnRcbiAgICBjb25zdCBjbGllbnRDb25maWcgPSBuZXcgRGF0YUF6YXBpQ2xpZW50Q29uZmlnKFxuICAgICAgdGhpcyxcbiAgICAgIFwiY2xpZW50X2NvbmZpZ19kZWZhdWx0XCIsXG4gICAgICB7fSxcbiAgICApO1xuICAgIHJldHVybiBgL3N1YnNjcmlwdGlvbnMvXFwkeyR7Y2xpZW50Q29uZmlnLmZxbn0uc3Vic2NyaXB0aW9uX2lkfWA7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBmcmFtZXdvcmsgbWVzc2FnZXMgaW5jbHVkaW5nIHdhcm5pbmdzIGFuZCBtaWdyYXRpb24gZ3VpZGFuY2VcbiAgICovXG4gIHByaXZhdGUgX2xvZ0ZyYW1ld29ya01lc3NhZ2VzKCk6IHZvaWQge1xuICAgIC8vIEFOU0kgY29sb3IgY29kZXMgZm9yIHRlcm1pbmFsIG91dHB1dFxuICAgIGNvbnN0IFJFRCA9IFwiXFx4MWJbMzFtXCI7XG4gICAgY29uc3QgWUVMTE9XID0gXCJcXHgxYlszM21cIjtcbiAgICBjb25zdCBSRVNFVCA9IFwiXFx4MWJbMG1cIjtcbiAgICBjb25zdCBCT0xEID0gXCJcXHgxYlsxbVwiO1xuXG4gICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmdzIHVzaW5nIHRoZSB2ZXJzaW9uIG1hbmFnZXJcbiAgICBpZiAoXG4gICAgICB0aGlzLl92ZXJzaW9uTWFuYWdlci5pc0RlcHJlY2F0ZWQodGhpcy5yZXNvbHZlZEFwaVZlcnNpb24pICYmXG4gICAgICAhdGhpcy5fdmVyc2lvbk1hbmFnZXIuaXNTdW5zZXQodGhpcy5yZXNvbHZlZEFwaVZlcnNpb24pXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke1lFTExPV33imqDvuI8gIEFQSSB2ZXJzaW9uICR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259IGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9IGlzIGRlcHJlY2F0ZWQuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciB1cGdyYWRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uOiAke3RoaXMubGF0ZXN0VmVyc2lvbigpfSR7UkVTRVR9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3ZlcnNpb25NYW5hZ2VyLmlzU3Vuc2V0KHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYCR7UkVEfSR7Qk9MRH3wn5qoIEFQSSB2ZXJzaW9uICR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259IGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9IGhhcyByZWFjaGVkIHN1bnNldC4gYCArXG4gICAgICAgICAgYEltbWVkaWF0ZSBtaWdyYXRpb24gdG8gJHt0aGlzLmxhdGVzdFZlcnNpb24oKX0gaXMgcmVxdWlyZWQuJHtSRVNFVH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgbWlncmF0aW9uIGFuYWx5c2lzIHJlc3VsdHNcbiAgICBpZiAodGhpcy5taWdyYXRpb25BbmFseXNpcyAmJiAhdGhpcy5taWdyYXRpb25BbmFseXNpcy5jb21wYXRpYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke1lFTExPV31NaWdyYXRpb24gZnJvbSAke3RoaXMubWlncmF0aW9uQW5hbHlzaXMuZnJvbVZlcnNpb259IHRvICR7dGhpcy5taWdyYXRpb25BbmFseXNpcy50b1ZlcnNpb259IGAgK1xuICAgICAgICAgIGBoYXMgJHt0aGlzLm1pZ3JhdGlvbkFuYWx5c2lzLmJyZWFraW5nQ2hhbmdlcy5sZW5ndGh9IGJyZWFraW5nIGNoYW5nZXMuIGAgK1xuICAgICAgICAgIGBFc3RpbWF0ZWQgZWZmb3J0OiAke3RoaXMubWlncmF0aW9uQW5hbHlzaXMuZXN0aW1hdGVkRWZmb3J0fSR7UkVTRVR9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHZhbGlkYXRpb24gd2FybmluZ3NcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uUmVzdWx0Py53YXJuaW5ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtZRUxMT1d9UHJvcGVydHkgdmFsaWRhdGlvbiB3YXJuaW5nOiAke3dhcm5pbmd9JHtSRVNFVH1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTU9OSVRPUklORyBJTlRFR1JBVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbW9uaXRvcmluZyByZXNvdXJjZXMgYmFzZWQgb24gdGhlIG1vbml0b3JpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBkdXJpbmcgY29uc3RydWN0aW9uIGlmIG1vbml0b3JpbmcgaXMgY29uZmlndXJlZC5cbiAgICogSXQgY3JlYXRlcyBhY3Rpb24gZ3JvdXBzLCBtZXRyaWMgYWxlcnRzLCBhbmQgYWN0aXZpdHkgbG9nIGFsZXJ0cyBhcyBjaGlsZCBjb25zdHJ1Y3RzLlxuICAgKlxuICAgKiBQcm90ZWN0ZWQgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBvdmVycmlkZSBvciBleHRlbmQgbW9uaXRvcmluZyBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBtb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBwcm9wc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZU1vbml0b3JpbmdSZXNvdXJjZXMoXG4gICAgY29uZmlnOiBNb25pdG9yaW5nQ29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTa2lwIGlmIG1vbml0b3JpbmcgaXMgZXhwbGljaXRseSBkaXNhYmxlZFxuICAgIGlmIChjb25maWcuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZGlhZ25vc3RpYyBzZXR0aW5ncyB1c2luZyBkeW5hbWljIGltcG9ydCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgaWYgKGNvbmZpZy5kaWFnbm9zdGljU2V0dGluZ3MpIHtcbiAgICAgIGNvbnN0IHsgRGlhZ25vc3RpY1NldHRpbmdzIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi4vLi4vLi4vYXp1cmUtZGlhZ25vc3RpY3NldHRpbmdzL2xpYi9kaWFnbm9zdGljLXNldHRpbmdzXCJcbiAgICAgICk7XG4gICAgICBuZXcgRGlhZ25vc3RpY1NldHRpbmdzKHRoaXMsIFwibW9uaXRvcmluZy1kaWFnbm9zdGljLXNldHRpbmdzXCIsIHtcbiAgICAgICAgLi4uY29uZmlnLmRpYWdub3N0aWNTZXR0aW5ncyxcbiAgICAgICAgdGFyZ2V0UmVzb3VyY2VJZDogdGhpcy5yZXNvdXJjZUlkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFjdGlvbiBncm91cHMgdXNpbmcgZHluYW1pYyBpbXBvcnRcbiAgICBpZiAoY29uZmlnLmFjdGlvbkdyb3VwcyAmJiBjb25maWcuYWN0aW9uR3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgQWN0aW9uR3JvdXAgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgXCIuLi8uLi8uLi9henVyZS1hY3Rpb25ncm91cC9saWIvYWN0aW9uLWdyb3VwXCJcbiAgICAgICk7XG4gICAgICBjb25maWcuYWN0aW9uR3JvdXBzLmZvckVhY2goKGFjdGlvbkdyb3VwUHJvcHMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkdyb3VwID0gbmV3IEFjdGlvbkdyb3VwKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYG1vbml0b3JpbmctYWN0aW9uLWdyb3VwLSR7aW5kZXh9YCxcbiAgICAgICAgICBhY3Rpb25Hcm91cFByb3BzLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1vbml0b3JpbmdBY3Rpb25Hcm91cHMucHVzaChhY3Rpb25Hcm91cCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbWV0cmljIGFsZXJ0cyB1c2luZyBkeW5hbWljIGltcG9ydFxuICAgIGlmIChjb25maWcubWV0cmljQWxlcnRzICYmIGNvbmZpZy5tZXRyaWNBbGVydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBNZXRyaWNBbGVydCB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICBcIi4uLy4uLy4uL2F6dXJlLW1ldHJpY2FsZXJ0L2xpYi9tZXRyaWMtYWxlcnRcIlxuICAgICAgKTtcbiAgICAgIGNvbmZpZy5tZXRyaWNBbGVydHMuZm9yRWFjaCgobWV0cmljQWxlcnRQcm9wcywgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gSWYgc2NvcGVzIG5vdCBwcm92aWRlZCwgZGVmYXVsdCB0byB0aGlzIHJlc291cmNlXG4gICAgICAgIGNvbnN0IHByb3BzV2l0aFNjb3BlOiBNZXRyaWNBbGVydFByb3BzID0ge1xuICAgICAgICAgIC4uLm1ldHJpY0FsZXJ0UHJvcHMsXG4gICAgICAgICAgc2NvcGVzOiBtZXRyaWNBbGVydFByb3BzLnNjb3BlcyB8fCBbdGhpcy5yZXNvdXJjZUlkXSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtZXRyaWNBbGVydCA9IG5ldyBNZXRyaWNBbGVydChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBtb25pdG9yaW5nLW1ldHJpYy1hbGVydC0ke2luZGV4fWAsXG4gICAgICAgICAgcHJvcHNXaXRoU2NvcGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9uaXRvcmluZ01ldHJpY0FsZXJ0cy5wdXNoKG1ldHJpY0FsZXJ0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhY3Rpdml0eSBsb2cgYWxlcnRzIHVzaW5nIGR5bmFtaWMgaW1wb3J0XG4gICAgaWYgKGNvbmZpZy5hY3Rpdml0eUxvZ0FsZXJ0cyAmJiBjb25maWcuYWN0aXZpdHlMb2dBbGVydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBBY3Rpdml0eUxvZ0FsZXJ0IH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi4vLi4vLi4vYXp1cmUtYWN0aXZpdHlsb2dhbGVydC9saWIvYWN0aXZpdHktbG9nLWFsZXJ0XCJcbiAgICAgICk7XG4gICAgICBjb25maWcuYWN0aXZpdHlMb2dBbGVydHMuZm9yRWFjaCgoYWN0aXZpdHlMb2dBbGVydFByb3BzLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBJZiBzY29wZXMgbm90IHByb3ZpZGVkLCBkZWZhdWx0IHRvIHRoaXMgcmVzb3VyY2VcbiAgICAgICAgY29uc3QgcHJvcHNXaXRoU2NvcGU6IEFjdGl2aXR5TG9nQWxlcnRQcm9wcyA9IHtcbiAgICAgICAgICAuLi5hY3Rpdml0eUxvZ0FsZXJ0UHJvcHMsXG4gICAgICAgICAgc2NvcGVzOiBhY3Rpdml0eUxvZ0FsZXJ0UHJvcHMuc2NvcGVzIHx8IFt0aGlzLnJlc291cmNlSWRdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5TG9nQWxlcnQgPSBuZXcgQWN0aXZpdHlMb2dBbGVydChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBtb25pdG9yaW5nLWFjdGl2aXR5LWxvZy1hbGVydC0ke2luZGV4fWAsXG4gICAgICAgICAgcHJvcHNXaXRoU2NvcGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9uaXRvcmluZ0FjdGl2aXR5TG9nQWxlcnRzLnB1c2goYWN0aXZpdHlMb2dBbGVydCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVNPVVJDRSBNQU5BR0VNRU5UIE1FVEhPRFMgKGZyb20gQXphcGlSZXNvdXJjZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyBBWkFQSSBUZXJyYWZvcm0gcmVzb3VyY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBwcm92aWRlciBjbGFzc2VzXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gVGhlIHByb3BlcnRpZXMgb2JqZWN0IHRvIHNlbmQgdG8gdGhlIEF6dXJlIEFQSSAoc2hvdWxkIGluY2x1ZGUgbG9jYXRpb24gaWYgbmVlZGVkKVxuICAgKiBAcGFyYW0gcGFyZW50SWQgLSBUaGUgcGFyZW50IHJlc291cmNlIElEIChlLmcuLCBzdWJzY3JpcHRpb24gb3IgcmVzb3VyY2UgZ3JvdXApXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSBsb2NhdGlvbiAtIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgKG9wdGlvbmFsLCBvbmx5IGZvciB0b3AtbGV2ZWwgcmVzb3VyY2VzIHdpdGhvdXQgbG9jYXRpb24gaW4gYm9keSlcbiAgICogQHBhcmFtIHBhcmVudFJlc291cmNlIC0gVGhlIHBhcmVudCByZXNvdXJjZSBmb3IgZGVwZW5kZW5jeSB0cmFja2luZ1xuICAgKiBAcGFyYW0gZGVwZW5kc09uIC0gRXhwbGljaXQgZGVwZW5kZW5jaWVzIGZvciB0aGlzIHJlc291cmNlXG4gICAqIEBwYXJhbSB0YWdzIC0gVGFncyB0byBhcHBseSB0byB0aGUgcmVzb3VyY2UgKHBhc3NlZCBzZXBhcmF0ZWx5IGZyb20gYm9keSBmb3IgcHJvcGVyIGlkZW1wb3RlbmN5KVxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBBWkFQSSByZXNvdXJjZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUF6YXBpUmVzb3VyY2UoXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwYXJlbnRJZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBsb2NhdGlvbj86IHN0cmluZyxcbiAgICBwYXJlbnRSZXNvdXJjZT86IEF6YXBpUmVzb3VyY2UsXG4gICAgZGVwZW5kc09uPzogY2RrdGYuSVRlcnJhZm9ybURlcGVuZGFibGVbXSxcbiAgICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgKTogY2RrdGYuVGVycmFmb3JtUmVzb3VyY2Uge1xuICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgY2hpbGQgcmVzb3VyY2UgYnkgY291bnRpbmcgcGF0aCBzZWdtZW50c1xuICAgIC8vIENoaWxkIHJlc291cmNlcyBoYXZlIG11bHRpcGxlIHNlZ21lbnRzIChlLmcuLCBcIk1pY3Jvc29mdC5OZXR3b3JrL3ZpcnR1YWxOZXR3b3Jrcy9zdWJuZXRzXCIpXG4gICAgLy8gVG9wLWxldmVsIHJlc291cmNlcyBoYXZlIG9uZSBzZWdtZW50IChlLmcuLCBcIk1pY3Jvc29mdC5OZXR3b3JrL3ZpcnR1YWxOZXR3b3Jrc1wiKVxuICAgIGNvbnN0IHJlc291cmNlVHlwZVBhcnRzID0gdGhpcy5fcmVzb3VyY2VUeXBlLnNwbGl0KFwiL1wiKTtcbiAgICBjb25zdCBpc0NoaWxkUmVzb3VyY2UgPSByZXNvdXJjZVR5cGVQYXJ0cy5sZW5ndGggPiAyO1xuXG4gICAgLy8gUmVtb3ZlIHRhZ3MgZnJvbSBwcm9wZXJ0aWVzIHRvIGF2b2lkIGR1cGxpY2F0ZSBzcGVjaWZpY2F0aW9uIGVycm9yXG4gICAgLy8gVGhlIEFaQVBJIHByb3ZpZGVyIHJlcXVpcmVzIHRhZ3MgYXQgdGhlIHRvcCBsZXZlbCBvbmx5LCBub3QgaW4gdGhlIGJvZHlcbiAgICAvLyBUaGlzIHByZXZlbnRzOiBcImNhbid0IHNwZWNpZnkgYm90aCB0aGUgYXJndW1lbnQgJ3RhZ3MnIGFuZCAndGFncycgaW4gdGhlIGFyZ3VtZW50ICdib2R5J1wiXG4gICAgLy8gVGFncyBhcmUgbm93IHBhc3NlZCBhcyBhIHNlcGFyYXRlIHBhcmFtZXRlciBmb3IgYmV0dGVyIGNsYXJpdHkgYW5kIGlkZW1wb3RlbmN5XG4gICAgY29uc3QgYm9keVdpdGhvdXRUYWdzID0geyAuLi5wcm9wZXJ0aWVzIH07XG4gICAgZGVsZXRlIGJvZHlXaXRob3V0VGFncy50YWdzO1xuXG4gICAgLy8gQnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgZ2VuZXJhdGVkIEFaQVBJIFJlc291cmNlIGNsYXNzXG4gICAgLy8gQWRkIGxvY2F0aW9uIG9ubHkgaWY6XG4gICAgLy8gMS4gVGhpcyBpcyBhIHRvcC1sZXZlbCByZXNvdXJjZSAobm90IGEgY2hpbGQgcmVzb3VyY2UpXG4gICAgLy8gMi4gTG9jYXRpb24gaXMgcHJvdmlkZWQgYXMgcGFyYW1ldGVyXG4gICAgLy8gMy4gTG9jYXRpb24gaXMgbm90IGFscmVhZHkgaW4gdGhlIGJvZHlcbiAgICAvLyBDaGlsZCByZXNvdXJjZXMgaW5oZXJpdCBsb2NhdGlvbiBmcm9tIHRoZWlyIHBhcmVudCBhbmQgc2hvdWxkIG5vdCBzcGVjaWZ5IGl0XG5cbiAgICAvLyBDb21iaW5lIGRlcGVuZHNPbiBhcnJheXM6IGV4cGxpY2l0IGRlcGVuZGVuY2llcyArIHBhcmVudCByZXNvdXJjZSBkZXBlbmRlbmN5XG4gICAgY29uc3QgY29tYmluZWREZXBlbmRzT246IGNka3RmLklUZXJyYWZvcm1EZXBlbmRhYmxlW10gPSBbXTtcbiAgICBpZiAoZGVwZW5kc09uICYmIGRlcGVuZHNPbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb21iaW5lZERlcGVuZHNPbi5wdXNoKC4uLmRlcGVuZHNPbik7XG4gICAgfVxuXG4gICAgLy8gQ1JJVElDQUw6IEFsd2F5cyBhZGQgcGFyZW50IGRlcGVuZGVuY3kgd2hlbiBwYXJlbnRfaWQgY29udGFpbnMgaW50ZXJwb2xhdGlvbnNcbiAgICAvLyBUaGlzIGVuc3VyZXMgcHJvcGVyIGRlc3Ryb3ktdGltZSBvcmRlcmluZyBldmVuIGlmIHBhcmVudCBkZXRlY3Rpb24gZmFpbHNcbiAgICBpZiAocGFyZW50UmVzb3VyY2U/LnRlcnJhZm9ybVJlc291cmNlKSB7XG4gICAgICBjb21iaW5lZERlcGVuZHNPbi5wdXNoKHBhcmVudFJlc291cmNlLnRlcnJhZm9ybVJlc291cmNlKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IFJlc291cmNlQ29uZmlnID0ge1xuICAgICAgdHlwZTogYCR7dGhpcy5fcmVzb3VyY2VUeXBlfUAke3RoaXMuYXBpVmVyc2lvbn1gLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHBhcmVudElkOiBwYXJlbnRJZCxcbiAgICAgIGJvZHk6IGJvZHlXaXRob3V0VGFncyxcbiAgICAgIC4uLighaXNDaGlsZFJlc291cmNlICYmIGxvY2F0aW9uICYmICFwcm9wZXJ0aWVzLmxvY2F0aW9uICYmIHsgbG9jYXRpb24gfSksXG4gICAgICAvLyBBZGQgdGFncyBhdCB0aGUgdG9wIGxldmVsIGlmIHRoZXkgZXhpc3RcbiAgICAgIC8vIFRhZ3MgYXJlIHBhc3NlZCBhcyBhIHNlcGFyYXRlIHBhcmFtZXRlciBhbmQgYWRkZWQgaGVyZSB0byBlbnN1cmUgdGhleSdyZSBpbiB0aGVcbiAgICAgIC8vIGluaXRpYWwgVGVycmFmb3JtIGNvbmZpZ3VyYXRpb24sIHByb3ZpZGluZyBwcm9wZXIgaWRlbXBvdGVuY3lcbiAgICAgIC4uLih0YWdzICYmIE9iamVjdC5rZXlzKHRhZ3MpLmxlbmd0aCA+IDAgJiYgeyB0YWdzIH0pLFxuICAgICAgLy8gQWRkIGRlcGVuZHNfb24gZm9yIGV4cGxpY2l0IGRlcGVuZGVuY2llcyBhbmQgcGFyZW50IHJlc291cmNlXG4gICAgICAuLi4oY29tYmluZWREZXBlbmRzT24ubGVuZ3RoID4gMCAmJiB7IGRlcGVuZHNPbjogY29tYmluZWREZXBlbmRzT24gfSksXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSB0aGUgQVpBUEkgcmVzb3VyY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBwcm92aWRlciBjbGFzc1xuICAgIHJldHVybiBuZXcgUmVzb3VyY2UodGhpcywgXCJyZXNvdXJjZVwiLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQVpBUEkgZGF0YSBzb3VyY2UgZm9yIHJlYWRpbmcgZXhpc3RpbmcgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZUlkIC0gVGhlIGZ1bGwgcmVzb3VyY2UgSURcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgVGVycmFmb3JtIGRhdGEgc291cmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQXphcGlEYXRhU291cmNlKFxuICAgIHJlc291cmNlSWQ6IHN0cmluZyxcbiAgKTogY2RrdGYuVGVycmFmb3JtRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1EYXRhU291cmNlKHRoaXMsIFwiZGF0YVwiLCB7XG4gICAgICB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwiYXphcGlfcmVzb3VyY2VcIixcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogXCJhemFwaVwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGRhdGFTb3VyY2UuYWRkT3ZlcnJpZGUoXCJ0eXBlXCIsIHRoaXMuX3Jlc291cmNlVHlwZSk7XG4gICAgZGF0YVNvdXJjZS5hZGRPdmVycmlkZShcInJlc291cmNlX2lkXCIsIHJlc291cmNlSWQpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcmVzb3VyY2Ugd2l0aCBuZXcgcHJvcGVydGllc1xuICAgKlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIFRoZSBuZXcgcHJvcGVydGllcyB0byBhcHBseVxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUF6YXBpUmVzb3VyY2UocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGlmICh0aGlzLnRlcnJhZm9ybVJlc291cmNlKSB7XG4gICAgICB0aGlzLnRlcnJhZm9ybVJlc291cmNlLmFkZE92ZXJyaWRlKFwiYm9keVwiLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZnVsbCByZXNvdXJjZSBJRFxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVycmFmb3JtUmVzb3VyY2U/LmZxbiB8fCB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgVGVycmFmb3JtIHJlc291cmNlIGZvciB1c2UgaW4gZGVwZW5kZW5jeSBkZWNsYXJhdGlvbnNcbiAgICogVGhpcyBhbGxvd3MgZXhwbGljaXQgZGVwZW5kZW5jeSBtYW5hZ2VtZW50IGJldHdlZW4gcmVzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlKCk6IGNka3RmLlRlcnJhZm9ybVJlc291cmNlIHtcbiAgICByZXR1cm4gdGhpcy50ZXJyYWZvcm1SZXNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZXNvdXJjZSBhcyBhIFRlcnJhZm9ybSBvdXRwdXQgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgb3V0cHV0KCk6IGNka3RmLlRlcnJhZm9ybU91dHB1dCB7XG4gICAgcmV0dXJuIG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJvdXRwdXRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMudGVycmFmb3JtUmVzb3VyY2U/LmZxbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGFjY2VzcyByb2xlIGFzc2lnbm1lbnQgZm9yIGEgc3BlY2lmaWVkIEF6dXJlIEFEIG9iamVjdFxuICAgKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBjcmVhdGVzIHJvbGUgYXNzaWdubWVudHMgdXNpbmcgQVpBUEkgaW5zdGVhZCBvZiBBenVyZVJNIHByb3ZpZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gb2JqZWN0SWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIEF6dXJlIEFEIG9iamVjdFxuICAgKiBAcGFyYW0gcm9sZURlZmluaXRpb25OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIEF6dXJlIFJCQUMgcm9sZSB0byBiZSBhc3NpZ25lZFxuICAgKi9cbiAgcHVibGljIGFkZEFjY2VzcyhvYmplY3RJZDogc3RyaW5nLCByb2xlRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIG5ldyBBemFwaVJvbGVBc3NpZ25tZW50KHRoaXMsIGByYmFjLSR7b2JqZWN0SWR9LSR7cm9sZURlZmluaXRpb25OYW1lfWAsIHtcbiAgICAgIG9iamVjdElkOiBvYmplY3RJZCxcbiAgICAgIHJvbGVEZWZpbml0aW9uTmFtZTogcm9sZURlZmluaXRpb25OYW1lLFxuICAgICAgc2NvcGU6IHRoaXMucmVzb3VyY2VJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdGFnIHRvIHRoaXMgcmVzb3VyY2UuIFRoZSB0YWcgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgQXp1cmUgcmVzb3VyY2UuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHByb3BlciBpbW11dGFiaWxpdHkgYnkgc3RvcmluZyB0YWdzIHNlcGFyYXRlbHkgZnJvbSBwcm9wcy5cbiAgICogVGFncyBhZGRlZCB2aWEgdGhpcyBtZXRob2QgYXJlIGNvbWJpbmVkIHdpdGggdGFncyBmcm9tIHByb3BzIGFuZCBpbmNsdWRlZCBpblxuICAgKiB0aGUgZGVwbG95ZWQgQXp1cmUgcmVzb3VyY2UuXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIEluIENESyBmb3IgVGVycmFmb3JtLCB0YWdzIHNob3VsZCBpZGVhbGx5IGJlIHNldCBkdXJpbmcgcmVzb3VyY2VcbiAgICogY29uc3RydWN0aW9uIHZpYSBwcm9wcy4gV2hpbGUgdGhpcyBtZXRob2QgYWxsb3dzIGFkZGluZyB0YWdzIGFmdGVyIGNvbnN0cnVjdGlvbixcbiAgICogdGhvc2UgdGFncyBhcmUgb25seSBpbmNsdWRlZCBpZiBhZGRlZCBiZWZvcmUgdGhlIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uIGlzXG4gICAqIHN5bnRoZXNpemVkLiBGb3IgYmVzdCByZXN1bHRzLCBhZGQgYWxsIHRhZ3MgdmlhIHByb3BzIG9yIGNhbGwgYWRkVGFnKCkgaW4gdGhlXG4gICAqIHNhbWUgc2NvcGUgd2hlcmUgdGhlIHJlc291cmNlIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgdGFnIGtleVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdGFnIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgYWRkVGFnKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdGFnc1trZXldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWxsIHRhZ3Mgb24gdGhpcyByZXNvdXJjZSAocmVhZG9ubHkgdmlldylcbiAgICpcbiAgICogVGhpcyBnZXR0ZXIgcHJvdmlkZXMgY29udmVuaWVudCBhY2Nlc3MgdG8gYWxsIHRhZ3MgaW5jbHVkaW5nIHRob3NlIGZyb20gcHJvcHNcbiAgICogYW5kIHRob3NlIGFkZGVkIGR5bmFtaWNhbGx5IHZpYSBhZGRUYWcoKS4gUmV0dXJucyBhIGNvcHkgdG8gbWFpbnRhaW4gaW1tdXRhYmlsaXR5LlxuICAgKi9cbiAgcHVibGljIGdldCB0YWdzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3RhZ3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgbWV0aG9kIHRvIHJldHJpZXZlIGFsbCB0YWdzIGZvciB1c2UgaW4gY3JlYXRlUmVzb3VyY2VCb2R5IGltcGxlbWVudGF0aW9uc1xuICAgKlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbiBjcmVhdGluZyByZXNvdXJjZSBib2RpZXMgdG8gZW5zdXJlXG4gICAqIGFsbCB0YWdzIChmcm9tIHByb3BzIGFuZCBhZGRUYWcoKSkgYXJlIGluY2x1ZGVkIGluIHRoZSBBenVyZSByZXNvdXJjZS5cbiAgICogVXNlcyBhIG5vbi1nZXR0ZXIgbmFtZSB0byBhdm9pZCBKU0lJIGNvbmZsaWN0cyB3aXRoIHRoZSB0YWdzIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhbGwgdGFnc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFsbFRhZ3MoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fdGFncyB9O1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVIgQ0xBU1NFUyBBTkQgSU5URVJGQUNFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBBWkFQSSByb2xlIGFzc2lnbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBemFwaVJvbGVBc3NpZ25tZW50UHJvcHMge1xuICByZWFkb25seSBvYmplY3RJZDogc3RyaW5nO1xuICByZWFkb25seSByb2xlRGVmaW5pdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBWkFQSS1iYXNlZCByb2xlIGFzc2lnbm1lbnQgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBBemFwaVJvbGVBc3NpZ25tZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEF6YXBpUm9sZUFzc2lnbm1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgcHJpbmNpcGFsSWQ6IHByb3BzLm9iamVjdElkLFxuICAgICAgcm9sZURlZmluaXRpb25JZDogYFtzdWJzY3JpcHRpb25SZXNvdXJjZUlkKCdNaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMnLCByb2xlRGVmaW5pdGlvbklkKCcke3Byb3BzLnJvbGVEZWZpbml0aW9uTmFtZX0nKSldYCxcbiAgICAgIHNjb3BlOiBwcm9wcy5zY29wZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29uZmlnOiBSZXNvdXJjZUNvbmZpZyA9IHtcbiAgICAgIHR5cGU6IFwiTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcm9sZUFzc2lnbm1lbnRzXCIsXG4gICAgICBuYW1lOiBcIltndWlkKCldXCIsXG4gICAgICBwYXJlbnRJZDogcHJvcHMuc2NvcGUsXG4gICAgICBib2R5OiBwcm9wZXJ0aWVzLFxuICAgIH07XG4gICAgbmV3IFJlc291cmNlKHRoaXMsIFwicm9sZS1hc3NpZ25tZW50XCIsIGNvbmZpZyk7XG4gIH1cbn1cbiJdfQ==
|