@cdktf/provider-google
Version:
Prebuilt google Provider for Terraform CDK (cdktf)
494 lines • 73 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataGoogleContainerCluster = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
// generated from terraform resource schema
const index_structs_1 = require("./index-structs");
__exportStar(require("./index-structs"), exports);
const cdktf = require("cdktf");
/**
* Represents a {@link https://registry.terraform.io/providers/hashicorp/google/6.4.0/docs/data-sources/container_cluster google_container_cluster}
*/
class DataGoogleContainerCluster extends cdktf.TerraformDataSource {
// ==============
// STATIC Methods
// ==============
/**
* Generates CDKTF code for importing a DataGoogleContainerCluster resource upon running "cdktf plan <stack-name>"
* @param scope The scope in which to define this construct
* @param importToId The construct id used in the generated config for the DataGoogleContainerCluster to import
* @param importFromId The id of the existing DataGoogleContainerCluster that should be imported. Refer to the {@link https://registry.terraform.io/providers/hashicorp/google/6.4.0/docs/data-sources/container_cluster#import import section} in the documentation of this resource for the id to use
* @param provider? Optional instance of the provider where the DataGoogleContainerCluster to import is found
*/
static generateConfigForImport(scope, importToId, importFromId, provider) {
return new cdktf.ImportableResource(scope, importToId, { terraformResourceType: "google_container_cluster", importId: importFromId, provider });
}
// ===========
// INITIALIZER
// ===========
/**
* Create a new {@link https://registry.terraform.io/providers/hashicorp/google/6.4.0/docs/data-sources/container_cluster google_container_cluster} Data Source
*
* @param scope The scope in which to define this construct
* @param id The scoped construct ID. Must be unique amongst siblings in the same scope
* @param options DataGoogleContainerClusterConfig
*/
constructor(scope, id, config) {
super(scope, id, {
terraformResourceType: 'google_container_cluster',
terraformGeneratorMetadata: {
providerName: 'google',
providerVersion: '6.4.0',
providerVersionConstraint: '~> 6.0'
},
provider: config.provider,
dependsOn: config.dependsOn,
count: config.count,
lifecycle: config.lifecycle,
provisioners: config.provisioners,
connection: config.connection,
forEach: config.forEach
});
// ==========
// ATTRIBUTES
// ==========
// addons_config - computed: true, optional: false, required: false
this._addonsConfig = new index_structs_1.DataGoogleContainerClusterAddonsConfigList(this, "addons_config", false);
// authenticator_groups_config - computed: true, optional: false, required: false
this._authenticatorGroupsConfig = new index_structs_1.DataGoogleContainerClusterAuthenticatorGroupsConfigList(this, "authenticator_groups_config", false);
// binary_authorization - computed: true, optional: false, required: false
this._binaryAuthorization = new index_structs_1.DataGoogleContainerClusterBinaryAuthorizationList(this, "binary_authorization", false);
// cluster_autoscaling - computed: true, optional: false, required: false
this._clusterAutoscaling = new index_structs_1.DataGoogleContainerClusterClusterAutoscalingList(this, "cluster_autoscaling", false);
// confidential_nodes - computed: true, optional: false, required: false
this._confidentialNodes = new index_structs_1.DataGoogleContainerClusterConfidentialNodesList(this, "confidential_nodes", false);
// cost_management_config - computed: true, optional: false, required: false
this._costManagementConfig = new index_structs_1.DataGoogleContainerClusterCostManagementConfigList(this, "cost_management_config", false);
// database_encryption - computed: true, optional: false, required: false
this._databaseEncryption = new index_structs_1.DataGoogleContainerClusterDatabaseEncryptionList(this, "database_encryption", false);
// default_snat_status - computed: true, optional: false, required: false
this._defaultSnatStatus = new index_structs_1.DataGoogleContainerClusterDefaultSnatStatusList(this, "default_snat_status", false);
// dns_config - computed: true, optional: false, required: false
this._dnsConfig = new index_structs_1.DataGoogleContainerClusterDnsConfigList(this, "dns_config", false);
// effective_labels - computed: true, optional: false, required: false
this._effectiveLabels = new cdktf.StringMap(this, "effective_labels");
// enable_k8s_beta_apis - computed: true, optional: false, required: false
this._enableK8SBetaApis = new index_structs_1.DataGoogleContainerClusterEnableK8SBetaApisList(this, "enable_k8s_beta_apis", false);
// fleet - computed: true, optional: false, required: false
this._fleet = new index_structs_1.DataGoogleContainerClusterFleetList(this, "fleet", false);
// gateway_api_config - computed: true, optional: false, required: false
this._gatewayApiConfig = new index_structs_1.DataGoogleContainerClusterGatewayApiConfigList(this, "gateway_api_config", false);
// identity_service_config - computed: true, optional: false, required: false
this._identityServiceConfig = new index_structs_1.DataGoogleContainerClusterIdentityServiceConfigList(this, "identity_service_config", false);
// ip_allocation_policy - computed: true, optional: false, required: false
this._ipAllocationPolicy = new index_structs_1.DataGoogleContainerClusterIpAllocationPolicyList(this, "ip_allocation_policy", false);
// logging_config - computed: true, optional: false, required: false
this._loggingConfig = new index_structs_1.DataGoogleContainerClusterLoggingConfigList(this, "logging_config", false);
// maintenance_policy - computed: true, optional: false, required: false
this._maintenancePolicy = new index_structs_1.DataGoogleContainerClusterMaintenancePolicyList(this, "maintenance_policy", false);
// master_auth - computed: true, optional: false, required: false
this._masterAuth = new index_structs_1.DataGoogleContainerClusterMasterAuthList(this, "master_auth", false);
// master_authorized_networks_config - computed: true, optional: false, required: false
this._masterAuthorizedNetworksConfig = new index_structs_1.DataGoogleContainerClusterMasterAuthorizedNetworksConfigList(this, "master_authorized_networks_config", false);
// mesh_certificates - computed: true, optional: false, required: false
this._meshCertificates = new index_structs_1.DataGoogleContainerClusterMeshCertificatesList(this, "mesh_certificates", false);
// monitoring_config - computed: true, optional: false, required: false
this._monitoringConfig = new index_structs_1.DataGoogleContainerClusterMonitoringConfigList(this, "monitoring_config", false);
// network_policy - computed: true, optional: false, required: false
this._networkPolicy = new index_structs_1.DataGoogleContainerClusterNetworkPolicyList(this, "network_policy", false);
// node_config - computed: true, optional: false, required: false
this._nodeConfig = new index_structs_1.DataGoogleContainerClusterNodeConfigList(this, "node_config", false);
// node_pool - computed: true, optional: false, required: false
this._nodePool = new index_structs_1.DataGoogleContainerClusterNodePoolList(this, "node_pool", false);
// node_pool_auto_config - computed: true, optional: false, required: false
this._nodePoolAutoConfig = new index_structs_1.DataGoogleContainerClusterNodePoolAutoConfigList(this, "node_pool_auto_config", false);
// node_pool_defaults - computed: true, optional: false, required: false
this._nodePoolDefaults = new index_structs_1.DataGoogleContainerClusterNodePoolDefaultsList(this, "node_pool_defaults", false);
// notification_config - computed: true, optional: false, required: false
this._notificationConfig = new index_structs_1.DataGoogleContainerClusterNotificationConfigList(this, "notification_config", false);
// private_cluster_config - computed: true, optional: false, required: false
this._privateClusterConfig = new index_structs_1.DataGoogleContainerClusterPrivateClusterConfigList(this, "private_cluster_config", false);
// release_channel - computed: true, optional: false, required: false
this._releaseChannel = new index_structs_1.DataGoogleContainerClusterReleaseChannelList(this, "release_channel", false);
// resource_labels - computed: true, optional: false, required: false
this._resourceLabels = new cdktf.StringMap(this, "resource_labels");
// resource_usage_export_config - computed: true, optional: false, required: false
this._resourceUsageExportConfig = new index_structs_1.DataGoogleContainerClusterResourceUsageExportConfigList(this, "resource_usage_export_config", false);
// secret_manager_config - computed: true, optional: false, required: false
this._secretManagerConfig = new index_structs_1.DataGoogleContainerClusterSecretManagerConfigList(this, "secret_manager_config", false);
// security_posture_config - computed: true, optional: false, required: false
this._securityPostureConfig = new index_structs_1.DataGoogleContainerClusterSecurityPostureConfigList(this, "security_posture_config", false);
// service_external_ips_config - computed: true, optional: false, required: false
this._serviceExternalIpsConfig = new index_structs_1.DataGoogleContainerClusterServiceExternalIpsConfigList(this, "service_external_ips_config", false);
// terraform_labels - computed: true, optional: false, required: false
this._terraformLabels = new cdktf.StringMap(this, "terraform_labels");
// vertical_pod_autoscaling - computed: true, optional: false, required: false
this._verticalPodAutoscaling = new index_structs_1.DataGoogleContainerClusterVerticalPodAutoscalingList(this, "vertical_pod_autoscaling", false);
// workload_identity_config - computed: true, optional: false, required: false
this._workloadIdentityConfig = new index_structs_1.DataGoogleContainerClusterWorkloadIdentityConfigList(this, "workload_identity_config", false);
this._id = config.id;
this._location = config.location;
this._name = config.name;
this._project = config.project;
}
get addonsConfig() {
return this._addonsConfig;
}
// allow_net_admin - computed: true, optional: false, required: false
get allowNetAdmin() {
return this.getBooleanAttribute('allow_net_admin');
}
get authenticatorGroupsConfig() {
return this._authenticatorGroupsConfig;
}
get binaryAuthorization() {
return this._binaryAuthorization;
}
get clusterAutoscaling() {
return this._clusterAutoscaling;
}
// cluster_ipv4_cidr - computed: true, optional: false, required: false
get clusterIpv4Cidr() {
return this.getStringAttribute('cluster_ipv4_cidr');
}
get confidentialNodes() {
return this._confidentialNodes;
}
get costManagementConfig() {
return this._costManagementConfig;
}
get databaseEncryption() {
return this._databaseEncryption;
}
// datapath_provider - computed: true, optional: false, required: false
get datapathProvider() {
return this.getStringAttribute('datapath_provider');
}
// default_max_pods_per_node - computed: true, optional: false, required: false
get defaultMaxPodsPerNode() {
return this.getNumberAttribute('default_max_pods_per_node');
}
get defaultSnatStatus() {
return this._defaultSnatStatus;
}
// deletion_protection - computed: true, optional: false, required: false
get deletionProtection() {
return this.getBooleanAttribute('deletion_protection');
}
// description - computed: true, optional: false, required: false
get description() {
return this.getStringAttribute('description');
}
get dnsConfig() {
return this._dnsConfig;
}
get effectiveLabels() {
return this._effectiveLabels;
}
// enable_autopilot - computed: true, optional: false, required: false
get enableAutopilot() {
return this.getBooleanAttribute('enable_autopilot');
}
// enable_cilium_clusterwide_network_policy - computed: true, optional: false, required: false
get enableCiliumClusterwideNetworkPolicy() {
return this.getBooleanAttribute('enable_cilium_clusterwide_network_policy');
}
// enable_intranode_visibility - computed: true, optional: false, required: false
get enableIntranodeVisibility() {
return this.getBooleanAttribute('enable_intranode_visibility');
}
get enableK8SBetaApis() {
return this._enableK8SBetaApis;
}
// enable_kubernetes_alpha - computed: true, optional: false, required: false
get enableKubernetesAlpha() {
return this.getBooleanAttribute('enable_kubernetes_alpha');
}
// enable_l4_ilb_subsetting - computed: true, optional: false, required: false
get enableL4IlbSubsetting() {
return this.getBooleanAttribute('enable_l4_ilb_subsetting');
}
// enable_legacy_abac - computed: true, optional: false, required: false
get enableLegacyAbac() {
return this.getBooleanAttribute('enable_legacy_abac');
}
// enable_multi_networking - computed: true, optional: false, required: false
get enableMultiNetworking() {
return this.getBooleanAttribute('enable_multi_networking');
}
// enable_shielded_nodes - computed: true, optional: false, required: false
get enableShieldedNodes() {
return this.getBooleanAttribute('enable_shielded_nodes');
}
// enable_tpu - computed: true, optional: false, required: false
get enableTpu() {
return this.getBooleanAttribute('enable_tpu');
}
// endpoint - computed: true, optional: false, required: false
get endpoint() {
return this.getStringAttribute('endpoint');
}
get fleet() {
return this._fleet;
}
get gatewayApiConfig() {
return this._gatewayApiConfig;
}
get id() {
return this.getStringAttribute('id');
}
set id(value) {
this._id = value;
}
resetId() {
this._id = undefined;
}
// Temporarily expose input value. Use with caution.
get idInput() {
return this._id;
}
get identityServiceConfig() {
return this._identityServiceConfig;
}
// initial_node_count - computed: true, optional: false, required: false
get initialNodeCount() {
return this.getNumberAttribute('initial_node_count');
}
get ipAllocationPolicy() {
return this._ipAllocationPolicy;
}
// label_fingerprint - computed: true, optional: false, required: false
get labelFingerprint() {
return this.getStringAttribute('label_fingerprint');
}
get location() {
return this.getStringAttribute('location');
}
set location(value) {
this._location = value;
}
resetLocation() {
this._location = undefined;
}
// Temporarily expose input value. Use with caution.
get locationInput() {
return this._location;
}
get loggingConfig() {
return this._loggingConfig;
}
// logging_service - computed: true, optional: false, required: false
get loggingService() {
return this.getStringAttribute('logging_service');
}
get maintenancePolicy() {
return this._maintenancePolicy;
}
get masterAuth() {
return this._masterAuth;
}
get masterAuthorizedNetworksConfig() {
return this._masterAuthorizedNetworksConfig;
}
// master_version - computed: true, optional: false, required: false
get masterVersion() {
return this.getStringAttribute('master_version');
}
get meshCertificates() {
return this._meshCertificates;
}
// min_master_version - computed: true, optional: false, required: false
get minMasterVersion() {
return this.getStringAttribute('min_master_version');
}
get monitoringConfig() {
return this._monitoringConfig;
}
// monitoring_service - computed: true, optional: false, required: false
get monitoringService() {
return this.getStringAttribute('monitoring_service');
}
get name() {
return this.getStringAttribute('name');
}
set name(value) {
this._name = value;
}
// Temporarily expose input value. Use with caution.
get nameInput() {
return this._name;
}
// network - computed: true, optional: false, required: false
get network() {
return this.getStringAttribute('network');
}
get networkPolicy() {
return this._networkPolicy;
}
// networking_mode - computed: true, optional: false, required: false
get networkingMode() {
return this.getStringAttribute('networking_mode');
}
get nodeConfig() {
return this._nodeConfig;
}
// node_locations - computed: true, optional: false, required: false
get nodeLocations() {
return cdktf.Fn.tolist(this.getListAttribute('node_locations'));
}
get nodePool() {
return this._nodePool;
}
get nodePoolAutoConfig() {
return this._nodePoolAutoConfig;
}
get nodePoolDefaults() {
return this._nodePoolDefaults;
}
// node_version - computed: true, optional: false, required: false
get nodeVersion() {
return this.getStringAttribute('node_version');
}
get notificationConfig() {
return this._notificationConfig;
}
// operation - computed: true, optional: false, required: false
get operation() {
return this.getStringAttribute('operation');
}
get privateClusterConfig() {
return this._privateClusterConfig;
}
// private_ipv6_google_access - computed: true, optional: false, required: false
get privateIpv6GoogleAccess() {
return this.getStringAttribute('private_ipv6_google_access');
}
get project() {
return this.getStringAttribute('project');
}
set project(value) {
this._project = value;
}
resetProject() {
this._project = undefined;
}
// Temporarily expose input value. Use with caution.
get projectInput() {
return this._project;
}
get releaseChannel() {
return this._releaseChannel;
}
// remove_default_node_pool - computed: true, optional: false, required: false
get removeDefaultNodePool() {
return this.getBooleanAttribute('remove_default_node_pool');
}
get resourceLabels() {
return this._resourceLabels;
}
get resourceUsageExportConfig() {
return this._resourceUsageExportConfig;
}
get secretManagerConfig() {
return this._secretManagerConfig;
}
get securityPostureConfig() {
return this._securityPostureConfig;
}
// self_link - computed: true, optional: false, required: false
get selfLink() {
return this.getStringAttribute('self_link');
}
get serviceExternalIpsConfig() {
return this._serviceExternalIpsConfig;
}
// services_ipv4_cidr - computed: true, optional: false, required: false
get servicesIpv4Cidr() {
return this.getStringAttribute('services_ipv4_cidr');
}
// subnetwork - computed: true, optional: false, required: false
get subnetwork() {
return this.getStringAttribute('subnetwork');
}
get terraformLabels() {
return this._terraformLabels;
}
// tpu_ipv4_cidr_block - computed: true, optional: false, required: false
get tpuIpv4CidrBlock() {
return this.getStringAttribute('tpu_ipv4_cidr_block');
}
get verticalPodAutoscaling() {
return this._verticalPodAutoscaling;
}
get workloadIdentityConfig() {
return this._workloadIdentityConfig;
}
// =========
// SYNTHESIS
// =========
synthesizeAttributes() {
return {
id: cdktf.stringToTerraform(this._id),
location: cdktf.stringToTerraform(this._location),
name: cdktf.stringToTerraform(this._name),
project: cdktf.stringToTerraform(this._project),
};
}
synthesizeHclAttributes() {
const attrs = {
id: {
value: cdktf.stringToHclTerraform(this._id),
isBlock: false,
type: "simple",
storageClassType: "string",
},
location: {
value: cdktf.stringToHclTerraform(this._location),
isBlock: false,
type: "simple",
storageClassType: "string",
},
name: {
value: cdktf.stringToHclTerraform(this._name),
isBlock: false,
type: "simple",
storageClassType: "string",
},
project: {
value: cdktf.stringToHclTerraform(this._project),
isBlock: false,
type: "simple",
storageClassType: "string",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
}
exports.DataGoogleContainerCluster = DataGoogleContainerCluster;
_a = JSII_RTTI_SYMBOL_1;
DataGoogleContainerCluster[_a] = { fqn: "@cdktf/provider-google.dataGoogleContainerCluster.DataGoogleContainerCluster", version: "14.3.0" };
// =================
// STATIC PROPERTIES
// =================
DataGoogleContainerCluster.tfResourceType = "google_container_cluster";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS1nb29nbGUtY29udGFpbmVyLWNsdXN0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7R0FHRztBQUVILDJDQUEyQztBQUUzQyxtREFpQzRFO0FBQzVFLGtEQUErQjtBQUUvQiwrQkFBK0I7QUE2Qi9COztFQUVFO0FBQ0YsTUFBYSwwQkFBMkIsU0FBUSxLQUFLLENBQUMsbUJBQW1CO0lBT3ZFLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCOzs7Ozs7TUFNRTtJQUNLLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFnQixFQUFFLFVBQWtCLEVBQUUsWUFBb0IsRUFBRSxRQUFrQztRQUM5SCxPQUFPLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSwwQkFBMEIsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDbEosQ0FBQztJQUVMLGNBQWM7SUFDZCxjQUFjO0lBQ2QsY0FBYztJQUVkOzs7Ozs7TUFNRTtJQUNGLFlBQW1CLEtBQWdCLEVBQUUsRUFBVSxFQUFFLE1BQXdDO1FBQ3ZGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YscUJBQXFCLEVBQUUsMEJBQTBCO1lBQ2pELDBCQUEwQixFQUFFO2dCQUMxQixZQUFZLEVBQUUsUUFBUTtnQkFDdEIsZUFBZSxFQUFFLE9BQU87Z0JBQ3hCLHlCQUF5QixFQUFFLFFBQVE7YUFDcEM7WUFDRCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsWUFBWSxFQUFF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SCxDQUFDOztBQXJpQkgsZ0VBc2lCQzs7O0FBcGlCQyxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNHLHlDQUFjLEdBQUcsMEJBQTBCLEFBQTdCLENBQThCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG4vLyBnZW5lcmF0ZWQgZnJvbSB0ZXJyYWZvcm0gcmVzb3VyY2Ugc2NoZW1hXG5cbmltcG9ydCB7IERhdGFHb29nbGVDb250YWluZXJDbHVzdGVyQWRkb25zQ29uZmlnTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlckF1dGhlbnRpY2F0b3JHcm91cHNDb25maWdMaXN0LCBcbkRhdGFHb29nbGVDb250YWluZXJDbHVzdGVyQmluYXJ5QXV0aG9yaXphdGlvbkxpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJDbHVzdGVyQXV0b3NjYWxpbmdMaXN0LCBcbkRhdGFHb29nbGVDb250YWluZXJDbHVzdGVyQ29uZmlkZW50aWFsTm9kZXNMaXN0LCBcbkRhdGFHb29nbGVDb250YWluZXJDbHVzdGVyQ29zdE1hbmFnZW1lbnRDb25maWdMaXN0LCBcbkRhdGFHb29nbGVDb250YWluZXJDbHVzdGVyRGF0YWJhc2VFbmNyeXB0aW9uTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlckRlZmF1bHRTbmF0U3RhdHVzTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlckRuc0NvbmZpZ0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJFbmFibGVLOFNCZXRhQXBpc0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJGbGVldExpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJHYXRld2F5QXBpQ29uZmlnTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlcklkZW50aXR5U2VydmljZUNvbmZpZ0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJJcEFsbG9jYXRpb25Qb2xpY3lMaXN0LCBcbkRhdGFHb29nbGVDb250YWluZXJDbHVzdGVyTG9nZ2luZ0NvbmZpZ0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJNYWludGVuYW5jZVBvbGljeUxpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJNYXN0ZXJBdXRoTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck1hc3RlckF1dGhvcml6ZWROZXR3b3Jrc0NvbmZpZ0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJNZXNoQ2VydGlmaWNhdGVzTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck1vbml0b3JpbmdDb25maWdMaXN0LCBcbkRhdGFHb29nbGVDb250YWluZXJDbHVzdGVyTmV0d29ya1BvbGljeUxpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJOb2RlQ29uZmlnTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck5vZGVQb29sTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck5vZGVQb29sQXV0b0NvbmZpZ0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJOb2RlUG9vbERlZmF1bHRzTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck5vdGlmaWNhdGlvbkNvbmZpZ0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJQcml2YXRlQ2x1c3RlckNvbmZpZ0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJSZWxlYXNlQ2hhbm5lbExpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJSZXNvdXJjZVVzYWdlRXhwb3J0Q29uZmlnTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlclNlY3JldE1hbmFnZXJDb25maWdMaXN0LCBcbkRhdGFHb29nbGVDb250YWluZXJDbHVzdGVyU2VjdXJpdHlQb3N0dXJlQ29uZmlnTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlclNlcnZpY2VFeHRlcm5hbElwc0NvbmZpZ0xpc3QsIFxuRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJWZXJ0aWNhbFBvZEF1dG9zY2FsaW5nTGlzdCwgXG5EYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlcldvcmtsb2FkSWRlbnRpdHlDb25maWdMaXN0fSBmcm9tICcuL2luZGV4LXN0cnVjdHMnXG5leHBvcnQgKiBmcm9tICcuL2luZGV4LXN0cnVjdHMnXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNka3RmIGZyb20gJ2Nka3RmJztcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJDb25maWcgZXh0ZW5kcyBjZGt0Zi5UZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL2RhdGEtc291cmNlcy9jb250YWluZXJfY2x1c3RlciNpZCBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlciNpZH1cbiAgKlxuICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoZSBpZCBmaWVsZCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCByZXNvdXJjZXMgaW4gVGVycmFmb3JtIHByb3ZpZGVycyB1c2luZyBhIFRlcnJhZm9ybSBwcm92aWRlciBTREsgdmVyc2lvbiBiZWxvdyAyLlxuICAqIElmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHNldHRpbmcgdGhpcyB2YWx1ZSBpdCBtaWdodCBub3QgYmUgc2V0dGFibGUuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCB0aGUgcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiB0byBlbnN1cmUgaXQgc2hvdWxkIGJlIHNldHRhYmxlLlxuICAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgLyoqXG4gICogVGhlIGxvY2F0aW9uIChyZWdpb24gb3Igem9uZSkgaW4gd2hpY2ggdGhlIGNsdXN0ZXIgbWFzdGVyIHdpbGwgYmUgY3JlYXRlZCwgYXMgd2VsbCBhcyB0aGUgZGVmYXVsdCBub2RlIGxvY2F0aW9uLiBJZiB5b3Ugc3BlY2lmeSBhIHpvbmUgKHN1Y2ggYXMgdXMtY2VudHJhbDEtYSksIHRoZSBjbHVzdGVyIHdpbGwgYmUgYSB6b25hbCBjbHVzdGVyIHdpdGggYSBzaW5nbGUgY2x1c3RlciBtYXN0ZXIuIElmIHlvdSBzcGVjaWZ5IGEgcmVnaW9uIChzdWNoIGFzIHVzLXdlc3QxKSwgdGhlIGNsdXN0ZXIgd2lsbCBiZSBhIHJlZ2lvbmFsIGNsdXN0ZXIgd2l0aCBtdWx0aXBsZSBtYXN0ZXJzIHNwcmVhZCBhY3Jvc3Mgem9uZXMgaW4gdGhlIHJlZ2lvbiwgYW5kIHdpdGggZGVmYXVsdCBub2RlIGxvY2F0aW9ucyBpbiB0aG9zZSB6b25lcyBhcyB3ZWxsLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL2RhdGEtc291cmNlcy9jb250YWluZXJfY2x1c3RlciNsb2NhdGlvbiBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlciNsb2NhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgbG9jYXRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSBuYW1lIG9mIHRoZSBjbHVzdGVyLCB1bmlxdWUgd2l0aGluIHRoZSBwcm9qZWN0IGFuZCBsb2NhdGlvbi5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9kYXRhLXNvdXJjZXMvY29udGFpbmVyX2NsdXN0ZXIjbmFtZSBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlciNuYW1lfVxuICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSBJRCBvZiB0aGUgcHJvamVjdCBpbiB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCB0aGUgcHJvdmlkZXIgcHJvamVjdCBpcyB1c2VkLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL2RhdGEtc291cmNlcy9jb250YWluZXJfY2x1c3RlciNwcm9qZWN0IERhdGFHb29nbGVDb250YWluZXJDbHVzdGVyI3Byb2plY3R9XG4gICovXG4gIHJlYWRvbmx5IHByb2plY3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuKiBSZXByZXNlbnRzIGEge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvZGF0YS1zb3VyY2VzL2NvbnRhaW5lcl9jbHVzdGVyIGdvb2dsZV9jb250YWluZXJfY2x1c3Rlcn1cbiovXG5leHBvcnQgY2xhc3MgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXIgZXh0ZW5kcyBjZGt0Zi5UZXJyYWZvcm1EYXRhU291cmNlIHtcblxuICAvLyA9PT09PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PVxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRmUmVzb3VyY2VUeXBlID0gXCJnb29nbGVfY29udGFpbmVyX2NsdXN0ZXJcIjtcblxuICAvLyA9PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PVxuICAvKipcbiAgKiBHZW5lcmF0ZXMgQ0RLVEYgY29kZSBmb3IgaW1wb3J0aW5nIGEgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXIgcmVzb3VyY2UgdXBvbiBydW5uaW5nIFwiY2RrdGYgcGxhbiA8c3RhY2stbmFtZT5cIlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGltcG9ydFRvSWQgVGhlIGNvbnN0cnVjdCBpZCB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29uZmlnIGZvciB0aGUgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXIgdG8gaW1wb3J0XG4gICogQHBhcmFtIGltcG9ydEZyb21JZCBUaGUgaWQgb2YgdGhlIGV4aXN0aW5nIERhdGFHb29nbGVDb250YWluZXJDbHVzdGVyIHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvZGF0YS1zb3VyY2VzL2NvbnRhaW5lcl9jbHVzdGVyI2ltcG9ydCBpbXBvcnQgc2VjdGlvbn0gaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyByZXNvdXJjZSBmb3IgdGhlIGlkIHRvIHVzZVxuICAqIEBwYXJhbSBwcm92aWRlcj8gT3B0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdoZXJlIHRoZSBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlciB0byBpbXBvcnQgaXMgZm91bmRcbiAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RmLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdGYuSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCJnb29nbGVfY29udGFpbmVyX2NsdXN0ZXJcIiwgaW1wb3J0SWQ6IGltcG9ydEZyb21JZCwgcHJvdmlkZXIgfSk7XG4gICAgICB9XG5cbiAgLy8gPT09PT09PT09PT1cbiAgLy8gSU5JVElBTElaRVJcbiAgLy8gPT09PT09PT09PT1cblxuICAvKipcbiAgKiBDcmVhdGUgYSBuZXcge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvZGF0YS1zb3VyY2VzL2NvbnRhaW5lcl9jbHVzdGVyIGdvb2dsZV9jb250YWluZXJfY2x1c3Rlcn0gRGF0YSBTb3VyY2VcbiAgKlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlXG4gICogQHBhcmFtIG9wdGlvbnMgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJDb25maWdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHRlcnJhZm9ybVJlc291cmNlVHlwZTogJ2dvb2dsZV9jb250YWluZXJfY2x1c3RlcicsXG4gICAgICB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YToge1xuICAgICAgICBwcm92aWRlck5hbWU6ICdnb29nbGUnLFxuICAgICAgICBwcm92aWRlclZlcnNpb246ICc2LjQuMCcsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiA2LjAnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5fbG9jYXRpb24gPSBjb25maWcubG9jYXRpb247XG4gICAgdGhpcy5fbmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMuX3Byb2plY3QgPSBjb25maWcucHJvamVjdDtcbiAgfVxuXG4gIC8vID09PT09PT09PT1cbiAgLy8gQVRUUklCVVRFU1xuICAvLyA9PT09PT09PT09XG5cbiAgLy8gYWRkb25zX2NvbmZpZyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hZGRvbnNDb25maWcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJBZGRvbnNDb25maWdMaXN0KHRoaXMsIFwiYWRkb25zX2NvbmZpZ1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgYWRkb25zQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRvbnNDb25maWc7XG4gIH1cblxuICAvLyBhbGxvd19uZXRfYWRtaW4gLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBhbGxvd05ldEFkbWluKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2FsbG93X25ldF9hZG1pbicpO1xuICB9XG5cbiAgLy8gYXV0aGVudGljYXRvcl9ncm91cHNfY29uZmlnIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2F1dGhlbnRpY2F0b3JHcm91cHNDb25maWcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJBdXRoZW50aWNhdG9yR3JvdXBzQ29uZmlnTGlzdCh0aGlzLCBcImF1dGhlbnRpY2F0b3JfZ3JvdXBzX2NvbmZpZ1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgYXV0aGVudGljYXRvckdyb3Vwc0NvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRvckdyb3Vwc0NvbmZpZztcbiAgfVxuXG4gIC8vIGJpbmFyeV9hdXRob3JpemF0aW9uIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2JpbmFyeUF1dGhvcml6YXRpb24gPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJCaW5hcnlBdXRob3JpemF0aW9uTGlzdCh0aGlzLCBcImJpbmFyeV9hdXRob3JpemF0aW9uXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBiaW5hcnlBdXRob3JpemF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9iaW5hcnlBdXRob3JpemF0aW9uO1xuICB9XG5cbiAgLy8gY2x1c3Rlcl9hdXRvc2NhbGluZyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jbHVzdGVyQXV0b3NjYWxpbmcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJDbHVzdGVyQXV0b3NjYWxpbmdMaXN0KHRoaXMsIFwiY2x1c3Rlcl9hdXRvc2NhbGluZ1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgY2x1c3RlckF1dG9zY2FsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9jbHVzdGVyQXV0b3NjYWxpbmc7XG4gIH1cblxuICAvLyBjbHVzdGVyX2lwdjRfY2lkciAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGNsdXN0ZXJJcHY0Q2lkcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NsdXN0ZXJfaXB2NF9jaWRyJyk7XG4gIH1cblxuICAvLyBjb25maWRlbnRpYWxfbm9kZXMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29uZmlkZW50aWFsTm9kZXMgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJDb25maWRlbnRpYWxOb2Rlc0xpc3QodGhpcywgXCJjb25maWRlbnRpYWxfbm9kZXNcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGNvbmZpZGVudGlhbE5vZGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWRlbnRpYWxOb2RlcztcbiAgfVxuXG4gIC8vIGNvc3RfbWFuYWdlbWVudF9jb25maWcgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29zdE1hbmFnZW1lbnRDb25maWcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJDb3N0TWFuYWdlbWVudENvbmZpZ0xpc3QodGhpcywgXCJjb3N0X21hbmFnZW1lbnRfY29uZmlnXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBjb3N0TWFuYWdlbWVudENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29zdE1hbmFnZW1lbnRDb25maWc7XG4gIH1cblxuICAvLyBkYXRhYmFzZV9lbmNyeXB0aW9uIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2RhdGFiYXNlRW5jcnlwdGlvbiA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlckRhdGFiYXNlRW5jcnlwdGlvbkxpc3QodGhpcywgXCJkYXRhYmFzZV9lbmNyeXB0aW9uXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBkYXRhYmFzZUVuY3J5cHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlRW5jcnlwdGlvbjtcbiAgfVxuXG4gIC8vIGRhdGFwYXRoX3Byb3ZpZGVyIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZGF0YXBhdGhQcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2RhdGFwYXRoX3Byb3ZpZGVyJyk7XG4gIH1cblxuICAvLyBkZWZhdWx0X21heF9wb2RzX3Blcl9ub2RlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZGVmYXVsdE1heFBvZHNQZXJOb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZGVmYXVsdF9tYXhfcG9kc19wZXJfbm9kZScpO1xuICB9XG5cbiAgLy8gZGVmYXVsdF9zbmF0X3N0YXR1cyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZWZhdWx0U25hdFN0YXR1cyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlckRlZmF1bHRTbmF0U3RhdHVzTGlzdCh0aGlzLCBcImRlZmF1bHRfc25hdF9zdGF0dXNcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRTbmF0U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0U25hdFN0YXR1cztcbiAgfVxuXG4gIC8vIGRlbGV0aW9uX3Byb3RlY3Rpb24gLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBkZWxldGlvblByb3RlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZGVsZXRpb25fcHJvdGVjdGlvbicpO1xuICB9XG5cbiAgLy8gZGVzY3JpcHRpb24gLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2Rlc2NyaXB0aW9uJyk7XG4gIH1cblxuICAvLyBkbnNfY29uZmlnIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Ruc0NvbmZpZyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlckRuc0NvbmZpZ0xpc3QodGhpcywgXCJkbnNfY29uZmlnXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBkbnNDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Ruc0NvbmZpZztcbiAgfVxuXG4gIC8vIGVmZmVjdGl2ZV9sYWJlbHMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZWZmZWN0aXZlTGFiZWxzID0gbmV3IGNka3RmLlN0cmluZ01hcCh0aGlzLCBcImVmZmVjdGl2ZV9sYWJlbHNcIik7XG4gIHB1YmxpYyBnZXQgZWZmZWN0aXZlTGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9lZmZlY3RpdmVMYWJlbHM7XG4gIH1cblxuICAvLyBlbmFibGVfYXV0b3BpbG90IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZW5hYmxlQXV0b3BpbG90KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2VuYWJsZV9hdXRvcGlsb3QnKTtcbiAgfVxuXG4gIC8vIGVuYWJsZV9jaWxpdW1fY2x1c3RlcndpZGVfbmV0d29ya19wb2xpY3kgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBlbmFibGVDaWxpdW1DbHVzdGVyd2lkZU5ldHdvcmtQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZW5hYmxlX2NpbGl1bV9jbHVzdGVyd2lkZV9uZXR3b3JrX3BvbGljeScpO1xuICB9XG5cbiAgLy8gZW5hYmxlX2ludHJhbm9kZV92aXNpYmlsaXR5IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZW5hYmxlSW50cmFub2RlVmlzaWJpbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdlbmFibGVfaW50cmFub2RlX3Zpc2liaWxpdHknKTtcbiAgfVxuXG4gIC8vIGVuYWJsZV9rOHNfYmV0YV9hcGlzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2VuYWJsZUs4U0JldGFBcGlzID0gbmV3IERhdGFHb29nbGVDb250YWluZXJDbHVzdGVyRW5hYmxlSzhTQmV0YUFwaXNMaXN0KHRoaXMsIFwiZW5hYmxlX2s4c19iZXRhX2FwaXNcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGVuYWJsZUs4U0JldGFBcGlzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVLOFNCZXRhQXBpcztcbiAgfVxuXG4gIC8vIGVuYWJsZV9rdWJlcm5ldGVzX2FscGhhIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZW5hYmxlS3ViZXJuZXRlc0FscGhhKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2VuYWJsZV9rdWJlcm5ldGVzX2FscGhhJyk7XG4gIH1cblxuICAvLyBlbmFibGVfbDRfaWxiX3N1YnNldHRpbmcgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBlbmFibGVMNElsYlN1YnNldHRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZW5hYmxlX2w0X2lsYl9zdWJzZXR0aW5nJyk7XG4gIH1cblxuICAvLyBlbmFibGVfbGVnYWN5X2FiYWMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBlbmFibGVMZWdhY3lBYmFjKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2VuYWJsZV9sZWdhY3lfYWJhYycpO1xuICB9XG5cbiAgLy8gZW5hYmxlX211bHRpX25ldHdvcmtpbmcgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBlbmFibGVNdWx0aU5ldHdvcmtpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZW5hYmxlX211bHRpX25ldHdvcmtpbmcnKTtcbiAgfVxuXG4gIC8vIGVuYWJsZV9zaGllbGRlZF9ub2RlcyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGVuYWJsZVNoaWVsZGVkTm9kZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZW5hYmxlX3NoaWVsZGVkX25vZGVzJyk7XG4gIH1cblxuICAvLyBlbmFibGVfdHB1IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZW5hYmxlVHB1KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2VuYWJsZV90cHUnKTtcbiAgfVxuXG4gIC8vIGVuZHBvaW50IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdlbmRwb2ludCcpO1xuICB9XG5cbiAgLy8gZmxlZXQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZmxlZXQgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJGbGVldExpc3QodGhpcywgXCJmbGVldFwiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgZmxlZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZsZWV0O1xuICB9XG5cbiAgLy8gZ2F0ZXdheV9hcGlfY29uZmlnIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2dhdGV3YXlBcGlDb25maWcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJHYXRld2F5QXBpQ29uZmlnTGlzdCh0aGlzLCBcImdhdGV3YXlfYXBpX2NvbmZpZ1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgZ2F0ZXdheUFwaUNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2F0ZXdheUFwaUNvbmZpZztcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElkKCkge1xuICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIGlkZW50aXR5X3NlcnZpY2VfY29uZmlnIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2lkZW50aXR5U2VydmljZUNvbmZpZyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlcklkZW50aXR5U2VydmljZUNvbmZpZ0xpc3QodGhpcywgXCJpZGVudGl0eV9zZXJ2aWNlX2NvbmZpZ1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgaWRlbnRpdHlTZXJ2aWNlQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9pZGVudGl0eVNlcnZpY2VDb25maWc7XG4gIH1cblxuICAvLyBpbml0aWFsX25vZGVfY291bnQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBpbml0aWFsTm9kZUNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnaW5pdGlhbF9ub2RlX2NvdW50Jyk7XG4gIH1cblxuICAvLyBpcF9hbGxvY2F0aW9uX3BvbGljeSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pcEFsbG9jYXRpb25Qb2xpY3kgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJJcEFsbG9jYXRpb25Qb2xpY3lMaXN0KHRoaXMsIFwiaXBfYWxsb2NhdGlvbl9wb2xpY3lcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGlwQWxsb2NhdGlvblBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXBBbGxvY2F0aW9uUG9saWN5O1xuICB9XG5cbiAgLy8gbGFiZWxfZmluZ2VycHJpbnQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBsYWJlbEZpbmdlcnByaW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbGFiZWxfZmluZ2VycHJpbnQnKTtcbiAgfVxuXG4gIC8vIGxvY2F0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2xvY2F0aW9uPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2xvY2F0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBsb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9jYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRMb2NhdGlvbigpIHtcbiAgICB0aGlzLl9sb2NhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbG9jYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYXRpb247XG4gIH1cblxuICAvLyBsb2dnaW5nX2NvbmZpZyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9sb2dnaW5nQ29uZmlnID0gbmV3IERhdGFHb29nbGVDb250YWluZXJDbHVzdGVyTG9nZ2luZ0NvbmZpZ0xpc3QodGhpcywgXCJsb2dnaW5nX2NvbmZpZ1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgbG9nZ2luZ0NvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2luZ0NvbmZpZztcbiAgfVxuXG4gIC8vIGxvZ2dpbmdfc2VydmljZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGxvZ2dpbmdTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbG9nZ2luZ19zZXJ2aWNlJyk7XG4gIH1cblxuICAvLyBtYWludGVuYW5jZV9wb2xpY3kgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWFpbnRlbmFuY2VQb2xpY3kgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJNYWludGVuYW5jZVBvbGljeUxpc3QodGhpcywgXCJtYWludGVuYW5jZV9wb2xpY3lcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IG1haW50ZW5hbmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLl9tYWludGVuYW5jZVBvbGljeTtcbiAgfVxuXG4gIC8vIG1hc3Rlcl9hdXRoIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21hc3RlckF1dGggPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJNYXN0ZXJBdXRoTGlzdCh0aGlzLCBcIm1hc3Rlcl9hdXRoXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBtYXN0ZXJBdXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXN0ZXJBdXRoO1xuICB9XG5cbiAgLy8gbWFzdGVyX2F1dGhvcml6ZWRfbmV0d29ya3NfY29uZmlnIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21hc3RlckF1dGhvcml6ZWROZXR3b3Jrc0NvbmZpZyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck1hc3RlckF1dGhvcml6ZWROZXR3b3Jrc0NvbmZpZ0xpc3QodGhpcywgXCJtYXN0ZXJfYXV0aG9yaXplZF9uZXR3b3Jrc19jb25maWdcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IG1hc3RlckF1dGhvcml6ZWROZXR3b3Jrc0NvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFzdGVyQXV0aG9yaXplZE5ldHdvcmtzQ29uZmlnO1xuICB9XG5cbiAgLy8gbWFzdGVyX3ZlcnNpb24gLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBtYXN0ZXJWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbWFzdGVyX3ZlcnNpb24nKTtcbiAgfVxuXG4gIC8vIG1lc2hfY2VydGlmaWNhdGVzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21lc2hDZXJ0aWZpY2F0ZXMgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJNZXNoQ2VydGlmaWNhdGVzTGlzdCh0aGlzLCBcIm1lc2hfY2VydGlmaWNhdGVzXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBtZXNoQ2VydGlmaWNhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXNoQ2VydGlmaWNhdGVzO1xuICB9XG5cbiAgLy8gbWluX21hc3Rlcl92ZXJzaW9uIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgbWluTWFzdGVyVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21pbl9tYXN0ZXJfdmVyc2lvbicpO1xuICB9XG5cbiAgLy8gbW9uaXRvcmluZ19jb25maWcgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbW9uaXRvcmluZ0NvbmZpZyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck1vbml0b3JpbmdDb25maWdMaXN0KHRoaXMsIFwibW9uaXRvcmluZ19jb25maWdcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IG1vbml0b3JpbmdDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbml0b3JpbmdDb25maWc7XG4gIH1cblxuICAvLyBtb25pdG9yaW5nX3NlcnZpY2UgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBtb25pdG9yaW5nU2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21vbml0b3Jpbmdfc2VydmljZScpO1xuICB9XG5cbiAgLy8gbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBuYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvLyBuZXR3b3JrIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgbmV0d29yaygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ25ldHdvcmsnKTtcbiAgfVxuXG4gIC8vIG5ldHdvcmtfcG9saWN5IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX25ldHdvcmtQb2xpY3kgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJOZXR3b3JrUG9saWN5TGlzdCh0aGlzLCBcIm5ldHdvcmtfcG9saWN5XCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBuZXR3b3JrUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLl9uZXR3b3JrUG9saWN5O1xuICB9XG5cbiAgLy8gbmV0d29ya2luZ19tb2RlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgbmV0d29ya2luZ01vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCduZXR3b3JraW5nX21vZGUnKTtcbiAgfVxuXG4gIC8vIG5vZGVfY29uZmlnIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX25vZGVDb25maWcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJOb2RlQ29uZmlnTGlzdCh0aGlzLCBcIm5vZGVfY29uZmlnXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBub2RlQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9ub2RlQ29uZmlnO1xuICB9XG5cbiAgLy8gbm9kZV9sb2NhdGlvbnMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBub2RlTG9jYXRpb25zKCkge1xuICAgIHJldHVybiBjZGt0Zi5Gbi50b2xpc3QodGhpcy5nZXRMaXN0QXR0cmlidXRlKCdub2RlX2xvY2F0aW9ucycpKTtcbiAgfVxuXG4gIC8vIG5vZGVfcG9vbCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9ub2RlUG9vbCA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck5vZGVQb29sTGlzdCh0aGlzLCBcIm5vZGVfcG9vbFwiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgbm9kZVBvb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVQb29sO1xuICB9XG5cbiAgLy8gbm9kZV9wb29sX2F1dG9fY29uZmlnIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX25vZGVQb29sQXV0b0NvbmZpZyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck5vZGVQb29sQXV0b0NvbmZpZ0xpc3QodGhpcywgXCJub2RlX3Bvb2xfYXV0b19jb25maWdcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IG5vZGVQb29sQXV0b0NvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fbm9kZVBvb2xBdXRvQ29uZmlnO1xuICB9XG5cbiAgLy8gbm9kZV9wb29sX2RlZmF1bHRzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX25vZGVQb29sRGVmYXVsdHMgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJOb2RlUG9vbERlZmF1bHRzTGlzdCh0aGlzLCBcIm5vZGVfcG9vbF9kZWZhdWx0c1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgbm9kZVBvb2xEZWZhdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fbm9kZVBvb2xEZWZhdWx0cztcbiAgfVxuXG4gIC8vIG5vZGVfdmVyc2lvbiAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG5vZGVWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbm9kZV92ZXJzaW9uJyk7XG4gIH1cblxuICAvLyBub3RpZmljYXRpb25fY29uZmlnIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX25vdGlmaWNhdGlvbkNvbmZpZyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3Rlck5vdGlmaWNhdGlvbkNvbmZpZ0xpc3QodGhpcywgXCJub3RpZmljYXRpb25fY29uZmlnXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBub3RpZmljYXRpb25Db25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdGlmaWNhdGlvbkNvbmZpZztcbiAgfVxuXG4gIC8vIG9wZXJhdGlvbiAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG9wZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29wZXJhdGlvbicpO1xuICB9XG5cbiAgLy8gcHJpdmF0ZV9jbHVzdGVyX2NvbmZpZyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcml2YXRlQ2x1c3RlckNvbmZpZyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlclByaXZhdGVDbHVzdGVyQ29uZmlnTGlzdCh0aGlzLCBcInByaXZhdGVfY2x1c3Rlcl9jb25maWdcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IHByaXZhdGVDbHVzdGVyQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlQ2x1c3RlckNvbmZpZztcbiAgfVxuXG4gIC8vIHByaXZhdGVfaXB2Nl9nb29nbGVfYWNjZXNzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgcHJpdmF0ZUlwdjZHb29nbGVBY2Nlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwcml2YXRlX2lwdjZfZ29vZ2xlX2FjY2VzcycpO1xuICB9XG5cbiAgLy8gcHJvamVjdCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcm9qZWN0Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwcm9qZWN0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncHJvamVjdCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJvamVjdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHJvamVjdCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByb2plY3QoKSB7XG4gICAgdGhpcy5fcHJvamVjdCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHJvamVjdElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0O1xuICB9XG5cbiAgLy8gcmVsZWFzZV9jaGFubmVsIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3JlbGVhc2VDaGFubmVsID0gbmV3IERhdGFHb29nbGVDb250YWluZXJDbHVzdGVyUmVsZWFzZUNoYW5uZWxMaXN0KHRoaXMsIFwicmVsZWFzZV9jaGFubmVsXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCByZWxlYXNlQ2hhbm5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsZWFzZUNoYW5uZWw7XG4gIH1cblxuICAvLyByZW1vdmVfZGVmYXVsdF9ub2RlX3Bvb2wgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCByZW1vdmVEZWZhdWx0Tm9kZVBvb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgncmVtb3ZlX2RlZmF1bHRfbm9kZV9wb29sJyk7XG4gIH1cblxuICAvLyByZXNvdXJjZV9sYWJlbHMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcmVzb3VyY2VMYWJlbHMgPSBuZXcgY2RrdGYuU3RyaW5nTWFwKHRoaXMsIFwicmVzb3VyY2VfbGFiZWxzXCIpO1xuICBwdWJsaWMgZ2V0IHJlc291cmNlTGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZUxhYmVscztcbiAgfVxuXG4gIC8vIHJlc291cmNlX3VzYWdlX2V4cG9ydF9jb25maWcgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcmVzb3VyY2VVc2FnZUV4cG9ydENvbmZpZyA9IG5ldyBEYXRhR29vZ2xlQ29udGFpbmVyQ2x1c3RlclJlc291cmNlVXNhZ2VFeHBvcnRDb25maWdMaXN0KHRoaXMsIFwicmVzb3VyY2VfdXNhZ2VfZXhwb3J0X2NvbmZpZ1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VVc2FnZUV4cG9ydENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VVc2FnZUV4cG9ydENvbmZpZztcbiAgfVxuXG4gIC8vIHNlY3JldF9tYW5hZ2VyX2NvbmZpZyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zZWNyZXRNYW5hZ2VyQ29uZmlnID0gbmV3IERhdGFHb29nbGVDb250YWluZXJDbHVzdGVyU2VjcmV0TWFuYWdlckNvbmZpZ0xpc3QodGhpcywgXCJzZWNyZXRfbWFuYWdlcl9jb25maWdcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IHNlY3JldE1hbmFnZXJDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY3JldE1hbmFnZXJDb25maWc7XG4gIH1cblxuICAvLyBzZWN1cml0eV9wb3N0dXJlX2NvbmZpZyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zZWN1cml0eVBvc3R1cmVDb25maWcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJTZWN1cml0eVBvc3R1cmVDb25maWdMaXN0KHRoaXMsIFwic2VjdXJpdHlfcG9zdHVyZV9jb25maWdcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IHNlY3VyaXR5UG9zdHVyZUNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdXJpdHlQb3N0dXJlQ29uZmlnO1xuICB9XG5cbiAgLy8gc2VsZl9saW5rIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgc2VsZkxpbmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzZWxmX2xpbmsnKTtcbiAgfVxuXG4gIC8vIHNlcnZpY2VfZXh0ZXJuYWxfaXBzX2NvbmZpZyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zZXJ2aWNlRXh0ZXJuYWxJcHNDb25maWcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJTZXJ2aWNlRXh0ZXJuYWxJcHNDb25maWdMaXN0KHRoaXMsIFwic2VydmljZV9leHRlcm5hbF9pcHNfY29uZmlnXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBzZXJ2aWNlRXh0ZXJuYWxJcHNDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VFeHRlcm5hbElwc0NvbmZpZztcbiAgfVxuXG4gIC8vIHNlcnZpY2VzX2lwdjRfY2lkciAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHNlcnZpY2VzSXB2NENpZHIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzZXJ2aWNlc19pcHY0X2NpZHInKTtcbiAgfVxuXG4gIC8vIHN1Ym5ldHdvcmsgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBzdWJuZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc3VibmV0d29yaycpO1xuICB9XG5cbiAgLy8gdGVycmFmb3JtX2xhYmVscyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90ZXJyYWZvcm1MYWJlbHMgPSBuZXcgY2RrdGYuU3RyaW5nTWFwKHRoaXMsIFwidGVycmFmb3JtX2xhYmVsc1wiKTtcbiAgcHVibGljIGdldCB0ZXJyYWZvcm1MYWJlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RlcnJhZm9ybUxhYmVscztcbiAgfVxuXG4gIC8vIHRwdV9pcHY0X2NpZHJfYmxvY2sgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCB0cHVJcHY0Q2lkckJsb2NrKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndHB1X2lwdjRfY2lkcl9ibG9jaycpO1xuICB9XG5cbiAgLy8gdmVydGljYWxfcG9kX2F1dG9zY2FsaW5nIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ZlcnRpY2FsUG9kQXV0b3NjYWxpbmcgPSBuZXcgRGF0YUdvb2dsZUNvbnRhaW5lckNsdXN0ZXJWZXJ0aWNhbFBvZEF1dG9zY2FsaW5nTGlzdCh0aGlzLCBcInZlcnRpY2FsX3BvZF9hdXRvc2NhbGluZ1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgdmVydGljYWxQb2RBdXRvc2NhbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVydGljYWxQb2RBdXRvc2NhbGluZztcbiAgfVxuXG4gIC8vIHdvcmtsb2FkX2lkZW50aXR5X2NvbmZpZyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF93b3JrbG9hZElkZW50aXR5Q29uZmlnID0gbmV3IERhdGFHb29nbGVDb250YWluZXJDbHVzdGVyV29ya2xvYWRJZGVudGl0eUNvbmZpZ0xpc3QodGhpcywgXCJ3b3JrbG9hZF9pZGVudGl0eV9jb25maWdcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IHdvcmtsb2FkSWRlbnRpdHlDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtsb2FkSWRlbnRpdHlDb25maWc7XG4gIH1cblxuICAvLyA9PT09PT09PT1cbiAgLy8gU1lOVEhFU0lTXG4gIC8vID09PT09PT09PVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9pZCksXG4gICAgICBsb2NhdGlvbjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fbG9jYXRpb24pLFxuICAgICAgbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fbmFtZSksXG4gICAgICBwcm9qZWN0OiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9wcm9qZWN0KSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIGlkOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9pZCksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9sb2NhdGlvbiksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX25hbWUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBwcm9qZWN0OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9wcm9qZWN0KSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=