projen
Version:
CDK for software projects
149 lines • 17.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommitAndTagVersion = void 0;
/**
* Library to invoke commit-and-tag-version
*/
const fs_1 = require("fs");
const path = require("node:path");
const logging = require("../logging");
const util_1 = require("../util");
const DEFAULT_CATV_SPEC = "commit-and-tag-version@^12";
class CommitAndTagVersion {
constructor(packageSpec, cwd, options) {
this.cwd = cwd;
this.options = options;
let cmd;
if (!packageSpec) {
// If no packageSpec is given, try and resolve the CATV binary
// from devDependencies. This will speed up execution a lot.
try {
cmd = `${process.execPath} ${require.resolve("commit-and-tag-version/bin/cli.js")}`;
}
catch {
// Oh well
}
}
this.cmd = cmd ?? `npx ${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 = (0, util_1.execCapture)(this.cmd, {
cwd: this.cwd,
}).toString();
}
else {
ret = (0, util_1.exec)(this.cmd, { 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 = (0, util_1.execCapture)(`git rev-parse ${latestTag}`, {
cwd: this.cwd,
})
.toString("utf8")
.trim();
(0, util_1.exec)(`git tag --delete ${latestTag}`, { cwd: this.cwd });
try {
await this.invoke({
releaseAs: version,
skipBump: true,
});
}
finally {
(0, util_1.exec)(`git 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LXRhZy12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbGVhc2UvY29tbWl0LXRhZy12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsMkJBQW9DO0FBQ3BDLGtDQUFrQztBQUVsQyxzQ0FBc0M7QUFDdEMsa0NBQTRDO0FBRTVDLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCLENBQUM7QUFtQnZELE1BQWEsbUJBQW1CO0lBRzlCLFlBQ0UsV0FBK0IsRUFDZCxHQUFXLEVBQ1gsT0FBNEI7UUFENUIsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNYLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBRTdDLElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLDhEQUE4RDtZQUM5RCw0REFBNEQ7WUFDNUQsSUFBSSxDQUFDO2dCQUNILEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFFLENBQUM7WUFDdEYsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxVQUFVO1lBQ1osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxPQUFPLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxNQUFNLENBQ2pCLE9BQVU7UUFFVixNQUFNLFVBQVUsR0FBdUI7WUFDckMsWUFBWSxFQUFFO2dCQUNaO29CQUNFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7b0JBQ2xDLElBQUksRUFBRSxNQUFNO2lCQUNiO2FBQ0Y7WUFDRCxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVztvQkFDbEMsSUFBSSxFQUFFLE1BQU07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SSxDQUFDLE1BQU0sQ0FBQztZQUNoQixPQUFPLEVBQUUsSUFBSTtZQUNiLE1BQU0sRUFBRSxJQUFJO1lBQ1osYUFBYSxFQUFFLElBQUk7U0FDcEIsQ0FBQyxDQUNILENBQUM7UUFDRixNQUFNLEVBQUUsR0FBRywwREFBMEQsQ0FBQztRQUN0RSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLENBQUM7Q0FDRjtBQXBJRCxrREFvSUM7QUF3QkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxHQUFXO0lBQzVCLG1GQUFtRjtJQUNuRixNQUFNLE9BQU8sR0FBRztRQUNkLDhIQUE4SDtRQUM5SCwwREFBMEQ7S0FDM0QsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExpYnJhcnkgdG8gaW52b2tlIGNvbW1pdC1hbmQtdGFnLXZlcnNpb25cbiAqL1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb25maWctc3BlY1wiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZXhlYywgZXhlY0NhcHR1cmUgfSBmcm9tIFwiLi4vdXRpbFwiO1xuXG5jb25zdCBERUZBVUxUX0NBVFZfU1BFQyA9IFwiY29tbWl0LWFuZC10YWctdmVyc2lvbkBeMTJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb21taXRBbmRUYWdPcHRpb25zIHtcbiAgcmVhZG9ubHkgdGFnUHJlZml4Pzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uRmlsZTogc3RyaW5nO1xuICByZWFkb25seSBjaGFuZ2Vsb2dGaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBwcmVyZWxlYXNlPzogc3RyaW5nO1xuICByZWFkb25seSBjb25maWdPcHRpb25zPzogQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZU9wdGlvbnMge1xuICByZWFkb25seSByZWxlYXNlQXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRyeVJ1bj86IGJvb2xlYW47XG4gIC8qKiBBdm9pZCB1cGRhdGluZyB0aGUgdmVyc2lvbiBmaWxlcyAqL1xuICByZWFkb25seSBza2lwQnVtcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNraXBDaGFuZ2Vsb2c/OiBib29sZWFuO1xuICByZWFkb25seSBjYXB0dXJlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1pdEFuZFRhZ1ZlcnNpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IGNtZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhY2thZ2VTcGVjOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjd2Q6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IENvbW1pdEFuZFRhZ09wdGlvbnMsXG4gICkge1xuICAgIGxldCBjbWQ7XG4gICAgaWYgKCFwYWNrYWdlU3BlYykge1xuICAgICAgLy8gSWYgbm8gcGFja2FnZVNwZWMgaXMgZ2l2ZW4sIHRyeSBhbmQgcmVzb2x2ZSB0aGUgQ0FUViBiaW5hcnlcbiAgICAgIC8vIGZyb20gZGV2RGVwZW5kZW5jaWVzLiBUaGlzIHdpbGwgc3BlZWQgdXAgZXhlY3V0aW9uIGEgbG90LlxuICAgICAgdHJ5IHtcbiAgICAgICAgY21kID0gYCR7cHJvY2Vzcy5leGVjUGF0aH0gJHtyZXF1aXJlLnJlc29sdmUoXCJjb21taXQtYW5kLXRhZy12ZXJzaW9uL2Jpbi9jbGkuanNcIil9YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBPaCB3ZWxsXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jbWQgPSBjbWQgPz8gYG5weCAke3BhY2thZ2VTcGVjID8/IERFRkFVTFRfQ0FUVl9TUEVDfWA7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIHRoZSBgY29tbWl0LWFuZC10YWdgIHBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZva2U8QSBleHRlbmRzIEludm9rZU9wdGlvbnM+KFxuICAgIG9wdGlvbnM6IEEsXG4gICk6IFByb21pc2U8QSBleHRlbmRzIHsgY2FwdHVyZTogdHJ1ZSB9ID8gc3RyaW5nIDogdm9pZD4ge1xuICAgIGNvbnN0IGNhdHZDb25maWc6IENvbW1pdEFuZFRhZ0NvbmZpZyA9IHtcbiAgICAgIHBhY2thZ2VGaWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZW5hbWU6IHRoaXMub3B0aW9ucy52ZXJzaW9uRmlsZSxcbiAgICAgICAgICB0eXBlOiBcImpzb25cIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBidW1wRmlsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLm9wdGlvbnMudmVyc2lvbkZpbGUsXG4gICAgICAgICAgdHlwZTogXCJqc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgY29tbWl0QWxsOiBmYWxzZSxcbiAgICAgIGluZmlsZTogdGhpcy5vcHRpb25zLmNoYW5nZWxvZ0ZpbGUsXG4gICAgICBwcmVyZWxlYXNlOiB0aGlzLm9wdGlvbnMucHJlcmVsZWFzZSxcbiAgICAgIGhlYWRlcjogXCJcIixcbiAgICAgIHNraXA6IHtcbiAgICAgICAgY29tbWl0OiB0cnVlLFxuICAgICAgICB0YWc6IHRydWUsXG4gICAgICAgIGJ1bXA6IG9wdGlvbnMuc2tpcEJ1bXAsXG4gICAgICAgIGNoYW5nZWxvZzogb3B0aW9ucy5za2lwQ2hhbmdlbG9nLFxuICAgICAgfSxcbiAgICAgIHRhZ1ByZWZpeDogdGhpcy5vcHRpb25zLnRhZ1ByZWZpeFxuICAgICAgICA/IGAke3RoaXMub3B0aW9ucy50YWdQcmVmaXh9dmBcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZWxlYXNlQXM6IG9wdGlvbnMucmVsZWFzZUFzLFxuICAgICAgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1bixcbiAgICAgIC4uLnRoaXMub3B0aW9ucy5jb25maWdPcHRpb25zLFxuICAgIH07XG4gICAgbG9nZ2luZy5kZWJ1ZyhgLnZlcnNpb25yYy5qc29uOiAke0pTT04uc3RyaW5naWZ5KGNhdHZDb25maWcpfWApO1xuXG4gICAgLy8gR2VuZXJhdGUgYSB0ZW1wb3JhcnkgY29uZmlnIGZpbGUsIHRoZW4gZXhlY3V0ZSB0aGUgcGFja2FnZSBhbmQgcmVtb3ZlIHRoZVxuICAgIC8vIGNvbmZpZyBmaWxlIGFnYWluLlxuICAgIGNvbnN0IHJjZmlsZSA9IHBhdGguam9pbih0aGlzLmN3ZCwgXCIudmVyc2lvbnJjLmpzb25cIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHJjZmlsZSwgSlNPTi5zdHJpbmdpZnkoY2F0dkNvbmZpZywgdW5kZWZpbmVkLCAyKSk7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXQ6IGFueTtcbiAgICAgIGlmIChvcHRpb25zLmNhcHR1cmUpIHtcbiAgICAgICAgcmV0ID0gZXhlY0NhcHR1cmUodGhpcy5jbWQsIHtcbiAgICAgICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgICB9KS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gZXhlYyh0aGlzLmNtZCwgeyBjd2Q6IHRoaXMuY3dkIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKHJjZmlsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGUgdGhlIG1vc3QgcmVjZW50IGNoYW5nZSBsb2dcbiAgICpcbiAgICogRG8gdGhpcyBieSBkZWxldGluZyB0aGUgbW9zdCByZWNlbnQgdGFnLCBydW5uaW5nIENBVFYsIHRoZW5cbiAgICogcmVzdG9yaW5nIHRoZSB0YWcuXG4gICAqXG4gICAqIFdlIGRvIHRoaXMgY29tYmluZWQgd2l0aCBza2lwcGluZyB0aGUgYnVtcCB0byBtYWtlIENBVFYgcmVnZW5lcmF0ZSB0aGVcbiAgICogY2hhbmdlbG9nIG9mIHRoZSBtb3N0IHJlY2VudCByZWxlYXNlIChpZiB3ZSBsZWZ0IHRoZSB0YWcsIHRoZSBjaGFuZ2Vsb2dcbiAgICogd291bGQgYmUgZW1wdHkpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2VuZXJhdGVQcmV2aW91c0NoYW5nZUxvZyh2ZXJzaW9uOiBzdHJpbmcsIGxhdGVzdFRhZzogc3RyaW5nKSB7XG4gICAgY29uc3Qgb2xkQ29tbWl0ID0gZXhlY0NhcHR1cmUoYGdpdCByZXYtcGFyc2UgJHtsYXRlc3RUYWd9YCwge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICB9KVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnRyaW0oKTtcblxuICAgIGV4ZWMoYGdpdCB0YWcgLS1kZWxldGUgJHtsYXRlc3RUYWd9YCwgeyBjd2Q6IHRoaXMuY3dkIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmludm9rZSh7XG4gICAgICAgIHJlbGVhc2VBczogdmVyc2lvbixcbiAgICAgICAgc2tpcEJ1bXA6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZXhlYyhgZ2l0IHRhZyAke2xhdGVzdFRhZ30gJHtvbGRDb21taXR9YCwgeyBjd2Q6IHRoaXMuY3dkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgQ0FUViBhbmQgcmV0dXJuIHRoZSB2ZXJzaW9uIGl0IHdvdWxkIGhhdmUgYnVtcGVkIHRvXG4gICAqXG4gICAqIENBVFYgd2lsbCBhbHdheXMgYXQgbGVhc3QgcGVyZm9ybSBhIHBhdGNoIGJ1bXAsIGV2ZW4gaWYgdGhlcmUgYXJlbid0IGFueVxuICAgKiBjb21taXRzIHRvIGxvb2sgYXQuXG4gICAqXG4gICAqIFdlIGhhdmUgdG8gZG8gdGhpcyBieSBwYXJzaW5nIHRoZSBvdXRwdXQgc3RyaW5nLCB3aGljaCBpcyBwcmV0dHkgYmFkXG4gICAqIGJ1dCBJIGRvbid0IHNlZSB0aGF0IHdlIGhhdmUgYW5vdGhlciB3YXkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZHJ5UnVuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3RyaXBBbnNpKFxuICAgICAgYXdhaXQgdGhpcy5pbnZva2Uoe1xuICAgICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgICBkcnlSdW46IHRydWUsXG4gICAgICAgIHNraXBDaGFuZ2Vsb2c6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IHJlID0gL2J1bXBpbmcgdmVyc2lvbi4qZnJvbSAoWzAtOWEtei4rLV0rKSB0byAoWzAtOWEtei4rLV0rKS9pbTtcbiAgICBjb25zdCBtID0gcmUuZXhlYyhvdXRwdXQpO1xuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbWF0Y2ggJHtyZX0gaW4gJHtvdXRwdXR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1bMl07XG4gIH1cbn1cblxuLyoqXG4gKiBNb2RlbGluZyB0aGUgQ0FUViBjb25maWcgZmlsZVxuICovXG5pbnRlcmZhY2UgQ29tbWl0QW5kVGFnQ29uZmlnIGV4dGVuZHMgQ29uZmlnIHtcbiAgcGFja2FnZUZpbGVzPzogQXJyYXk8eyBmaWxlbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfT47XG4gIGJ1bXBGaWxlcz86IEFycmF5PHsgZmlsZW5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuICBjb21taXRBbGw/OiBib29sZWFuO1xuICBpbmZpbGU/OiBzdHJpbmc7XG4gIHByZXJlbGVhc2U/OiBzdHJpbmc7XG4gIHNraXA/OiB7XG4gICAgY29tbWl0PzogYm9vbGVhbjtcbiAgICB0YWc/OiBib29sZWFuO1xuICAgIGJ1bXA/OiBib29sZWFuO1xuICAgIGNoYW5nZWxvZz86IGJvb2xlYW47XG4gIH07XG4gIGZpcnN0UmVsZWFzZT86IGJvb2xlYW47XG4gIHRhZ1ByZWZpeD86IHN0cmluZztcbiAgcmVsZWFzZUFzPzogc3RyaW5nO1xuICBkcnlSdW4/OiBib29sZWFuO1xuICBwYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0cmlwcyBBTlNJIGVzY2FwZSBjb2RlcyBmcm9tIGEgc3RyaW5nXG4gKlxuICogTmVlZCB0byB1c2UgdGhpcyBiZWNhdXNlIHRoZSBgLS1uby1jb2xvcnNgIGFyZ3VtZW50IHRvIENBVFYgaXMgc29tZXRpbWVzXG4gKiByZXNwZWN0ZWQgYW5kIHNvbWV0aW1lcyBub3QgYW5kIGl0J3MgZHJpdmluZyBtZSBjcmF6eS5cbiAqL1xuZnVuY3Rpb24gc3RyaXBBbnNpKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUGF0dGVybiBtYXRjaGVzIGFsbCBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgaW5jbHVkaW5nIGNvbG9ycywgY3Vyc29yIG1vdmVtZW50LCBldGNcbiAgY29uc3QgcGF0dGVybiA9IFtcbiAgICBcIltcXFxcdTAwMUJcXFxcdTAwOUJdW1tcXFxcXSgpIzs/XSooPzooPzooPzooPzo7Wy1hLXpBLVpcXFxcZFxcXFwvIyYuOj0/JUB+X10rKSp8W2EtekEtWlxcXFxkXSsoPzo7Wy1hLXpBLVpcXFxcZFxcXFwvIyYuOj0/JUB+X10qKSopP1xcXFx1MDAwNylcIixcbiAgICBcIig/Oig/OlxcXFxkezEsNH0oPzo7XFxcXGR7MCw0fSkqKT9bXFxcXGRBLVBSLVRaY2YtbnRxcnk9Pjx+XSkpXCIsXG4gIF0uam9pbihcInxcIik7XG4gIHJldHVybiBzdHIucmVwbGFjZShuZXcgUmVnRXhwKHBhdHRlcm4sIFwiZ1wiKSwgXCJcIik7XG59XG4iXX0=