projen
Version:
CDK for software projects
191 lines • 19.8 kB
JavaScript
;
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;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommitAndTagVersion = void 0;
/**
* Library to invoke commit-and-tag-version
*/
const fs_1 = require("fs");
const path = __importStar(require("node:path"));
const logging = __importStar(require("../logging"));
const exec_1 = require("../util/exec");
const DEFAULT_CATV_SPEC = "commit-and-tag-version@^12";
class CommitAndTagVersion {
cwd;
options;
tool;
args;
constructor(packageSpec, cwd, options) {
this.cwd = cwd;
this.options = options;
let resolvedCli;
if (!packageSpec) {
// If no packageSpec is given, try and resolve the CATV binary
// from devDependencies. This will speed up execution a lot.
try {
resolvedCli = require.resolve("commit-and-tag-version/bin/cli.js");
}
catch {
// not installed locally; fall back to npx below
}
}
if (resolvedCli) {
// Run the resolved CLI directly with node - fully shell-free.
this.tool = exec_1.node;
this.args = [resolvedCli];
}
else {
// npx is a Windows `.cmd` shim, so it runs via the cross-platform helper.
this.tool = exec_1.npx;
this.args = [packageSpec ?? DEFAULT_CATV_SPEC];
}
}
/**
* Invoke the `commit-and-tag` package
*/
async invoke(options) {
const catvConfig = {
packageFiles: [
{
filename: this.options.versionFile,
type: "json",
},
],
bumpFiles: [
{
filename: this.options.versionFile,
type: "json",
},
],
commitAll: false,
infile: this.options.changelogFile,
prerelease: this.options.prerelease,
header: "",
skip: {
commit: true,
tag: true,
bump: options.skipBump,
changelog: options.skipChangelog,
},
tagPrefix: this.options.tagPrefix
? `${this.options.tagPrefix}v`
: undefined,
releaseAs: options.releaseAs,
dryRun: options.dryRun,
...this.options.configOptions,
};
logging.debug(`.versionrc.json: ${JSON.stringify(catvConfig)}`);
// Generate a temporary config file, then execute the package and remove the
// config file again.
const rcfile = path.join(this.cwd, ".versionrc.json");
await fs_1.promises.writeFile(rcfile, JSON.stringify(catvConfig, undefined, 2));
try {
let ret;
if (options.capture) {
ret = await this.tool.capture(this.args, { cwd: this.cwd });
}
else {
await this.tool.run(this.args, { cwd: this.cwd });
}
return ret;
}
finally {
await fs_1.promises.unlink(rcfile);
}
}
/**
* Regenerate the most recent change log
*
* Do this by deleting the most recent tag, running CATV, then
* restoring the tag.
*
* We do this combined with skipping the bump to make CATV regenerate the
* changelog of the most recent release (if we left the tag, the changelog
* would be empty).
*/
async regeneratePreviousChangeLog(version, latestTag) {
const oldCommit = exec_1.git.capture(["rev-parse", latestTag], {
cwd: this.cwd,
});
exec_1.git.run(["tag", "--delete", latestTag], { cwd: this.cwd });
try {
await this.invoke({
releaseAs: version,
skipBump: true,
});
}
finally {
exec_1.git.run(["tag", latestTag, oldCommit], { cwd: this.cwd });
}
}
/**
* Invoke CATV and return the version it would have bumped to
*
* CATV will always at least perform a patch bump, even if there aren't any
* commits to look at.
*
* We have to do this by parsing the output string, which is pretty bad
* but I don't see that we have another way.
*/
async dryRun() {
const output = stripAnsi(await this.invoke({
capture: true,
dryRun: true,
skipChangelog: true,
}));
const re = /bumping version.*from ([0-9a-z.+-]+) to ([0-9a-z.+-]+)/im;
const m = re.exec(output);
if (!m) {
throw new Error(`Could not match ${re} in ${output}`);
}
return m[2];
}
}
exports.CommitAndTagVersion = CommitAndTagVersion;
/**
* Strips ANSI escape codes from a string
*
* Need to use this because the `--no-colors` argument to CATV is sometimes
* respected and sometimes not and it's driving me crazy.
*/
function stripAnsi(str) {
// Pattern matches all ANSI escape sequences including colors, cursor movement, etc
const pattern = [
"[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
"(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))",
].join("|");
return str.replace(new RegExp(pattern, "g"), "");
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LXRhZy12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbGVhc2UvY29tbWl0LXRhZy12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsMkJBQW9DO0FBQ3BDLGdEQUFrQztBQUVsQyxvREFBc0M7QUFDdEMsdUNBQThDO0FBRzlDLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCLENBQUM7QUFtQnZELE1BQWEsbUJBQW1CO0lBTVg7SUFDQTtJQU5GLElBQUksQ0FBbUI7SUFDdkIsSUFBSSxDQUFXO0lBRWhDLFlBQ0UsV0FBK0IsRUFDZCxHQUFXLEVBQ1gsT0FBNEI7UUFENUIsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNYLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBRTdDLElBQUksV0FBK0IsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsOERBQThEO1lBQzlELDREQUE0RDtZQUM1RCxJQUFJLENBQUM7Z0JBQ0gsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLGdEQUFnRDtZQUNsRCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsOERBQThEO1lBQzlELElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBSSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLDBFQUEwRTtZQUMxRSxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQUcsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLGlCQUFpQixDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFF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ZC10YWctdmVyc2lvblxuICovXG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gXCJjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbmZpZy1zcGVjXCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgeyBnaXQsIG5vZGUsIG5weCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcbmltcG9ydCB0eXBlIHsgQXN5bmNUb29sLCBUb29sIH0gZnJvbSBcIi4uL3V0aWwvZXhlY1wiO1xuXG5jb25zdCBERUZBVUxUX0NBVFZfU1BFQyA9IFwiY29tbWl0LWFuZC10YWctdmVyc2lvbkBeMTJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb21taXRBbmRUYWdPcHRpb25zIHtcbiAgcmVhZG9ubHkgdGFnUHJlZml4Pzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uRmlsZTogc3RyaW5nO1xuICByZWFkb25seSBjaGFuZ2Vsb2dGaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBwcmVyZWxlYXNlPzogc3RyaW5nO1xuICByZWFkb25seSBjb25maWdPcHRpb25zPzogQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZU9wdGlvbnMge1xuICByZWFkb25seSByZWxlYXNlQXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRyeVJ1bj86IGJvb2xlYW47XG4gIC8qKiBBdm9pZCB1cGRhdGluZyB0aGUgdmVyc2lvbiBmaWxlcyAqL1xuICByZWFkb25seSBza2lwQnVtcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNraXBDaGFuZ2Vsb2c/OiBib29sZWFuO1xuICByZWFkb25seSBjYXB0dXJlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1pdEFuZFRhZ1ZlcnNpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2w6IFRvb2wgfCBBc3luY1Rvb2w7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJnczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcGFja2FnZVNwZWM6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN3ZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQ29tbWl0QW5kVGFnT3B0aW9ucyxcbiAgKSB7XG4gICAgbGV0IHJlc29sdmVkQ2xpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwYWNrYWdlU3BlYykge1xuICAgICAgLy8gSWYgbm8gcGFja2FnZVNwZWMgaXMgZ2l2ZW4sIHRyeSBhbmQgcmVzb2x2ZSB0aGUgQ0FUViBiaW5hcnlcbiAgICAgIC8vIGZyb20gZGV2RGVwZW5kZW5jaWVzLiBUaGlzIHdpbGwgc3BlZWQgdXAgZXhlY3V0aW9uIGEgbG90LlxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRDbGkgPSByZXF1aXJlLnJlc29sdmUoXCJjb21taXQtYW5kLXRhZy12ZXJzaW9uL2Jpbi9jbGkuanNcIik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbm90IGluc3RhbGxlZCBsb2NhbGx5OyBmYWxsIGJhY2sgdG8gbnB4IGJlbG93XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVkQ2xpKSB7XG4gICAgICAvLyBSdW4gdGhlIHJlc29sdmVkIENMSSBkaXJlY3RseSB3aXRoIG5vZGUgLSBmdWxseSBzaGVsbC1mcmVlLlxuICAgICAgdGhpcy50b29sID0gbm9kZTtcbiAgICAgIHRoaXMuYXJncyA9IFtyZXNvbHZlZENsaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5weCBpcyBhIFdpbmRvd3MgYC5jbWRgIHNoaW0sIHNvIGl0IHJ1bnMgdmlhIHRoZSBjcm9zcy1wbGF0Zm9ybSBoZWxwZXIuXG4gICAgICB0aGlzLnRvb2wgPSBucHg7XG4gICAgICB0aGlzLmFyZ3MgPSBbcGFja2FnZVNwZWMgPz8gREVGQVVMVF9DQVRWX1NQRUNdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGBjb21taXQtYW5kLXRhZ2AgcGFja2FnZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGludm9rZTxBIGV4dGVuZHMgSW52b2tlT3B0aW9ucz4oXG4gICAgb3B0aW9uczogQSxcbiAgKTogUHJvbWlzZTxBIGV4dGVuZHMgeyBjYXB0dXJlOiB0cnVlIH0gPyBzdHJpbmcgOiB2b2lkPiB7XG4gICAgY29uc3QgY2F0dkNvbmZpZzogQ29tbWl0QW5kVGFnQ29uZmlnID0ge1xuICAgICAgcGFja2FnZUZpbGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlbmFtZTogdGhpcy5vcHRpb25zLnZlcnNpb25GaWxlLFxuICAgICAgICAgIHR5cGU6IFwianNvblwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJ1bXBGaWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZW5hbWU6IHRoaXMub3B0aW9ucy52ZXJzaW9uRmlsZSxcbiAgICAgICAgICB0eXBlOiBcImpzb25cIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBjb21taXRBbGw6IGZhbHNlLFxuICAgICAgaW5maWxlOiB0aGlzLm9wdGlvbnMuY2hhbmdlbG9nRmlsZSxcbiAgICAgIHByZXJlbGVhc2U6IHRoaXMub3B0aW9ucy5wcmVyZWxlYXNlLFxuICAgICAgaGVhZGVyOiBcIlwiLFxuICAgICAgc2tpcDoge1xuICAgICAgICBjb21taXQ6IHRydWUsXG4gICAgICAgIHRhZzogdHJ1ZSxcbiAgICAgICAgYnVtcDogb3B0aW9ucy5za2lwQnVtcCxcbiAgICAgICAgY2hhbmdlbG9nOiBvcHRpb25zLnNraXBDaGFuZ2Vsb2csXG4gICAgICB9LFxuICAgICAgdGFnUHJlZml4OiB0aGlzLm9wdGlvbnMudGFnUHJlZml4XG4gICAgICAgID8gYCR7dGhpcy5vcHRpb25zLnRhZ1ByZWZpeH12YFxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJlbGVhc2VBczogb3B0aW9ucy5yZWxlYXNlQXMsXG4gICAgICBkcnlSdW46IG9wdGlvbnMuZHJ5UnVuLFxuICAgICAgLi4udGhpcy5vcHRpb25zLmNvbmZpZ09wdGlvbnMsXG4gICAgfTtcbiAgICBsb2dnaW5nLmRlYnVnKGAudmVyc2lvbnJjLmpzb246ICR7SlNPTi5zdHJpbmdpZnkoY2F0dkNvbmZpZyl9YCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBjb25maWcgZmlsZSwgdGhlbiBleGVjdXRlIHRoZSBwYWNrYWdlIGFuZCByZW1vdmUgdGhlXG4gICAgLy8gY29uZmlnIGZpbGUgYWdhaW4uXG4gICAgY29uc3QgcmNmaWxlID0gcGF0aC5qb2luKHRoaXMuY3dkLCBcIi52ZXJzaW9ucmMuanNvblwiKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocmNmaWxlLCBKU09OLnN0cmluZ2lmeShjYXR2Q29uZmlnLCB1bmRlZmluZWQsIDIpKTtcbiAgICB0cnkge1xuICAgICAgbGV0IHJldDogYW55O1xuICAgICAgaWYgKG9wdGlvbnMuY2FwdHVyZSkge1xuICAgICAgICByZXQgPSBhd2FpdCB0aGlzLnRvb2wuY2FwdHVyZSh0aGlzLmFyZ3MsIHsgY3dkOiB0aGlzLmN3ZCB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMudG9vbC5ydW4odGhpcy5hcmdzLCB7IGN3ZDogdGhpcy5jd2QgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsocmNmaWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnZW5lcmF0ZSB0aGUgbW9zdCByZWNlbnQgY2hhbmdlIGxvZ1xuICAgKlxuICAgKiBEbyB0aGlzIGJ5IGRlbGV0aW5nIHRoZSBtb3N0IHJlY2VudCB0YWcsIHJ1bm5pbmcgQ0FUViwgdGhlblxuICAgKiByZXN0b3JpbmcgdGhlIHRhZy5cbiAgICpcbiAgICogV2UgZG8gdGhpcyBjb21iaW5lZCB3aXRoIHNraXBwaW5nIHRoZSBidW1wIHRvIG1ha2UgQ0FUViByZWdlbmVyYXRlIHRoZVxuICAgKiBjaGFuZ2Vsb2cgb2YgdGhlIG1vc3QgcmVjZW50IHJlbGVhc2UgKGlmIHdlIGxlZnQgdGhlIHRhZywgdGhlIGNoYW5nZWxvZ1xuICAgKiB3b3VsZCBiZSBlbXB0eSkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnZW5lcmF0ZVByZXZpb3VzQ2hhbmdlTG9nKHZlcnNpb246IHN0cmluZywgbGF0ZXN0VGFnOiBzdHJpbmcpIHtcbiAgICBjb25zdCBvbGRDb21taXQgPSBnaXQuY2FwdHVyZShbXCJyZXYtcGFyc2VcIiwgbGF0ZXN0VGFnXSwge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICB9KTtcblxuICAgIGdpdC5ydW4oW1widGFnXCIsIFwiLS1kZWxldGVcIiwgbGF0ZXN0VGFnXSwgeyBjd2Q6IHRoaXMuY3dkIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmludm9rZSh7XG4gICAgICAgIHJlbGVhc2VBczogdmVyc2lvbixcbiAgICAgICAgc2tpcEJ1bXA6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2l0LnJ1bihbXCJ0YWdcIiwgbGF0ZXN0VGFnLCBvbGRDb21taXRdLCB7IGN3ZDogdGhpcy5jd2QgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBDQVRWIGFuZCByZXR1cm4gdGhlIHZlcnNpb24gaXQgd291bGQgaGF2ZSBidW1wZWQgdG9cbiAgICpcbiAgICogQ0FUViB3aWxsIGFsd2F5cyBhdCBsZWFzdCBwZXJmb3JtIGEgcGF0Y2ggYnVtcCwgZXZlbiBpZiB0aGVyZSBhcmVuJ3QgYW55XG4gICAqIGNvbW1pdHMgdG8gbG9vayBhdC5cbiAgICpcbiAgICogV2UgaGF2ZSB0byBkbyB0aGlzIGJ5IHBhcnNpbmcgdGhlIG91dHB1dCBzdHJpbmcsIHdoaWNoIGlzIHByZXR0eSBiYWRcbiAgICogYnV0IEkgZG9uJ3Qgc2VlIHRoYXQgd2UgaGF2ZSBhbm90aGVyIHdheS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkcnlSdW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBzdHJpcEFuc2koXG4gICAgICBhd2FpdCB0aGlzLmludm9rZSh7XG4gICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgIGRyeVJ1bjogdHJ1ZSxcbiAgICAgICAgc2tpcENoYW5nZWxvZzogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgcmUgPSAvYnVtcGluZyB2ZXJzaW9uLipmcm9tIChbMC05YS16ListXSspIHRvIChbMC05YS16ListXSspL2ltO1xuICAgIGNvbnN0IG0gPSByZS5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBtYXRjaCAke3JlfSBpbiAke291dHB1dH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbVsyXTtcbiAgfVxufVxuXG4vKipcbiAqIE1vZGVsaW5nIHRoZSBDQVRWIGNvbmZpZyBmaWxlXG4gKi9cbmludGVyZmFjZSBDb21taXRBbmRUYWdDb25maWcgZXh0ZW5kcyBDb25maWcge1xuICBwYWNrYWdlRmlsZXM/OiBBcnJheTx7IGZpbGVuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9PjtcbiAgYnVtcEZpbGVzPzogQXJyYXk8eyBmaWxlbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfT47XG4gIGNvbW1pdEFsbD86IGJvb2xlYW47XG4gIGluZmlsZT86IHN0cmluZztcbiAgcHJlcmVsZWFzZT86IHN0cmluZztcbiAgc2tpcD86IHtcbiAgICBjb21taXQ/OiBib29sZWFuO1xuICAgIHRhZz86IGJvb2xlYW47XG4gICAgYnVtcD86IGJvb2xlYW47XG4gICAgY2hhbmdlbG9nPzogYm9vbGVhbjtcbiAgfTtcbiAgZmlyc3RSZWxlYXNlPzogYm9vbGVhbjtcbiAgdGFnUHJlZml4Pzogc3RyaW5nO1xuICByZWxlYXNlQXM/OiBzdHJpbmc7XG4gIGRyeVJ1bj86IGJvb2xlYW47XG4gIHBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RyaXBzIEFOU0kgZXNjYXBlIGNvZGVzIGZyb20gYSBzdHJpbmdcbiAqXG4gKiBOZWVkIHRvIHVzZSB0aGlzIGJlY2F1c2UgdGhlIGAtLW5vLWNvbG9yc2AgYXJndW1lbnQgdG8gQ0FUViBpcyBzb21ldGltZXNcbiAqIHJlc3BlY3RlZCBhbmQgc29tZXRpbWVzIG5vdCBhbmQgaXQncyBkcml2aW5nIG1lIGNyYXp5LlxuICovXG5mdW5jdGlvbiBzdHJpcEFuc2koc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQYXR0ZXJuIG1hdGNoZXMgYWxsIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBpbmNsdWRpbmcgY29sb3JzLCBjdXJzb3IgbW92ZW1lbnQsIGV0Y1xuICBjb25zdCBwYXR0ZXJuID0gW1xuICAgIFwiW1xcXFx1MDAxQlxcXFx1MDA5Ql1bW1xcXFxdKCkjOz9dKig/Oig/Oig/Oig/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSspKnxbYS16QS1aXFxcXGRdKyg/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSopKik/XFxcXHUwMDA3KVwiLFxuICAgIFwiKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSlcIixcbiAgXS5qb2luKFwifFwiKTtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAocGF0dGVybiwgXCJnXCIpLCBcIlwiKTtcbn1cbiJdfQ==