@unts/patch-package
Version:
Fix broken node modules with no fuss
148 lines (139 loc) • 21.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.rebase = void 0;
const path_1 = require("path");
const picocolors_1 = __importDefault(require("picocolors"));
const applyPatches_1 = require("./applyPatches");
const hash_1 = require("./hash");
const patchFs_1 = require("./patchFs");
const stateFile_1 = require("./stateFile");
function rebase({ appPath, patchDir, packagePathSpecifier, targetPatch, }) {
const patchesDirectory = (0, path_1.join)(appPath, patchDir);
const groupedPatches = (0, patchFs_1.getGroupedPatches)(patchesDirectory);
if (groupedPatches.numPatchFiles === 0) {
console.log(picocolors_1.default.blue("No patch files found"));
process.exit(1);
}
const packagePatches = groupedPatches.pathSpecifierToPatchFiles[packagePathSpecifier];
if (!packagePatches) {
console.log(picocolors_1.default.blue("No patch files found for package"), packagePathSpecifier);
process.exit(1);
}
const state = (0, stateFile_1.getPatchApplicationState)(packagePatches[0]);
if (!state) {
console.log(picocolors_1.default.blue("No patch state found"), "Did you forget to run", picocolors_1.default.bold("patch-package"), "(without arguments) first?");
process.exit(1);
}
if (state.isRebasing) {
console.log(picocolors_1.default.blue("Already rebasing"), "Make changes to the files in", picocolors_1.default.bold(packagePatches[0].path), "and then run `patch-package", packagePathSpecifier, "--continue` to", packagePatches.length === state.patches.length
? "append a patch file"
: `update the ${packagePatches[packagePatches.length - 1].patchFilename} file`);
console.log(`💡 To remove a broken patch file, delete it and reinstall node_modules`);
process.exit(1);
}
if (state.patches.length !== packagePatches.length) {
console.log(picocolors_1.default.blue("Some patches have not been applied."), "Reinstall node_modules and try again.");
}
// check hashes
(0, stateFile_1.verifyAppliedPatches)({ appPath, patchDir, state });
if (targetPatch === "0") {
// unapply all
unApplyPatches({
patches: packagePatches,
appPath,
patchDir,
});
(0, stateFile_1.savePatchApplicationState)({
packageDetails: packagePatches[0],
isRebasing: true,
patches: [],
});
console.log(`
Make any changes you need inside ${picocolors_1.default.bold(packagePatches[0].path)}
When you are done, run
${picocolors_1.default.bold(`patch-package ${packagePathSpecifier} --append 'MyChangeDescription'`)}
to insert a new patch file.
`);
return;
}
// find target patch
const target = packagePatches.find((p) => {
if (p.patchFilename === targetPatch) {
return true;
}
if ((0, path_1.resolve)(process.cwd(), targetPatch) ===
(0, path_1.join)(patchesDirectory, p.patchFilename)) {
return true;
}
if (targetPatch === p.sequenceName) {
return true;
}
const n = Number(targetPatch.replace(/^0+/g, ""));
if (!isNaN(n) && n === p.sequenceNumber) {
return true;
}
return false;
});
if (!target) {
console.log(picocolors_1.default.red("Could not find target patch file"), picocolors_1.default.bold(targetPatch));
console.log();
console.log("The list of available patch files is:");
packagePatches.forEach((p) => {
console.log(` - ${p.patchFilename}`);
});
process.exit(1);
}
const currentHash = (0, hash_1.hashFile)((0, path_1.join)(patchesDirectory, target.patchFilename));
const prevApplication = state.patches.find((p) => p.patchContentHash === currentHash);
if (!prevApplication) {
console.log(picocolors_1.default.red("Could not find previous application of patch file"), picocolors_1.default.bold(target.patchFilename));
console.log();
console.log("You should reinstall node_modules and try again.");
process.exit(1);
}
// ok, we are good to start undoing all the patches that were applied up to but not including the target patch
const targetIdx = state.patches.indexOf(prevApplication);
unApplyPatches({
patches: packagePatches.slice(targetIdx + 1),
appPath,
patchDir,
});
(0, stateFile_1.savePatchApplicationState)({
packageDetails: packagePatches[0],
isRebasing: true,
patches: packagePatches.slice(0, targetIdx + 1).map((p) => ({
patchFilename: p.patchFilename,
patchContentHash: (0, hash_1.hashFile)((0, path_1.join)(patchesDirectory, p.patchFilename)),
didApply: true,
})),
});
console.log(`
Make any changes you need inside ${picocolors_1.default.bold(packagePatches[0].path)}
When you are done, do one of the following:
To update ${picocolors_1.default.bold(packagePatches[targetIdx].patchFilename)} run
${picocolors_1.default.bold(`patch-package ${packagePathSpecifier}`)}
To create a new patch file after ${picocolors_1.default.bold(packagePatches[targetIdx].patchFilename)} run
${picocolors_1.default.bold(`patch-package ${packagePathSpecifier} --append 'MyChangeDescription'`)}
`);
}
exports.rebase = rebase;
function unApplyPatches({ patches, appPath, patchDir, }) {
for (const patch of patches.slice().reverse()) {
if (!(0, applyPatches_1.applyPatch)({
patchFilePath: (0, path_1.join)(appPath, patchDir, patch.patchFilename),
reverse: true,
patchDetails: patch,
patchDir,
cwd: process.cwd(),
bestEffort: false,
})) {
console.log(picocolors_1.default.red("Failed to un-apply patch file"), picocolors_1.default.bold(patch.patchFilename), "Try completely reinstalling node_modules.");
process.exit(1);
}
console.log(picocolors_1.default.cyan(picocolors_1.default.bold("Un-applied")), patch.patchFilename);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmViYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwrQkFBb0M7QUFDcEMsNERBQStCO0FBQy9CLGlEQUEyQztBQUMzQyxpQ0FBaUM7QUFFakMsdUNBQTZDO0FBQzdDLDJDQUlvQjtBQUVwQixTQUFnQixNQUFNLENBQUMsRUFDckIsT0FBTyxFQUNQLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsV0FBVyxHQU1aO0lBQ0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDaEQsTUFBTSxjQUFjLEdBQUcsSUFBQSwyQkFBaUIsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRTFELElBQUksY0FBYyxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUE7UUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtJQUVELE1BQU0sY0FBYyxHQUNsQixjQUFjLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUNoRSxJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsb0JBQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsRUFDL0Msb0JBQW9CLENBQ3JCLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQ0FBd0IsRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUV6RCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxvQkFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUNu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QU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QyxJQUNFLENBQUMsSUFBQSx5QkFBVSxFQUFDO1lBQ1YsYUFBYSxFQUFFLElBQUEsV0FBSSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBVztZQUNyRSxPQUFPLEVBQUUsSUFBSTtZQUNiLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVE7WUFDUixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNsQixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLEVBQ0Y7WUFDQSxPQUFPLENBQUMsR0FBRyxDQUNULG9CQUFNLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLEVBQzNDLG9CQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFDaEMsMkNBQTJDLENBQzVDLENBQUE7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2hCO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBTSxDQUFDLElBQUksQ0FBQyxvQkFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtLQUN6RTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IGNvbG9ycyBmcm9tIFwicGljb2NvbG9yc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoIH0gZnJvbSBcIi4vYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IGhhc2hGaWxlIH0gZnJvbSBcIi4vaGFzaFwiXG5pbXBvcnQgeyBQYXRjaGVkUGFja2FnZURldGFpbHMgfSBmcm9tIFwiLi9QYWNrYWdlRGV0YWlsc1wiXG5pbXBvcnQgeyBnZXRHcm91cGVkUGF0Y2hlcyB9IGZyb20gXCIuL3BhdGNoRnNcIlxuaW1wb3J0IHtcbiAgZ2V0UGF0Y2hBcHBsaWNhdGlvblN0YXRlLFxuICBzYXZlUGF0Y2hBcHBsaWNhdGlvblN0YXRlLFxuICB2ZXJpZnlBcHBsaWVkUGF0Y2hlcyxcbn0gZnJvbSBcIi4vc3RhdGVGaWxlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYmFzZSh7XG4gIGFwcFBhdGgsXG4gIHBhdGNoRGlyLFxuICBwYWNrYWdlUGF0aFNwZWNpZmllcixcbiAgdGFyZ2V0UGF0Y2gsXG59OiB7XG4gIGFwcFBhdGg6IHN0cmluZ1xuICBwYXRjaERpcjogc3RyaW5nXG4gIHBhY2thZ2VQYXRoU3BlY2lmaWVyOiBzdHJpbmdcbiAgdGFyZ2V0UGF0Y2g6IHN0cmluZ1xufSk6IHZvaWQge1xuICBjb25zdCBwYXRjaGVzRGlyZWN0b3J5ID0gam9pbihhcHBQYXRoLCBwYXRjaERpcilcbiAgY29uc3QgZ3JvdXBlZFBhdGNoZXMgPSBnZXRHcm91cGVkUGF0Y2hlcyhwYXRjaGVzRGlyZWN0b3J5KVxuXG4gIGlmIChncm91cGVkUGF0Y2hlcy5udW1QYXRjaEZpbGVzID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmJsdWUoXCJObyBwYXRjaCBmaWxlcyBmb3VuZFwiKSlcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQYXRjaGVzID1cbiAgICBncm91cGVkUGF0Y2hlcy5wYXRoU3BlY2lmaWVyVG9QYXRjaEZpbGVzW3BhY2thZ2VQYXRoU3BlY2lmaWVyXVxuICBpZiAoIXBhY2thZ2VQYXRjaGVzKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjb2xvcnMuYmx1ZShcIk5vIHBhdGNoIGZpbGVzIGZvdW5kIGZvciBwYWNrYWdlXCIpLFxuICAgICAgcGFja2FnZVBhdGhTcGVjaWZpZXIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSBnZXRQYXRjaEFwcGxpY2F0aW9uU3RhdGUocGFja2FnZVBhdGNoZXNbMF0pXG5cbiAgaWYgKCFzdGF0ZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY29sb3JzLmJsdWUoXCJObyBwYXRjaCBzdGF0ZSBmb3VuZFwiKSxcbiAgICAgIFwiRGlkIHlvdSBmb3JnZXQgdG8gcnVuXCIsXG4gICAgICBjb2xvcnMuYm9sZChcInBhdGNoLXBhY2thZ2VcIiksXG4gICAgICBcIih3aXRob3V0IGFyZ3VtZW50cykgZmlyc3Q/XCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIGlmIChzdGF0ZS5pc1JlYmFzaW5nKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjb2xvcnMuYmx1ZShcIkFscmVhZHkgcmViYXNpbmdcIiksXG4gICAgICBcIk1ha2UgY2hhbmdlcyB0byB0aGUgZmlsZXMgaW5cIixcbiAgICAgIGNvbG9ycy5ib2xkKHBhY2thZ2VQYXRjaGVzWzBdLnBhdGgpLFxuICAgICAgXCJhbmQgdGhlbiBydW4gYHBhdGNoLXBhY2thZ2VcIixcbiAgICAgIHBhY2thZ2VQYXRoU3BlY2lmaWVyLFxuICAgICAgXCItLWNvbnRpbnVlYCB0b1wiLFxuICAgICAgcGFja2FnZVBhdGNoZXMubGVuZ3RoID09PSBzdGF0ZS5wYXRjaGVzLmxlbmd0aFxuICAgICAgICA/IFwiYXBwZW5kIGEgcGF0Y2ggZmlsZVwiXG4gICAgICAgIDogYHVwZGF0ZSB0aGUgJHtcbiAgICAgICAgICAgIHBhY2thZ2VQYXRjaGVzW3BhY2thZ2VQYXRjaGVzLmxlbmd0aCAtIDFdLnBhdGNoRmlsZW5hbWVcbiAgICAgICAgICB9IGZpbGVgLFxuICAgIClcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGDwn5KhIFRvIHJlbW92ZSBhIGJyb2tlbiBwYXRjaCBmaWxlLCBkZWxldGUgaXQgYW5kIHJlaW5zdGFsbCBub2RlX21vZHVsZXNgLFxuICAgIClcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBpZiAoc3RhdGUucGF0Y2hlcy5sZW5ndGggIT09IHBhY2thZ2VQYXRjaGVzLmxlbmd0aCkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY29sb3JzLmJsdWUoXCJTb21lIHBhdGNoZXMgaGF2ZSBub3QgYmVlbiBhcHBsaWVkLlwiKSxcbiAgICAgIFwiUmVpbnN0YWxsIG5vZGVfbW9kdWxlcyBhbmQgdHJ5IGFnYWluLlwiLFxuICAgIClcbiAgfVxuICAvLyBjaGVjayBoYXNoZXNcbiAgdmVyaWZ5QXBwbGllZFBhdGNoZXMoeyBhcHBQYXRoLCBwYXRjaERpciwgc3RhdGUgfSlcblxuICBpZiAodGFyZ2V0UGF0Y2ggPT09IFwiMFwiKSB7XG4gICAgLy8gdW5hcHBseSBhbGxcbiAgICB1bkFwcGx5UGF0Y2hlcyh7XG4gICAgICBwYXRjaGVzOiBwYWNrYWdlUGF0Y2hlcyxcbiAgICAgIGFwcFBhdGgsXG4gICAgICBwYXRjaERpcixcbiAgICB9KVxuICAgIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUoe1xuICAgICAgcGFja2FnZURldGFpbHM6IHBhY2thZ2VQYXRjaGVzWzBdLFxuICAgICAgaXNSZWJhc2luZzogdHJ1ZSxcbiAgICAgIHBhdGNoZXM6IFtdLFxuICAgIH0pXG4gICAgY29uc29sZS5sb2coYFxuTWFrZSBhbnkgY2hhbmdlcyB5b3UgbmVlZCBpbnNpZGUgJHtjb2xvcnMuYm9sZChwYWNrYWdlUGF0Y2hlc1swXS5wYXRoKX1cblxuV2hlbiB5b3UgYXJlIGRvbmUsIHJ1blxuXG4gICR7Y29sb3JzLmJvbGQoXG4gICAgYHBhdGNoLXBhY2thZ2UgJHtwYWNrYWdlUGF0aFNwZWNpZmllcn0gLS1hcHBlbmQgJ015Q2hhbmdlRGVzY3JpcHRpb24nYCxcbiAgKX1cbiAgXG50byBpbnNlcnQgYSBuZXcgcGF0Y2ggZmlsZS5cbmApXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBmaW5kIHRhcmdldCBwYXRjaFxuICBjb25zdCB0YXJnZXQgPSBwYWNrYWdlUGF0Y2hlcy5maW5kKChwKSA9PiB7XG4gICAgaWYgKHAucGF0Y2hGaWxlbmFtZSA9PT0gdGFyZ2V0UGF0Y2gpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChcbiAgICAgIHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdGFyZ2V0UGF0Y2gpID09PVxuICAgICAgam9pbihwYXRjaGVzRGlyZWN0b3J5LCBwLnBhdGNoRmlsZW5hbWUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0YXJnZXRQYXRjaCA9PT0gcC5zZXF1ZW5jZU5hbWUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IG4gPSBOdW1iZXIodGFyZ2V0UGF0Y2gucmVwbGFjZSgvXjArL2csIFwiXCIpKVxuICAgIGlmICghaXNOYU4obikgJiYgbiA9PT0gcC5zZXF1ZW5jZU51bWJlcikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0pXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNvbG9ycy5yZWQoXCJDb3VsZCBub3QgZmluZCB0YXJnZXQgcGF0Y2ggZmlsZVwiKSxcbiAgICAgIGNvbG9ycy5ib2xkKHRhcmdldFBhdGNoKSxcbiAgICApXG4gICAgY29uc29sZS5sb2coKVxuICAgIGNvbnNvbGUubG9nKFwiVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHBhdGNoIGZpbGVzIGlzOlwiKVxuICAgIHBhY2thZ2VQYXRjaGVzLmZvckVhY2goKHApID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGAgIC0gJHtwLnBhdGNoRmlsZW5hbWV9YClcbiAgICB9KVxuXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgY29uc3QgY3VycmVudEhhc2ggPSBoYXNoRmlsZShqb2luKHBhdGNoZXNEaXJlY3RvcnksIHRhcmdldC5wYXRjaEZpbGVuYW1lKSlcblxuICBjb25zdCBwcmV2QXBwbGljYXRpb24gPSBzdGF0ZS5wYXRjaGVzLmZpbmQoXG4gICAgKHApID0+IHAucGF0Y2hDb250ZW50SGFzaCA9PT0gY3VycmVudEhhc2gsXG4gIClcbiAgaWYgKCFwcmV2QXBwbGljYXRpb24pIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNvbG9ycy5yZWQoXCJDb3VsZCBub3QgZmluZCBwcmV2aW91cyBhcHBsaWNhdGlvbiBvZiBwYXRjaCBmaWxlXCIpLFxuICAgICAgY29sb3JzLmJvbGQodGFyZ2V0LnBhdGNoRmlsZW5hbWUpLFxuICAgIClcbiAgICBjb25zb2xlLmxvZygpXG4gICAgY29uc29sZS5sb2coXCJZb3Ugc2hvdWxkIHJlaW5zdGFsbCBub2RlX21vZHVsZXMgYW5kIHRyeSBhZ2Fpbi5cIilcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuXG4gIC8vIG9rLCB3ZSBhcmUgZ29vZCB0byBzdGFydCB1bmRvaW5nIGFsbCB0aGUgcGF0Y2hlcyB0aGF0IHdlcmUgYXBwbGllZCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgdGFyZ2V0IHBhdGNoXG4gIGNvbnN0IHRhcmdldElkeCA9IHN0YXRlLnBhdGNoZXMuaW5kZXhPZihwcmV2QXBwbGljYXRpb24pXG5cbiAgdW5BcHBseVBhdGNoZXMoe1xuICAgIHBhdGNoZXM6IHBhY2thZ2VQYXRjaGVzLnNsaWNlKHRhcmdldElkeCArIDEpLFxuICAgIGFwcFBhdGgsXG4gICAgcGF0Y2hEaXIsXG4gIH0pXG4gIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUoe1xuICAgIHBhY2thZ2VEZXRhaWxzOiBwYWNrYWdlUGF0Y2hlc1swXSxcbiAgICBpc1JlYmFzaW5nOiB0cnVlLFxuICAgIHBhdGNoZXM6IHBhY2thZ2VQYXRjaGVzLnNsaWNlKDAsIHRhcmdldElkeCArIDEpLm1hcCgocCkgPT4gKHtcbiAgICAgIHBhdGNoRmlsZW5hbWU6IHAucGF0Y2hGaWxlbmFtZSxcbiAgICAgIHBhdGNoQ29udGVudEhhc2g6IGhhc2hGaWxlKGpvaW4ocGF0Y2hlc0RpcmVjdG9yeSwgcC5wYXRjaEZpbGVuYW1lKSksXG4gICAgICBkaWRBcHBseTogdHJ1ZSxcbiAgICB9KSksXG4gIH0pXG5cbiAgY29uc29sZS5sb2coYFxuTWFrZSBhbnkgY2hhbmdlcyB5b3UgbmVlZCBpbnNpZGUgJHtjb2xvcnMuYm9sZChwYWNrYWdlUGF0Y2hlc1swXS5wYXRoKX1cblxuV2hlbiB5b3UgYXJlIGRvbmUsIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXG4gIFRvIHVwZGF0ZSAke2NvbG9ycy5ib2xkKHBhY2thZ2VQYXRjaGVzW3RhcmdldElkeF0ucGF0Y2hGaWxlbmFtZSl9IHJ1blxuXG4gICAgJHtjb2xvcnMuYm9sZChgcGF0Y2gtcGFja2FnZSAke3BhY2thZ2VQYXRoU3BlY2lmaWVyfWApfVxuICAgIFxuICBUbyBjcmVhdGUgYSBuZXcgcGF0Y2ggZmlsZSBhZnRlciAke2NvbG9ycy5ib2xkKFxuICAgIHBhY2thZ2VQYXRjaGVzW3RhcmdldElkeF0ucGF0Y2hGaWxlbmFtZSxcbiAgKX0gcnVuXG4gIFxuICAgICR7Y29sb3JzLmJvbGQoXG4gICAgICBgcGF0Y2gtcGFja2FnZSAke3BhY2thZ2VQYXRoU3BlY2lmaWVyfSAtLWFwcGVuZCAnTXlDaGFuZ2VEZXNjcmlwdGlvbidgLFxuICAgICl9XG5cbiAgYClcbn1cblxuZnVuY3Rpb24gdW5BcHBseVBhdGNoZXMoe1xuICBwYXRjaGVzLFxuICBhcHBQYXRoLFxuICBwYXRjaERpcixcbn06IHtcbiAgcGF0Y2hlczogUGF0Y2hlZFBhY2thZ2VEZXRhaWxzW11cbiAgYXBwUGF0aDogc3RyaW5nXG4gIHBhdGNoRGlyOiBzdHJpbmdcbn0pIHtcbiAgZm9yIChjb25zdCBwYXRjaCBvZiBwYXRjaGVzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgaWYgKFxuICAgICAgIWFwcGx5UGF0Y2goe1xuICAgICAgICBwYXRjaEZpbGVQYXRoOiBqb2luKGFwcFBhdGgsIHBhdGNoRGlyLCBwYXRjaC5wYXRjaEZpbGVuYW1lKSBhcyBzdHJpbmcsXG4gICAgICAgIHJldmVyc2U6IHRydWUsXG4gICAgICAgIHBhdGNoRGV0YWlsczogcGF0Y2gsXG4gICAgICAgIHBhdGNoRGlyLFxuICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgIGJlc3RFZmZvcnQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjb2xvcnMucmVkKFwiRmFpbGVkIHRvIHVuLWFwcGx5IHBhdGNoIGZpbGVcIiksXG4gICAgICAgIGNvbG9ycy5ib2xkKHBhdGNoLnBhdGNoRmlsZW5hbWUpLFxuICAgICAgICBcIlRyeSBjb21wbGV0ZWx5IHJlaW5zdGFsbGluZyBub2RlX21vZHVsZXMuXCIsXG4gICAgICApXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG4gICAgY29uc29sZS5sb2coY29sb3JzLmN5YW4oY29sb3JzLmJvbGQoXCJVbi1hcHBsaWVkXCIpKSwgcGF0Y2gucGF0Y2hGaWxlbmFtZSlcbiAgfVxufVxuIl19