cdktg
Version:
Agile Threat Modeling as Code
155 lines • 20.7 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.StorageType = exports.Vault = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const __1 = require("..");
class Vault extends __1.TechnicalAsset {
constructor(scope, id, props) {
super(scope, id, {
description: props.vendor ? `${props.vendor} Vault` : "No Name Vault",
type: __1.TechnicalAssetType.PROCESS,
usage: __1.Usage.DEVOPS,
humanUse: false,
tags: props.tags,
size: __1.Size.SERVICE,
technology: __1.Technology.VAULT,
internet: false,
machine: __1.Machine.VIRTUAL,
encryption: __1.Encryption.TRANSPARENT,
owner: "",
ciaTriad: new __1.CIATriad({
confidentiality: __1.Confidentiality.STRICTLY_CONFIDENTIAL,
integrity: __1.Integrity.CRITICAL,
availability: __1.Availability.CRITICAL,
justification: "Vault components are rated as 'strictly-confidential'.",
}),
multiTenant: props.multiTenant,
redundant: false,
customDevelopedParts: false,
});
this.authentication = props.authtentication;
this.configurationSecrets = new __1.DataAsset(this, "Configuration Secrets", {
description: "Configuration secrets (like credentials, keys, certificates, etc.) secured and managed by a vault",
usage: __1.Usage.DEVOPS,
origin: "",
owner: "",
quantity: __1.Quantity.VERY_FEW,
ciaTriad: new __1.CIATriad({
confidentiality: __1.Confidentiality.STRICTLY_CONFIDENTIAL,
integrity: __1.Integrity.CRITICAL,
availability: __1.Availability.CRITICAL,
justification: "Configuration secrets are rated as being 'strictly-confidential'.",
}),
});
this.processes(this.configurationSecrets);
if (props.storageType === StorageType.IN_MEMORY) {
this.stores(this.configurationSecrets);
}
if (props.storageType === StorageType.FILESYSTEM ||
props.storageType === StorageType.DATABASE) {
this.vaultStorage = new __1.TechnicalAsset(this, "Vault Storage", {
description: "Vault Storage",
type: __1.TechnicalAssetType.DATASTORE,
usage: __1.Usage.DEVOPS,
humanUse: false,
size: __1.Size.COMPONENT,
technology: props.storageType === StorageType.FILESYSTEM
? __1.Technology.FILE_SERVER
: __1.Technology.DATABASE,
internet: false,
machine: __1.Machine.VIRTUAL,
encryption: __1.Encryption.SYMMETRIC_SHARED_KEY,
owner: "",
ciaTriad: new __1.CIATriad({
confidentiality: __1.Confidentiality.CONFIDENTIAL,
integrity: __1.Integrity.CRITICAL,
availability: __1.Availability.CRITICAL,
justification: "Vault components are only rated as 'confidential' as vaults usually apply a trust barrier to encrypt all data-at-rest with a vault key.",
}),
multiTenant: props.multiTenant,
redundant: false,
customDevelopedParts: false,
});
this.vaultStorage.stores(this.configurationSecrets);
const vaultStorageAccess = this.communicatesWith("Vault Storage Access", this.vaultStorage, {
description: "Vault Storage Access",
protocol: props.storageType === StorageType.FILESYSTEM
? __1.Protocol.LOCAL_FILE_ACCESS
: __1.Protocol.SQL_ACCESS_PROTOCOL,
authentication: __1.Authentication.CREDENTIALS,
authorization: __1.Authorization.TECHNICAL_USER,
vpn: false,
ipFiltered: false,
readonly: false,
usage: __1.Usage.DEVOPS,
});
vaultStorageAccess.sends(this.configurationSecrets);
vaultStorageAccess.receives(this.configurationSecrets);
}
if (props.storageType === StorageType.FILESYSTEM) {
const vaultEnvironment = new __1.TrustBoundary(this, "Vault Environment", {
description: "Vault Environment",
type: __1.TrustBoundaryType.EXECUTION_ENVIRONMENT,
});
vaultEnvironment.addTechnicalAssets(this, this.vaultStorage);
if (props.trustBoundary) {
// nest as execution-environment trust boundary
props.trustBoundary.addTrustBoundary(vaultEnvironment);
}
}
else {
if (props.trustBoundary) {
// place assets inside directly
props.trustBoundary.addTechnicalAssets(this);
if (this.vaultStorage) {
props.trustBoundary.addTechnicalAssets(this.vaultStorage);
}
}
}
}
isUsedBy(client) {
const vaultAccessTraffic = client.communicatesWith(`Vault Access Traffic by (${client.node.id})`, this, {
description: `Vault Access Traffic by (${client.node.id})`,
protocol: __1.Protocol.HTTPS,
authentication: this.authentication,
authorization: __1.Authorization.TECHNICAL_USER,
vpn: false,
ipFiltered: false,
readonly: true,
usage: __1.Usage.DEVOPS,
});
vaultAccessTraffic.receives(this.configurationSecrets);
}
}
exports.Vault = Vault;
_a = JSII_RTTI_SYMBOL_1;
Vault[_a] = { fqn: "cdktg.plus.Vault", version: "0.0.40" };
var StorageType;
(function (StorageType) {
/**
* Cloud Provider (storage buckets or similar)
*/
StorageType[StorageType["CLOUD_PROVIDER"] = 1] = "CLOUD_PROVIDER";
/**
* Container Platform (orchestration platform managed storage)
*/
StorageType[StorageType["CONTAINER_PLATFORM"] = 2] = "CONTAINER_PLATFORM";
/**
* Database (SQL-DB, NoSQL-DB, object store or similar)
*/
StorageType[StorageType["DATABASE"] = 3] = "DATABASE";
/**
* Filesystem (local or remote)
*/
StorageType[StorageType["FILESYSTEM"] = 4] = "FILESYSTEM";
/**
* In-Memory (no persistent storage of secrets)
*/
StorageType[StorageType["IN_MEMORY"] = 5] = "IN_MEMORY";
/**
* Service Registry
*/
StorageType[StorageType["SERVICE_REGISTRY"] = 6] = "SERVICE_REGISTRY";
})(StorageType = exports.StorageType || (exports.StorageType = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGx1cy92YXVsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDBCQW1CWTtBQVdaLE1BQWEsS0FBTSxTQUFRLGtCQUFjO0lBTXZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUI7UUFDekQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWU7WUFDckUsSUFBSSxFQUFFLHNCQUFrQixDQUFDLE9BQU87WUFDaEMsS0FBSyxFQUFFLFNBQUssQ0FBQyxNQUFNO1lBQ25CLFFBQVEsRUFBRSxLQUFLO1lBQ2YsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLElBQUksRUFBRSxRQUFJLENBQUMsT0FBTztZQUNsQixVQUFVLEVBQUUsY0FBVSxDQUFDLEtBQUs7WUFDNUIsUUFBUSxFQUFFLEtBQUs7WUFDZixPQUFPLEVBQUUsV0FBTyxDQUFDLE9BQU87WUFDeEIsVUFBVSxFQUFFLGNBQVUsQ0FBQyxXQUFXO1lBQ2xDLEtBQUssRUFBRSxFQUFFO1lBQ1QsUUFBUSxFQUFFLElBQUksWUFBUSxDQUFDO2dCQUNyQixlQUFlLEVBQUUsbUJBQWUsQ0FBQyxxQkFBcUI7Z0JBQ3RELFNBQVMsRUFBRSxhQUFTLENBQUMsUUFBUTtnQkFDN0IsWUFBWSxFQUFFLGdCQUFZLENBQUMsUUFBUTtnQkFDbkMsYUFBYSxFQUFFLHdEQUF3RDthQUN4RSxDQUFDO1lBQ0YsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLG9CQUFvQixFQUFFLEtBQUs7U0FDNUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBRTVD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LGNBQWM7WUFDbkMsYUFBYSxFQUFFLGlCQUFhLENBQUMsY0FBYztZQUMzQyxHQUFHLEVBQUUsS0FBSztZQUNWLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLFNBQUssQ0FBQyxNQUFNO1NBQ3BCLENBQ0YsQ0FBQztRQUVGLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN6RCxDQUFDOztBQXJKSCxzQkFzSkM7OztBQUVELElBQVksV0E4Qlg7QUE5QkQsV0FBWSxXQUFXO0lBQ3JCOztPQUVHO0lBQ0gsaUVBQWtCLENBQUE7SUFFbEI7O09BRUc7SUFDSCx5RUFBc0IsQ0FBQTtJQUV0Qjs7T0FFRztJQUNILHFEQUFZLENBQUE7SUFFWjs7T0FFRztJQUNILHlEQUFjLENBQUE7SUFFZDs7T0FFRztJQUNILHVEQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILHFFQUFvQixDQUFBO0FBQ3RCLENBQUMsRUE5QlcsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUE4QnRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIEF1dGhlbnRpY2F0aW9uLFxuICBBdXRob3JpemF0aW9uLFxuICBBdmFpbGFiaWxpdHksXG4gIENJQVRyaWFkLFxuICBDb25maWRlbnRpYWxpdHksXG4gIERhdGFBc3NldCxcbiAgRW5jcnlwdGlvbixcbiAgSW50ZWdyaXR5LFxuICBNYWNoaW5lLFxuICBQcm90b2NvbCxcbiAgUXVhbnRpdHksXG4gIFNpemUsXG4gIFRlY2huaWNhbEFzc2V0LFxuICBUZWNobmljYWxBc3NldFR5cGUsXG4gIFRlY2hub2xvZ3ksXG4gIFRydXN0Qm91bmRhcnksXG4gIFRydXN0Qm91bmRhcnlUeXBlLFxuICBVc2FnZSxcbn0gZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmF1bHRQcm9wcyB7XG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RvcmFnZVR5cGU6IFN0b3JhZ2VUeXBlO1xuICByZWFkb25seSBhdXRodGVudGljYXRpb246IEF1dGhlbnRpY2F0aW9uO1xuICByZWFkb25seSBtdWx0aVRlbmFudDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGFncz86IHN0cmluZ1tdO1xuICByZWFkb25seSB0cnVzdEJvdW5kYXJ5PzogVHJ1c3RCb3VuZGFyeTtcbn1cblxuZXhwb3J0IGNsYXNzIFZhdWx0IGV4dGVuZHMgVGVjaG5pY2FsQXNzZXQge1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlndXJhdGlvblNlY3JldHM6IERhdGFBc3NldDtcbiAgcHVibGljIHJlYWRvbmx5IHZhdWx0U3RvcmFnZT86IFRlY2huaWNhbEFzc2V0O1xuXG4gIHByaXZhdGUgYXV0aGVudGljYXRpb246IEF1dGhlbnRpY2F0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWYXVsdFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMudmVuZG9yID8gYCR7cHJvcHMudmVuZG9yfSBWYXVsdGAgOiBcIk5vIE5hbWUgVmF1bHRcIixcbiAgICAgIHR5cGU6IFRlY2huaWNhbEFzc2V0VHlwZS5QUk9DRVNTLFxuICAgICAgdXNhZ2U6IFVzYWdlLkRFVk9QUyxcbiAgICAgIGh1bWFuVXNlOiBmYWxzZSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICBzaXplOiBTaXplLlNFUlZJQ0UsXG4gICAgICB0ZWNobm9sb2d5OiBUZWNobm9sb2d5LlZBVUxULFxuICAgICAgaW50ZXJuZXQ6IGZhbHNlLFxuICAgICAgbWFjaGluZTogTWFjaGluZS5WSVJUVUFMLFxuICAgICAgZW5jcnlwdGlvbjogRW5jcnlwdGlvbi5UUkFOU1BBUkVOVCxcbiAgICAgIG93bmVyOiBcIlwiLFxuICAgICAgY2lhVHJpYWQ6IG5ldyBDSUFUcmlhZCh7XG4gICAgICAgIGNvbmZpZGVudGlhbGl0eTogQ29uZmlkZW50aWFsaXR5LlNUUklDVExZX0NPTkZJREVOVElBTCxcbiAgICAgICAgaW50ZWdyaXR5OiBJbnRlZ3JpdHkuQ1JJVElDQUwsXG4gICAgICAgIGF2YWlsYWJpbGl0eTogQXZhaWxhYmlsaXR5LkNSSVRJQ0FMLFxuICAgICAgICBqdXN0aWZpY2F0aW9uOiBcIlZhdWx0IGNvbXBvbmVudHMgYXJlIHJhdGVkIGFzICdzdHJpY3RseS1jb25maWRlbnRpYWwnLlwiLFxuICAgICAgfSksXG4gICAgICBtdWx0aVRlbmFudDogcHJvcHMubXVsdGlUZW5hbnQsXG4gICAgICByZWR1bmRhbnQ6IGZhbHNlLFxuICAgICAgY3VzdG9tRGV2ZWxvcGVkUGFydHM6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvbiA9IHByb3BzLmF1dGh0ZW50aWNhdGlvbjtcblxuICAgIHRoaXMuY29uZmlndXJhdGlvblNlY3JldHMgPSBuZXcgRGF0YUFzc2V0KHRoaXMsIFwiQ29uZmlndXJhdGlvbiBTZWNyZXRzXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkNvbmZpZ3VyYXRpb24gc2VjcmV0cyAobGlrZSBjcmVkZW50aWFscywga2V5cywgY2VydGlmaWNhdGVzLCBldGMuKSBzZWN1cmVkIGFuZCBtYW5hZ2VkIGJ5IGEgdmF1bHRcIixcbiAgICAgIHVzYWdlOiBVc2FnZS5ERVZPUFMsXG4gICAgICBvcmlnaW46IFwiXCIsXG4gICAgICBvd25lcjogXCJcIixcbiAgICAgIHF1YW50aXR5OiBRdWFudGl0eS5WRVJZX0ZFVyxcbiAgICAgIGNpYVRyaWFkOiBuZXcgQ0lBVHJpYWQoe1xuICAgICAgICBjb25maWRlbnRpYWxpdHk6IENvbmZpZGVudGlhbGl0eS5TVFJJQ1RMWV9DT05GSURFTlRJQUwsXG4gICAgICAgIGludGVncml0eTogSW50ZWdyaXR5LkNSSVRJQ0FMLFxuICAgICAgICBhdmFpbGFiaWxpdHk6IEF2YWlsYWJpbGl0eS5DUklUSUNBTCxcbiAgICAgICAganVzdGlmaWNhdGlvbjpcbiAgICAgICAgICBcIkNvbmZpZ3VyYXRpb24gc2VjcmV0cyBhcmUgcmF0ZWQgYXMgYmVpbmcgJ3N0cmljdGx5LWNvbmZpZGVudGlhbCcuXCIsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvY2Vzc2VzKHRoaXMuY29uZmlndXJhdGlvblNlY3JldHMpO1xuXG4gICAgaWYgKHByb3BzLnN0b3JhZ2VUeXBlID09PSBTdG9yYWdlVHlwZS5JTl9NRU1PUlkpIHtcbiAgICAgIHRoaXMuc3RvcmVzKHRoaXMuY29uZmlndXJhdGlvblNlY3JldHMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByb3BzLnN0b3JhZ2VUeXBlID09PSBTdG9yYWdlVHlwZS5GSUxFU1lTVEVNIHx8XG4gICAgICBwcm9wcy5zdG9yYWdlVHlwZSA9PT0gU3RvcmFnZVR5cGUuREFUQUJBU0VcbiAgICApIHtcbiAgICAgIHRoaXMudmF1bHRTdG9yYWdlID0gbmV3IFRlY2huaWNhbEFzc2V0KHRoaXMsIFwiVmF1bHQgU3RvcmFnZVwiLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlZhdWx0IFN0b3JhZ2VcIixcbiAgICAgICAgdHlwZTogVGVjaG5pY2FsQXNzZXRUeXBlLkRBVEFTVE9SRSxcbiAgICAgICAgdXNhZ2U6IFVzYWdlLkRFVk9QUyxcbiAgICAgICAgaHVtYW5Vc2U6IGZhbHNlLFxuICAgICAgICBzaXplOiBTaXplLkNPTVBPTkVOVCxcbiAgICAgICAgdGVjaG5vbG9neTpcbiAgICAgICAgICBwcm9wcy5zdG9yYWdlVHlwZSA9PT0gU3RvcmFnZVR5cGUuRklMRVNZU1RFTVxuICAgICAgICAgICAgPyBUZWNobm9sb2d5LkZJTEVfU0VSVkVSXG4gICAgICAgICAgICA6IFRlY2hub2xvZ3kuREFUQUJBU0UsXG4gICAgICAgIGludGVybmV0OiBmYWxzZSxcbiAgICAgICAgbWFjaGluZTogTWFjaGluZS5WSVJUVUFMLFxuICAgICAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uLlNZTU1FVFJJQ19TSEFSRURfS0VZLFxuICAgICAgICBvd25lcjogXCJcIixcbiAgICAgICAgY2lhVHJpYWQ6IG5ldyBDSUFUcmlhZCh7XG4gICAgICAgICAgY29uZmlkZW50aWFsaXR5OiBDb25maWRlbnRpYWxpdHkuQ09ORklERU5USUFMLFxuICAgICAgICAgIGludGVncml0eTogSW50ZWdyaXR5LkNSSVRJQ0FMLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eTogQXZhaWxhYmlsaXR5LkNSSVRJQ0FMLFxuICAgICAgICAgIGp1c3RpZmljYXRpb246XG4gICAgICAgICAgICBcIlZhdWx0IGNvbXBvbmVudHMgYXJlIG9ubHkgcmF0ZWQgYXMgJ2NvbmZpZGVudGlhbCcgYXMgdmF1bHRzIHVzdWFsbHkgYXBwbHkgYSB0cnVzdCBiYXJyaWVyIHRvIGVuY3J5cHQgYWxsIGRhdGEtYXQtcmVzdCB3aXRoIGEgdmF1bHQga2V5LlwiLFxuICAgICAgICB9KSxcbiAgICAgICAgbXVsdGlUZW5hbnQ6IHByb3BzLm11bHRpVGVuYW50LFxuICAgICAgICByZWR1bmRhbnQ6IGZhbHNlLFxuICAgICAgICBjdXN0b21EZXZlbG9wZWRQYXJ0czogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy52YXVsdFN0b3JhZ2Uuc3RvcmVzKHRoaXMuY29uZmlndXJhdGlvblNlY3JldHMpO1xuXG4gICAgICBjb25zdCB2YXVsdFN0b3JhZ2VBY2Nlc3MgPSB0aGlzLmNvbW11bmljYXRlc1dpdGgoXG4gICAgICAgIFwiVmF1bHQgU3RvcmFnZSBBY2Nlc3NcIixcbiAgICAgICAgdGhpcy52YXVsdFN0b3JhZ2UsXG4gICAgICAgIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJWYXVsdCBTdG9yYWdlIEFjY2Vzc1wiLFxuICAgICAgICAgIHByb3RvY29sOlxuICAgICAgICAgICAgcHJvcHMuc3RvcmFnZVR5cGUgPT09IFN0b3JhZ2VUeXBlLkZJTEVTWVNURU1cbiAgICAgICAgICAgICAgPyBQcm90b2NvbC5MT0NBTF9GSUxFX0FDQ0VTU1xuICAgICAgICAgICAgICA6IFByb3RvY29sLlNRTF9BQ0NFU1NfUFJPVE9DT0wsXG4gICAgICAgICAgYXV0aGVudGljYXRpb246IEF1dGhlbnRpY2F0aW9uLkNSRURFTlRJQUxTLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IEF1dGhvcml6YXRpb24uVEVDSE5JQ0FMX1VTRVIsXG4gICAgICAgICAgdnBuOiBmYWxzZSxcbiAgICAgICAgICBpcEZpbHRlcmVkOiBmYWxzZSxcbiAgICAgICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICAgICAgdXNhZ2U6IFVzYWdlLkRFVk9QUyxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdmF1bHRTdG9yYWdlQWNjZXNzLnNlbmRzKHRoaXMuY29uZmlndXJhdGlvblNlY3JldHMpO1xuICAgICAgdmF1bHRTdG9yYWdlQWNjZXNzLnJlY2VpdmVzKHRoaXMuY29uZmlndXJhdGlvblNlY3JldHMpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zdG9yYWdlVHlwZSA9PT0gU3RvcmFnZVR5cGUuRklMRVNZU1RFTSkge1xuICAgICAgY29uc3QgdmF1bHRFbnZpcm9ubWVudCA9IG5ldyBUcnVzdEJvdW5kYXJ5KHRoaXMsIFwiVmF1bHQgRW52aXJvbm1lbnRcIiwge1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJWYXVsdCBFbnZpcm9ubWVudFwiLFxuICAgICAgICB0eXBlOiBUcnVzdEJvdW5kYXJ5VHlwZS5FWEVDVVRJT05fRU5WSVJPTk1FTlQsXG4gICAgICB9KTtcblxuICAgICAgdmF1bHRFbnZpcm9ubWVudC5hZGRUZWNobmljYWxBc3NldHModGhpcywgdGhpcy52YXVsdFN0b3JhZ2UhKTtcblxuICAgICAgaWYgKHByb3BzLnRydXN0Qm91bmRhcnkpIHtcbiAgICAgICAgLy8gbmVzdCBhcyBleGVjdXRpb24tZW52aXJvbm1lbnQgdHJ1c3QgYm91bmRhcnlcbiAgICAgICAgcHJvcHMudHJ1c3RCb3VuZGFyeS5hZGRUcnVzdEJvdW5kYXJ5KHZhdWx0RW52aXJvbm1lbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcHMudHJ1c3RCb3VuZGFyeSkge1xuICAgICAgICAvLyBwbGFjZSBhc3NldHMgaW5zaWRlIGRpcmVjdGx5XG4gICAgICAgIHByb3BzLnRydXN0Qm91bmRhcnkuYWRkVGVjaG5pY2FsQXNzZXRzKHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLnZhdWx0U3RvcmFnZSkge1xuICAgICAgICAgIHByb3BzLnRydXN0Qm91bmRhcnkuYWRkVGVjaG5pY2FsQXNzZXRzKHRoaXMudmF1bHRTdG9yYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1VzZWRCeShjbGllbnQ6IFRlY2huaWNhbEFzc2V0KSB7XG4gICAgY29uc3QgdmF1bHRBY2Nlc3NUcmFmZmljID0gY2xpZW50LmNvbW11bmljYXRlc1dpdGgoXG4gICAgICBgVmF1bHQgQWNjZXNzIFRyYWZmaWMgYnkgKCR7Y2xpZW50Lm5vZGUuaWR9KWAsXG4gICAgICB0aGlzLFxuICAgICAge1xuICAgICAgICBkZXNjcmlwdGlvbjogYFZhdWx0IEFjY2VzcyBUcmFmZmljIGJ5ICgke2NsaWVudC5ub2RlLmlkfSlgLFxuICAgICAgICBwcm90b2NvbDogUHJvdG9jb2wuSFRUUFMsXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uOiB0aGlzLmF1dGhlbnRpY2F0aW9uLFxuICAgICAgICBhdXRob3JpemF0aW9uOiBBdXRob3JpemF0aW9uLlRFQ0hOSUNBTF9VU0VSLFxuICAgICAgICB2cG46IGZhbHNlLFxuICAgICAgICBpcEZpbHRlcmVkOiBmYWxzZSxcbiAgICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICAgIHVzYWdlOiBVc2FnZS5ERVZPUFMsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHZhdWx0QWNjZXNzVHJhZmZpYy5yZWNlaXZlcyh0aGlzLmNvbmZpZ3VyYXRpb25TZWNyZXRzKTtcbiAgfVxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlVHlwZSB7XG4gIC8qKlxuICAgKiBDbG91ZCBQcm92aWRlciAoc3RvcmFnZSBidWNrZXRzIG9yIHNpbWlsYXIpXG4gICAqL1xuICBDTE9VRF9QUk9WSURFUiA9IDEsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBQbGF0Zm9ybSAob3JjaGVzdHJhdGlvbiBwbGF0Zm9ybSBtYW5hZ2VkIHN0b3JhZ2UpXG4gICAqL1xuICBDT05UQUlORVJfUExBVEZPUk0gPSAyLFxuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSAoU1FMLURCLCBOb1NRTC1EQiwgb2JqZWN0IHN0b3JlIG9yIHNpbWlsYXIpXG4gICAqL1xuICBEQVRBQkFTRSA9IDMsXG5cbiAgLyoqXG4gICAqIEZpbGVzeXN0ZW0gKGxvY2FsIG9yIHJlbW90ZSlcbiAgICovXG4gIEZJTEVTWVNURU0gPSA0LFxuXG4gIC8qKlxuICAgKiBJbi1NZW1vcnkgKG5vIHBlcnNpc3RlbnQgc3RvcmFnZSBvZiBzZWNyZXRzKVxuICAgKi9cbiAgSU5fTUVNT1JZID0gNSxcblxuICAvKipcbiAgICogU2VydmljZSBSZWdpc3RyeVxuICAgKi9cbiAgU0VSVklDRV9SRUdJU1RSWSA9IDYsXG59XG4iXX0=