aws-cdk
Version:
AWS CDK CLI, the command line tool for CDK apps
146 lines • 21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.execProgram = execProgram;
exports.createAssembly = createAssembly;
const path = require("path");
const util_1 = require("util");
const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api");
const cxschema = require("@aws-cdk/cloud-assembly-schema");
const cxapi = require("@aws-cdk/cx-api");
const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
const fs = require("fs-extra");
const api_1 = require("../api");
const user_configuration_1 = require("../cli/user-configuration");
const fs_util_1 = require("../cli/util/fs-util");
const version_1 = require("../cli/version");
/** Invokes the cloud executable and returns JSON output */
async function execProgram(aws, ioHelper, config) {
const debugFn = (msg) => ioHelper.defaults.debug(msg);
let errorFile;
const params = (0, api_1.synthParametersFromSettings)(config.settings);
const context = {
...config.context.all,
...params.context,
};
await debugFn((0, util_1.format)('context:', context));
if (params.env.CDK_DEBUG === 'true') {
await ioHelper.defaults.info('🔍 Synthesizing with debug information. This may take a bit longer.');
}
const env = noUndefined({
// Versioning, outdir, default account and region
...await (0, api_1.prepareDefaultEnvironment)(aws, debugFn),
// Environment variables derived from settings
...params.env,
});
const build = config.settings.get(['build']);
if (build) {
await exec(build);
}
let app = config.settings.get(['app']);
if (!app) {
throw new toolkit_lib_1.ToolkitError('AppRequired', `--app is required either in command-line, in ${user_configuration_1.PROJECT_CONFIG} or in ${user_configuration_1.USER_DEFAULTS}`);
}
// bypass "synth" if app points to a cloud assembly
if (await fs.pathExists(app) && (await fs.stat(app)).isDirectory()) {
await debugFn('--app points to a cloud assembly, so we bypass synth');
// Acquire a read lock on this directory
const lock = await new api_1.RWLock(app).acquireRead();
return { assembly: createAssembly(app), lock };
}
// Traditionally it has been possible, though not widely advertised, to put a string[] into `cdk.json`.
// However, we would just quickly join this array back up to string with spaces (unquoted even!) and proceed as usual,
// thereby losing all the benefits of a pre-segmented command line. This coercion is just here for backwards
// compatibility with existing configurations. An upcoming PR might retain the benefit of the string[].
if (Array.isArray(app)) {
app = app.join(' ');
}
const commandLine = await (0, api_1.guessExecutable)(app, debugFn);
const outdir = config.settings.get(['output']);
if (!outdir) {
throw new toolkit_lib_1.ToolkitError('OutputRequired', 'unexpected: --output is required');
}
if (typeof outdir !== 'string') {
throw new toolkit_lib_1.ToolkitError('OutputNotString', `--output takes a string, got ${JSON.stringify(outdir)}`);
}
try {
await fs.mkdirp(outdir);
}
catch (error) {
throw new toolkit_lib_1.ToolkitError('OutputDirCreateFailed', `Could not create output directory ${outdir} (${error.message})`);
}
await debugFn(`outdir: ${outdir}`);
env[cxapi.OUTDIR_ENV] = outdir;
// Send version information
env[cxapi.CLI_ASM_VERSION_ENV] = cxschema.Manifest.version();
env[cxapi.CLI_VERSION_ENV] = (0, version_1.versionNumber)();
// Acquire a lock on the output directory
const writerLock = await new api_1.RWLock(outdir).acquireWrite();
// Prepare an errorFile location
errorFile = path.join(outdir, 'error.txt');
await fs.promises.rm(errorFile, { force: true });
env.CDK_ERROR_FILE = errorFile;
// Prepare a performance counters location
const perfCountersFile = path.join(outdir, 'performance-counters.json');
await fs.promises.rm(perfCountersFile, { force: true });
env.CDK_PERF_COUNTERS_FILE = perfCountersFile;
await debugFn((0, util_1.format)('env:', env));
const cleanupTemp = (0, api_1.writeContextToEnv)(env, context, 'add-process-env-later');
try {
await exec(commandLine);
const assembly = createAssembly(outdir);
const perfCounters = await (0, fs_util_1.tryReadJson)(perfCountersFile);
return {
assembly,
lock: await writerLock.convertToReaderLock(),
perfCounters: typeof perfCounters === 'object' && typeof perfCounters.counters === 'object' ? perfCounters.counters : undefined,
};
}
catch (e) {
await writerLock.release();
throw e;
}
finally {
await cleanupTemp();
}
async function exec(commandAndArgs) {
try {
return await (0, api_1.execInChildProcess)(commandAndArgs, {
env: {
...process.env,
...env,
},
errorCodeFile: errorFile,
// Not capturing the stdout/stderr of the CDK app. It must remain attached to a terminal
// if the parent process is attached to a terminal.
captureOutput: false,
});
}
catch (e) {
await debugFn(`failed command: ${commandAndArgs}`);
throw e;
}
}
}
/**
* Creates an assembly with error handling
*/
function createAssembly(appDir) {
try {
return new cloud_assembly_api_1.CloudAssembly(appDir, {
// We sort as we deploy
topoSort: false,
});
}
catch (error) {
if (error.message.includes(cxschema.VERSION_MISMATCH)) {
// this means the CLI version is too old.
// we instruct the user to upgrade.
throw new toolkit_lib_1.ToolkitError('CliVersionMismatch', `This CDK CLI is not compatible with the CDK library used by your application. Please upgrade the CLI to the latest version.\n(${error.message})`);
}
throw error;
}
}
function noUndefined(xs) {
return Object.fromEntries(Object.entries(xs).filter(([_, v]) => v !== undefined));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFzQkEsa0NBOEhDO0FBS0Qsd0NBY0M7QUF2S0QsNkJBQTZCO0FBQzdCLCtCQUE4QjtBQUM5QixvRUFBNEQ7QUFDNUQsMkRBQTJEO0FBQzNELHlDQUF5QztBQUN6QyxzREFBb0Q7QUFDcEQsK0JBQStCO0FBRy9CLGdDQUFnSjtBQUVoSixrRUFBMEU7QUFDMUUsaURBQWtEO0FBQ2xELDRDQUErQztBQVEvQywyREFBMkQ7QUFDcEQsS0FBSyxVQUFVLFdBQVcsQ0FBQyxHQUFnQixFQUFFLFFBQWtCLEVBQUUsTUFBcUI7SUFDM0YsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlELElBQUksU0FBNkIsQ0FBQztJQUVsQyxNQUFNLE1BQU0sR0FBRyxJQUFBLGlDQUEyQixFQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU1RCxNQUFNLE9BQU8sR0FBRztRQUNkLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHO1FBQ3JCLEdBQUcsTUFBTSxDQUFDLE9BQU87S0FDbEIsQ0FBQztJQUNGLE1BQU0sT0FBTyxDQUFDLElBQUEsYUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRTNDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDcEMsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBMkIsV0FBVyxDQUFDO1FBQzlDLGlEQUFpRDtRQUNqRCxHQUFHLE1BQU0sSUFBQSwrQkFBeUIsRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO1FBQ2hELDhDQUE4QztRQUM5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QztBQUVELFNBQVMsV0FBVyxDQUFJLEVBQXFCO0lBQzNDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQVEsQ0FBQztBQUMzRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgQ2xvdWRBc3NlbWJseSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgKiBhcyBjeHNjaGVtYSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi8uLi9saWIvYXBpLXByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBTZGtQcm92aWRlciwgSVJlYWRMb2NrIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IFJXTG9jaywgZ3Vlc3NFeGVjdXRhYmxlLCBwcmVwYXJlRGVmYXVsdEVudmlyb25tZW50LCB3cml0ZUNvbnRleHRUb0Vudiwgc3ludGhQYXJhbWV0ZXJzRnJvbVNldHRpbmdzLCBleGVjSW5DaGlsZFByb2Nlc3MgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vY2xpL3VzZXItY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBQUk9KRUNUX0NPTkZJRywgVVNFUl9ERUZBVUxUUyB9IGZyb20gJy4uL2NsaS91c2VyLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgdHJ5UmVhZEpzb24gfSBmcm9tICcuLi9jbGkvdXRpbC9mcy11dGlsJztcbmltcG9ydCB7IHZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9jbGkvdmVyc2lvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1Byb2dyYW1SZXN1bHQge1xuICByZWFkb25seSBhc3NlbWJseTogQ2xvdWRBc3NlbWJseTtcbiAgcmVhZG9ubHkgbG9jazogSVJlYWRMb2NrO1xuICByZWFkb25seSBwZXJmQ291bnRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xufVxuXG4vKiogSW52b2tlcyB0aGUgY2xvdWQgZXhlY3V0YWJsZSBhbmQgcmV0dXJucyBKU09OIG91dHB1dCAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWNQcm9ncmFtKGF3czogU2RrUHJvdmlkZXIsIGlvSGVscGVyOiBJb0hlbHBlciwgY29uZmlnOiBDb25maWd1cmF0aW9uKTogUHJvbWlzZTxFeGVjUHJvZ3JhbVJlc3VsdD4ge1xuICBjb25zdCBkZWJ1Z0ZuID0gKG1zZzogc3RyaW5nKSA9PiBpb0hlbHBlci5kZWZhdWx0cy5kZWJ1Zyhtc2cpO1xuICBsZXQgZXJyb3JGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcGFyYW1zID0gc3ludGhQYXJhbWV0ZXJzRnJvbVNldHRpbmdzKGNvbmZpZy5zZXR0aW5ncyk7XG5cbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICAuLi5jb25maWcuY29udGV4dC5hbGwsXG4gICAgLi4ucGFyYW1zLmNvbnRleHQsXG4gIH07XG4gIGF3YWl0IGRlYnVnRm4oZm9ybWF0KCdjb250ZXh0OicsIGNvbnRleHQpKTtcblxuICBpZiAocGFyYW1zLmVudi5DREtfREVCVUcgPT09ICd0cnVlJykge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ/CflI0gU3ludGhlc2l6aW5nIHdpdGggZGVidWcgaW5mb3JtYXRpb24uIFRoaXMgbWF5IHRha2UgYSBiaXQgbG9uZ2VyLicpO1xuICB9XG5cbiAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gbm9VbmRlZmluZWQoe1xuICAgIC8vIFZlcnNpb25pbmcsIG91dGRpciwgZGVmYXVsdCBhY2NvdW50IGFuZCByZWdpb25cbiAgICAuLi5hd2FpdCBwcmVwYXJlRGVmYXVsdEVudmlyb25tZW50KGF3cywgZGVidWdGbiksXG4gICAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGRlcml2ZWQgZnJvbSBzZXR0aW5nc1xuICAgIC4uLnBhcmFtcy5lbnYsXG4gIH0pO1xuXG4gIGNvbnN0IGJ1aWxkID0gY29uZmlnLnNldHRpbmdzLmdldChbJ2J1aWxkJ10pO1xuICBpZiAoYnVpbGQpIHtcbiAgICBhd2FpdCBleGVjKGJ1aWxkKTtcbiAgfVxuXG4gIGxldCBhcHAgPSBjb25maWcuc2V0dGluZ3MuZ2V0KFsnYXBwJ10pO1xuICBpZiAoIWFwcCkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0FwcFJlcXVpcmVkJywgYC0tYXBwIGlzIHJlcXVpcmVkIGVpdGhlciBpbiBjb21tYW5kLWxpbmUsIGluICR7UFJPSkVDVF9DT05GSUd9IG9yIGluICR7VVNFUl9ERUZBVUxUU31gKTtcbiAgfVxuXG4gIC8vIGJ5cGFzcyBcInN5bnRoXCIgaWYgYXBwIHBvaW50cyB0byBhIGNsb3VkIGFzc2VtYmx5XG4gIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGFwcCkgJiYgKGF3YWl0IGZzLnN0YXQoYXBwKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIGF3YWl0IGRlYnVnRm4oJy0tYXBwIHBvaW50cyB0byBhIGNsb3VkIGFzc2VtYmx5LCBzbyB3ZSBieXBhc3Mgc3ludGgnKTtcblxuICAgIC8vIEFjcXVpcmUgYSByZWFkIGxvY2sgb24gdGhpcyBkaXJlY3RvcnlcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgbmV3IFJXTG9jayhhcHApLmFjcXVpcmVSZWFkKCk7XG5cbiAgICByZXR1cm4geyBhc3NlbWJseTogY3JlYXRlQXNzZW1ibHkoYXBwKSwgbG9jayB9O1xuICB9XG5cbiAgLy8gVHJhZGl0aW9uYWxseSBpdCBoYXMgYmVlbiBwb3NzaWJsZSwgdGhvdWdoIG5vdCB3aWRlbHkgYWR2ZXJ0aXNlZCwgdG8gcHV0IGEgc3RyaW5nW10gaW50byBgY2RrLmpzb25gLlxuICAvLyBIb3dldmVyLCB3ZSB3b3VsZCBqdXN0IHF1aWNrbHkgam9pbiB0aGlzIGFycmF5IGJhY2sgdXAgdG8gc3RyaW5nIHdpdGggc3BhY2VzICh1bnF1b3RlZCBldmVuISkgYW5kIHByb2NlZWQgYXMgdXN1YWwsXG4gIC8vIHRoZXJlYnkgbG9zaW5nIGFsbCB0aGUgYmVuZWZpdHMgb2YgYSBwcmUtc2VnbWVudGVkIGNvbW1hbmQgbGluZS4gVGhpcyBjb2VyY2lvbiBpcyBqdXN0IGhlcmUgZm9yIGJhY2t3YXJkc1xuICAvLyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29uZmlndXJhdGlvbnMuIEFuIHVwY29taW5nIFBSIG1pZ2h0IHJldGFpbiB0aGUgYmVuZWZpdCBvZiB0aGUgc3RyaW5nW10uXG4gIGlmIChBcnJheS5pc0FycmF5KGFwcCkpIHtcbiAgICBhcHAgPSBhcHAuam9pbignICcpO1xuICB9XG4gIGNvbnN0IGNvbW1hbmRMaW5lID0gYXdhaXQgZ3Vlc3NFeGVjdXRhYmxlKGFwcCwgZGVidWdGbik7XG5cbiAgY29uc3Qgb3V0ZGlyID0gY29uZmlnLnNldHRpbmdzLmdldChbJ291dHB1dCddKTtcbiAgaWYgKCFvdXRkaXIpIHtcbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdPdXRwdXRSZXF1aXJlZCcsICd1bmV4cGVjdGVkOiAtLW91dHB1dCBpcyByZXF1aXJlZCcpO1xuICB9XG4gIGlmICh0eXBlb2Ygb3V0ZGlyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ091dHB1dE5vdFN0cmluZycsIGAtLW91dHB1dCB0YWtlcyBhIHN0cmluZywgZ290ICR7SlNPTi5zdHJpbmdpZnkob3V0ZGlyKX1gKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGZzLm1rZGlycChvdXRkaXIpO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignT3V0cHV0RGlyQ3JlYXRlRmFpbGVkJywgYENvdWxkIG5vdCBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSAke291dGRpcn0gKCR7ZXJyb3IubWVzc2FnZX0pYCk7XG4gIH1cblxuICBhd2FpdCBkZWJ1Z0ZuKGBvdXRkaXI6ICR7b3V0ZGlyfWApO1xuXG4gIGVudltjeGFwaS5PVVRESVJfRU5WXSA9IG91dGRpcjtcblxuICAvLyBTZW5kIHZlcnNpb24gaW5mb3JtYXRpb25cbiAgZW52W2N4YXBpLkNMSV9BU01fVkVSU0lPTl9FTlZdID0gY3hzY2hlbWEuTWFuaWZlc3QudmVyc2lvbigpO1xuICBlbnZbY3hhcGkuQ0xJX1ZFUlNJT05fRU5WXSA9IHZlcnNpb25OdW1iZXIoKTtcblxuICAvLyBBY3F1aXJlIGEgbG9jayBvbiB0aGUgb3V0cHV0IGRpcmVjdG9yeVxuICBjb25zdCB3cml0ZXJMb2NrID0gYXdhaXQgbmV3IFJXTG9jayhvdXRkaXIpLmFjcXVpcmVXcml0ZSgpO1xuXG4gIC8vIFByZXBhcmUgYW4gZXJyb3JGaWxlIGxvY2F0aW9uXG4gIGVycm9yRmlsZSA9IHBhdGguam9pbihvdXRkaXIsICdlcnJvci50eHQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0oZXJyb3JGaWxlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBlbnYuQ0RLX0VSUk9SX0ZJTEUgPSBlcnJvckZpbGU7XG5cbiAgLy8gUHJlcGFyZSBhIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGxvY2F0aW9uXG4gIGNvbnN0IHBlcmZDb3VudGVyc0ZpbGUgPSBwYXRoLmpvaW4ob3V0ZGlyLCAncGVyZm9ybWFuY2UtY291bnRlcnMuanNvbicpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShwZXJmQ291bnRlcnNGaWxlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBlbnYuQ0RLX1BFUkZfQ09VTlRFUlNfRklMRSA9IHBlcmZDb3VudGVyc0ZpbGU7XG5cbiAgYXdhaXQgZGVidWdGbihmb3JtYXQoJ2VudjonLCBlbnYpKTtcblxuICBjb25zdCBjbGVhbnVwVGVtcCA9IHdyaXRlQ29udGV4dFRvRW52KGVudiwgY29udGV4dCwgJ2FkZC1wcm9jZXNzLWVudi1sYXRlcicpO1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoY29tbWFuZExpbmUpO1xuXG4gICAgY29uc3QgYXNzZW1ibHkgPSBjcmVhdGVBc3NlbWJseShvdXRkaXIpO1xuXG4gICAgY29uc3QgcGVyZkNvdW50ZXJzID0gYXdhaXQgdHJ5UmVhZEpzb24ocGVyZkNvdW50ZXJzRmlsZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXNzZW1ibHksXG4gICAgICBsb2NrOiBhd2FpdCB3cml0ZXJMb2NrLmNvbnZlcnRUb1JlYWRlckxvY2soKSxcbiAgICAgIHBlcmZDb3VudGVyczogdHlwZW9mIHBlcmZDb3VudGVycyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChwZXJmQ291bnRlcnMgYXMgYW55KS5jb3VudGVycyA9PT0gJ29iamVjdCcgPyAocGVyZkNvdW50ZXJzIGFzIGFueSkuY291bnRlcnMgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGF3YWl0IHdyaXRlckxvY2sucmVsZWFzZSgpO1xuICAgIHRocm93IGU7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgY2xlYW51cFRlbXAoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGV4ZWMoY29tbWFuZEFuZEFyZ3M6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY0luQ2hpbGRQcm9jZXNzKGNvbW1hbmRBbmRBcmdzLCB7XG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgIC4uLmVudixcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3JDb2RlRmlsZTogZXJyb3JGaWxlLFxuXG4gICAgICAgIC8vIE5vdCBjYXB0dXJpbmcgdGhlIHN0ZG91dC9zdGRlcnIgb2YgdGhlIENESyBhcHAuIEl0IG11c3QgcmVtYWluIGF0dGFjaGVkIHRvIGEgdGVybWluYWxcbiAgICAgICAgLy8gaWYgdGhlIHBhcmVudCBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGEgdGVybWluYWwuXG4gICAgICAgIGNhcHR1cmVPdXRwdXQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBhd2FpdCBkZWJ1Z0ZuKGBmYWlsZWQgY29tbWFuZDogJHtjb21tYW5kQW5kQXJnc31gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhc3NlbWJseSB3aXRoIGVycm9yIGhhbmRsaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBc3NlbWJseShhcHBEaXI6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgQ2xvdWRBc3NlbWJseShhcHBEaXIsIHtcbiAgICAgIC8vIFdlIHNvcnQgYXMgd2UgZGVwbG95XG4gICAgICB0b3BvU29ydDogZmFsc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhjeHNjaGVtYS5WRVJTSU9OX01JU01BVENIKSkge1xuICAgICAgLy8gdGhpcyBtZWFucyB0aGUgQ0xJIHZlcnNpb24gaXMgdG9vIG9sZC5cbiAgICAgIC8vIHdlIGluc3RydWN0IHRoZSB1c2VyIHRvIHVwZ3JhZGUuXG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdDbGlWZXJzaW9uTWlzbWF0Y2gnLCBgVGhpcyBDREsgQ0xJIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIENESyBsaWJyYXJ5IHVzZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4gUGxlYXNlIHVwZ3JhZGUgdGhlIENMSSB0byB0aGUgbGF0ZXN0IHZlcnNpb24uXFxuKCR7ZXJyb3IubWVzc2FnZX0pYCk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vVW5kZWZpbmVkPEE+KHhzOiBSZWNvcmQ8c3RyaW5nLCBBPik6IFJlY29yZDxzdHJpbmcsIE5vbk51bGxhYmxlPEE+PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoeHMpLmZpbHRlcigoW18sIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpKSBhcyBhbnk7XG59XG4iXX0=