UNPKG

aws-cdk

Version:

AWS CDK Toolkit CLI, the command line tool for CDK apps

151 lines 18.2 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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.VersionCheckTTL = void 0; exports.getVersionMessages = getVersionMessages; exports.shouldDisplayVersionMessage = shouldDisplayVersionMessage; exports.displayVersionMessage = displayVersionMessage; const path = __importStar(require("path")); const toolkit_lib_1 = require("@aws-cdk/toolkit-lib"); const chalk_1 = __importDefault(require("chalk")); const fs = __importStar(require("fs-extra")); const semver = __importStar(require("semver")); const util_1 = require("../util"); const console_formatters_1 = require("./util/console-formatters"); const npm_1 = require("./util/npm"); const ONE_DAY_IN_SECONDS = 1 * 24 * 60 * 60; const UPGRADE_DOCUMENTATION_LINKS = { 1: 'https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html', }; class VersionCheckTTL { static timestampFilePath() { // Using the same path from account-cache.ts return path.join((0, util_1.cdkCacheDir)(), 'repo-version-ttl'); } file; // File modify times are accurate only to the second ttlSecs; constructor(file, ttlSecs) { this.file = file || VersionCheckTTL.timestampFilePath(); try { fs.mkdirsSync(path.dirname(this.file)); fs.accessSync(path.dirname(this.file), fs.constants.W_OK); } catch { throw new toolkit_lib_1.ToolkitError('DirectoryNotWritable', `Directory (${path.dirname(this.file)}) is not writable.`); } this.ttlSecs = ttlSecs || ONE_DAY_IN_SECONDS; } async hasExpired() { try { const lastCheckTime = (await fs.stat(this.file)).mtimeMs; const today = new Date().getTime(); if ((today - lastCheckTime) / 1000 > this.ttlSecs) { // convert ms to sec return true; } return false; } catch (err) { if (err.code === 'ENOENT') { return true; } else { throw err; } } } async update(latestVersion) { if (!latestVersion) { latestVersion = ''; } await fs.writeFile(this.file, latestVersion); } } exports.VersionCheckTTL = VersionCheckTTL; // Export for unit testing only. // Don't use directly, use displayVersionMessage() instead. async function getVersionMessages(currentVersion, cacheFile, agent) { if (!(await cacheFile.hasExpired())) { return []; } const packageInfo = await (0, npm_1.fetchNpmVersionInfo)(currentVersion, agent); const latestVersion = packageInfo.latestVersion; await cacheFile.update(JSON.stringify(packageInfo)); const versionMessages = []; // Warn if the version currently in use has been deprecated, even if the // latest version is not newer (e.g. an accidentally published version that // was deprecated and requires a downgrade). if (packageInfo.deprecated) { versionMessages.push(chalk_1.default.red(packageInfo.deprecated)); } // Only recommend an upgrade if the latest version is strictly newer than the // current one. This guards against stale or bogus registry metadata. if (semver.gt(latestVersion, currentVersion)) { versionMessages.push(`Newer version of CDK is available [${chalk_1.default.green(latestVersion)}]`); const majorUpgradeMessage = getMajorVersionUpgradeMessage(currentVersion); if (majorUpgradeMessage) { versionMessages.push(majorUpgradeMessage); } } if (versionMessages.length > 0) { versionMessages.push('Upgrade recommended (npm install -g aws-cdk)'); } return versionMessages; } function getMajorVersionUpgradeMessage(currentVersion) { const currentMajorVersion = semver.major(currentVersion); if (UPGRADE_DOCUMENTATION_LINKS[currentMajorVersion]) { return `Information about upgrading from version ${currentMajorVersion}.x to version ${currentMajorVersion + 1}.x is available here: ${UPGRADE_DOCUMENTATION_LINKS[currentMajorVersion]}`; } } function shouldDisplayVersionMessage() { return !!process.stdout.isTTY && !process.env.CDK_DISABLE_VERSION_CHECK; } async function displayVersionMessage(ioHelper, options = {}) { try { const currentVersion = options.currentVersion ?? (0, util_1.versionNumber)(); const versionMessages = await getVersionMessages(currentVersion, options.versionCheckCache ?? new VersionCheckTTL(), options.agent); for (const e of (0, console_formatters_1.formatAsBanner)(versionMessages)) { await ioHelper.defaults.info(e); } } catch (err) { await ioHelper.defaults.debug(`Could not run version check - ${err.message}`); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzcGxheS12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1FQSxnREFpQ0M7QUFTRCxrRUFFQztBQThCRCxzREFhQztBQXpKRCwyQ0FBNkI7QUFDN0Isc0RBQW9EO0FBQ3BELGtEQUEwQjtBQUMxQiw2Q0FBK0I7QUFDL0IsK0NBQWlDO0FBRWpDLGtDQUFxRDtBQUNyRCxrRUFBMkQ7QUFDM0Qsb0NBQWlEO0FBRWpELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRTVDLE1BQU0sMkJBQTJCLEdBQTJCO0lBQzFELENBQUMsRUFBRSw0REFBNEQ7Q0FDaEUsQ0FBQztBQUVGLE1BQWEsZUFBZTtJQUNuQixNQUFNLENBQUMsaUJBQWlCO1FBQzdCLDRDQUE0QztRQUM1QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSxrQkFBVyxHQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRWdCLElBQUksQ0FBUztJQUU5QixvREFBb0Q7SUFDbkMsT0FBTyxDQUFTO0lBRWpDLFlBQVksSUFBYSxFQUFFLE9BQWdCO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQztZQUNILEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2QyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUFDLE1BQU0sQ0FB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Q0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgaHR0cHMgZnJvbSAnbm9kZTpodHRwcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHR5cGUgeyBJb0hlbHBlciB9IGZyb20gJy4uL2FwaS1wcml2YXRlJztcbmltcG9ydCB7IGNka0NhY2hlRGlyLCB2ZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBmb3JtYXRBc0Jhbm5lciB9IGZyb20gJy4vdXRpbC9jb25zb2xlLWZvcm1hdHRlcnMnO1xuaW1wb3J0IHsgZmV0Y2hOcG1WZXJzaW9uSW5mbyB9IGZyb20gJy4vdXRpbC9ucG0nO1xuXG5jb25zdCBPTkVfREFZX0lOX1NFQ09ORFMgPSAxICogMjQgKiA2MCAqIDYwO1xuXG5jb25zdCBVUEdSQURFX0RPQ1VNRU5UQVRJT05fTElOS1M6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDE6ICdodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL3YyL2d1aWRlL21pZ3JhdGluZy12Mi5odG1sJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBWZXJzaW9uQ2hlY2tUVEwge1xuICBwdWJsaWMgc3RhdGljIHRpbWVzdGFtcEZpbGVQYXRoKCk6IHN0cmluZyB7XG4gICAgLy8gVXNpbmcgdGhlIHNhbWUgcGF0aCBmcm9tIGFjY291bnQtY2FjaGUudHNcbiAgICByZXR1cm4gcGF0aC5qb2luKGNka0NhY2hlRGlyKCksICdyZXBvLXZlcnNpb24tdHRsJyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IHN0cmluZztcblxuICAvLyBGaWxlIG1vZGlmeSB0aW1lcyBhcmUgYWNjdXJhdGUgb25seSB0byB0aGUgc2Vjb25kXG4gIHByaXZhdGUgcmVhZG9ubHkgdHRsU2VjczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGZpbGU/OiBzdHJpbmcsIHR0bFNlY3M/OiBudW1iZXIpIHtcbiAgICB0aGlzLmZpbGUgPSBmaWxlIHx8IFZlcnNpb25DaGVja1RUTC50aW1lc3RhbXBGaWxlUGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICBmcy5ta2RpcnNTeW5jKHBhdGguZGlybmFtZSh0aGlzLmZpbGUpKTtcbiAgICAgIGZzLmFjY2Vzc1N5bmMocGF0aC5kaXJuYW1lKHRoaXMuZmlsZSksIGZzLmNvbnN0YW50cy5XX09LKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0RpcmVjdG9yeU5vdFdyaXRhYmxlJywgYERpcmVjdG9yeSAoJHtwYXRoLmRpcm5hbWUodGhpcy5maWxlKX0pIGlzIG5vdCB3cml0YWJsZS5gKTtcbiAgICB9XG4gICAgdGhpcy50dGxTZWNzID0gdHRsU2VjcyB8fCBPTkVfREFZX0lOX1NFQ09ORFM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFzRXhwaXJlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFzdENoZWNrVGltZSA9IChhd2FpdCBmcy5zdGF0KHRoaXMuZmlsZSkpLm10aW1lTXM7XG4gICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4gICAgICBpZiAoKHRvZGF5IC0gbGFzdENoZWNrVGltZSkgLyAxMDAwID4gdGhpcy50dGxTZWNzKSB7IC8vIGNvbnZlcnQgbXMgdG8gc2VjXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGUobGF0ZXN0VmVyc2lvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghbGF0ZXN0VmVyc2lvbikge1xuICAgICAgbGF0ZXN0VmVyc2lvbiA9ICcnO1xuICAgIH1cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5maWxlLCBsYXRlc3RWZXJzaW9uKTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgZm9yIHVuaXQgdGVzdGluZyBvbmx5LlxuLy8gRG9uJ3QgdXNlIGRpcmVjdGx5LCB1c2UgZGlzcGxheVZlcnNpb25NZXNzYWdlKCkgaW5zdGVhZC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uTWVzc2FnZXMoY3VycmVudFZlcnNpb246IHN0cmluZywgY2FjaGVGaWxlOiBWZXJzaW9uQ2hlY2tUVEwsIGFnZW50PzogaHR0cHMuQWdlbnQpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmICghKGF3YWl0IGNhY2hlRmlsZS5oYXNFeHBpcmVkKCkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUluZm8gPSBhd2FpdCBmZXRjaE5wbVZlcnNpb25JbmZvKGN1cnJlbnRWZXJzaW9uLCBhZ2VudCk7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBwYWNrYWdlSW5mby5sYXRlc3RWZXJzaW9uO1xuICBhd2FpdCBjYWNoZUZpbGUudXBkYXRlKEpTT04uc3RyaW5naWZ5KHBhY2thZ2VJbmZvKSk7XG5cbiAgY29uc3QgdmVyc2lvbk1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFdhcm4gaWYgdGhlIHZlcnNpb24gY3VycmVudGx5IGluIHVzZSBoYXMgYmVlbiBkZXByZWNhdGVkLCBldmVuIGlmIHRoZVxuICAvLyBsYXRlc3QgdmVyc2lvbiBpcyBub3QgbmV3ZXIgKGUuZy4gYW4gYWNjaWRlbnRhbGx5IHB1Ymxpc2hlZCB2ZXJzaW9uIHRoYXRcbiAgLy8gd2FzIGRlcHJlY2F0ZWQgYW5kIHJlcXVpcmVzIGEgZG93bmdyYWRlKS5cbiAgaWYgKHBhY2thZ2VJbmZvLmRlcHJlY2F0ZWQpIHtcbiAgICB2ZXJzaW9uTWVzc2FnZXMucHVzaChjaGFsay5yZWQocGFja2FnZUluZm8uZGVwcmVjYXRlZCkpO1xuICB9XG5cbiAgLy8gT25seSByZWNvbW1lbmQgYW4gdXBncmFkZSBpZiB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgc3RyaWN0bHkgbmV3ZXIgdGhhbiB0aGVcbiAgLy8gY3VycmVudCBvbmUuIFRoaXMgZ3VhcmRzIGFnYWluc3Qgc3RhbGUgb3IgYm9ndXMgcmVnaXN0cnkgbWV0YWRhdGEuXG4gIGlmIChzZW12ZXIuZ3QobGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pKSB7XG4gICAgdmVyc2lvbk1lc3NhZ2VzLnB1c2goYE5ld2VyIHZlcnNpb24gb2YgQ0RLIGlzIGF2YWlsYWJsZSBbJHtjaGFsay5ncmVlbihsYXRlc3RWZXJzaW9uKX1dYCk7XG4gICAgY29uc3QgbWFqb3JVcGdyYWRlTWVzc2FnZSA9IGdldE1ham9yVmVyc2lvblVwZ3JhZGVNZXNzYWdlKGN1cnJlbnRWZXJzaW9uKTtcbiAgICBpZiAobWFqb3JVcGdyYWRlTWVzc2FnZSkge1xuICAgICAgdmVyc2lvbk1lc3NhZ2VzLnB1c2gobWFqb3JVcGdyYWRlTWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZlcnNpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgdmVyc2lvbk1lc3NhZ2VzLnB1c2goJ1VwZ3JhZGUgcmVjb21tZW5kZWQgKG5wbSBpbnN0YWxsIC1nIGF3cy1jZGspJyk7XG4gIH1cblxuICByZXR1cm4gdmVyc2lvbk1lc3NhZ2VzO1xufVxuXG5mdW5jdGlvbiBnZXRNYWpvclZlcnNpb25VcGdyYWRlTWVzc2FnZShjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHwgdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnRNYWpvclZlcnNpb24gPSBzZW12ZXIubWFqb3IoY3VycmVudFZlcnNpb24pO1xuICBpZiAoVVBHUkFERV9ET0NVTUVOVEFUSU9OX0xJTktTW2N1cnJlbnRNYWpvclZlcnNpb25dKSB7XG4gICAgcmV0dXJuIGBJbmZvcm1hdGlvbiBhYm91dCB1cGdyYWRpbmcgZnJvbSB2ZXJzaW9uICR7Y3VycmVudE1ham9yVmVyc2lvbn0ueCB0byB2ZXJzaW9uICR7Y3VycmVudE1ham9yVmVyc2lvbiArIDF9LnggaXMgYXZhaWxhYmxlIGhlcmU6ICR7VVBHUkFERV9ET0NVTUVOVEFUSU9OX0xJTktTW2N1cnJlbnRNYWpvclZlcnNpb25dfWA7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZERpc3BsYXlWZXJzaW9uTWVzc2FnZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvY2Vzcy5zdGRvdXQuaXNUVFkgJiYgIXByb2Nlc3MuZW52LkNES19ESVNBQkxFX1ZFUlNJT05fQ0hFQ0s7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGRpc3BsYXlWZXJzaW9uTWVzc2FnZX1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNwbGF5VmVyc2lvbk1lc3NhZ2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBDTEkgdGhhdCBpcyBjdXJyZW50bHkgcnVubmluZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZVxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudFZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjYWNoZSB1c2VkIHRvIGxpbWl0IGhvdyBvZnRlbiB0aGUgdmVyc2lvbiBjaGVjayBydW5zXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBUVEwgY2FjaGUgaW4gdGhlIENESyBjYWNoZSBkaXJlY3RvcnlcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25DaGVja0NhY2hlPzogVmVyc2lvbkNoZWNrVFRMO1xuXG4gIC8qKlxuICAgKiBUaGUgYWdlbnQgdXNlZCBmb3IgdGhlIG5ldHdvcmsgcmVxdWVzdCB0byB0aGUgbnBtIHJlZ2lzdHJ5XG4gICAqXG4gICAqIFVzZSB0aGlzIHRvIHNldCB1cCBhIHByb3h5IGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHNoYXJlZCBnbG9iYWwgbm9kZSBhZ2VudFxuICAgKi9cbiAgcmVhZG9ubHkgYWdlbnQ/OiBodHRwcy5BZ2VudDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3BsYXlWZXJzaW9uTWVzc2FnZShcbiAgaW9IZWxwZXI6IElvSGVscGVyLFxuICBvcHRpb25zOiBEaXNwbGF5VmVyc2lvbk1lc3NhZ2VPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IG9wdGlvbnMuY3VycmVudFZlcnNpb24gPz8gdmVyc2lvbk51bWJlcigpO1xuICAgIGNvbnN0IHZlcnNpb25NZXNzYWdlcyA9IGF3YWl0IGdldFZlcnNpb25NZXNzYWdlcyhjdXJyZW50VmVyc2lvbiwgb3B0aW9ucy52ZXJzaW9uQ2hlY2tDYWNoZSA/PyBuZXcgVmVyc2lvbkNoZWNrVFRMKCksIG9wdGlvbnMuYWdlbnQpO1xuICAgIGZvciAoY29uc3QgZSBvZiBmb3JtYXRBc0Jhbm5lcih2ZXJzaW9uTWVzc2FnZXMpKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhgQ291bGQgbm90IHJ1biB2ZXJzaW9uIGNoZWNrIC0gJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuIl19