136 lines
19 KiB
JavaScript
136 lines
19 KiB
JavaScript
"use strict";
|
|
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 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;
|
|
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);
|
|
return { assembly, lock: await writerLock.convertToReaderLock() };
|
|
}
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvQkEsa0NBbUhDO0FBS0Qsd0NBY0M7QUExSkQsNkJBQTZCO0FBQzdCLCtCQUE4QjtBQUM5QixvRUFBNEQ7QUFDNUQsMkRBQTJEO0FBQzNELHlDQUF5QztBQUN6QyxzREFBb0Q7QUFDcEQsK0JBQStCO0FBRy9CLGdDQUFnSjtBQUVoSixrRUFBMEU7QUFDMUUsNENBQStDO0FBTy9DLDJEQUEyRDtBQUNwRCxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQWdCLEVBQUUsUUFBa0IsRUFBRSxNQUFxQjtJQUMzRixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUQsSUFBSSxTQUE2QixDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFHLElBQUEsaUNBQTJCLEVBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTVELE1BQU0sT0FBTyxHQUFHO1FBQ2QsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUc7UUFDckIsR0FBRyxNQUFNLENBQUMsT0FBTztLQUNsQixDQUFDO0lBQ0YsTUFBTSxPQUFPLENBQUMsSUFBQSxhQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFM0MsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUEyQixXQUFXLENBQUM7UUFDOUMsaURBQWlEO1FBQ2pELEdBQUcsTUFBTSxJQUFBLCtCQUF5QixFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7UUFDaEQsOENBQThDO1FBQzlDLEdBQUcsTUFBTSxD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aEIsTUFBTSxPQUFPLENBQUMsbUJBQW1CLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxNQUFjO0lBQzNDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxrQ0FBYSxDQUFDLE1BQU0sRUFBRTtZQUMvQix1QkFBdUI7WUFDdkIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3RELHlDQUF5QztZQUN6QyxtQ0FBbUM7WUFDbkMsTUFBTSxJQUFJLDBCQUFZLENBQUMsb0JBQW9CLEVBQUUsaUlBQWlJLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2xNLENBQUM7UUFDRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUksRUFBcUI7SUFDM0MsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBUSxDQUFDO0FBQzNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBDbG91ZEFzc2VtYmx5IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCAqIGFzIGN4c2NoZW1hIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHR5cGUgeyBJb0hlbHBlciB9IGZyb20gJy4uLy4uL2xpYi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IFNka1Byb3ZpZGVyLCBJUmVhZExvY2sgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHsgUldMb2NrLCBndWVzc0V4ZWN1dGFibGUsIHByZXBhcmVEZWZhdWx0RW52aXJvbm1lbnQsIHdyaXRlQ29udGV4dFRvRW52LCBzeW50aFBhcmFtZXRlcnNGcm9tU2V0dGluZ3MsIGV4ZWNJbkNoaWxkUHJvY2VzcyB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jbGkvdXNlci1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFBST0pFQ1RfQ09ORklHLCBVU0VSX0RFRkFVTFRTIH0gZnJvbSAnLi4vY2xpL3VzZXItY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyB2ZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vY2xpL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNQcm9ncmFtUmVzdWx0IHtcbiAgcmVhZG9ubHkgYXNzZW1ibHk6IENsb3VkQXNzZW1ibHk7XG4gIHJlYWRvbmx5IGxvY2s6IElSZWFkTG9jaztcbn1cblxuLyoqIEludm9rZXMgdGhlIGNsb3VkIGV4ZWN1dGFibGUgYW5kIHJldHVybnMgSlNPTiBvdXRwdXQgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjUHJvZ3JhbShhd3M6IFNka1Byb3ZpZGVyLCBpb0hlbHBlcjogSW9IZWxwZXIsIGNvbmZpZzogQ29uZmlndXJhdGlvbik6IFByb21pc2U8RXhlY1Byb2dyYW1SZXN1bHQ+IHtcbiAgY29uc3QgZGVidWdGbiA9IChtc2c6IHN0cmluZykgPT4gaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcobXNnKTtcbiAgbGV0IGVycm9yRmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHBhcmFtcyA9IHN5bnRoUGFyYW1ldGVyc0Zyb21TZXR0aW5ncyhjb25maWcuc2V0dGluZ3MpO1xuXG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgLi4uY29uZmlnLmNvbnRleHQuYWxsLFxuICAgIC4uLnBhcmFtcy5jb250ZXh0LFxuICB9O1xuICBhd2FpdCBkZWJ1Z0ZuKGZvcm1hdCgnY29udGV4dDonLCBjb250ZXh0KSk7XG5cbiAgaWYgKHBhcmFtcy5lbnYuQ0RLX0RFQlVHID09PSAndHJ1ZScpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCfwn5SNIFN5bnRoZXNpemluZyB3aXRoIGRlYnVnIGluZm9ybWF0aW9uLiBUaGlzIG1heSB0YWtlIGEgYml0IGxvbmdlci4nKTtcbiAgfVxuXG4gIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IG5vVW5kZWZpbmVkKHtcbiAgICAvLyBWZXJzaW9uaW5nLCBvdXRkaXIsIGRlZmF1bHQgYWNjb3VudCBhbmQgcmVnaW9uXG4gICAgLi4uYXdhaXQgcHJlcGFyZURlZmF1bHRFbnZpcm9ubWVudChhd3MsIGRlYnVnRm4pLFxuICAgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBkZXJpdmVkIGZyb20gc2V0dGluZ3NcbiAgICAuLi5wYXJhbXMuZW52LFxuICB9KTtcblxuICBjb25zdCBidWlsZCA9IGNvbmZpZy5zZXR0aW5ncy5nZXQoWydidWlsZCddKTtcbiAgaWYgKGJ1aWxkKSB7XG4gICAgYXdhaXQgZXhlYyhidWlsZCk7XG4gIH1cblxuICBsZXQgYXBwID0gY29uZmlnLnNldHRpbmdzLmdldChbJ2FwcCddKTtcbiAgaWYgKCFhcHApIHtcbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBcHBSZXF1aXJlZCcsIGAtLWFwcCBpcyByZXF1aXJlZCBlaXRoZXIgaW4gY29tbWFuZC1saW5lLCBpbiAke1BST0pFQ1RfQ09ORklHfSBvciBpbiAke1VTRVJfREVGQVVMVFN9YCk7XG4gIH1cblxuICAvLyBieXBhc3MgXCJzeW50aFwiIGlmIGFwcCBwb2ludHMgdG8gYSBjbG91ZCBhc3NlbWJseVxuICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhhcHApICYmIChhd2FpdCBmcy5zdGF0KGFwcCkpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICBhd2FpdCBkZWJ1Z0ZuKCctLWFwcCBwb2ludHMgdG8gYSBjbG91ZCBhc3NlbWJseSwgc28gd2UgYnlwYXNzIHN5bnRoJyk7XG5cbiAgICAvLyBBY3F1aXJlIGEgcmVhZCBsb2NrIG9uIHRoaXMgZGlyZWN0b3J5XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IG5ldyBSV0xvY2soYXBwKS5hY3F1aXJlUmVhZCgpO1xuXG4gICAgcmV0dXJuIHsgYXNzZW1ibHk6IGNyZWF0ZUFzc2VtYmx5KGFwcCksIGxvY2sgfTtcbiAgfVxuXG4gIC8vIFRyYWRpdGlvbmFsbHkgaXQgaGFzIGJlZW4gcG9zc2libGUsIHRob3VnaCBub3Qgd2lkZWx5IGFkdmVydGlzZWQsIHRvIHB1dCBhIHN0cmluZ1tdIGludG8gYGNkay5qc29uYC5cbiAgLy8gSG93ZXZlciwgd2Ugd291bGQganVzdCBxdWlja2x5IGpvaW4gdGhpcyBhcnJheSBiYWNrIHVwIHRvIHN0cmluZyB3aXRoIHNwYWNlcyAodW5xdW90ZWQgZXZlbiEpIGFuZCBwcm9jZWVkIGFzIHVzdWFsLFxuICAvLyB0aGVyZWJ5IGxvc2luZyBhbGwgdGhlIGJlbmVmaXRzIG9mIGEgcHJlLXNlZ21lbnRlZCBjb21tYW5kIGxpbmUuIFRoaXMgY29lcmNpb24gaXMganVzdCBoZXJlIGZvciBiYWNrd2FyZHNcbiAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb25zLiBBbiB1cGNvbWluZyBQUiBtaWdodCByZXRhaW4gdGhlIGJlbmVmaXQgb2YgdGhlIHN0cmluZ1tdLlxuICBpZiAoQXJyYXkuaXNBcnJheShhcHApKSB7XG4gICAgYXBwID0gYXBwLmpvaW4oJyAnKTtcbiAgfVxuICBjb25zdCBjb21tYW5kTGluZSA9IGF3YWl0IGd1ZXNzRXhlY3V0YWJsZShhcHAsIGRlYnVnRm4pO1xuXG4gIGNvbnN0IG91dGRpciA9IGNvbmZpZy5zZXR0aW5ncy5nZXQoWydvdXRwdXQnXSk7XG4gIGlmICghb3V0ZGlyKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignT3V0cHV0UmVxdWlyZWQnLCAndW5leHBlY3RlZDogLS1vdXRwdXQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAodHlwZW9mIG91dGRpciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdPdXRwdXROb3RTdHJpbmcnLCBgLS1vdXRwdXQgdGFrZXMgYSBzdHJpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KG91dGRpcil9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ta2RpcnAob3V0ZGlyKTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ091dHB1dERpckNyZWF0ZUZhaWxlZCcsIGBDb3VsZCBub3QgY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgJHtvdXRkaXJ9ICgke2Vycm9yLm1lc3NhZ2V9KWApO1xuICB9XG5cbiAgYXdhaXQgZGVidWdGbihgb3V0ZGlyOiAke291dGRpcn1gKTtcblxuICBlbnZbY3hhcGkuT1VURElSX0VOVl0gPSBvdXRkaXI7XG5cbiAgLy8gU2VuZCB2ZXJzaW9uIGluZm9ybWF0aW9uXG4gIGVudltjeGFwaS5DTElfQVNNX1ZFUlNJT05fRU5WXSA9IGN4c2NoZW1hLk1hbmlmZXN0LnZlcnNpb24oKTtcbiAgZW52W2N4YXBpLkNMSV9WRVJTSU9OX0VOVl0gPSB2ZXJzaW9uTnVtYmVyKCk7XG5cbiAgLy8gQWNxdWlyZSBhIGxvY2sgb24gdGhlIG91dHB1dCBkaXJlY3RvcnlcbiAgY29uc3Qgd3JpdGVyTG9jayA9IGF3YWl0IG5ldyBSV0xvY2sob3V0ZGlyKS5hY3F1aXJlV3JpdGUoKTtcblxuICAvLyBQcmVwYXJlIGFuIGVycm9yRmlsZSBsb2NhdGlvblxuICBlcnJvckZpbGUgPSBwYXRoLmpvaW4ob3V0ZGlyLCAnZXJyb3IudHh0Jyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKGVycm9yRmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgZW52LkNES19FUlJPUl9GSUxFID0gZXJyb3JGaWxlO1xuXG4gIGF3YWl0IGRlYnVnRm4oZm9ybWF0KCdlbnY6JywgZW52KSk7XG5cbiAgY29uc3QgY2xlYW51cFRlbXAgPSB3cml0ZUNvbnRleHRUb0VudihlbnYsIGNvbnRleHQsICdhZGQtcHJvY2Vzcy1lbnYtbGF0ZXInKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKGNvbW1hbmRMaW5lKTtcblxuICAgIGNvbnN0IGFzc2VtYmx5ID0gY3JlYXRlQXNzZW1ibHkob3V0ZGlyKTtcblxuICAgIHJldHVybiB7IGFzc2VtYmx5LCBsb2NrOiBhd2FpdCB3cml0ZXJMb2NrLmNvbnZlcnRUb1JlYWRlckxvY2soKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgYXdhaXQgd3JpdGVyTG9jay5yZWxlYXNlKCk7XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBjbGVhbnVwVGVtcCgpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZXhlYyhjb21tYW5kQW5kQXJnczogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjSW5DaGlsZFByb2Nlc3MoY29tbWFuZEFuZEFyZ3MsIHtcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgLi4uZW52LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvckNvZGVGaWxlOiBlcnJvckZpbGUsXG5cbiAgICAgICAgLy8gTm90IGNhcHR1cmluZyB0aGUgc3Rkb3V0L3N0ZGVyciBvZiB0aGUgQ0RLIGFwcC4gSXQgbXVzdCByZW1haW4gYXR0YWNoZWQgdG8gYSB0ZXJtaW5hbFxuICAgICAgICAvLyBpZiB0aGUgcGFyZW50IHByb2Nlc3MgaXMgYXR0YWNoZWQgdG8gYSB0ZXJtaW5hbC5cbiAgICAgICAgY2FwdHVyZU91dHB1dDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGF3YWl0IGRlYnVnRm4oYGZhaWxlZCBjb21tYW5kOiAke2NvbW1hbmRBbmRBcmdzfWApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFzc2VtYmx5IHdpdGggZXJyb3IgaGFuZGxpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFzc2VtYmx5KGFwcERpcjogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBDbG91ZEFzc2VtYmx5KGFwcERpciwge1xuICAgICAgLy8gV2Ugc29ydCBhcyB3ZSBkZXBsb3lcbiAgICAgIHRvcG9Tb3J0OiBmYWxzZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKGN4c2NoZW1hLlZFUlNJT05fTUlTTUFUQ0gpKSB7XG4gICAgICAvLyB0aGlzIG1lYW5zIHRoZSBDTEkgdmVyc2lvbiBpcyB0b28gb2xkLlxuICAgICAgLy8gd2UgaW5zdHJ1Y3QgdGhlIHVzZXIgdG8gdXBncmFkZS5cbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NsaVZlcnNpb25NaXNtYXRjaCcsIGBUaGlzIENESyBDTEkgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgQ0RLIGxpYnJhcnkgdXNlZCBieSB5b3VyIGFwcGxpY2F0aW9uLiBQbGVhc2UgdXBncmFkZSB0aGUgQ0xJIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cXG4oJHtlcnJvci5tZXNzYWdlfSlgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9VbmRlZmluZWQ8QT4oeHM6IFJlY29yZDxzdHJpbmcsIEE+KTogUmVjb3JkPHN0cmluZywgTm9uTnVsbGFibGU8QT4+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh4cykuZmlsdGVyKChbXywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCkpIGFzIGFueTtcbn1cbiJdfQ==
|