obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
257 lines (243 loc) • 17.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 CliUtils_exports = {};
__export(CliUtils_exports, {
CliTaskResult: () => CliTaskResult,
toCommandLine: () => toCommandLine,
wrapCliTask: () => wrapCliTask
});
module.exports = __toCommonJS(CliUtils_exports);
var import_Debug = require('../Debug.cjs');
var import_Error = require('../Error.cjs');
var import_Function = require('../Function.cjs');
var import_String = require('../String.cjs');
var import_NodeModules = require('./NodeModules.cjs');
class CliTaskResult {
/**
* Chains multiple tasks together, executing them sequentially until one fails.
*
* @param tasks - An array of task functions that return a {@link CliTaskResult} or `void`.
* @returns A {@link Promise} that resolves with the first failed {@link CliTaskResult} or a success result.
*/
static async chain(tasks) {
for (const task of tasks) {
const result = await wrapResult(task);
if (!result.isSuccessful()) {
return result;
}
}
return CliTaskResult.Success();
}
/**
* Creates a {@link CliTaskResult} that does not exit the process.
*
* @returns A {@link CliTaskResult} that does not exit the process.
*/
static DoNotExit() {
return new DoNotExitTaskResult();
}
/**
* A failure result of a CLI task.
*
* @returns The failure result.
*/
static Failure() {
return this.Success(false);
}
/**
* Creates a {@link CliTaskResult} based on an exit code.
*
* @param exitCode - The exit code to represent.
* @returns A {@link CliTaskResult} representing the exit code.
*/
static FromExitCode(exitCode) {
return new ExitCodeTaskResult(exitCode);
}
/**
* Creates a CliTaskResult representing a successful task result.
*
* @param isSuccess - A boolean indicating whether the task was successful. Default is true.
* @returns A CliTaskResult object representing a successful task result.
*/
static Success(isSuccess = true) {
return new SuccessTaskResult(isSuccess);
}
}
class DoNotExitTaskResult extends CliTaskResult {
/**
* Does not exit the process.
*/
exit() {
(0, import_Function.noop)();
}
isSuccessful() {
return true;
}
}
class ExitCodeTaskResult extends CliTaskResult {
constructor(exitCode) {
super();
this.exitCode = exitCode;
}
/**
* Exits the process with the specified exit code.
*/
exit() {
import_NodeModules.process.exit(this.exitCode);
}
isSuccessful() {
return this.exitCode === 0;
}
}
class SuccessTaskResult extends CliTaskResult {
constructor(_isSuccessful) {
super();
this._isSuccessful = _isSuccessful;
}
/**
* Exits the process based on the success of the task.
*/
exit() {
import_NodeModules.process.exit(this._isSuccessful ? 0 : 1);
}
isSuccessful() {
return this._isSuccessful;
}
}
function toCommandLine(args) {
return args.map((arg) => {
if (/[\s"\n]/.test(arg)) {
let escapedArg = arg;
escapedArg = (0, import_String.replaceAll)(escapedArg, /"/g, '\\"');
escapedArg = (0, import_String.replaceAll)(escapedArg, /\n/g, "\\n");
return `"${escapedArg}"`;
}
return arg;
}).join(" ");
}
async function wrapCliTask(taskFn) {
(0, import_Debug.enableLibraryDebuggers)();
const result = await wrapResult(taskFn);
result.exit();
}
async function wrapResult(taskFn) {
try {
return await taskFn() ?? CliTaskResult.Success();
} catch (error) {
(0, import_Error.printError)(new Error("An error occurred during task execution", { cause: error }));
return CliTaskResult.Failure();
}
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
CliTaskResult,
toCommandLine,
wrapCliTask
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL1NjcmlwdFV0aWxzL0NsaVV0aWxzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB0YXNrIHJlc3VsdHMsIGluY2x1ZGluZ1xuICogc3VjY2VzcywgZXhpdCBjb2RlcywgYW5kIGNoYWluaW5nIG11bHRpcGxlIHRhc2tzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi9UeXBlLnRzJztcblxuaW1wb3J0IHsgZW5hYmxlTGlicmFyeURlYnVnZ2VycyB9IGZyb20gJy4uL0RlYnVnLnRzJztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICcuLi9FcnJvci50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4uL1N0cmluZy50cyc7XG5pbXBvcnQgeyBwcm9jZXNzIH0gZnJvbSAnLi9Ob2RlTW9kdWxlcy50cyc7XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSB0YXNrLiBJbmNsdWRlcyBtZXRob2RzIGZvciBoYW5kbGluZyBzdWNjZXNzLFxuICogZXhpdCBjb2RlcywgYW5kIGNoYWluaW5nIHRhc2tzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2xpVGFza1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBDaGFpbnMgbXVsdGlwbGUgdGFza3MgdG9nZXRoZXIsIGV4ZWN1dGluZyB0aGVtIHNlcXVlbnRpYWxseSB1bnRpbCBvbmUgZmFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSB0YXNrcyAtIEFuIGFycmF5IG9mIHRhc2sgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IG9yIGB2b2lkYC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBmaXJzdCBmYWlsZWQge0BsaW5rIENsaVRhc2tSZXN1bHR9IG9yIGEgc3VjY2VzcyByZXN1bHQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGNoYWluKHRhc2tzOiAoKCkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxDbGlUYXNrUmVzdWx0Pj4pW10pOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+IHtcbiAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGFza3MpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBSZXN1bHQodGFzayk7XG4gICAgICBpZiAoIXJlc3VsdC5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LlN1Y2Nlc3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IHRoYXQgZG9lcyBub3QgZXhpdCB0aGUgcHJvY2Vzcy5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gdGhhdCBkb2VzIG5vdCBleGl0IHRoZSBwcm9jZXNzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBEb05vdEV4aXQoKTogQ2xpVGFza1Jlc3VsdCB7XG4gICAgcmV0dXJuIG5ldyBEb05vdEV4aXRUYXNrUmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYWlsdXJlIHJlc3VsdCBvZiBhIENMSSB0YXNrLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZmFpbHVyZSByZXN1bHQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIEZhaWx1cmUoKTogQ2xpVGFza1Jlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuU3VjY2VzcyhmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBDbGlUYXNrUmVzdWx0fSBiYXNlZCBvbiBhbiBleGl0IGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBleGl0Q29kZSAtIFRoZSBleGl0IGNvZGUgdG8gcmVwcmVzZW50LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBDbGlUYXNrUmVzdWx0fSByZXByZXNlbnRpbmcgdGhlIGV4aXQgY29kZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgRnJvbUV4aXRDb2RlKGV4aXRDb2RlOiBudW1iZXIpOiBDbGlUYXNrUmVzdWx0IHtcbiAgICByZXR1cm4gbmV3IEV4aXRDb2RlVGFza1Jlc3VsdChleGl0Q29kZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsaVRhc2tSZXN1bHQgcmVwcmVzZW50aW5nIGEgc3VjY2Vzc2Z1bCB0YXNrIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIGlzU3VjY2VzcyAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhc2sgd2FzIHN1Y2Nlc3NmdWwuIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICogQHJldHVybnMgQSBDbGlUYXNrUmVzdWx0IG9iamVjdCByZXByZXNlbnRpbmcgYSBzdWNjZXNzZnVsIHRhc2sgcmVzdWx0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBTdWNjZXNzKGlzU3VjY2VzcyA9IHRydWUpOiBDbGlUYXNrUmVzdWx0IHtcbiAgICByZXR1cm4gbmV3IFN1Y2Nlc3NUYXNrUmVzdWx0KGlzU3VjY2Vzcyk7XG4gIH1cblxuICAvKipcbiAgICogRXhpdHMgdGhlIHByb2Nlc3MgYmFzZWQgb24gdGhlIHRhc2sgcmVzdWx0LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGV4aXQoKTogdm9pZDtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgdGFzayB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBpc1N1Y2Nlc3NmdWwoKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHRhc2sgcmVzdWx0IHRoYXQgZG9lcyBub3QgZXhpdCB0aGUgcHJvY2Vzcy5cbiAqL1xuY2xhc3MgRG9Ob3RFeGl0VGFza1Jlc3VsdCBleHRlbmRzIENsaVRhc2tSZXN1bHQge1xuICAvKipcbiAgICogRG9lcyBub3QgZXhpdCB0aGUgcHJvY2Vzcy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBleGl0KCk6IHZvaWQge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBpc1N1Y2Nlc3NmdWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHRhc2sgcmVzdWx0IGJhc2VkIG9uIGFuIGV4aXQgY29kZS5cbiAqL1xuY2xhc3MgRXhpdENvZGVUYXNrUmVzdWx0IGV4dGVuZHMgQ2xpVGFza1Jlc3VsdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4aXRzIHRoZSBwcm9jZXNzIHdpdGggdGhlIHNwZWNpZmllZCBleGl0IGNvZGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZXhpdCgpOiB2b2lkIHtcbiAgICBwcm9jZXNzLmV4aXQodGhpcy5leGl0Q29kZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaXNTdWNjZXNzZnVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4aXRDb2RlID09PSAwO1xuICB9XG59XG5cbi8qKlxuICogQSB0YXNrIHJlc3VsdCBiYXNlZCBvbiBzdWNjZXNzIG9yIGZhaWx1cmUuXG4gKi9cbmNsYXNzIFN1Y2Nlc3NUYXNrUmVzdWx0IGV4dGVuZHMgQ2xpVGFza1Jlc3VsdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9pc1N1Y2Nlc3NmdWw6IGJvb2xlYW4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4aXRzIHRoZSBwcm9jZXNzIGJhc2VkIG9uIHRoZSBzdWNjZXNzIG9mIHRoZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGV4aXQoKTogdm9pZCB7XG4gICAgcHJvY2Vzcy5leGl0KHRoaXMuX2lzU3VjY2Vzc2Z1bCA/IDAgOiAxKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBpc1N1Y2Nlc3NmdWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3VjY2Vzc2Z1bDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBjb21tYW5kLWxpbmUgc3RyaW5nLlxuICogSGFuZGxlcyBlc2NhcGluZyBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyBzcGFjZXMsIHF1b3RlcywgYW5kIG5ld2xpbmVzLlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29tbWFuZC1saW5lIGludm9jYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NvbW1hbmRMaW5lKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3NcbiAgICAubWFwKChhcmcpID0+IHtcbiAgICAgIGlmICgvW1xcc1wiXFxuXS8udGVzdChhcmcpKSB7XG4gICAgICAgIGxldCBlc2NhcGVkQXJnID0gYXJnO1xuICAgICAgICBlc2NhcGVkQXJnID0gcmVwbGFjZUFsbChlc2NhcGVkQXJnLCAvXCIvZywgJ1xcXFxcIicpO1xuICAgICAgICBlc2NhcGVkQXJnID0gcmVwbGFjZUFsbChlc2NhcGVkQXJnLCAvXFxuL2csICdcXFxcbicpO1xuICAgICAgICByZXR1cm4gYFwiJHtlc2NhcGVkQXJnfVwiYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgfSlcbiAgICAuam9pbignICcpO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgQ0xJIHRhc2sgZnVuY3Rpb24gdG8gZW5zdXJlIGl0IHJ1bnMgc2FmZWx5IGFuZCBoYW5kbGVzIGl0cyB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0uXG4gKlxuICogQHBhcmFtIHRhc2tGbiAtIFRoZSB0YXNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIHdoaWNoIG1heSByZXR1cm4gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gb3IgYHZvaWRgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0YXNrIGlzIGNvbXBsZXRlZCBhbmQgZXhpdHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JhcENsaVRhc2sodGFza0ZuOiAoKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPENsaVRhc2tSZXN1bHQ+Pik6IFByb21pc2U8dm9pZD4ge1xuICBlbmFibGVMaWJyYXJ5RGVidWdnZXJzKCk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBSZXN1bHQodGFza0ZuKTtcbiAgcmVzdWx0LmV4aXQoKTtcbn1cblxuLyoqXG4gKiBTYWZlbHkgZXhlY3V0ZXMgYSB0YXNrIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9LiBJZiB0aGUgdGFzayBmdW5jdGlvbiB0aHJvd3MgYW4gZXJyb3IsXG4gKiBBbiBlcnJvciBpcyBjYXVnaHQsIGFuZCBhIGZhaWx1cmUge0BsaW5rIENsaVRhc2tSZXN1bHR9IGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB0YXNrRm4gLSBUaGUgdGFzayBmdW5jdGlvbiB0byBleGVjdXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IHJlcHJlc2VudGluZyB0aGUgb3V0Y29tZSBvZiB0aGUgdGFzay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JhcFJlc3VsdCh0YXNrRm46ICgpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48Q2xpVGFza1Jlc3VsdD4+KTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCB0YXNrRm4oKSkgYXMgQ2xpVGFza1Jlc3VsdCB8IHVuZGVmaW5lZCA/PyBDbGlUYXNrUmVzdWx0LlN1Y2Nlc3MoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKG5ldyBFcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRhc2sgZXhlY3V0aW9uJywgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LkZhaWx1cmUoKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0EsbUJBQXVDO0FBQ3ZDLG1CQUEyQjtBQUMzQixzQkFBcUI7QUFDckIsb0JBQTJCO0FBQzNCLHlCQUF3QjtBQU1qQixNQUFlLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9sQyxhQUFvQixNQUFNLE9BQWlGO0FBQ3pHLGVBQVcsUUFBUSxPQUFPO0FBQ3hCLFlBQU0sU0FBUyxNQUFNLFdBQVcsSUFBSTtBQUNwQyxVQUFJLENBQUMsT0FBTyxhQUFhLEdBQUc7QUFDMUIsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBRUEsV0FBTyxjQUFjLFFBQVE7QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQWMsWUFBMkI7QUFDdkMsV0FBTyxJQUFJLG9CQUFvQjtBQUFBLEVBQ2pDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBYyxVQUF5QjtBQUNyQyxXQUFPLEtBQUssUUFBUSxLQUFLO0FBQUEsRUFDM0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE9BQWMsYUFBYSxVQUFpQztBQUMxRCxXQUFPLElBQUksbUJBQW1CLFFBQVE7QUFBQSxFQUN4QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsT0FBYyxRQUFRLFlBQVksTUFBcUI7QUFDckQsV0FBTyxJQUFJLGtCQUFrQixTQUFTO0FBQUEsRUFDeEM7QUFhRjtBQUtBLE1BQU0sNEJBQTRCLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUk5QixPQUFhO0FBQzNCLDhCQUFLO0FBQUEsRUFDUDtBQUFBLEVBRW1CLGVBQXdCO0FBQ3pDLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFLQSxNQUFNLDJCQUEyQixjQUFjO0FBQUEsRUFDdEMsWUFBNkIsVUFBa0I7QUFDcEQsVUFBTTtBQUQ0QjtBQUFBLEVBRXBDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsT0FBYTtBQUMzQiwrQkFBUSxLQUFLLEtBQUssUUFBUTtBQUFBLEVBQzVCO0FBQUEsRUFFbUIsZUFBd0I7QUFDekMsV0FBTyxLQUFLLGFBQWE7QUFBQSxFQUMzQjtBQUNGO0FBS0EsTUFBTSwwQkFBMEIsY0FBYztBQUFBLEVBQ3JDLFlBQTZCLGVBQXdCO0FBQzFELFVBQU07QUFENEI7QUFBQSxFQUVwQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLE9BQWE7QUFDM0IsK0JBQVEsS0FBSyxLQUFLLGdCQUFnQixJQUFJLENBQUM7QUFBQSxFQUN6QztBQUFBLEVBRW1CLGVBQXdCO0FBQ3pDLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDRjtBQVNPLFNBQVMsY0FBYyxNQUF3QjtBQUNwRCxTQUFPLEtBQ0osSUFBSSxDQUFDLFFBQVE7QUFDWixRQUFJLFVBQVUsS0FBSyxHQUFHLEdBQUc7QUFDdkIsVUFBSSxhQUFhO0FBQ2pCLHVCQUFhLDBCQUFXLFlBQVksTUFBTSxLQUFLO0FBQy9DLHVCQUFhLDBCQUFXLFlBQVksT0FBTyxLQUFLO0FBQ2hELGFBQU8sSUFBSSxVQUFVO0FBQUEsSUFDdkI7QUFDQSxXQUFPO0FBQUEsRUFDVCxDQUFDLEVBQ0EsS0FBSyxHQUFHO0FBQ2I7QUFRQSxlQUFzQixZQUFZLFFBQXFFO0FBQ3JHLDJDQUF1QjtBQUN2QixRQUFNLFNBQVMsTUFBTSxXQUFXLE1BQU07QUFDdEMsU0FBTyxLQUFLO0FBQ2Q7QUFTQSxlQUFlLFdBQVcsUUFBOEU7QUFDdEcsTUFBSTtBQUNGLFdBQVEsTUFBTSxPQUFPLEtBQW1DLGNBQWMsUUFBUTtBQUFBLEVBQ2hGLFNBQVMsT0FBTztBQUNkLGlDQUFXLElBQUksTUFBTSwyQ0FBMkMsRUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDO0FBQ2pGLFdBQU8sY0FBYyxRQUFRO0FBQUEsRUFDL0I7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K