master-degree-notes/.obsidian/plugins/scroll-speed/main.js

219 lines
25 KiB
JavaScript

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());
});
};
// main.ts
__export(exports, {
default: () => ScrollSpeed
});
var import_obsidian = __toModule(require("obsidian"));
var DEFAULT_SETTINGS = {
speed: 5,
altMultiplier: 5,
enableAnimations: true
};
var ScrollSpeed = class extends import_obsidian.Plugin {
constructor() {
super(...arguments);
this.animationSmoothness = 3;
this.positionY = 0;
this.isMoving = false;
this.scrollDistance = 0;
this.windowOpenListener = (_win, window2) => {
this.registerDomEvent(window2, "wheel", this.scrollListener, { passive: false });
};
this.scrollListener = (event) => {
event.preventDefault();
const path = event.path || event.composedPath && event.composedPath();
for (const element of path) {
if (this.isScrollable(element, event)) {
this.target = element;
if (this.isTrackPadUsed(event) || !this.settings.enableAnimations) {
this.scrollWithoutAnimation(event);
} else {
this.scrollWithAnimation(event);
}
break;
}
}
};
}
onload() {
return __async(this, null, function* () {
yield this.loadSettings();
this.addSettingTab(new SettingsTab(this.app, this));
this.registerDomEvent(window, "wheel", this.scrollListener, { passive: false });
this.registerEvent(this.app.on("window-open", this.windowOpenListener));
});
}
scrollWithoutAnimation(event) {
const acceleration = event.altKey ? this.settings.speed * this.settings.altMultiplier : this.settings.speed;
this.target.scrollBy(event.deltaX * acceleration, event.deltaY * acceleration);
}
scrollWithAnimation(event) {
if (!this.isMoving) {
this.positionY = this.target.scrollTop;
}
const acceleration = event.altKey ? Math.pow(this.settings.speed * this.settings.altMultiplier, 1.1) : Math.pow(this.settings.speed, 1.1);
this.positionY += event.deltaY * acceleration;
this.scrollDistance = event.deltaY * acceleration;
this.positionY = Math.max(0, Math.min(this.positionY, this.target.scrollHeight - this.target.clientHeight));
if (!this.isMoving) {
this.isMoving = true;
this.updateScrollAnimation();
}
}
updateScrollAnimation() {
if (!this.isMoving || !this.target) {
return this.stopScrollAnimation();
}
const divider = Math.pow(this.animationSmoothness, 1.3);
const delta = this.positionY - this.target.scrollTop;
this.target.scrollTop += delta / divider;
if (delta < 0 && this.positionY < 0 && this.target.scrollTop === 0) {
return this.stopScrollAnimation();
}
if (delta > 0 && this.positionY > this.target.scrollHeight - this.target.clientHeight / 2 - this.scrollDistance) {
return this.stopScrollAnimation();
}
if (Math.abs(delta) < this.scrollDistance * 0.015 || Math.abs(delta / divider) < 1) {
return this.stopScrollAnimation();
}
window.requestAnimationFrame(this.updateScrollAnimation.bind(this));
}
stopScrollAnimation() {
this.isMoving = false;
this.scrollDistance = 0;
this.positionY = this.target.scrollTop;
if (this.target)
this.target = void 0;
}
isScrollable(element, event) {
const isHorizontal = event.deltaX && !event.deltaY;
return this.isContentOverflowing(element, isHorizontal) && this.hasOverflowStyle(element, isHorizontal);
}
isContentOverflowing(element, horizontal) {
const client = horizontal ? element.clientWidth : element.clientHeight;
const scroll = horizontal ? element.scrollWidth : element.scrollHeight;
return client < scroll;
}
hasOverflowStyle(element, horizontal) {
const style = getComputedStyle(element);
const overflow = style.getPropertyValue(horizontal ? "overflow-x" : "overflow-y");
return /^(scroll|auto)$/.test(overflow);
}
isTrackPadUsed(event) {
let isTrackPad = false;
if (event.wheelDeltaY) {
if (event.wheelDeltaY === event.deltaY * -3) {
isTrackPad = true;
}
} else if (event.deltaMode === 0) {
isTrackPad = true;
}
return isTrackPad;
}
loadSettings() {
return __async(this, null, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.settings);
});
}
};
var SettingsTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
let speedSlider;
new import_obsidian.Setting(containerEl).setName("Mouse Scroll Speed").setDesc("1 is the default scroll speed, higher is faster").addExtraButton((button) => {
button.setIcon("reset").setTooltip("Restore default").onClick(() => __async(this, null, function* () {
this.plugin.settings.speed = DEFAULT_SETTINGS.speed;
speedSlider.setValue(DEFAULT_SETTINGS.speed);
yield this.plugin.saveSettings();
}));
}).addSlider((slider) => {
speedSlider = slider;
slider.setValue(this.plugin.settings.speed).setLimits(0.1, 10, 0.1).setDynamicTooltip().onChange((value) => __async(this, null, function* () {
this.plugin.settings.speed = value;
yield this.plugin.saveSettings();
}));
});
let altMultiplierSlider;
new import_obsidian.Setting(containerEl).setName("Alt Multiplier").setDesc("Multiply scroll speed when the ALT key is pressed").addExtraButton((button) => {
button.setIcon("reset").setTooltip("Restore default").onClick(() => __async(this, null, function* () {
this.plugin.settings.altMultiplier = DEFAULT_SETTINGS.altMultiplier;
altMultiplierSlider.setValue(DEFAULT_SETTINGS.altMultiplier);
yield this.plugin.saveSettings();
}));
}).addSlider((slider) => {
altMultiplierSlider = slider;
slider.setValue(this.plugin.settings.altMultiplier).setLimits(0.1, 10, 0.1).setDynamicTooltip().onChange((value) => __async(this, null, function* () {
this.plugin.settings.altMultiplier = value;
yield this.plugin.saveSettings();
}));
});
let animationToggle;
new import_obsidian.Setting(containerEl).setName("Enable Animation").setDesc("Toggle smooth scrolling animations").addExtraButton((button) => {
button.setIcon("reset").setTooltip("Restore default").onClick(() => __async(this, null, function* () {
this.plugin.settings.enableAnimations = DEFAULT_SETTINGS.enableAnimations;
animationToggle.setValue(DEFAULT_SETTINGS.enableAnimations);
yield this.plugin.saveSettings();
}));
}).addToggle((toggle) => {
animationToggle = toggle;
toggle.setValue(this.plugin.settings.enableAnimations).onChange((value) => __async(this, null, function* () {
this.plugin.settings.enableAnimations = value;
yield this.plugin.saveSettings();
}));
});
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtcclxuICBBcHAsXHJcbiAgUGx1Z2luLFxyXG4gIFBsdWdpblNldHRpbmdUYWIsXHJcbiAgU2V0dGluZyxcclxuICBTbGlkZXJDb21wb25lbnQsXHJcbiAgVG9nZ2xlQ29tcG9uZW50LFxyXG4gIFdvcmtzcGFjZVdpbmRvdyxcclxufSBmcm9tICdvYnNpZGlhbidcclxuXHJcbmludGVyZmFjZSBBdWdtZW50ZWRXaGVlbEV2ZW50IGV4dGVuZHMgV2hlZWxFdmVudCB7XHJcbiAgcGF0aDogRWxlbWVudFtdXHJcbiAgd2hlZWxEZWx0YVk6IG51bWJlclxyXG4gIHdoZWVsRGVsdGFYOiBudW1iZXJcclxufVxyXG5cclxuaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICBzcGVlZDogbnVtYmVyXHJcbiAgYWx0TXVsdGlwbGllcjogbnVtYmVyXHJcbiAgZW5hYmxlQW5pbWF0aW9uczogYm9vbGVhblxyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBTZXR0aW5ncyA9IHtcclxuICBzcGVlZDogNSxcclxuICBhbHRNdWx0aXBsaWVyOiA1LFxyXG4gIGVuYWJsZUFuaW1hdGlvbnM6IHRydWUsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjcm9sbFNwZWVkIGV4dGVuZHMgUGx1Z2luIHtcclxuICBzZXR0aW5nczogU2V0dGluZ3NcclxuXHJcbiAgYW5pbWF0aW9uU21vb3RobmVzcyA9IDNcclxuICBwb3NpdGlvblkgPSAwXHJcbiAgaXNNb3ZpbmcgPSBmYWxzZVxyXG4gIHRhcmdldDogRWxlbWVudCB8IHVuZGVmaW5lZFxyXG4gIHNjcm9sbERpc3RhbmNlID0gMFxyXG5cclxuICBhc3luYyBvbmxvYWQoKSB7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpXHJcbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSlcclxuXHJcbiAgICB0aGlzLnJlZ2lzdGVyRG9tRXZlbnQod2luZG93LCAnd2hlZWwnLCB0aGlzLnNjcm9sbExpc3RlbmVyLCB7cGFzc2l2ZTogZmFsc2V9KVxyXG5cclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5vbignd2luZG93LW9wZW4nLCB0aGlzLndpbmRvd09wZW5MaXN0ZW5lcikpXHJcbiAgfVxyXG5cclxuICB3aW5kb3dPcGVuTGlzdGVuZXIgPSAoX3dpbjogV29ya3NwYWNlV2luZG93LCB3aW5kb3c6IFdpbmRvdykgPT4ge1xyXG4gICAgdGhpcy5yZWdpc3RlckRvbUV2ZW50KHdpbmRvdywgJ3doZWVsJywgdGhpcy5zY3JvbGxMaXN0ZW5lciwge3Bhc3NpdmU6IGZhbHNlfSlcclxuICB9XHJcblxyXG4gIHNjcm9sbExpc3RlbmVyID0gKGV2ZW50OiBBdWdtZW50ZWRXaGVlbEV2ZW50KSA9PiB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcblxyXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5MjQ1NjM4Lzg1ODY4MDNcclxuICAgIGNvbnN0IHBhdGggPSBldmVudC5wYXRoIHx8IChldmVudC5jb21wb3NlZFBhdGggJiYgKGV2ZW50LmNvbXBvc2VkUGF0aCgpIGFzIEVsZW1lbnRbXSkpXHJcblxyXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHBhdGgpIHtcclxuICAgICAgaWYgKHRoaXMuaXNTY3JvbGxhYmxlKGVsZW1lbnQsIGV2ZW50KSkge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gZWxlbWVudFxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1RyYWNrUGFkVXNlZChldmVudCkgfHwgIXRoaXMuc2V0dGluZ3MuZW5hYmxlQW5pbWF0aW9ucykge1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxXaXRob3V0QW5pbWF0aW9uKGV2ZW50KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbFdpdGhBbmltYXRpb24oZXZlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzY3JvbGxXaXRob3V0QW5pbWF0aW9uKGV2ZW50OiBBdWdtZW50ZWRXaGVlbEV2ZW50KSB7XHJcbiAgICBjb25zdCBhY2NlbGVyYXRpb24gPSBldmVudC5hbHRLZXlcclxuICAgICAgPyB0aGlzLnNldHRpbmdzLnNwZWVkICogdGhpcy5zZXR0aW5ncy5hbHRNdWx0aXBsaWVyXHJcbiAgICAgIDogdGhpcy5zZXR0aW5ncy5zcGVlZFxyXG5cclxuICAgIHRoaXMudGFyZ2V0LnNjcm9sbEJ5KGV2ZW50LmRlbHRhWCAqIGFjY2VsZXJhdGlvbiwgZXZlbnQuZGVsdGFZICogYWNjZWxlcmF0aW9uKVxyXG4gIH1cclxuXHJcbiAgc2Nyb2xsV2l0aEFuaW1hdGlvbihldmVudDogQXVnbWVudGVkV2hlZWxFdmVudCkge1xyXG4gICAgLy8gVE9ETyBob3Jpem9udGFsIHNjcm9sbGluZywgdG9vXHJcbiAgICBpZiAoIXRoaXMuaXNNb3ZpbmcpIHtcclxuICAgICAgdGhpcy5wb3NpdGlvblkgPSB0aGlzLnRhcmdldC5zY3JvbGxUb3BcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhY2NlbGVyYXRpb24gPSBldmVudC5hbHRLZXlcclxuICAgICAgPyBNYXRoLnBvdyh0aGlzLnNldHRpbmdzLnNwZWVkICogdGhpcy5zZXR0aW5ncy5hbHRNdWx0aXBsaWVyLCAxLjEpXHJcbiAgICAgIDogTWF0aC5wb3codGhpcy5zZXR0aW5ncy5zcGVlZCwgMS4xKVxyXG5cclxuICAgIHRoaXMucG9zaXRpb25ZICs9IGV2ZW50LmRlbHRhWSAqIGFjY2VsZXJhdGlvblxyXG4gICAgdGhpcy5zY3JvbGxEaXN0YW5jZSA9IGV2ZW50LmRlbHRhWSAqIGFjY2VsZXJhdGlvblxyXG4gICAgdGhpcy5wb3NpdGlvblkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnBvc2l0aW9uWSwgdGhpcy50YXJnZXQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy50YXJnZXQuY2xpZW50SGVpZ2h0KSlcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNNb3ZpbmcpIHtcclxuICAgICAgdGhpcy5pc01vdmluZyA9IHRydWVcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlU2Nyb2xsQW5pbWF0aW9uKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVNjcm9sbEFuaW1hdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5pc01vdmluZyB8fCAhdGhpcy50YXJnZXQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RvcFNjcm9sbEFuaW1hdGlvbigpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGl2aWRlciA9IE1hdGgucG93KHRoaXMuYW5pbWF0aW9uU21vb3RobmVzcywgMS4zKVxyXG4gICAgY29uc3QgZGVsdGEgPSB0aGlzLnBvc2l0aW9uWSAtIHRoaXMudGFyZ2V0LnNjcm9sbFRvcFxyXG4gICAgdGhpcy50YXJnZXQuc2Nyb2xsVG9wICs9IGRlbHRhIC8gZGl2aWRlclxyXG5cclxuICAgIC8vIEJvdW5kYXJ5IGF0IHRoZSB0b3BcclxuICAgIGlmIChkZWx0YSA8IDAgJiYgdGhpcy5wb3NpdGlvblkgPCAwICYmIHRoaXMudGFyZ2V0LnNjcm9sbFRvcCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zdG9wU2Nyb2xsQW5pbWF0aW9uKClcclxuICAgIH1cclxuXHJcbiAgICAvLyBCb3VuZGFyeSBhdCB0aGUgYm90dG9tXHJcbiAgICBpZiAoXHJcbiAgICAgIGRlbHRhID4gMCAmJlxyXG4gICAgICB0aGlzLnBvc2l0aW9uWSA+IHRoaXMudGFyZ2V0LnNjcm9sbEhlaWdodCAtIHRoaXMudGFyZ2V0LmNsaWVudEhlaWdodCAvIDIgLSB0aGlzLnNjcm9sbERpc3RhbmNlXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RvcFNjcm9sbEFuaW1hdGlvbigpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gU3RvcCB3aGVuIG1vdmVtZW50IGRlbHRhIGlzIGFwcHJvYWNoaW5nIHplcm9cclxuICAgIGlmIChNYXRoLmFicyhkZWx0YSkgPCB0aGlzLnNjcm9sbERpc3RhbmNlICogMC4wMTUgfHwgTWF0aC5hYnMoZGVsdGEgLyBkaXZpZGVyKSA8IDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RvcFNjcm9sbEFuaW1hdGlvbigpXHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZVNjcm9sbEFuaW1hdGlvbi5iaW5kKHRoaXMpKVxyXG4gIH1cclxuXHJcbiAgc3RvcFNjcm9sbEFuaW1hdGlvbigpIHtcclxuICAgIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5zY3JvbGxEaXN0YW5jZSA9IDBcclxuICAgIHRoaXMucG9zaXRpb25ZID0gdGhpcy50YXJnZXQuc2Nyb2xsVG9wXHJcbiAgICBpZiAodGhpcy50YXJnZXQpIHRoaXMudGFyZ2V0ID0gdW5kZWZpbmVkXHJcbiAgfVxyXG5cclxuICBpc1Njcm9sbGFibGUoZWxlbWVudDogRWxlbWVudCwgZXZlbnQ6IEF1Z21lbnRlZFdoZWVsRXZlbnQpIHtcclxuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGV2ZW50LmRlbHRhWCAmJiAhZXZlbnQuZGVsdGFZXHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5pc0NvbnRlbnRPdmVyZmxvd2luZyhlbGVtZW50LCBpc0hvcml6b250YWwpICYmXHJcbiAgICAgIHRoaXMuaGFzT3ZlcmZsb3dTdHlsZShlbGVtZW50LCBpc0hvcml6b250YWwpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBpc0NvbnRlbnRPdmVyZmxvd2luZyhlbGVtZW50OiBFbGVtZW50LCBob3Jpem9udGFsOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBjbGllbnQgPSBob3Jpem9udGFsID8gZWxlbWVudC5jbGllbnRXaWR0aCA6IGVsZW1lbnQuY2xpZW50SGVpZ2h0XHJcbiAgICBjb25zdCBzY3JvbGwgPSBob3Jpem9udGFsID8gZWxlbWVudC5zY3JvbGxXaWR0aCA6IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0XHJcbiAgICByZXR1cm4gY2xpZW50IDwgc2Nyb2xsXHJcbiAgfVxyXG5cclxuICBoYXNPdmVyZmxvd1N0eWxlKGVsZW1lbnQ6IEVsZW1lbnQsIGhvcml6b250YWw6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxyXG4gICAgY29uc3Qgb3ZlcmZsb3cgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGhvcml6b250YWwgPyAnb3ZlcmZsb3cteCcgOiAnb3ZlcmZsb3cteScpXHJcbiAgICByZXR1cm4gL14oc2Nyb2xsfGF1dG8pJC8udGVzdChvdmVyZmxvdylcclxuICB9XHJcblxyXG4gIGlzVHJhY2tQYWRVc2VkKGV2ZW50OiBBdWdtZW50ZWRXaGVlbEV2ZW50KSB7XHJcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjI0MTU3NTQvODU4NjgwM1xyXG5cclxuICAgIGxldCBpc1RyYWNrUGFkID0gZmFsc2VcclxuICAgIGlmIChldmVudC53aGVlbERlbHRhWSkge1xyXG4gICAgICBpZiAoZXZlbnQud2hlZWxEZWx0YVkgPT09IGV2ZW50LmRlbHRhWSAqIC0zKSB7XHJcbiAgICAgICAgaXNUcmFja1BhZCA9IHRydWVcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudC5kZWx0YU1vZGUgPT09IDApIHtcclxuICAgICAgaXNUcmFja1BhZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNUcmFja1BhZFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSlcclxuICB9XHJcblxyXG4gIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncylcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcbiAgcGx1Z2luOiBTY3JvbGxTcGVlZFxyXG5cclxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTY3JvbGxTcGVlZCkge1xyXG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pXHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpblxyXG4gIH1cclxuXHJcbiAgZGlzcGxheSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHtjb250YWluZXJFbH0gPSB0aGlzXHJcbiAgICBjb250YWluZXJFbC5lbXB0eSgpXHJcblxyXG4gICAgbGV0IHNwZWVkU2xpZGVyOiBTbGlkZXJDb21wb25lbnRcclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnTW91c2UgU2Nyb2xsIFNwZWVkJylcclxuICAgICAgLnNldERlc2MoJzEgaXMgdGhlIGRlZmF1bHQgc2Nyb2xsIHNwZWVkLCBoaWdoZXIgaXMgZmFzdGVyJylcclxuICAgICAgLmFkZEV4dHJhQnV0dG9uKGJ1dHRvbiA9PiB7XHJcbiAgICAgICAgYnV0dG9uXHJcbiAgICAgICAgICAuc2V0SWNvbigncmVzZXQnKVxyXG4gICAgICAgICAgLnNldFRvb2x0aXAoJ1Jlc3RvcmUgZGVmYXVsdCcpXHJcbiAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnNwZWVkID0gREVGQVVMVF9TRVRUSU5HUy5zcGVlZFxyXG4gICAgICAgICAgICBzcGVlZFNsaWRlci5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLnNwZWVkKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgLmFkZFNsaWRlcihzbGlkZXIgPT4ge1xyXG4gICAgICAgIHNwZWVkU2xpZGVyID0gc2xpZGVyXHJcbiAgICAgICAgc2xpZGVyXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc3BlZWQpXHJcbiAgICAgICAgICAuc2V0TGltaXRzKDAuMSwgMTAsIDAuMSlcclxuICAgICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zcGVlZCA9IHZhbHVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgIGxldCBhbHRNdWx0aXBsaWVyU2xpZGVyOiBTbGlkZXJDb21wb25lbnRcclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnQWx0IE11bHRpcGxpZXInKVxyXG4gICAgICAuc2V0RGVzYygnTXVsdGlwbHkgc2Nyb2xsIHNwZWVkIHdoZW4gdGhlIEFMVCBrZXkgaXMgcHJlc3NlZCcpXHJcbiAgICAgIC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xyXG4gICAgICAgIGJ1dHRvblxyXG4gICAgICAgICAgLnNldEljb24oJ3Jlc2V0JylcclxuICAgICAgICAgIC5zZXRUb29sdGlwKCdSZXN0b3JlIGRlZmF1bHQnKVxyXG4gICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5hbHRNdWx0aXBsaWVyID0gREVGQVVMVF9TRVRUSU5HUy5hbHRNdWx0aXBsaWVyXHJcbiAgICAgICAgICAgIGFsdE11bHRpcGxpZXJTbGlkZXIuc2V0VmFsdWUoREVGQVVMVF9TRVRUSU5HUy5hbHRNdWx0aXBsaWVyKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgLmFkZFNsaWRlcihzbGlkZXIgPT4ge1xyXG4gICAgICAgIGFsdE11bHRpcGxpZXJTbGlkZXIgPSBzbGlkZXJcclxuICAgICAgICBzbGlkZXJcclxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hbHRNdWx0aXBsaWVyKVxyXG4gICAgICAgICAgLnNldExpbWl0cygwLjEsIDEwLCAwLjEpXHJcbiAgICAgICAgICAuc2V0RHluYW1pY1Rvb2x0aXAoKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuYWx0TXVsdGlwbGllciA9IHZhbHVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgIGxldCBhbmltYXRpb25Ub2dnbGU6IFRvZ2dsZUNvbXBvbmVudFxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKCdFbmFibGUgQW5pbWF0aW9uJylcclxuICAgICAgLnNldERlc2MoJ1RvZ2dsZSBzbW9vdGggc2Nyb2xsaW5nIGFuaW1hdGlvbnMnKVxyXG4gICAgICAuYWRkRXh0cmFCdXR0b24oYnV0dG9uID0+IHtcclxuICAgICAgICBidXR0b25cclxuICAgICAgICAgIC5zZXRJY29uKCdyZXNldCcpXHJcbiAgICAgICAgICAuc2V0VG9vbHRpcCgnUmVzdG9yZSBkZWZhdWx0JylcclxuICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlQW5pbWF0aW9ucyA9IERFRkFVTFRfU0VUVElOR1MuZW5hYmxlQW5pbWF0aW9uc1xyXG4gICAgICAgICAgICBhbmltYXRpb25Ub2dnbGUuc2V0VmFsdWUoREVGQVVMVF9TRVRUSU5HUy5lbmFibGVBbmltYXRpb25zKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xyXG4gICAgICAgIGFuaW1hdGlvblRvZ2dsZSA9IHRvZ2dsZVxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVBbmltYXRpb25zKS5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVBbmltYXRpb25zID0gdmFsdWVcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBUU87QUFjUCxJQUFNLG1CQUE2QjtBQUFBLEVBQ2pDLE9BQU87QUFBQSxFQUNQLGVBQWU7QUFBQSxFQUNmLGtCQUFrQjtBQUFBO0FBR3BCLGdDQUF5Qyx1QkFBTztBQUFBLEVBQWhELGNBNUJBO0FBNEJBO0FBR0UsK0JBQXNCO0FBQ3RCLHFCQUFZO0FBQ1osb0JBQVc7QUFFWCwwQkFBaUI7QUFZakIsOEJBQXFCLENBQUMsTUFBdUIsWUFBbUI7QUFDOUQsV0FBSyxpQkFBaUIsU0FBUSxTQUFTLEtBQUssZ0JBQWdCLEVBQUMsU0FBUztBQUFBO0FBR3hFLDBCQUFpQixDQUFDLFVBQStCO0FBQy9DLFlBQU07QUFHTixZQUFNLE9BQU8sTUFBTSxRQUFTLE1BQU0sZ0JBQWlCLE1BQU07QUFFekQsaUJBQVcsV0FBVyxNQUFNO0FBQzFC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