obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
177 lines (174 loc) • 22.2 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){require=Object.assign(id=>requirePatched(id),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>{const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};return browserProcess},"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&"default"in module?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id){const module=originalRequire?.(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})();
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var ObsidianPluginBuilder_exports = {};
__export(ObsidianPluginBuilder_exports, {
BuildMode: () => BuildMode,
banner: () => banner,
buildObsidianPlugin: () => buildObsidianPlugin,
invokeEsbuild: () => invokeEsbuild
});
module.exports = __toCommonJS(ObsidianPluginBuilder_exports);
var import_dotenv = require('dotenv');
var import_esbuild = require('esbuild');
var import_esbuild_sass_plugin = __toESM(__extractDefault(require('esbuild-sass-plugin')), 1);
var import_Error = require('../../Error.cjs');
var import_ObjectUtils = require('../../ObjectUtils.cjs');
var import_ObsidianPluginRepoPaths = require('../../obsidian/Plugin/ObsidianPluginRepoPaths.cjs');
var import_Path = require('../../Path.cjs');
var import_build = require('../build.cjs');
var import_CliUtils = require('../CliUtils.cjs');
var import_NodeModules = require('../NodeModules.cjs');
var import_Npm = require('../Npm.cjs');
var import_Root = require('../Root.cjs');
var import_copyToObsidianPluginsFolderPlugin = require('./copyToObsidianPluginsFolderPlugin.cjs');
var import_customEsbuildOptionsPlugin = require('./customEsbuildOptionsPlugin.cjs');
var import_fixEsmPlugin = require('./fixEsmPlugin.cjs');
var import_fixSourceMapsPlugin = require('./fixSourceMapsPlugin.cjs');
var import_preprocessPlugin = require('./preprocessPlugin.cjs');
var import_renameCssPlugin = require('./renameCssPlugin.cjs');
var import_svelteWrapperPlugin = require('./svelteWrapperPlugin.cjs');
const sassPlugin = (0, import_ObjectUtils.extractDefaultExportInterop)(import_esbuild_sass_plugin.default);
var BuildMode = /* @__PURE__ */ ((BuildMode2) => {
BuildMode2[BuildMode2["Development"] = 0] = "Development";
BuildMode2[BuildMode2["Production"] = 1] = "Production";
return BuildMode2;
})(BuildMode || {});
const banner = `/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
`;
async function buildObsidianPlugin(options) {
await (0, import_build.buildCompile)();
(0, import_dotenv.config)();
const obsidianPluginBuilderEnv = import_NodeModules.process.env;
const obsidianConfigFolder = options.obsidianConfigFolder ?? obsidianPluginBuilderEnv.OBSIDIAN_CONFIG_FOLDER ?? "";
const isProductionBuild = options.mode === 1 /* Production */;
const distFolder = (0, import_Root.resolvePathFromRoot)(isProductionBuild ? import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.DistBuild : import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.DistDev);
if (!distFolder) {
throw new Error("Could not determine the dist folder");
}
if ((0, import_NodeModules.existsSync)(distFolder)) {
await (0, import_NodeModules.rm)(distFolder, { recursive: true });
}
await (0, import_NodeModules.mkdir)(distFolder, { recursive: true });
const distFileNames = [
import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ManifestJson
];
if (!isProductionBuild) {
await (0, import_NodeModules.writeFile)((0, import_Path.join)(distFolder, import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.HotReload), "", "utf-8");
}
for (const fileName of distFileNames) {
const localFile = (0, import_Root.resolvePathFromRoot)(fileName);
if (!localFile) {
throw new Error(`Could not determine the local file for ${fileName}`);
}
const distFile = (0, import_Path.join)(distFolder, fileName);
if ((0, import_NodeModules.existsSync)(localFile)) {
await (0, import_NodeModules.cp)(localFile, distFile);
}
}
const distPath = (0, import_Path.join)(distFolder, import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.MainJs);
const cssPath = (0, import_Path.join)(distFolder, import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.StylesCss);
const packageJson = await (0, import_Npm.readPackageJson)();
const pluginName = packageJson.name ?? "(unknown)";
const buildOptions = {
banner: {
js: banner
},
bundle: true,
conditions: ["browser"],
entryPoints: [
(0, import_Root.resolvePathFromRoot)((0, import_Path.join)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.Src, import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.MainTs)) ?? (0, import_Error.throwExpression)(new Error("Could not determine the entry point for the plugin"))
],
external: [
"obsidian",
"electron",
"@codemirror/autocomplete",
"@codemirror/collab",
"@codemirror/commands",
"@codemirror/language",
"@codemirror/lint",
"@codemirror/search",
"@codemirror/state",
"@codemirror/view",
"@lezer/common",
"@lezer/highlight",
"@lezer/lr",
"esbuild",
"eslint",
...import_NodeModules.builtinModules
],
format: "cjs",
logLevel: "info",
minify: isProductionBuild,
outfile: distPath,
platform: "node",
plugins: [
(0, import_customEsbuildOptionsPlugin.customEsbuildOptionsPlugin)(options.customizeEsbuildOptions?.bind(options)),
(0, import_svelteWrapperPlugin.svelteWrapperPlugin)(isProductionBuild),
sassPlugin({
sourceMap: !isProductionBuild
}),
(0, import_renameCssPlugin.renameCssPlugin)(distFolder),
(0, import_preprocessPlugin.preprocessPlugin)(),
(0, import_fixEsmPlugin.fixEsmPlugin)(),
(0, import_fixSourceMapsPlugin.fixSourceMapsPlugin)(isProductionBuild, [distPath, cssPath], pluginName),
...options.customEsbuildPlugins ?? [],
(0, import_copyToObsidianPluginsFolderPlugin.copyToObsidianPluginsFolderPlugin)(isProductionBuild, distFolder, obsidianConfigFolder, pluginName)
],
sourcemap: isProductionBuild ? false : "inline",
target: "esnext",
treeShaking: true
};
const buildContext = await (0, import_esbuild.context)(buildOptions);
return await invokeEsbuild(buildContext, isProductionBuild);
}
async function invokeEsbuild(buildContext, isProductionBuild) {
if (isProductionBuild) {
const result = await buildContext.rebuild();
const isSuccess = result.errors.length === 0 && result.warnings.length === 0;
return import_CliUtils.CliTaskResult.Success(isSuccess);
}
await buildContext.watch();
return import_CliUtils.CliTaskResult.DoNotExit();
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
BuildMode,
banner,
buildObsidianPlugin,
invokeEsbuild
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL1NjcmlwdFV0aWxzL2VzYnVpbGQvT2JzaWRpYW5QbHVnaW5CdWlsZGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gYnVpbGQgYW5kIGJ1bmRsZSBhbiBPYnNpZGlhbiBwbHVnaW4gdXNpbmcgZXNidWlsZC5cbiAqIEl0IGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIGJ1aWxkIHByb2Nlc3MgYmFzZWQgb24gZGlmZmVyZW50IGJ1aWxkIG1vZGVzIChkZXZlbG9wbWVudCBvciBwcm9kdWN0aW9uKSxcbiAqIGFuZCBpdCBzZXRzIHVwIHZhcmlvdXMgZXNidWlsZCBwbHVnaW5zIHRvIHByZXByb2Nlc3MsIGxpbnQsIGZpeCBzb3VyY2UgbWFwcywgYW5kIGNvcHkgZmlsZXMgdG8gdGhlIE9ic2lkaWFuIHBsdWdpbnMgZm9sZGVyLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRDb250ZXh0LFxuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGNvbnRleHQgfSBmcm9tICdlc2J1aWxkJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1yZW5hbWUtZGVmYXVsdFxuaW1wb3J0IHNhc3NQbHVnaW5fIGZyb20gJ2VzYnVpbGQtc2Fzcy1wbHVnaW4nO1xuXG5pbXBvcnQgeyB0aHJvd0V4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9FcnJvci50cyc7XG5pbXBvcnQgeyBleHRyYWN0RGVmYXVsdEV4cG9ydEludGVyb3AgfSBmcm9tICcuLi8uLi9PYmplY3RVdGlscy50cyc7XG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uLy4uL29ic2lkaWFuL1BsdWdpbi9PYnNpZGlhblBsdWdpblJlcG9QYXRocy50cyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnLi4vLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBidWlsZENvbXBpbGUgfSBmcm9tICcuLi9idWlsZC50cyc7XG5pbXBvcnQgeyBDbGlUYXNrUmVzdWx0IH0gZnJvbSAnLi4vQ2xpVXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYnVpbHRpbk1vZHVsZXMsXG4gIGNwLFxuICBleGlzdHNTeW5jLFxuICBta2RpcixcbiAgcHJvY2VzcyxcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICcuLi9Ob2RlTW9kdWxlcy50cyc7XG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuLi9OcG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGhGcm9tUm9vdCB9IGZyb20gJy4uL1Jvb3QudHMnO1xuaW1wb3J0IHsgY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luIH0gZnJvbSAnLi9jb3B5VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJQbHVnaW4udHMnO1xuaW1wb3J0IHsgY3VzdG9tRXNidWlsZE9wdGlvbnNQbHVnaW4gfSBmcm9tICcuL2N1c3RvbUVzYnVpbGRPcHRpb25zUGx1Z2luLnRzJztcbmltcG9ydCB7IGZpeEVzbVBsdWdpbiB9IGZyb20gJy4vZml4RXNtUGx1Z2luLnRzJztcbmltcG9ydCB7IGZpeFNvdXJjZU1hcHNQbHVnaW4gfSBmcm9tICcuL2ZpeFNvdXJjZU1hcHNQbHVnaW4udHMnO1xuaW1wb3J0IHsgcHJlcHJvY2Vzc1BsdWdpbiB9IGZyb20gJy4vcHJlcHJvY2Vzc1BsdWdpbi50cyc7XG5pbXBvcnQgeyByZW5hbWVDc3NQbHVnaW4gfSBmcm9tICcuL3JlbmFtZUNzc1BsdWdpbi50cyc7XG5pbXBvcnQgeyBzdmVsdGVXcmFwcGVyUGx1Z2luIH0gZnJvbSAnLi9zdmVsdGVXcmFwcGVyUGx1Z2luLnRzJztcblxuY29uc3Qgc2Fzc1BsdWdpbiA9IGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcChzYXNzUGx1Z2luXyk7XG5cbi8qKlxuICogRW51bWVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBidWlsZCBtb2Rlcy5cbiAqL1xuZXhwb3J0IGVudW0gQnVpbGRNb2RlIHtcbiAgLyoqIERldmVsb3BtZW50IG1vZGUgZm9yIGJ1aWxkaW5nIHRoZSBwbHVnaW4gKi9cbiAgRGV2ZWxvcG1lbnQsXG4gIC8qKiBQcm9kdWN0aW9uIG1vZGUgZm9yIGJ1aWxkaW5nIHRoZSBwbHVnaW4gKi9cbiAgUHJvZHVjdGlvblxufVxuXG4vKipcbiAqIEJhbm5lciB0ZXh0IHRvIGJlIGluY2x1ZGVkIGF0IHRoZSB0b3Agb2YgdGhlIGdlbmVyYXRlZCBmaWxlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJhbm5lciA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBidWlsZGluZyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPYnNpZGlhblBsdWdpbk9wdGlvbnMge1xuICAvKipcbiAgICogQ3VzdG9tIGVzYnVpbGQgcGx1Z2lucyB0byBiZSB1c2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAgICovXG4gIGN1c3RvbUVzYnVpbGRQbHVnaW5zPzogUGx1Z2luW107XG5cbiAgLyoqXG4gICAqIEN1c3RvbWl6ZXMgdGhlIGVzYnVpbGQgb3B0aW9ucy5cbiAgICovXG4gIGN1c3RvbWl6ZUVzYnVpbGRPcHRpb25zPyhvcHRpb25zOiBCdWlsZE9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgbW9kZSwgZWl0aGVyIERldmVsb3BtZW50IG9yIFByb2R1Y3Rpb25cbiAgICovXG4gIG1vZGU6IEJ1aWxkTW9kZTtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBmb3IgT2JzaWRpYW4gY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gdGhlIGBPQlNJRElBTl9DT05GSUdfRk9MREVSYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIG9ic2lkaWFuQ29uZmlnRm9sZGVyPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgT2JzaWRpYW5QbHVnaW5CdWlsZGVyRW52IHtcbiAgT0JTSURJQU5fQ09ORklHX0ZPTERFUjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbW9kZSBhbmQgY29uZmlndXJhdGlvbiBmb2xkZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgYnVpbGRpbmcgdGhlIHBsdWdpbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkT2JzaWRpYW5QbHVnaW4ob3B0aW9uczogQnVpbGRPYnNpZGlhblBsdWdpbk9wdGlvbnMpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+IHtcbiAgYXdhaXQgYnVpbGRDb21waWxlKCk7XG4gIGNvbmZpZygpO1xuICBjb25zdCBvYnNpZGlhblBsdWdpbkJ1aWxkZXJFbnYgPSBwcm9jZXNzLmVudiBhcyBQYXJ0aWFsPE9ic2lkaWFuUGx1Z2luQnVpbGRlckVudj47XG5cbiAgY29uc3Qgb2JzaWRpYW5Db25maWdGb2xkZXIgPSBvcHRpb25zLm9ic2lkaWFuQ29uZmlnRm9sZGVyID8/IG9ic2lkaWFuUGx1Z2luQnVpbGRlckVudi5PQlNJRElBTl9DT05GSUdfRk9MREVSID8/ICcnO1xuICBjb25zdCBpc1Byb2R1Y3Rpb25CdWlsZCA9IG9wdGlvbnMubW9kZSA9PT0gQnVpbGRNb2RlLlByb2R1Y3Rpb247XG5cbiAgY29uc3QgZGlzdEZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3QoaXNQcm9kdWN0aW9uQnVpbGQgPyBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQgOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0RGV2KTtcbiAgaWYgKCFkaXN0Rm9sZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBkaXN0IGZvbGRlcicpO1xuICB9XG5cbiAgaWYgKGV4aXN0c1N5bmMoZGlzdEZvbGRlcikpIHtcbiAgICBhd2FpdCBybShkaXN0Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuICBhd2FpdCBta2RpcihkaXN0Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBkaXN0RmlsZU5hbWVzID0gW1xuICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvblxuICBdO1xuICBpZiAoIWlzUHJvZHVjdGlvbkJ1aWxkKSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oZGlzdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuSG90UmVsb2FkKSwgJycsICd1dGYtOCcpO1xuICB9XG5cbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBkaXN0RmlsZU5hbWVzKSB7XG4gICAgY29uc3QgbG9jYWxGaWxlID0gcmVzb2x2ZVBhdGhGcm9tUm9vdChmaWxlTmFtZSk7XG4gICAgaWYgKCFsb2NhbEZpbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSB0aGUgbG9jYWwgZmlsZSBmb3IgJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgY29uc3QgZGlzdEZpbGUgPSBqb2luKGRpc3RGb2xkZXIsIGZpbGVOYW1lKTtcblxuICAgIGlmIChleGlzdHNTeW5jKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGNwKGxvY2FsRmlsZSwgZGlzdEZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRpc3RQYXRoID0gam9pbihkaXN0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYWluSnMpO1xuICBjb25zdCBjc3NQYXRoID0gam9pbihkaXN0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3MpO1xuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IHBsdWdpbk5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lID8/ICcodW5rbm93biknO1xuXG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIGJhbm5lcjoge1xuICAgICAganM6IGJhbm5lclxuICAgIH0sXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIGNvbmRpdGlvbnM6IFsnYnJvd3NlciddLFxuICAgIGVudHJ5UG9pbnRzOiBbXG4gICAgICByZXNvbHZlUGF0aEZyb21Sb290KGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuU3JjLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYWluVHMpKVxuICAgICAgICA/PyB0aHJvd0V4cHJlc3Npb24obmV3IEVycm9yKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpbicpKVxuICAgIF0sXG4gICAgZXh0ZXJuYWw6IFtcbiAgICAgICdvYnNpZGlhbicsXG4gICAgICAnZWxlY3Ryb24nLFxuICAgICAgJ0Bjb2RlbWlycm9yL2F1dG9jb21wbGV0ZScsXG4gICAgICAnQGNvZGVtaXJyb3IvY29sbGFiJyxcbiAgICAgICdAY29kZW1pcnJvci9jb21tYW5kcycsXG4gICAgICAnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnLFxuICAgICAgJ0Bjb2RlbWlycm9yL2xpbnQnLFxuICAgICAgJ0Bjb2RlbWlycm9yL3NlYXJjaCcsXG4gICAgICAnQGNvZGVtaXJyb3Ivc3RhdGUnLFxuICAgICAgJ0Bjb2RlbWlycm9yL3ZpZXcnLFxuICAgICAgJ0BsZXplci9jb21tb24nLFxuICAgICAgJ0BsZXplci9oaWdobGlnaHQnLFxuICAgICAgJ0BsZXplci9scicsXG4gICAgICAnZXNidWlsZCcsXG4gICAgICAnZXNsaW50JyxcbiAgICAgIC4uLmJ1aWx0aW5Nb2R1bGVzXG4gICAgXSxcbiAgICBmb3JtYXQ6ICdjanMnLFxuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgbWluaWZ5OiBpc1Byb2R1Y3Rpb25CdWlsZCxcbiAgICBvdXRmaWxlOiBkaXN0UGF0aCxcbiAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIGN1c3RvbUVzYnVpbGRPcHRpb25zUGx1Z2luKG9wdGlvbnMuY3VzdG9taXplRXNidWlsZE9wdGlvbnM/LmJpbmQob3B0aW9ucykpLFxuICAgICAgc3ZlbHRlV3JhcHBlclBsdWdpbihpc1Byb2R1Y3Rpb25CdWlsZCksXG4gICAgICBzYXNzUGx1Z2luKHtcbiAgICAgICAgc291cmNlTWFwOiAhaXNQcm9kdWN0aW9uQnVpbGRcbiAgICAgIH0pLFxuICAgICAgcmVuYW1lQ3NzUGx1Z2luKGRpc3RGb2xkZXIpLFxuICAgICAgcHJlcHJvY2Vzc1BsdWdpbigpLFxuICAgICAgZml4RXNtUGx1Z2luKCksXG4gICAgICBmaXhTb3VyY2VNYXBzUGx1Z2luKGlzUHJvZHVjdGlvbkJ1aWxkLCBbZGlzdFBhdGgsIGNzc1BhdGhdLCBwbHVnaW5OYW1lKSxcbiAgICAgIC4uLm9wdGlvbnMuY3VzdG9tRXNidWlsZFBsdWdpbnMgPz8gW10sXG4gICAgICBjb3B5VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJQbHVnaW4oaXNQcm9kdWN0aW9uQnVpbGQsIGRpc3RGb2xkZXIsIG9ic2lkaWFuQ29uZmlnRm9sZGVyLCBwbHVnaW5OYW1lKVxuICAgIF0sXG4gICAgc291cmNlbWFwOiBpc1Byb2R1Y3Rpb25CdWlsZCA/IGZhbHNlIDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnZXNuZXh0JyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZVxuICB9O1xuXG4gIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGNvbnRleHQoYnVpbGRPcHRpb25zKTtcbiAgcmV0dXJuIGF3YWl0IGludm9rZUVzYnVpbGQoYnVpbGRDb250ZXh0LCBpc1Byb2R1Y3Rpb25CdWlsZCk7XG59XG5cbi8qKlxuICogSW52b2tlcyB0aGUgYnVpbGQgcHJvY2VzcyB3aXRoIHRoZSBwcm92aWRlZCBidWlsZCBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBidWlsZENvbnRleHQgLSBUaGUgYnVpbGQgY29udGV4dCBnZW5lcmF0ZWQgYnkgZXNidWlsZC5cbiAqIEBwYXJhbSBpc1Byb2R1Y3Rpb25CdWlsZCAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGJ1aWxkIGlzIGEgcHJvZHVjdGlvbiBidWlsZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludm9rZUVzYnVpbGQoYnVpbGRDb250ZXh0OiBCdWlsZENvbnRleHQsIGlzUHJvZHVjdGlvbkJ1aWxkOiBib29sZWFuKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIGlmIChpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkQ29udGV4dC5yZWJ1aWxkKCk7XG4gICAgY29uc3QgaXNTdWNjZXNzID0gcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAgJiYgcmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5TdWNjZXNzKGlzU3VjY2Vzcyk7XG4gIH1cbiAgYXdhaXQgYnVpbGRDb250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