UNPKG

@enfo/aws-cdkompliance

Version:

Tagging and compliant resources using the CDK

185 lines 18.3 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.DatabaseCluster = exports.defaultInstanceProps = exports.defaultDatabaseClusterProps = exports.DatabaseInstance = exports.defaultDatabaseInstanceProps = exports.DatabaseEnvironment = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_rds_1 = require("aws-cdk-lib/aws-rds"); /** * Used to state whether or not this database should be considered a production database or not */ var DatabaseEnvironment; (function (DatabaseEnvironment) { /** * When used the database must be deployed to multiple Availability Zones */ DatabaseEnvironment[DatabaseEnvironment["PRODUCTION"] = 0] = "PRODUCTION"; /** * When used the database can be deployed to a single Availability Zone */ DatabaseEnvironment[DatabaseEnvironment["NOT_PRODUCTION"] = 1] = "NOT_PRODUCTION"; })(DatabaseEnvironment = exports.DatabaseEnvironment || (exports.DatabaseEnvironment = {})); /** * Properties for a new Compliant RDS Instance */ exports.defaultDatabaseInstanceProps = { publiclyAccessible: false, storageEncrypted: true, iamAuthentication: true, autoMinorVersionUpgrade: true, copyTagsToSnapshot: true, deletionProtection: true, multiAz: true, environment: DatabaseEnvironment.PRODUCTION }; /** * Compliant RDS Instance * * See README for usage examples */ class DatabaseInstance extends aws_rds_1.DatabaseInstance { constructor(scope, id, props) { super(scope, id, { ...exports.defaultDatabaseInstanceProps, ...props }); this.calculatedProps = { ...exports.defaultDatabaseInstanceProps, ...props }; this.node.addValidation({ validate: () => { return [ ...this.checkPubliclyAccessible(), ...this.checkStorageEncrypted(), ...this.checkIAMAuthentication(), ...this.checkAutoUpgrade(), ...this.checkCopyTags(), ...this.checkDeletionProtection(), ...this.checkMultiAz() ]; } }); } checkPubliclyAccessible() { return !this.calculatedProps.publiclyAccessible ? [] : ['publiclyAccessible must be false']; } checkStorageEncrypted() { return this.calculatedProps.storageEncrypted ? [] : ['storageEncrypted must be true']; } checkIAMAuthentication() { return this.calculatedProps.iamAuthentication ? [] : ['iamAuthentication must be true']; } checkAutoUpgrade() { return this.calculatedProps.autoMinorVersionUpgrade ? [] : ['autoMinorVersionUpgrade must be true']; } checkCopyTags() { return this.calculatedProps.copyTagsToSnapshot ? [] : ['copyTagsToSnapshot must be true']; } checkDeletionProtection() { return this.calculatedProps.deletionProtection ? [] : ['deletionProtection must be true']; } checkMultiAz() { return (this.calculatedProps.environment === DatabaseEnvironment.PRODUCTION && !this.calculatedProps.multiAz) ? ['Production instance must be multi AZ'] : []; } } exports.DatabaseInstance = DatabaseInstance; _a = JSII_RTTI_SYMBOL_1; DatabaseInstance[_a] = { fqn: "@enfo/aws-cdkompliance.DatabaseInstance", version: "1.1.0" }; /** * Properties for a new Compliant RDS Cluster */ exports.defaultDatabaseClusterProps = { storageEncrypted: true, iamAuthentication: true, copyTagsToSnapshot: true, deletionProtection: true }; exports.defaultInstanceProps = { publiclyAccessible: false, autoMinorVersionUpgrade: true }; /** * Compliant RDS Cluster * * See README for usage examples */ class DatabaseCluster extends aws_rds_1.DatabaseCluster { constructor(scope, id, props) { super(scope, id, { ...exports.defaultDatabaseClusterProps, ...props, instanceProps: { ...exports.defaultInstanceProps, ...props.instanceProps } }); this.calculatedProps = { ...exports.defaultDatabaseClusterProps, ...props, instanceProps: { ...exports.defaultInstanceProps, ...props === null || props === void 0 ? void 0 : props.instanceProps } }; this.node.addValidation({ validate: () => { return [ ...this.checkPubliclyAccessible(), ...this.checkStorageEncrypted(), ...this.checkIAMAuthentication(), ...this.checkAutoUpgrade(), ...this.checkCopyTags(), ...this.checkDeletionProtection() ]; } }); } checkStorageEncrypted() { return this.calculatedProps.storageEncrypted ? [] : ['storageEncrypted must be true']; } checkIAMAuthentication() { return this.calculatedProps.iamAuthentication ? [] : ['iamAuthentication must be true']; } checkCopyTags() { return this.calculatedProps.copyTagsToSnapshot ? [] : ['copyTagsToSnapshot must be true']; } checkDeletionProtection() { return this.calculatedProps.deletionProtection ? [] : ['deletionProtection must be true']; } checkPubliclyAccessible() { return !this.calculatedProps.instanceProps.publiclyAccessible ? [] : ['publiclyAccessible must be false']; } checkAutoUpgrade() { return this.calculatedProps.instanceProps.autoMinorVersionUpgrade ? [] : ['autoMinorVersionUpgrade must be true']; } } exports.DatabaseCluster = DatabaseCluster; _b = JSII_RTTI_SYMBOL_1; DatabaseCluster[_b] = { fqn: "@enfo/aws-cdkompliance.DatabaseCluster", version: "1.1.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBSzRCO0FBRzVCOztHQUVHO0FBQ0gsSUFBWSxtQkFTWDtBQVRELFdBQVksbUJBQW1CO0lBQzdCOztPQUVHO0lBQ0gseUVBQVUsQ0FBQTtJQUNWOztPQUVHO0lBQ0gsaUZBQWMsQ0FBQTtBQUNoQixDQUFDLEVBVFcsbUJBQW1CLEdBQW5CLDJCQUFtQixLQUFuQiwyQkFBbUIsUUFTOUI7QUFNRDs7R0FFRztBQUNVLFFBQUEsNEJBQTRCLEdBQUc7SUFDMUMsa0JBQWtCLEVBQUUsS0FBSztJQUN6QixnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsdUJBQXVCLEVBQUUsSUFBSTtJQUM3QixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsT0FBTyxFQUFFLElBQUk7SUFDYixXQUFXLEVBQUUsbUJBQW1CLENBQUMsVUFBVTtDQUM1QyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsMEJBQW1CO0lBRXZELFlBQWEsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixHQUFHLG9DQUE0QjtZQUMvQixHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLEdBQUcsb0NBQTRCO1lBQy9CLEdBQUcsS0FBSztTQUNULENBQUE7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN0QixRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLE9BQU87b0JBQ0wsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQ2pDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFO29CQUMvQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFB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RUFBRTtZQUNKLENBQUMsQ0FBQyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7SUFDOUMsQ0FBQzs7QUFwRUgsMENBcUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGF0YWJhc2VDbHVzdGVyIGFzIFJEU0RhdGFiYXNlQ2x1c3RlcixcbiAgRGF0YWJhc2VDbHVzdGVyUHJvcHMsXG4gIERhdGFiYXNlSW5zdGFuY2UgYXMgUkRTRGF0YWJhc2VJbnN0YW5jZSxcbiAgRGF0YWJhc2VJbnN0YW5jZVByb3BzIGFzIFJEU0RhdGFiYXNlSW5zdGFuY2VQcm9wc1xufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtcmRzJ1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cydcblxuLyoqXG4gKiBVc2VkIHRvIHN0YXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgZGF0YWJhc2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwcm9kdWN0aW9uIGRhdGFiYXNlIG9yIG5vdFxuICovXG5leHBvcnQgZW51bSBEYXRhYmFzZUVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFdoZW4gdXNlZCB0aGUgZGF0YWJhc2UgbXVzdCBiZSBkZXBsb3llZCB0byBtdWx0aXBsZSBBdmFpbGFiaWxpdHkgWm9uZXNcbiAgICovXG4gIFBST0RVQ1RJT04sXG4gIC8qKlxuICAgKiBXaGVuIHVzZWQgdGhlIGRhdGFiYXNlIGNhbiBiZSBkZXBsb3llZCB0byBhIHNpbmdsZSBBdmFpbGFiaWxpdHkgWm9uZVxuICAgKi9cbiAgTk9UX1BST0RVQ1RJT05cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZUluc3RhbmNlUHJvcHMgZXh0ZW5kcyBSRFNEYXRhYmFzZUluc3RhbmNlUHJvcHMge1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IERhdGFiYXNlRW52aXJvbm1lbnRcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIG5ldyBDb21wbGlhbnQgUkRTIEluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YWJhc2VJbnN0YW5jZVByb3BzID0ge1xuICBwdWJsaWNseUFjY2Vzc2libGU6IGZhbHNlLFxuICBzdG9yYWdlRW5jcnlwdGVkOiB0cnVlLFxuICBpYW1BdXRoZW50aWNhdGlvbjogdHJ1ZSxcbiAgYXV0b01pbm9yVmVyc2lvblVwZ3JhZGU6IHRydWUsXG4gIGNvcHlUYWdzVG9TbmFwc2hvdDogdHJ1ZSxcbiAgZGVsZXRpb25Qcm90ZWN0aW9uOiB0cnVlLFxuICBtdWx0aUF6OiB0cnVlLFxuICBlbnZpcm9ubWVudDogRGF0YWJhc2VFbnZpcm9ubWVudC5QUk9EVUNUSU9OXG59XG5cbi8qKlxuICogQ29tcGxpYW50IFJEUyBJbnN0YW5jZVxuICpcbiAqIFNlZSBSRUFETUUgZm9yIHVzYWdlIGV4YW1wbGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUluc3RhbmNlIGV4dGVuZHMgUkRTRGF0YWJhc2VJbnN0YW5jZSB7XG4gIHByb3RlY3RlZCBjYWxjdWxhdGVkUHJvcHM6IERhdGFiYXNlSW5zdGFuY2VQcm9wc1xuICBjb25zdHJ1Y3RvciAoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFiYXNlSW5zdGFuY2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uZGVmYXVsdERhdGFiYXNlSW5zdGFuY2VQcm9wcyxcbiAgICAgIC4uLnByb3BzXG4gICAgfSlcbiAgICB0aGlzLmNhbGN1bGF0ZWRQcm9wcyA9IHtcbiAgICAgIC4uLmRlZmF1bHREYXRhYmFzZUluc3RhbmNlUHJvcHMsXG4gICAgICAuLi5wcm9wc1xuICAgIH1cblxuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHtcbiAgICAgIHZhbGlkYXRlOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgLi4udGhpcy5jaGVja1B1YmxpY2x5QWNjZXNzaWJsZSgpLFxuICAgICAgICAgIC4uLnRoaXMuY2hlY2tTdG9yYWdlRW5jcnlwdGVkKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja0lBTUF1dGhlbnRpY2F0aW9uKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja0F1dG9VcGdyYWRlKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja0NvcHlUYWdzKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja0RlbGV0aW9uUHJvdGVjdGlvbigpLFxuICAgICAgICAgIC4uLnRoaXMuY2hlY2tNdWx0aUF6KClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tQdWJsaWNseUFjY2Vzc2libGUgKCkge1xuICAgIHJldHVybiAhdGhpcy5jYWxjdWxhdGVkUHJvcHMucHVibGljbHlBY2Nlc3NpYmxlXG4gICAgICA/IFtdXG4gICAgICA6IFsncHVibGljbHlBY2Nlc3NpYmxlIG11c3QgYmUgZmFsc2UnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrU3RvcmFnZUVuY3J5cHRlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZFByb3BzLnN0b3JhZ2VFbmNyeXB0ZWRcbiAgICAgID8gW11cbiAgICAgIDogWydzdG9yYWdlRW5jcnlwdGVkIG11c3QgYmUgdHJ1ZSddXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tJQU1BdXRoZW50aWNhdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZFByb3BzLmlhbUF1dGhlbnRpY2F0aW9uXG4gICAgICA/IFtdXG4gICAgICA6IFsnaWFtQXV0aGVudGljYXRpb24gbXVzdCBiZSB0cnVlJ11cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0F1dG9VcGdyYWRlICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVkUHJvcHMuYXV0b01pbm9yVmVyc2lvblVwZ3JhZGVcbiAgICAgID8gW11cbiAgICAgIDogWydhdXRvTWlub3JWZXJzaW9uVXBncmFkZSBtdXN0IGJlIHRydWUnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrQ29weVRhZ3MgKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZWRQcm9wcy5jb3B5VGFnc1RvU25hcHNob3RcbiAgICAgID8gW11cbiAgICAgIDogWydjb3B5VGFnc1RvU25hcHNob3QgbXVzdCBiZSB0cnVlJ11cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0RlbGV0aW9uUHJvdGVjdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZFByb3BzLmRlbGV0aW9uUHJvdGVjdGlvblxuICAgICAgPyBbXVxuICAgICAgOiBbJ2RlbGV0aW9uUHJvdGVjdGlvbiBtdXN0IGJlIHRydWUnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrTXVsdGlBeiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNhbGN1bGF0ZWRQcm9wcy5lbnZpcm9ubWVudCA9PT0gRGF0YWJhc2VFbnZpcm9ubWVudC5QUk9EVUNUSU9OICYmICF0aGlzLmNhbGN1bGF0ZWRQcm9wcy5tdWx0aUF6KVxuICAgICAgPyBbJ1Byb2R1Y3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtdWx0aSBBWiddXG4gICAgICA6IFtdXG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIG5ldyBDb21wbGlhbnQgUkRTIENsdXN0ZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHREYXRhYmFzZUNsdXN0ZXJQcm9wcyA9IHtcbiAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgaWFtQXV0aGVudGljYXRpb246IHRydWUsXG4gIGNvcHlUYWdzVG9TbmFwc2hvdDogdHJ1ZSxcbiAgZGVsZXRpb25Qcm90ZWN0aW9uOiB0cnVlXG59XG5leHBvcnQgY29uc3QgZGVmYXVsdEluc3RhbmNlUHJvcHMgPSB7XG4gIHB1YmxpY2x5QWNjZXNzaWJsZTogZmFsc2UsXG4gIGF1dG9NaW5vclZlcnNpb25VcGdyYWRlOiB0cnVlXG59XG5cbi8qKlxuICogQ29tcGxpYW50IFJEUyBDbHVzdGVyXG4gKlxuICogU2VlIFJFQURNRSBmb3IgdXNhZ2UgZXhhbXBsZXNcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFiYXNlQ2x1c3RlciBleHRlbmRzIFJEU0RhdGFiYXNlQ2x1c3RlciB7XG4gIHByb3RlY3RlZCBjYWxjdWxhdGVkUHJvcHM6IERhdGFiYXNlQ2x1c3RlclByb3BzXG4gIGNvbnN0cnVjdG9yIChzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGF0YWJhc2VDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLmRlZmF1bHREYXRhYmFzZUNsdXN0ZXJQcm9wcyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgaW5zdGFuY2VQcm9wczoge1xuICAgICAgICAuLi5kZWZhdWx0SW5zdGFuY2VQcm9wcyxcbiAgICAgICAgLi4ucHJvcHMuaW5zdGFuY2VQcm9wc1xuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5jYWxjdWxhdGVkUHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0RGF0YWJhc2VDbHVzdGVyUHJvcHMsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGluc3RhbmNlUHJvcHM6IHtcbiAgICAgICAgLi4uZGVmYXVsdEluc3RhbmNlUHJvcHMsXG4gICAgICAgIC4uLnByb3BzPy5pbnN0YW5jZVByb3BzXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAuLi50aGlzLmNoZWNrUHVibGljbHlBY2Nlc3NpYmxlKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja1N0b3JhZ2VFbmNyeXB0ZWQoKSxcbiAgICAgICAgICAuLi50aGlzLmNoZWNrSUFNQXV0aGVudGljYXRpb24oKSxcbiAgICAgICAgICAuLi50aGlzLmNoZWNrQXV0b1VwZ3JhZGUoKSxcbiAgICAgICAgICAuLi50aGlzLmNoZWNrQ29weVRhZ3MoKSxcbiAgICAgICAgICAuLi50aGlzLmNoZWNrRGVsZXRpb25Qcm90ZWN0aW9uKClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tTdG9yYWdlRW5jcnlwdGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVkUHJvcHMuc3RvcmFnZUVuY3J5cHRlZFxuICAgICAgPyBbXVxuICAgICAgOiBbJ3N0b3JhZ2VFbmNyeXB0ZWQgbXVzdCBiZSB0cnVlJ11cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0lBTUF1dGhlbnRpY2F0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVkUHJvcHMuaWFtQXV0aGVudGljYXRpb25cbiAgICAgID8gW11cbiAgICAgIDogWydpYW1BdXRoZW50aWNhdGlvbiBtdXN0IGJlIHRydWUnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrQ29weVRhZ3MgKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZWRQcm9wcy5jb3B5VGFnc1RvU25hcHNob3RcbiAgICAgID8gW11cbiAgICAgIDogWydjb3B5VGFnc1RvU25hcHNob3QgbXVzdCBiZSB0cnVlJ11cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0RlbGV0aW9uUHJvdGVjdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZFByb3BzLmRlbGV0aW9uUHJvdGVjdGlvblxuICAgICAgPyBbXVxuICAgICAgOiBbJ2RlbGV0aW9uUHJvdGVjdGlvbiBtdXN0IGJlIHRydWUnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrUHVibGljbHlBY2Nlc3NpYmxlICgpIHtcbiAgICByZXR1cm4gIXRoaXMuY2FsY3VsYXRlZFByb3BzLmluc3RhbmNlUHJvcHMucHVibGljbHlBY2Nlc3NpYmxlXG4gICAgICA/IFtdXG4gICAgICA6IFsncHVibGljbHlBY2Nlc3NpYmxlIG11c3QgYmUgZmFsc2UnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrQXV0b1VwZ3JhZGUgKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZWRQcm9wcy5pbnN0YW5jZVByb3BzLmF1dG9NaW5vclZlcnNpb25VcGdyYWRlXG4gICAgICA/IFtdXG4gICAgICA6IFsnYXV0b01pbm9yVmVyc2lvblVwZ3JhZGUgbXVzdCBiZSB0cnVlJ11cbiAgfVxufVxuIl19