UNPKG

aws-delivlib

Version:

A fabulous library for defining continuous pipelines for building, testing and releasing code libraries.

138 lines • 17.7 kB
"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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("fs")); const os = __importStar(require("os")); const path = __importStar(require("path")); const util = __importStar(require("util")); // eslint-disable-next-line import/no-extraneous-dependencies const client_s3_1 = require("@aws-sdk/client-s3"); // eslint-disable-next-line import/no-extraneous-dependencies const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager"); const cfn = __importStar(require("./_cloud-formation")); // eslint-disable-next-line @typescript-eslint/no-require-imports const _exec = require("./_exec"); // eslint-disable-next-line @typescript-eslint/no-require-imports const _rmrf = require("./_rmrf"); const mkdtemp = util.promisify(fs.mkdtemp); const readFile = util.promisify(fs.readFile); const writeFile = util.promisify(fs.writeFile); const secretsManager = new client_secrets_manager_1.SecretsManager(); exports.handler = cfn.customResourceHandler(handleEvent); async function handleEvent(event, _context) { if (event.RequestType !== cfn.RequestType.DELETE) { cfn.validateProperties(event.ResourceProperties, { DnCommonName: true, DnCountry: true, DnEmailAddress: true, DnLocality: true, DnOrganizationName: true, DnOrganizationalUnitName: true, DnStateOrProvince: true, ExtendedKeyUsage: false, KeyUsage: true, PrivateKeySecretId: true, OutputBucket: true, }); } switch (event.RequestType) { case cfn.RequestType.CREATE: case cfn.RequestType.UPDATE: return _createSelfSignedCertificate(event); case cfn.RequestType.DELETE: // Nothing to do - this is not a "Physical" resource return { Ref: event.LogicalResourceId }; } } async function _createSelfSignedCertificate(event) { const tempDir = await mkdtemp(path.join(os.tmpdir(), 'x509CSR-')); try { const configFile = await _makeCsrConfig(event, tempDir); const pkeyFile = await _retrievePrivateKey(event, tempDir); const csrFile = path.join(tempDir, 'csr.pem'); await _exec('openssl', 'req', '-config', configFile, '-key', pkeyFile, '-out', csrFile, '-new'); const certFile = path.join(tempDir, 'cert.pem'); await _exec('openssl', 'x509', '-in', csrFile, '-out', certFile, '-req', '-signkey', pkeyFile, '-days', '365'); const s3 = new client_s3_1.S3(); const bucketName = event.ResourceProperties.OutputBucket; await s3.putObject({ Bucket: bucketName, Key: 'certificate-signing-request.pem', Body: await readFile(csrFile, { encoding: 'utf8' }), ContentType: 'application/x-pem-file', }); await s3.putObject({ Bucket: bucketName, Key: 'self-signed-certificate.pem', Body: await readFile(certFile, { encoding: 'utf8' }), ContentType: 'application/x-pem-file', }); return { Ref: event.LogicalResourceId, CSR: `s3://${bucketName}/certificate-signing-request.pem`, SelfSignedCertificate: `s3://${bucketName}/self-signed-certificate.pem`, }; } finally { await _rmrf(tempDir); } } async function _makeCsrConfig(event, dir) { const file = path.join(dir, 'csr.config'); await writeFile(file, [ '[ req ]', 'default_md = sha256', 'distinguished_name = dn', 'prompt = no', 'req_extensions = extensions', 'string_mask = utf8only', 'utf8 = yes', '', '[ dn ]', `CN = ${event.ResourceProperties.DnCommonName}`, `C = ${event.ResourceProperties.DnCountry}`, `ST = ${event.ResourceProperties.DnStateOrProvince}`, `L = ${event.ResourceProperties.DnLocality}`, `O = ${event.ResourceProperties.DnOrganizationName}`, `OU = ${event.ResourceProperties.DnOrganizationalUnitName}`, `emailAddress = ${event.ResourceProperties.DnEmailAddress}`, '', '[ extensions ]', `extendedKeyUsage = ${event.ResourceProperties.ExtendedKeyUsage}`, `keyUsage = ${event.ResourceProperties.KeyUsage}`, 'subjectKeyIdentifier = hash', ].join('\n'), { encoding: 'utf8' }); return file; } async function _retrievePrivateKey(event, dir) { const file = path.join(dir, 'private_key.pem'); const secret = await secretsManager.getSecretValue({ SecretId: event.ResourceProperties.PrivateKeySecretId, VersionStage: 'AWSCURRENT', }); await writeFile(file, secret.SecretString, { encoding: 'utf8' }); return file; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtc2lnbmluZy1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2VydGlmaWNhdGUtc2lnbmluZy1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwyQ0FBNkI7QUFDN0IsNkRBQTZEO0FBQzdELGtEQUF3QztBQUN4Qyw2REFBNkQ7QUFDN0QsNEVBQWlFO0FBRWpFLHdEQUEwQztBQUMxQyxpRUFBaUU7QUFDakUsaUNBQWtDO0FBRWxDLGlFQUFpRTtBQUNqRSxpQ0FBa0M7QUFFbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFL0MsTUFBTSxjQUFjLEdBQUcsSUFBSSx1Q0FBYyxFQUFFLENBQUM7QUFFNUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7QUFPekQsS0FBSyxVQUFVLFdBQVcsQ0FBQyxLQUFnQixFQUFFLFFBQXdCO0lBQ25FLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtRQUNoRCxHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFO1lBQy9DLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsY0FBYyxFQUFFLElBQUk7WUFDcEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4Qix3QkFBd0IsRUFBRSxJQUFJO1lBQzlCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixRQUFRLEVBQUUsSUFBSTtZQUNkLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxRQUFRLEtBQUssQ0FBQyxXQUFXLEVBQUU7UUFDekIsS0FBSyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM1QixLQUFLLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUN6QixPQUFPLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNO1lBQzNCLG9EQUFvRDtZQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0tBQzNDO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSw0QkFBNEIsQ0FBQyxLQUFnQjtJQUMxRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUk7UUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUNqRCxNQUFNLEVBQUUsUUFBUSxFQUNoQixNQUFNLEVBQUUsT0FBTyxFQUNmLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUMzQyxNQUFNLEVBQUUsUUFBUSxFQUNoQixNQUFNLEVBQ04sVUFBVSxFQUFFLFFBQVEsRUFDcEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxCLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBRSxFQUFFLENBQUM7UUFDcEIsTUFBTSxVQUFVLEdBQVcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQztRQUNqRSxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDakIsTUFBTSxFQUFFLFVBQVU7WUFDbEIsR0FBRyxFQUFFLGlDQUFpQztZQUN0QyxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ25ELFdBQVcsRUFBRSx3QkFBd0I7U0FDdEMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLEdBQUcsRUFBRSw2QkFBNkI7WUFDbEMsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNwRCxXQUFXLEVBQUUsd0JBQXdCO1NBQ3RDLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxHQUFHLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtZQUM1QixHQUFHLEVBQUUsUUFBUSxVQUFVLGtDQUFrQztZQUN6RCxxQkFBcUIsRUFBRSxRQUFRLFVBQVUsOEJBQThCO1NBQ3hFLENBQUM7S0FDSDtZQUFTO1FBQ1IsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDdEI7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxLQUFnQixFQUFFLEdBQVc7SUFDekQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDMUMsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFO1FBQ3BCLFNBQVM7UUFDVCwrQkFBK0I7UUFDL0IsMkJBQTJCO1FBQzNCLDJCQUEyQjtRQUMzQixtQ0FBbUM7UUFDbkMsaUNBQWlDO1FBQ2pDLDRCQUE0QjtRQUM1QixFQUFFO1FBQ0YsUUFBUTtRQUNSLDBCQUEwQixLQUFLLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFO1FBQ2pFLDBCQUEwQixLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFO1FBQzlELDBCQUEwQixLQUFLLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUU7UUFDdEUsMEJBQTBCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUU7UUFDL0QsMEJBQTBCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRTtRQUN2RSwwQkFBMEIsS0FBSyxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixFQUFFO1FBQzdFLDBCQUEwQixLQUFLLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFO1FBQ25FLEVBQUU7UUFDRixnQkFBZ0I7UUFDaEIsMEJBQTBCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRTtRQUNyRSwwQkFBMEIsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtRQUM3RCw2QkFBNkI7S0FDOUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsS0FBZ0IsRUFBRSxHQUFXO0lBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDL0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsY0FBYyxDQUFDO1FBQ2pELFFBQVEsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCO1FBQ3JELFlBQVksRUFBRSxZQUFZO0tBQzNCLENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsWUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbEUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBTMyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBTZWNyZXRzTWFuYWdlciB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zZWNyZXRzLW1hbmFnZXInO1xuXG5pbXBvcnQgKiBhcyBjZm4gZnJvbSAnLi9fY2xvdWQtZm9ybWF0aW9uJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5pbXBvcnQgX2V4ZWMgPSByZXF1aXJlKCcuL19leGVjJyk7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnLi9fbGFtYmRhJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5pbXBvcnQgX3JtcmYgPSByZXF1aXJlKCcuL19ybXJmJyk7XG5cbmNvbnN0IG1rZHRlbXAgPSB1dGlsLnByb21pc2lmeShmcy5ta2R0ZW1wKTtcbmNvbnN0IHJlYWRGaWxlID0gdXRpbC5wcm9taXNpZnkoZnMucmVhZEZpbGUpO1xuY29uc3Qgd3JpdGVGaWxlID0gdXRpbC5wcm9taXNpZnkoZnMud3JpdGVGaWxlKTtcblxuY29uc3Qgc2VjcmV0c01hbmFnZXIgPSBuZXcgU2VjcmV0c01hbmFnZXIoKTtcblxuZXhwb3J0cy5oYW5kbGVyID0gY2ZuLmN1c3RvbVJlc291cmNlSGFuZGxlcihoYW5kbGVFdmVudCk7XG5cbmludGVyZmFjZSBSZXNvdXJjZUF0dHJpYnV0ZXMgZXh0ZW5kcyBjZm4uUmVzb3VyY2VBdHRyaWJ1dGVzIHtcbiAgQ1NSOiBzdHJpbmc7XG4gIFNlbGZTaWduZWRDZXJ0aWZpY2F0ZTogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudDogY2ZuLkV2ZW50LCBfY29udGV4dDogbGFtYmRhLkNvbnRleHQpOiBQcm9taXNlPGNmbi5SZXNvdXJjZUF0dHJpYnV0ZXM+IHtcbiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlICE9PSBjZm4uUmVxdWVzdFR5cGUuREVMRVRFKSB7XG4gICAgY2ZuLnZhbGlkYXRlUHJvcGVydGllcyhldmVudC5SZXNvdXJjZVByb3BlcnRpZXMsIHtcbiAgICAgIERuQ29tbW9uTmFtZTogdHJ1ZSxcbiAgICAgIERuQ291bnRyeTogdHJ1ZSxcbiAgICAgIERuRW1haWxBZGRyZXNzOiB0cnVlLFxuICAgICAgRG5Mb2NhbGl0eTogdHJ1ZSxcbiAgICAgIERuT3JnYW5pemF0aW9uTmFtZTogdHJ1ZSxcbiAgICAgIERuT3JnYW5pemF0aW9uYWxVbml0TmFtZTogdHJ1ZSxcbiAgICAgIERuU3RhdGVPclByb3ZpbmNlOiB0cnVlLFxuICAgICAgRXh0ZW5kZWRLZXlVc2FnZTogZmFsc2UsXG4gICAgICBLZXlVc2FnZTogdHJ1ZSxcbiAgICAgIFByaXZhdGVLZXlTZWNyZXRJZDogdHJ1ZSxcbiAgICAgIE91dHB1dEJ1Y2tldDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICBjYXNlIGNmbi5SZXF1ZXN0VHlwZS5DUkVBVEU6XG4gICAgY2FzZSBjZm4uUmVxdWVzdFR5cGUuVVBEQVRFOlxuICAgICAgcmV0dXJuIF9jcmVhdGVTZWxmU2lnbmVkQ2VydGlmaWNhdGUoZXZlbnQpO1xuICAgIGNhc2UgY2ZuLlJlcXVlc3RUeXBlLkRFTEVURTpcbiAgICAvLyBOb3RoaW5nIHRvIGRvIC0gdGhpcyBpcyBub3QgYSBcIlBoeXNpY2FsXCIgcmVzb3VyY2VcbiAgICAgIHJldHVybiB7IFJlZjogZXZlbnQuTG9naWNhbFJlc291cmNlSWQgfTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfY3JlYXRlU2VsZlNpZ25lZENlcnRpZmljYXRlKGV2ZW50OiBjZm4uRXZlbnQpOiBQcm9taXNlPFJlc291cmNlQXR0cmlidXRlcz4ge1xuICBjb25zdCB0ZW1wRGlyID0gYXdhaXQgbWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksICd4NTA5Q1NSLScpKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gYXdhaXQgX21ha2VDc3JDb25maWcoZXZlbnQsIHRlbXBEaXIpO1xuICAgIGNvbnN0IHBrZXlGaWxlID0gYXdhaXQgX3JldHJpZXZlUHJpdmF0ZUtleShldmVudCwgdGVtcERpcik7XG4gICAgY29uc3QgY3NyRmlsZSA9IHBhdGguam9pbih0ZW1wRGlyLCAnY3NyLnBlbScpO1xuICAgIGF3YWl0IF9leGVjKCdvcGVuc3NsJywgJ3JlcScsICctY29uZmlnJywgY29uZmlnRmlsZSxcbiAgICAgICcta2V5JywgcGtleUZpbGUsXG4gICAgICAnLW91dCcsIGNzckZpbGUsXG4gICAgICAnLW5ldycpO1xuICAgIGNvbnN0IGNlcnRGaWxlID0gcGF0aC5qb2luKHRlbXBEaXIsICdjZXJ0LnBlbScpO1xuICAgIGF3YWl0IF9leGVjKCdvcGVuc3NsJywgJ3g1MDknLCAnLWluJywgY3NyRmlsZSxcbiAgICAgICctb3V0JywgY2VydEZpbGUsXG4gICAgICAnLXJlcScsXG4gICAgICAnLXNpZ25rZXknLCBwa2V5RmlsZSxcbiAgICAgICctZGF5cycsICczNjUnKTtcblxuICAgIGNvbnN0IHMzID0gbmV3IFMzKCk7XG4gICAgY29uc3QgYnVja2V0TmFtZTogc3RyaW5nID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLk91dHB1dEJ1Y2tldDtcbiAgICBhd2FpdCBzMy5wdXRPYmplY3Qoe1xuICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgS2V5OiAnY2VydGlmaWNhdGUtc2lnbmluZy1yZXF1ZXN0LnBlbScsXG4gICAgICBCb2R5OiBhd2FpdCByZWFkRmlsZShjc3JGaWxlLCB7IGVuY29kaW5nOiAndXRmOCcgfSksXG4gICAgICBDb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gtcGVtLWZpbGUnLFxuICAgIH0pO1xuICAgIGF3YWl0IHMzLnB1dE9iamVjdCh7XG4gICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICBLZXk6ICdzZWxmLXNpZ25lZC1jZXJ0aWZpY2F0ZS5wZW0nLFxuICAgICAgQm9keTogYXdhaXQgcmVhZEZpbGUoY2VydEZpbGUsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KSxcbiAgICAgIENvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veC1wZW0tZmlsZScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgUmVmOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICAgIENTUjogYHMzOi8vJHtidWNrZXROYW1lfS9jZXJ0aWZpY2F0ZS1zaWduaW5nLXJlcXVlc3QucGVtYCxcbiAgICAgIFNlbGZTaWduZWRDZXJ0aWZpY2F0ZTogYHMzOi8vJHtidWNrZXROYW1lfS9zZWxmLXNpZ25lZC1jZXJ0aWZpY2F0ZS5wZW1gLFxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgX3JtcmYodGVtcERpcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX21ha2VDc3JDb25maWcoZXZlbnQ6IGNmbi5FdmVudCwgZGlyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlID0gcGF0aC5qb2luKGRpciwgJ2Nzci5jb25maWcnKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGZpbGUsIFtcbiAgICAnWyByZXEgXScsXG4gICAgJ2RlZmF1bHRfbWQgICAgICAgICAgID0gc2hhMjU2JyxcbiAgICAnZGlzdGluZ3Vpc2hlZF9uYW1lICAgPSBkbicsXG4gICAgJ3Byb21wdCAgICAgICAgICAgICAgID0gbm8nLFxuICAgICdyZXFfZXh0ZW5zaW9ucyAgICAgICA9IGV4dGVuc2lvbnMnLFxuICAgICdzdHJpbmdfbWFzayAgICAgICAgICA9IHV0Zjhvbmx5JyxcbiAgICAndXRmOCAgICAgICAgICAgICAgICAgPSB5ZXMnLFxuICAgICcnLFxuICAgICdbIGRuIF0nLFxuICAgIGBDTiAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuQ29tbW9uTmFtZX1gLFxuICAgIGBDICAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuQ291bnRyeX1gLFxuICAgIGBTVCAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuU3RhdGVPclByb3ZpbmNlfWAsXG4gICAgYEwgICAgICAgICAgICAgICAgICAgID0gJHtldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuRG5Mb2NhbGl0eX1gLFxuICAgIGBPICAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuT3JnYW5pemF0aW9uTmFtZX1gLFxuICAgIGBPVSAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuT3JnYW5pemF0aW9uYWxVbml0TmFtZX1gLFxuICAgIGBlbWFpbEFkZHJlc3MgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuRW1haWxBZGRyZXNzfWAsXG4gICAgJycsXG4gICAgJ1sgZXh0ZW5zaW9ucyBdJyxcbiAgICBgZXh0ZW5kZWRLZXlVc2FnZSAgICAgPSAke2V2ZW50LlJlc291cmNlUHJvcGVydGllcy5FeHRlbmRlZEtleVVzYWdlfWAsXG4gICAgYGtleVVzYWdlICAgICAgICAgICAgID0gJHtldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuS2V5VXNhZ2V9YCxcbiAgICAnc3ViamVjdEtleUlkZW50aWZpZXIgPSBoYXNoJyxcbiAgXS5qb2luKCdcXG4nKSwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICByZXR1cm4gZmlsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JldHJpZXZlUHJpdmF0ZUtleShldmVudDogY2ZuLkV2ZW50LCBkaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGUgPSBwYXRoLmpvaW4oZGlyLCAncHJpdmF0ZV9rZXkucGVtJyk7XG4gIGNvbnN0IHNlY3JldCA9IGF3YWl0IHNlY3JldHNNYW5hZ2VyLmdldFNlY3JldFZhbHVlKHtcbiAgICBTZWNyZXRJZDogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlByaXZhdGVLZXlTZWNyZXRJZCxcbiAgICBWZXJzaW9uU3RhZ2U6ICdBV1NDVVJSRU5UJyxcbiAgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShmaWxlLCBzZWNyZXQuU2VjcmV0U3RyaW5nISwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICByZXR1cm4gZmlsZTtcbn1cbiJdfQ==