obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
208 lines (194 loc) • 22.7 kB
JavaScript
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
(function initCjs() {
const globalThisRecord = globalThis;
globalThisRecord['__name'] ??= name;
const originalRequire = require;
if (originalRequire && !originalRequire.__isPatched) {
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
require = Object.assign(
(id) => requirePatched(id),
originalRequire,
{
__isPatched: true
}
);
}
const newFuncs = {
__extractDefault() {
return extractDefault;
},
process() {
const browserProcess = {
browser: true,
cwd() {
return '/';
},
env: {},
platform: 'android'
};
return browserProcess;
}
};
for (const key of Object.keys(newFuncs)) {
globalThisRecord[key] ??= newFuncs[key]?.();
}
function name(obj) {
return obj;
}
function extractDefault(module) {
return module && module.__esModule && 'default' in module ? module.default : module;
}
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
'obsidian',
'@codemirror/autocomplete',
'@codemirror/collab',
'@codemirror/commands',
'@codemirror/language',
'@codemirror/lint',
'@codemirror/search',
'@codemirror/state',
'@codemirror/text',
'@codemirror/view',
'@lezer/common',
'@lezer/lr',
'@lezer/highlight'];
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
'@codemirror/closebrackets',
'@codemirror/comment',
'@codemirror/fold',
'@codemirror/gutter',
'@codemirror/highlight',
'@codemirror/history',
'@codemirror/matchbrackets',
'@codemirror/panel',
'@codemirror/rangeset',
'@codemirror/rectangular-selection',
'@codemirror/stream-parser',
'@codemirror/tooltip'];
function requirePatched(id) {
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
return originalRequire?.(id);
}
// eslint-disable-next-line @typescript-eslint/no-deprecated, @typescript-eslint/no-unnecessary-condition -- We need access to app here which might not be available yet.
if (globalThis?.app?.isMobile) {
if (id === 'process' || id === 'node:process') {
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
return globalThis.process;
}
} else {
const module = originalRequire?.(id);
if (module) {
return extractDefault(module);
}
}
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
return {};
}
})();
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var cli_exports = {};
__export(cli_exports, {
cli: () => cli
});
module.exports = __toCommonJS(cli_exports);
var import_commander = require('commander');
var import_jiti = require('jiti');
var import_Async = require('../Async.cjs');
var import_Path = require('../Path.cjs');
var import_build = require('./build.cjs');
var import_CliUtils = require('./CliUtils.cjs');
var import_ObsidianPluginBuilder = require('./esbuild/ObsidianPluginBuilder.cjs');
var import_ESLint = require('./ESLint/ESLint.cjs');
var import_format = require('./format.cjs');
var import_markdownlint = require('./markdownlint/markdownlint.cjs');
var import_NodeModules = require('./NodeModules.cjs');
var import_Npm = require('./Npm.cjs');
var import_NpmPublish = require('./NpmPublish.cjs');
var import_ObsidianDevUtilsRepoPaths = require('./ObsidianDevUtilsRepoPaths.cjs');
var import_Root = require('./Root.cjs');
var import_spellcheck = require('./spellcheck.cjs');
var import_version = require('./version.cjs');
var __import_meta_url = globalThis["import.meta.url"] ?? (() => {
if (typeof __filename === "string") {
const localRequire = require;
const url = localRequire("node:url");
if (typeof url.pathToFileURL === "function") {
return url.pathToFileURL(__filename).href;
}
}
if (typeof window !== "undefined") {
return window.location.href;
}
return "";
})();
const jiti = (0, import_jiti.createJiti)(__import_meta_url);
const NODE_SCRIPT_ARGV_SKIP_COUNT = 2;
function cli(argv = import_NodeModules.process.argv.slice(NODE_SCRIPT_ARGV_SKIP_COUNT)) {
(0, import_Async.invokeAsyncSafely)(
() => (0, import_CliUtils.wrapCliTask)(async () => {
const packageJson = await (0, import_Npm.readPackageJson)((0, import_Path.getFolderName)(__import_meta_url));
const program = new import_commander.Command();
program.name(packageJson.name ?? "(unknown)").description("CLI for Obsidian plugin development utilities").version(packageJson.version ?? "(unknown)");
addCommand(program, "build" /* Build */, "Build the plugin", () => (0, import_ObsidianPluginBuilder.buildObsidianPlugin)({ mode: import_ObsidianPluginBuilder.BuildMode.Production }));
addCommand(program, "build:clean" /* BuildClean */, "Clean the dist folder", () => (0, import_build.buildClean)());
addCommand(program, "build:compile" /* BuildCompile */, "Check if code compiles", () => (0, import_build.buildCompile)());
addCommand(program, "build:compile:svelte" /* BuildCompileSvelte */, "Check if Svelte code compiles", () => (0, import_build.buildCompileSvelte)());
addCommand(program, "build:compile:typescript" /* BuildCompileTypeScript */, "Check if TypeScript code compiles", () => (0, import_build.buildCompileTypeScript)());
addCommand(program, "build:static" /* BuildStatic */, "Copy static content to dist", () => (0, import_build.buildStatic)());
addCommand(program, "dev" /* Dev */, "Build the plugin in development mode", () => (0, import_ObsidianPluginBuilder.buildObsidianPlugin)({ mode: import_ObsidianPluginBuilder.BuildMode.Development }));
addCommand(program, "format" /* Format */, "Format the source code", () => (0, import_format.format)());
addCommand(program, "format:check" /* FormatCheck */, "Check if the source code is formatted", () => (0, import_format.format)(false));
addCommand(program, "lint" /* Lint */, "Lint the source code", () => (0, import_ESLint.lint)());
addCommand(program, "lint:fix" /* LintFix */, "Lint the source code and apply automatic fixes", () => (0, import_ESLint.lint)(true));
addCommand(program, "lint:md" /* LintMarkdown */, "Lint the markdown documentation", () => (0, import_markdownlint.lintMarkdown)());
addCommand(program, "lint:md:fix" /* LintMarkdownFix */, "Lint the markdown documentation and apply automatic fixes", () => (0, import_markdownlint.lintMarkdown)(true));
addCommand(program, "publish" /* Publish */, "Publish to NPM", (isBeta) => (0, import_NpmPublish.publish)(isBeta)).argument("[isBeta]", "Publish to NPM beta");
addCommand(program, "spellcheck" /* Spellcheck */, "Spellcheck the source code", () => (0, import_spellcheck.spellcheck)());
addCommand(program, "version" /* Version */, "Release a new version", (versionUpdateType) => (0, import_version.updateVersion)(versionUpdateType)).argument("[versionUpdateType]", "Version update type: major, minor, patch, beta, or x.y.z[-suffix]");
await program.parseAsync(argv, { from: "user" });
return import_CliUtils.CliTaskResult.DoNotExit();
})
);
}
function addCommand(program, name, description, taskFn) {
return program.command(name).description(description).action(
(...args) => (0, import_CliUtils.wrapCliTask)(async () => {
const scriptPath = (0, import_Root.resolvePathFromRootSafe)((0, import_Path.join)(import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.Scripts, `${name.replace(":", "-")}.ts`));
if ((0, import_NodeModules.existsSync)(scriptPath)) {
const folder = (0, import_Path.getFolderName)(__import_meta_url);
const relativeScriptPath = (0, import_Path.relative)(folder, scriptPath);
const module2 = await jiti.import(relativeScriptPath);
if (typeof module2.invoke !== "function") {
throw new Error(`${relativeScriptPath} does not export an invoke function`);
}
return module2.invoke(...args);
}
return await taskFn(...args);
})
);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
cli
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL1NjcmlwdFV0aWxzL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1snaW1wb3J0Lm1ldGEudXJsJ10gPz8gKCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbG9jYWxSZXF1aXJlID0gcmVxdWlyZTtcbiAgICAgICAgY29uc3QgdXJsID0gbG9jYWxSZXF1aXJlKCdub2RlOnVybCcpO1xuICAgICAgICBpZiAodHlwZW9mIHVybC5wYXRoVG9GaWxlVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHVybC5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpLmhyZWY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2sgdG8gYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBlbnZpcm9ubWVudCBpcyB1bmtub3duXG4gICAgICByZXR1cm4gJyc7XG4gICAgfSkoKTtcbi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIENMSSBmb3IgbWFuYWdpbmcgdmFyaW91cyB0YXNrcyByZWxhdGVkIHRvIE9ic2lkaWFuIHBsdWdpbiBkZXZlbG9wbWVudC5cbiAqIEl0IGxldmVyYWdlcyB0aGUgYGNvbW1hbmRlcmAgbGlicmFyeSB0byBkZWZpbmUgY29tbWFuZHMgZm9yIGJ1aWxkaW5nLCBsaW50aW5nLCBzcGVsbGNoZWNraW5nLFxuICogYW5kIHVwZGF0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uIFRoZSBDTEkgaXMgZGVzaWduZWQgdG8gYmUgZmxleGlibGUgYW5kIGNhbiBoYW5kbGUgYm90aFxuICogc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyB0YXNrcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGNyZWF0ZUppdGkgfSBmcm9tICdqaXRpJztcblxuaW1wb3J0IHR5cGUgeyBNYXliZVJldHVybiB9IGZyb20gJy4uL1R5cGUudHMnO1xuXG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJy4uL0FzeW5jLnRzJztcbmltcG9ydCB7XG4gIGdldEZvbGRlck5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL1BhdGgudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDbGVhbixcbiAgYnVpbGRDb21waWxlLFxuICBidWlsZENvbXBpbGVTdmVsdGUsXG4gIGJ1aWxkQ29tcGlsZVR5cGVTY3JpcHQsXG4gIGJ1aWxkU3RhdGljXG59IGZyb20gJy4vYnVpbGQudHMnO1xuaW1wb3J0IHtcbiAgQ2xpVGFza1Jlc3VsdCxcbiAgd3JhcENsaVRhc2tcbn0gZnJvbSAnLi9DbGlVdGlscy50cyc7XG5pbXBvcnQge1xuICBCdWlsZE1vZGUsXG4gIGJ1aWxkT2JzaWRpYW5QbHVnaW5cbn0gZnJvbSAnLi9lc2J1aWxkL09ic2lkaWFuUGx1Z2luQnVpbGRlci50cyc7XG5pbXBvcnQgeyBsaW50IH0gZnJvbSAnLi9FU0xpbnQvRVNMaW50LnRzJztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJy4vZm9ybWF0LnRzJztcbmltcG9ydCB7IGxpbnRNYXJrZG93biB9IGZyb20gJy4vbWFya2Rvd25saW50L21hcmtkb3dubGludC50cyc7XG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBwcm9jZXNzXG59IGZyb20gJy4vTm9kZU1vZHVsZXMudHMnO1xuaW1wb3J0IHsgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi9OcG0udHMnO1xuaW1wb3J0IHsgcHVibGlzaCB9IGZyb20gJy4vTnBtUHVibGlzaC50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi9PYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLnRzJztcbmltcG9ydCB7IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlIH0gZnJvbSAnLi9Sb290LnRzJztcbmltcG9ydCB7IHNwZWxsY2hlY2sgfSBmcm9tICcuL3NwZWxsY2hlY2sudHMnO1xuaW1wb3J0IHsgdXBkYXRlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi50cyc7XG5cbmNvbnN0IGppdGkgPSBjcmVhdGVKaXRpKGltcG9ydC5tZXRhLnVybCk7XG5cbi8qKlxuICogQSBudW1iZXIgb2YgbGVhZGluZyBhcmd1bWVudHMgdG8gc2tpcCB3aGVuIHBhcnNpbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cy5cbiAqIEZpcnN0IHR3byBlbGVtZW50cyB0eXBpY2FsbHkgcmVwcmVzZW50IHRoZSBOb2RlLmpzIGV4ZWN1dGFibGUgYW5kIHRoZSBzY3JpcHQgcGF0aDpcbiAqIGBbXCJub2RlXCIsIFwicGF0aC90by9jbGkuY2pzXCIsIC4uLmFjdHVhbEFyZ3NdYFxuICovXG5jb25zdCBOT0RFX1NDUklQVF9BUkdWX1NLSVBfQ09VTlQgPSAyO1xuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBuYW1lcyBvZiB0aGUgY29tbWFuZHMgYXZhaWxhYmxlIGluIHRoZSBDTEkuXG4gKi9cbmVudW0gQ29tbWFuZE5hbWVzIHtcbiAgQnVpbGQgPSAnYnVpbGQnLFxuICBCdWlsZENsZWFuID0gJ2J1aWxkOmNsZWFuJyxcbiAgQnVpbGRDb21waWxlID0gJ2J1aWxkOmNvbXBpbGUnLFxuICBCdWlsZENvbXBpbGVTdmVsdGUgPSAnYnVpbGQ6Y29tcGlsZTpzdmVsdGUnLFxuICBCdWlsZENvbXBpbGVUeXBlU2NyaXB0ID0gJ2J1aWxkOmNvbXBpbGU6dHlwZXNjcmlwdCcsXG4gIEJ1aWxkU3RhdGljID0gJ2J1aWxkOnN0YXRpYycsXG4gIERldiA9ICdkZXYnLFxuICBGb3JtYXQgPSAnZm9ybWF0JyxcbiAgRm9ybWF0Q2hlY2sgPSAnZm9ybWF0OmNoZWNrJyxcbiAgTGludCA9ICdsaW50JyxcbiAgTGludEZpeCA9ICdsaW50OmZpeCcsXG4gIExpbnRNYXJrZG93biA9ICdsaW50Om1kJyxcbiAgTGludE1hcmtkb3duRml4ID0gJ2xpbnQ6bWQ6Zml4JyxcbiAgUHVibGlzaCA9ICdwdWJsaXNoJyxcbiAgU3BlbGxjaGVjayA9ICdzcGVsbGNoZWNrJyxcbiAgVmVyc2lvbiA9ICd2ZXJzaW9uJ1xufVxuXG5pbnRlcmZhY2UgT3ZlcnJpZGVNb2R1bGU8QXJncyBleHRlbmRzIHVua25vd25bXT4ge1xuICBpbnZva2UoLi4uYXJnczogQXJncyk6IFByb21pc2U8TWF5YmVSZXR1cm48Q2xpVGFza1Jlc3VsdD4+O1xufVxuXG4vKipcbiAqIE1haW4gZnVuY3Rpb24gdG8gcnVuIHRoZSBDTEkuIEl0IHNldHMgdXAgdGhlIGNvbW1hbmRzIHVzaW5nIHRoZSBgY29tbWFuZGVyYCBsaWJyYXJ5IGFuZFxuICogaGFuZGxlcyB0aGUgZXhlY3V0aW9uIG9mIHRhc2tzIGxpa2UgYnVpbGRpbmcsIGNsZWFuaW5nLCBsaW50aW5nLCBzcGVsbGNoZWNraW5nLCBhbmQgdmVyc2lvbmluZy5cbiAqXG4gKiBAcGFyYW0gYXJndiAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlLiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5hcmd2YCBtaW51cyB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xpKGFyZ3Y6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2LnNsaWNlKE5PREVfU0NSSVBUX0FSR1ZfU0tJUF9DT1VOVCkpOiB2b2lkIHtcbiAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT5cbiAgICB3cmFwQ2xpVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihnZXRGb2xkZXJOYW1lKGltcG9ydC5tZXRhLnVybCkpO1xuICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbiAgICAgIHByb2dyYW1cbiAgICAgICAgLm5hbWUocGFja2FnZUpzb24ubmFtZSA/PyAnKHVua25vd24pJylcbiAgICAgICAgLmRlc2NyaXB0aW9uKCdDTEkgZm9yIE9ic2lkaWFuIHBsdWdpbiBkZXZlbG9wbWVudCB1dGlsaXRpZXMnKVxuICAgICAgICAudmVyc2lvbihwYWNrYWdlSnNvbi52ZXJzaW9uID8/ICcodW5rbm93biknKTtcblxuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuQnVpbGQsICdCdWlsZCB0aGUgcGx1Z2luJywgKCkgPT4gYnVpbGRPYnNpZGlhblBsdWdpbih7IG1vZGU6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uIH0pKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLkJ1aWxkQ2xlYW4sICdDbGVhbiB0aGUgZGlzdCBmb2xkZXInLCAoKSA9PiBidWlsZENsZWFuKCkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuQnVpbGRDb21waWxlLCAnQ2hlY2sgaWYgY29kZSBjb21waWxlcycsICgpID0+IGJ1aWxkQ29tcGlsZSgpKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLkJ1aWxkQ29tcGlsZVN2ZWx0ZSwgJ0NoZWNrIGlmIFN2ZWx0ZSBjb2RlIGNvbXBpbGVzJywgKCkgPT4gYnVpbGRDb21waWxlU3ZlbHRlKCkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuQnVpbGRDb21waWxlVHlwZVNjcmlwdCwgJ0NoZWNrIGlmIFR5cGVTY3JpcHQgY29kZSBjb21waWxlcycsICgpID0+IGJ1aWxkQ29tcGlsZVR5cGVTY3JpcHQoKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5CdWlsZFN0YXRpYywgJ0NvcHkgc3RhdGljIGNvbnRlbnQgdG8gZGlzdCcsICgpID0+IGJ1aWxkU3RhdGljKCkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuRGV2LCAnQnVpbGQgdGhlIHBsdWdpbiBpbiBkZXZlbG9wbWVudCBtb2RlJywgKCkgPT4gYnVpbGRPYnNpZGlhblBsdWdpbih7IG1vZGU6IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCB9KSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5Gb3JtYXQsICdGb3JtYXQgdGhlIHNvdXJjZSBjb2RlJywgKCkgPT4gZm9ybWF0KCkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuRm9ybWF0Q2hlY2ssICdDaGVjayBpZiB0aGUgc291cmNlIGNvZGUgaXMgZm9ybWF0dGVkJywgKCkgPT4gZm9ybWF0KGZhbHNlKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5MaW50LCAnTGludCB0aGUgc291cmNlIGNvZGUnLCAoKSA9PiBsaW50KCkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuTGludEZpeCwgJ0xpbnQgdGhlIHNvdXJjZSBjb2RlIGFuZCBhcHBseSBhdXRvbWF0aWMgZml4ZXMnLCAoKSA9PiBsaW50KHRydWUpKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLkxpbnRNYXJrZG93biwgJ0xpbnQgdGhlIG1hcmtkb3duIGRvY3VtZW50YXRpb24nLCAoKSA9PiBsaW50TWFya2Rvd24oKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5MaW50TWFya2Rvd25GaXgsICdMaW50IHRoZSBtYXJrZG93biBkb2N1bWVudGF0aW9uIGFuZCBhcHBseSBhdXRvbWF0aWMgZml4ZXMnLCAoKSA9PiBsaW50TWFya2Rvd24odHJ1ZSkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuUHVibGlzaCwgJ1B1Ymxpc2ggdG8gTlBNJywgKGlzQmV0YTogYm9vbGVhbikgPT4gcHVibGlzaChpc0JldGEpKVxuICAgICAgICAuYXJndW1lbnQoJ1tpc0JldGFdJywgJ1B1Ymxpc2ggdG8gTlBNIGJldGEnKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLlNwZWxsY2hlY2ssICdTcGVsbGNoZWNrIHRoZSBzb3VyY2UgY29kZScsICgpID0+IHNwZWxsY2hlY2soKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5WZXJzaW9uLCAnUmVsZWFzZSBhIG5ldyB2ZXJzaW9uJywgKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpID0+IHVwZGF0ZVZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGUpKVxuICAgICAgICAuYXJndW1lbnQoJ1t2ZXJzaW9uVXBkYXRlVHlwZV0nLCAnVmVyc2lvbiB1cGRhdGUgdHlwZTogbWFqb3IsIG1pbm9yLCBwYXRjaCwgYmV0YSwgb3IgeC55LnpbLXN1ZmZpeF0nKTtcbiAgICAgIGF3YWl0IHByb2dyYW0ucGFyc2VBc3luYyhhcmd2LCB7IGZyb206ICd1c2VyJyB9KTtcbiAgICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LkRvTm90RXhpdCgpO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogQWRkcyBhIGNvbW1hbmQgdG8gdGhlIENMSSBwcm9ncmFtIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIHRhc2sgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgYGNvbW1hbmRlcmAgcHJvZ3JhbSBpbnN0YW5jZSB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBhZGRlZC5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGNvbW1hbmQgZG9lcy5cbiAqIEBwYXJhbSB0YXNrRm4gLSBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBjb21tYW5kIGlzIGludm9rZWQuIENhbiByZXR1cm4gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gb3IgYHZvaWRgLlxuICogQHJldHVybnMgVGhlIGBjb21tYW5kZXJgIGNvbW1hbmQgaW5zdGFuY2UgZm9yIGZ1cnRoZXIgY2hhaW5pbmcuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuZnVuY3Rpb24gYWRkQ29tbWFuZDxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihcbiAgcHJvZ3JhbTogQ29tbWFuZCxcbiAgbmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICB0YXNrRm46ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPENsaVRhc2tSZXN1bHQ+PlxuKTogQ29tbWFuZCB7XG4gIHJldHVybiBwcm9ncmFtLmNvbW1hbmQobmFtZSlcbiAgICAuZGVzY3JpcHRpb24oZGVzY3JpcHRpb24pXG4gICAgLmFjdGlvbigoLi4uYXJnczogQXJncykgPT5cbiAgICAgIHdyYXBDbGlUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2NyaXB0UGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKGpvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5TY3JpcHRzLCBgJHtuYW1lLnJlcGxhY2UoJzonLCAnLScpfS50c2ApKTtcbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBmb2xkZXIgPSBnZXRGb2xkZXJOYW1lKGltcG9ydC5tZXRhLnVybCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVTY3JpcHRQYXRoID0gcmVsYXRpdmUoZm9sZGVyLCBzY3JpcHRQYXRoKTtcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBqaXRpLmltcG9ydDxQYXJ0aWFsPE92ZXJyaWRlTW9kdWxlPEFyZ3M+Pj4ocmVsYXRpdmVTY3JpcHRQYXRoKTtcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZS5pbnZva2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZWxhdGl2ZVNjcmlwdFBhdGh9IGRvZXMgbm90IGV4cG9ydCBhbiBpbnZva2UgZnVuY3Rpb25gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1vZHVsZS5pbnZva2UoLi4uYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGFza0ZuKC4uLmFyZ3MpO1xuICAgICAgfSlcbiAgICApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEyQkEsdUJBQXdCO0FBQ3hCLGtCQUEyQjtBQUkzQixtQkFBa0M7QUFDbEMsa0JBSU87QUFDUCxtQkFNTztBQUNQLHNCQUdPO0FBQ1AsbUNBR087QUFDUCxvQkFBcUI7QUFDckIsb0JBQXVCO0FBQ3ZCLDBCQUE2QjtBQUM3Qix5QkFHTztBQUNQLGlCQUFnQztBQUNoQyx3QkFBd0I7QUFDeEIsdUNBQTBDO0FBQzFDLGtCQUF3QztBQUN4Qyx3QkFBMkI7QUFDM0IscUJBQThCO0FBakU5QixJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLE1BQU07QUFDMUQsTUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxVQUFNLGVBQWU7QUFDckIsVUFBTSxNQUFNLGFBQWEsVUFBVTtBQUNuQyxRQUFJLE9BQU8sSUFBSSxrQkFBa0IsWUFBWTtBQUMzQyxhQUFPLElBQUksY0FBYyxVQUFVLEVBQUU7QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sV0FBVyxhQUFhO0FBQ2pDLFdBQU8sT0FBTyxTQUFTO0FBQUEsRUFDekI7QUFHQSxTQUFPO0FBQ1QsR0FBRztBQW9EUCxNQUFNLFdBQU8sd0JBQVcsaUJBQWU7QUFPdkMsTUFBTSw4QkFBOEI7QUFrQzdCLFNBQVMsSUFBSSxPQUFpQiwyQkFBUSxLQUFLLE1BQU0sMkJBQTJCLEdBQVM7QUFDMUY7QUFBQSxJQUFrQixVQUNoQiw2QkFBWSxZQUFZO0FBQ3RCLFlBQU0sY0FBYyxVQUFNLGdDQUFnQiwyQkFBYyxpQkFBZSxDQUFDO0FBQ3hFLFlBQU0sVUFBVSxJQUFJLHlCQUFRO0FBRTVCLGNBQ0csS0FBSyxZQUFZLFFBQVEsV0FBVyxFQUNwQyxZQUFZLCtDQUErQyxFQUMzRCxRQUFRLFlBQVksV0FBVyxXQUFXO0FBRTdDLGlCQUFXLFNBQVMscUJBQW9CLG9CQUFvQixVQUFNLGtEQUFvQixFQUFFLE1BQU0sdUNBQVUsV0FBVyxDQUFDLENBQUM7QUFDckgsaUJBQVcsU0FBUyxnQ0FBeUIseUJBQXlCLFVBQU0seUJBQVcsQ0FBQztBQUN4RixpQkFBVyxTQUFTLG9DQUEyQiwwQkFBMEIsVUFBTSwyQkFBYSxDQUFDO0FBQzdGLGlCQUFXLFNBQVMsaURBQWlDLGlDQUFpQyxVQUFNLGlDQUFtQixDQUFDO0FBQ2hILGlCQUFXLFNBQVMseURBQXFDLHFDQUFxQyxVQUFNLHFDQUF1QixDQUFDO0FBQzVILGlCQUFXLFNBQVMsa0NBQTBCLCtCQUErQixVQUFNLDBCQUFZLENBQUM7QUFDaEcsaUJBQVcsU0FBUyxpQkFBa0Isd0NBQXdDLFVBQU0sa0RBQW9CLEVBQUUsTUFBTSx1Q0FBVSxZQUFZLENBQUMsQ0FBQztBQUN4SSxpQkFBVyxTQUFTLHVCQUFxQiwwQkFBMEIsVUFBTSxzQkFBTyxDQUFDO0FBQ2pGLGlCQUFXLFNBQVMsa0NBQTBCLHlDQUF5QyxVQUFNLHNCQUFPLEtBQUssQ0FBQztBQUMxRyxpQkFBVyxTQUFTLG1CQUFtQix3QkFBd0IsVUFBTSxvQkFBSyxDQUFDO0FBQzNFLGlCQUFXLFNBQVMsMEJBQXNCLGtEQUFrRCxVQUFNLG9CQUFLLElBQUksQ0FBQztBQUM1RyxpQkFBVyxTQUFTLDhCQUEyQixtQ0FBbUMsVUFBTSxrQ0FBYSxDQUFDO0FBQ3RHLGlCQUFXLFNBQVMscUNBQThCLDZEQUE2RCxVQUFNLGtDQUFhLElBQUksQ0FBQztBQUN2SSxpQkFBVyxTQUFTLHlCQUFzQixrQkFBa0IsQ0FBQyxlQUFvQiwyQkFBUSxNQUFNLENBQUMsRUFDN0YsU0FBUyxZQUFZLHFCQUFxQjtBQUM3QyxpQkFBVyxTQUFTLCtCQUF5Qiw4QkFBOEIsVUFBTSw4QkFBVyxDQUFDO0FBQzdGLGlCQUFXLFNBQVMseUJBQXNCLHlCQUF5QixDQUFDLDBCQUE4Qiw4QkFBYyxpQkFBaUIsQ0FBQyxFQUMvSCxTQUFTLHVCQUF1QixtRUFBbUU7QUFDdEcsWUFBTSxRQUFRLFdBQVcsTUFBTSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQy9DLGFBQU8sOEJBQWMsVUFBVTtBQUFBLElBQ2pDLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFZQSxTQUFTLFdBQ1AsU0FDQSxNQUNBLGFBQ0EsUUFDUztBQUNULFNBQU8sUUFBUSxRQUFRLElBQUksRUFDeEIsWUFBWSxXQUFXLEVBQ3ZCO0FBQUEsSUFBTyxJQUFJLGFBQ1YsNkJBQVksWUFBWTtBQUN0QixZQUFNLGlCQUFhLHlDQUF3QixrQkFBSywyREFBMEIsU0FBUyxHQUFHLEtBQUssUUFBUSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDbEgsY0FBSSwrQkFBVyxVQUFVLEdBQUc7QUFDMUIsY0FBTSxhQUFTLDJCQUFjLGlCQUFlO0FBQzVDLGNBQU0seUJBQXFCLHNCQUFTLFFBQVEsVUFBVTtBQUN0RCxjQUFNQSxVQUFTLE1BQU0sS0FBSyxPQUFzQyxrQkFBa0I7QUFDbEYsWUFBSSxPQUFPQSxRQUFPLFdBQVcsWUFBWTtBQUN2QyxnQkFBTSxJQUFJLE1BQU0sR0FBRyxrQkFBa0IscUNBQXFDO0FBQUEsUUFDNUU7QUFDQSxlQUFPQSxRQUFPLE9BQU8sR0FBRyxJQUFJO0FBQUEsTUFDOUI7QUFFQSxhQUFPLE1BQU0sT0FBTyxHQUFHLElBQUk7QUFBQSxJQUM3QixDQUFDO0FBQUEsRUFDSDtBQUNKOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiXQp9Cg==