aws-cdk
Version:
AWS CDK Toolkit CLI, the command line tool for CDK apps
164 lines • 24.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.contextHandler = contextHandler;
const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
const chalk_1 = __importDefault(require("chalk"));
// eslint-disable-next-line @typescript-eslint/no-require-imports
const picomatch = require("picomatch");
const tables_1 = require("../cli/tables");
const user_configuration_1 = require("../cli/user-configuration");
async function contextHandler(options) {
const ioHelper = options.ioHelper;
if (options.clear) {
options.context.clear();
await options.context.save(user_configuration_1.PROJECT_CONTEXT);
await ioHelper.defaults.info('All context values cleared.');
}
else if (options.reset) {
await invalidateContext(ioHelper, options.context, options.reset, options.force ?? false);
await options.context.save(user_configuration_1.PROJECT_CONTEXT);
}
else {
// List -- support '--json' flag
if (options.json) {
/* c8 ignore start */
const contextValues = options.context.all;
await ioHelper.defaults.result(JSON.stringify(contextValues, undefined, 2));
/* c8 ignore stop */
}
else {
await listContext(ioHelper, options.context, options.sourceFiles ?? []);
}
}
return 0;
}
async function listContext(ioHelper, context, sourceFiles) {
const keys = contextKeys(context);
if (keys.length === 0) {
await ioHelper.defaults.info('This CDK application does not have any saved context values yet.');
await ioHelper.defaults.info('');
await ioHelper.defaults.info('Context will automatically be saved when you synthesize CDK apps');
await ioHelper.defaults.info('that use environment context information like AZ information, VPCs,');
await ioHelper.defaults.info('SSM parameters, and so on.');
return;
}
// Print config by default
const data_out = [[chalk_1.default.green('#'), chalk_1.default.green('Key'), chalk_1.default.green('Value')]];
for (const [i, key] of keys) {
const jsonWithoutNewlines = JSON.stringify(context.all[key], undefined, 2).replace(/\s+/g, ' ');
data_out.push([i, key, jsonWithoutNewlines]);
}
if (sourceFiles.length > 0) {
await ioHelper.defaults.info('Context found in %s:', sourceFiles.map((f) => chalk_1.default.blue(f)).join(', '));
}
else {
await ioHelper.defaults.info('Context found:');
}
await ioHelper.defaults.info('');
await ioHelper.defaults.info((0, tables_1.renderTable)(data_out, process.stdout.columns));
// eslint-disable-next-line @stylistic/max-len
await ioHelper.defaults.info(`Run ${chalk_1.default.blue('cdk context --reset KEY_OR_NUMBER')} to remove a context key. It will be refreshed on the next CDK synthesis run.`);
}
async function invalidateContext(ioHelper, context, key, force) {
const i = parseInt(key, 10);
if (`${i}` === key) {
// was a number and we fully parsed it.
key = keyByNumber(context, i);
}
// Unset!
if (context.has(key)) {
context.unset(key);
// check if the value was actually unset.
if (!context.has(key)) {
await ioHelper.defaults.info('Context value %s reset. It will be refreshed on next synthesis', chalk_1.default.blue(key));
return;
}
// Value must be in readonly bag
await ioHelper.defaults.error('Only context values specified in %s can be reset through the CLI', chalk_1.default.blue(user_configuration_1.PROJECT_CONTEXT));
if (!force) {
throw new toolkit_lib_1.ToolkitError('ReadonlyContextKey', `Cannot reset readonly context value with key: ${key}`);
}
}
// check if value is expression matching keys
const matches = keysByExpression(context, key);
if (matches.length > 0) {
matches.forEach((match) => {
context.unset(match);
});
const { unset, readonly } = getUnsetAndReadonly(context, matches);
// output the reset values
await printUnset(ioHelper, unset);
// warn about values not reset
await printReadonly(ioHelper, readonly);
// throw when none of the matches were reset
if (!force && unset.length === 0) {
throw new toolkit_lib_1.ToolkitError('NoResettableContextValues', 'None of the matched context values could be reset');
}
return;
}
if (!force) {
throw new toolkit_lib_1.ToolkitError('ContextKeyNotFound', `No context value matching key: ${key}`);
}
}
async function printUnset(ioHelper, unset) {
if (unset.length === 0)
return;
await ioHelper.defaults.info('The following matched context values reset. They will be refreshed on next synthesis');
for (const match of unset) {
await ioHelper.defaults.info(' %s', match);
}
}
async function printReadonly(ioHelper, readonly) {
if (readonly.length === 0)
return;
await ioHelper.defaults.warn('The following matched context values could not be reset through the CLI');
for (const match of readonly) {
await ioHelper.defaults.info(' %s', match);
}
await ioHelper.defaults.info('');
await ioHelper.defaults.info('This usually means they are configured in %s or %s', chalk_1.default.blue(user_configuration_1.PROJECT_CONFIG), chalk_1.default.blue(user_configuration_1.USER_DEFAULTS));
}
function keysByExpression(context, expression) {
const matchesExpression = picomatch(expression);
return context.keys.filter(key => matchesExpression(key));
}
function getUnsetAndReadonly(context, matches) {
return matches.reduce((acc, match) => {
if (context.has(match)) {
acc.readonly.push(match);
}
else {
acc.unset.push(match);
}
return acc;
}, { unset: [], readonly: [] });
}
function keyByNumber(context, n) {
for (const [i, key] of contextKeys(context)) {
if (n === i) {
return key;
}
}
throw new toolkit_lib_1.ToolkitError('ContextKeyNumberNotFound', `No context key with number: ${n}`);
}
/**
* Return enumerated keys in a definitive order
*/
function contextKeys(context) {
const keys = context.keys;
keys.sort();
return enumerate1(keys);
}
function enumerate1(xs) {
const ret = new Array();
let i = 1;
for (const x of xs) {
ret.push([i, x]);
i += 1;
}
return ret;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE0REEsd0NBdUJDO0FBbkZELHNEQUFvRDtBQUNwRCxrREFBMEI7QUFDMUIsaUVBQWlFO0FBQ2pFLHVDQUF3QztBQUd4QywwQ0FBNEM7QUFDNUMsa0VBQTJGO0FBcURwRixLQUFLLFVBQVUsY0FBYyxDQUFDLE9BQXVCO0lBQzFELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFFbEMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9DQUFlLENBQUMsQ0FBQztRQUM1QyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDOUQsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0saUJBQWlCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDO1FBQzFGLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0NBQWUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7U0FBTSxDQUFDO1FBQ04sZ0NBQWdDO1FBQ2hDLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLHFCQUFxQjtZQUNyQixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxD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QU8sQ0FBQyxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDWixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLDBCQUFZLENBQUMsMEJBQTBCLEVBQUUsK0JBQStCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekYsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQUMsT0FBZ0I7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDWixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUksRUFBTztJQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBZSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5pbXBvcnQgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICcuLi9hcGkvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vYXBpLXByaXZhdGUnO1xuaW1wb3J0IHsgcmVuZGVyVGFibGUgfSBmcm9tICcuLi9jbGkvdGFibGVzJztcbmltcG9ydCB7IFBST0pFQ1RfQ09ORklHLCBQUk9KRUNUX0NPTlRFWFQsIFVTRVJfREVGQVVMVFMgfSBmcm9tICcuLi9jbGkvdXNlci1jb25maWd1cmF0aW9uJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgY29udGV4dCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbnRleHQgb2JqZWN0IHNvdXJjZWQgZnJvbSBhbGwgY29udGV4dCBsb2NhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lcyBvZiB0aGUgY29udGV4dCBmaWxlcyB0aGF0IGN1cnJlbnRseSBjb250YWluIGNvbnRleHQgdmFsdWVzLFxuICAgKiB1c2VkIHRvIGRlc2NyaWJlIHdoZXJlIHRoZSBsaXN0ZWQgY29udGV4dCBjb21lcyBmcm9tXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZmlsZSBuYW1lcyBhcmUgc2hvd24gaW4gdGhlIGxpc3RpbmcgaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VGaWxlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBrZXkgKG9yIGl0cyBpbmRleCkgdG8gcmVzZXRcbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSByZXNldD86IHN0cmluZztcblxuICAvKipcbiAgICogSWdub3JlIG1pc3Npbmcga2V5IGVycm9yXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250ZXh0XG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjbGVhcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZSBKU09OIG91dHB1dCBpbnN0ZWFkIG9mIFlBTUwgd2hlbiB0ZW1wbGF0ZXMgYXJlIHByaW50ZWQgdG8gU1RET1VUXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBqc29uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW9IZWxwZXIgZm9yIG1lc3NhZ2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRleHRIYW5kbGVyKG9wdGlvbnM6IENvbnRleHRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgaW9IZWxwZXIgPSBvcHRpb25zLmlvSGVscGVyO1xuXG4gIGlmIChvcHRpb25zLmNsZWFyKSB7XG4gICAgb3B0aW9ucy5jb250ZXh0LmNsZWFyKCk7XG4gICAgYXdhaXQgb3B0aW9ucy5jb250ZXh0LnNhdmUoUFJPSkVDVF9DT05URVhUKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdBbGwgY29udGV4dCB2YWx1ZXMgY2xlYXJlZC4nKTtcbiAgfSBlbHNlIGlmIChvcHRpb25zLnJlc2V0KSB7XG4gICAgYXdhaXQgaW52YWxpZGF0ZUNvbnRleHQoaW9IZWxwZXIsIG9wdGlvbnMuY29udGV4dCwgb3B0aW9ucy5yZXNldCwgb3B0aW9ucy5mb3JjZSA/PyBmYWxzZSk7XG4gICAgYXdhaXQgb3B0aW9ucy5jb250ZXh0LnNhdmUoUFJPSkVDVF9DT05URVhUKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMaXN0IC0tIHN1cHBvcnQgJy0tanNvbicgZmxhZ1xuICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgY29uc3QgY29udGV4dFZhbHVlcyA9IG9wdGlvbnMuY29udGV4dC5hbGw7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5yZXN1bHQoSlNPTi5zdHJpbmdpZnkoY29udGV4dFZhbHVlcywgdW5kZWZpbmVkLCAyKSk7XG4gICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBsaXN0Q29udGV4dChpb0hlbHBlciwgb3B0aW9ucy5jb250ZXh0LCBvcHRpb25zLnNvdXJjZUZpbGVzID8/IFtdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdENvbnRleHQoaW9IZWxwZXI6IElvSGVscGVyLCBjb250ZXh0OiBDb250ZXh0LCBzb3VyY2VGaWxlczogc3RyaW5nW10pIHtcbiAgY29uc3Qga2V5cyA9IGNvbnRleHRLZXlzKGNvbnRleHQpO1xuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1RoaXMgQ0RLIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgYW55IHNhdmVkIGNvbnRleHQgdmFsdWVzIHlldC4nKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcnKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdDb250ZXh0IHdpbGwgYXV0b21hdGljYWxseSBiZSBzYXZlZCB3aGVuIHlvdSBzeW50aGVzaXplIENESyBhcHBzJyk7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygndGhhdCB1c2UgZW52aXJvbm1lbnQgY29udGV4dCBpbmZvcm1hdGlvbiBsaWtlIEFaIGluZm9ybWF0aW9uLCBWUENzLCcpO1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1NTTSBwYXJhbWV0ZXJzLCBhbmQgc28gb24uJyk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBQcmludCBjb25maWcgYnkgZGVmYXVsdFxuICBjb25zdCBkYXRhX291dDogYW55W10gPSBbW2NoYWxrLmdyZWVuKCcjJyksIGNoYWxrLmdyZWVuKCdLZXknKSwgY2hhbGsuZ3JlZW4oJ1ZhbHVlJyldXTtcbiAgZm9yIChjb25zdCBbaSwga2V5XSBvZiBrZXlzKSB7XG4gICAgY29uc3QganNvbldpdGhvdXROZXdsaW5lcyA9IEpTT04uc3RyaW5naWZ5KGNvbnRleHQuYWxsW2tleV0sIHVuZGVmaW5lZCwgMikucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIGRhdGFfb3V0LnB1c2goW2ksIGtleSwganNvbldpdGhvdXROZXdsaW5lc10pO1xuICB9XG4gIGlmIChzb3VyY2VGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnQ29udGV4dCBmb3VuZCBpbiAlczonLCBzb3VyY2VGaWxlcy5tYXAoKGYpID0+IGNoYWxrLmJsdWUoZikpLmpvaW4oJywgJykpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ0NvbnRleHQgZm91bmQ6Jyk7XG4gIH1cbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnJyk7XG4gIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8ocmVuZGVyVGFibGUoZGF0YV9vdXQsIHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMpKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHN0eWxpc3RpYy9tYXgtbGVuXG4gIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFJ1biAke2NoYWxrLmJsdWUoJ2NkayBjb250ZXh0IC0tcmVzZXQgS0VZX09SX05VTUJFUicpfSB0byByZW1vdmUgYSBjb250ZXh0IGtleS4gSXQgd2lsbCBiZSByZWZyZXNoZWQgb24gdGhlIG5leHQgQ0RLIHN5bnRoZXNpcyBydW4uYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGludmFsaWRhdGVDb250ZXh0KGlvSGVscGVyOiBJb0hlbHBlciwgY29udGV4dDogQ29udGV4dCwga2V5OiBzdHJpbmcsIGZvcmNlOiBib29sZWFuKSB7XG4gIGNvbnN0IGkgPSBwYXJzZUludChrZXksIDEwKTtcbiAgaWYgKGAke2l9YCA9PT0ga2V5KSB7XG4gICAgLy8gd2FzIGEgbnVtYmVyIGFuZCB3ZSBmdWxseSBwYXJzZWQgaXQuXG4gICAga2V5ID0ga2V5QnlOdW1iZXIoY29udGV4dCwgaSk7XG4gIH1cbiAgLy8gVW5zZXQhXG4gIGlmIChjb250ZXh0LmhhcyhrZXkpKSB7XG4gICAgY29udGV4dC51bnNldChrZXkpO1xuICAgIC8vIGNoZWNrIGlmIHRoZSB2YWx1ZSB3YXMgYWN0dWFsbHkgdW5zZXQuXG4gICAgaWYgKCFjb250ZXh0LmhhcyhrZXkpKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdDb250ZXh0IHZhbHVlICVzIHJlc2V0LiBJdCB3aWxsIGJlIHJlZnJlc2hlZCBvbiBuZXh0IHN5bnRoZXNpcycsIGNoYWxrLmJsdWUoa2V5KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsdWUgbXVzdCBiZSBpbiByZWFkb25seSBiYWdcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignT25seSBjb250ZXh0IHZhbHVlcyBzcGVjaWZpZWQgaW4gJXMgY2FuIGJlIHJlc2V0IHRocm91Z2ggdGhlIENMSScsIGNoYWxrLmJsdWUoUFJPSkVDVF9DT05URVhUKSk7XG4gICAgaWYgKCFmb3JjZSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignUmVhZG9ubHlDb250ZXh0S2V5JywgYENhbm5vdCByZXNldCByZWFkb25seSBjb250ZXh0IHZhbHVlIHdpdGgga2V5OiAke2tleX1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBjaGVjayBpZiB2YWx1ZSBpcyBleHByZXNzaW9uIG1hdGNoaW5nIGtleXNcbiAgY29uc3QgbWF0Y2hlcyA9IGtleXNCeUV4cHJlc3Npb24oY29udGV4dCwga2V5KTtcblxuICBpZiAobWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgbWF0Y2hlcy5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgICAgY29udGV4dC51bnNldChtYXRjaCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHVuc2V0LCByZWFkb25seSB9ID0gZ2V0VW5zZXRBbmRSZWFkb25seShjb250ZXh0LCBtYXRjaGVzKTtcblxuICAgIC8vIG91dHB1dCB0aGUgcmVzZXQgdmFsdWVzXG4gICAgYXdhaXQgcHJpbnRVbnNldChpb0hlbHBlciwgdW5zZXQpO1xuXG4gICAgLy8gd2FybiBhYm91dCB2YWx1ZXMgbm90IHJlc2V0XG4gICAgYXdhaXQgcHJpbnRSZWFkb25seShpb0hlbHBlciwgcmVhZG9ubHkpO1xuXG4gICAgLy8gdGhyb3cgd2hlbiBub25lIG9mIHRoZSBtYXRjaGVzIHdlcmUgcmVzZXRcbiAgICBpZiAoIWZvcmNlICYmIHVuc2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignTm9SZXNldHRhYmxlQ29udGV4dFZhbHVlcycsICdOb25lIG9mIHRoZSBtYXRjaGVkIGNvbnRleHQgdmFsdWVzIGNvdWxkIGJlIHJlc2V0Jyk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWZvcmNlKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ29udGV4dEtleU5vdEZvdW5kJywgYE5vIGNvbnRleHQgdmFsdWUgbWF0Y2hpbmcga2V5OiAke2tleX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcmludFVuc2V0KGlvSGVscGVyOiBJb0hlbHBlciwgdW5zZXQ6IHN0cmluZ1tdKSB7XG4gIGlmICh1bnNldC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnVGhlIGZvbGxvd2luZyBtYXRjaGVkIGNvbnRleHQgdmFsdWVzIHJlc2V0LiBUaGV5IHdpbGwgYmUgcmVmcmVzaGVkIG9uIG5leHQgc3ludGhlc2lzJyk7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgdW5zZXQpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgICVzJywgbWF0Y2gpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByaW50UmVhZG9ubHkoaW9IZWxwZXI6IElvSGVscGVyLCByZWFkb25seTogc3RyaW5nW10pIHtcbiAgaWYgKHJlYWRvbmx5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy53YXJuKCdUaGUgZm9sbG93aW5nIG1hdGNoZWQgY29udGV4dCB2YWx1ZXMgY291bGQgbm90IGJlIHJlc2V0IHRocm91Z2ggdGhlIENMSScpO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHJlYWRvbmx5KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnICAlcycsIG1hdGNoKTtcbiAgfVxuICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcnKTtcbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnVGhpcyB1c3VhbGx5IG1lYW5zIHRoZXkgYXJlIGNvbmZpZ3VyZWQgaW4gJXMgb3IgJXMnLCBjaGFsay5ibHVlKFBST0pFQ1RfQ09ORklHKSwgY2hhbGsuYmx1ZShVU0VSX0RFRkFVTFRTKSk7XG59XG5cbmZ1bmN0aW9uIGtleXNCeUV4cHJlc3Npb24oY29udGV4dDogQ29udGV4dCwgZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoZXNFeHByZXNzaW9uID0gcGljb21hdGNoKGV4cHJlc3Npb24pO1xuICByZXR1cm4gY29udGV4dC5rZXlzLmZpbHRlcihrZXkgPT4gbWF0Y2hlc0V4cHJlc3Npb24oa2V5KSk7XG59XG5cbmZ1bmN0aW9uIGdldFVuc2V0QW5kUmVhZG9ubHkoY29udGV4dDogQ29udGV4dCwgbWF0Y2hlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIG1hdGNoZXMucmVkdWNlPHsgdW5zZXQ6IHN0cmluZ1tdOyByZWFkb25seTogc3RyaW5nW10gfT4oKGFjYywgbWF0Y2gpID0+IHtcbiAgICBpZiAoY29udGV4dC5oYXMobWF0Y2gpKSB7XG4gICAgICBhY2MucmVhZG9ubHkucHVzaChtYXRjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjYy51bnNldC5wdXNoKG1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgeyB1bnNldDogW10sIHJlYWRvbmx5OiBbXSB9KTtcbn1cblxuZnVuY3Rpb24ga2V5QnlOdW1iZXIoY29udGV4dDogQ29udGV4dCwgbjogbnVtYmVyKSB7XG4gIGZvciAoY29uc3QgW2ksIGtleV0gb2YgY29udGV4dEtleXMoY29udGV4dCkpIHtcbiAgICBpZiAobiA9PT0gaSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ29udGV4dEtleU51bWJlck5vdEZvdW5kJywgYE5vIGNvbnRleHQga2V5IHdpdGggbnVtYmVyOiAke259YCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGVudW1lcmF0ZWQga2V5cyBpbiBhIGRlZmluaXRpdmUgb3JkZXJcbiAqL1xuZnVuY3Rpb24gY29udGV4dEtleXMoY29udGV4dDogQ29udGV4dCk6IFtudW1iZXIsIHN0cmluZ11bXSB7XG4gIGNvbnN0IGtleXMgPSBjb250ZXh0LmtleXM7XG4gIGtleXMuc29ydCgpO1xuICByZXR1cm4gZW51bWVyYXRlMShrZXlzKTtcbn1cblxuZnVuY3Rpb24gZW51bWVyYXRlMTxUPih4czogVFtdKTogQXJyYXk8W251bWJlciwgVF0+IHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFtudW1iZXIsIFRdPigpO1xuICBsZXQgaSA9IDE7XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIHJldC5wdXNoKFtpLCB4XSk7XG4gICAgaSArPSAxO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iXX0=