XeNote/posts/.obsidian/plugins/obsidian-minimal-settings/main.js

547 lines
100 KiB
JavaScript
Raw Normal View History

2021-03-03 21:33:38 +00:00
'use strict';
var obsidian = require('obsidian');
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
}
var MinimalTheme = /** @class */ (function (_super) {
__extends(MinimalTheme, _super);
function MinimalTheme() {
return _super !== null && _super.apply(this, arguments) || this;
}
MinimalTheme.prototype.onload = function () {
return __awaiter(this, void 0, void 0, function () {
var _a, media, callback, lightStyles, darkStyles, theme;
var _this = this;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = this;
return [4 /*yield*/, this.loadData()];
case 1:
_a.settings = (_b.sent()) || new MinimalSettings();
this.addSettingTab(new MinimalSettingTab(this.app, this));
this.addStyle();
media = window.matchMedia('(prefers-color-scheme: dark)');
callback = function () {
if (media.matches) {
console.log('Dark mode active');
_this.updateDarkStyle();
}
else {
console.log('Light mode active');
_this.updateLightStyle();
}
};
media.addEventListener('change', callback);
// Remove listener when we unload
this.register(function () { return media.removeEventListener('change', callback); });
lightStyles = ['minimal-light', 'minimal-light-tonal', 'minimal-light-contrast', 'minimal-light-white'];
darkStyles = ['minimal-dark', 'minimal-dark-tonal', 'minimal-dark-black'];
theme = ['theme-light', 'theme-dark'];
this.addCommand({
id: 'toggle-minimal-dark-cycle',
name: 'Cycle between dark mode styles',
callback: function () {
_this.settings.darkStyle = darkStyles[(darkStyles.indexOf(_this.settings.darkStyle) + 1) % darkStyles.length];
_this.saveData(_this.settings);
_this.updateDarkStyle();
}
});
this.addCommand({
id: 'toggle-minimal-light-cycle',
name: 'Cycle between light mode styles',
callback: function () {
_this.settings.lightStyle = lightStyles[(lightStyles.indexOf(_this.settings.lightStyle) + 1) % lightStyles.length];
_this.saveData(_this.settings);
_this.updateLightStyle();
}
});
this.addCommand({
id: 'toggle-hidden-borders',
name: 'Toggle sidebar borders',
callback: function () {
_this.settings.bordersToggle = !_this.settings.bordersToggle;
_this.saveData(_this.settings);
_this.refresh();
}
});
this.addCommand({
id: 'toggle-minimal-switch',
name: 'Switch between light and dark mode',
callback: function () {
_this.settings.theme = theme[(theme.indexOf(_this.settings.theme) + 1) % theme.length];
_this.saveData(_this.settings);
_this.updateTheme();
}
});
this.addCommand({
id: 'toggle-minimal-light-default',
name: 'Use light mode (default)',
callback: function () {
_this.settings.lightStyle = 'minimal-light';
_this.saveData(_this.settings);
_this.updateLightStyle();
}
});
this.addCommand({
id: 'toggle-minimal-light-white',
name: 'Use light mode (all white)',
callback: function () {
_this.settings.lightStyle = 'minimal-light-white';
_this.saveData(_this.settings);
_this.updateLightStyle();
}
});
this.addCommand({
id: 'toggle-minimal-light-tonal',
name: 'Use light mode (low contrast)',
callback: function () {
_this.settings.lightStyle = 'minimal-light-tonal';
_this.saveData(_this.settings);
_this.updateLightStyle();
}
});
this.addCommand({
id: 'toggle-minimal-light-contrast',
name: 'Use light mode (high contrast)',
callback: function () {
_this.settings.lightStyle = 'minimal-light-contrast';
_this.saveData(_this.settings);
_this.updateLightStyle();
}
});
this.addCommand({
id: 'toggle-minimal-dark-default',
name: 'Use dark mode (default)',
callback: function () {
_this.settings.darkStyle = 'minimal-dark';
_this.saveData(_this.settings);
_this.updateDarkStyle();
}
});
this.addCommand({
id: 'toggle-minimal-dark-tonal',
name: 'Use dark mode (low contrast)',
callback: function () {
_this.settings.darkStyle = 'minimal-dark-tonal';
_this.saveData(_this.settings);
_this.updateDarkStyle();
}
});
this.addCommand({
id: 'toggle-minimal-dark-black',
name: 'Use dark mode (true black)',
callback: function () {
_this.settings.darkStyle = 'minimal-dark-black';
_this.saveData(_this.settings);
_this.updateDarkStyle();
}
});
this.refresh();
if (this.settings.useSystemTheme) {
this.enableSystemTheme();
}
return [2 /*return*/];
}
});
});
};
// refresh function for when we change settings
MinimalTheme.prototype.refresh = function () {
// re-load the style
this.updateStyle();
};
// add the styling elements we need
MinimalTheme.prototype.addStyle = function () {
// add a css block for our settings-dependent styles
var css = document.createElement('style');
css.id = 'minimal-theme';
document.getElementsByTagName("head")[0].appendChild(css);
// add the main class
document.body.classList.add('minimal-theme');
// update the style with the settings-dependent styles
this.updateStyle();
};
// update the styles (at the start, or as the result of a settings change)
MinimalTheme.prototype.updateStyle = function () {
this.removeStyle();
document.body.classList.toggle('borders-none', !this.settings.bordersToggle);
document.body.classList.toggle('fancy-cursor', this.settings.fancyCursor);
document.body.classList.toggle('focus-mode', this.settings.focusMode);
document.body.classList.toggle('links-int-on', this.settings.underlineInternal);
document.body.classList.toggle('links-ext-on', this.settings.underlineExternal);
document.body.classList.toggle('system-shade', this.settings.useSystemTheme);
// get the custom css element
var el = document.getElementById('minimal-theme');
if (!el)
throw "minimal-theme element not found!";
else {
// set the settings-dependent css
el.innerText = "\n body.minimal-theme{\n --font-normal:" + this.settings.textNormal + "px;\n --font-small:" + this.settings.textSmall + "px;\n --line-width:" + this.settings.lineWidth + "rem;\n --font-monospace:" + this.settings.monoFont + ";\n --text:" + this.settings.textFont + ";\n --text-editor:" + this.settings.editorFont + ";\n --accent-h:" + this.settings.accentHue + ";\n --accent-s:" + this.settings.accentSat + "%;}\n ";
}
};
MinimalTheme.prototype.enableSystemTheme = function () {
this.app.workspace.layoutReady ? this.refreshSystemTheme() : this.app.workspace.on('layout-ready', this.refreshSystemTheme);
};
MinimalTheme.prototype.refreshSystemTheme = function () {
var isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
if (isDarkMode && this.settings.useSystemTheme) {
console.log('Dark mode active');
this.updateDarkStyle();
}
else if (this.settings.useSystemTheme) {
console.log('Light mode active');
this.updateLightStyle();
}
};
MinimalTheme.prototype.updateDarkStyle = function () {
document.body.removeClass('theme-light', 'minimal-dark', 'minimal-dark-tonal', 'minimal-dark-black');
document.body.addClass('theme-dark', this.settings.darkStyle);
this.app.workspace.trigger('css-change');
};
MinimalTheme.prototype.updateLightStyle = function () {
document.body.removeClass('theme-dark', 'minimal-light', 'minimal-light-tonal', 'minimal-light-contrast', 'minimal-light-white');
document.body.addClass('theme-light', this.settings.lightStyle);
this.app.workspace.trigger('css-change');
};
MinimalTheme.prototype.updateTheme = function () {
document.body.removeClass('theme-dark', 'theme-light');
document.body.addClass(this.settings.theme);
this.app.workspace.trigger('css-change');
};
MinimalTheme.prototype.removeStyle = function () {
document.body.removeClass('minimal-light', 'minimal-light-tonal', 'minimal-light-contrast', 'minimal-light-white', 'minimal-dark', 'minimal-dark-tonal', 'minimal-dark-black');
document.body.addClass(this.settings.lightStyle, this.settings.darkStyle);
};
return MinimalTheme;
}(obsidian.Plugin));
var MinimalSettings = /** @class */ (function () {
function MinimalSettings() {
this.theme = 'theme-light';
this.accentHue = 201;
this.accentSat = 17;
this.lightStyle = 'minimal-light';
this.darkStyle = 'minimal-dark';
this.textFont = '-apple-system,BlinkMacSystemFont,"Segoe UI Emoji","Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,sans-serif';
this.editorFont = '-apple-system,BlinkMacSystemFont,"Segoe UI Emoji","Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,sans-serif';
this.monoFont = 'Menlo,SFMono-Regular,Consolas,Roboto Mono,monospace';
this.bordersToggle = true;
this.fancyCursor = true;
this.focusMode = true;
this.lineWidth = 40;
this.textNormal = 16;
this.textSmall = 13;
this.underlineInternal = true;
this.underlineExternal = true;
this.useSystemTheme = false;
}
return MinimalSettings;
}());
var MinimalSettingTab = /** @class */ (function (_super) {
__extends(MinimalSettingTab, _super);
function MinimalSettingTab(app, plugin) {
var _this = _super.call(this, app, plugin) || this;
_this.plugin = plugin;
return _this;
}
MinimalSettingTab.prototype.display = function () {
var _this = this;
var containerEl = this.containerEl;
containerEl.empty();
containerEl.createEl('h3', { text: 'Minimal Theme Settings' });
containerEl.createEl('p', { text: 'If you notice any issues, update to the latest version of Minimal Theme and reload Obsidian. Download the Hider plugin for additional options to further simplify the Obsidian UI.' });
containerEl.createEl('a', { text: '⬤ Accent color' });
containerEl.createEl('h3');
new obsidian.Setting(containerEl)
.setName('Accent color hue')
.setDesc('For links and interactive elements')
.addSlider(function (slider) { return slider
.setLimits(0, 360, 1)
.setValue(_this.plugin.settings.accentHue)
.onChange(function (value) {
_this.plugin.settings.accentHue = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Accent color saturation')
.setDesc('For links and interactive elements')
.addSlider(function (slider) { return slider
.setLimits(0, 100, 1)
.setValue(_this.plugin.settings.accentSat)
.onChange(function (value) {
_this.plugin.settings.accentSat = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Fancy cursor')
.setDesc('The editor cursor takes on your accent color')
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.fancyCursor)
.onChange(function (value) {
_this.plugin.settings.fancyCursor = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Use system-level setting for light or dark mode')
.setDesc('Automatically switch based on your operating system settings')
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.useSystemTheme)
.onChange(function (value) {
_this.plugin.settings.useSystemTheme = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refreshSystemTheme();
}); });
new obsidian.Setting(containerEl)
.setName('Light mode style')
.setDesc('Background colors in light mode')
.addDropdown(function (dropdown) { return dropdown
.addOption('minimal-light', 'Default')
.addOption('minimal-light-white', 'All white')
.addOption('minimal-light-tonal', 'Low contrast')
.addOption('minimal-light-contrast', 'High contrast')
.setValue(_this.plugin.settings.lightStyle)
.onChange(function (value) {
_this.plugin.settings.lightStyle = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.removeStyle();
}); });
new obsidian.Setting(containerEl)
.setName('Dark mode style')
.setDesc('Background colors in dark mode')
.addDropdown(function (dropdown) { return dropdown
.addOption('minimal-dark', 'Default')
.addOption('minimal-dark-tonal', 'Low contrast')
.addOption('minimal-dark-black', 'True black')
.setValue(_this.plugin.settings.darkStyle)
.onChange(function (value) {
_this.plugin.settings.darkStyle = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.removeStyle();
}); });
new obsidian.Setting(containerEl)
.setName('Toggle sidebar borders')
.setDesc('Hide or show sidebar borders')
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.bordersToggle)
.onChange(function (value) {
_this.plugin.settings.bordersToggle = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Focus mode')
.setDesc('When sidebars are collapsed hide action buttons (accessible by hovering)')
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.focusMode)
.onChange(function (value) {
_this.plugin.settings.focusMode = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Text font')
.setDesc('Used in preview mode — the font must also be installed on your computer')
.addDropdown(function (dropdown) { return dropdown
.addOption('-apple-system,BlinkMacSystemFont,"Segoe UI Emoji","Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,sans-serif', 'System font')
.addOption('Inter', 'Inter')
.addOption('iA Writer Mono S', 'iA Mono')
.addOption('iA Writer Duo S', 'iA Duo')
.addOption('iA Writer Quattro S', 'iA Quattro')
.addOption('SFMono-Regular', 'SF Mono')
.addOption('Consolas', 'Consolas')
.addOption('Roboto Mono', 'Roboto Mono')
.setValue(_this.plugin.settings.textFont)
.onChange(function (value) {
_this.plugin.settings.textFont = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Editor font')
.setDesc('Used in edit mode')
.addDropdown(function (dropdown) { return dropdown
.addOption('-apple-system,BlinkMacSystemFont,"Segoe UI Emoji","Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,sans-serif', 'System font')
.addOption('Inter', 'Inter')
.addOption('iA Writer Mono S', 'iA Mono')
.addOption('iA Writer Duo S', 'iA Duo')
.addOption('iA Writer Quattro S', 'iA Quattro')
.addOption('SFMono-Regular', 'SF Mono')
.addOption('Consolas', 'Consolas')
.addOption('Roboto Mono', 'Roboto Mono')
.setValue(_this.plugin.settings.editorFont)
.onChange(function (value) {
_this.plugin.settings.editorFont = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Monospace font')
.setDesc('Used for code blocks, front matter, etc')
.addDropdown(function (dropdown) { return dropdown
.addOption('Menlo,SFMono-Regular,Consolas,Roboto Mono,monospace', 'System font')
.addOption('iA Writer Mono S', 'iA Mono')
.addOption('iA Writer Duo S', 'iA Duo')
.addOption('iA Writer Quattro S', 'iA Quattro')
.addOption('SFMono-Regular', 'SF Mono')
.addOption('Consolas', 'Consolas')
.addOption('Roboto Mono', 'Roboto Mono')
.setValue(_this.plugin.settings.monoFont)
.onChange(function (value) {
_this.plugin.settings.monoFont = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Underline internal links')
.setDesc('Show underlines on internal links')
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.underlineInternal)
.onChange(function (value) {
_this.plugin.settings.underlineInternal = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Underline external links')
.setDesc('Show underlines on external links')
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.underlineExternal)
.onChange(function (value) {
_this.plugin.settings.underlineExternal = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Line width')
.setDesc('The maximum number of characters per line (default 40)')
.addText(function (text) { return text.setPlaceholder('40')
.setValue((_this.plugin.settings.lineWidth || '') + '')
.onChange(function (value) {
_this.plugin.settings.lineWidth = parseInt(value.trim());
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Body font size')
.setDesc('Used for the main text (default 16)')
.addText(function (text) { return text.setPlaceholder('16')
.setValue((_this.plugin.settings.textNormal || '') + '')
.onChange(function (value) {
_this.plugin.settings.textNormal = parseInt(value.trim());
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Sidebar font size')
.setDesc('Used for text in the sidebars (default 13)')
.addText(function (text) { return text.setPlaceholder('13')
.setValue((_this.plugin.settings.textSmall || '') + '')
.onChange(function (value) {
_this.plugin.settings.textSmall = parseInt(value.trim());
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
containerEl.createEl('br');
containerEl.createEl('h3');
containerEl.createEl('h3', { text: 'Custom fonts' });
containerEl.createEl('p', { text: 'These settings override the dropdowns above. Make sure to use the exact name of the font as it appears on your system.' });
new obsidian.Setting(containerEl)
.setName('Custom text font')
.setDesc('Used in preview mode')
.addText(function (text) { return text.setPlaceholder('')
.setValue((_this.plugin.settings.textFont || '') + '')
.onChange(function (value) {
_this.plugin.settings.textFont = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Custom editor font')
.setDesc('Used in edit mode')
.addText(function (text) { return text.setPlaceholder('')
.setValue((_this.plugin.settings.editorFont || '') + '')
.onChange(function (value) {
_this.plugin.settings.editorFont = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
new obsidian.Setting(containerEl)
.setName('Custom monospace font')
.setDesc('Used for code blocks, front matter, etc')
.addText(function (text) { return text.setPlaceholder('')
.setValue((_this.plugin.settings.monoFont || '') + '')
.onChange(function (value) {
_this.plugin.settings.monoFont = value;
_this.plugin.saveData(_this.plugin.settings);
_this.plugin.refresh();
}); });
};
return MinimalSettingTab;
}(obsidian.PluginSettingTab));
module.exports = MinimalTheme;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmF