634 lines
73 KiB
JavaScript
634 lines
73 KiB
JavaScript
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
if you want to view the source, please visit the github repository of this plugin
|
|
*/
|
|
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 __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
var __export = (target, all) => {
|
|
__markAsModule(target);
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __reExport = (target, module2, desc) => {
|
|
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
for (let key of __getOwnPropNames(module2))
|
|
if (!__hasOwnProp.call(target, key) && key !== "default")
|
|
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
|
}
|
|
return target;
|
|
};
|
|
var __toModule = (module2) => {
|
|
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
|
};
|
|
var __async = (__this, __arguments, generator) => {
|
|
return new Promise((resolve, reject) => {
|
|
var fulfilled = (value) => {
|
|
try {
|
|
step(generator.next(value));
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
};
|
|
var rejected = (value) => {
|
|
try {
|
|
step(generator.throw(value));
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
};
|
|
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
step((generator = generator.apply(__this, __arguments)).next());
|
|
});
|
|
};
|
|
|
|
// src/main.ts
|
|
__export(exports, {
|
|
default: () => CustomFramesPlugin
|
|
});
|
|
var import_obsidian4 = __toModule(require("obsidian"));
|
|
|
|
// src/frame.ts
|
|
var import_obsidian = __toModule(require("obsidian"));
|
|
|
|
// src/settings.ts
|
|
var defaultSettings = {
|
|
frames: [],
|
|
padding: 5
|
|
};
|
|
var presets = {
|
|
"obsidian": {
|
|
url: "https://forum.obsidian.md/",
|
|
displayName: "Obsidian Forum",
|
|
icon: "edit",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: true,
|
|
openInCenter: true,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: "",
|
|
customJs: ""
|
|
},
|
|
"detexify": {
|
|
url: "https://detexify.kirelabs.org/classify.html",
|
|
displayName: "Detexify",
|
|
icon: "type",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: true,
|
|
openInCenter: false,
|
|
zoomLevel: 0.95,
|
|
forceIframe: false,
|
|
customCss: `/* hide info clutter and ad banner */
|
|
#classify--info-area,
|
|
.adsbygoogle {
|
|
display: none !important
|
|
}`,
|
|
customJs: ""
|
|
},
|
|
"calendar": {
|
|
url: "https://calendar.google.com/calendar",
|
|
displayName: "Google Calendar",
|
|
icon: "calendar",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: true,
|
|
openInCenter: true,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: `/* hide the menu bar "Calendar" text and remove minimum width */
|
|
div[style*="min-width: 238px"] {
|
|
min-width: 0 !important;
|
|
padding-right: 0 !important;
|
|
}
|
|
div[style*="min-width: 238px"] span[role*="heading"] {
|
|
display: none !important;
|
|
}`,
|
|
customJs: ""
|
|
},
|
|
"keep": {
|
|
url: "https://keep.google.com",
|
|
displayName: "Google Keep",
|
|
icon: "files",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: `/* hide the menu bar, the "Keep" text and the Google Apps button */
|
|
html > body > div:nth-child(2) > div:nth-child(2) > div:first-child,
|
|
html > body > div:first-child > header:first-child > div > div:first-child > div > div:first-child > a:first-child > span,
|
|
html > body > div:first-child > header:first-child > div:nth-child(2) > div:first-child > div:first-child,
|
|
html > body > div:first-child > header:first-child > div:nth-child(2) > div:nth-child(3) > div:first-child > div:first-child > div:first-child {
|
|
display: none !important;
|
|
}
|
|
html > body > div:first-child > header:first-child > div > div:first-child > div > div:first-child > a:first-child {
|
|
cursor: default;
|
|
}`,
|
|
customJs: ""
|
|
},
|
|
"todoist": {
|
|
url: "https://todoist.com",
|
|
displayName: "Todoist",
|
|
icon: "list-checks",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: `/* hide the help, home, search, and productivity overview buttons, create extra space, and prevent toast pop-up from acting weird */
|
|
[aria-label="Go to Home view"], #quick_find, [aria-label="Productivity"], [aria-label="Help & Feedback"] {
|
|
display: none !important;
|
|
}
|
|
|
|
.view_content {
|
|
padding-left: 15px;
|
|
}
|
|
|
|
.view_header {
|
|
padding-left: 15px;
|
|
padding-top: 10px;
|
|
}
|
|
|
|
.undo_toast {
|
|
width: 95%;
|
|
}`,
|
|
customJs: ""
|
|
},
|
|
"notion": {
|
|
url: "https://www.notion.so/",
|
|
displayName: "Notion",
|
|
icon: "box",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: true,
|
|
openInCenter: true,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: "",
|
|
customJs: ""
|
|
},
|
|
"twitter": {
|
|
url: "https://twitter.com",
|
|
displayName: "Twitter",
|
|
icon: "twitter",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: "",
|
|
customJs: ""
|
|
},
|
|
"tasks": {
|
|
url: "https://tasks.google.com/embed/?origin=https://calendar.google.com&fullWidth=1",
|
|
displayName: "Google Tasks",
|
|
icon: "list-checks",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: "",
|
|
customJs: ""
|
|
}
|
|
};
|
|
function getIcon(settings) {
|
|
return settings.icon ? `lucide-${settings.icon}` : "documents";
|
|
}
|
|
function getId(settings) {
|
|
return settings.displayName.toLowerCase().replace(/\s/g, "-");
|
|
}
|
|
|
|
// src/frame.ts
|
|
var CustomFrame = class {
|
|
constructor(settings, data) {
|
|
this.settings = settings;
|
|
this.data = data;
|
|
}
|
|
create(parent, additionalStyle = void 0, urlSuffix = void 0) {
|
|
let style = `padding: ${this.settings.padding}px;`;
|
|
if (additionalStyle)
|
|
style += additionalStyle;
|
|
if (import_obsidian.Platform.isDesktopApp && !this.data.forceIframe) {
|
|
let frameDoc = parent.doc;
|
|
this.frame = frameDoc.createElement("webview");
|
|
parent.appendChild(this.frame);
|
|
this.frame.setAttribute("allowpopups", "");
|
|
this.frame.addEventListener("dom-ready", () => {
|
|
this.frame.setZoomFactor(this.data.zoomLevel);
|
|
this.frame.insertCSS(this.data.customCss);
|
|
this.frame.executeJavaScript(this.data.customJs);
|
|
});
|
|
this.frame.addEventListener("destroyed", () => {
|
|
if (frameDoc != parent.doc) {
|
|
this.frame.detach();
|
|
this.create(parent, additionalStyle, urlSuffix);
|
|
}
|
|
});
|
|
} else {
|
|
this.frame = parent.doc.createElement("iframe");
|
|
parent.appendChild(this.frame);
|
|
this.frame.setAttribute("sandbox", "allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts allow-top-navigation-by-user-activation allow-downloads");
|
|
this.frame.setAttribute("allow", "encrypted-media; fullscreen; oversized-images; picture-in-picture; sync-xhr; geolocation;");
|
|
style += `transform: scale(${this.data.zoomLevel}); transform-origin: 0 0;`;
|
|
}
|
|
this.frame.addClass("custom-frames-frame");
|
|
this.frame.addClass(`custom-frames-${getId(this.data)}`);
|
|
this.frame.setAttribute("style", style);
|
|
let src = this.data.url;
|
|
if (urlSuffix) {
|
|
if (!urlSuffix.startsWith("/"))
|
|
src += "/";
|
|
src += urlSuffix;
|
|
}
|
|
this.frame.setAttribute("src", src);
|
|
}
|
|
refresh() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.location.reload();
|
|
} else {
|
|
this.frame.reload();
|
|
}
|
|
}
|
|
return() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.open(this.data.url);
|
|
} else {
|
|
this.frame.loadURL(this.data.url);
|
|
}
|
|
}
|
|
goBack() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.history.back();
|
|
} else {
|
|
this.frame.goBack();
|
|
}
|
|
}
|
|
goForward() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.history.forward();
|
|
} else {
|
|
this.frame.goForward();
|
|
}
|
|
}
|
|
toggleDevTools() {
|
|
if (!(this.frame instanceof HTMLIFrameElement)) {
|
|
if (!this.frame.isDevToolsOpened()) {
|
|
this.frame.openDevTools();
|
|
} else {
|
|
this.frame.closeDevTools();
|
|
}
|
|
}
|
|
}
|
|
getCurrentUrl() {
|
|
return this.frame instanceof HTMLIFrameElement ? this.frame.contentWindow.location.href : this.frame.getURL();
|
|
}
|
|
focus() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.focus();
|
|
} else {
|
|
this.frame.focus();
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/settings-tab.ts
|
|
var import_obsidian2 = __toModule(require("obsidian"));
|
|
var CustomFramesSettingTab = class extends import_obsidian2.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
this.containerEl.empty();
|
|
this.containerEl.createEl("h2", { text: "Custom Frames Settings" });
|
|
this.containerEl.createEl("p", {
|
|
text: "Please note that Obsidian has to be restarted or reloaded for most of these settings to take effect.",
|
|
cls: "mod-warning"
|
|
});
|
|
new import_obsidian2.Setting(this.containerEl).setName("Frame Padding").setDesc("The padding that should be left around the inside of custom frame panes, in pixels.").addText((t) => {
|
|
t.inputEl.type = "number";
|
|
t.setValue(String(this.plugin.settings.padding));
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
this.plugin.settings.padding = v.length ? Number(v) : defaultSettings.padding;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
for (let frame of this.plugin.settings.frames) {
|
|
let heading = this.containerEl.createEl("h3", { text: frame.displayName || "Unnamed Frame" });
|
|
let toggle = new import_obsidian2.ButtonComponent(this.containerEl).setButtonText("Show Settings").setClass("custom-frames-show").onClick(() => __async(this, null, function* () {
|
|
content.hidden = !content.hidden;
|
|
toggle.setButtonText(content.hidden ? "Show Settings" : "Hide Settings");
|
|
}));
|
|
let content = this.containerEl.createDiv();
|
|
content.hidden = true;
|
|
new import_obsidian2.Setting(content).setName("Display Name").setDesc("The display name that this frame should have.").addText((t) => {
|
|
t.setValue(frame.displayName);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.displayName = v;
|
|
heading.setText(frame.displayName || "Unnamed Frame");
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Icon").setDesc(createFragment((f) => {
|
|
f.createSpan({ text: "The icon that this frame's pane should have. The names of any " });
|
|
f.createEl("a", { text: "Lucide icons", href: "https://lucide.dev/" });
|
|
f.createSpan({ text: " can be used." });
|
|
})).addText((t) => {
|
|
t.setValue(frame.icon);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.icon = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("URL").setDesc("The URL that should be opened in this frame.").addText((t) => {
|
|
t.setValue(frame.url);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.url = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Disable on Mobile").setDesc("Custom Frames is a lot more restricted on mobile devices and doesn't allow for the same types of content to be displayed. If a frame doesn't work as expected on mobile, it can be disabled.").addToggle((t) => {
|
|
t.setValue(frame.hideOnMobile);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.hideOnMobile = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Add Ribbon Icon").setDesc("Whether a button to open this frame should be added to the ribbon.").addToggle((t) => {
|
|
t.setValue(frame.addRibbonIcon);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.addRibbonIcon = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Open in Center").setDesc("Whether this frame should be opened in the unpinned center editor rather than one of the panes on the side. This is useful for sites that don't work well in a narrow view, or sites that don't require a note to be open when viewed.").addToggle((t) => {
|
|
t.setValue(frame.openInCenter);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.openInCenter = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Force iframe").setDesc(createFragment((f) => {
|
|
f.createSpan({ text: "Whether this frame should use iframes on desktop as opposed to Electron webviews." });
|
|
f.createEl("br");
|
|
f.createEl("em", { text: "Only enable this setting if the frame is causing issues or frequent crashes. This setting causes all Desktop-only settings to be ignored." });
|
|
})).addToggle((t) => {
|
|
t.setValue(frame.forceIframe);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.forceIframe = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Page Zoom").setDesc("The zoom that this frame's page should be displayed with, as a percentage.").addText((t) => {
|
|
t.inputEl.type = "number";
|
|
t.setValue(String(frame.zoomLevel * 100));
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.zoomLevel = v.length ? Number(v) / 100 : 1;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Additional CSS").setDesc(createFragment((f) => {
|
|
f.createSpan({ text: "A snippet of additional CSS that should be applied to this frame." });
|
|
f.createEl("br");
|
|
f.createEl("em", { text: "Note that this is only applied on Desktop." });
|
|
})).addTextArea((t) => {
|
|
t.inputEl.rows = 5;
|
|
t.inputEl.cols = 50;
|
|
t.setValue(frame.customCss);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.customCss = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Additional JavaScript").setDesc(createFragment((f) => {
|
|
f.createSpan({ text: "A snippet of additional JavaScript that should be applied to this frame." });
|
|
f.createEl("br");
|
|
f.createEl("em", { text: "Note that this is only applied on Desktop." });
|
|
})).addTextArea((t) => {
|
|
t.inputEl.rows = 5;
|
|
t.inputEl.cols = 50;
|
|
t.setValue(frame.customJs);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.customJs = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.ButtonComponent(content).setButtonText("Remove Frame").onClick(() => __async(this, null, function* () {
|
|
this.plugin.settings.frames.remove(frame);
|
|
yield this.plugin.saveSettings();
|
|
this.display();
|
|
}));
|
|
}
|
|
this.containerEl.createEl("hr");
|
|
this.containerEl.createEl("p", { text: `Create a new frame, either from a preset shipped with the plugin, or a custom one that you can edit yourself. Each frame's pane can be opened using the "Custom Frames: Open" command.` });
|
|
let addDiv = this.containerEl.createDiv();
|
|
let dropdown = new import_obsidian2.DropdownComponent(addDiv);
|
|
dropdown.addOption("new", "Custom");
|
|
for (let key of Object.keys(presets))
|
|
dropdown.addOption(key, presets[key].displayName);
|
|
new import_obsidian2.ButtonComponent(addDiv).setButtonText("Add Frame").setClass("custom-frames-add").onClick(() => __async(this, null, function* () {
|
|
let option = dropdown.getValue();
|
|
if (option == "new") {
|
|
this.plugin.settings.frames.push({
|
|
url: "",
|
|
displayName: "New Frame",
|
|
icon: "",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: "",
|
|
customJs: ""
|
|
});
|
|
} else {
|
|
this.plugin.settings.frames.push(presets[option]);
|
|
}
|
|
yield this.plugin.saveSettings();
|
|
this.display();
|
|
}));
|
|
let disclaimer = this.containerEl.createEl("p", { cls: "mod-warning" });
|
|
disclaimer.createSpan({ text: "Please be advised that, when adding a site as a custom frame, you potentially expose personal information you enter to other plugins you have installed. For more information, see " });
|
|
disclaimer.createEl("a", {
|
|
text: "this discussion",
|
|
href: "https://github.com/Ellpeck/ObsidianCustomFrames/issues/54#issuecomment-1210879685",
|
|
cls: "mod-warning"
|
|
});
|
|
disclaimer.createSpan({ text: "." });
|
|
this.containerEl.createEl("hr");
|
|
this.containerEl.createEl("p", { text: "If you like this plugin and want to support its development, you can do so through my website by clicking this fancy image!" });
|
|
this.containerEl.createEl("a", { href: "https://ellpeck.de/support" }).createEl("img", {
|
|
attr: { src: "https://ellpeck.de/res/generalsupport.png" },
|
|
cls: "custom-frames-support"
|
|
});
|
|
}
|
|
};
|
|
|
|
// src/view.ts
|
|
var import_obsidian3 = __toModule(require("obsidian"));
|
|
var _CustomFrameView = class extends import_obsidian3.ItemView {
|
|
constructor(leaf, settings, data, name) {
|
|
super(leaf);
|
|
this.data = data;
|
|
this.name = name;
|
|
this.frame = new CustomFrame(settings, data);
|
|
this.navigation = data.openInCenter;
|
|
for (let action of _CustomFrameView.actions)
|
|
this.addAction(action.icon, action.name, () => action.action(this));
|
|
}
|
|
onload() {
|
|
this.contentEl.empty();
|
|
this.contentEl.addClass("custom-frames-view");
|
|
this.frame.create(this.contentEl);
|
|
}
|
|
onPaneMenu(menu, source) {
|
|
super.onPaneMenu(menu, source);
|
|
for (let action of _CustomFrameView.actions) {
|
|
menu.addItem((i) => {
|
|
i.setTitle(action.name);
|
|
i.setIcon(action.icon);
|
|
i.onClick(() => action.action(this));
|
|
});
|
|
}
|
|
}
|
|
getViewType() {
|
|
return this.name;
|
|
}
|
|
getDisplayText() {
|
|
return this.data.displayName;
|
|
}
|
|
getIcon() {
|
|
return getIcon(this.data);
|
|
}
|
|
focus() {
|
|
this.frame.focus();
|
|
}
|
|
};
|
|
var CustomFrameView = _CustomFrameView;
|
|
CustomFrameView.actions = [
|
|
{
|
|
name: "Return to original page",
|
|
icon: "home",
|
|
action: (v) => v.frame.return()
|
|
},
|
|
{
|
|
name: "Open dev tools",
|
|
icon: "binary",
|
|
action: (v) => v.frame.toggleDevTools()
|
|
},
|
|
{
|
|
name: "Copy link",
|
|
icon: "link",
|
|
action: (v) => navigator.clipboard.writeText(v.frame.getCurrentUrl())
|
|
},
|
|
{
|
|
name: "Open in browser",
|
|
icon: "globe",
|
|
action: (v) => open(v.frame.getCurrentUrl())
|
|
},
|
|
{
|
|
name: "Refresh",
|
|
icon: "refresh-cw",
|
|
action: (v) => v.frame.refresh()
|
|
},
|
|
{
|
|
name: "Go back",
|
|
icon: "arrow-left",
|
|
action: (v) => v.frame.goBack()
|
|
},
|
|
{
|
|
name: "Go forward",
|
|
icon: "arrow-right",
|
|
action: (v) => v.frame.goForward()
|
|
}
|
|
];
|
|
|
|
// src/main.ts
|
|
var CustomFramesPlugin = class extends import_obsidian4.Plugin {
|
|
onload() {
|
|
return __async(this, null, function* () {
|
|
yield this.loadSettings();
|
|
for (let frame of this.settings.frames) {
|
|
if (!frame.url || !frame.displayName)
|
|
continue;
|
|
let name = `custom-frames-${getId(frame)}`;
|
|
if (import_obsidian4.Platform.isMobileApp && frame.hideOnMobile) {
|
|
console.log(`Skipping frame ${name} which is hidden on mobile`);
|
|
continue;
|
|
}
|
|
try {
|
|
console.log(`Registering frame ${name} for URL ${frame.url}`);
|
|
this.registerView(name, (l) => new CustomFrameView(l, this.settings, frame, name));
|
|
this.addCommand({
|
|
id: `open-${name}`,
|
|
name: `Open ${frame.displayName}`,
|
|
callback: () => this.openLeaf(name, frame.openInCenter, false)
|
|
});
|
|
if (frame.addRibbonIcon)
|
|
this.addRibbonIcon(getIcon(frame), `Open ${frame.displayName}`, (e) => this.openLeaf(name, frame.openInCenter, import_obsidian4.Platform.isMacOS ? e.metaKey : e.ctrlKey));
|
|
} catch (e) {
|
|
console.error(`Couldn't register frame ${name}, is there already one with the same name?`);
|
|
}
|
|
}
|
|
this.addSettingTab(new CustomFramesSettingTab(this.app, this));
|
|
this.registerMarkdownCodeBlockProcessor("custom-frames", (s, e) => {
|
|
e.empty();
|
|
e.addClass("custom-frames-view-file");
|
|
let frameMatch = /frame:([^\n]+)/gi.exec(s);
|
|
let frameName = frameMatch && frameMatch[1].trim();
|
|
if (!frameName) {
|
|
e.createSpan({ text: "Couldn't parse frame name" });
|
|
return;
|
|
}
|
|
let data = this.settings.frames.find((f) => f.displayName == frameName);
|
|
if (!data) {
|
|
e.createSpan({ text: `Couldn't find a frame with name ${frameName}` });
|
|
return;
|
|
}
|
|
if (import_obsidian4.Platform.isMobileApp && data.hideOnMobile) {
|
|
e.createSpan({ text: `${frameName} is hidden on mobile` });
|
|
return;
|
|
}
|
|
let styleMatch = /style:([^\n]+)/gi.exec(s);
|
|
let style = styleMatch && styleMatch[1].trim();
|
|
style || (style = "height: 600px;");
|
|
let urlSuffixMatch = /urlsuffix:([^\n]+)/gi.exec(s);
|
|
let urlSuffix = urlSuffixMatch && urlSuffixMatch[1].trim();
|
|
urlSuffix || (urlSuffix = "");
|
|
let frame = new CustomFrame(this.settings, data);
|
|
frame.create(e, style, urlSuffix);
|
|
});
|
|
});
|
|
}
|
|
loadSettings() {
|
|
return __async(this, null, function* () {
|
|
this.settings = Object.assign({}, defaultSettings, yield this.loadData());
|
|
});
|
|
}
|
|
saveSettings() {
|
|
return __async(this, null, function* () {
|
|
yield this.saveData(this.settings);
|
|
});
|
|
}
|
|
openLeaf(name, center, split) {
|
|
return __async(this, null, function* () {
|
|
let leaf;
|
|
if (center) {
|
|
leaf = this.app.workspace.getLeaf(split);
|
|
yield leaf.setViewState({ type: name, active: true });
|
|
} else {
|
|
if (!this.app.workspace.getLeavesOfType(name).length)
|
|
yield this.app.workspace.getRightLeaf(false).setViewState({ type: name, active: true });
|
|
leaf = this.app.workspace.getLeavesOfType(name)[0];
|
|
this.app.workspace.revealLeaf(leaf);
|
|
}
|
|
if (leaf.view instanceof CustomFrameView)
|
|
leaf.view.focus();
|
|
});
|
|
}
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL2ZyYW1lLnRzIiwgInNyYy9zZXR0aW5ncy50cyIsICJzcmMvc2V0dGluZ3MtdGFiLnRzIiwgInNyYy92aWV3LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBQbHVnaW4sIFBsYXRmb3JtLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IEN1c3RvbUZyYW1lIH0gZnJvbSBcIi4vZnJhbWVcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRnJhbWVzU2V0dGluZ3MsIGRlZmF1bHRTZXR0aW5ncywgZ2V0SWNvbiwgZ2V0SWQgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBDdXN0b21GcmFtZXNTZXR0aW5nVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3MtdGFiXCI7XHJcbmltcG9ydCB7IEN1c3RvbUZyYW1lVmlldyB9IGZyb20gXCIuL3ZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1c3RvbUZyYW1lc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblxyXG4gICAgc2V0dGluZ3M6IEN1c3RvbUZyYW1lc1NldHRpbmdzO1xyXG5cclxuICAgIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBmcmFtZSBvZiB0aGlzLnNldHRpbmdzLmZyYW1lcykge1xyXG4gICAgICAgICAgICBpZiAoIWZyYW1lLnVybCB8fCAhZnJhbWUuZGlzcGxheU5hbWUpXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgbGV0IG5hbWUgPSBgY3VzdG9tLWZyYW1lcy0ke2dldElkKGZyYW1lKX1gO1xyXG4gICAgICAgICAgICBpZiAoUGxhdGZvcm0uaXNNb2JpbGVBcHAgJiYgZnJhbWUuaGlkZU9uTW9iaWxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBpbmcgZnJhbWUgJHtuYW1lfSB3aGljaCBpcyBoaWRkZW4gb24gbW9iaWxlYCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlZ2lzdGVyaW5nIGZyYW1lICR7bmFtZX0gZm9yIFVSTCAke2ZyYW1lLnVybH1gKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyhuYW1lLCBsID0+IG5ldyBDdXN0b21GcmFtZVZpZXcobCwgdGhpcy5zZXR0aW5ncywgZnJhbWUsIG5hbWUpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGBvcGVuLSR7bmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGBPcGVuICR7ZnJhbWUuZGlzcGxheU5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5vcGVuTGVhZihuYW1lLCBmcmFtZS5vcGVuSW5DZW50ZXIsIGZhbHNlKSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmcmFtZS5hZGRSaWJib25JY29uKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUmliYm9uSWNvbihnZXRJY29uKGZyYW1lKSwgYE9wZW4gJHtmcmFtZS5kaXNwbGF5TmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHRoaXMub3BlbkxlYWYobmFtZSwgZnJhbWUub3BlbkluQ2VudGVyLCBQbGF0Zm9ybS5pc01hY09TID8gZS5tZXRhS2V5IDogZS5jdHJsS2V5KSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGRuJ3QgcmVnaXN0ZXIgZnJhbWUgJHtuYW1lfSwgaXMgdGhlcmUgYWxyZWFkeSBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lP2ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IEN1c3RvbUZyYW1lc1NldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFwiY3VzdG9tLWZyYW1lc1wiLCAocywgZSkgPT4ge1xyXG4gICAgICAgICAgICBlLmVtcHR5KCk7XHJcbiAgICAgICAgICAgIGUuYWRkQ2xhc3MoXCJjdXN0b20tZnJhbWVzLXZpZXctZmlsZVwiKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmcmFtZU1hdGNoID0gL2ZyYW1lOihbXlxcbl0rKS9naS5leGVjKHMpO1xyXG4gICAgICAgICAgICBsZXQgZnJhbWVOYW1lID0gZnJhbWVNYXRjaCAmJiBmcmFtZU1hdGNoWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFmcmFtZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGUuY3JlYXRlU3Bhbih7IHRleHQ6IFwiQ291bGRuJ3QgcGFyc2UgZnJhbWUgbmFtZVwiIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5zZXR0aW5ncy5mcmFtZXMuZmluZChmID0+IGYuZGlzcGxheU5hbWUgPT0gZnJhbWVOYW1lKTtcclxuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBlLmNyZWF0ZVNwYW4oeyB0ZXh0OiBgQ291bGRuJ3QgZmluZCBhIGZyYW1lIHdpdGggbmFtZSAke2ZyYW1lTmFtZX1gIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChQbGF0Zm9ybS5pc01vYmlsZUFwcCAmJiBkYXRhLmhpZGVPbk1vYmlsZSkge1xyXG4gICAgICAgICAgICAgICAgZS5jcmVhdGVTcGFuKHsgdGV4dDogYCR7ZnJhbWVOYW1lfSBpcyBoaWRkZW4gb24gbW9iaWxlYCB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0eWxlTWF0Y2ggPSAvc3R5bGU6KFteXFxuXSspL2dpLmV4ZWMocyk7XHJcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlTWF0Y2ggJiYgc3R5bGVNYXRjaFsxXS50cmltKCk7XHJcbiAgICAgICAgICAgIHN0eWxlIHx8PSBcImhlaWdodDogNjAwcHg7XCI7XHJcblxyXG4gICAgICAgICAgICBsZXQgdXJsU3VmZml4TWF0Y2ggPSAvdXJsc3VmZml4OihbXlxcbl0rKS9naS5leGVjKHMpO1xyXG4gICAgICAgICAgICBsZXQgdXJsU3VmZml4ID0gdXJsU3VmZml4TWF0Y2ggJiYgdXJsU3VmZml4TWF0Y2hbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICB1cmxTdWZmaXggfHw9IFwiXCI7XHJcblxyXG4gICAgICAgICAgICBsZXQgZnJhbWUgPSBuZXcgQ3VzdG9tRnJhbWUodGhpcy5zZXR0aW5ncywgZGF0YSk7XHJcbiAgICAgICAgICAgIGZyYW1lLmNyZWF0ZShlLCBzdHlsZSwgdXJsU3VmZml4KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIG9wZW5MZWFmKG5hbWU6IHN0cmluZywgY2VudGVyOiBib29sZWFuLCBzcGxpdDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGxldCBsZWFmOiBXb3Jrc3BhY2VMZWFmO1xyXG4gICAgICAgIGlmIChjZW50ZXIpIHtcclxuICAgICAgICAgICAgbGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKHNwbGl0KTtcclxuICAgICAgICAgICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoeyB0eXBlOiBuYW1lLCBhY3RpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKG5hbWUpLmxlbmd0aClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRSaWdodExlYWYoZmFsc2UpLnNldFZpZXdTdGF0ZSh7IHR5cGU6IG5hbWUsIGFjdGl2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgbGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUobmFtZSlbMF07XHJcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5yZXZlYWxMZWFmKGxlYWYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGVhZi52aWV3IGluc3RhbmNlb2YgQ3VzdG9tRnJhbWVWaWV3KVxyXG4gICAgICAgICAgICBsZWFmLnZpZXcuZm9jdXMoKTtcclxuICAgIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgQ3VzdG9tRnJhbWVTZXR0aW5ncywgQ3VzdG9tRnJhbWVzU2V0dGluZ3MsIGdldElkIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21GcmFtZSB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nczogQ3VzdG9tRnJhbWVzU2V0dGluZ3M7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IEN1c3RvbUZyYW1lU2V0dGluZ3M7XHJcbiAgICBwcml2YXRlIGZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5nczogQ3VzdG9tRnJhbWVzU2V0dGluZ3MsIGRhdGE6IEN1c3RvbUZyYW1lU2V0dGluZ3MpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGUocGFyZW50OiBIVE1MRWxlbWVudCwgYWRkaXRpb25hbFN0eWxlOiBzdHJpbmcgPSB1bmRlZmluZWQsIHVybFN1ZmZpeDogc3RyaW5nID0gdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN0eWxlID0gYHBhZGRpbmc6ICR7dGhpcy5zZXR0aW5ncy5wYWRkaW5nfXB4O2A7XHJcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxTdHlsZSlcclxuICAgICAgICAgICAgc3R5bGUgKz0gYWRkaXRpb25hbFN0eWxlO1xyXG4gICAgICAgIGlmIChQbGF0Zm9ybS5pc0Rlc2t0b3BBcHAgJiYgIXRoaXMuZGF0YS5mb3JjZUlmcmFtZSkge1xyXG4gICAgICAgICAgICBsZXQgZnJhbWVEb2MgPSBwYXJlbnQuZG9jO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lID0gZnJhbWVEb2MuY3JlYXRlRWxlbWVudChcIndlYnZpZXdcIik7XHJcbiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd3BvcHVwc1wiLCBcIlwiKTtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5hZGRFdmVudExpc3RlbmVyKFwiZG9tLXJlYWR5XCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWUuc2V0Wm9vbUZhY3Rvcih0aGlzLmRhdGEuem9vbUxldmVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWUuaW5zZXJ0Q1NTKHRoaXMuZGF0YS5jdXN0b21Dc3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5leGVjdXRlSmF2YVNjcmlwdCh0aGlzLmRhdGEuY3VzdG9tSnMpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoXCJkZXN0cm95ZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gcmVjcmVhdGUgdGhlIHdlYnZpZXcgaWYgaXQgd2FzIG1vdmVkIHRvIGEgbmV3IHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lRG9jICE9IHBhcmVudC5kb2MpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHBhcmVudCwgYWRkaXRpb25hbFN0eWxlLCB1cmxTdWZmaXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lID0gcGFyZW50LmRvYy5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuc2V0QXR0cmlidXRlKFwic2FuZGJveFwiLCBcImFsbG93LWZvcm1zIGFsbG93LW1vZGFscyBhbGxvdy1wb3B1cHMgYWxsb3ctcHJlc2VudGF0aW9uIGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXNjcmlwdHMgYWxsb3ctdG9wLW5hdmlnYXRpb24tYnktdXNlci1hY3RpdmF0aW9uIGFsbG93LWRvd25sb2Fkc1wiKTtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd1wiLCBcImVuY3J5cHRlZC1tZWRpYTsgZnVsbHNjcmVlbjsgb3ZlcnNpemVkLWltYWdlczsgcGljdHVyZS1pbi1waWN0dXJlOyBzeW5jLXhocjsgZ2VvbG9jYXRpb247XCIpO1xyXG4gICAgICAgICAgICBzdHlsZSArPSBgdHJhbnNmb3JtOiBzY2FsZSgke3RoaXMuZGF0YS56b29tTGV2ZWx9KTsgdHJhbnNmb3JtLW9yaWdpbjogMCAwO2A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZnJhbWUuYWRkQ2xhc3MoXCJjdXN0b20tZnJhbWVzLWZyYW1lXCIpO1xyXG4gICAgICAgIHRoaXMuZnJhbWUuYWRkQ2xhc3MoYGN1c3RvbS1mcmFtZXMtJHtnZXRJZCh0aGlzLmRhdGEpfWApO1xyXG4gICAgICAgIHRoaXMuZnJhbWUuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgc3R5bGUpO1xyXG5cclxuICAgICAgICBsZXQgc3JjID0gdGhpcy5kYXRhLnVybDtcclxuICAgICAgICBpZiAodXJsU3VmZml4KSB7XHJcbiAgICAgICAgICAgIGlmICghdXJsU3VmZml4LnN0YXJ0c1dpdGgoXCIvXCIpKVxyXG4gICAgICAgICAgICAgICAgc3JjICs9IFwiL1wiO1xyXG4gICAgICAgICAgICBzcmMgKz0gdXJsU3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLCBzcmMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZnJhbWUgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5yZWxvYWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmZyYW1lIGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5jb250ZW50V2luZG93Lm9wZW4odGhpcy5kYXRhLnVybCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5sb2FkVVJMKHRoaXMuZGF0YS51cmwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnb0JhY2soKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZnJhbWUgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5iYWNrKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5nb0JhY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ29Gb3J3YXJkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmZyYW1lIGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5jb250ZW50V2luZG93Lmhpc3RvcnkuZm9yd2FyZCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuZ29Gb3J3YXJkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZURldlRvb2xzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghKHRoaXMuZnJhbWUgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZyYW1lLmlzRGV2VG9vbHNPcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5vcGVuRGV2VG9vbHMoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWUuY2xvc2VEZXZUb29scygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRVcmwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mcmFtZSBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50ID8gdGhpcy5mcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgOiB0aGlzLmZyYW1lLmdldFVSTCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmZyYW1lIGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5jb250ZW50V2luZG93LmZvY3VzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCAiZXhwb3J0IGNvbnN0IGRlZmF1bHRTZXR0aW5nczogQ3VzdG9tRnJhbWVzU2V0dGluZ3MgPSB7XHJcbiAgICBmcmFtZXM6IFtdLFxyXG4gICAgcGFkZGluZzogNVxyXG59O1xyXG5leHBvcnQgY29uc3QgcHJlc2V0czogUmVjb3JkPHN0cmluZywgQ3VzdG9tRnJhbWVTZXR0aW5ncz4gPSB7XHJcbiAgICBcIm9ic2lkaWFuXCI6IHtcclxuICAgICAgICB1cmw6IFwiaHR0cHM6Ly9mb3J1bS5vYnNpZGlhbi5tZC9cIixcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJPYnNpZGlhbiBGb3J1bVwiLFxyXG4gICAgICAgIGljb246IFwiZWRpdFwiLFxyXG4gICAgICAgIGhpZGVPbk1vYmlsZTogdHJ1ZSxcclxuICAgICAgICBhZGRSaWJib25JY29uOiB0cnVlLFxyXG4gICAgICAgIG9wZW5JbkNlbnRlcjogdHJ1ZSxcclxuICAgICAgICB6b29tTGV2ZWw6IDEsXHJcbiAgICAgICAgZm9yY2VJZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgIGN1c3RvbUNzczogXCJcIixcclxuICAgICAgICBjdXN0b21KczogXCJcIlxyXG4gICAgfSxcclxuICAgIFwiZGV0ZXhpZnlcIjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL2RldGV4aWZ5LmtpcmVsYWJzLm9yZy9jbGFzc2lmeS5odG1sXCIsXHJcbiAgICAgICAgZGlzcGxheU5hbWU6IFwiRGV0ZXhpZnlcIixcclxuICAgICAgICBpY29uOiBcInR5cGVcIixcclxuICAgICAgICBoaWRlT25Nb2JpbGU6IHRydWUsXHJcbiAgICAgICAgYWRkUmliYm9uSWNvbjogdHJ1ZSxcclxuICAgICAgICBvcGVuSW5DZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgIHpvb21MZXZlbDogLjk1LFxyXG4gICAgICAgIGZvcmNlSWZyYW1lOiBmYWxzZSxcclxuICAgICAgICBjdXN0b21Dc3M6IGAvKiBoaWRlIGluZm8gY2x1dHRlciBhbmQgYWQgYmFubmVyICovXHJcbiNjbGFzc2lmeS0taW5mby1hcmVhLFxyXG4uYWRzYnlnb29nbGUge1xyXG5cdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudFxyXG59YCxcclxuICAgICAgICBjdXN0b21KczogXCJcIlxyXG4gICAgfSxcclxuICAgIFwiY2FsZW5kYXJcIjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL2NhbGVuZGFyLmdvb2dsZS5jb20vY2FsZW5kYXJcIixcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJHb29nbGUgQ2FsZW5kYXJcIixcclxuICAgICAgICBpY29uOiBcImNhbGVuZGFyXCIsXHJcbiAgICAgICAgaGlkZU9uTW9iaWxlOiB0cnVlLFxyXG4gICAgICAgIGFkZFJpYmJvbkljb246IHRydWUsXHJcbiAgICAgICAgb3BlbkluQ2VudGVyOiB0cnVlLFxyXG4gICAgICAgIHpvb21MZXZlbDogMSxcclxuICAgICAgICBmb3JjZUlmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgY3VzdG9tQ3NzOiBgLyogaGlkZSB0aGUgbWVudSBiYXIgXCJDYWxlbmRhclwiIHRleHQgYW5kIHJlbW92ZSBtaW5pbXVtIHdpZHRoICovXHJcbmRpdltzdHlsZSo9XCJtaW4td2lkdGg6IDIzOHB4XCJdIHtcclxuICAgIG1pbi13aWR0aDogMCAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZy1yaWdodDogMCAhaW1wb3J0YW50O1xyXG59XHJcbmRpdltzdHlsZSo9XCJtaW4td2lkdGg6IDIzOHB4XCJdIHNwYW5bcm9sZSo9XCJoZWFkaW5nXCJdIHtcclxuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxufWAsXHJcbiAgICAgICAgY3VzdG9tSnM6IFwiXCJcclxuICAgIH0sXHJcbiAgICBcImtlZXBcIjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL2tlZXAuZ29vZ2xlLmNvbVwiLFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBcIkdvb2dsZSBLZWVwXCIsXHJcbiAgICAgICAgaWNvbjogXCJmaWxlc1wiLFxyXG4gICAgICAgIGhpZGVPbk1vYmlsZTogdHJ1ZSxcclxuICAgICAgICBhZGRSaWJib25JY29uOiBmYWxzZSxcclxuICAgICAgICBvcGVuSW5DZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgIHpvb21MZXZlbDogMSxcclxuICAgICAgICBmb3JjZUlmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgY3VzdG9tQ3NzOiBgLyogaGlkZSB0aGUgbWVudSBiYXIsIHRoZSBcIktlZXBcIiB0ZXh0IGFuZCB0aGUgR29vZ2xlIEFwcHMgYnV0dG9uICovXHJcbmh0bWwgPiBib2R5ID4gZGl2Om50aC1jaGlsZCgyKSA+IGRpdjpudGgtY2hpbGQoMikgPiBkaXY6Zmlyc3QtY2hpbGQsXHJcbmh0bWwgPiBib2R5ID4gZGl2OmZpcnN0LWNoaWxkID4gaGVhZGVyOmZpcnN0LWNoaWxkID4gZGl2ID4gZGl2OmZpcnN0LWNoaWxkID4gZGl2ID4gZGl2OmZpcnN0LWNoaWxkID4gYTpmaXJzdC1jaGlsZCA+IHNwYW4sXHJcbmh0bWwgPiBib2R5ID4gZGl2OmZpcnN0LWNoaWxkID4gaGVhZGVyOmZpcnN0LWNoaWxkID4gZGl2Om50aC1jaGlsZCgyKSA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCxcclxuaHRtbCA+IGJvZHkgPiBkaXY6Zmlyc3QtY2hpbGQgPiBoZWFkZXI6Zmlyc3QtY2hpbGQgPiBkaXY6bnRoLWNoaWxkKDIpID4gZGl2Om50aC1jaGlsZCgzKSA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCB7XHJcblx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcbmh0bWwgPiBib2R5ID4gZGl2OmZpcnN0LWNoaWxkID4gaGVhZGVyOmZpcnN0LWNoaWxkID4gZGl2ID4gZGl2OmZpcnN0LWNoaWxkID4gZGl2ID4gZGl2OmZpcnN0LWNoaWxkID4gYTpmaXJzdC1jaGlsZCB7XHJcblx0Y3Vyc29yOiBkZWZhdWx0O1xyXG59YCxcclxuICAgICAgICBjdXN0b21KczogXCJcIlxyXG4gICAgfSxcclxuICAgIFwidG9kb2lzdFwiOiB7XHJcbiAgICAgICAgdXJsOiBcImh0dHBzOi8vdG9kb2lzdC5jb21cIixcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJUb2RvaXN0XCIsXHJcbiAgICAgICAgaWNvbjogXCJsaXN0LWNoZWNrc1wiLFxyXG4gICAgICAgIGhpZGVPbk1vYmlsZTogdHJ1ZSxcclxuICAgICAgICBhZGRSaWJib25JY29uOiBmYWxzZSxcclxuICAgICAgICBvcGVuSW5DZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgIHpvb21MZXZlbDogMSxcclxuICAgICAgICBmb3JjZUlmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgY3VzdG9tQ3NzOiBgLyogaGlkZSB0aGUgaGVscCwgaG9tZSwgc2VhcmNoLCBhbmQgcHJvZHVjdGl2aXR5IG92ZXJ2aWV3IGJ1dHRvbnMsIGNyZWF0ZSBleHRyYSBzcGFjZSwgYW5kIHByZXZlbnQgdG9hc3QgcG9wLXVwIGZyb20gYWN0aW5nIHdlaXJkICovXHJcblthcmlhLWxhYmVsPVwiR28gdG8gSG9tZSB2aWV3XCJdLCAjcXVpY2tfZmluZCwgW2FyaWEtbGFiZWw9XCJQcm9kdWN0aXZpdHlcIl0sIFthcmlhLWxhYmVsPVwiSGVscCAmIEZlZWRiYWNrXCJdIHtcclxuXHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi52aWV3X2NvbnRlbnQge1xyXG5cdHBhZGRpbmctbGVmdDogMTVweDtcclxufVxyXG5cclxuLnZpZXdfaGVhZGVyIHtcclxuXHRwYWRkaW5nLWxlZnQ6IDE1cHg7XHJcblx0cGFkZGluZy10b3A6IDEwcHg7XHJcbn1cclxuXHJcbi51bmRvX3RvYXN0IHtcclxuXHR3aWR0aDogOTUlO1xyXG59YCxcclxuICAgICAgICBjdXN0b21KczogXCJcIlxyXG4gICAgfSxcclxuICAgIFwibm90aW9uXCI6IHtcclxuICAgICAgICB1cmw6IFwiaHR0cHM6Ly93d3cubm90aW9uLnNvL1wiLFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBcIk5vdGlvblwiLFxyXG4gICAgICAgIGljb246IFwiYm94XCIsXHJcbiAgICAgICAgaGlkZU9uTW9iaWxlOiB0cnVlLFxyXG4gICAgICAgIGFkZFJpYmJvbkljb246IHRydWUsXHJcbiAgICAgICAgb3BlbkluQ2VudGVyOiB0cnVlLFxyXG4gICAgICAgIHpvb21MZXZlbDogMSxcclxuICAgICAgICBmb3JjZUlmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgY3VzdG9tQ3NzOiBcIlwiLFxyXG4gICAgICAgIGN1c3RvbUpzOiBcIlwiXHJcbiAgICB9LFxyXG4gICAgXCJ0d2l0dGVyXCI6IHtcclxuICAgICAgICB1cmw6IFwiaHR0cHM6Ly90d2l0dGVyLmNvbVwiLFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBcIlR3aXR0ZXJcIixcclxuICAgICAgICBpY29uOiBcInR3aXR0ZXJcIixcclxuICAgICAgICBoaWRlT25Nb2JpbGU6IHRydWUsXHJcbiAgICAgICAgYWRkUmliYm9uSWNvbjogZmFsc2UsXHJcbiAgICAgICAgb3BlbkluQ2VudGVyOiBmYWxzZSxcclxuICAgICAgICB6b29tTGV2ZWw6IDEsXHJcbiAgICAgICAgZm9yY2VJZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgIGN1c3RvbUNzczogXCJcIixcclxuICAgICAgICBjdXN0b21KczogXCJcIlxyXG4gICAgfSxcclxuICAgIFwidGFza3NcIjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL3Rhc2tzLmdvb2dsZS5jb20vZW1iZWQvP29yaWdpbj1odHRwczovL2NhbGVuZGFyLmdvb2dsZS5jb20mZnVsbFdpZHRoPTFcIixcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJHb29nbGUgVGFza3NcIixcclxuICAgICAgICBpY29uOiBcImxpc3QtY2hlY2tzXCIsXHJcbiAgICAgICAgaGlkZU9uTW9iaWxlOiB0cnVlLFxyXG4gICAgICAgIGFkZFJpYmJvbkljb246IGZhbHNlLFxyXG4gICAgICAgIG9wZW5JbkNlbnRlcjogZmFsc2UsXHJcbiAgICAgICAgem9vbUxldmVsOiAxLFxyXG4gICAgICAgIGZvcmNlSWZyYW1lOiBmYWxzZSxcclxuICAgICAgICBjdXN0b21Dc3M6IFwiXCIsXHJcbiAgICAgICAgY3VzdG9tSnM6IFwiXCJcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tRnJhbWVzU2V0dGluZ3Mge1xyXG4gICAgZnJhbWVzOiBDdXN0b21GcmFtZVNldHRpbmdzW107XHJcbiAgICBwYWRkaW5nOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tRnJhbWVTZXR0aW5ncyB7XHJcbiAgICB1cmw6IHN0cmluZztcclxuICAgIGRpc3BsYXlOYW1lOiBzdHJpbmc7XHJcbiAgICBpY29uOiBzdHJpbmc7XHJcbiAgICBoaWRlT25Nb2JpbGU6IGJvb2xlYW47XHJcbiAgICBhZGRSaWJib25JY29uOiBib29sZWFuO1xyXG4gICAgb3BlbkluQ2VudGVyOiBib29sZWFuO1xyXG4gICAgem9vbUxldmVsOiBudW1iZXI7XHJcbiAgICBmb3JjZUlmcmFtZTogYm9vbGVhbjtcclxuICAgIGN1c3RvbUNzczogc3RyaW5nO1xyXG4gICAgY3VzdG9tSnM6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEljb24oc2V0dGluZ3M6IEN1c3RvbUZyYW1lU2V0dGluZ3MpIHtcclxuICAgIHJldHVybiBzZXR0aW5ncy5pY29uID8gYGx1Y2lkZS0ke3NldHRpbmdzLmljb259YCA6IFwiZG9jdW1lbnRzXCI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJZChzZXR0aW5nczogQ3VzdG9tRnJhbWVTZXR0aW5ncykge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiLVwiKTtcclxufVxyXG4iLCAiaW1wb3J0IHsgQXBwLCBCdXR0b25Db21wb25lbnQsIERyb3Bkb3duQ29tcG9uZW50LCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRTZXR0aW5ncywgcHJlc2V0cyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XHJcbmltcG9ydCBDdXN0b21GcmFtZXNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEN1c3RvbUZyYW1lc1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHJcbiAgICBwbHVnaW46IEN1c3RvbUZyYW1lc1BsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBDdXN0b21GcmFtZXNQbHVnaW4pIHtcclxuICAgICAgICBzdXBlcihhcHAsIHBsdWdpbik7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcGxheSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJDdXN0b20gRnJhbWVzIFNldHRpbmdzXCIgfSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlBsZWFzZSBub3RlIHRoYXQgT2JzaWRpYW4gaGFzIHRvIGJlIHJlc3RhcnRlZCBvciByZWxvYWRlZCBmb3IgbW9zdCBvZiB0aGVzZSBzZXR0aW5ncyB0byB0YWtlIGVmZmVjdC5cIixcclxuICAgICAgICAgICAgY2xzOiBcIm1vZC13YXJuaW5nXCJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbmV3IFNldHRpbmcodGhpcy5jb250YWluZXJFbClcclxuICAgICAgICAgICAgLnNldE5hbWUoXCJGcmFtZSBQYWRkaW5nXCIpXHJcbiAgICAgICAgICAgIC5zZXREZXNjKFwiVGhlIHBhZGRpbmcgdGhhdCBzaG91bGQgYmUgbGVmdCBhcm91bmQgdGhlIGluc2lkZSBvZiBjdXN0b20gZnJhbWUgcGFuZXMsIGluIHBpeGVscy5cIilcclxuICAgICAgICAgICAgLmFkZFRleHQodCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0LmlucHV0RWwudHlwZSA9IFwibnVtYmVyXCI7XHJcbiAgICAgICAgICAgICAgICB0LnNldFZhbHVlKFN0cmluZyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wYWRkaW5nKSk7XHJcbiAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnBhZGRpbmcgPSB2Lmxlbmd0aCA/IE51bWJlcih2KSA6IGRlZmF1bHRTZXR0aW5ncy5wYWRkaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBmcmFtZSBvZiB0aGlzLnBsdWdpbi5zZXR0aW5ncy5mcmFtZXMpIHtcclxuICAgICAgICAgICAgbGV0IGhlYWRpbmcgPSB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwgeyB0ZXh0OiBmcmFtZS5kaXNwbGF5TmFtZSB8fCBcIlVubmFtZWQgRnJhbWVcIiB9KTtcclxuICAgICAgICAgICAgbGV0IHRvZ2dsZSA9IG5ldyBCdXR0b25Db21wb25lbnQodGhpcy5jb250YWluZXJFbClcclxuICAgICAgICAgICAgICAgIC5zZXRCdXR0b25UZXh0KFwiU2hvdyBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICAgICAgLnNldENsYXNzKFwiY3VzdG9tLWZyYW1lcy1zaG93XCIpXHJcbiAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudC5oaWRkZW4gPSAhY29udGVudC5oaWRkZW47XHJcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlLnNldEJ1dHRvblRleHQoY29udGVudC5oaWRkZW4gPyBcIlNob3cgU2V0dGluZ3NcIiA6IFwiSGlkZSBTZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRGl2KCk7XHJcbiAgICAgICAgICAgIGNvbnRlbnQuaGlkZGVuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIkRpc3BsYXkgTmFtZVwiKVxyXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXCJUaGUgZGlzcGxheSBuYW1lIHRoYXQgdGhpcyBmcmFtZSBzaG91bGQgaGF2ZS5cIilcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZnJhbWUuZGlzcGxheU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHQub25DaGFuZ2UoYXN5bmMgdiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmRpc3BsYXlOYW1lID0gdjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZy5zZXRUZXh0KGZyYW1lLmRpc3BsYXlOYW1lIHx8IFwiVW5uYW1lZCBGcmFtZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGVudClcclxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiSWNvblwiKVxyXG4gICAgICAgICAgICAgICAgLnNldERlc2MoY3JlYXRlRnJhZ21lbnQoZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZi5jcmVhdGVTcGFuKHsgdGV4dDogXCJUaGUgaWNvbiB0aGF0IHRoaXMgZnJhbWUncyBwYW5lIHNob3VsZCBoYXZlLiBUaGUgbmFtZXMgb2YgYW55IFwiIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlRWwoXCJhXCIsIHsgdGV4dDogXCJMdWNpZGUgaWNvbnNcIiwgaHJlZjogXCJodHRwczovL2x1Y2lkZS5kZXYvXCIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZi5jcmVhdGVTcGFuKHsgdGV4dDogXCIgY2FuIGJlIHVzZWQuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZnJhbWUuaWNvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5vbkNoYW5nZShhc3luYyB2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuaWNvbiA9IHY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIlVSTFwiKVxyXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXCJUaGUgVVJMIHRoYXQgc2hvdWxkIGJlIG9wZW5lZCBpbiB0aGlzIGZyYW1lLlwiKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRleHQodCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShmcmFtZS51cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHQub25DaGFuZ2UoYXN5bmMgdiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnVybCA9IHY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIkRpc2FibGUgb24gTW9iaWxlXCIpXHJcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcIkN1c3RvbSBGcmFtZXMgaXMgYSBsb3QgbW9yZSByZXN0cmljdGVkIG9uIG1vYmlsZSBkZXZpY2VzIGFuZCBkb2Vzbid0IGFsbG93IGZvciB0aGUgc2FtZSB0eXBlcyBvZiBjb250ZW50IHRvIGJlIGRpc3BsYXllZC4gSWYgYSBmcmFtZSBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQgb24gbW9iaWxlLCBpdCBjYW4gYmUgZGlzYWJsZWQuXCIpXHJcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZnJhbWUuaGlkZU9uTW9iaWxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5oaWRlT25Nb2JpbGUgPSB2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJBZGQgUmliYm9uIEljb25cIilcclxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiV2hldGhlciBhIGJ1dHRvbiB0byBvcGVuIHRoaXMgZnJhbWUgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSByaWJib24uXCIpXHJcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZnJhbWUuYWRkUmliYm9uSWNvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5vbkNoYW5nZShhc3luYyB2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuYWRkUmliYm9uSWNvbiA9IHY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIk9wZW4gaW4gQ2VudGVyXCIpXHJcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcIldoZXRoZXIgdGhpcyBmcmFtZSBzaG91bGQgYmUgb3BlbmVkIGluIHRoZSB1bnBpbm5lZCBjZW50ZXIgZWRpdG9yIHJhdGhlciB0aGFuIG9uZSBvZiB0aGUgcGFuZXMgb24gdGhlIHNpZGUuIFRoaXMgaXMgdXNlZnVsIGZvciBzaXRlcyB0aGF0IGRvbid0IHdvcmsgd2VsbCBpbiBhIG5hcnJvdyB2aWV3LCBvciBzaXRlcyB0aGF0IGRvbid0IHJlcXVpcmUgYSBub3RlIHRvIGJlIG9wZW4gd2hlbiB2aWV3ZWQuXCIpXHJcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZnJhbWUub3BlbkluQ2VudGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5vcGVuSW5DZW50ZXIgPSB2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJGb3JjZSBpZnJhbWVcIilcclxuICAgICAgICAgICAgICAgIC5zZXREZXNjKGNyZWF0ZUZyYWdtZW50KGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlU3Bhbih7IHRleHQ6IFwiV2hldGhlciB0aGlzIGZyYW1lIHNob3VsZCB1c2UgaWZyYW1lcyBvbiBkZXNrdG9wIGFzIG9wcG9zZWQgdG8gRWxlY3Ryb24gd2Vidmlld3MuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZi5jcmVhdGVFbChcImJyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlRWwoXCJlbVwiLCB7IHRleHQ6IFwiT25seSBlbmFibGUgdGhpcyBzZXR0aW5nIGlmIHRoZSBmcmFtZSBpcyBjYXVzaW5nIGlzc3VlcyBvciBmcmVxdWVudCBjcmFzaGVzLiBUaGlzIHNldHRpbmcgY2F1c2VzIGFsbCBEZXNrdG9wLW9ubHkgc2V0dGluZ3MgdG8gYmUgaWdub3JlZC5cIiB9KTtcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGZyYW1lLmZvcmNlSWZyYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5mb3JjZUlmcmFtZSA9IHY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIlBhZ2UgWm9vbVwiKVxyXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXCJUaGUgem9vbSB0aGF0IHRoaXMgZnJhbWUncyBwYWdlIHNob3VsZCBiZSBkaXNwbGF5ZWQgd2l0aCwgYXMgYSBwZXJjZW50YWdlLlwiKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRleHQodCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5pbnB1dEVsLnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoU3RyaW5nKGZyYW1lLnpvb21MZXZlbCAqIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHQub25DaGFuZ2UoYXN5bmMgdiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnpvb21MZXZlbCA9IHYubGVuZ3RoID8gTnVtYmVyKHYpIC8gMTAwIDogMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGVudClcclxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiQWRkaXRpb25hbCBDU1NcIilcclxuICAgICAgICAgICAgICAgIC5zZXREZXNjKGNyZWF0ZUZyYWdtZW50KGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlU3Bhbih7IHRleHQ6IFwiQSBzbmlwcGV0IG9mIGFkZGl0aW9uYWwgQ1NTIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyBmcmFtZS5cIiB9KTtcclxuICAgICAgICAgICAgICAgICAgICBmLmNyZWF0ZUVsKFwiYnJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZi5jcmVhdGVFbChcImVtXCIsIHsgdGV4dDogXCJOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGFwcGxpZWQgb24gRGVza3RvcC5cIiB9KTtcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRleHRBcmVhKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHQuaW5wdXRFbC5yb3dzID0gNTtcclxuICAgICAgICAgICAgICAgICAgICB0LmlucHV0RWwuY29scyA9IDUwO1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZnJhbWUuY3VzdG9tQ3NzKTtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jdXN0b21Dc3MgPSB2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJBZGRpdGlvbmFsIEphdmFTY3JpcHRcIilcclxuICAgICAgICAgICAgICAgIC5zZXREZXNjKGNyZWF0ZUZyYWdtZW50KGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlU3Bhbih7IHRleHQ6IFwiQSBzbmlwcGV0IG9mIGFkZGl0aW9uYWwgSmF2YVNjcmlwdCB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgZnJhbWUuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZi5jcmVhdGVFbChcImJyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlRWwoXCJlbVwiLCB7IHRleHQ6IFwiTm90ZSB0aGF0IHRoaXMgaXMgb25seSBhcHBsaWVkIG9uIERlc2t0b3AuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0QXJlYSh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0LmlucHV0RWwucm93cyA9IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5pbnB1dEVsLmNvbHMgPSA1MDtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGZyYW1lLmN1c3RvbUpzKTtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jdXN0b21KcyA9IHY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoY29udGVudClcclxuICAgICAgICAgICAgICAgIC5zZXRCdXR0b25UZXh0KFwiUmVtb3ZlIEZyYW1lXCIpXHJcbiAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZnJhbWVzLnJlbW92ZShmcmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiQ3JlYXRlIGEgbmV3IGZyYW1lLCBlaXRoZXIgZnJvbSBhIHByZXNldCBzaGlwcGVkIHdpdGggdGhlIHBsdWdpbiwgb3IgYSBjdXN0b20gb25lIHRoYXQgeW91IGNhbiBlZGl0IHlvdXJzZWxmLiBFYWNoIGZyYW1lJ3MgcGFuZSBjYW4gYmUgb3BlbmVkIHVzaW5nIHRoZSBcXFwiQ3VzdG9tIEZyYW1lczogT3BlblxcXCIgY29tbWFuZC5cIiB9KTtcclxuXHJcbiAgICAgICAgbGV0IGFkZERpdiA9IHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRGl2KCk7XHJcbiAgICAgICAgbGV0IGRyb3Bkb3duID0gbmV3IERyb3Bkb3duQ29tcG9uZW50KGFkZERpdik7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKFwibmV3XCIsIFwiQ3VzdG9tXCIpO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhwcmVzZXRzKSlcclxuICAgICAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKGtleSwgcHJlc2V0c1trZXldLmRpc3BsYXlOYW1lKTtcclxuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGFkZERpdilcclxuICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoXCJBZGQgRnJhbWVcIilcclxuICAgICAgICAgICAgLnNldENsYXNzKFwiY3VzdG9tLWZyYW1lcy1hZGRcIilcclxuICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvbiA9IGRyb3Bkb3duLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uID09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5mcmFtZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IFwiTmV3IEZyYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVPbk1vYmlsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmliYm9uSWNvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5JbkNlbnRlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHpvb21MZXZlbDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VJZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21Dc3M6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUpzOiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZyYW1lcy5wdXNoKHByZXNldHNbb3B0aW9uXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IGRpc2NsYWltZXIgPSB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IGNsczogXCJtb2Qtd2FybmluZ1wiIH0pO1xyXG4gICAgICAgIGRpc2NsYWltZXIuY3JlYXRlU3Bhbih7IHRleHQ6IFwiUGxlYXNlIGJlIGFkdmlzZWQgdGhhdCwgd2hlbiBhZGRpbmcgYSBzaXRlIGFzIGEgY3VzdG9tIGZyYW1lLCB5b3UgcG90ZW50aWFsbHkgZXhwb3NlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHlvdSBlbnRlciB0byBvdGhlciBwbHVnaW5zIHlvdSBoYXZlIGluc3RhbGxlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBcIiB9KTtcclxuICAgICAgICBkaXNjbGFpbWVyLmNyZWF0ZUVsKFwiYVwiLCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwidGhpcyBkaXNjdXNzaW9uXCIsXHJcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0VsbHBlY2svT2JzaWRpYW5DdXN0b21GcmFtZXMvaXNzdWVzLzU0I2lzc3VlY29tbWVudC0xMjEwODc5Njg1XCIsXHJcbiAgICAgICAgICAgIGNsczogXCJtb2Qtd2FybmluZ1wiXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGlzY2xhaW1lci5jcmVhdGVTcGFuKHsgdGV4dDogXCIuXCIgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4gYW5kIHdhbnQgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQsIHlvdSBjYW4gZG8gc28gdGhyb3VnaCBteSB3ZWJzaXRlIGJ5IGNsaWNraW5nIHRoaXMgZmFuY3kgaW1hZ2UhXCIgfSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImFcIiwgeyBocmVmOiBcImh0dHBzOi8vZWxscGVjay5kZS9zdXBwb3J0XCIgfSkuY3JlYXRlRWwoXCJpbWdcIiwge1xyXG4gICAgICAgICAgICBhdHRyOiB7IHNyYzogXCJodHRwczovL2VsbHBlY2suZGUvcmVzL2dlbmVyYWxzdXBwb3J0LnBuZ1wiIH0sXHJcbiAgICAgICAgICAgIGNsczogXCJjdXN0b20tZnJhbWVzLXN1cHBvcnRcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBJdGVtVmlldywgV29ya3NwYWNlTGVhZiwgTWVudSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBDdXN0b21GcmFtZSB9IGZyb20gXCIuL2ZyYW1lXCI7XHJcbmltcG9ydCB7IEN1c3RvbUZyYW1lU2V0dGluZ3MsIEN1c3RvbUZyYW1lc1NldHRpbmdzLCBnZXRJY29uIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21GcmFtZVZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYWN0aW9uczogQWN0aW9uW10gPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlJldHVybiB0byBvcmlnaW5hbCBwYWdlXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiaG9tZVwiLFxyXG4gICAgICAgICAgICBhY3Rpb246IHYgPT4gdi5mcmFtZS5yZXR1cm4oKVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJPcGVuIGRldiB0b29sc1wiLFxyXG4gICAgICAgICAgICBpY29uOiBcImJpbmFyeVwiLFxyXG4gICAgICAgICAgICBhY3Rpb246IHYgPT4gdi5mcmFtZS50b2dnbGVEZXZUb29scygpXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkNvcHkgbGlua1wiLFxyXG4gICAgICAgICAgICBpY29uOiBcImxpbmtcIixcclxuICAgICAgICAgICAgYWN0aW9uOiB2ID0+IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHYuZnJhbWUuZ2V0Q3VycmVudFVybCgpKVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJPcGVuIGluIGJyb3dzZXJcIixcclxuICAgICAgICAgICAgaWNvbjogXCJnbG9iZVwiLFxyXG4gICAgICAgICAgICBhY3Rpb246IHYgPT4gb3Blbih2LmZyYW1lLmdldEN1cnJlbnRVcmwoKSlcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiUmVmcmVzaFwiLFxyXG4gICAgICAgICAgICBpY29uOiBcInJlZnJlc2gtY3dcIixcclxuICAgICAgICAgICAgYWN0aW9uOiB2ID0+IHYuZnJhbWUucmVmcmVzaCgpXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkdvIGJhY2tcIixcclxuICAgICAgICAgICAgaWNvbjogXCJhcnJvdy1sZWZ0XCIsXHJcbiAgICAgICAgICAgIGFjdGlvbjogdiA9PiB2LmZyYW1lLmdvQmFjaygpXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkdvIGZvcndhcmRcIixcclxuICAgICAgICAgICAgaWNvbjogXCJhcnJvdy1yaWdodFwiLFxyXG4gICAgICAgICAgICBhY3Rpb246IHYgPT4gdi5mcmFtZS5nb0ZvcndhcmQoKVxyXG4gICAgICAgIH1cclxuICAgIF07XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBDdXN0b21GcmFtZVNldHRpbmdzO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGZyYW1lOiBDdXN0b21GcmFtZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsZWFmOiBXb3Jrc3BhY2VMZWFmLCBzZXR0aW5nczogQ3VzdG9tRnJhbWVzU2V0dGluZ3MsIGRhdGE6IEN1c3RvbUZyYW1lU2V0dGluZ3MsIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGxlYWYpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLmZyYW1lID0gbmV3IEN1c3RvbUZyYW1lKHNldHRpbmdzLCBkYXRhKTtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb24gPSBkYXRhLm9wZW5JbkNlbnRlcjtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgYWN0aW9uIG9mIEN1c3RvbUZyYW1lVmlldy5hY3Rpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmFkZEFjdGlvbihhY3Rpb24uaWNvbiwgYWN0aW9uLm5hbWUsICgpID0+IGFjdGlvbi5hY3Rpb24odGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIG9ubG9hZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmFkZENsYXNzKFwiY3VzdG9tLWZyYW1lcy12aWV3XCIpO1xyXG4gICAgICAgIHRoaXMuZnJhbWUuY3JlYXRlKHRoaXMuY29udGVudEVsKTtcclxuICAgIH1cclxuXHJcbiAgICBvblBhbmVNZW51KG1lbnU6IE1lbnUsIHNvdXJjZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIub25QYW5lTWVudShtZW51LCBzb3VyY2UpO1xyXG4gICAgICAgIGZvciAobGV0IGFjdGlvbiBvZiBDdXN0b21GcmFtZVZpZXcuYWN0aW9ucykge1xyXG4gICAgICAgICAgICBtZW51LmFkZEl0ZW0oaSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpLnNldFRpdGxlKGFjdGlvbi5uYW1lKTtcclxuICAgICAgICAgICAgICAgIGkuc2V0SWNvbihhY3Rpb24uaWNvbik7XHJcbiAgICAgICAgICAgICAgICBpLm9uQ2xpY2soKCkgPT4gYWN0aW9uLmFjdGlvbih0aGlzKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRWaWV3VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGlzcGxheVRleHQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmRpc3BsYXlOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEljb24oKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gZ2V0SWNvbih0aGlzLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZnJhbWUuZm9jdXMoKTtcclxuICAgIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIEFjdGlvbiB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBpY29uOiBzdHJpbmc7XHJcbiAgICBhY3Rpb246ICh2aWV3OiBDdXN0b21GcmFtZVZpZXcpID0+IGFueTtcclxufVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQWdEOzs7QUNBaEQsc0JBQXlCOzs7QUNBbEIsSUFBTSxrQkFBd0M7QUFBQSxFQUNqRCxRQUFRO0FBQUEsRUFDUixTQUFTO0FBQUE7QUFFTixJQUFNLFVBQStDO0FBQUEsRUFDeEQsWUFBWTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sY0FBYztBQUFBLElBQ2QsZUFBZTtBQUFBLElBQ2YsY0FBYztBQUFBLElBQ2QsV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsV0FBVztBQUFBLElBQ1gsVUFBVTtBQUFBO0FBQUEsRUFFZCxZQUFZO0FBQUEsSUFDUixLQUFLO0FBQUEsSUFD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
|