diff --git a/main.js b/main.js deleted file mode 100644 index 712ea95..0000000 --- a/main.js +++ /dev/null @@ -1,579 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -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); - -// main.ts -var main_exports = {}; -__export(main_exports, { - default: () => VaultExpoterPlugin -}); -module.exports = __toCommonJS(main_exports); -var import_obsidian3 = require("obsidian"); - -// src/fseditor.ts -var import_obsidian = require("obsidian"); -var FsEditor = class { - constructor(plugin) { - this.plugin = plugin; - this.fs = require("fs"); - this.path = require("path"); - } - get root() { - let a = this.plugin.app.vault.adapter; - return a.basePath.replace(/\\/g, "/"); - } - get notechain() { - let nc = this.plugin.app.plugins.getPlugin("note-chain"); - return nc; - } - abspath(tfile) { - if (tfile) { - return (this.root + "/" + tfile.path).replace(/\\/g, "/"); - } else { - return null; - } - } - isfile(path) { - return this.fs.existsSync(path) && this.fs.statSync(path).isFile(); - } - isdir(path) { - return this.fs.existsSync(path) && this.fs.statSync(path).isDirectory(); - } - list_dir(path, as_fullpath = true) { - if (!this.isdir(path)) { - return []; - } - let items = this.fs.readdirSync(path); - if (as_fullpath) { - items = items.map( - (x) => { - return path + "/" + x; - } - ); - } - return items; - } - first_valid_dir(paths) { - if (typeof paths == "string") { - if (this.isdir(paths)) { - return paths; - } else { - return null; - } - } - for (let path of paths) { - if (this.isdir(path)) { - return path; - } - } - return null; - } - async select_valid_dir(paths) { - let xpaths = paths.filter((p) => this.isdir(p)); - if (xpaths.length === 0) { - return null; - } else if (xpaths.length == 1) { - return xpaths[0]; - } else { - let nc = this.plugin.app.plugins.getPlugin("note-chain"); - if (nc) { - let path = await nc.chain.tp_suggester(xpaths, xpaths); - return path; - } else { - return null; - } - } - } - mkdir_recursive(path) { - if (this.isdir(path)) { - return true; - } - let parent = this.path.dirname(path); - if (!this.isdir(parent)) { - this.mkdir_recursive(parent); - } - this.fs.mkdirSync(path); - } - /** - * 附件 src 到 dst,不在 vault 中,需要绝对路径 - * overwrite,复盖;mtime,新文件; - */ - copy_file(src, dst, mode = "pass>overwrite>mtime") { - let fs = this.fs; - mode = mode.split(">")[0]; - if (!fs.existsSync(src)) { - return false; - } - if (fs.existsSync(dst)) { - if (mode === "overwrite") { - fs.unlinkSync(dst); - fs.copyFileSync(src, dst); - return true; - } else if (mode === "mtime") { - if (fs.statSync(dst).mtimeMs < fs.statSync(src).mtimeMs) { - fs.unlinkSync(dst); - fs.copyFileSync(src, dst); - return true; - } - } - } else { - fs.copyFileSync(src, dst); - return true; - } - return false; - } - copy_tfile(tfile, dst, mode = "mtime") { - if (tfile) { - let src = this.abspath(tfile); - return src && this.copy_file(src, dst, mode); - } - return false; - } - mirror_tfile(tfile, vault_root, mode = "mtime", attachment = true, outlink = false) { - if (tfile) { - vault_root = vault_root.replace(/\\/g, "/"); - let src = this.root + "/" + tfile.path; - let dst = vault_root + "/" + tfile.path; - this.mkdir_recursive(this.path.dirname(dst)); - this.copy_file(src, dst, mode); - if (attachment) { - let nc = this.notechain; - if (!nc) { - return; - } - let tfiles = nc.chain.get_outlinks(tfile, false); - for (let t of tfiles) { - if (!(t.extension === "md")) { - this.mirror_tfile(t, vault_root, mode, false); - } else if (outlink) { - this.mirror_tfile(t, vault_root, mode, false); - } - } - } - } - } - mirror_tfolder(tfolder, vault_root, mode = "mtime", attachment = true, outlink = false, strict = false) { - if (tfolder) { - for (let t of tfolder.children) { - if (t instanceof import_obsidian.TFolder) { - this.mirror_tfolder(t, vault_root, mode, attachment, outlink); - } else if (t instanceof import_obsidian.TFile) { - this.mirror_tfile(t, vault_root, mode, attachment, outlink); - } - } - if (strict) { - let dst = vault_root + "/" + tfolder.path; - let src = this.abspath(tfolder); - if (src && dst) { - this.remove_files_not_in_src(src, dst); - } - } - } - } - delete_file_or_dir(path) { - if (this.isfile(path)) { - this.fs.unlinkSync(path); - } else if (this.isdir(path)) { - let items = this.list_dir(path, true); - for (let item of items) { - this.delete_file_or_dir(item); - } - this.fs.rmdirSync(path); - } - } - remove_files_not_in_src(src, dst) { - if (!this.isdir(src) || !this.isdir(dst)) { - return; - } - let items = this.list_dir(dst, false); - for (let item of items) { - let adst = dst + "/" + item; - let asrc = src + "/" + item; - if (this.isfile(adst)) { - if (!this.isfile(asrc)) { - this.fs.unlinkSync(adst); - } - } else if (this.isdir(adst)) { - if (!this.isdir(asrc)) { - this.delete_file_or_dir(adst); - } else { - this.remove_files_not_in_src(asrc, adst); - } - } - } - } - mirror_folder(src, dst, mode = "mtime", strict = false) { - if (!this.isdir(src)) { - return; - } - this.mkdir_recursive(dst); - if (!this.isdir(dst)) { - return; - } - let items = this.list_dir(src, false); - for (let item of items) { - let asrc = this.path.join(src, item); - let adst = this.path.join(dst, item); - if (this.isfile(asrc)) { - this.copy_file(asrc, adst, mode); - } else if (this.isdir(asrc)) { - this.mirror_folder(asrc, adst, mode, strict); - } - } - if (strict) { - this.remove_files_not_in_src(src, dst); - } - } - modify(path, callback, encoding = "utf8") { - let fs = this.fs; - if (!fs.existsSync(path)) { - return; - } - ; - fs.readFile( - path, - encoding, - (err, data) => { - if (err) { - console.error("Error reading file:", err); - } - let rs = callback(path, data); - fs.writeFile(path, rs, encoding, (err2) => { - if (err2) { - console.error("Error writing file:", err2); - } else { - console.log("File content updated successfully."); - } - }); - } - ); - } -}; - -// src/strings.ts -var Strings = class { - constructor() { - let lang = window.localStorage.getItem("language"); - if (lang) { - this.language = lang; - } else { - this.language = "en"; - } - } - get cmd_export_current_note() { - if (this.language == "zh") { - return "\u5BFC\u51FA\u5F53\u524D\u7B14\u8BB0"; - } else { - return "Export current note"; - } - } - get cmd_set_vexporter() { - if (this.language == "zh") { - return "\u8BBE\u7F6E\u5BFC\u51FA\u7B14\u8BB0\u9009\u9879"; - } else { - return "Set config to export note"; - } - } - get cmd_export_plugin() { - if (this.language == "zh") { - return "\u5BFC\u51FA\u63D2\u4EF6"; - } else { - return "Export plugin"; - } - } - get prompt_path_of_folder() { - if (this.language == "zh") { - return "\u8F93\u5165\u6587\u4EF6\u5939\u8DEF\u5F84"; - } else { - return "Input path of folder"; - } - } - get notice_output() { - if (this.language == "zh") { - return "\u5BFC\u51FA\uFF1A"; - } else { - return "Output:"; - } - } - get notice_nosuchdir() { - if (this.language == "zh") { - return "\u65E0\u6548\u76EE\u5F55"; - } else { - return "Invaid path."; - } - } - get setting_plugin_dir() { - if (this.language == "zh") { - return "\u63D2\u4EF6\u5BFC\u51FA\u76EE\u5F55"; - } else { - return "Plugin dir to export"; - } - } - get setting_vault_dir() { - if (this.language == "zh") { - return "\u5E93\u76EE\u5F55"; - } else { - return "Root dir of vault"; - } - } -}; -var strings = new Strings(); - -// src/setting.ts -var import_obsidian2 = require("obsidian"); -var DEFAULT_SETTINGS = { - pluginDirExporter: "", - vaultDir: "" -}; -var VExporterSettingTab = class extends import_obsidian2.PluginSettingTab { - constructor(app, plugin) { - super(app, plugin); - this.plugin = plugin; - } - getSettingValue(field) { - return this.plugin.settings[field]; - } - add_toggle(name, desc, field) { - let { containerEl } = this; - let value = this.plugin.settings[field]; - let item = new import_obsidian2.Setting(containerEl).setName(name).setDesc(desc).addToggle( - (text) => text.setValue(value).onChange(async (value2) => { - this.plugin.settings[field] = value2; - await this.plugin.saveSettings(); - }) - ); - return item; - } - display() { - const { containerEl } = this; - containerEl.empty(); - new import_obsidian2.Setting(containerEl).setName(this.plugin.strings.setting_plugin_dir).addTextArea((text) => text.setValue(this.plugin.settings.pluginDirExporter).onChange(async (value) => { - this.plugin.settings.pluginDirExporter = value; - await this.plugin.saveSettings(); - })); - new import_obsidian2.Setting(containerEl).setName(this.plugin.strings.setting_vault_dir).addTextArea((text) => text.setValue(this.plugin.settings.vaultDir).onChange(async (value) => { - this.plugin.settings.vaultDir = value; - await this.plugin.saveSettings(); - })); - } -}; - -// src/commands.ts -var cmd_export_current_note = (plugin) => ({ - id: "cmd_export_current_note", - name: plugin.strings.cmd_export_current_note, - callback: async () => { - const nc = plugin.notechain; - let tfile = nc.chain.current_note; - await plugin.export_readme(tfile, null); - } -}); -var cmd_set_vexporter = (plugin) => ({ - id: "cmd_set_vexporter", - name: plugin.strings.cmd_set_vexporter, - callback: async () => { - const nc = plugin.notechain; - let dir = await nc.chain.tp_prompt(plugin.strings.prompt_path_of_folder); - let item = {}; - if (plugin.fsEditor.fs.existsSync(dir)) { - item["Dir"] = dir; - } - item["Name"] = "readMe"; - item["Assets"] = "./assets"; - item["RemoveMeta"] = true; - item["UseGitLink"] = true; - await nc.editor.set_frontmatter( - nc.chain.current_note, - "vexporter", - item - ); - } -}); -var cmd_export_plugin = (plugin) => ({ - id: "cmd_export_plugin", - name: plugin.strings.cmd_export_plugin, - callback: async () => { - const nc = plugin.notechain; - let plugins = Object.keys(plugin.app.plugins.plugins); - let p = await nc.chain.tp_suggester(plugins, plugins); - let eplugin = plugin.app.plugins.getPlugin(p); - if (eplugin) { - let target = await plugin.fsEditor.select_valid_dir( - plugin.settings.pluginDirExporter.split("\n") - ); - if (!plugin.fsEditor.fs.existsSync(target)) { - target = await nc.chain.tp_prompt(plugin.strings.prompt_path_of_folder); - } - target = target.replace(/\\/g, "/"); - if (!target.endsWith("/" + p)) { - target = target + "/" + p; - } - if (!plugin.fsEditor.fs.existsSync(target)) { - plugin.fsEditor.fs.mkdirSync(target); - } - let items = ["main.js", "manifest.json", "styles.css"]; - for (let item of items) { - let src = `${plugin.fsEditor.root}/${eplugin.manifest.dir}/${item}`; - let dst = `${target}/${item}`; - plugin.fsEditor.copy_file(src, dst, "overwrite"); - } - } - } -}); -var commandBuilders = []; -var commandBuildersDesktop = [ - cmd_export_current_note, - cmd_set_vexporter, - cmd_export_plugin -]; -function addCommands(plugin) { - commandBuilders.forEach((c) => { - plugin.addCommand(c(plugin)); - }); - if (plugin.app.isMobile == false) { - commandBuildersDesktop.forEach((c) => { - plugin.addCommand(c(plugin)); - }); - } -} - -// main.ts -var VaultExpoterPlugin = class extends import_obsidian3.Plugin { - async onload() { - if (this.app.workspace.layoutReady) { - await this._onload_(); - } else { - this.app.workspace.onLayoutReady( - async () => { - await this._onload_(); - } - ); - } - } - async _onload_() { - this.strings = new Strings(); - await this.loadSettings(); - this.fsEditor = new FsEditor(this); - this.addSettingTab(new VExporterSettingTab(this.app, this)); - addCommands(this); - this.registerEvent( - this.app.workspace.on("file-menu", (menu, file) => { - menu.addItem((item) => { - item.setTitle("Mirror to other vault").setIcon("document").onClick(async () => { - let dst = await this.fsEditor.select_valid_dir( - this.settings.vaultDir.split("\n") - ); - if (!dst) { - let nc = this.app.plugins.getPlugin("note-chain"); - if (!nc) { - new import_obsidian3.Notice("Plugin note-chain is needed!"); - return; - } - dst = await nc.chain.tp_prompt("Root of vault"); - if (!this.fsEditor.isdir(dst)) { - new import_obsidian3.Notice("Invalid root: " + dst); - return; - } - } - if (file instanceof import_obsidian3.TFile) { - this.fsEditor.mirror_tfile(file, dst, "mtime", true, false); - } else if (file instanceof import_obsidian3.TFolder) { - this.fsEditor.mirror_tfolder(file, dst, "mtime", true, false); - } - }); - }); - }) - ); - } - onunload() { - } - get notechain() { - return this.app.plugins.getPlugin("note-chain"); - } - async loadSettings() { - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); - } - async saveSettings() { - await this.saveData(this.settings); - } - async export_readme(tfile, dst) { - var _a, _b, _c, _d; - let nc = this.app.plugins.getPlugin("note-chain"); - if (!tfile) { - tfile = nc.chain.current_note; - } - if (!dst) { - dst = (_a = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _a.Dir; - if (!dst) { - dst = await nc.chain.tp_prompt("Path of LocalGitProject"); - } - } - if (!dst || !this.fsEditor.fs.existsSync(dst)) { - new import_obsidian3.Notice(this.strings.notice_nosuchdir, 3e3); - return; - } - dst = dst.replace(/\\/g, "/"); - let tmp; - let name = (_b = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _b.Name; - if (name && !(name === "")) { - tmp = dst + "/" + name + ".md"; - } else { - tmp = dst + "/" + tfile.basename + ".md"; - } - if (this.fsEditor.copy_tfile(tfile, tmp)) { - if ((_c = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _c.RemoveMeta) { - const ufunc = (path, data) => { - var _a2, _b2; - let res = data; - if ((_a2 = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _a2.RemoveMeta) { - res = res.replace( - /---[\n(\r\n)][\s\S]*?---[\n(\r\n)]/, - "" - ); - } - if (((_b2 = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _b2.UseGitLink) && assets) { - res = res.replace( - /\!\[\[(.*?)\]\]/g, - (match, name2) => { - return `![${name2}](${assets}/${name2.replace(/ /g, "%20")})`; - } - ); - } - return res; - }; - await this.fsEditor.modify(tmp, ufunc); - } - } - let assets = (_d = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _d.Assets; - if (assets) { - let olinks = nc.chain.get_outlinks(tfile); - let adir = dst + "/" + assets; - this.fsEditor.mkdir_recursive(adir); - for (let f of olinks) { - if (!(f.extension === "md")) { - this.fsEditor.copy_tfile(f, adir + "/" + f.basename + "." + f.extension); - } - } - } - } -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvZnNlZGl0b3IudHMiLCAic3JjL3N0cmluZ3MudHMiLCAic3JjL3NldHRpbmcudHMiLCAic3JjL2NvbW1hbmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBNb2R1bGUgZnJvbSAnbW9kdWxlJztcclxuaW1wb3J0IHsgQXBwLCBFZGl0b3IsIE1hcmtkb3duVmlldywgTW9kYWwsIE5vdGljZSwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBURmlsZSwgVEZvbGRlciB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCB7IEZzRWRpdG9yIH0gZnJvbSAnc3JjL2ZzZWRpdG9yJztcclxuaW1wb3J0IHsgU3RyaW5ncyB9IGZyb20gJ3NyYy9zdHJpbmdzJztcclxuaW1wb3J0IHtWRXhwb3J0ZXJTZXR0aW5ncyxWRXhwb3J0ZXJTZXR0aW5nVGFiLERFRkFVTFRfU0VUVElOR1N9IGZyb20gJ3NyYy9zZXR0aW5nJ1xyXG5cclxuaW1wb3J0IHsgYWRkQ29tbWFuZHMgfSBmcm9tICdzcmMvY29tbWFuZHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmF1bHRFeHBvdGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzdHJpbmdzIDogU3RyaW5ncztcclxuXHRzZXR0aW5nczogVkV4cG9ydGVyU2V0dGluZ3M7XHJcblx0ZnNFZGl0b3IgOiBGc0VkaXRvcjtcclxuXHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGlmKHRoaXMuYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSl7XHJcblx0XHRcdGF3YWl0IHRoaXMuX29ubG9hZF8oKVxyXG5cdFx0fWVsc2V7XHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KFxyXG5cdFx0XHRcdGFzeW5jKCk9PntcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX29ubG9hZF8oKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgX29ubG9hZF8oKSB7XHJcblx0XHR0aGlzLnN0cmluZ3MgPSBuZXcgU3RyaW5ncygpO1xyXG5cclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmZzRWRpdG9yID0gbmV3IEZzRWRpdG9yKHRoaXMpO1xyXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgVkV4cG9ydGVyU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cdFx0YWRkQ29tbWFuZHModGhpcyk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KFxyXG5cdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJmaWxlLW1lbnVcIiwgKG1lbnUsIGZpbGUpID0+IHtcclxuXHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdGl0ZW1cclxuXHRcdFx0XHRcdC5zZXRUaXRsZShcIk1pcnJvciB0byBvdGhlciB2YXVsdFwiKVxyXG5cdFx0XHRcdFx0LnNldEljb24oXCJkb2N1bWVudFwiKVxyXG5cdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRsZXQgZHN0ID0gYXdhaXQgdGhpcy5mc0VkaXRvci5zZWxlY3RfdmFsaWRfZGlyKFxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0dGluZ3MudmF1bHREaXIuc3BsaXQoXCJcXG5cIilcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0XHRcdFx0bGV0IG5jPSAodGhpcy5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbihcIm5vdGUtY2hhaW5cIik7XHJcblx0XHRcdFx0XHRcdFx0aWYoIW5jKXtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJQbHVnaW4gbm90ZS1jaGFpbiBpcyBuZWVkZWQhXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRkc3QgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQoXCJSb290IG9mIHZhdWx0XCIpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKCF0aGlzLmZzRWRpdG9yLmlzZGlyKGRzdCkpe1xyXG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIkludmFsaWQgcm9vdDogXCIgKyBkc3QpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZihmaWxlIGluc3RhbmNlb2YgVEZpbGUpe1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IubWlycm9yX3RmaWxlKGZpbGUsZHN0LCdtdGltZScsdHJ1ZSxmYWxzZSk7XHJcblxyXG5cdFx0XHRcdFx0XHR9ZWxzZSBpZihmaWxlIGluc3RhbmNlb2YgVEZvbGRlcil7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5mc0VkaXRvci5taXJyb3JfdGZvbGRlcihmaWxlLGRzdCwnbXRpbWUnLHRydWUsZmFsc2UpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHRcdFxyXG5cdH1cclxuXHJcblx0Z2V0IG5vdGVjaGFpbigpe1xyXG5cdFx0cmV0dXJuICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cdFxyXG5cdGFzeW5jIGV4cG9ydF9yZWFkbWUodGZpbGU6VEZpbGUsZHN0OnN0cmluZ3xudWxsKXtcclxuXHRcdGxldCBuYyA9ICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0XHRpZighdGZpbGUpe3RmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO31cclxuXHRcdFxyXG5cdFx0Ly8gXHU4QkJFXHU3RjZFXHU4RjkzXHU1MUZBXHU3NkVFXHU1RjU1XHJcblx0XHRpZighZHN0KXtcclxuXHRcdFx0ZHN0ID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkRpcjtcclxuXHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0ZHN0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KCdQYXRoIG9mIExvY2FsR2l0UHJvamVjdCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZighZHN0IHx8ICF0aGlzLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmMoZHN0KSl7XHJcblx0XHRcdG5ldyBOb3RpY2UodGhpcy5zdHJpbmdzLm5vdGljZV9ub3N1Y2hkaXIsMzAwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGRzdCA9IGRzdC5yZXBsYWNlKC9cXFxcL2csJy8nKTtcclxuXHRcdFxyXG5cdFx0XHJcblx0XHQvLyBcdTVCRkNcdTUxRkFcdTVGNTNcdTUyNERcdTdCMTRcdThCQjBcclxuXHRcdGxldCB0bXA7XHJcblx0XHRsZXQgbmFtZSA9IG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5OYW1lO1xyXG5cdFx0aWYobmFtZSAmJiAhKG5hbWU9PT0nJykpe1xyXG5cdFx0XHR0bXAgPSBkc3QrJy8nK25hbWUrJy5tZCc7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0dG1wID0gZHN0KycvJyt0ZmlsZS5iYXNlbmFtZSsnLm1kJztcclxuXHRcdH1cclxuXHJcblx0XHRpZih0aGlzLmZzRWRpdG9yLmNvcHlfdGZpbGUodGZpbGUsdG1wKSl7XHJcblx0XHRcdGlmKG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5SZW1vdmVNZXRhKXtcclxuXHRcdFx0XHRjb25zdCB1ZnVuYyA9IChwYXRoOnN0cmluZyxkYXRhOnN0cmluZyk9PntcclxuXHRcdFx0XHRcdGxldCByZXMgPSBkYXRhO1xyXG5cdFx0XHRcdFx0aWYobmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LlJlbW92ZU1ldGEpe1xyXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHQvLS0tW1xcbihcXHJcXG4pXVtcXHNcXFNdKj8tLS1bXFxuKFxcclxcbildLyxcclxuXHRcdFx0XHRcdFx0XHQnJ1xyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uVXNlR2l0TGluayAmJiBhc3NldHMpe1xyXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHQvXFwhXFxbXFxbKC4qPylcXF1cXF0vZyxcclxuXHRcdFx0XHRcdFx0XHQobWF0Y2g6YW55LCBuYW1lOnN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGAhWyR7bmFtZX1dKCR7YXNzZXRzfS8ke25hbWUucmVwbGFjZSgvIC9nLCclMjAnKX0pYDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiByZXNcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5mc0VkaXRvci5tb2RpZnkodG1wLHVmdW5jKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly8gXHU1QkZDXHU1MUZBXHU5NjQ0XHU0RUY2XHJcblx0XHRsZXQgYXNzZXRzID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkFzc2V0cztcclxuXHRcdGlmKGFzc2V0cyl7XHJcblx0XHRcdGxldCBvbGlua3MgPSBuYy5jaGFpbi5nZXRfb3V0bGlua3ModGZpbGUpO1xyXG5cdFx0XHRsZXQgYWRpciA9IGRzdCsnLycrYXNzZXRzO1xyXG5cdFx0XHR0aGlzLmZzRWRpdG9yLm1rZGlyX3JlY3Vyc2l2ZShhZGlyKTtcclxuXHRcdFx0Zm9yKGxldCBmIG9mIG9saW5rcyl7XHJcblx0XHRcdFx0aWYoIShmLmV4dGVuc2lvbj09PSdtZCcpKXtcclxuXHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IuY29weV90ZmlsZShmLGFkaXIrJy8nK2YuYmFzZW5hbWUrJy4nK2YuZXh0ZW5zaW9uKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwgIlxyXG5pbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFRGaWxlLCBURm9sZGVyIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZzRWRpdG9ye1xyXG4gICAgZnM7XHJcbiAgICBwYXRoO1xyXG4gICAgcGx1Z2luIDpQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOlBsdWdpbil7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5mcyA9IHJlcXVpcmUoJ2ZzJyk7XHJcbiAgICAgICAgdGhpcy5wYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCl7XHJcbiAgICAgICAgbGV0IGEgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlciBhcyBhbnk7XHJcbiAgICAgICAgcmV0dXJuIGEuYmFzZVBhdGgucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdGVjaGFpbigpe1xyXG4gICAgICAgIGxldCBuYyA9ICh0aGlzLnBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbignbm90ZS1jaGFpbicpO1xyXG4gICAgICAgIHJldHVybiBuY1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhYnNwYXRoKHRmaWxlOlRGaWxlfFRGb2xkZXIpe1xyXG5cdFx0aWYodGZpbGUpe1xyXG5cdFx0XHRyZXR1cm4gKHRoaXMucm9vdCsnLycrdGZpbGUucGF0aCkucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuICAgIGlzZmlsZShwYXRoOnN0cmluZyl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnMuZXhpc3RzU3luYyhwYXRoKSAmJiB0aGlzLmZzLnN0YXRTeW5jKHBhdGgpLmlzRmlsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzZGlyKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5mcy5leGlzdHNTeW5jKHBhdGgpICYmIHRoaXMuZnMuc3RhdFN5bmMocGF0aCkuaXNEaXJlY3RvcnkoKTtcclxuICAgIH1cclxuXHJcbiAgICBsaXN0X2RpcihwYXRoOnN0cmluZyxhc19mdWxscGF0aD10cnVlKXtcclxuICAgICAgICBpZighdGhpcy5pc2RpcihwYXRoKSl7cmV0dXJuIFtdfVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZnMucmVhZGRpclN5bmMocGF0aClcclxuICAgICAgICBpZihhc19mdWxscGF0aCl7XHJcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKFxyXG4gICAgICAgICAgICAgICAgKHg6c3RyaW5nKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoKycvJyt4XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9ICAgXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgZmlyc3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz58c3RyaW5nKXtcclxuICAgICAgICBpZih0eXBlb2YocGF0aHMpPT0nc3RyaW5nJyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aHMpKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoc1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKGxldCBwYXRoIG9mIHBhdGhzKXtcclxuICAgICAgICAgICAgaWYodGhpcy5pc2RpcihwYXRoKSl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz4pe1xyXG4gICAgICAgIGxldCB4cGF0aHMgPSBwYXRocy5maWx0ZXIoKHA6c3RyaW5nKT0+dGhpcy5pc2RpcihwKSk7XHJcbiAgICAgICAgaWYoeHBhdGhzLmxlbmd0aD09PTApe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9ZWxzZSBpZih4cGF0aHMubGVuZ3RoPT0xKXtcclxuICAgICAgICAgICAgcmV0dXJuIHhwYXRoc1swXTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgbGV0IG5jID0gKHRoaXMucGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcbiAgICAgICAgICAgIGlmKG5jKXtcclxuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gYXdhaXQgbmMuY2hhaW4udHBfc3VnZ2VzdGVyKHhwYXRocyx4cGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBta2Rpcl9yZWN1cnNpdmUocGF0aDpzdHJpbmcpe1xyXG4gICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aCkpe3JldHVybiB0cnVlO31cclxuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXRoLmRpcm5hbWUocGF0aCk7XHJcbiAgICAgICAgaWYoIXRoaXMuaXNkaXIocGFyZW50KSl7XHJcbiAgICAgICAgICAgIHRoaXMubWtkaXJfcmVjdXJzaXZlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZnMubWtkaXJTeW5jKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCogXHU5NjQ0XHU0RUY2IHNyYyBcdTUyMzAgZHN0XHVGRjBDXHU0RTBEXHU1NzI4IHZhdWx0IFx1NEUyRFx1RkYwQ1x1OTcwMFx1ODk4MVx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxyXG5cdCogb3ZlcndyaXRlXHVGRjBDXHU1OTBEXHU3NkQ2XHVGRjFCbXRpbWVcdUZGMENcdTY1QjBcdTY1ODdcdTRFRjZcdUZGMUJcclxuXHQqL1xyXG4gICAgY29weV9maWxlKHNyYzpzdHJpbmcsZHN0OnN0cmluZyxtb2RlPSdwYXNzPm92ZXJ3cml0ZT5tdGltZScpIHtcclxuICAgICAgICBsZXQgZnMgPSB0aGlzLmZzO1xyXG5cclxuICAgICAgICBtb2RlID0gbW9kZS5zcGxpdCgnPicpWzBdXHJcbiAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMoc3JjKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZnMuZXhpc3RzU3luYyhkc3QpKXtcclxuICAgICAgICAgICAgaWYobW9kZT09PSdvdmVyd3JpdGUnKXtcclxuICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZHN0KTtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihtb2RlPT09J210aW1lJyl7XHJcbiAgICAgICAgICAgICAgICAvLyBkc3QgXHU2NkY0XHU2NUIwXHU2NUY2XHU5NUY0XHU1QzBGXHU0RThFIHNyY1xyXG4gICAgICAgICAgICAgICAgaWYoZnMuc3RhdFN5bmMoZHN0KS5tdGltZU1zPGZzLnN0YXRTeW5jKHNyYykubXRpbWVNcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhkc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjLGRzdCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29weV90ZmlsZSh0ZmlsZTpURmlsZSwgZHN0OnN0cmluZyxtb2RlPSdtdGltZScpIHtcclxuXHRcdGlmKHRmaWxlKXtcclxuXHRcdFx0bGV0IHNyYyA9IHRoaXMuYWJzcGF0aCh0ZmlsZSk7XHJcblx0XHRcdHJldHVybiBzcmMgJiYgdGhpcy5jb3B5X2ZpbGUoc3JjLGRzdCxtb2RlKTtcclxuXHRcdH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuICAgIG1pcnJvcl90ZmlsZSh0ZmlsZTpURmlsZSx2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Upe1xyXG4gICAgICAgIC8vIFx1NUMwNlx1N0IxNFx1OEJCMFx1OTU1Q1x1NTBDRlx1NzlGQlx1NTJBOFx1NTIzMFx1NTIyQlx1NzY4NFx1NUU5M1x1NEUyRFx1RkYwQ1x1NjU4N1x1NEVGNlx1N0VEM1x1Njc4NFx1NEUwRVx1NUY1M1x1NTI0RFx1NUU5M1x1NzZGOFx1NTQwQ1xyXG4gICAgICAgIGlmKHRmaWxlKXtcclxuICAgICAgICAgICAgdmF1bHRfcm9vdCA9IHZhdWx0X3Jvb3QucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcdGxldCBzcmMgPSB0aGlzLnJvb3QgKyAnLycgKyB0ZmlsZS5wYXRoO1xyXG4gICAgICAgICAgICBsZXQgZHN0ID0gdmF1bHRfcm9vdCsnLycrdGZpbGUucGF0aDtcclxuICAgICAgICAgICAgdGhpcy5ta2Rpcl9yZWN1cnNpdmUodGhpcy5wYXRoLmRpcm5hbWUoZHN0KSk7XHJcblx0XHRcdHRoaXMuY29weV9maWxlKHNyYyxkc3QsbW9kZSk7XHJcbiAgICAgICAgICAgIGlmKGF0dGFjaG1lbnQpe1xyXG4gICAgICAgICAgICAgICAgbGV0IG5jID0gdGhpcy5ub3RlY2hhaW47XHJcbiAgICAgICAgICAgICAgICBpZighbmMpe3JldHVybjt9XHJcbiAgICAgICAgICAgICAgICBsZXQgdGZpbGVzID0gbmMuY2hhaW4uZ2V0X291dGxpbmtzKHRmaWxlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgdCBvZiB0ZmlsZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCEodC5leHRlbnNpb249PT0nbWQnKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3RmaWxlKHQsdmF1bHRfcm9vdCxtb2RlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihvdXRsaW5rKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIG1pcnJvcl90Zm9sZGVyKHRmb2xkZXI6VEZvbGRlcix2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Usc3RyaWN0PWZhbHNlKXtcclxuICAgICAgICBpZih0Zm9sZGVyKXtcclxuICAgICAgICAgICAgZm9yKGxldCB0IG9mIHRmb2xkZXIuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgaWYodCBpbnN0YW5jZW9mIFRGb2xkZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3Rmb2xkZXIodCx2YXVsdF9yb290LG1vZGUsYXR0YWNobWVudCxvdXRsaW5rKTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHQgaW5zdGFuY2VvZiBURmlsZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsYXR0YWNobWVudCxvdXRsaW5rKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihzdHJpY3Qpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGRzdCA9IHZhdWx0X3Jvb3QrJy8nK3Rmb2xkZXIucGF0aFxyXG4gICAgICAgICAgICAgICAgbGV0IHNyYyA9IHRoaXMuYWJzcGF0aCh0Zm9sZGVyKVxyXG4gICAgICAgICAgICAgICAgaWYoc3JjICYmIGRzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVfZmlsZXNfbm90X2luX3NyYyhzcmMsZHN0KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlX2ZpbGVfb3JfZGlyKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICBpZih0aGlzLmlzZmlsZShwYXRoKSl7XHJcbiAgICAgICAgICAgIHRoaXMuZnMudW5saW5rU3luYyhwYXRoKVxyXG4gICAgICAgIH1lbHNlIGlmKHRoaXMuaXNkaXIocGF0aCkpe1xyXG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmxpc3RfZGlyKHBhdGgsdHJ1ZSlcclxuICAgICAgICAgICAgZm9yKGxldCBpdGVtIG9mIGl0ZW1zKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlX2ZpbGVfb3JfZGlyKGl0ZW0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5mcy5ybWRpclN5bmMocGF0aClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlX2ZpbGVzX25vdF9pbl9zcmMoc3JjOnN0cmluZyxkc3Q6c3RyaW5nKXtcclxuICAgICAgICAvLyBcdTkwNERcdTUzODYgZHN0IFx1NEUyRFx1NjI0MFx1NjcwOVx1NjU4N1x1NEVGNlx1RkYwQ1x1NTk4Mlx1Njc5Q1x1NjdEMFx1NjU4N1x1NEVGNlx1NEUwRFx1NTcyOHNyY1x1NEUyRFx1RkYwQ1x1NTIyMFx1OTY2NFxyXG4gICAgICAgIGlmKCF0aGlzLmlzZGlyKHNyYykgfHwgIXRoaXMuaXNkaXIoZHN0KSl7cmV0dXJufVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMubGlzdF9kaXIoZHN0LGZhbHNlKVxyXG4gICAgICAgIGZvcihsZXQgaXRlbSBvZiBpdGVtcyl7XHJcbiAgICAgICAgICAgIGxldCBhZHN0ID0gZHN0KycvJytpdGVtXHJcbiAgICAgICAgICAgIGxldCBhc3JjID0gc3JjKycvJytpdGVtXHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNmaWxlKGFkc3QpKXtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzZmlsZShhc3JjKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy51bmxpbmtTeW5jKGFkc3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuaXNkaXIoYWRzdCkpe1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNkaXIoYXNyYykpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlX2ZpbGVfb3JfZGlyKGFkc3QpXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZV9maWxlc19ub3RfaW5fc3JjKGFzcmMsYWRzdClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtaXJyb3JfZm9sZGVyKHNyYzpzdHJpbmcsZHN0OnN0cmluZyxtb2RlPSdtdGltZScsc3RyaWN0PWZhbHNlKXtcclxuICAgICAgICBpZighdGhpcy5pc2RpcihzcmMpKXtyZXR1cm59XHJcbiAgICAgICAgdGhpcy5ta2Rpcl9yZWN1cnNpdmUoZHN0KVxyXG4gICAgICAgIGlmKCF0aGlzLmlzZGlyKGRzdCkpe3JldHVybn1cclxuXHJcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5saXN0X2RpcihzcmMsZmFsc2UpXHJcbiAgICAgICAgZm9yKGxldCBpdGVtIG9mIGl0ZW1zKXtcclxuICAgICAgICAgICAgbGV0IGFzcmMgPSB0aGlzLnBhdGguam9pbihzcmMsaXRlbSlcclxuICAgICAgICAgICAgbGV0IGFkc3QgPSB0aGlzLnBhdGguam9pbihkc3QsaXRlbSlcclxuICAgICAgICAgICAgaWYodGhpcy5pc2ZpbGUoYXNyYykpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5X2ZpbGUoYXNyYyxhZHN0LG1vZGUpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuaXNkaXIoYXNyYykpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfZm9sZGVyKGFzcmMsYWRzdCxtb2RlLHN0cmljdClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihzdHJpY3Qpe1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZV9maWxlc19ub3RfaW5fc3JjKHNyYyxkc3QpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1vZGlmeShwYXRoOnN0cmluZyxjYWxsYmFjazpGdW5jdGlvbixlbmNvZGluZz0ndXRmOCcpe1xyXG4gICAgICAgIGxldCBmcyA9IHRoaXMuZnM7XHJcbiAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMocGF0aCkpe3JldHVybn07XHJcblxyXG4gICAgICAgIGZzLnJlYWRGaWxlKHBhdGgsIGVuY29kaW5nLCAoZXJyOkVycm9yLCBkYXRhOnN0cmluZykgPT4ge1xyXG5cdFx0XHRpZihlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBmaWxlOicsIGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHJzID0gY2FsbGJhY2socGF0aCxkYXRhKTtcclxuXHRcdFx0ZnMud3JpdGVGaWxlKHBhdGgsIHJzLCBlbmNvZGluZywgKGVycjpFcnJvcikgPT4ge1xyXG5cdFx0XHQgIGlmIChlcnIpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciB3cml0aW5nIGZpbGU6JywgZXJyKTtcclxuXHRcdFx0ICB9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdGaWxlIGNvbnRlbnQgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcblx0XHRcdCAgfVxyXG5cdFx0XHR9KTtcclxuXHRcdCAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCAiXHJcbmV4cG9ydCBjbGFzcyBTdHJpbmdze1xyXG4gICAgbGFuZ3VhZ2U6c3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBsZXQgbGFuZyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFuZ3VhZ2UnKTtcclxuICAgICAgICBpZihsYW5nKXtcclxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSAnZW4nO1xyXG4gICAgICAgIH1cclxuXHR9XHJcblxyXG4gICAgZ2V0IGNtZF9leHBvcnRfY3VycmVudF9ub3RlKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU1QkZDXHU1MUZBXHU1RjUzXHU1MjREXHU3QjE0XHU4QkIwJ1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ0V4cG9ydCBjdXJyZW50IG5vdGUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY21kX3NldF92ZXhwb3J0ZXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdThCQkVcdTdGNkVcdTVCRkNcdTUxRkFcdTdCMTRcdThCQjBcdTkwMDlcdTk4NzknXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnU2V0IGNvbmZpZyB0byBleHBvcnQgbm90ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjbWRfZXhwb3J0X3BsdWdpbigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1NjNEMlx1NEVGNidcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdFeHBvcnQgcGx1Z2luJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21wdF9wYXRoX29mX2ZvbGRlcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1OEY5M1x1NTE2NVx1NjU4N1x1NEVGNlx1NTkzOVx1OERFRlx1NUY4NCdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdJbnB1dCBwYXRoIG9mIGZvbGRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBub3RpY2Vfb3V0cHV0KCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU1QkZDXHU1MUZBXHVGRjFBJ1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ091dHB1dDonO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBub3RpY2Vfbm9zdWNoZGlyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU2NUUwXHU2NTQ4XHU3NkVFXHU1RjU1J1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ0ludmFpZCBwYXRoLic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nX3BsdWdpbl9kaXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdTYzRDJcdTRFRjZcdTVCRkNcdTUxRkFcdTc2RUVcdTVGNTUnO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ1BsdWdpbiBkaXIgdG8gZXhwb3J0JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdfdmF1bHRfZGlyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU1RTkzXHU3NkVFXHU1RjU1JztcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdSb290IGRpciBvZiB2YXVsdCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgbGV0IHN0cmluZ3MgPSBuZXcgU3RyaW5ncygpOyIsICJpbXBvcnQgeyBcclxuXHRBcHAsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsUGx1Z2luXHJcbn0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IFZhdWx0RXhwb3RlclBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVkV4cG9ydGVyU2V0dGluZ3Mge1xyXG5cdHBsdWdpbkRpckV4cG9ydGVyOnN0cmluZztcclxuXHR2YXVsdERpcjpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBWRXhwb3J0ZXJTZXR0aW5ncyA9IHtcclxuXHRwbHVnaW5EaXJFeHBvcnRlcjonJyxcclxuXHR2YXVsdERpcjonJ1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVkV4cG9ydGVyU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVmF1bHRFeHBvdGVyUGx1Z2luO1xyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFZhdWx0RXhwb3RlclBsdWdpbikge1xyXG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRnZXRTZXR0aW5nVmFsdWUoZmllbGQ6IGtleW9mIFZFeHBvcnRlclNldHRpbmdzKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wbHVnaW4uc2V0dGluZ3NbZmllbGRdO1xyXG5cdH1cclxuXHJcblx0YWRkX3RvZ2dsZShuYW1lOnN0cmluZyxkZXNjOnN0cmluZyxmaWVsZDprZXlvZiBWRXhwb3J0ZXJTZXR0aW5ncyl7XHJcblx0XHRsZXQge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblx0XHRsZXQgdmFsdWUgPSAodGhpcy5wbHVnaW4uc2V0dGluZ3MgYXMgYW55KVtmaWVsZF0gYXMgYm9vbGVhbjtcclxuXHRcdGxldCBpdGVtID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpICBcclxuXHRcdFx0LnNldE5hbWUobmFtZSlcclxuXHRcdFx0LnNldERlc2MoZGVzYylcclxuXHRcdFx0LmFkZFRvZ2dsZSh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0VmFsdWUodmFsdWUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTpuZXZlcikgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3NbZmllbGRdID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cdFx0cmV0dXJuIGl0ZW07XHJcblx0fVxyXG5cclxuXHRkaXNwbGF5KCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHRcdFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKHRoaXMucGx1Z2luLnN0cmluZ3Muc2V0dGluZ19wbHVnaW5fZGlyKVxyXG5cdFx0XHQuYWRkVGV4dEFyZWEodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkRpckV4cG9ydGVyKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkRpckV4cG9ydGVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHRcdC5zZXROYW1lKHRoaXMucGx1Z2luLnN0cmluZ3Muc2V0dGluZ192YXVsdF9kaXIpXHJcblx0XHRcdFx0LmFkZFRleHRBcmVhKHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnZhdWx0RGlyKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXVsdERpciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdH0pKTtcclxuXHR9XHJcbn1cclxuIiwgImltcG9ydCB7IFxyXG5cdE5vdGljZSwgVEZpbGVcclxufSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5pbXBvcnQgVmF1bHRFeHBvdGVyUGx1Z2luIGZyb20gJy4uL21haW4nO1xyXG5cclxuY29uc3QgY21kX2V4cG9ydF9jdXJyZW50X25vdGUgPSAocGx1Z2luOlZhdWx0RXhwb3RlclBsdWdpbikgPT4gKHtcclxuXHRpZDogJ2NtZF9leHBvcnRfY3VycmVudF9ub3RlJyxcclxuXHRuYW1lOiBwbHVnaW4uc3RyaW5ncy5jbWRfZXhwb3J0X2N1cnJlbnRfbm90ZSxcclxuXHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0Y29uc3QgbmMgPSBwbHVnaW4ubm90ZWNoYWluO1xyXG5cdFx0bGV0IHRmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO1xyXG5cdFx0YXdhaXQgcGx1Z2luLmV4cG9ydF9yZWFkbWUodGZpbGUsbnVsbCk7XHJcblx0fVxyXG59KTtcclxuXHJcbmNvbnN0IGNtZF9zZXRfdmV4cG9ydGVyID0gKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pID0+ICh7XHJcblx0aWQ6ICdjbWRfc2V0X3ZleHBvcnRlcicsXHJcblx0bmFtZTogcGx1Z2luLnN0cmluZ3MuY21kX3NldF92ZXhwb3J0ZXIsXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdGxldCBkaXIgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQocGx1Z2luLnN0cmluZ3MucHJvbXB0X3BhdGhfb2ZfZm9sZGVyKTtcclxuXHRcdGxldCBpdGVtOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblx0XHRpZihwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyhkaXIpKXtcclxuXHRcdFx0aXRlbVsnRGlyJ10gPSBkaXI7XHJcblx0XHR9XHJcblx0XHRpdGVtWydOYW1lJ10gPSAncmVhZE1lJztcclxuXHRcdGl0ZW1bJ0Fzc2V0cyddID0gJy4vYXNzZXRzJztcclxuXHRcdGl0ZW1bJ1JlbW92ZU1ldGEnXSA9IHRydWU7XHJcblx0XHRpdGVtWydVc2VHaXRMaW5rJ10gPSB0cnVlO1xyXG5cclxuXHRcdGF3YWl0IG5jLmVkaXRvci5zZXRfZnJvbnRtYXR0ZXIoXHJcblx0XHRcdG5jLmNoYWluLmN1cnJlbnRfbm90ZSxcclxuXHRcdFx0J3ZleHBvcnRlcicsXHJcblx0XHRcdGl0ZW1cclxuXHRcdClcclxuXHR9XHJcbn0pO1xyXG5cclxuY29uc3QgY21kX2V4cG9ydF9wbHVnaW4gPSAocGx1Z2luOlZhdWx0RXhwb3RlclBsdWdpbikgPT4gKHtcclxuXHRpZDogJ2NtZF9leHBvcnRfcGx1Z2luJyxcclxuXHRuYW1lOiBwbHVnaW4uc3RyaW5ncy5jbWRfZXhwb3J0X3BsdWdpbixcclxuXHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0Y29uc3QgbmMgPSBwbHVnaW4ubm90ZWNoYWluO1xyXG5cdFx0XHJcblx0XHRsZXQgcGx1Z2lucyA9IE9iamVjdC5rZXlzKChwbHVnaW4uYXBwIGFzIGFueSkucGx1Z2lucy5wbHVnaW5zKTtcclxuXHRcdGxldCBwID0gYXdhaXQgbmMuY2hhaW4udHBfc3VnZ2VzdGVyKHBsdWdpbnMscGx1Z2lucyk7XHJcblx0XHRsZXQgZXBsdWdpbiA9IChwbHVnaW4uYXBwIGFzIGFueSkucGx1Z2lucy5nZXRQbHVnaW4ocCk7XHJcblx0XHRpZihlcGx1Z2luKXtcclxuXHRcdFx0bGV0IHRhcmdldCA9IGF3YWl0IHBsdWdpbi5mc0VkaXRvci5zZWxlY3RfdmFsaWRfZGlyKFxyXG5cdFx0XHRcdHBsdWdpbi5zZXR0aW5ncy5wbHVnaW5EaXJFeHBvcnRlci5zcGxpdChcIlxcblwiKVxyXG5cdFx0XHQpXHJcblx0XHRcdGlmKCFwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyh0YXJnZXQpKXtcclxuXHRcdFx0XHR0YXJnZXQgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQocGx1Z2luLnN0cmluZ3MucHJvbXB0X3BhdGhfb2ZfZm9sZGVyKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0YXJnZXQgPSB0YXJnZXQucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcdGlmKCF0YXJnZXQuZW5kc1dpdGgoJy8nICsgcCkpe1xyXG5cdFx0XHRcdHRhcmdldCA9IHRhcmdldCArICcvJyArIHA7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIXBsdWdpbi5mc0VkaXRvci5mcy5leGlzdHNTeW5jKHRhcmdldCkpe1xyXG5cdFx0XHRcdHBsdWdpbi5mc0VkaXRvci5mcy5ta2RpclN5bmModGFyZ2V0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRsZXQgaXRlbXMgPSBbJ21haW4uanMnLCdtYW5pZmVzdC5qc29uJywnc3R5bGVzLmNzcyddO1xyXG5cdFx0XHRmb3IobGV0IGl0ZW0gb2YgaXRlbXMpe1xyXG5cdFx0XHRcdGxldCBzcmMgPSBgJHtwbHVnaW4uZnNFZGl0b3Iucm9vdH0vJHtlcGx1Z2luLm1hbmlmZXN0LmRpcn0vJHtpdGVtfWA7XHJcblx0XHRcdFx0bGV0IGRzdCA9IGAke3RhcmdldH0vJHtpdGVtfWA7XHJcblx0XHRcdFx0cGx1Z2luLmZzRWRpdG9yLmNvcHlfZmlsZShzcmMsZHN0LCdvdmVyd3JpdGUnKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG5jb25zdCBjb21tYW5kQnVpbGRlcnM6QXJyYXk8RnVuY3Rpb24+ID0gW1xyXG4gICAgXHJcbl07XHJcblxyXG5jb25zdCBjb21tYW5kQnVpbGRlcnNEZXNrdG9wOkFycmF5PEZ1bmN0aW9uPiA9IFtcclxuXHRjbWRfZXhwb3J0X2N1cnJlbnRfbm90ZSxcclxuXHRjbWRfc2V0X3ZleHBvcnRlcixcclxuXHRjbWRfZXhwb3J0X3BsdWdpblxyXG5dO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbW1hbmRzKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pIHtcclxuICAgIGNvbW1hbmRCdWlsZGVycy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgcGx1Z2luLmFkZENvbW1hbmQoYyhwbHVnaW4pKTtcclxuICAgIH0pO1xyXG5cdGlmKChwbHVnaW4uYXBwIGFzIGFueSkuaXNNb2JpbGU9PWZhbHNlKXtcclxuXHRcdGNvbW1hbmRCdWlsZGVyc0Rlc2t0b3AuZm9yRWFjaCgoYykgPT4ge1xyXG5cdFx0XHRwbHVnaW4uYWRkQ29tbWFuZChjKHBsdWdpbikpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLElBQUFBLG1CQUE0Rzs7O0FDQTVHLHNCQUE0RztBQUVyRyxJQUFNLFdBQU4sTUFBYztBQUFBLEVBS2pCLFlBQVksUUFBYztBQUN0QixTQUFLLFNBQVM7QUFDZCxTQUFLLEtBQUssUUFBUSxJQUFJO0FBQ3RCLFNBQUssT0FBTyxRQUFRLE1BQU07QUFBQSxFQUM5QjtBQUFBLEVBRUEsSUFBSSxPQUFNO0FBQ04sUUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLE1BQU07QUFDOUIsV0FBTyxFQUFFLFNBQVMsUUFBUSxPQUFNLEdBQUc7QUFBQSxFQUN2QztBQUFB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M0Qsa0JBQU0sSUFBSTtBQUFBLGNBQ1Q7QUFBQSxjQUNBO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxnQkFBR0MsTUFBQSxHQUFHLE9BQU8sZ0JBQWdCLE9BQU0sV0FBVyxNQUEzQyxnQkFBQUEsSUFBOEMsZUFBYyxRQUFPO0FBQ3JFLGtCQUFNLElBQUk7QUFBQSxjQUNUO0FBQUEsY0FDQSxDQUFDLE9BQVdDLFVBQWdCO0FBQzNCLHVCQUFPLEtBQUtBLFVBQVMsVUFBVUEsTUFBSyxRQUFRLE1BQUssS0FBSztBQUFBLGNBQ3ZEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxpQkFBTztBQUFBLFFBQ1I7QUFDQSxjQUFNLEtBQUssU0FBUyxPQUFPLEtBQUksS0FBSztBQUFBLE1BQ3JDO0FBQUEsSUFDRDtBQUVBLFFBQUksVUFBUyxRQUFHLE9BQU8sZ0JBQWdCLE9BQU0sV0FBVyxNQUEzQyxtQkFBOEM7QUFDM0QsUUFBRyxRQUFPO0FBQ1QsVUFBSSxTQUFTLEdBQUcsTUFBTSxhQUFhLEtBQUs7QUFDeEMsVUFBSSxPQUFPLE1BQUksTUFBSTtBQUNuQixXQUFLLFNBQVMsZ0JBQWdCLElBQUk7QUFDbEMsZUFBUSxLQUFLLFFBQU87QUFDbkIsWUFBRyxFQUFFLEVBQUUsY0FBWSxPQUFNO0FBQ3hCLGVBQUssU0FBUyxXQUFXLEdBQUUsT0FBSyxNQUFJLEVBQUUsV0FBUyxNQUFJLEVBQUUsU0FBUztBQUFBLFFBQy9EO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJlcnIiLCAiaW1wb3J0X29ic2lkaWFuIiwgInZhbHVlIiwgIl9hIiwgIl9iIiwgIm5hbWUiXQp9Cg== diff --git a/src/commands.ts b/src/commands.ts index ad52b84..cb924c8 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -61,11 +61,18 @@ const cmd_export_plugin = (plugin:VaultExpoterPlugin) => ({ plugin.fsEditor.fs.mkdirSync(target); } let items = ['main.js','manifest.json','styles.css']; + let dj = await plugin.fsEditor.notechain.chain.tp_suggester( + ['true','false'],[true,false],true,'Export data.json?' + ) + if(dj){ + items.push('data.json') + } for(let item of items){ let src = `${plugin.fsEditor.root}/${eplugin.manifest.dir}/${item}`; let dst = `${target}/${item}`; plugin.fsEditor.copy_file(src,dst,'overwrite'); } + } } });