ObsidianSimpleTimeTracker/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js
2022-09-27 22:15:16 +02:00

217 lines
24 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: () => SimpleTimeTrackerPlugin
});
var import_obsidian3 = __toModule(require("obsidian"));
// src/settings.ts
var defaultSettings = {};
// src/settings-tab.ts
var import_obsidian = __toModule(require("obsidian"));
var SimpleTimeTrackerSettingsTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
this.containerEl.empty();
this.containerEl.createEl("h2", { text: "Super Simple Time Tracker Settings" });
this.containerEl.createEl("p", { text: "Settings coming soon!" });
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: "simple-time-tracker-support" });
}
};
// src/tracker.ts
var import_obsidian2 = __toModule(require("obsidian"));
function startEntry(tracker, name) {
if (!name)
name = `Segment ${tracker.entries.length + 1}`;
let entry = { name, startTime: (0, import_obsidian2.moment)().unix(), endTime: null };
tracker.entries.push(entry);
}
function endEntry(tracker) {
let last = tracker.entries.last();
last.endTime = (0, import_obsidian2.moment)().unix();
}
function isRunning(tracker) {
let last = tracker.entries.last();
return last != null && !last.endTime;
}
function saveTracker(tracker, app, section) {
return __async(this, null, function* () {
let file = app.workspace.getActiveFile();
let content = yield app.vault.cachedRead(file);
let lines = content.split("\n");
let prev = lines.filter((_, i) => i <= section.lineStart).join("\n");
let next = lines.filter((_, i) => i >= section.lineEnd).join("\n");
content = `${prev}
${JSON.stringify(tracker)}
${next}`;
yield app.vault.modify(file, content);
});
}
function loadTracker(json) {
if (json) {
try {
return JSON.parse(json);
} catch (e) {
console.log(`Failed to parse Tracker from ${json}`);
}
}
return { entries: [] };
}
function displayTracker(tracker, element, getSectionInfo) {
let running = isRunning(tracker);
let btn = new import_obsidian2.ButtonComponent(element).setButtonText(running ? "End" : "Start").onClick(() => __async(this, null, function* () {
if (running) {
endEntry(tracker);
} else {
startEntry(tracker, name.getValue());
}
yield saveTracker(tracker, this.app, getSectionInfo());
}));
btn.buttonEl.addClass("simple-time-tracker-btn");
let name = new import_obsidian2.TextComponent(element).setPlaceholder("Segment name").setDisabled(running);
name.inputEl.addClass("simple-time-tracker-txt");
let timer = element.createDiv({ cls: "simple-time-tracker-timers" });
let currentDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" });
let current = currentDiv.createEl("span", { cls: "simple-time-tracker-timer-time" });
currentDiv.createEl("span", { text: "Current" });
let totalDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" });
let total = totalDiv.createEl("span", { cls: "simple-time-tracker-timer-time", text: "0s" });
totalDiv.createEl("span", { text: "Total" });
if (tracker.entries.length > 0) {
let table = element.createEl("table", { cls: "simple-time-tracker-table" });
table.createEl("tr").append(createEl("th", { text: "Segment" }), createEl("th", { text: "Start time" }), createEl("th", { text: "End time" }), createEl("th", { text: "Total" }));
for (let entry of tracker.entries) {
let row = table.createEl("tr");
row.createEl("td", { text: entry.name });
row.createEl("td", { text: import_obsidian2.moment.unix(entry.startTime).format("YY-MM-DD hh:mm:ss") });
if (entry.endTime) {
row.createEl("td", { text: import_obsidian2.moment.unix(entry.endTime).format("YY-MM-DD hh:mm:ss") });
let duration = import_obsidian2.moment.unix(entry.endTime).diff(import_obsidian2.moment.unix(entry.startTime));
row.createEl("td", { text: getCountdownDisplay(import_obsidian2.moment.duration(duration)) });
}
}
}
setCountdownValues(tracker, current, total, currentDiv);
let intervalId = window.setInterval(() => {
if (!element.isConnected) {
window.clearInterval(intervalId);
return;
}
setCountdownValues(tracker, current, total, currentDiv);
}, 1e3);
}
function getCountdownDisplay(duration) {
let ret = "";
if (duration.hours() > 0)
ret += duration.hours() + "h ";
if (duration.minutes() > 0)
ret += duration.minutes() + "m ";
ret += duration.seconds() + "s";
return ret;
}
function setCountdownValues(tracker, current, total, currentDiv) {
let currEntry = tracker.entries.last();
if (currEntry) {
let currDuration = (0, import_obsidian2.moment)().diff(import_obsidian2.moment.unix(currEntry.startTime));
if (!currEntry.endTime)
current.setText(getCountdownDisplay(import_obsidian2.moment.duration(currDuration)));
let totalDuration = 0;
for (let entry of tracker.entries) {
if (entry == currEntry && !currEntry.endTime) {
totalDuration += currDuration;
} else {
totalDuration += import_obsidian2.moment.unix(entry.endTime).diff(import_obsidian2.moment.unix(entry.startTime));
}
}
total.setText(getCountdownDisplay(import_obsidian2.moment.duration(totalDuration)));
}
currentDiv.hidden = !currEntry || !!currEntry.endTime;
}
// src/main.ts
var SimpleTimeTrackerPlugin = class extends import_obsidian3.Plugin {
onload() {
return __async(this, null, function* () {
yield this.loadSettings();
this.addSettingTab(new SimpleTimeTrackerSettingsTab(this.app, this));
this.registerMarkdownCodeBlockProcessor("simple-time-tracker", (s, e, i) => {
let tracker = loadTracker(s);
e.empty();
displayTracker(tracker, e, () => i.getSectionInfo(e));
});
this.addCommand({
id: `insert-simple-time-tracker`,
name: `Insert Time Tracker`,
editorCallback: (e, _) => {
e.replaceSelection("```simple-time-tracker\n```\n");
}
});
});
}
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);
});
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiLCAic3JjL3RyYWNrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0U2V0dGluZ3MsIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3MtdGFiXCI7XHJcbmltcG9ydCB7IGRpc3BsYXlUcmFja2VyLCBsb2FkVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHJcblx0c2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3M7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFwic2ltcGxlLXRpbWUtdHJhY2tlclwiLCAocywgZSwgaSkgPT4ge1xyXG5cdFx0XHRsZXQgdHJhY2tlciA9IGxvYWRUcmFja2VyKHMpO1xyXG5cdFx0XHRlLmVtcHR5KCk7XHJcblx0XHRcdGRpc3BsYXlUcmFja2VyKHRyYWNrZXIsIGUsICgpID0+IGkuZ2V0U2VjdGlvbkluZm8oZSkpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IGBpbnNlcnQtc2ltcGxlLXRpbWUtdHJhY2tlcmAsXHJcblx0XHRcdG5hbWU6IGBJbnNlcnQgVGltZSBUcmFja2VyYCxcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlLCBfKSA9PiB7XHJcblx0XHRcdFx0ZS5yZXBsYWNlU2VsZWN0aW9uKFwiYGBgc2ltcGxlLXRpbWUtdHJhY2tlclxcbmBgYFxcblwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNldHRpbmdzLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuIiwgImV4cG9ydCBjb25zdCBkZWZhdWx0U2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgPSB7XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzIHtcclxuXHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgU2ltcGxlVGltZVRyYWNrZXJQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHJcbiAgICBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiU3VwZXIgU2ltcGxlIFRpbWUgVHJhY2tlciBTZXR0aW5nc1wiIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiU2V0dGluZ3MgY29taW5nIHNvb24hXCIgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4gYW5kIHdhbnQgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQsIHlvdSBjYW4gZG8gc28gdGhyb3VnaCBteSB3ZWJzaXRlIGJ5IGNsaWNraW5nIHRoaXMgZmFuY3kgaW1hZ2UhXCIgfSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImFcIiwgeyBocmVmOiBcImh0dHBzOi8vZWxscGVjay5kZS9zdXBwb3J0XCIgfSlcclxuICAgICAgICAgICAgLmNyZWF0ZUVsKFwiaW1nXCIsIHsgYXR0cjogeyBzcmM6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3Jlcy9nZW5lcmFsc3VwcG9ydC5wbmdcIiB9LCBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci1zdXBwb3J0XCIgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwgImltcG9ydCB7IG1vbWVudCwgQXBwLCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiwgQnV0dG9uQ29tcG9uZW50LCBUZXh0Q29tcG9uZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVHJhY2tlciB7XHJcbiAgICBlbnRyaWVzOiBFbnRyeVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudHJ5IHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHN0YXJ0VGltZTogbnVtYmVyO1xyXG4gICAgZW5kVGltZTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRFbnRyeSh0cmFja2VyOiBUcmFja2VyLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghbmFtZSlcclxuICAgICAgICBuYW1lID0gYFNlZ21lbnQgJHt0cmFja2VyLmVudHJpZXMubGVuZ3RoICsgMX1gO1xyXG4gICAgbGV0IGVudHJ5OiBFbnRyeSA9IHsgbmFtZTogbmFtZSwgc3RhcnRUaW1lOiBtb21lbnQoKS51bml4KCksIGVuZFRpbWU6IG51bGwgfTtcclxuICAgIHRyYWNrZXIuZW50cmllcy5wdXNoKGVudHJ5KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbmRFbnRyeSh0cmFja2VyOiBUcmFja2VyKTogdm9pZCB7XHJcbiAgICBsZXQgbGFzdCA9IHRyYWNrZXIuZW50cmllcy5sYXN0KCk7XHJcbiAgICBsYXN0LmVuZFRpbWUgPSBtb21lbnQoKS51bml4KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1J1bm5pbmcodHJhY2tlcjogVHJhY2tlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGxhc3QgPSB0cmFja2VyLmVudHJpZXMubGFzdCgpO1xyXG4gICAgcmV0dXJuIGxhc3QgIT0gbnVsbCAmJiAhbGFzdC5lbmRUaW1lO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRyYWNrZXIodHJhY2tlcjogVHJhY2tlciwgYXBwOiBBcHAsIHNlY3Rpb246IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG4gICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKTtcclxuXHJcbiAgICAvLyBmaWd1cmUgb3V0IHdoYXQgcGFydCBvZiB0aGUgY29udGVudCB3ZSBoYXZlIHRvIGVkaXRcclxuICAgIGxldCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcbiAgICBsZXQgcHJldiA9IGxpbmVzLmZpbHRlcigoXywgaSkgPT4gaSA8PSBzZWN0aW9uLmxpbmVTdGFydCkuam9pbihcIlxcblwiKTtcclxuICAgIGxldCBuZXh0ID0gbGluZXMuZmlsdGVyKChfLCBpKSA9PiBpID49IHNlY3Rpb24ubGluZUVuZCkuam9pbihcIlxcblwiKTtcclxuICAgIC8vIGVkaXQgb25seSB0aGUgY29kZSBibG9jayBjb250ZW50LCBsZWF2ZSB0aGUgcmVzdCB1bnRvdWNoZWRcclxuICAgIGNvbnRlbnQgPSBgJHtwcmV2fVxcbiR7SlNPTi5zdHJpbmdpZnkodHJhY2tlcil9XFxuJHtuZXh0fWA7XHJcblxyXG4gICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRUcmFja2VyKGpzb246IHN0cmluZyk6IFRyYWNrZXIge1xyXG4gICAgaWYgKGpzb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gcGFyc2UgVHJhY2tlciBmcm9tICR7anNvbn1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBlbnRyaWVzOiBbXSB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVRyYWNrZXIodHJhY2tlcjogVHJhY2tlciwgZWxlbWVudDogSFRNTEVsZW1lbnQsIGdldFNlY3Rpb25JbmZvOiAoKSA9PiBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbik6IHZvaWQge1xyXG4gICAgLy8gYWRkIHN0YXJ0L3N0b3AgY29udHJvbHNcclxuICAgIGxldCBydW5uaW5nID0gaXNSdW5uaW5nKHRyYWNrZXIpO1xyXG4gICAgbGV0IGJ0biA9IG5ldyBCdXR0b25Db21wb25lbnQoZWxlbWVudClcclxuICAgICAgICAuc2V0QnV0dG9uVGV4dChydW5uaW5nID8gXCJFbmRcIiA6IFwiU3RhcnRcIilcclxuICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRFbnRyeSh0cmFja2VyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RW50cnkodHJhY2tlciwgbmFtZS5nZXRWYWx1ZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBzYXZlVHJhY2tlcih0cmFja2VyLCB0aGlzLmFwcCwgZ2V0U2VjdGlvbkluZm8oKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICBidG4uYnV0dG9uRWwuYWRkQ2xhc3MoXCJzaW1wbGUtdGltZS10cmFja2VyLWJ0blwiKTtcclxuICAgIGxldCBuYW1lID0gbmV3IFRleHRDb21wb25lbnQoZWxlbWVudClcclxuICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJTZWdtZW50IG5hbWVcIilcclxuICAgICAgICAuc2V0RGlzYWJsZWQocnVubmluZyk7XHJcbiAgICBuYW1lLmlucHV0RWwuYWRkQ2xhc3MoXCJzaW1wbGUtdGltZS10cmFja2VyLXR4dFwiKTtcclxuXHJcbiAgICAvLyBhZGQgdGltZXJzXHJcbiAgICBsZXQgdGltZXIgPSBlbGVtZW50LmNyZWF0ZURpdih7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyc1wiIH0pO1xyXG4gICAgbGV0IGN1cnJlbnREaXYgPSB0aW1lci5jcmVhdGVFbChcImRpdlwiLCB7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyXCIgfSk7XHJcbiAgICBsZXQgY3VycmVudCA9IGN1cnJlbnREaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXItdGltZVwiIH0pO1xyXG4gICAgY3VycmVudERpdi5jcmVhdGVFbChcInNwYW5cIiwgeyB0ZXh0OiBcIkN1cnJlbnRcIiB9KTtcclxuICAgIGxldCB0b3RhbERpdiA9IHRpbWVyLmNyZWF0ZUVsKFwiZGl2XCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXJcIiB9KTtcclxuICAgIGxldCB0b3RhbCA9IHRvdGFsRGl2LmNyZWF0ZUVsKFwic3BhblwiLCB7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyLXRpbWVcIiwgdGV4dDogXCIwc1wiIH0pO1xyXG4gICAgdG90YWxEaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgdGV4dDogXCJUb3RhbFwiIH0pO1xyXG5cclxuICAgIC8vIGFkZCB0YWJsZVxyXG4gICAgaWYgKHRyYWNrZXIuZW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHRhYmxlID0gZWxlbWVudC5jcmVhdGVFbChcInRhYmxlXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGFibGVcIiB9KTtcclxuICAgICAgICB0YWJsZS5jcmVhdGVFbChcInRyXCIpLmFwcGVuZChcclxuICAgICAgICAgICAgY3JlYXRlRWwoXCJ0aFwiLCB7IHRleHQ6IFwiU2VnbWVudFwiIH0pLFxyXG4gICAgICAgICAgICBjcmVhdGVFbChcInRoXCIsIHsgdGV4dDogXCJTdGFydCB0aW1lXCIgfSksXHJcbiAgICAgICAgICAgIGNyZWF0ZUVsKFwidGhcIiwgeyB0ZXh0OiBcIkVuZCB0aW1lXCIgfSksXHJcbiAgICAgICAgICAgIGNyZWF0ZUVsKFwidGhcIiwgeyB0ZXh0OiBcIlRvdGFsXCIgfSkpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiB0cmFja2VyLmVudHJpZXMpIHtcclxuICAgICAgICAgICAgbGV0IHJvdyA9IHRhYmxlLmNyZWF0ZUVsKFwidHJcIik7XHJcbiAgICAgICAgICAgIHJvdy5jcmVhdGVFbChcInRkXCIsIHsgdGV4dDogZW50cnkubmFtZSB9KTtcclxuICAgICAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBtb21lbnQudW5peChlbnRyeS5zdGFydFRpbWUpLmZvcm1hdChcIllZLU1NLUREIGhoOm1tOnNzXCIpIH0pO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkuZW5kVGltZSkge1xyXG4gICAgICAgICAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBtb21lbnQudW5peChlbnRyeS5lbmRUaW1lKS5mb3JtYXQoXCJZWS1NTS1ERCBoaDptbTpzc1wiKSB9KTtcclxuICAgICAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IG1vbWVudC51bml4KGVudHJ5LmVuZFRpbWUpLmRpZmYobW9tZW50LnVuaXgoZW50cnkuc3RhcnRUaW1lKSk7XHJcbiAgICAgICAgICAgICAgICByb3cuY3JlYXRlRWwoXCJ0ZFwiLCB7IHRleHQ6IGdldENvdW50ZG93bkRpc3BsYXkobW9tZW50LmR1cmF0aW9uKGR1cmF0aW9uKSkgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q291bnRkb3duVmFsdWVzKHRyYWNrZXIsIGN1cnJlbnQsIHRvdGFsLCBjdXJyZW50RGl2KTtcclxuICAgIGxldCBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvLyB3ZSBkZWxldGUgdGhlIGludGVydmFsIHRpbWVyIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZFxyXG4gICAgICAgIGlmICghZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRDb3VudGRvd25WYWx1ZXModHJhY2tlciwgY3VycmVudCwgdG90YWwsIGN1cnJlbnREaXYpO1xyXG4gICAgfSwgMTAwMCk7XHJcblxyXG59O1xyXG5cclxuZnVuY3Rpb24gZ2V0Q291bnRkb3duRGlzcGxheShkdXJhdGlvbjogbW9tZW50LkR1cmF0aW9uKTogc3RyaW5nIHtcclxuICAgIGxldCByZXQgPSBcIlwiO1xyXG4gICAgaWYgKGR1cmF0aW9uLmhvdXJzKCkgPiAwKVxyXG4gICAgICAgIHJldCArPSBkdXJhdGlvbi5ob3VycygpICsgXCJoIFwiO1xyXG4gICAgaWYgKGR1cmF0aW9uLm1pbnV0ZXMoKSA+IDApXHJcbiAgICAgICAgcmV0ICs9IGR1cmF0aW9uLm1pbnV0ZXMoKSArIFwibSBcIjtcclxuICAgIHJldCArPSBkdXJhdGlvbi5zZWNvbmRzKCkgKyBcInNcIjtcclxuICAgIHJldHVybiByZXQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldENvdW50ZG93blZhbHVlcyh0cmFja2VyOiBUcmFja2VyLCBjdXJyZW50OiBIVE1MRWxlbWVudCwgdG90YWw6IEhUTUxFbGVtZW50LCBjdXJyZW50RGl2OiBIVE1MRGl2RWxlbWVudCkge1xyXG4gICAgbGV0IGN1cnJFbnRyeSA9IHRyYWNrZXIuZW50cmllcy5sYXN0KCk7XHJcbiAgICBpZiAoY3VyckVudHJ5KSB7XHJcbiAgICAgICAgbGV0IGN1cnJEdXJhdGlvbiA9IG1vbWVudCgpLmRpZmYobW9tZW50LnVuaXgoY3VyckVudHJ5LnN0YXJ0VGltZSkpO1xyXG4gICAgICAgIGlmICghY3VyckVudHJ5LmVuZFRpbWUpXHJcbiAgICAgICAgICAgIGN1cnJlbnQuc2V0VGV4dChnZXRDb3VudGRvd25EaXNwbGF5KG1vbWVudC5kdXJhdGlvbihjdXJyRHVyYXRpb24pKSk7XHJcblxyXG4gICAgICAgIGxldCB0b3RhbER1cmF0aW9uID0gMDtcclxuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiB0cmFja2VyLmVudHJpZXMpIHtcclxuICAgICAgICAgICAgaWYgKGVudHJ5ID09IGN1cnJFbnRyeSAmJiAhY3VyckVudHJ5LmVuZFRpbWUpIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gKz0gY3VyckR1cmF0aW9uO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPSBtb21lbnQudW5peChlbnRyeS5lbmRUaW1lKS5kaWZmKG1vbWVudC51bml4KGVudHJ5LnN0YXJ0VGltZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRvdGFsLnNldFRleHQoZ2V0Q291bnRkb3duRGlzcGxheShtb21lbnQuZHVyYXRpb24odG90YWxEdXJhdGlvbikpKTtcclxuICAgIH1cclxuICAgIGN1cnJlbnREaXYuaGlkZGVuID0gIWN1cnJFbnRyeSB8fCAhIWN1cnJFbnRyeS5lbmRUaW1lO1xyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFBdUI7OztBQ0FoQixJQUFNLGtCQUE2Qzs7O0FDQTFELHNCQUFzQztBQUcvQixpREFBMkMsaUNBQWlCO0FBQUEsRUFJL0QsWUFBWSxLQUFVLFFBQWlDO0FBQ25ELFVBQU0sS0FBSztBQUNYLFNBQUssU0FBUztBQUFBO0FBQUEsRUFHbEIsVUFBZ0I7QUFDWixTQUFLLFlBQVk7QUFDakIsU0FBSyxZQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU07QUFFeEMsU0FBSyxZQUFZLFNBQVMsS0FBSyxFQUFFLE1BQU07QUFFdkMsU0FBSyxZQUFZLFNBQVM7QUFDMUIsU0FBSyxZQUFZLFNBQVMsS0FBSyxFQUFFLE1BQU07QUFDdkMsU0FBSyxZQUFZLFNBQVMsS0FBSyxFQUFFLE1BQU0sZ0NBQ2xDLFNBQVMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLCtDQUErQyxLQUFLO0FBQUE7QUFBQTs7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