diff --git a/enter/.github/render_engine/page.html.md b/enter/.github/render_engine/page.html.md new file mode 100644 index 0000000..e69de29 diff --git a/enter/.obsidian/appearance.json b/enter/.obsidian/appearance.json index ce04703..1866240 100644 --- a/enter/.obsidian/appearance.json +++ b/enter/.obsidian/appearance.json @@ -1,6 +1,6 @@ { "accentColor": "#d765ce", - "theme": "moonstone", - "cssTheme": "Encore", - "baseFontSize": 17 + "theme": "obsidian", + "cssTheme": "iB Writer", + "baseFontSize": 30 } \ No newline at end of file diff --git a/enter/.obsidian/community-plugins.json b/enter/.obsidian/community-plugins.json index eca7bd3..9bc0622 100644 --- a/enter/.obsidian/community-plugins.json +++ b/enter/.obsidian/community-plugins.json @@ -13,5 +13,8 @@ "dataview", "buttons", "obsidian-advanced-slides", - "obsidian-excalidraw-plugin" + "obsidian-excalidraw-plugin", + "obsidian-charts", + "heatmap-calendar", + "calendar" ] \ No newline at end of file diff --git a/enter/.obsidian/plugins/calendar/data.json b/enter/.obsidian/plugins/calendar/data.json new file mode 100644 index 0000000..b03e21d --- /dev/null +++ b/enter/.obsidian/plugins/calendar/data.json @@ -0,0 +1,10 @@ +{ + "shouldConfirmBeforeCreate": true, + "weekStart": "locale", + "wordsPerDot": 250, + "showWeeklyNote": false, + "weeklyNoteFormat": "", + "weeklyNoteTemplate": "", + "weeklyNoteFolder": "", + "localeOverride": "system-default" +} \ No newline at end of file diff --git a/enter/.obsidian/plugins/calendar/main.js b/enter/.obsidian/plugins/calendar/main.js new file mode 100644 index 0000000..eb2951b --- /dev/null +++ b/enter/.obsidian/plugins/calendar/main.js @@ -0,0 +1,4457 @@ +'use strict'; + +var obsidian = require('obsidian'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var obsidian__default = /*#__PURE__*/_interopDefaultLegacy(obsidian); + +const DEFAULT_WEEK_FORMAT = "gggg-[W]ww"; +const DEFAULT_WORDS_PER_DOT = 250; +const VIEW_TYPE_CALENDAR = "calendar"; +const TRIGGER_ON_OPEN = "calendar:open"; + +const DEFAULT_DAILY_NOTE_FORMAT = "YYYY-MM-DD"; +const DEFAULT_WEEKLY_NOTE_FORMAT = "gggg-[W]ww"; +const DEFAULT_MONTHLY_NOTE_FORMAT = "YYYY-MM"; + +function shouldUsePeriodicNotesSettings(periodicity) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const periodicNotes = window.app.plugins.getPlugin("periodic-notes"); + return periodicNotes && periodicNotes.settings?.[periodicity]?.enabled; +} +/** + * Read the user settings for the `daily-notes` plugin + * to keep behavior of creating a new note in-sync. + */ +function getDailyNoteSettings() { + try { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { internalPlugins, plugins } = window.app; + if (shouldUsePeriodicNotesSettings("daily")) { + const { format, folder, template } = plugins.getPlugin("periodic-notes")?.settings?.daily || {}; + return { + format: format || DEFAULT_DAILY_NOTE_FORMAT, + folder: folder?.trim() || "", + template: template?.trim() || "", + }; + } + const { folder, format, template } = internalPlugins.getPluginById("daily-notes")?.instance?.options || {}; + return { + format: format || DEFAULT_DAILY_NOTE_FORMAT, + folder: folder?.trim() || "", + template: template?.trim() || "", + }; + } + catch (err) { + console.info("No custom daily note settings found!", err); + } +} +/** + * Read the user settings for the `weekly-notes` plugin + * to keep behavior of creating a new note in-sync. + */ +function getWeeklyNoteSettings() { + try { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginManager = window.app.plugins; + const calendarSettings = pluginManager.getPlugin("calendar")?.options; + const periodicNotesSettings = pluginManager.getPlugin("periodic-notes") + ?.settings?.weekly; + if (shouldUsePeriodicNotesSettings("weekly")) { + return { + format: periodicNotesSettings.format || DEFAULT_WEEKLY_NOTE_FORMAT, + folder: periodicNotesSettings.folder?.trim() || "", + template: periodicNotesSettings.template?.trim() || "", + }; + } + const settings = calendarSettings || {}; + return { + format: settings.weeklyNoteFormat || DEFAULT_WEEKLY_NOTE_FORMAT, + folder: settings.weeklyNoteFolder?.trim() || "", + template: settings.weeklyNoteTemplate?.trim() || "", + }; + } + catch (err) { + console.info("No custom weekly note settings found!", err); + } +} +/** + * Read the user settings for the `periodic-notes` plugin + * to keep behavior of creating a new note in-sync. + */ +function getMonthlyNoteSettings() { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginManager = window.app.plugins; + try { + const settings = (shouldUsePeriodicNotesSettings("monthly") && + pluginManager.getPlugin("periodic-notes")?.settings?.monthly) || + {}; + return { + format: settings.format || DEFAULT_MONTHLY_NOTE_FORMAT, + folder: settings.folder?.trim() || "", + template: settings.template?.trim() || "", + }; + } + catch (err) { + console.info("No custom monthly note settings found!", err); + } +} + +/** + * dateUID is a way of weekly identifying daily/weekly/monthly notes. + * They are prefixed with the granularity to avoid ambiguity. + */ +function getDateUID$1(date, granularity = "day") { + const ts = date.clone().startOf(granularity).format(); + return `${granularity}-${ts}`; +} +function removeEscapedCharacters(format) { + return format.replace(/\[[^\]]*\]/g, ""); // remove everything within brackets +} +/** + * XXX: When parsing dates that contain both week numbers and months, + * Moment choses to ignore the week numbers. For the week dateUID, we + * want the opposite behavior. Strip the MMM from the format to patch. + */ +function isFormatAmbiguous(format, granularity) { + if (granularity === "week") { + const cleanFormat = removeEscapedCharacters(format); + return (/w{1,2}/i.test(cleanFormat) && + (/M{1,4}/.test(cleanFormat) || /D{1,4}/.test(cleanFormat))); + } + return false; +} +function getDateFromFile(file, granularity) { + const getSettings = { + day: getDailyNoteSettings, + week: getWeeklyNoteSettings, + month: getMonthlyNoteSettings, + }; + const format = getSettings[granularity]().format.split("/").pop(); + const noteDate = window.moment(file.basename, format, true); + if (!noteDate.isValid()) { + return null; + } + if (isFormatAmbiguous(format, granularity)) { + if (granularity === "week") { + const cleanFormat = removeEscapedCharacters(format); + if (/w{1,2}/i.test(cleanFormat)) { + return window.moment(file.basename, + // If format contains week, remove day & month formatting + format.replace(/M{1,4}/g, "").replace(/D{1,4}/g, ""), false); + } + } + } + return noteDate; +} + +// Credit: @creationix/path.js +function join(...partSegments) { + // Split the inputs into a list of path commands. + let parts = []; + for (let i = 0, l = partSegments.length; i < l; i++) { + parts = parts.concat(partSegments[i].split("/")); + } + // Interpret the path commands to get the new resolved path. + const newParts = []; + for (let i = 0, l = parts.length; i < l; i++) { + const part = parts[i]; + // Remove leading and trailing slashes + // Also remove "." segments + if (!part || part === ".") + continue; + // Push new path segments. + else + newParts.push(part); + } + // Preserve the initial slash if there was one. + if (parts[0] === "") + newParts.unshift(""); + // Turn back into a single string path. + return newParts.join("/"); +} +async function ensureFolderExists(path) { + const dirs = path.replace(/\\/g, "/").split("/"); + dirs.pop(); // remove basename + if (dirs.length) { + const dir = join(...dirs); + if (!window.app.vault.getAbstractFileByPath(dir)) { + await window.app.vault.createFolder(dir); + } + } +} +async function getNotePath(directory, filename) { + if (!filename.endsWith(".md")) { + filename += ".md"; + } + const path = obsidian__default['default'].normalizePath(join(directory, filename)); + await ensureFolderExists(path); + return path; +} +async function getTemplateInfo(template) { + const { metadataCache, vault } = window.app; + const templatePath = obsidian__default['default'].normalizePath(template); + if (templatePath === "/") { + return Promise.resolve(["", null]); + } + try { + const templateFile = metadataCache.getFirstLinkpathDest(templatePath, ""); + const contents = await vault.cachedRead(templateFile); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const IFoldInfo = window.app.foldManager.load(templateFile); + return [contents, IFoldInfo]; + } + catch (err) { + console.error(`Failed to read the daily note template '${templatePath}'`, err); + new obsidian__default['default'].Notice("Failed to read the daily note template"); + return ["", null]; + } +} + +class DailyNotesFolderMissingError extends Error { +} +/** + * This function mimics the behavior of the daily-notes plugin + * so it will replace {{date}}, {{title}}, and {{time}} with the + * formatted timestamp. + * + * Note: it has an added bonus that it's not 'today' specific. + */ +async function createDailyNote(date) { + const app = window.app; + const { vault } = app; + const moment = window.moment; + const { template, format, folder } = getDailyNoteSettings(); + const [templateContents, IFoldInfo] = await getTemplateInfo(template); + const filename = date.format(format); + const normalizedPath = await getNotePath(folder, filename); + try { + const createdFile = await vault.create(normalizedPath, templateContents + .replace(/{{\s*date\s*}}/gi, filename) + .replace(/{{\s*time\s*}}/gi, moment().format("HH:mm")) + .replace(/{{\s*title\s*}}/gi, filename) + .replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { + const now = moment(); + const currentDate = date.clone().set({ + hour: now.get("hour"), + minute: now.get("minute"), + second: now.get("second"), + }); + if (calc) { + currentDate.add(parseInt(timeDelta, 10), unit); + } + if (momentFormat) { + return currentDate.format(momentFormat.substring(1).trim()); + } + return currentDate.format(format); + }) + .replace(/{{\s*yesterday\s*}}/gi, date.clone().subtract(1, "day").format(format)) + .replace(/{{\s*tomorrow\s*}}/gi, date.clone().add(1, "d").format(format))); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + app.foldManager.save(createdFile, IFoldInfo); + return createdFile; + } + catch (err) { + console.error(`Failed to create file: '${normalizedPath}'`, err); + new obsidian__default['default'].Notice("Unable to create new file."); + } +} +function getDailyNote(date, dailyNotes) { + return dailyNotes[getDateUID$1(date, "day")] ?? null; +} +function getAllDailyNotes() { + /** + * Find all daily notes in the daily note folder + */ + const { vault } = window.app; + const { folder } = getDailyNoteSettings(); + const dailyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder)); + if (!dailyNotesFolder) { + throw new DailyNotesFolderMissingError("Failed to find daily notes folder"); + } + const dailyNotes = {}; + obsidian__default['default'].Vault.recurseChildren(dailyNotesFolder, (note) => { + if (note instanceof obsidian__default['default'].TFile) { + const date = getDateFromFile(note, "day"); + if (date) { + const dateString = getDateUID$1(date, "day"); + dailyNotes[dateString] = note; + } + } + }); + return dailyNotes; +} + +class WeeklyNotesFolderMissingError extends Error { +} +function getDaysOfWeek$1() { + const { moment } = window; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let weekStart = moment.localeData()._week.dow; + const daysOfWeek = [ + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + ]; + while (weekStart) { + daysOfWeek.push(daysOfWeek.shift()); + weekStart--; + } + return daysOfWeek; +} +function getDayOfWeekNumericalValue(dayOfWeekName) { + return getDaysOfWeek$1().indexOf(dayOfWeekName.toLowerCase()); +} +async function createWeeklyNote(date) { + const { vault } = window.app; + const { template, format, folder } = getWeeklyNoteSettings(); + const [templateContents, IFoldInfo] = await getTemplateInfo(template); + const filename = date.format(format); + const normalizedPath = await getNotePath(folder, filename); + try { + const createdFile = await vault.create(normalizedPath, templateContents + .replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { + const now = window.moment(); + const currentDate = date.clone().set({ + hour: now.get("hour"), + minute: now.get("minute"), + second: now.get("second"), + }); + if (calc) { + currentDate.add(parseInt(timeDelta, 10), unit); + } + if (momentFormat) { + return currentDate.format(momentFormat.substring(1).trim()); + } + return currentDate.format(format); + }) + .replace(/{{\s*title\s*}}/gi, filename) + .replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")) + .replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi, (_, dayOfWeek, momentFormat) => { + const day = getDayOfWeekNumericalValue(dayOfWeek); + return date.weekday(day).format(momentFormat.trim()); + })); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + window.app.foldManager.save(createdFile, IFoldInfo); + return createdFile; + } + catch (err) { + console.error(`Failed to create file: '${normalizedPath}'`, err); + new obsidian__default['default'].Notice("Unable to create new file."); + } +} +function getWeeklyNote(date, weeklyNotes) { + return weeklyNotes[getDateUID$1(date, "week")] ?? null; +} +function getAllWeeklyNotes() { + const { vault } = window.app; + const { folder } = getWeeklyNoteSettings(); + const weeklyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder)); + if (!weeklyNotesFolder) { + throw new WeeklyNotesFolderMissingError("Failed to find weekly notes folder"); + } + const weeklyNotes = {}; + obsidian__default['default'].Vault.recurseChildren(weeklyNotesFolder, (note) => { + if (note instanceof obsidian__default['default'].TFile) { + const date = getDateFromFile(note, "week"); + if (date) { + const dateString = getDateUID$1(date, "week"); + weeklyNotes[dateString] = note; + } + } + }); + return weeklyNotes; +} + +function appHasDailyNotesPluginLoaded() { + const { app } = window; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const dailyNotesPlugin = app.internalPlugins.plugins["daily-notes"]; + if (dailyNotesPlugin && dailyNotesPlugin.enabled) { + return true; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const periodicNotes = app.plugins.getPlugin("periodic-notes"); + return periodicNotes && periodicNotes.settings?.daily?.enabled; +} +var appHasDailyNotesPluginLoaded_1 = appHasDailyNotesPluginLoaded; +var createDailyNote_1 = createDailyNote; +var createWeeklyNote_1 = createWeeklyNote; +var getAllDailyNotes_1 = getAllDailyNotes; +var getAllWeeklyNotes_1 = getAllWeeklyNotes; +var getDailyNote_1 = getDailyNote; +var getDailyNoteSettings_1 = getDailyNoteSettings; +var getDateFromFile_1 = getDateFromFile; +var getDateUID_1$1 = getDateUID$1; +var getWeeklyNote_1 = getWeeklyNote; +var getWeeklyNoteSettings_1 = getWeeklyNoteSettings; + +function noop$1() { } +function run$1(fn) { + return fn(); +} +function blank_object$1() { + return Object.create(null); +} +function run_all$1(fns) { + fns.forEach(run$1); +} +function is_function$1(thing) { + return typeof thing === 'function'; +} +function safe_not_equal$1(a, b) { + return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); +} +function not_equal$1(a, b) { + return a != a ? b == b : a !== b; +} +function is_empty$1(obj) { + return Object.keys(obj).length === 0; +} +function subscribe(store, ...callbacks) { + if (store == null) { + return noop$1; + } + const unsub = store.subscribe(...callbacks); + return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; +} +function get_store_value(store) { + let value; + subscribe(store, _ => value = _)(); + return value; +} +function component_subscribe(component, store, callback) { + component.$$.on_destroy.push(subscribe(store, callback)); +} +function detach$1(node) { + node.parentNode.removeChild(node); +} +function children$1(element) { + return Array.from(element.childNodes); +} + +let current_component$1; +function set_current_component$1(component) { + current_component$1 = component; +} +function get_current_component$1() { + if (!current_component$1) + throw new Error('Function called outside component initialization'); + return current_component$1; +} +function onDestroy(fn) { + get_current_component$1().$$.on_destroy.push(fn); +} + +const dirty_components$1 = []; +const binding_callbacks$1 = []; +const render_callbacks$1 = []; +const flush_callbacks$1 = []; +const resolved_promise$1 = Promise.resolve(); +let update_scheduled$1 = false; +function schedule_update$1() { + if (!update_scheduled$1) { + update_scheduled$1 = true; + resolved_promise$1.then(flush$1); + } +} +function add_render_callback$1(fn) { + render_callbacks$1.push(fn); +} +function add_flush_callback(fn) { + flush_callbacks$1.push(fn); +} +let flushing$1 = false; +const seen_callbacks$1 = new Set(); +function flush$1() { + if (flushing$1) + return; + flushing$1 = true; + do { + // first, call beforeUpdate functions + // and update components + for (let i = 0; i < dirty_components$1.length; i += 1) { + const component = dirty_components$1[i]; + set_current_component$1(component); + update$1(component.$$); + } + set_current_component$1(null); + dirty_components$1.length = 0; + while (binding_callbacks$1.length) + binding_callbacks$1.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks$1.length; i += 1) { + const callback = render_callbacks$1[i]; + if (!seen_callbacks$1.has(callback)) { + // ...so guard against infinite loops + seen_callbacks$1.add(callback); + callback(); + } + } + render_callbacks$1.length = 0; + } while (dirty_components$1.length); + while (flush_callbacks$1.length) { + flush_callbacks$1.pop()(); + } + update_scheduled$1 = false; + flushing$1 = false; + seen_callbacks$1.clear(); +} +function update$1($$) { + if ($$.fragment !== null) { + $$.update(); + run_all$1($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback$1); + } +} +const outroing$1 = new Set(); +let outros$1; +function transition_in$1(block, local) { + if (block && block.i) { + outroing$1.delete(block); + block.i(local); + } +} +function transition_out$1(block, local, detach, callback) { + if (block && block.o) { + if (outroing$1.has(block)) + return; + outroing$1.add(block); + outros$1.c.push(() => { + outroing$1.delete(block); + if (callback) { + if (detach) + block.d(1); + callback(); + } + }); + block.o(local); + } +} + +function bind(component, name, callback) { + const index = component.$$.props[name]; + if (index !== undefined) { + component.$$.bound[index] = callback; + callback(component.$$.ctx[index]); + } +} +function create_component$1(block) { + block && block.c(); +} +function mount_component$1(component, target, anchor, customElement) { + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + // onMount happens before the initial afterUpdate + add_render_callback$1(() => { + const new_on_destroy = on_mount.map(run$1).filter(is_function$1); + if (on_destroy) { + on_destroy.push(...new_on_destroy); + } + else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all$1(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback$1); +} +function destroy_component$1(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all$1($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty$1(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components$1.push(component); + schedule_update$1(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); +} +function init$1(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) { + const parent_component = current_component$1; + set_current_component$1(component); + const $$ = component.$$ = { + fragment: null, + ctx: null, + // state + props, + update: noop$1, + not_equal, + bound: blank_object$1(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map(parent_component ? parent_component.$$.context : []), + // everything else + callbacks: blank_object$1(), + dirty, + skip_bound: false + }; + let ready = false; + $$.ctx = instance + ? instance(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty$1(component, i); + } + return ret; + }) + : []; + $$.update(); + ready = true; + run_all$1($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + const nodes = children$1(options.target); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach$1); + } + else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in$1(component.$$.fragment); + mount_component$1(component, options.target, options.anchor, options.customElement); + flush$1(); + } + set_current_component$1(parent_component); +} +/** + * Base class for Svelte components. Used when dev=false. + */ +class SvelteComponent$1 { + $destroy() { + destroy_component$1(this, 1); + this.$destroy = noop$1; + } + $on(type, callback) { + const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty$1($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +} + +const subscriber_queue = []; +/** + * Create a `Writable` store that allows both updating and reading by subscription. + * @param {*=}value initial value + * @param {StartStopNotifier=}start start and stop notifications for subscriptions + */ +function writable(value, start = noop$1) { + let stop; + const subscribers = []; + function set(new_value) { + if (safe_not_equal$1(value, new_value)) { + value = new_value; + if (stop) { // store is ready + const run_queue = !subscriber_queue.length; + for (let i = 0; i < subscribers.length; i += 1) { + const s = subscribers[i]; + s[1](); + subscriber_queue.push(s, value); + } + if (run_queue) { + for (let i = 0; i < subscriber_queue.length; i += 2) { + subscriber_queue[i][0](subscriber_queue[i + 1]); + } + subscriber_queue.length = 0; + } + } + } + } + function update(fn) { + set(fn(value)); + } + function subscribe(run, invalidate = noop$1) { + const subscriber = [run, invalidate]; + subscribers.push(subscriber); + if (subscribers.length === 1) { + stop = start(set) || noop$1; + } + run(value); + return () => { + const index = subscribers.indexOf(subscriber); + if (index !== -1) { + subscribers.splice(index, 1); + } + if (subscribers.length === 0) { + stop(); + stop = null; + } + }; + } + return { set, update, subscribe }; +} + +const weekdays$1 = [ + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", +]; +const defaultSettings = Object.freeze({ + shouldConfirmBeforeCreate: true, + weekStart: "locale", + wordsPerDot: DEFAULT_WORDS_PER_DOT, + showWeeklyNote: false, + weeklyNoteFormat: "", + weeklyNoteTemplate: "", + weeklyNoteFolder: "", + localeOverride: "system-default", +}); +function appHasPeriodicNotesPluginLoaded() { + var _a, _b; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const periodicNotes = window.app.plugins.getPlugin("periodic-notes"); + return periodicNotes && ((_b = (_a = periodicNotes.settings) === null || _a === void 0 ? void 0 : _a.weekly) === null || _b === void 0 ? void 0 : _b.enabled); +} +class CalendarSettingsTab extends obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + this.containerEl.empty(); + if (!appHasDailyNotesPluginLoaded_1()) { + this.containerEl.createDiv("settings-banner", (banner) => { + banner.createEl("h3", { + text: "⚠️ Daily Notes plugin not enabled", + }); + banner.createEl("p", { + cls: "setting-item-description", + text: "The calendar is best used in conjunction with either the Daily Notes plugin or the Periodic Notes plugin (available in the Community Plugins catalog).", + }); + }); + } + this.containerEl.createEl("h3", { + text: "General Settings", + }); + this.addDotThresholdSetting(); + this.addWeekStartSetting(); + this.addConfirmCreateSetting(); + this.addShowWeeklyNoteSetting(); + if (this.plugin.options.showWeeklyNote && + !appHasPeriodicNotesPluginLoaded()) { + this.containerEl.createEl("h3", { + text: "Weekly Note Settings", + }); + this.containerEl.createEl("p", { + cls: "setting-item-description", + text: "Note: Weekly Note settings are moving. You are encouraged to install the 'Periodic Notes' plugin to keep the functionality in the future.", + }); + this.addWeeklyNoteFormatSetting(); + this.addWeeklyNoteTemplateSetting(); + this.addWeeklyNoteFolderSetting(); + } + this.containerEl.createEl("h3", { + text: "Advanced Settings", + }); + this.addLocaleOverrideSetting(); + } + addDotThresholdSetting() { + new obsidian.Setting(this.containerEl) + .setName("Words per dot") + .setDesc("How many words should be represented by a single dot?") + .addText((textfield) => { + textfield.setPlaceholder(String(DEFAULT_WORDS_PER_DOT)); + textfield.inputEl.type = "number"; + textfield.setValue(String(this.plugin.options.wordsPerDot)); + textfield.onChange(async (value) => { + this.plugin.writeOptions(() => ({ + wordsPerDot: value !== "" ? Number(value) : undefined, + })); + }); + }); + } + addWeekStartSetting() { + const { moment } = window; + const localizedWeekdays = moment.weekdays(); + const localeWeekStartNum = window._bundledLocaleWeekSpec.dow; + const localeWeekStart = moment.weekdays()[localeWeekStartNum]; + new obsidian.Setting(this.containerEl) + .setName("Start week on:") + .setDesc("Choose what day of the week to start. Select 'Locale default' to use the default specified by moment.js") + .addDropdown((dropdown) => { + dropdown.addOption("locale", `Locale default (${localeWeekStart})`); + localizedWeekdays.forEach((day, i) => { + dropdown.addOption(weekdays$1[i], day); + }); + dropdown.setValue(this.plugin.options.weekStart); + dropdown.onChange(async (value) => { + this.plugin.writeOptions(() => ({ + weekStart: value, + })); + }); + }); + } + addConfirmCreateSetting() { + new obsidian.Setting(this.containerEl) + .setName("Confirm before creating new note") + .setDesc("Show a confirmation modal before creating a new note") + .addToggle((toggle) => { + toggle.setValue(this.plugin.options.shouldConfirmBeforeCreate); + toggle.onChange(async (value) => { + this.plugin.writeOptions(() => ({ + shouldConfirmBeforeCreate: value, + })); + }); + }); + } + addShowWeeklyNoteSetting() { + new obsidian.Setting(this.containerEl) + .setName("Show week number") + .setDesc("Enable this to add a column with the week number") + .addToggle((toggle) => { + toggle.setValue(this.plugin.options.showWeeklyNote); + toggle.onChange(async (value) => { + this.plugin.writeOptions(() => ({ showWeeklyNote: value })); + this.display(); // show/hide weekly settings + }); + }); + } + addWeeklyNoteFormatSetting() { + new obsidian.Setting(this.containerEl) + .setName("Weekly note format") + .setDesc("For more syntax help, refer to format reference") + .addText((textfield) => { + textfield.setValue(this.plugin.options.weeklyNoteFormat); + textfield.setPlaceholder(DEFAULT_WEEK_FORMAT); + textfield.onChange(async (value) => { + this.plugin.writeOptions(() => ({ weeklyNoteFormat: value })); + }); + }); + } + addWeeklyNoteTemplateSetting() { + new obsidian.Setting(this.containerEl) + .setName("Weekly note template") + .setDesc("Choose the file you want to use as the template for your weekly notes") + .addText((textfield) => { + textfield.setValue(this.plugin.options.weeklyNoteTemplate); + textfield.onChange(async (value) => { + this.plugin.writeOptions(() => ({ weeklyNoteTemplate: value })); + }); + }); + } + addWeeklyNoteFolderSetting() { + new obsidian.Setting(this.containerEl) + .setName("Weekly note folder") + .setDesc("New weekly notes will be placed here") + .addText((textfield) => { + textfield.setValue(this.plugin.options.weeklyNoteFolder); + textfield.onChange(async (value) => { + this.plugin.writeOptions(() => ({ weeklyNoteFolder: value })); + }); + }); + } + addLocaleOverrideSetting() { + var _a; + const { moment } = window; + const sysLocale = (_a = navigator.language) === null || _a === void 0 ? void 0 : _a.toLowerCase(); + new obsidian.Setting(this.containerEl) + .setName("Override locale:") + .setDesc("Set this if you want to use a locale different from the default") + .addDropdown((dropdown) => { + dropdown.addOption("system-default", `Same as system (${sysLocale})`); + moment.locales().forEach((locale) => { + dropdown.addOption(locale, locale); + }); + dropdown.setValue(this.plugin.options.localeOverride); + dropdown.onChange(async (value) => { + this.plugin.writeOptions(() => ({ + localeOverride: value, + })); + }); + }); + } +} + +const classList = (obj) => { + return Object.entries(obj) + .filter(([_k, v]) => !!v) + .map(([k, _k]) => k); +}; +function clamp(num, lowerBound, upperBound) { + return Math.min(Math.max(lowerBound, num), upperBound); +} +function partition(arr, predicate) { + const pass = []; + const fail = []; + arr.forEach((elem) => { + if (predicate(elem)) { + pass.push(elem); + } + else { + fail.push(elem); + } + }); + return [pass, fail]; +} +/** + * Lookup the dateUID for a given file. It compares the filename + * to the daily and weekly note formats to find a match. + * + * @param file + */ +function getDateUIDFromFile(file) { + if (!file) { + return null; + } + // TODO: I'm not checking the path! + let date = getDateFromFile_1(file, "day"); + if (date) { + return getDateUID_1$1(date, "day"); + } + date = getDateFromFile_1(file, "week"); + if (date) { + return getDateUID_1$1(date, "week"); + } + return null; +} +function getWordCount(text) { + const spaceDelimitedChars = /A-Za-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/ + .source; + const nonSpaceDelimitedWords = /\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u4E00-\u9FD5/ + .source; + const pattern = new RegExp([ + `(?:[0-9]+(?:(?:,|\\.)[0-9]+)*|[\\-${spaceDelimitedChars}])+`, + nonSpaceDelimitedWords, + ].join("|"), "g"); + return (text.match(pattern) || []).length; +} + +function createDailyNotesStore() { + let hasError = false; + const store = writable(null); + return Object.assign({ reindex: () => { + try { + const dailyNotes = getAllDailyNotes_1(); + store.set(dailyNotes); + hasError = false; + } + catch (err) { + if (!hasError) { + // Avoid error being shown multiple times + console.log("[Calendar] Failed to find daily notes folder", err); + } + store.set({}); + hasError = true; + } + } }, store); +} +function createWeeklyNotesStore() { + let hasError = false; + const store = writable(null); + return Object.assign({ reindex: () => { + try { + const weeklyNotes = getAllWeeklyNotes_1(); + store.set(weeklyNotes); + hasError = false; + } + catch (err) { + if (!hasError) { + // Avoid error being shown multiple times + console.log("[Calendar] Failed to find weekly notes folder", err); + } + store.set({}); + hasError = true; + } + } }, store); +} +const settings = writable(defaultSettings); +const dailyNotes = createDailyNotesStore(); +const weeklyNotes = createWeeklyNotesStore(); +function createSelectedFileStore() { + const store = writable(null); + return Object.assign({ setFile: (file) => { + const id = getDateUIDFromFile(file); + store.set(id); + } }, store); +} +const activeFile = createSelectedFileStore(); + +class ConfirmationModal extends obsidian.Modal { + constructor(app, config) { + super(app); + const { cta, onAccept, text, title } = config; + this.contentEl.createEl("h2", { text: title }); + this.contentEl.createEl("p", { text }); + this.contentEl.createDiv("modal-button-container", (buttonsEl) => { + buttonsEl + .createEl("button", { text: "Never mind" }) + .addEventListener("click", () => this.close()); + buttonsEl + .createEl("button", { + cls: "mod-cta", + text: cta, + }) + .addEventListener("click", async (e) => { + await onAccept(e); + this.close(); + }); + }); + } +} +function createConfirmationDialog({ cta, onAccept, text, title, }) { + new ConfirmationModal(window.app, { cta, onAccept, text, title }).open(); +} + +/** + * Create a Daily Note for a given date. + */ +async function tryToCreateDailyNote(date, inNewSplit, settings, cb) { + const { workspace } = window.app; + const { format } = getDailyNoteSettings_1(); + const filename = date.format(format); + const createFile = async () => { + const dailyNote = await createDailyNote_1(date); + const leaf = inNewSplit + ? workspace.splitActiveLeaf() + : workspace.getUnpinnedLeaf(); + await leaf.openFile(dailyNote); + cb === null || cb === void 0 ? void 0 : cb(dailyNote); + }; + if (settings.shouldConfirmBeforeCreate) { + createConfirmationDialog({ + cta: "Create", + onAccept: createFile, + text: `File ${filename} does not exist. Would you like to create it?`, + title: "New Daily Note", + }); + } + else { + await createFile(); + } +} + +/** + * Create a Weekly Note for a given date. + */ +async function tryToCreateWeeklyNote(date, inNewSplit, settings, cb) { + const { workspace } = window.app; + const { format } = getWeeklyNoteSettings_1(); + const filename = date.format(format); + const createFile = async () => { + const dailyNote = await createWeeklyNote_1(date); + const leaf = inNewSplit + ? workspace.splitActiveLeaf() + : workspace.getUnpinnedLeaf(); + await leaf.openFile(dailyNote); + cb === null || cb === void 0 ? void 0 : cb(dailyNote); + }; + if (settings.shouldConfirmBeforeCreate) { + createConfirmationDialog({ + cta: "Create", + onAccept: createFile, + text: `File ${filename} does not exist. Would you like to create it?`, + title: "New Weekly Note", + }); + } + else { + await createFile(); + } +} + +function noop() { } +function assign(tar, src) { + // @ts-ignore + for (const k in src) + tar[k] = src[k]; + return tar; +} +function is_promise(value) { + return value && typeof value === 'object' && typeof value.then === 'function'; +} +function run(fn) { + return fn(); +} +function blank_object() { + return Object.create(null); +} +function run_all(fns) { + fns.forEach(run); +} +function is_function(thing) { + return typeof thing === 'function'; +} +function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); +} +function not_equal(a, b) { + return a != a ? b == b : a !== b; +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} +function create_slot(definition, ctx, $$scope, fn) { + if (definition) { + const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); + return definition[0](slot_ctx); + } +} +function get_slot_context(definition, ctx, $$scope, fn) { + return definition[1] && fn + ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) + : $$scope.ctx; +} +function get_slot_changes(definition, $$scope, dirty, fn) { + if (definition[2] && fn) { + const lets = definition[2](fn(dirty)); + if ($$scope.dirty === undefined) { + return lets; + } + if (typeof lets === 'object') { + const merged = []; + const len = Math.max($$scope.dirty.length, lets.length); + for (let i = 0; i < len; i += 1) { + merged[i] = $$scope.dirty[i] | lets[i]; + } + return merged; + } + return $$scope.dirty | lets; + } + return $$scope.dirty; +} +function update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) { + const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn); + if (slot_changes) { + const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn); + slot.p(slot_context, slot_changes); + } +} +function null_to_empty(value) { + return value == null ? '' : value; +} + +function append(target, node) { + target.appendChild(node); +} +function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); +} +function detach(node) { + node.parentNode.removeChild(node); +} +function destroy_each(iterations, detaching) { + for (let i = 0; i < iterations.length; i += 1) { + if (iterations[i]) + iterations[i].d(detaching); + } +} +function element(name) { + return document.createElement(name); +} +function svg_element(name) { + return document.createElementNS('http://www.w3.org/2000/svg', name); +} +function text(data) { + return document.createTextNode(data); +} +function space() { + return text(' '); +} +function empty() { + return text(''); +} +function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); +} +function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); +} +function set_attributes(node, attributes) { + // @ts-ignore + const descriptors = Object.getOwnPropertyDescriptors(node.__proto__); + for (const key in attributes) { + if (attributes[key] == null) { + node.removeAttribute(key); + } + else if (key === 'style') { + node.style.cssText = attributes[key]; + } + else if (key === '__value') { + node.value = node[key] = attributes[key]; + } + else if (descriptors[key] && descriptors[key].set) { + node[key] = attributes[key]; + } + else { + attr(node, key, attributes[key]); + } + } +} +function children(element) { + return Array.from(element.childNodes); +} +function set_data(text, data) { + data = '' + data; + if (text.wholeText !== data) + text.data = data; +} +function toggle_class(element, name, toggle) { + element.classList[toggle ? 'add' : 'remove'](name); +} + +let current_component; +function set_current_component(component) { + current_component = component; +} +function get_current_component() { + if (!current_component) + throw new Error('Function called outside component initialization'); + return current_component; +} + +const dirty_components = []; +const binding_callbacks = []; +const render_callbacks = []; +const flush_callbacks = []; +const resolved_promise = Promise.resolve(); +let update_scheduled = false; +function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } +} +function add_render_callback(fn) { + render_callbacks.push(fn); +} +let flushing = false; +const seen_callbacks = new Set(); +function flush() { + if (flushing) + return; + flushing = true; + do { + // first, call beforeUpdate functions + // and update components + for (let i = 0; i < dirty_components.length; i += 1) { + const component = dirty_components[i]; + set_current_component(component); + update(component.$$); + } + set_current_component(null); + dirty_components.length = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + flushing = false; + seen_callbacks.clear(); +} +function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } +} +const outroing = new Set(); +let outros; +function group_outros() { + outros = { + r: 0, + c: [], + p: outros // parent group + }; +} +function check_outros() { + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; +} +function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } +} +function transition_out(block, local, detach, callback) { + if (block && block.o) { + if (outroing.has(block)) + return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach) + block.d(1); + callback(); + } + }); + block.o(local); + } +} + +function handle_promise(promise, info) { + const token = info.token = {}; + function update(type, index, key, value) { + if (info.token !== token) + return; + info.resolved = value; + let child_ctx = info.ctx; + if (key !== undefined) { + child_ctx = child_ctx.slice(); + child_ctx[key] = value; + } + const block = type && (info.current = type)(child_ctx); + let needs_flush = false; + if (info.block) { + if (info.blocks) { + info.blocks.forEach((block, i) => { + if (i !== index && block) { + group_outros(); + transition_out(block, 1, 1, () => { + if (info.blocks[i] === block) { + info.blocks[i] = null; + } + }); + check_outros(); + } + }); + } + else { + info.block.d(1); + } + block.c(); + transition_in(block, 1); + block.m(info.mount(), info.anchor); + needs_flush = true; + } + info.block = block; + if (info.blocks) + info.blocks[index] = block; + if (needs_flush) { + flush(); + } + } + if (is_promise(promise)) { + const current_component = get_current_component(); + promise.then(value => { + set_current_component(current_component); + update(info.then, 1, info.value, value); + set_current_component(null); + }, error => { + set_current_component(current_component); + update(info.catch, 2, info.error, error); + set_current_component(null); + if (!info.hasCatch) { + throw error; + } + }); + // if we previously had a then/catch block, destroy it + if (info.current !== info.pending) { + update(info.pending, 0); + return true; + } + } + else { + if (info.current !== info.then) { + update(info.then, 1, info.value, promise); + return true; + } + info.resolved = promise; + } +} +function outro_and_destroy_block(block, lookup) { + transition_out(block, 1, 1, () => { + lookup.delete(block.key); + }); +} +function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) { + let o = old_blocks.length; + let n = list.length; + let i = o; + const old_indexes = {}; + while (i--) + old_indexes[old_blocks[i].key] = i; + const new_blocks = []; + const new_lookup = new Map(); + const deltas = new Map(); + i = n; + while (i--) { + const child_ctx = get_context(ctx, list, i); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block(key, child_ctx); + block.c(); + } + else if (dynamic) { + block.p(child_ctx, dirty); + } + new_lookup.set(key, new_blocks[i] = block); + if (key in old_indexes) + deltas.set(key, Math.abs(i - old_indexes[key])); + } + const will_move = new Set(); + const did_move = new Set(); + function insert(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n--; + } + while (o && n) { + const new_block = new_blocks[n - 1]; + const old_block = old_blocks[o - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + // do nothing + next = new_block.first; + o--; + n--; + } + else if (!new_lookup.has(old_key)) { + // remove old block + destroy(old_block, lookup); + o--; + } + else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert(new_block); + } + else if (did_move.has(old_key)) { + o--; + } + else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert(new_block); + } + else { + will_move.add(old_key); + o--; + } + } + while (o--) { + const old_block = old_blocks[o]; + if (!new_lookup.has(old_block.key)) + destroy(old_block, lookup); + } + while (n) + insert(new_blocks[n - 1]); + return new_blocks; +} + +function get_spread_update(levels, updates) { + const update = {}; + const to_null_out = {}; + const accounted_for = { $$scope: 1 }; + let i = levels.length; + while (i--) { + const o = levels[i]; + const n = updates[i]; + if (n) { + for (const key in o) { + if (!(key in n)) + to_null_out[key] = 1; + } + for (const key in n) { + if (!accounted_for[key]) { + update[key] = n[key]; + accounted_for[key] = 1; + } + } + levels[i] = n; + } + else { + for (const key in o) { + accounted_for[key] = 1; + } + } + } + for (const key in to_null_out) { + if (!(key in update)) + update[key] = undefined; + } + return update; +} +function get_spread_object(spread_props) { + return typeof spread_props === 'object' && spread_props !== null ? spread_props : {}; +} +function create_component(block) { + block && block.c(); +} +function mount_component(component, target, anchor, customElement) { + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = on_mount.map(run).filter(is_function); + if (on_destroy) { + on_destroy.push(...new_on_destroy); + } + else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); +} +function init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: null, + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map(parent_component ? parent_component.$$.context : []), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false + }; + let ready = false; + $$.ctx = instance + ? instance(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) + : []; + $$.update(); + ready = true; + run_all($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + const nodes = children(options.target); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } + else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor, options.customElement); + flush(); + } + set_current_component(parent_component); +} +/** + * Base class for Svelte components. Used when dev=false. + */ +class SvelteComponent { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +} + +/** + * dateUID is a way of weekly identifying daily/weekly/monthly notes. + * They are prefixed with the granularity to avoid ambiguity. + */ +function getDateUID(date, granularity = "day") { + const ts = date.clone().startOf(granularity).format(); + return `${granularity}-${ts}`; +} +var getDateUID_1 = getDateUID; + +/* src/components/Dot.svelte generated by Svelte v3.35.0 */ + +function add_css$5() { + var style = element("style"); + style.id = "svelte-1widvzq-style"; + style.textContent = ".dot.svelte-1widvzq,.hollow.svelte-1widvzq{display:inline-block;height:6px;width:6px;margin:0 1px}.filled.svelte-1widvzq{fill:var(--color-dot)}.active.filled.svelte-1widvzq{fill:var(--text-on-accent)}.hollow.svelte-1widvzq{fill:none;stroke:var(--color-dot)}.active.hollow.svelte-1widvzq{fill:none;stroke:var(--text-on-accent)}"; + append(document.head, style); +} + +// (14:0) {:else} +function create_else_block$1(ctx) { + let svg; + let circle; + let svg_class_value; + + return { + c() { + svg = svg_element("svg"); + circle = svg_element("circle"); + attr(circle, "cx", "3"); + attr(circle, "cy", "3"); + attr(circle, "r", "2"); + attr(svg, "class", svg_class_value = "" + (null_to_empty(`hollow ${/*className*/ ctx[0]}`) + " svelte-1widvzq")); + attr(svg, "viewBox", "0 0 6 6"); + attr(svg, "xmlns", "http://www.w3.org/2000/svg"); + toggle_class(svg, "active", /*isActive*/ ctx[2]); + }, + m(target, anchor) { + insert(target, svg, anchor); + append(svg, circle); + }, + p(ctx, dirty) { + if (dirty & /*className*/ 1 && svg_class_value !== (svg_class_value = "" + (null_to_empty(`hollow ${/*className*/ ctx[0]}`) + " svelte-1widvzq"))) { + attr(svg, "class", svg_class_value); + } + + if (dirty & /*className, isActive*/ 5) { + toggle_class(svg, "active", /*isActive*/ ctx[2]); + } + }, + d(detaching) { + if (detaching) detach(svg); + } + }; +} + +// (6:0) {#if isFilled} +function create_if_block$2(ctx) { + let svg; + let circle; + let svg_class_value; + + return { + c() { + svg = svg_element("svg"); + circle = svg_element("circle"); + attr(circle, "cx", "3"); + attr(circle, "cy", "3"); + attr(circle, "r", "2"); + attr(svg, "class", svg_class_value = "" + (null_to_empty(`dot filled ${/*className*/ ctx[0]}`) + " svelte-1widvzq")); + attr(svg, "viewBox", "0 0 6 6"); + attr(svg, "xmlns", "http://www.w3.org/2000/svg"); + toggle_class(svg, "active", /*isActive*/ ctx[2]); + }, + m(target, anchor) { + insert(target, svg, anchor); + append(svg, circle); + }, + p(ctx, dirty) { + if (dirty & /*className*/ 1 && svg_class_value !== (svg_class_value = "" + (null_to_empty(`dot filled ${/*className*/ ctx[0]}`) + " svelte-1widvzq"))) { + attr(svg, "class", svg_class_value); + } + + if (dirty & /*className, isActive*/ 5) { + toggle_class(svg, "active", /*isActive*/ ctx[2]); + } + }, + d(detaching) { + if (detaching) detach(svg); + } + }; +} + +function create_fragment$6(ctx) { + let if_block_anchor; + + function select_block_type(ctx, dirty) { + if (/*isFilled*/ ctx[1]) return create_if_block$2; + return create_else_block$1; + } + + let current_block_type = select_block_type(ctx); + let if_block = current_block_type(ctx); + + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx, [dirty]) { + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } + }, + i: noop, + o: noop, + d(detaching) { + if_block.d(detaching); + if (detaching) detach(if_block_anchor); + } + }; +} + +function instance$6($$self, $$props, $$invalidate) { + let { className = "" } = $$props; + let { isFilled } = $$props; + let { isActive } = $$props; + + $$self.$$set = $$props => { + if ("className" in $$props) $$invalidate(0, className = $$props.className); + if ("isFilled" in $$props) $$invalidate(1, isFilled = $$props.isFilled); + if ("isActive" in $$props) $$invalidate(2, isActive = $$props.isActive); + }; + + return [className, isFilled, isActive]; +} + +class Dot extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-1widvzq-style")) add_css$5(); + init(this, options, instance$6, create_fragment$6, safe_not_equal, { className: 0, isFilled: 1, isActive: 2 }); + } +} + +/* src/components/MetadataResolver.svelte generated by Svelte v3.35.0 */ + +const get_default_slot_changes_1 = dirty => ({}); +const get_default_slot_context_1 = ctx => ({ metadata: null }); +const get_default_slot_changes = dirty => ({ metadata: dirty & /*metadata*/ 1 }); +const get_default_slot_context = ctx => ({ metadata: /*resolvedMeta*/ ctx[3] }); + +// (11:0) {:else} +function create_else_block(ctx) { + let current; + const default_slot_template = /*#slots*/ ctx[2].default; + const default_slot = create_slot(default_slot_template, ctx, /*$$scope*/ ctx[1], get_default_slot_context_1); + + return { + c() { + if (default_slot) default_slot.c(); + }, + m(target, anchor) { + if (default_slot) { + default_slot.m(target, anchor); + } + + current = true; + }, + p(ctx, dirty) { + if (default_slot) { + if (default_slot.p && dirty & /*$$scope*/ 2) { + update_slot(default_slot, default_slot_template, ctx, /*$$scope*/ ctx[1], dirty, get_default_slot_changes_1, get_default_slot_context_1); + } + } + }, + i(local) { + if (current) return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (default_slot) default_slot.d(detaching); + } + }; +} + +// (7:0) {#if metadata} +function create_if_block$1(ctx) { + let await_block_anchor; + let promise; + let current; + + let info = { + ctx, + current: null, + token: null, + hasCatch: false, + pending: create_pending_block, + then: create_then_block, + catch: create_catch_block, + value: 3, + blocks: [,,,] + }; + + handle_promise(promise = /*metadata*/ ctx[0], info); + + return { + c() { + await_block_anchor = empty(); + info.block.c(); + }, + m(target, anchor) { + insert(target, await_block_anchor, anchor); + info.block.m(target, info.anchor = anchor); + info.mount = () => await_block_anchor.parentNode; + info.anchor = await_block_anchor; + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + info.ctx = ctx; + + if (dirty & /*metadata*/ 1 && promise !== (promise = /*metadata*/ ctx[0]) && handle_promise(promise, info)) ; else { + const child_ctx = ctx.slice(); + child_ctx[3] = info.resolved; + info.block.p(child_ctx, dirty); + } + }, + i(local) { + if (current) return; + transition_in(info.block); + current = true; + }, + o(local) { + for (let i = 0; i < 3; i += 1) { + const block = info.blocks[i]; + transition_out(block); + } + + current = false; + }, + d(detaching) { + if (detaching) detach(await_block_anchor); + info.block.d(detaching); + info.token = null; + info = null; + } + }; +} + +// (1:0) {#if metadata} +function create_catch_block(ctx) { + return { + c: noop, + m: noop, + p: noop, + i: noop, + o: noop, + d: noop + }; +} + +// (8:37) ; export let metadata; {#if metadata} +function create_pending_block(ctx) { + return { + c: noop, + m: noop, + p: noop, + i: noop, + o: noop, + d: noop + }; +} + +function create_fragment$5(ctx) { + let current_block_type_index; + let if_block; + let if_block_anchor; + let current; + const if_block_creators = [create_if_block$1, create_else_block]; + const if_blocks = []; + + function select_block_type(ctx, dirty) { + if (/*metadata*/ ctx[0]) return 0; + return 1; + } + + current_block_type_index = select_block_type(ctx); + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_blocks[current_block_type_index].m(target, anchor); + insert(target, if_block_anchor, anchor); + current = true; + }, + p(ctx, [dirty]) { + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type(ctx); + + if (current_block_type_index === previous_block_index) { + if_blocks[current_block_type_index].p(ctx, dirty); + } else { + group_outros(); + + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); + + check_outros(); + if_block = if_blocks[current_block_type_index]; + + if (!if_block) { + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + if_block.c(); + } else { + if_block.p(ctx, dirty); + } + + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + }, + i(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if_blocks[current_block_type_index].d(detaching); + if (detaching) detach(if_block_anchor); + } + }; +} + +function instance$5($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + + let { metadata } = $$props; + + $$self.$$set = $$props => { + if ("metadata" in $$props) $$invalidate(0, metadata = $$props.metadata); + if ("$$scope" in $$props) $$invalidate(1, $$scope = $$props.$$scope); + }; + + return [metadata, $$scope, slots]; +} + +class MetadataResolver extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$5, create_fragment$5, not_equal, { metadata: 0 }); + } +} + +function isMacOS() { + return navigator.appVersion.indexOf("Mac") !== -1; +} +function isMetaPressed(e) { + return isMacOS() ? e.metaKey : e.ctrlKey; +} +function getDaysOfWeek(..._args) { + return window.moment.weekdaysShort(true); +} +function isWeekend(date) { + return date.isoWeekday() === 6 || date.isoWeekday() === 7; +} +function getStartOfWeek(days) { + return days[0].weekday(0); +} +/** + * Generate a 2D array of daily information to power + * the calendar view. + */ +function getMonth(displayedMonth, ..._args) { + const locale = window.moment().locale(); + const month = []; + let week; + const startOfMonth = displayedMonth.clone().locale(locale).date(1); + const startOffset = startOfMonth.weekday(); + let date = startOfMonth.clone().subtract(startOffset, "days"); + for (let _day = 0; _day < 42; _day++) { + if (_day % 7 === 0) { + week = { + days: [], + weekNum: date.week(), + }; + month.push(week); + } + week.days.push(date); + date = date.clone().add(1, "days"); + } + return month; +} + +/* src/components/Day.svelte generated by Svelte v3.35.0 */ + +function add_css$4() { + var style = element("style"); + style.id = "svelte-q3wqg9-style"; + style.textContent = ".day.svelte-q3wqg9{background-color:var(--color-background-day);border-radius:4px;color:var(--color-text-day);cursor:pointer;font-size:0.8em;height:100%;padding:4px;position:relative;text-align:center;transition:background-color 0.1s ease-in, color 0.1s ease-in;vertical-align:baseline}.day.svelte-q3wqg9:hover{background-color:var(--interactive-hover)}.day.active.svelte-q3wqg9:hover{background-color:var(--interactive-accent-hover)}.adjacent-month.svelte-q3wqg9{opacity:0.25}.today.svelte-q3wqg9{color:var(--color-text-today)}.day.svelte-q3wqg9:active,.active.svelte-q3wqg9,.active.today.svelte-q3wqg9{color:var(--text-on-accent);background-color:var(--interactive-accent)}.dot-container.svelte-q3wqg9{display:flex;flex-wrap:wrap;justify-content:center;line-height:6px;min-height:6px}"; + append(document.head, style); +} + +function get_each_context$2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[11] = list[i]; + return child_ctx; +} + +// (36:8) {#each metadata.dots as dot} +function create_each_block$2(ctx) { + let dot; + let current; + const dot_spread_levels = [/*dot*/ ctx[11]]; + let dot_props = {}; + + for (let i = 0; i < dot_spread_levels.length; i += 1) { + dot_props = assign(dot_props, dot_spread_levels[i]); + } + + dot = new Dot({ props: dot_props }); + + return { + c() { + create_component(dot.$$.fragment); + }, + m(target, anchor) { + mount_component(dot, target, anchor); + current = true; + }, + p(ctx, dirty) { + const dot_changes = (dirty & /*metadata*/ 128) + ? get_spread_update(dot_spread_levels, [get_spread_object(/*dot*/ ctx[11])]) + : {}; + + dot.$set(dot_changes); + }, + i(local) { + if (current) return; + transition_in(dot.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(dot.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(dot, detaching); + } + }; +} + +// (22:2) +function create_default_slot$1(ctx) { + let div1; + let t0_value = /*date*/ ctx[0].format("D") + ""; + let t0; + let t1; + let div0; + let div1_class_value; + let current; + let mounted; + let dispose; + let each_value = /*metadata*/ ctx[7].dots; + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); + } + + const out = i => transition_out(each_blocks[i], 1, 1, () => { + each_blocks[i] = null; + }); + + let div1_levels = [ + { + class: div1_class_value = `day ${/*metadata*/ ctx[7].classes.join(" ")}` + }, + /*metadata*/ ctx[7].dataAttributes || {} + ]; + + let div1_data = {}; + + for (let i = 0; i < div1_levels.length; i += 1) { + div1_data = assign(div1_data, div1_levels[i]); + } + + return { + c() { + div1 = element("div"); + t0 = text(t0_value); + t1 = space(); + div0 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(div0, "class", "dot-container svelte-q3wqg9"); + set_attributes(div1, div1_data); + toggle_class(div1, "active", /*selectedId*/ ctx[6] === getDateUID_1(/*date*/ ctx[0], "day")); + toggle_class(div1, "adjacent-month", !/*date*/ ctx[0].isSame(/*displayedMonth*/ ctx[5], "month")); + toggle_class(div1, "today", /*date*/ ctx[0].isSame(/*today*/ ctx[4], "day")); + toggle_class(div1, "svelte-q3wqg9", true); + }, + m(target, anchor) { + insert(target, div1, anchor); + append(div1, t0); + append(div1, t1); + append(div1, div0); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div0, null); + } + + current = true; + + if (!mounted) { + dispose = [ + listen(div1, "click", function () { + if (is_function(/*onClick*/ ctx[2] && /*click_handler*/ ctx[8])) (/*onClick*/ ctx[2] && /*click_handler*/ ctx[8]).apply(this, arguments); + }), + listen(div1, "contextmenu", function () { + if (is_function(/*onContextMenu*/ ctx[3] && /*contextmenu_handler*/ ctx[9])) (/*onContextMenu*/ ctx[3] && /*contextmenu_handler*/ ctx[9]).apply(this, arguments); + }), + listen(div1, "pointerover", function () { + if (is_function(/*onHover*/ ctx[1] && /*pointerover_handler*/ ctx[10])) (/*onHover*/ ctx[1] && /*pointerover_handler*/ ctx[10]).apply(this, arguments); + }) + ]; + + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if ((!current || dirty & /*date*/ 1) && t0_value !== (t0_value = /*date*/ ctx[0].format("D") + "")) set_data(t0, t0_value); + + if (dirty & /*metadata*/ 128) { + each_value = /*metadata*/ ctx[7].dots; + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$2(ctx, each_value, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + transition_in(each_blocks[i], 1); + } else { + each_blocks[i] = create_each_block$2(child_ctx); + each_blocks[i].c(); + transition_in(each_blocks[i], 1); + each_blocks[i].m(div0, null); + } + } + + group_outros(); + + for (i = each_value.length; i < each_blocks.length; i += 1) { + out(i); + } + + check_outros(); + } + + set_attributes(div1, div1_data = get_spread_update(div1_levels, [ + (!current || dirty & /*metadata*/ 128 && div1_class_value !== (div1_class_value = `day ${/*metadata*/ ctx[7].classes.join(" ")}`)) && { class: div1_class_value }, + dirty & /*metadata*/ 128 && (/*metadata*/ ctx[7].dataAttributes || {}) + ])); + + toggle_class(div1, "active", /*selectedId*/ ctx[6] === getDateUID_1(/*date*/ ctx[0], "day")); + toggle_class(div1, "adjacent-month", !/*date*/ ctx[0].isSame(/*displayedMonth*/ ctx[5], "month")); + toggle_class(div1, "today", /*date*/ ctx[0].isSame(/*today*/ ctx[4], "day")); + toggle_class(div1, "svelte-q3wqg9", true); + }, + i(local) { + if (current) return; + + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o(local) { + each_blocks = each_blocks.filter(Boolean); + + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d(detaching) { + if (detaching) detach(div1); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} + +function create_fragment$4(ctx) { + let td; + let metadataresolver; + let current; + + metadataresolver = new MetadataResolver({ + props: { + metadata: /*metadata*/ ctx[7], + $$slots: { + default: [ + create_default_slot$1, + ({ metadata }) => ({ 7: metadata }), + ({ metadata }) => metadata ? 128 : 0 + ] + }, + $$scope: { ctx } + } + }); + + return { + c() { + td = element("td"); + create_component(metadataresolver.$$.fragment); + }, + m(target, anchor) { + insert(target, td, anchor); + mount_component(metadataresolver, td, null); + current = true; + }, + p(ctx, [dirty]) { + const metadataresolver_changes = {}; + if (dirty & /*metadata*/ 128) metadataresolver_changes.metadata = /*metadata*/ ctx[7]; + + if (dirty & /*$$scope, metadata, selectedId, date, displayedMonth, today, onClick, onContextMenu, onHover*/ 16639) { + metadataresolver_changes.$$scope = { dirty, ctx }; + } + + metadataresolver.$set(metadataresolver_changes); + }, + i(local) { + if (current) return; + transition_in(metadataresolver.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(metadataresolver.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(td); + destroy_component(metadataresolver); + } + }; +} + +function instance$4($$self, $$props, $$invalidate) { + + + let { date } = $$props; + let { metadata } = $$props; + let { onHover } = $$props; + let { onClick } = $$props; + let { onContextMenu } = $$props; + let { today } = $$props; + let { displayedMonth = null } = $$props; + let { selectedId = null } = $$props; + const click_handler = e => onClick(date, isMetaPressed(e)); + const contextmenu_handler = e => onContextMenu(date, e); + const pointerover_handler = e => onHover(date, e.target, isMetaPressed(e)); + + $$self.$$set = $$props => { + if ("date" in $$props) $$invalidate(0, date = $$props.date); + if ("metadata" in $$props) $$invalidate(7, metadata = $$props.metadata); + if ("onHover" in $$props) $$invalidate(1, onHover = $$props.onHover); + if ("onClick" in $$props) $$invalidate(2, onClick = $$props.onClick); + if ("onContextMenu" in $$props) $$invalidate(3, onContextMenu = $$props.onContextMenu); + if ("today" in $$props) $$invalidate(4, today = $$props.today); + if ("displayedMonth" in $$props) $$invalidate(5, displayedMonth = $$props.displayedMonth); + if ("selectedId" in $$props) $$invalidate(6, selectedId = $$props.selectedId); + }; + + return [ + date, + onHover, + onClick, + onContextMenu, + today, + displayedMonth, + selectedId, + metadata, + click_handler, + contextmenu_handler, + pointerover_handler + ]; +} + +class Day extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-q3wqg9-style")) add_css$4(); + + init(this, options, instance$4, create_fragment$4, not_equal, { + date: 0, + metadata: 7, + onHover: 1, + onClick: 2, + onContextMenu: 3, + today: 4, + displayedMonth: 5, + selectedId: 6 + }); + } +} + +/* src/components/Arrow.svelte generated by Svelte v3.35.0 */ + +function add_css$3() { + var style = element("style"); + style.id = "svelte-156w7na-style"; + style.textContent = ".arrow.svelte-156w7na.svelte-156w7na{align-items:center;cursor:pointer;display:flex;justify-content:center;width:24px}.arrow.is-mobile.svelte-156w7na.svelte-156w7na{width:32px}.right.svelte-156w7na.svelte-156w7na{transform:rotate(180deg)}.arrow.svelte-156w7na svg.svelte-156w7na{color:var(--color-arrow);height:16px;width:16px}"; + append(document.head, style); +} + +function create_fragment$3(ctx) { + let div; + let svg; + let path; + let mounted; + let dispose; + + return { + c() { + div = element("div"); + svg = svg_element("svg"); + path = svg_element("path"); + attr(path, "fill", "currentColor"); + attr(path, "d", "M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z"); + attr(svg, "focusable", "false"); + attr(svg, "role", "img"); + attr(svg, "xmlns", "http://www.w3.org/2000/svg"); + attr(svg, "viewBox", "0 0 320 512"); + attr(svg, "class", "svelte-156w7na"); + attr(div, "class", "arrow svelte-156w7na"); + attr(div, "aria-label", /*tooltip*/ ctx[1]); + toggle_class(div, "is-mobile", /*isMobile*/ ctx[3]); + toggle_class(div, "right", /*direction*/ ctx[2] === "right"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, svg); + append(svg, path); + + if (!mounted) { + dispose = listen(div, "click", function () { + if (is_function(/*onClick*/ ctx[0])) /*onClick*/ ctx[0].apply(this, arguments); + }); + + mounted = true; + } + }, + p(new_ctx, [dirty]) { + ctx = new_ctx; + + if (dirty & /*tooltip*/ 2) { + attr(div, "aria-label", /*tooltip*/ ctx[1]); + } + + if (dirty & /*direction*/ 4) { + toggle_class(div, "right", /*direction*/ ctx[2] === "right"); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(div); + mounted = false; + dispose(); + } + }; +} + +function instance$3($$self, $$props, $$invalidate) { + let { onClick } = $$props; + let { tooltip } = $$props; + let { direction } = $$props; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let isMobile = window.app.isMobile; + + $$self.$$set = $$props => { + if ("onClick" in $$props) $$invalidate(0, onClick = $$props.onClick); + if ("tooltip" in $$props) $$invalidate(1, tooltip = $$props.tooltip); + if ("direction" in $$props) $$invalidate(2, direction = $$props.direction); + }; + + return [onClick, tooltip, direction, isMobile]; +} + +class Arrow extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-156w7na-style")) add_css$3(); + init(this, options, instance$3, create_fragment$3, safe_not_equal, { onClick: 0, tooltip: 1, direction: 2 }); + } +} + +/* src/components/Nav.svelte generated by Svelte v3.35.0 */ + +function add_css$2() { + var style = element("style"); + style.id = "svelte-1vwr9dd-style"; + style.textContent = ".nav.svelte-1vwr9dd.svelte-1vwr9dd{align-items:center;display:flex;margin:0.6em 0 1em;padding:0 8px;width:100%}.nav.is-mobile.svelte-1vwr9dd.svelte-1vwr9dd{padding:0}.title.svelte-1vwr9dd.svelte-1vwr9dd{color:var(--color-text-title);font-size:1.5em;margin:0}.is-mobile.svelte-1vwr9dd .title.svelte-1vwr9dd{font-size:1.3em}.month.svelte-1vwr9dd.svelte-1vwr9dd{font-weight:500;text-transform:capitalize}.year.svelte-1vwr9dd.svelte-1vwr9dd{color:var(--interactive-accent)}.right-nav.svelte-1vwr9dd.svelte-1vwr9dd{display:flex;justify-content:center;margin-left:auto}.reset-button.svelte-1vwr9dd.svelte-1vwr9dd{cursor:pointer;border-radius:4px;color:var(--text-muted);font-size:0.7em;font-weight:600;letter-spacing:1px;margin:0 4px;padding:0px 4px;text-transform:uppercase}.is-mobile.svelte-1vwr9dd .reset-button.svelte-1vwr9dd{display:none}"; + append(document.head, style); +} + +function create_fragment$2(ctx) { + let div2; + let h3; + let span0; + let t0_value = /*displayedMonth*/ ctx[0].format("MMM") + ""; + let t0; + let t1; + let span1; + let t2_value = /*displayedMonth*/ ctx[0].format("YYYY") + ""; + let t2; + let t3; + let div1; + let arrow0; + let t4; + let div0; + let t6; + let arrow1; + let current; + let mounted; + let dispose; + + arrow0 = new Arrow({ + props: { + direction: "left", + onClick: /*decrementDisplayedMonth*/ ctx[3], + tooltip: "Previous Month" + } + }); + + arrow1 = new Arrow({ + props: { + direction: "right", + onClick: /*incrementDisplayedMonth*/ ctx[2], + tooltip: "Next Month" + } + }); + + return { + c() { + div2 = element("div"); + h3 = element("h3"); + span0 = element("span"); + t0 = text(t0_value); + t1 = space(); + span1 = element("span"); + t2 = text(t2_value); + t3 = space(); + div1 = element("div"); + create_component(arrow0.$$.fragment); + t4 = space(); + div0 = element("div"); + div0.textContent = `${/*todayDisplayStr*/ ctx[4]}`; + t6 = space(); + create_component(arrow1.$$.fragment); + attr(span0, "class", "month svelte-1vwr9dd"); + attr(span1, "class", "year svelte-1vwr9dd"); + attr(h3, "class", "title svelte-1vwr9dd"); + attr(div0, "class", "reset-button svelte-1vwr9dd"); + attr(div1, "class", "right-nav svelte-1vwr9dd"); + attr(div2, "class", "nav svelte-1vwr9dd"); + toggle_class(div2, "is-mobile", /*isMobile*/ ctx[5]); + }, + m(target, anchor) { + insert(target, div2, anchor); + append(div2, h3); + append(h3, span0); + append(span0, t0); + append(h3, t1); + append(h3, span1); + append(span1, t2); + append(div2, t3); + append(div2, div1); + mount_component(arrow0, div1, null); + append(div1, t4); + append(div1, div0); + append(div1, t6); + mount_component(arrow1, div1, null); + current = true; + + if (!mounted) { + dispose = [ + listen(h3, "click", function () { + if (is_function(/*resetDisplayedMonth*/ ctx[1])) /*resetDisplayedMonth*/ ctx[1].apply(this, arguments); + }), + listen(div0, "click", function () { + if (is_function(/*resetDisplayedMonth*/ ctx[1])) /*resetDisplayedMonth*/ ctx[1].apply(this, arguments); + }) + ]; + + mounted = true; + } + }, + p(new_ctx, [dirty]) { + ctx = new_ctx; + if ((!current || dirty & /*displayedMonth*/ 1) && t0_value !== (t0_value = /*displayedMonth*/ ctx[0].format("MMM") + "")) set_data(t0, t0_value); + if ((!current || dirty & /*displayedMonth*/ 1) && t2_value !== (t2_value = /*displayedMonth*/ ctx[0].format("YYYY") + "")) set_data(t2, t2_value); + const arrow0_changes = {}; + if (dirty & /*decrementDisplayedMonth*/ 8) arrow0_changes.onClick = /*decrementDisplayedMonth*/ ctx[3]; + arrow0.$set(arrow0_changes); + const arrow1_changes = {}; + if (dirty & /*incrementDisplayedMonth*/ 4) arrow1_changes.onClick = /*incrementDisplayedMonth*/ ctx[2]; + arrow1.$set(arrow1_changes); + }, + i(local) { + if (current) return; + transition_in(arrow0.$$.fragment, local); + transition_in(arrow1.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(arrow0.$$.fragment, local); + transition_out(arrow1.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(div2); + destroy_component(arrow0); + destroy_component(arrow1); + mounted = false; + run_all(dispose); + } + }; +} + +function instance$2($$self, $$props, $$invalidate) { + + let { displayedMonth } = $$props; + let { today } = $$props; + let { resetDisplayedMonth } = $$props; + let { incrementDisplayedMonth } = $$props; + let { decrementDisplayedMonth } = $$props; + + // Get the word 'Today' but localized to the current language + const todayDisplayStr = today.calendar().split(/\d|\s/)[0]; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let isMobile = window.app.isMobile; + + $$self.$$set = $$props => { + if ("displayedMonth" in $$props) $$invalidate(0, displayedMonth = $$props.displayedMonth); + if ("today" in $$props) $$invalidate(6, today = $$props.today); + if ("resetDisplayedMonth" in $$props) $$invalidate(1, resetDisplayedMonth = $$props.resetDisplayedMonth); + if ("incrementDisplayedMonth" in $$props) $$invalidate(2, incrementDisplayedMonth = $$props.incrementDisplayedMonth); + if ("decrementDisplayedMonth" in $$props) $$invalidate(3, decrementDisplayedMonth = $$props.decrementDisplayedMonth); + }; + + return [ + displayedMonth, + resetDisplayedMonth, + incrementDisplayedMonth, + decrementDisplayedMonth, + todayDisplayStr, + isMobile, + today + ]; +} + +class Nav extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-1vwr9dd-style")) add_css$2(); + + init(this, options, instance$2, create_fragment$2, safe_not_equal, { + displayedMonth: 0, + today: 6, + resetDisplayedMonth: 1, + incrementDisplayedMonth: 2, + decrementDisplayedMonth: 3 + }); + } +} + +/* src/components/WeekNum.svelte generated by Svelte v3.35.0 */ + +function add_css$1() { + var style = element("style"); + style.id = "svelte-egt0yd-style"; + style.textContent = "td.svelte-egt0yd{border-right:1px solid var(--background-modifier-border)}.week-num.svelte-egt0yd{background-color:var(--color-background-weeknum);border-radius:4px;color:var(--color-text-weeknum);cursor:pointer;font-size:0.65em;height:100%;padding:4px;text-align:center;transition:background-color 0.1s ease-in, color 0.1s ease-in;vertical-align:baseline}.week-num.svelte-egt0yd:hover{background-color:var(--interactive-hover)}.week-num.active.svelte-egt0yd:hover{background-color:var(--interactive-accent-hover)}.active.svelte-egt0yd{color:var(--text-on-accent);background-color:var(--interactive-accent)}.dot-container.svelte-egt0yd{display:flex;flex-wrap:wrap;justify-content:center;line-height:6px;min-height:6px}"; + append(document.head, style); +} + +function get_each_context$1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[11] = list[i]; + return child_ctx; +} + +// (35:8) {#each metadata.dots as dot} +function create_each_block$1(ctx) { + let dot; + let current; + const dot_spread_levels = [/*dot*/ ctx[11]]; + let dot_props = {}; + + for (let i = 0; i < dot_spread_levels.length; i += 1) { + dot_props = assign(dot_props, dot_spread_levels[i]); + } + + dot = new Dot({ props: dot_props }); + + return { + c() { + create_component(dot.$$.fragment); + }, + m(target, anchor) { + mount_component(dot, target, anchor); + current = true; + }, + p(ctx, dirty) { + const dot_changes = (dirty & /*metadata*/ 64) + ? get_spread_update(dot_spread_levels, [get_spread_object(/*dot*/ ctx[11])]) + : {}; + + dot.$set(dot_changes); + }, + i(local) { + if (current) return; + transition_in(dot.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(dot.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(dot, detaching); + } + }; +} + +// (24:2) +function create_default_slot(ctx) { + let div1; + let t0; + let t1; + let div0; + let div1_class_value; + let current; + let mounted; + let dispose; + let each_value = /*metadata*/ ctx[6].dots; + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); + } + + const out = i => transition_out(each_blocks[i], 1, 1, () => { + each_blocks[i] = null; + }); + + return { + c() { + div1 = element("div"); + t0 = text(/*weekNum*/ ctx[0]); + t1 = space(); + div0 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(div0, "class", "dot-container svelte-egt0yd"); + attr(div1, "class", div1_class_value = "" + (null_to_empty(`week-num ${/*metadata*/ ctx[6].classes.join(" ")}`) + " svelte-egt0yd")); + toggle_class(div1, "active", /*selectedId*/ ctx[5] === getDateUID_1(/*days*/ ctx[1][0], "week")); + }, + m(target, anchor) { + insert(target, div1, anchor); + append(div1, t0); + append(div1, t1); + append(div1, div0); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div0, null); + } + + current = true; + + if (!mounted) { + dispose = [ + listen(div1, "click", function () { + if (is_function(/*onClick*/ ctx[3] && /*click_handler*/ ctx[8])) (/*onClick*/ ctx[3] && /*click_handler*/ ctx[8]).apply(this, arguments); + }), + listen(div1, "contextmenu", function () { + if (is_function(/*onContextMenu*/ ctx[4] && /*contextmenu_handler*/ ctx[9])) (/*onContextMenu*/ ctx[4] && /*contextmenu_handler*/ ctx[9]).apply(this, arguments); + }), + listen(div1, "pointerover", function () { + if (is_function(/*onHover*/ ctx[2] && /*pointerover_handler*/ ctx[10])) (/*onHover*/ ctx[2] && /*pointerover_handler*/ ctx[10]).apply(this, arguments); + }) + ]; + + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (!current || dirty & /*weekNum*/ 1) set_data(t0, /*weekNum*/ ctx[0]); + + if (dirty & /*metadata*/ 64) { + each_value = /*metadata*/ ctx[6].dots; + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$1(ctx, each_value, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + transition_in(each_blocks[i], 1); + } else { + each_blocks[i] = create_each_block$1(child_ctx); + each_blocks[i].c(); + transition_in(each_blocks[i], 1); + each_blocks[i].m(div0, null); + } + } + + group_outros(); + + for (i = each_value.length; i < each_blocks.length; i += 1) { + out(i); + } + + check_outros(); + } + + if (!current || dirty & /*metadata*/ 64 && div1_class_value !== (div1_class_value = "" + (null_to_empty(`week-num ${/*metadata*/ ctx[6].classes.join(" ")}`) + " svelte-egt0yd"))) { + attr(div1, "class", div1_class_value); + } + + if (dirty & /*metadata, selectedId, getDateUID, days*/ 98) { + toggle_class(div1, "active", /*selectedId*/ ctx[5] === getDateUID_1(/*days*/ ctx[1][0], "week")); + } + }, + i(local) { + if (current) return; + + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o(local) { + each_blocks = each_blocks.filter(Boolean); + + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d(detaching) { + if (detaching) detach(div1); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} + +function create_fragment$1(ctx) { + let td; + let metadataresolver; + let current; + + metadataresolver = new MetadataResolver({ + props: { + metadata: /*metadata*/ ctx[6], + $$slots: { + default: [ + create_default_slot, + ({ metadata }) => ({ 6: metadata }), + ({ metadata }) => metadata ? 64 : 0 + ] + }, + $$scope: { ctx } + } + }); + + return { + c() { + td = element("td"); + create_component(metadataresolver.$$.fragment); + attr(td, "class", "svelte-egt0yd"); + }, + m(target, anchor) { + insert(target, td, anchor); + mount_component(metadataresolver, td, null); + current = true; + }, + p(ctx, [dirty]) { + const metadataresolver_changes = {}; + if (dirty & /*metadata*/ 64) metadataresolver_changes.metadata = /*metadata*/ ctx[6]; + + if (dirty & /*$$scope, metadata, selectedId, days, onClick, startOfWeek, onContextMenu, onHover, weekNum*/ 16639) { + metadataresolver_changes.$$scope = { dirty, ctx }; + } + + metadataresolver.$set(metadataresolver_changes); + }, + i(local) { + if (current) return; + transition_in(metadataresolver.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(metadataresolver.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(td); + destroy_component(metadataresolver); + } + }; +} + +function instance$1($$self, $$props, $$invalidate) { + + + let { weekNum } = $$props; + let { days } = $$props; + let { metadata } = $$props; + let { onHover } = $$props; + let { onClick } = $$props; + let { onContextMenu } = $$props; + let { selectedId = null } = $$props; + let startOfWeek; + const click_handler = e => onClick(startOfWeek, isMetaPressed(e)); + const contextmenu_handler = e => onContextMenu(days[0], e); + const pointerover_handler = e => onHover(startOfWeek, e.target, isMetaPressed(e)); + + $$self.$$set = $$props => { + if ("weekNum" in $$props) $$invalidate(0, weekNum = $$props.weekNum); + if ("days" in $$props) $$invalidate(1, days = $$props.days); + if ("metadata" in $$props) $$invalidate(6, metadata = $$props.metadata); + if ("onHover" in $$props) $$invalidate(2, onHover = $$props.onHover); + if ("onClick" in $$props) $$invalidate(3, onClick = $$props.onClick); + if ("onContextMenu" in $$props) $$invalidate(4, onContextMenu = $$props.onContextMenu); + if ("selectedId" in $$props) $$invalidate(5, selectedId = $$props.selectedId); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*days*/ 2) { + $$invalidate(7, startOfWeek = getStartOfWeek(days)); + } + }; + + return [ + weekNum, + days, + onHover, + onClick, + onContextMenu, + selectedId, + metadata, + startOfWeek, + click_handler, + contextmenu_handler, + pointerover_handler + ]; +} + +class WeekNum extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-egt0yd-style")) add_css$1(); + + init(this, options, instance$1, create_fragment$1, not_equal, { + weekNum: 0, + days: 1, + metadata: 6, + onHover: 2, + onClick: 3, + onContextMenu: 4, + selectedId: 5 + }); + } +} + +async function metadataReducer(promisedMetadata) { + const meta = { + dots: [], + classes: [], + dataAttributes: {}, + }; + const metas = await Promise.all(promisedMetadata); + return metas.reduce((acc, meta) => ({ + classes: [...acc.classes, ...(meta.classes || [])], + dataAttributes: Object.assign(acc.dataAttributes, meta.dataAttributes), + dots: [...acc.dots, ...(meta.dots || [])], + }), meta); +} +function getDailyMetadata(sources, date, ..._args) { + return metadataReducer(sources.map((source) => source.getDailyMetadata(date))); +} +function getWeeklyMetadata(sources, date, ..._args) { + return metadataReducer(sources.map((source) => source.getWeeklyMetadata(date))); +} + +/* src/components/Calendar.svelte generated by Svelte v3.35.0 */ + +function add_css() { + var style = element("style"); + style.id = "svelte-pcimu8-style"; + style.textContent = ".container.svelte-pcimu8{--color-background-heading:transparent;--color-background-day:transparent;--color-background-weeknum:transparent;--color-background-weekend:transparent;--color-dot:var(--text-muted);--color-arrow:var(--text-muted);--color-button:var(--text-muted);--color-text-title:var(--text-normal);--color-text-heading:var(--text-muted);--color-text-day:var(--text-normal);--color-text-today:var(--interactive-accent);--color-text-weeknum:var(--text-muted)}.container.svelte-pcimu8{padding:0 8px}.container.is-mobile.svelte-pcimu8{padding:0}th.svelte-pcimu8{text-align:center}.weekend.svelte-pcimu8{background-color:var(--color-background-weekend)}.calendar.svelte-pcimu8{border-collapse:collapse;width:100%}th.svelte-pcimu8{background-color:var(--color-background-heading);color:var(--color-text-heading);font-size:0.6em;letter-spacing:1px;padding:4px;text-transform:uppercase}"; + append(document.head, style); +} + +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[18] = list[i]; + return child_ctx; +} + +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[21] = list[i]; + return child_ctx; +} + +function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[24] = list[i]; + return child_ctx; +} + +function get_each_context_3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[27] = list[i]; + return child_ctx; +} + +// (55:6) {#if showWeekNums} +function create_if_block_2(ctx) { + let col; + + return { + c() { + col = element("col"); + }, + m(target, anchor) { + insert(target, col, anchor); + }, + d(detaching) { + if (detaching) detach(col); + } + }; +} + +// (58:6) {#each month[1].days as date} +function create_each_block_3(ctx) { + let col; + + return { + c() { + col = element("col"); + attr(col, "class", "svelte-pcimu8"); + toggle_class(col, "weekend", isWeekend(/*date*/ ctx[27])); + }, + m(target, anchor) { + insert(target, col, anchor); + }, + p(ctx, dirty) { + if (dirty & /*isWeekend, month*/ 16384) { + toggle_class(col, "weekend", isWeekend(/*date*/ ctx[27])); + } + }, + d(detaching) { + if (detaching) detach(col); + } + }; +} + +// (64:8) {#if showWeekNums} +function create_if_block_1(ctx) { + let th; + + return { + c() { + th = element("th"); + th.textContent = "W"; + attr(th, "class", "svelte-pcimu8"); + }, + m(target, anchor) { + insert(target, th, anchor); + }, + d(detaching) { + if (detaching) detach(th); + } + }; +} + +// (67:8) {#each daysOfWeek as dayOfWeek} +function create_each_block_2(ctx) { + let th; + let t_value = /*dayOfWeek*/ ctx[24] + ""; + let t; + + return { + c() { + th = element("th"); + t = text(t_value); + attr(th, "class", "svelte-pcimu8"); + }, + m(target, anchor) { + insert(target, th, anchor); + append(th, t); + }, + p(ctx, dirty) { + if (dirty & /*daysOfWeek*/ 32768 && t_value !== (t_value = /*dayOfWeek*/ ctx[24] + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(th); + } + }; +} + +// (75:10) {#if showWeekNums} +function create_if_block(ctx) { + let weeknum; + let current; + + const weeknum_spread_levels = [ + /*week*/ ctx[18], + { + metadata: getWeeklyMetadata(/*sources*/ ctx[8], /*week*/ ctx[18].days[0], /*today*/ ctx[10]) + }, + { onClick: /*onClickWeek*/ ctx[7] }, + { + onContextMenu: /*onContextMenuWeek*/ ctx[5] + }, + { onHover: /*onHoverWeek*/ ctx[3] }, + { selectedId: /*selectedId*/ ctx[9] } + ]; + + let weeknum_props = {}; + + for (let i = 0; i < weeknum_spread_levels.length; i += 1) { + weeknum_props = assign(weeknum_props, weeknum_spread_levels[i]); + } + + weeknum = new WeekNum({ props: weeknum_props }); + + return { + c() { + create_component(weeknum.$$.fragment); + }, + m(target, anchor) { + mount_component(weeknum, target, anchor); + current = true; + }, + p(ctx, dirty) { + const weeknum_changes = (dirty & /*month, getWeeklyMetadata, sources, today, onClickWeek, onContextMenuWeek, onHoverWeek, selectedId*/ 18344) + ? get_spread_update(weeknum_spread_levels, [ + dirty & /*month*/ 16384 && get_spread_object(/*week*/ ctx[18]), + dirty & /*getWeeklyMetadata, sources, month, today*/ 17664 && { + metadata: getWeeklyMetadata(/*sources*/ ctx[8], /*week*/ ctx[18].days[0], /*today*/ ctx[10]) + }, + dirty & /*onClickWeek*/ 128 && { onClick: /*onClickWeek*/ ctx[7] }, + dirty & /*onContextMenuWeek*/ 32 && { + onContextMenu: /*onContextMenuWeek*/ ctx[5] + }, + dirty & /*onHoverWeek*/ 8 && { onHover: /*onHoverWeek*/ ctx[3] }, + dirty & /*selectedId*/ 512 && { selectedId: /*selectedId*/ ctx[9] } + ]) + : {}; + + weeknum.$set(weeknum_changes); + }, + i(local) { + if (current) return; + transition_in(weeknum.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(weeknum.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(weeknum, detaching); + } + }; +} + +// (85:10) {#each week.days as day (day.format())} +function create_each_block_1(key_1, ctx) { + let first; + let day; + let current; + + day = new Day({ + props: { + date: /*day*/ ctx[21], + today: /*today*/ ctx[10], + displayedMonth: /*displayedMonth*/ ctx[0], + onClick: /*onClickDay*/ ctx[6], + onContextMenu: /*onContextMenuDay*/ ctx[4], + onHover: /*onHoverDay*/ ctx[2], + metadata: getDailyMetadata(/*sources*/ ctx[8], /*day*/ ctx[21], /*today*/ ctx[10]), + selectedId: /*selectedId*/ ctx[9] + } + }); + + return { + key: key_1, + first: null, + c() { + first = empty(); + create_component(day.$$.fragment); + this.first = first; + }, + m(target, anchor) { + insert(target, first, anchor); + mount_component(day, target, anchor); + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + const day_changes = {}; + if (dirty & /*month*/ 16384) day_changes.date = /*day*/ ctx[21]; + if (dirty & /*today*/ 1024) day_changes.today = /*today*/ ctx[10]; + if (dirty & /*displayedMonth*/ 1) day_changes.displayedMonth = /*displayedMonth*/ ctx[0]; + if (dirty & /*onClickDay*/ 64) day_changes.onClick = /*onClickDay*/ ctx[6]; + if (dirty & /*onContextMenuDay*/ 16) day_changes.onContextMenu = /*onContextMenuDay*/ ctx[4]; + if (dirty & /*onHoverDay*/ 4) day_changes.onHover = /*onHoverDay*/ ctx[2]; + if (dirty & /*sources, month, today*/ 17664) day_changes.metadata = getDailyMetadata(/*sources*/ ctx[8], /*day*/ ctx[21], /*today*/ ctx[10]); + if (dirty & /*selectedId*/ 512) day_changes.selectedId = /*selectedId*/ ctx[9]; + day.$set(day_changes); + }, + i(local) { + if (current) return; + transition_in(day.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(day.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(first); + destroy_component(day, detaching); + } + }; +} + +// (73:6) {#each month as week (week.weekNum)} +function create_each_block(key_1, ctx) { + let tr; + let t0; + let each_blocks = []; + let each_1_lookup = new Map(); + let t1; + let current; + let if_block = /*showWeekNums*/ ctx[1] && create_if_block(ctx); + let each_value_1 = /*week*/ ctx[18].days; + const get_key = ctx => /*day*/ ctx[21].format(); + + for (let i = 0; i < each_value_1.length; i += 1) { + let child_ctx = get_each_context_1(ctx, each_value_1, i); + let key = get_key(child_ctx); + each_1_lookup.set(key, each_blocks[i] = create_each_block_1(key, child_ctx)); + } + + return { + key: key_1, + first: null, + c() { + tr = element("tr"); + if (if_block) if_block.c(); + t0 = space(); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + t1 = space(); + this.first = tr; + }, + m(target, anchor) { + insert(target, tr, anchor); + if (if_block) if_block.m(tr, null); + append(tr, t0); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(tr, null); + } + + append(tr, t1); + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (/*showWeekNums*/ ctx[1]) { + if (if_block) { + if_block.p(ctx, dirty); + + if (dirty & /*showWeekNums*/ 2) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(tr, t0); + } + } else if (if_block) { + group_outros(); + + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + + check_outros(); + } + + if (dirty & /*month, today, displayedMonth, onClickDay, onContextMenuDay, onHoverDay, getDailyMetadata, sources, selectedId*/ 18261) { + each_value_1 = /*week*/ ctx[18].days; + group_outros(); + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value_1, each_1_lookup, tr, outro_and_destroy_block, create_each_block_1, t1, get_each_context_1); + check_outros(); + } + }, + i(local) { + if (current) return; + transition_in(if_block); + + for (let i = 0; i < each_value_1.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o(local) { + transition_out(if_block); + + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d(detaching) { + if (detaching) detach(tr); + if (if_block) if_block.d(); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + } + }; +} + +function create_fragment$7(ctx) { + let div; + let nav; + let t0; + let table; + let colgroup; + let t1; + let t2; + let thead; + let tr; + let t3; + let t4; + let tbody; + let each_blocks = []; + let each2_lookup = new Map(); + let current; + + nav = new Nav({ + props: { + today: /*today*/ ctx[10], + displayedMonth: /*displayedMonth*/ ctx[0], + incrementDisplayedMonth: /*incrementDisplayedMonth*/ ctx[11], + decrementDisplayedMonth: /*decrementDisplayedMonth*/ ctx[12], + resetDisplayedMonth: /*resetDisplayedMonth*/ ctx[13] + } + }); + + let if_block0 = /*showWeekNums*/ ctx[1] && create_if_block_2(); + let each_value_3 = /*month*/ ctx[14][1].days; + let each_blocks_2 = []; + + for (let i = 0; i < each_value_3.length; i += 1) { + each_blocks_2[i] = create_each_block_3(get_each_context_3(ctx, each_value_3, i)); + } + + let if_block1 = /*showWeekNums*/ ctx[1] && create_if_block_1(); + let each_value_2 = /*daysOfWeek*/ ctx[15]; + let each_blocks_1 = []; + + for (let i = 0; i < each_value_2.length; i += 1) { + each_blocks_1[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i)); + } + + let each_value = /*month*/ ctx[14]; + const get_key = ctx => /*week*/ ctx[18].weekNum; + + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context(ctx, each_value, i); + let key = get_key(child_ctx); + each2_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); + } + + return { + c() { + div = element("div"); + create_component(nav.$$.fragment); + t0 = space(); + table = element("table"); + colgroup = element("colgroup"); + if (if_block0) if_block0.c(); + t1 = space(); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].c(); + } + + t2 = space(); + thead = element("thead"); + tr = element("tr"); + if (if_block1) if_block1.c(); + t3 = space(); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + + t4 = space(); + tbody = element("tbody"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(table, "class", "calendar svelte-pcimu8"); + attr(div, "id", "calendar-container"); + attr(div, "class", "container svelte-pcimu8"); + toggle_class(div, "is-mobile", /*isMobile*/ ctx[16]); + }, + m(target, anchor) { + insert(target, div, anchor); + mount_component(nav, div, null); + append(div, t0); + append(div, table); + append(table, colgroup); + if (if_block0) if_block0.m(colgroup, null); + append(colgroup, t1); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].m(colgroup, null); + } + + append(table, t2); + append(table, thead); + append(thead, tr); + if (if_block1) if_block1.m(tr, null); + append(tr, t3); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(tr, null); + } + + append(table, t4); + append(table, tbody); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(tbody, null); + } + + current = true; + }, + p(ctx, [dirty]) { + const nav_changes = {}; + if (dirty & /*today*/ 1024) nav_changes.today = /*today*/ ctx[10]; + if (dirty & /*displayedMonth*/ 1) nav_changes.displayedMonth = /*displayedMonth*/ ctx[0]; + nav.$set(nav_changes); + + if (/*showWeekNums*/ ctx[1]) { + if (if_block0) ; else { + if_block0 = create_if_block_2(); + if_block0.c(); + if_block0.m(colgroup, t1); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + + if (dirty & /*isWeekend, month*/ 16384) { + each_value_3 = /*month*/ ctx[14][1].days; + let i; + + for (i = 0; i < each_value_3.length; i += 1) { + const child_ctx = get_each_context_3(ctx, each_value_3, i); + + if (each_blocks_2[i]) { + each_blocks_2[i].p(child_ctx, dirty); + } else { + each_blocks_2[i] = create_each_block_3(child_ctx); + each_blocks_2[i].c(); + each_blocks_2[i].m(colgroup, null); + } + } + + for (; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].d(1); + } + + each_blocks_2.length = each_value_3.length; + } + + if (/*showWeekNums*/ ctx[1]) { + if (if_block1) ; else { + if_block1 = create_if_block_1(); + if_block1.c(); + if_block1.m(tr, t3); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + + if (dirty & /*daysOfWeek*/ 32768) { + each_value_2 = /*daysOfWeek*/ ctx[15]; + let i; + + for (i = 0; i < each_value_2.length; i += 1) { + const child_ctx = get_each_context_2(ctx, each_value_2, i); + + if (each_blocks_1[i]) { + each_blocks_1[i].p(child_ctx, dirty); + } else { + each_blocks_1[i] = create_each_block_2(child_ctx); + each_blocks_1[i].c(); + each_blocks_1[i].m(tr, null); + } + } + + for (; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(1); + } + + each_blocks_1.length = each_value_2.length; + } + + if (dirty & /*month, today, displayedMonth, onClickDay, onContextMenuDay, onHoverDay, getDailyMetadata, sources, selectedId, getWeeklyMetadata, onClickWeek, onContextMenuWeek, onHoverWeek, showWeekNums*/ 18431) { + each_value = /*month*/ ctx[14]; + group_outros(); + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each2_lookup, tbody, outro_and_destroy_block, create_each_block, null, get_each_context); + check_outros(); + } + }, + i(local) { + if (current) return; + transition_in(nav.$$.fragment, local); + + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o(local) { + transition_out(nav.$$.fragment, local); + + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d(detaching) { + if (detaching) detach(div); + destroy_component(nav); + if (if_block0) if_block0.d(); + destroy_each(each_blocks_2, detaching); + if (if_block1) if_block1.d(); + destroy_each(each_blocks_1, detaching); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + } + }; +} + +function instance$7($$self, $$props, $$invalidate) { + + + let { localeData } = $$props; + let { showWeekNums = false } = $$props; + let { onHoverDay } = $$props; + let { onHoverWeek } = $$props; + let { onContextMenuDay } = $$props; + let { onContextMenuWeek } = $$props; + let { onClickDay } = $$props; + let { onClickWeek } = $$props; + let { sources = [] } = $$props; + let { selectedId } = $$props; + let { today = window.moment() } = $$props; + let { displayedMonth = today } = $$props; + let month; + let daysOfWeek; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let isMobile = window.app.isMobile; + + function incrementDisplayedMonth() { + $$invalidate(0, displayedMonth = displayedMonth.clone().add(1, "month")); + } + + function decrementDisplayedMonth() { + $$invalidate(0, displayedMonth = displayedMonth.clone().subtract(1, "month")); + } + + function resetDisplayedMonth() { + $$invalidate(0, displayedMonth = today.clone()); + } + + $$self.$$set = $$props => { + if ("localeData" in $$props) $$invalidate(17, localeData = $$props.localeData); + if ("showWeekNums" in $$props) $$invalidate(1, showWeekNums = $$props.showWeekNums); + if ("onHoverDay" in $$props) $$invalidate(2, onHoverDay = $$props.onHoverDay); + if ("onHoverWeek" in $$props) $$invalidate(3, onHoverWeek = $$props.onHoverWeek); + if ("onContextMenuDay" in $$props) $$invalidate(4, onContextMenuDay = $$props.onContextMenuDay); + if ("onContextMenuWeek" in $$props) $$invalidate(5, onContextMenuWeek = $$props.onContextMenuWeek); + if ("onClickDay" in $$props) $$invalidate(6, onClickDay = $$props.onClickDay); + if ("onClickWeek" in $$props) $$invalidate(7, onClickWeek = $$props.onClickWeek); + if ("sources" in $$props) $$invalidate(8, sources = $$props.sources); + if ("selectedId" in $$props) $$invalidate(9, selectedId = $$props.selectedId); + if ("today" in $$props) $$invalidate(10, today = $$props.today); + if ("displayedMonth" in $$props) $$invalidate(0, displayedMonth = $$props.displayedMonth); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*displayedMonth, localeData*/ 131073) { + $$invalidate(14, month = getMonth(displayedMonth, localeData)); + } + + if ($$self.$$.dirty & /*today, localeData*/ 132096) { + $$invalidate(15, daysOfWeek = getDaysOfWeek(today, localeData)); + } + }; + + return [ + displayedMonth, + showWeekNums, + onHoverDay, + onHoverWeek, + onContextMenuDay, + onContextMenuWeek, + onClickDay, + onClickWeek, + sources, + selectedId, + today, + incrementDisplayedMonth, + decrementDisplayedMonth, + resetDisplayedMonth, + month, + daysOfWeek, + isMobile, + localeData + ]; +} + +class Calendar$1 extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-pcimu8-style")) add_css(); + + init(this, options, instance$7, create_fragment$7, not_equal, { + localeData: 17, + showWeekNums: 1, + onHoverDay: 2, + onHoverWeek: 3, + onContextMenuDay: 4, + onContextMenuWeek: 5, + onClickDay: 6, + onClickWeek: 7, + sources: 8, + selectedId: 9, + today: 10, + displayedMonth: 0, + incrementDisplayedMonth: 11, + decrementDisplayedMonth: 12, + resetDisplayedMonth: 13 + }); + } + + get incrementDisplayedMonth() { + return this.$$.ctx[11]; + } + + get decrementDisplayedMonth() { + return this.$$.ctx[12]; + } + + get resetDisplayedMonth() { + return this.$$.ctx[13]; + } +} + +const langToMomentLocale = { + en: "en-gb", + zh: "zh-cn", + "zh-TW": "zh-tw", + ru: "ru", + ko: "ko", + it: "it", + id: "id", + ro: "ro", + "pt-BR": "pt-br", + cz: "cs", + da: "da", + de: "de", + es: "es", + fr: "fr", + no: "nn", + pl: "pl", + pt: "pt", + tr: "tr", + hi: "hi", + nl: "nl", + ar: "ar", + ja: "ja", +}; +const weekdays = [ + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", +]; +function overrideGlobalMomentWeekStart(weekStart) { + const { moment } = window; + const currentLocale = moment.locale(); + // Save the initial locale weekspec so that we can restore + // it when toggling between the different options in settings. + if (!window._bundledLocaleWeekSpec) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + window._bundledLocaleWeekSpec = moment.localeData()._week; + } + if (weekStart === "locale") { + moment.updateLocale(currentLocale, { + week: window._bundledLocaleWeekSpec, + }); + } + else { + moment.updateLocale(currentLocale, { + week: { + dow: weekdays.indexOf(weekStart) || 0, + }, + }); + } +} +/** + * Sets the locale used by the calendar. This allows the calendar to + * default to the user's locale (e.g. Start Week on Sunday/Monday/Friday) + * + * @param localeOverride locale string (e.g. "en-US") + */ +function configureGlobalMomentLocale(localeOverride = "system-default", weekStart = "locale") { + var _a; + const obsidianLang = localStorage.getItem("language") || "en"; + const systemLang = (_a = navigator.language) === null || _a === void 0 ? void 0 : _a.toLowerCase(); + let momentLocale = langToMomentLocale[obsidianLang]; + if (localeOverride !== "system-default") { + momentLocale = localeOverride; + } + else if (systemLang.startsWith(obsidianLang)) { + // If the system locale is more specific (en-gb vs en), use the system locale. + momentLocale = systemLang; + } + const currentLocale = window.moment.locale(momentLocale); + console.debug(`[Calendar] Trying to switch Moment.js global locale to ${momentLocale}, got ${currentLocale}`); + overrideGlobalMomentWeekStart(weekStart); + return currentLocale; +} + +/* src/ui/Calendar.svelte generated by Svelte v3.35.0 */ + +function create_fragment(ctx) { + let calendarbase; + let updating_displayedMonth; + let current; + + function calendarbase_displayedMonth_binding(value) { + /*calendarbase_displayedMonth_binding*/ ctx[12](value); + } + + let calendarbase_props = { + sources: /*sources*/ ctx[1], + today: /*today*/ ctx[9], + onHoverDay: /*onHoverDay*/ ctx[2], + onHoverWeek: /*onHoverWeek*/ ctx[3], + onContextMenuDay: /*onContextMenuDay*/ ctx[6], + onContextMenuWeek: /*onContextMenuWeek*/ ctx[7], + onClickDay: /*onClickDay*/ ctx[4], + onClickWeek: /*onClickWeek*/ ctx[5], + localeData: /*today*/ ctx[9].localeData(), + selectedId: /*$activeFile*/ ctx[10], + showWeekNums: /*$settings*/ ctx[8].showWeeklyNote + }; + + if (/*displayedMonth*/ ctx[0] !== void 0) { + calendarbase_props.displayedMonth = /*displayedMonth*/ ctx[0]; + } + + calendarbase = new Calendar$1({ props: calendarbase_props }); + binding_callbacks$1.push(() => bind(calendarbase, "displayedMonth", calendarbase_displayedMonth_binding)); + + return { + c() { + create_component$1(calendarbase.$$.fragment); + }, + m(target, anchor) { + mount_component$1(calendarbase, target, anchor); + current = true; + }, + p(ctx, [dirty]) { + const calendarbase_changes = {}; + if (dirty & /*sources*/ 2) calendarbase_changes.sources = /*sources*/ ctx[1]; + if (dirty & /*today*/ 512) calendarbase_changes.today = /*today*/ ctx[9]; + if (dirty & /*onHoverDay*/ 4) calendarbase_changes.onHoverDay = /*onHoverDay*/ ctx[2]; + if (dirty & /*onHoverWeek*/ 8) calendarbase_changes.onHoverWeek = /*onHoverWeek*/ ctx[3]; + if (dirty & /*onContextMenuDay*/ 64) calendarbase_changes.onContextMenuDay = /*onContextMenuDay*/ ctx[6]; + if (dirty & /*onContextMenuWeek*/ 128) calendarbase_changes.onContextMenuWeek = /*onContextMenuWeek*/ ctx[7]; + if (dirty & /*onClickDay*/ 16) calendarbase_changes.onClickDay = /*onClickDay*/ ctx[4]; + if (dirty & /*onClickWeek*/ 32) calendarbase_changes.onClickWeek = /*onClickWeek*/ ctx[5]; + if (dirty & /*today*/ 512) calendarbase_changes.localeData = /*today*/ ctx[9].localeData(); + if (dirty & /*$activeFile*/ 1024) calendarbase_changes.selectedId = /*$activeFile*/ ctx[10]; + if (dirty & /*$settings*/ 256) calendarbase_changes.showWeekNums = /*$settings*/ ctx[8].showWeeklyNote; + + if (!updating_displayedMonth && dirty & /*displayedMonth*/ 1) { + updating_displayedMonth = true; + calendarbase_changes.displayedMonth = /*displayedMonth*/ ctx[0]; + add_flush_callback(() => updating_displayedMonth = false); + } + + calendarbase.$set(calendarbase_changes); + }, + i(local) { + if (current) return; + transition_in$1(calendarbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out$1(calendarbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component$1(calendarbase, detaching); + } + }; +} + +function instance($$self, $$props, $$invalidate) { + let $settings; + let $activeFile; + component_subscribe($$self, settings, $$value => $$invalidate(8, $settings = $$value)); + component_subscribe($$self, activeFile, $$value => $$invalidate(10, $activeFile = $$value)); + + + let today; + let { displayedMonth = today } = $$props; + let { sources } = $$props; + let { onHoverDay } = $$props; + let { onHoverWeek } = $$props; + let { onClickDay } = $$props; + let { onClickWeek } = $$props; + let { onContextMenuDay } = $$props; + let { onContextMenuWeek } = $$props; + + function tick() { + $$invalidate(9, today = window.moment()); + } + + function getToday(settings) { + configureGlobalMomentLocale(settings.localeOverride, settings.weekStart); + dailyNotes.reindex(); + weeklyNotes.reindex(); + return window.moment(); + } + + // 1 minute heartbeat to keep `today` reflecting the current day + let heartbeat = setInterval( + () => { + tick(); + const isViewingCurrentMonth = displayedMonth.isSame(today, "day"); + + if (isViewingCurrentMonth) { + // if it's midnight on the last day of the month, this will + // update the display to show the new month. + $$invalidate(0, displayedMonth = today); + } + }, + 1000 * 60 + ); + + onDestroy(() => { + clearInterval(heartbeat); + }); + + function calendarbase_displayedMonth_binding(value) { + displayedMonth = value; + $$invalidate(0, displayedMonth); + } + + $$self.$$set = $$props => { + if ("displayedMonth" in $$props) $$invalidate(0, displayedMonth = $$props.displayedMonth); + if ("sources" in $$props) $$invalidate(1, sources = $$props.sources); + if ("onHoverDay" in $$props) $$invalidate(2, onHoverDay = $$props.onHoverDay); + if ("onHoverWeek" in $$props) $$invalidate(3, onHoverWeek = $$props.onHoverWeek); + if ("onClickDay" in $$props) $$invalidate(4, onClickDay = $$props.onClickDay); + if ("onClickWeek" in $$props) $$invalidate(5, onClickWeek = $$props.onClickWeek); + if ("onContextMenuDay" in $$props) $$invalidate(6, onContextMenuDay = $$props.onContextMenuDay); + if ("onContextMenuWeek" in $$props) $$invalidate(7, onContextMenuWeek = $$props.onContextMenuWeek); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*$settings*/ 256) { + $$invalidate(9, today = getToday($settings)); + } + }; + + return [ + displayedMonth, + sources, + onHoverDay, + onHoverWeek, + onClickDay, + onClickWeek, + onContextMenuDay, + onContextMenuWeek, + $settings, + today, + $activeFile, + tick, + calendarbase_displayedMonth_binding + ]; +} + +class Calendar extends SvelteComponent$1 { + constructor(options) { + super(); + + init$1(this, options, instance, create_fragment, not_equal$1, { + displayedMonth: 0, + sources: 1, + onHoverDay: 2, + onHoverWeek: 3, + onClickDay: 4, + onClickWeek: 5, + onContextMenuDay: 6, + onContextMenuWeek: 7, + tick: 11 + }); + } + + get tick() { + return this.$$.ctx[11]; + } +} + +function showFileMenu(app, file, position) { + const fileMenu = new obsidian.Menu(app); + fileMenu.addItem((item) => item + .setTitle("Delete") + .setIcon("trash") + .onClick(() => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + app.fileManager.promptForFileDeletion(file); + })); + app.workspace.trigger("file-menu", fileMenu, file, "calendar-context-menu", null); + fileMenu.showAtPosition(position); +} + +const getStreakClasses = (file) => { + return classList({ + "has-note": !!file, + }); +}; +const streakSource = { + getDailyMetadata: async (date) => { + const file = getDailyNote_1(date, get_store_value(dailyNotes)); + return { + classes: getStreakClasses(file), + dots: [], + }; + }, + getWeeklyMetadata: async (date) => { + const file = getWeeklyNote_1(date, get_store_value(weeklyNotes)); + return { + classes: getStreakClasses(file), + dots: [], + }; + }, +}; + +function getNoteTags(note) { + var _a; + if (!note) { + return []; + } + const { metadataCache } = window.app; + const frontmatter = (_a = metadataCache.getFileCache(note)) === null || _a === void 0 ? void 0 : _a.frontmatter; + const tags = []; + if (frontmatter) { + const frontmatterTags = obsidian.parseFrontMatterTags(frontmatter) || []; + tags.push(...frontmatterTags); + } + // strip the '#' at the beginning + return tags.map((tag) => tag.substring(1)); +} +function getFormattedTagAttributes(note) { + const attrs = {}; + const tags = getNoteTags(note); + const [emojiTags, nonEmojiTags] = partition(tags, (tag) => /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/.test(tag)); + if (nonEmojiTags) { + attrs["data-tags"] = nonEmojiTags.join(" "); + } + if (emojiTags) { + attrs["data-emoji-tag"] = emojiTags[0]; + } + return attrs; +} +const customTagsSource = { + getDailyMetadata: async (date) => { + const file = getDailyNote_1(date, get_store_value(dailyNotes)); + return { + dataAttributes: getFormattedTagAttributes(file), + dots: [], + }; + }, + getWeeklyMetadata: async (date) => { + const file = getWeeklyNote_1(date, get_store_value(weeklyNotes)); + return { + dataAttributes: getFormattedTagAttributes(file), + dots: [], + }; + }, +}; + +async function getNumberOfRemainingTasks(note) { + if (!note) { + return 0; + } + const { vault } = window.app; + const fileContents = await vault.cachedRead(note); + return (fileContents.match(/(-|\*) \[ \]/g) || []).length; +} +async function getDotsForDailyNote$1(dailyNote) { + if (!dailyNote) { + return []; + } + const numTasks = await getNumberOfRemainingTasks(dailyNote); + const dots = []; + if (numTasks) { + dots.push({ + className: "task", + color: "default", + isFilled: false, + }); + } + return dots; +} +const tasksSource = { + getDailyMetadata: async (date) => { + const file = getDailyNote_1(date, get_store_value(dailyNotes)); + const dots = await getDotsForDailyNote$1(file); + return { + dots, + }; + }, + getWeeklyMetadata: async (date) => { + const file = getWeeklyNote_1(date, get_store_value(weeklyNotes)); + const dots = await getDotsForDailyNote$1(file); + return { + dots, + }; + }, +}; + +const NUM_MAX_DOTS = 5; +async function getWordLengthAsDots(note) { + const { wordsPerDot = DEFAULT_WORDS_PER_DOT } = get_store_value(settings); + if (!note || wordsPerDot <= 0) { + return 0; + } + const fileContents = await window.app.vault.cachedRead(note); + const wordCount = getWordCount(fileContents); + const numDots = wordCount / wordsPerDot; + return clamp(Math.floor(numDots), 1, NUM_MAX_DOTS); +} +async function getDotsForDailyNote(dailyNote) { + if (!dailyNote) { + return []; + } + const numSolidDots = await getWordLengthAsDots(dailyNote); + const dots = []; + for (let i = 0; i < numSolidDots; i++) { + dots.push({ + color: "default", + isFilled: true, + }); + } + return dots; +} +const wordCountSource = { + getDailyMetadata: async (date) => { + const file = getDailyNote_1(date, get_store_value(dailyNotes)); + const dots = await getDotsForDailyNote(file); + return { + dots, + }; + }, + getWeeklyMetadata: async (date) => { + const file = getWeeklyNote_1(date, get_store_value(weeklyNotes)); + const dots = await getDotsForDailyNote(file); + return { + dots, + }; + }, +}; + +class CalendarView extends obsidian.ItemView { + constructor(leaf) { + super(leaf); + this.openOrCreateDailyNote = this.openOrCreateDailyNote.bind(this); + this.openOrCreateWeeklyNote = this.openOrCreateWeeklyNote.bind(this); + this.onNoteSettingsUpdate = this.onNoteSettingsUpdate.bind(this); + this.onFileCreated = this.onFileCreated.bind(this); + this.onFileDeleted = this.onFileDeleted.bind(this); + this.onFileModified = this.onFileModified.bind(this); + this.onFileOpen = this.onFileOpen.bind(this); + this.onHoverDay = this.onHoverDay.bind(this); + this.onHoverWeek = this.onHoverWeek.bind(this); + this.onContextMenuDay = this.onContextMenuDay.bind(this); + this.onContextMenuWeek = this.onContextMenuWeek.bind(this); + this.registerEvent( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.app.workspace.on("periodic-notes:settings-updated", this.onNoteSettingsUpdate)); + this.registerEvent(this.app.vault.on("create", this.onFileCreated)); + this.registerEvent(this.app.vault.on("delete", this.onFileDeleted)); + this.registerEvent(this.app.vault.on("modify", this.onFileModified)); + this.registerEvent(this.app.workspace.on("file-open", this.onFileOpen)); + this.settings = null; + settings.subscribe((val) => { + this.settings = val; + // Refresh the calendar if settings change + if (this.calendar) { + this.calendar.tick(); + } + }); + } + getViewType() { + return VIEW_TYPE_CALENDAR; + } + getDisplayText() { + return "Calendar"; + } + getIcon() { + return "calendar-with-checkmark"; + } + onClose() { + if (this.calendar) { + this.calendar.$destroy(); + } + return Promise.resolve(); + } + async onOpen() { + // Integration point: external plugins can listen for `calendar:open` + // to feed in additional sources. + const sources = [ + customTagsSource, + streakSource, + wordCountSource, + tasksSource, + ]; + this.app.workspace.trigger(TRIGGER_ON_OPEN, sources); + this.calendar = new Calendar({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + target: this.contentEl, + props: { + onClickDay: this.openOrCreateDailyNote, + onClickWeek: this.openOrCreateWeeklyNote, + onHoverDay: this.onHoverDay, + onHoverWeek: this.onHoverWeek, + onContextMenuDay: this.onContextMenuDay, + onContextMenuWeek: this.onContextMenuWeek, + sources, + }, + }); + } + onHoverDay(date, targetEl, isMetaPressed) { + if (!isMetaPressed) { + return; + } + const { format } = getDailyNoteSettings_1(); + const note = getDailyNote_1(date, get_store_value(dailyNotes)); + this.app.workspace.trigger("link-hover", this, targetEl, date.format(format), note === null || note === void 0 ? void 0 : note.path); + } + onHoverWeek(date, targetEl, isMetaPressed) { + if (!isMetaPressed) { + return; + } + const note = getWeeklyNote_1(date, get_store_value(weeklyNotes)); + const { format } = getWeeklyNoteSettings_1(); + this.app.workspace.trigger("link-hover", this, targetEl, date.format(format), note === null || note === void 0 ? void 0 : note.path); + } + onContextMenuDay(date, event) { + const note = getDailyNote_1(date, get_store_value(dailyNotes)); + if (!note) { + // If no file exists for a given day, show nothing. + return; + } + showFileMenu(this.app, note, { + x: event.pageX, + y: event.pageY, + }); + } + onContextMenuWeek(date, event) { + const note = getWeeklyNote_1(date, get_store_value(weeklyNotes)); + if (!note) { + // If no file exists for a given day, show nothing. + return; + } + showFileMenu(this.app, note, { + x: event.pageX, + y: event.pageY, + }); + } + onNoteSettingsUpdate() { + dailyNotes.reindex(); + weeklyNotes.reindex(); + this.updateActiveFile(); + } + async onFileDeleted(file) { + if (getDateFromFile_1(file, "day")) { + dailyNotes.reindex(); + this.updateActiveFile(); + } + if (getDateFromFile_1(file, "week")) { + weeklyNotes.reindex(); + this.updateActiveFile(); + } + } + async onFileModified(file) { + const date = getDateFromFile_1(file, "day") || getDateFromFile_1(file, "week"); + if (date && this.calendar) { + this.calendar.tick(); + } + } + onFileCreated(file) { + if (this.app.workspace.layoutReady && this.calendar) { + if (getDateFromFile_1(file, "day")) { + dailyNotes.reindex(); + this.calendar.tick(); + } + if (getDateFromFile_1(file, "week")) { + weeklyNotes.reindex(); + this.calendar.tick(); + } + } + } + onFileOpen(_file) { + if (this.app.workspace.layoutReady) { + this.updateActiveFile(); + } + } + updateActiveFile() { + const { view } = this.app.workspace.activeLeaf; + let file = null; + if (view instanceof obsidian.FileView) { + file = view.file; + } + activeFile.setFile(file); + if (this.calendar) { + this.calendar.tick(); + } + } + revealActiveNote() { + const { moment } = window; + const { activeLeaf } = this.app.workspace; + if (activeLeaf.view instanceof obsidian.FileView) { + // Check to see if the active note is a daily-note + let date = getDateFromFile_1(activeLeaf.view.file, "day"); + if (date) { + this.calendar.$set({ displayedMonth: date }); + return; + } + // Check to see if the active note is a weekly-note + const { format } = getWeeklyNoteSettings_1(); + date = moment(activeLeaf.view.file.basename, format, true); + if (date.isValid()) { + this.calendar.$set({ displayedMonth: date }); + return; + } + } + } + async openOrCreateWeeklyNote(date, inNewSplit) { + const { workspace } = this.app; + const startOfWeek = date.clone().startOf("week"); + const existingFile = getWeeklyNote_1(date, get_store_value(weeklyNotes)); + if (!existingFile) { + // File doesn't exist + tryToCreateWeeklyNote(startOfWeek, inNewSplit, this.settings, (file) => { + activeFile.setFile(file); + }); + return; + } + const leaf = inNewSplit + ? workspace.splitActiveLeaf() + : workspace.getUnpinnedLeaf(); + await leaf.openFile(existingFile); + activeFile.setFile(existingFile); + } + async openOrCreateDailyNote(date, inNewSplit) { + const { workspace } = this.app; + const existingFile = getDailyNote_1(date, get_store_value(dailyNotes)); + if (!existingFile) { + // File doesn't exist + tryToCreateDailyNote(date, inNewSplit, this.settings, (dailyNote) => { + activeFile.setFile(dailyNote); + }); + return; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const mode = this.app.vault.getConfig("defaultViewMode"); + const leaf = inNewSplit + ? workspace.splitActiveLeaf() + : workspace.getUnpinnedLeaf(); + await leaf.openFile(existingFile, { mode }); + activeFile.setFile(existingFile); + } +} + +class CalendarPlugin extends obsidian.Plugin { + onunload() { + this.app.workspace + .getLeavesOfType(VIEW_TYPE_CALENDAR) + .forEach((leaf) => leaf.detach()); + } + async onload() { + this.register(settings.subscribe((value) => { + this.options = value; + })); + this.registerView(VIEW_TYPE_CALENDAR, (leaf) => (this.view = new CalendarView(leaf))); + this.addCommand({ + id: "show-calendar-view", + name: "Open view", + checkCallback: (checking) => { + if (checking) { + return (this.app.workspace.getLeavesOfType(VIEW_TYPE_CALENDAR).length === 0); + } + this.initLeaf(); + }, + }); + this.addCommand({ + id: "open-weekly-note", + name: "Open Weekly Note", + checkCallback: (checking) => { + if (checking) { + return !appHasPeriodicNotesPluginLoaded(); + } + this.view.openOrCreateWeeklyNote(window.moment(), false); + }, + }); + this.addCommand({ + id: "reveal-active-note", + name: "Reveal active note", + callback: () => this.view.revealActiveNote(), + }); + await this.loadOptions(); + this.addSettingTab(new CalendarSettingsTab(this.app, this)); + if (this.app.workspace.layoutReady) { + this.initLeaf(); + } + else { + this.registerEvent(this.app.workspace.on("layout-ready", this.initLeaf.bind(this))); + } + } + initLeaf() { + if (this.app.workspace.getLeavesOfType(VIEW_TYPE_CALENDAR).length) { + return; + } + this.app.workspace.getRightLeaf(false).setViewState({ + type: VIEW_TYPE_CALENDAR, + }); + } + async loadOptions() { + const options = await this.loadData(); + settings.update((old) => { + return Object.assign(Object.assign({}, old), (options || {})); + }); + await this.saveData(this.options); + } + async writeOptions(changeOpts) { + settings.update((old) => (Object.assign(Object.assign({}, old), changeOpts(old)))); + await this.saveData(this.options); + } +} + +module.exports = CalendarPlugin; diff --git a/enter/.obsidian/plugins/calendar/manifest.json b/enter/.obsidian/plugins/calendar/manifest.json new file mode 100644 index 0000000..028bfa5 --- /dev/null +++ b/enter/.obsidian/plugins/calendar/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "calendar", + "name": "Calendar", + "description": "Calendar view of your daily notes", + "version": "1.5.10", + "author": "Liam Cain", + "authorUrl": "https://github.com/liamcain/", + "isDesktopOnly": false, + "minAppVersion": "0.9.11" +} diff --git a/enter/.obsidian/plugins/heatmap-calendar/main.js b/enter/.obsidian/plugins/heatmap-calendar/main.js new file mode 100644 index 0000000..9524116 --- /dev/null +++ b/enter/.obsidian/plugins/heatmap-calendar/main.js @@ -0,0 +1,349 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +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 +var main_exports = {}; +__export(main_exports, { + default: () => HeatmapCalendar +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian2 = require("obsidian"); + +// settings.ts +var import_obsidian = require("obsidian"); +var HeatmapCalendarSettingsTab = class extends import_obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + addColorMap(color) { + return __async(this, null, function* () { + const isValid = { key: true, value: true }; + if (!color.key) + isValid.key = false; + const validatedArray = this.validateColorInput(color.value); + if (!validatedArray) + isValid.value = false; + if (isValid.key && isValid.value) { + this.plugin.settings.colors[color.key] = validatedArray; + yield this.plugin.saveSettings(); + this.display(); + } + return isValid; + }); + } + deleteColorMap(key) { + return __async(this, null, function* () { + delete this.plugin.settings.colors[key]; + yield this.plugin.saveSettings(); + this.display(); + }); + } + displayColorSettings() { + const { containerEl } = this; + containerEl.createEl("h3", { text: "Colors" }); + this.displayColorHelp(containerEl); + for (const [key, colors] of Object.entries(this.plugin.settings.colors)) { + const colorEntryContainer = containerEl.createDiv({ + cls: "heatmap-calendar-settings-colors__container" + }); + const colorDataContainer = colorEntryContainer.createDiv({ + cls: "heatmap-calendar-settings-colors__data-container" + }); + colorDataContainer.createEl("h4", { text: key }); + const colorRow = colorDataContainer.createDiv({ cls: "heatmap-calendar-settings-colors__row" }); + const colorsContainer = colorRow.createDiv({ cls: "heatmap-calendar-settings-colors__color-container" }); + for (const color of colors) { + colorsContainer.createEl("div", { + cls: "heatmap-calendar-settings-colors__color-box", + attr: { + style: `background-color: ${color}` + } + }); + colorsContainer.createEl("pre", { + cls: "heatmap-calendar-settings-colors__color-name", + text: color + }); + } + if (key !== "default") { + const deleteColorButton = colorEntryContainer.createEl("button", { + cls: "mod-warning heatmap-calendar-settings-colors__delete" + }); + (0, import_obsidian.setIcon)(deleteColorButton, "trash"); + deleteColorButton.addEventListener("click", () => this.deleteColorMap(key)); + } + } + this.displayColorInput(containerEl); + } + displayColorInput(parent) { + const inputContainer = parent.createDiv({ cls: "heatmap-calendar-settings-colors__new-color-input-container" }); + const colorNameInput = inputContainer.createEl("input", { + cls: "heatmap-calendar-settings-colors__new-color-input-name", + attr: { placeholder: "Color name", type: "text" } + }); + const colorValueInput = inputContainer.createEl("input", { + cls: "heatmap-calendar-settings-colors__new-color-input-value", + attr: { placeholder: "Colors array", type: "text" } + }); + const addColorButton = inputContainer.createEl("button", { + cls: "mod-cta heatmap-calendar-settings-colors__new-color-button" + }); + (0, import_obsidian.setIcon)(addColorButton, "plus"); + addColorButton.addEventListener("click", () => __async(this, null, function* () { + const isValid = yield this.addColorMap({ + key: colorNameInput.value, + value: colorValueInput.value + }); + this.reportInputValidity(colorNameInput, isValid.key, "Please input a name for your color"); + this.reportInputValidity(colorValueInput, isValid.value, "Color is not a valid JSON array of colors"); + })); + } + displayColorHelp(parent) { + parent.createEl("p", { + text: "Add lists of colors which will be globally available on your heatmaps." + }); + parent.createEl("p", { + text: "You can use those colors by referencing their name in your heatmap render settings." + }); + } + reportInputValidity(input, isValid, msg) { + if (!isValid) { + input.classList.add("has-error"); + input.setCustomValidity(msg); + } else + input.setCustomValidity(""); + input.reportValidity(); + } + validateColorInput(value) { + const colorRegex = /^(#[0-9a-f]{3,6}|rgba?\(\s*\d+%?\s*,\s*\d+%?\s*,\s*\d+%?\s*(,\s*\d+(\.\d+)?%?)?\s*\))$/i; + try { + const data = JSON.parse(value); + if (!Array.isArray(data)) + return false; + return data.every((color) => colorRegex.test(color)) ? data : false; + } catch (e) { + return false; + } + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h2", { text: "Heatmap Calendar Settings" }); + this.displayColorSettings(); + console.log("settings", this.plugin.settings); + } +}; + +// main.ts +var DEFAULT_SETTINGS = { + year: new Date().getFullYear(), + colors: { + default: ["#c6e48b", "#7bc96f", "#49af5d", "#2e8840", "#196127"] + }, + entries: [{ date: "1900-01-01", color: "#7bc96f", intensity: 5, content: "" }], + showCurrentDayBorder: true, + defaultEntryIntensity: 4, + intensityScaleStart: 1, + intensityScaleEnd: 5 +}; +var HeatmapCalendar = class extends import_obsidian2.Plugin { + getHowManyDaysIntoYear(date) { + return (Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()) - Date.UTC(date.getUTCFullYear(), 0, 0)) / 24 / 60 / 60 / 1e3; + } + getHowManyDaysIntoYearLocal(date) { + return (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) - Date.UTC(date.getFullYear(), 0, 0)) / 24 / 60 / 60 / 1e3; + } + removeHtmlElementsNotInYear(entries, year) { + var _a; + const calEntriesNotInDisplayedYear = (_a = entries.filter((e) => new Date(e.date).getFullYear() !== year)) != null ? _a : this.settings.entries; + calEntriesNotInDisplayedYear.forEach((e) => e.content instanceof HTMLElement && e.content.remove()); + } + clamp(input, min, max) { + return input < min ? min : input > max ? max : input; + } + map(current, inMin, inMax, outMin, outMax) { + const mapped = (current - inMin) * (outMax - outMin) / (inMax - inMin) + outMin; + return this.clamp(mapped, outMin, outMax); + } + onload() { + return __async(this, null, function* () { + yield this.loadSettings(); + this.addSettingTab(new HeatmapCalendarSettingsTab(this.app, this)); + window.renderHeatmapCalendar = (el, calendarData) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j; + const year = (_a = calendarData.year) != null ? _a : this.settings.year; + const colors = typeof calendarData.colors === "string" ? this.settings.colors[calendarData.colors] ? { [calendarData.colors]: this.settings.colors[calendarData.colors] } : this.settings.colors : (_b = calendarData.colors) != null ? _b : this.settings.colors; + this.removeHtmlElementsNotInYear(calendarData.entries, year); + const calEntries = (_c = calendarData.entries.filter((e) => new Date(e.date + "T00:00").getFullYear() === year)) != null ? _c : this.settings.entries; + const showCurrentDayBorder = (_d = calendarData.showCurrentDayBorder) != null ? _d : this.settings.showCurrentDayBorder; + const defaultEntryIntensity = (_e = calendarData.defaultEntryIntensity) != null ? _e : this.settings.defaultEntryIntensity; + const intensities = calEntries.filter((e) => e.intensity).map((e) => e.intensity); + const minimumIntensity = intensities.length ? Math.min(...intensities) : this.settings.intensityScaleStart; + const maximumIntensity = intensities.length ? Math.max(...intensities) : this.settings.intensityScaleEnd; + const intensityScaleStart = (_f = calendarData.intensityScaleStart) != null ? _f : minimumIntensity; + const intensityScaleEnd = (_g = calendarData.intensityScaleEnd) != null ? _g : maximumIntensity; + const mappedEntries = []; + calEntries.forEach((e) => { + var _a2; + const newEntry = __spreadValues({ + intensity: defaultEntryIntensity + }, e); + const colorIntensities = typeof colors === "string" ? this.settings.colors[colors] : (_a2 = colors[e.color]) != null ? _a2 : colors[Object.keys(colors)[0]]; + const numOfColorIntensities = Object.keys(colorIntensities).length; + if (minimumIntensity === maximumIntensity && intensityScaleStart === intensityScaleEnd) + newEntry.intensity = numOfColorIntensities; + else + newEntry.intensity = Math.round(this.map(newEntry.intensity, intensityScaleStart, intensityScaleEnd, 1, numOfColorIntensities)); + mappedEntries[this.getHowManyDaysIntoYear(new Date(e.date))] = newEntry; + }); + const firstDayOfYear = new Date(Date.UTC(year, 0, 1)); + let numberOfEmptyDaysBeforeYearBegins = (firstDayOfYear.getUTCDay() + 6) % 7; + const boxes = []; + while (numberOfEmptyDaysBeforeYearBegins) { + boxes.push({ backgroundColor: "transparent" }); + numberOfEmptyDaysBeforeYearBegins--; + } + const lastDayOfYear = new Date(Date.UTC(year, 11, 31)); + const numberOfDaysInYear = this.getHowManyDaysIntoYear(lastDayOfYear); + const todaysDayNumberLocal = this.getHowManyDaysIntoYearLocal(new Date()); + for (let day = 1; day <= numberOfDaysInYear; day++) { + const box = { + classNames: [] + }; + if (day === todaysDayNumberLocal && showCurrentDayBorder) + (_h = box.classNames) == null ? void 0 : _h.push("today"); + if (mappedEntries[day]) { + (_i = box.classNames) == null ? void 0 : _i.push("hasData"); + const entry = mappedEntries[day]; + box.date = entry.date; + if (entry.content) + box.content = entry.content; + const currentDayColors = entry.color ? colors[entry.color] : colors[Object.keys(colors)[0]]; + box.backgroundColor = currentDayColors[entry.intensity - 1]; + } else + (_j = box.classNames) == null ? void 0 : _j.push("isEmpty"); + boxes.push(box); + } + const heatmapCalendarGraphDiv = createDiv({ + cls: "heatmap-calendar-graph", + parent: el + }); + createDiv({ + cls: "heatmap-calendar-year", + text: String(year).slice(2), + parent: heatmapCalendarGraphDiv + }); + const heatmapCalendarMonthsUl = createEl("ul", { + cls: "heatmap-calendar-months", + parent: heatmapCalendarGraphDiv + }); + createEl("li", { text: "Jan", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Feb", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Mar", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Apr", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "May", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Jun", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Jul", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Aug", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Sep", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Oct", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Nov", parent: heatmapCalendarMonthsUl }); + createEl("li", { text: "Dec", parent: heatmapCalendarMonthsUl }); + const heatmapCalendarDaysUl = createEl("ul", { + cls: "heatmap-calendar-days", + parent: heatmapCalendarGraphDiv + }); + createEl("li", { text: "Mon", parent: heatmapCalendarDaysUl }); + createEl("li", { text: "Tue", parent: heatmapCalendarDaysUl }); + createEl("li", { text: "Wed", parent: heatmapCalendarDaysUl }); + createEl("li", { text: "Thu", parent: heatmapCalendarDaysUl }); + createEl("li", { text: "Fri", parent: heatmapCalendarDaysUl }); + createEl("li", { text: "Sat", parent: heatmapCalendarDaysUl }); + createEl("li", { text: "Sun", parent: heatmapCalendarDaysUl }); + const heatmapCalendarBoxesUl = createEl("ul", { + cls: "heatmap-calendar-boxes", + parent: heatmapCalendarGraphDiv + }); + boxes.forEach((e) => { + const entry = createEl("li", { + attr: __spreadValues(__spreadValues({}, e.backgroundColor && { style: `background-color: ${e.backgroundColor};` }), e.date && { "data-date": e.date }), + cls: e.classNames, + parent: heatmapCalendarBoxesUl + }); + createSpan({ + cls: "heatmap-calendar-content", + parent: entry, + text: e.content + }); + }); + }; + }); + } + onunload() { + } + loadSettings() { + return __async(this, null, function* () { + console.log("heyoh", yield this.loadData()); + this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); + }); + } + saveSettings() { + return __async(this, null, function* () { + yield this.saveData(this.settings); + }); + } +}; diff --git a/enter/.obsidian/plugins/heatmap-calendar/manifest.json b/enter/.obsidian/plugins/heatmap-calendar/manifest.json new file mode 100644 index 0000000..bf26c82 --- /dev/null +++ b/enter/.obsidian/plugins/heatmap-calendar/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "heatmap-calendar", + "name": "Heatmap Calendar", + "version": "0.6.0", + "minAppVersion": "0.12.0", + "description": "Activity Year Overview for DataviewJS, Github style – Track Goals, Progress, Habits, Tasks, Exercise, Finances, \"Dont Break the Chain\" etc.", + "author": "Richard Slettevoll", + "authorUrl": "https://richard.sl", + "isDesktopOnly": false +} \ No newline at end of file diff --git a/enter/.obsidian/plugins/heatmap-calendar/styles.css b/enter/.obsidian/plugins/heatmap-calendar/styles.css new file mode 100644 index 0000000..1f81dd8 --- /dev/null +++ b/enter/.obsidian/plugins/heatmap-calendar/styles.css @@ -0,0 +1,132 @@ +/* Obsidian/DataviewJS Github inspired calendar by Richard Slettevoll - https://richard.sl/ */ + +.heatmap-calendar-graph>* { + padding: 0px; + margin: 0px; + list-style: none; +} + +.heatmap-calendar-graph { + font-size: 0.65em; + display: grid; + grid-template-columns: auto 1fr; + grid-template-areas: + 'year months' + 'days boxes'; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, + Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol'; + width: 100%; +} + +.heatmap-calendar-months { + display: grid; + grid-template-columns: repeat(12, minmax(0, 1fr)); + grid-area: months; + margin-top: 0.1em; + margin-bottom: 0.3em; + grid-gap: 0.3em; +} + +.heatmap-calendar-days { + grid-area: days; + margin-left: 0.1em; + margin-right: 0.3em; + white-space: nowrap; +} + +.heatmap-calendar-boxes { + grid-auto-flow: column; + grid-template-columns: repeat(53, minmax(0, 1fr)); + grid-area: boxes; +} + +.heatmap-calendar-days, +.heatmap-calendar-boxes { + display: grid; + grid-gap: 0.3em; + grid-template-rows: repeat(7, minmax(0, 1fr)); +} + +.heatmap-calendar-year { + grid-area: year; + font-weight: bold; + font-size: 1.2em; +} + +/* only label three days of the week */ +.heatmap-calendar-days li:nth-child(odd) { + visibility: hidden; +} + +.heatmap-calendar-boxes li { + position: relative; + font-size: 0.75em; + background-color: #ebedf0; +} + +.theme-dark .heatmap-calendar-boxes .isEmpty { + background: #333; +} + +.heatmap-calendar-boxes li:not(.task-list-item)::before { + content: unset; +} + +.heatmap-calendar-boxes .internal-link { + text-decoration: none; + position: absolute; + width: 100%; + height: 100%; + text-align: center; +} + +.heatmap-calendar-boxes .today { + border: solid 1px rgb(61, 61, 61); +} + +/* Settings */ + +.heatmap-calendar-settings-colors__color-box { + width: 10px; + height: 10px; + display: inline-block; + margin: 0 5px; +} + +.heatmap-calendar-settings-colors__color-box:first-child { + margin-left: 0; +} + +.heatmap-calendar-settings-colors__color-name { + display: inline-block; +} + +.heatmap-calendar-settings-colors__container { + align-items: center; + border-top: 1px solid var(--background-modifier-border); + display: flex; + justify-content: space-between; + padding: 0.5em 0; +} + +.heatmap-calendar-settings-colors__container h4 { + margin: 0.5em 0; +} + +.heatmap-calendar-settings-colors__new-color-input-container { + display: flex; + justify-content: space-between; +} + +.heatmap-calendar-settings-colors__new-color-input-container input { + margin-right: 1em; +} + +.heatmap-calendar-settings-colors__new-color-input-container input { + margin-right: 1em; +} + +.heatmap-calendar-settings-colors__new-color-input-value { + flex-grow: 1; +} diff --git a/enter/.obsidian/plugins/obsidian-charts/main.js b/enter/.obsidian/plugins/obsidian-charts/main.js new file mode 100644 index 0000000..7d5e8d1 --- /dev/null +++ b/enter/.obsidian/plugins/obsidian-charts/main.js @@ -0,0 +1,213 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source visit the plugins github repository (https://github.com/phibr0/obsidian-dictionary) +*/ + +var ob=Object.create;var Hi=Object.defineProperty,ab=Object.defineProperties,lb=Object.getOwnPropertyDescriptor,cb=Object.getOwnPropertyDescriptors,hb=Object.getOwnPropertyNames,Us=Object.getOwnPropertySymbols,ub=Object.getPrototypeOf,Yo=Object.prototype.hasOwnProperty,Vc=Object.prototype.propertyIsEnumerable;var Yc=(n,t,e)=>t in n?Hi(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,Nn=(n,t)=>{for(var e in t||(t={}))Yo.call(t,e)&&Yc(n,e,t[e]);if(Us)for(var e of Us(t))Vc.call(t,e)&&Yc(n,e,t[e]);return n},_i=(n,t)=>ab(n,cb(t)),Xc=n=>Hi(n,"__esModule",{value:!0});var qc=(n,t)=>{var e={};for(var i in n)Yo.call(n,i)&&t.indexOf(i)<0&&(e[i]=n[i]);if(n!=null&&Us)for(var i of Us(n))t.indexOf(i)<0&&Vc.call(n,i)&&(e[i]=n[i]);return e};var Xo=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports),fb=(n,t)=>{Xc(n);for(var e in t)Hi(n,e,{get:t[e],enumerable:!0})},db=(n,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of hb(t))!Yo.call(n,i)&&i!=="default"&&Hi(n,i,{get:()=>t[i],enumerable:!(e=lb(t,i))||e.enumerable});return n},ze=n=>db(Xc(Hi(n!=null?ob(ub(n)):{},"default",n&&n.__esModule&&"default"in n?{get:()=>n.default,enumerable:!0}:{value:n,enumerable:!0})),n);var Ku=Xo((qa,Ga)=>{(function(n,t){typeof qa=="object"&&typeof Ga!="undefined"?Ga.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis!="undefined"?globalThis:n||self,n.chroma=t())})(qa,function(){"use strict";for(var n=function(u,d,b){return d===void 0&&(d=0),b===void 0&&(b=1),ub?b:u},t=n,e=function(u){u._clipped=!1,u._unclipped=u.slice(0);for(var d=0;d<=3;d++)d<3?((u[d]<0||u[d]>255)&&(u._clipped=!0),u[d]=t(u[d],0,255)):d===3&&(u[d]=t(u[d],0,1));return u},i={},s=0,r=["Boolean","Number","String","Function","Array","Date","RegExp","Undefined","Null"];s=3?Array.prototype.slice.call(u):l(u[0])=="object"&&d?d.split("").filter(function(b){return u[0][b]!==void 0}).map(function(b){return u[0][b]}):u[0]},h=a,f=function(u){if(u.length<2)return null;var d=u.length-1;return h(u[d])=="string"?u[d].toLowerCase():null},g=Math.PI,p={clip_rgb:e,limit:n,type:a,unpack:c,last:f,PI:g,TWOPI:g*2,PITHIRD:g/3,DEG2RAD:g/180,RAD2DEG:180/g},m={format:{},autodetect:[]},y=p.last,S=p.clip_rgb,M=p.type,C=m,F=function(){for(var d=[],b=arguments.length;b--;)d[b]=arguments[b];var _=this;if(M(d[0])==="object"&&d[0].constructor&&d[0].constructor===this.constructor)return d[0];var P=y(d),T=!1;if(!P){T=!0,C.sorted||(C.autodetect=C.autodetect.sort(function(B,q){return q.p-B.p}),C.sorted=!0);for(var w=0,A=C.autodetect;w4?u[4]:1;return T===1?[0,0,0,w]:[b>=1?0:255*(1-b)*(1-T),_>=1?0:255*(1-_)*(1-T),P>=1?0:255*(1-P)*(1-T),w]},Pt=rt,zt=$,et=D,Et=m,St=p.unpack,re=p.type,ye=it;et.prototype.cmyk=function(){return ye(this._rgb)},zt.cmyk=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(et,[null].concat(u,["cmyk"])))},Et.format.cmyk=Pt,Et.autodetect.push({p:2,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=St(u,"cmyk"),re(u)==="array"&&u.length===4)return"cmyk"}});var ot=p.unpack,Lt=p.last,Bt=function(u){return Math.round(u*100)/100},Ut=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=ot(u,"hsla"),_=Lt(u)||"lsa";return b[0]=Bt(b[0]||0),b[1]=Bt(b[1]*100)+"%",b[2]=Bt(b[2]*100)+"%",_==="hsla"||b.length>3&&b[3]<1?(b[3]=b.length>3?b[3]:1,_="hsla"):b.length=3,_+"("+b.join(",")+")"},Qt=Ut,k=p.unpack,v=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];u=k(u,"rgba");var b=u[0],_=u[1],P=u[2];b/=255,_/=255,P/=255;var T=Math.min(b,_,P),w=Math.max(b,_,P),A=(w+T)/2,L,j;return w===T?(L=0,j=Number.NaN):L=A<.5?(w-T)/(w+T):(w-T)/(2-w-T),b==w?j=(_-P)/(w-T):_==w?j=2+(P-b)/(w-T):P==w&&(j=4+(b-_)/(w-T)),j*=60,j<0&&(j+=360),u.length>3&&u[3]!==void 0?[j,L,A,u[3]]:[j,L,A]},x=v,R=p.unpack,E=p.last,O=Qt,Z=x,V=Math.round,J=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=R(u,"rgba"),_=E(u)||"rgb";return _.substr(0,3)=="hsl"?O(Z(b),_):(b[0]=V(b[0]),b[1]=V(b[1]),b[2]=V(b[2]),(_==="rgba"||b.length>3&&b[3]<1)&&(b[3]=b.length>3?b[3]:1,_="rgba"),_+"("+b.slice(0,_==="rgb"?3:4).join(",")+")")},tt=J,xt=p.unpack,Ht=Math.round,Ot=function(){for(var u,d=[],b=arguments.length;b--;)d[b]=arguments[b];d=xt(d,"hsl");var _=d[0],P=d[1],T=d[2],w,A,L;if(P===0)w=A=L=T*255;else{var j=[0,0,0],B=[0,0,0],q=T<.5?T*(1+P):T+P-T*P,H=2*T-q,Q=_/360;j[0]=Q+1/3,j[1]=Q,j[2]=Q-1/3;for(var K=0;K<3;K++)j[K]<0&&(j[K]+=1),j[K]>1&&(j[K]-=1),6*j[K]<1?B[K]=H+(q-H)*6*j[K]:2*j[K]<1?B[K]=q:3*j[K]<2?B[K]=H+(q-H)*(2/3-j[K])*6:B[K]=H;u=[Ht(B[0]*255),Ht(B[1]*255),Ht(B[2]*255)],w=u[0],A=u[1],L=u[2]}return d.length>3?[w,A,L,d[3]]:[w,A,L,1]},Yt=Ot,Xt=Yt,ue=m,ke=/^rgb\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*\)$/,xe=/^rgba\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*,\s*([01]|[01]?\.\d+)\)$/,Rn=/^rgb\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/,un=/^rgba\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/,Ln=/^hsl\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/,je=/^hsla\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/,$i=Math.round,Fn=function(u){u=u.toLowerCase().trim();var d;if(ue.format.named)try{return ue.format.named(u)}catch(K){}if(d=u.match(ke)){for(var b=d.slice(1,4),_=0;_<3;_++)b[_]=+b[_];return b[3]=1,b}if(d=u.match(xe)){for(var P=d.slice(1,5),T=0;T<4;T++)P[T]=+P[T];return P}if(d=u.match(Rn)){for(var w=d.slice(1,4),A=0;A<3;A++)w[A]=$i(w[A]*2.55);return w[3]=1,w}if(d=u.match(un)){for(var L=d.slice(1,5),j=0;j<3;j++)L[j]=$i(L[j]*2.55);return L[3]=+L[3],L}if(d=u.match(Ln)){var B=d.slice(1,4);B[1]*=.01,B[2]*=.01;var q=Xt(B);return q[3]=1,q}if(d=u.match(je)){var H=d.slice(1,4);H[1]*=.01,H[2]*=.01;var Q=Xt(H);return Q[3]=+d[4],Q}};Fn.test=function(u){return ke.test(u)||xe.test(u)||Rn.test(u)||un.test(u)||Ln.test(u)||je.test(u)};var oi=Fn,$s=$,ji=D,ai=m,qe=p.type,In=tt,$n=oi;ji.prototype.css=function(u){return In(this._rgb,u)},$s.css=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(ji,[null].concat(u,["css"])))},ai.format.css=$n,ai.autodetect.push({p:5,test:function(u){for(var d=[],b=arguments.length-1;b-- >0;)d[b]=arguments[b+1];if(!d.length&&qe(u)==="string"&&$n.test(u))return"css"}});var li=D,js=$,fn=m,ce=p.unpack;fn.format.gl=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=ce(u,"rgba");return b[0]*=255,b[1]*=255,b[2]*=255,b},js.gl=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(li,[null].concat(u,["gl"])))},li.prototype.gl=function(){var u=this._rgb;return[u[0]/255,u[1]/255,u[2]/255,u[3]]};var bt=p.unpack,te=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=bt(u,"rgb"),_=b[0],P=b[1],T=b[2],w=Math.min(_,P,T),A=Math.max(_,P,T),L=A-w,j=L*100/255,B=w/(255-L)*100,q;return L===0?q=Number.NaN:(_===A&&(q=(P-T)/L),P===A&&(q=2+(T-_)/L),T===A&&(q=4+(_-P)/L),q*=60,q<0&&(q+=360)),[q,j,B]},dn=te,pe=p.unpack,zs=Math.floor,vd=function(){for(var u,d,b,_,P,T,w=[],A=arguments.length;A--;)w[A]=arguments[A];w=pe(w,"hcg");var L=w[0],j=w[1],B=w[2],q,H,Q;B=B*255;var K=j*255;if(j===0)q=H=Q=B;else{L===360&&(L=0),L>360&&(L-=360),L<0&&(L+=360),L/=60;var ct=zs(L),mt=L-ct,_t=B*(1-j),Mt=_t+K*(1-mt),oe=_t+K*mt,ne=_t+K;switch(ct){case 0:u=[ne,oe,_t],q=u[0],H=u[1],Q=u[2];break;case 1:d=[Mt,ne,_t],q=d[0],H=d[1],Q=d[2];break;case 2:b=[_t,ne,oe],q=b[0],H=b[1],Q=b[2];break;case 3:_=[_t,Mt,ne],q=_[0],H=_[1],Q=_[2];break;case 4:P=[oe,_t,ne],q=P[0],H=P[1],Q=P[2];break;case 5:T=[ne,_t,Mt],q=T[0],H=T[1],Q=T[2];break}}return[q,H,Q,w.length>3?w[3]:1]},_d=vd,yd=p.unpack,xd=p.type,wd=$,Al=D,Rl=m,kd=dn;Al.prototype.hcg=function(){return kd(this._rgb)},wd.hcg=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Al,[null].concat(u,["hcg"])))},Rl.format.hcg=_d,Rl.autodetect.push({p:1,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=yd(u,"hcg"),xd(u)==="array"&&u.length===3)return"hcg"}});var Sd=p.unpack,Md=p.last,Bs=Math.round,Cd=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=Sd(u,"rgba"),_=b[0],P=b[1],T=b[2],w=b[3],A=Md(u)||"auto";w===void 0&&(w=1),A==="auto"&&(A=w<1?"rgba":"rgb"),_=Bs(_),P=Bs(P),T=Bs(T);var L=_<<16|P<<8|T,j="000000"+L.toString(16);j=j.substr(j.length-6);var B="0"+Bs(w*255).toString(16);switch(B=B.substr(B.length-2),A.toLowerCase()){case"rgba":return"#"+j+B;case"argb":return"#"+B+j;default:return"#"+j}},Ll=Cd,Pd=/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,Td=/^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/,Dd=function(u){if(u.match(Pd)){(u.length===4||u.length===7)&&(u=u.substr(1)),u.length===3&&(u=u.split(""),u=u[0]+u[0]+u[1]+u[1]+u[2]+u[2]);var d=parseInt(u,16),b=d>>16,_=d>>8&255,P=d&255;return[b,_,P,1]}if(u.match(Td)){(u.length===5||u.length===9)&&(u=u.substr(1)),u.length===4&&(u=u.split(""),u=u[0]+u[0]+u[1]+u[1]+u[2]+u[2]+u[3]+u[3]);var T=parseInt(u,16),w=T>>24&255,A=T>>16&255,L=T>>8&255,j=Math.round((T&255)/255*100)/100;return[w,A,L,j]}throw new Error("unknown hex color: "+u)},Fl=Dd,Ed=$,Il=D,Od=p.type,$l=m,Ad=Ll;Il.prototype.hex=function(u){return Ad(this._rgb,u)},Ed.hex=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Il,[null].concat(u,["hex"])))},$l.format.hex=Fl,$l.autodetect.push({p:4,test:function(u){for(var d=[],b=arguments.length-1;b-- >0;)d[b]=arguments[b+1];if(!d.length&&Od(u)==="string"&&[3,4,5,6,7,8,9].indexOf(u.length)>=0)return"hex"}});var Rd=p.unpack,jl=p.TWOPI,Ld=Math.min,Fd=Math.sqrt,Id=Math.acos,$d=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=Rd(u,"rgb"),_=b[0],P=b[1],T=b[2];_/=255,P/=255,T/=255;var w,A=Ld(_,P,T),L=(_+P+T)/3,j=L>0?1-A/L:0;return j===0?w=NaN:(w=(_-P+(_-T))/2,w/=Fd((_-P)*(_-P)+(_-T)*(P-T)),w=Id(w),T>P&&(w=jl-w),w/=jl),[w*360,j,L]},jd=$d,zd=p.unpack,vo=p.limit,ci=p.TWOPI,_o=p.PITHIRD,hi=Math.cos,Bd=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];u=zd(u,"hsi");var b=u[0],_=u[1],P=u[2],T,w,A;return isNaN(b)&&(b=0),isNaN(_)&&(_=0),b>360&&(b-=360),b<0&&(b+=360),b/=360,b<1/3?(A=(1-_)/3,T=(1+_*hi(ci*b)/hi(_o-ci*b))/3,w=1-(A+T)):b<2/3?(b-=1/3,T=(1-_)/3,w=(1+_*hi(ci*b)/hi(_o-ci*b))/3,A=1-(T+w)):(b-=2/3,w=(1-_)/3,A=(1+_*hi(ci*b)/hi(_o-ci*b))/3,T=1-(w+A)),T=vo(P*T*3),w=vo(P*w*3),A=vo(P*A*3),[T*255,w*255,A*255,u.length>3?u[3]:1]},Nd=Bd,Hd=p.unpack,Wd=p.type,Vd=$,zl=D,Bl=m,Yd=jd;zl.prototype.hsi=function(){return Yd(this._rgb)},Vd.hsi=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(zl,[null].concat(u,["hsi"])))},Bl.format.hsi=Nd,Bl.autodetect.push({p:2,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=Hd(u,"hsi"),Wd(u)==="array"&&u.length===3)return"hsi"}});var Xd=p.unpack,qd=p.type,Gd=$,Nl=D,Hl=m,Ud=x;Nl.prototype.hsl=function(){return Ud(this._rgb)},Gd.hsl=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Nl,[null].concat(u,["hsl"])))},Hl.format.hsl=Yt,Hl.autodetect.push({p:2,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=Xd(u,"hsl"),qd(u)==="array"&&u.length===3)return"hsl"}});var Kd=p.unpack,Zd=Math.min,Jd=Math.max,Qd=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];u=Kd(u,"rgb");var b=u[0],_=u[1],P=u[2],T=Zd(b,_,P),w=Jd(b,_,P),A=w-T,L,j,B;return B=w/255,w===0?(L=Number.NaN,j=0):(j=A/w,b===w&&(L=(_-P)/A),_===w&&(L=2+(P-b)/A),P===w&&(L=4+(b-_)/A),L*=60,L<0&&(L+=360)),[L,j,B]},tp=Qd,ep=p.unpack,np=Math.floor,ip=function(){for(var u,d,b,_,P,T,w=[],A=arguments.length;A--;)w[A]=arguments[A];w=ep(w,"hsv");var L=w[0],j=w[1],B=w[2],q,H,Q;if(B*=255,j===0)q=H=Q=B;else{L===360&&(L=0),L>360&&(L-=360),L<0&&(L+=360),L/=60;var K=np(L),ct=L-K,mt=B*(1-j),_t=B*(1-j*ct),Mt=B*(1-j*(1-ct));switch(K){case 0:u=[B,Mt,mt],q=u[0],H=u[1],Q=u[2];break;case 1:d=[_t,B,mt],q=d[0],H=d[1],Q=d[2];break;case 2:b=[mt,B,Mt],q=b[0],H=b[1],Q=b[2];break;case 3:_=[mt,_t,B],q=_[0],H=_[1],Q=_[2];break;case 4:P=[Mt,mt,B],q=P[0],H=P[1],Q=P[2];break;case 5:T=[B,mt,_t],q=T[0],H=T[1],Q=T[2];break}}return[q,H,Q,w.length>3?w[3]:1]},sp=ip,rp=p.unpack,op=p.type,ap=$,Wl=D,Vl=m,lp=tp;Wl.prototype.hsv=function(){return lp(this._rgb)},ap.hsv=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Wl,[null].concat(u,["hsv"])))},Vl.format.hsv=sp,Vl.autodetect.push({p:2,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=rp(u,"hsv"),op(u)==="array"&&u.length===3)return"hsv"}});var Ns={Kn:18,Xn:.95047,Yn:1,Zn:1.08883,t0:.137931034,t1:.206896552,t2:.12841855,t3:.008856452},ui=Ns,cp=p.unpack,Yl=Math.pow,hp=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=cp(u,"rgb"),_=b[0],P=b[1],T=b[2],w=up(_,P,T),A=w[0],L=w[1],j=w[2],B=116*L-16;return[B<0?0:B,500*(A-L),200*(L-j)]},yo=function(u){return(u/=255)<=.04045?u/12.92:Yl((u+.055)/1.055,2.4)},xo=function(u){return u>ui.t3?Yl(u,1/3):u/ui.t2+ui.t0},up=function(u,d,b){u=yo(u),d=yo(d),b=yo(b);var _=xo((.4124564*u+.3575761*d+.1804375*b)/ui.Xn),P=xo((.2126729*u+.7151522*d+.072175*b)/ui.Yn),T=xo((.0193339*u+.119192*d+.9503041*b)/ui.Zn);return[_,P,T]},Xl=hp,fi=Ns,fp=p.unpack,dp=Math.pow,pp=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];u=fp(u,"lab");var b=u[0],_=u[1],P=u[2],T,w,A,L,j,B;return w=(b+16)/116,T=isNaN(_)?w:w+_/500,A=isNaN(P)?w:w-P/200,w=fi.Yn*ko(w),T=fi.Xn*ko(T),A=fi.Zn*ko(A),L=wo(3.2404542*T-1.5371385*w-.4985314*A),j=wo(-.969266*T+1.8760108*w+.041556*A),B=wo(.0556434*T-.2040259*w+1.0572252*A),[L,j,B,u.length>3?u[3]:1]},wo=function(u){return 255*(u<=.00304?12.92*u:1.055*dp(u,1/2.4)-.055)},ko=function(u){return u>fi.t1?u*u*u:fi.t2*(u-fi.t0)},ql=pp,gp=p.unpack,mp=p.type,bp=$,Gl=D,Ul=m,vp=Xl;Gl.prototype.lab=function(){return vp(this._rgb)},bp.lab=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Gl,[null].concat(u,["lab"])))},Ul.format.lab=ql,Ul.autodetect.push({p:2,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=gp(u,"lab"),mp(u)==="array"&&u.length===3)return"lab"}});var _p=p.unpack,yp=p.RAD2DEG,xp=Math.sqrt,wp=Math.atan2,kp=Math.round,Sp=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=_p(u,"lab"),_=b[0],P=b[1],T=b[2],w=xp(P*P+T*T),A=(wp(T,P)*yp+360)%360;return kp(w*1e4)===0&&(A=Number.NaN),[_,w,A]},Kl=Sp,Mp=p.unpack,Cp=Xl,Pp=Kl,Tp=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=Mp(u,"rgb"),_=b[0],P=b[1],T=b[2],w=Cp(_,P,T),A=w[0],L=w[1],j=w[2];return Pp(A,L,j)},Dp=Tp,Ep=p.unpack,Op=p.DEG2RAD,Ap=Math.sin,Rp=Math.cos,Lp=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=Ep(u,"lch"),_=b[0],P=b[1],T=b[2];return isNaN(T)&&(T=0),T=T*Op,[_,Rp(T)*P,Ap(T)*P]},Zl=Lp,Fp=p.unpack,Ip=Zl,$p=ql,jp=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];u=Fp(u,"lch");var b=u[0],_=u[1],P=u[2],T=Ip(b,_,P),w=T[0],A=T[1],L=T[2],j=$p(w,A,L),B=j[0],q=j[1],H=j[2];return[B,q,H,u.length>3?u[3]:1]},Jl=jp,zp=p.unpack,Bp=Jl,Np=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=zp(u,"hcl").reverse();return Bp.apply(void 0,b)},Hp=Np,Wp=p.unpack,Vp=p.type,Ql=$,Hs=D,So=m,tc=Dp;Hs.prototype.lch=function(){return tc(this._rgb)},Hs.prototype.hcl=function(){return tc(this._rgb).reverse()},Ql.lch=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Hs,[null].concat(u,["lch"])))},Ql.hcl=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Hs,[null].concat(u,["hcl"])))},So.format.lch=Jl,So.format.hcl=Hp,["lch","hcl"].forEach(function(u){return So.autodetect.push({p:2,test:function(){for(var d=[],b=arguments.length;b--;)d[b]=arguments[b];if(d=Wp(d,u),Vp(d)==="array"&&d.length===3)return u}})});var Yp={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflower:"#6495ed",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",laserlemon:"#ffff54",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrod:"#fafad2",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",maroon2:"#7f0000",maroon3:"#b03060",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",purple2:"#7f007f",purple3:"#a020f0",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},ec=Yp,Xp=D,nc=m,qp=p.type,zi=ec,Gp=Fl,Up=Ll;Xp.prototype.name=function(){for(var u=Up(this._rgb,"rgb"),d=0,b=Object.keys(zi);d0;)d[b]=arguments[b+1];if(!d.length&&qp(u)==="string"&&zi[u.toLowerCase()])return"named"}});var Kp=p.unpack,Zp=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=Kp(u,"rgb"),_=b[0],P=b[1],T=b[2];return(_<<16)+(P<<8)+T},Jp=Zp,Qp=p.type,tg=function(u){if(Qp(u)=="number"&&u>=0&&u<=16777215){var d=u>>16,b=u>>8&255,_=u&255;return[d,b,_,1]}throw new Error("unknown num color: "+u)},eg=tg,ng=$,ic=D,sc=m,ig=p.type,sg=Jp;ic.prototype.num=function(){return sg(this._rgb)},ng.num=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(ic,[null].concat(u,["num"])))},sc.format.num=eg,sc.autodetect.push({p:5,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u.length===1&&ig(u[0])==="number"&&u[0]>=0&&u[0]<=16777215)return"num"}});var rg=$,Mo=D,rc=m,oc=p.unpack,ac=p.type,lc=Math.round;Mo.prototype.rgb=function(u){return u===void 0&&(u=!0),u===!1?this._rgb.slice(0,3):this._rgb.slice(0,3).map(lc)},Mo.prototype.rgba=function(u){return u===void 0&&(u=!0),this._rgb.slice(0,4).map(function(d,b){return b<3?u===!1?d:lc(d):d})},rg.rgb=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Mo,[null].concat(u,["rgb"])))},rc.format.rgb=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=oc(u,"rgba");return b[3]===void 0&&(b[3]=1),b},rc.autodetect.push({p:3,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=oc(u,"rgba"),ac(u)==="array"&&(u.length===3||u.length===4&&ac(u[3])=="number"&&u[3]>=0&&u[3]<=1))return"rgb"}});var Ws=Math.log,og=function(u){var d=u/100,b,_,P;return d<66?(b=255,_=d<6?0:-155.25485562709179-.44596950469579133*(_=d-2)+104.49216199393888*Ws(_),P=d<20?0:-254.76935184120902+.8274096064007395*(P=d-10)+115.67994401066147*Ws(P)):(b=351.97690566805693+.114206453784165*(b=d-55)-40.25366309332127*Ws(b),_=325.4494125711974+.07943456536662342*(_=d-50)-28.0852963507957*Ws(_),P=255),[b,_,P,1]},cc=og,ag=cc,lg=p.unpack,cg=Math.round,hg=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];for(var b=lg(u,"rgb"),_=b[0],P=b[2],T=1e3,w=4e4,A=.4,L;w-T>A;){L=(w+T)*.5;var j=ag(L);j[2]/j[0]>=P/_?w=L:T=L}return cg(L)},ug=hg,Co=$,Vs=D,Po=m,fg=ug;Vs.prototype.temp=Vs.prototype.kelvin=Vs.prototype.temperature=function(){return fg(this._rgb)},Co.temp=Co.kelvin=Co.temperature=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(Vs,[null].concat(u,["temp"])))},Po.format.temp=Po.format.kelvin=Po.format.temperature=cc;var dg=p.unpack,To=Math.cbrt,pg=Math.pow,gg=Math.sign,mg=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=dg(u,"rgb"),_=b[0],P=b[1],T=b[2],w=[Do(_/255),Do(P/255),Do(T/255)],A=w[0],L=w[1],j=w[2],B=To(.4122214708*A+.5363325363*L+.0514459929*j),q=To(.2119034982*A+.6806995451*L+.1073969566*j),H=To(.0883024619*A+.2817188376*L+.6299787005*j);return[.2104542553*B+.793617785*q-.0040720468*H,1.9779984951*B-2.428592205*q+.4505937099*H,.0259040371*B+.7827717662*q-.808675766*H]},hc=mg;function Do(u){var d=Math.abs(u);return d<.04045?u/12.92:(gg(u)||1)*pg((d+.055)/1.055,2.4)}var bg=p.unpack,Ys=Math.pow,vg=Math.sign,_g=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];u=bg(u,"lab");var b=u[0],_=u[1],P=u[2],T=Ys(b+.3963377774*_+.2158037573*P,3),w=Ys(b-.1055613458*_-.0638541728*P,3),A=Ys(b-.0894841775*_-1.291485548*P,3);return[255*Eo(4.0767416621*T-3.3077115913*w+.2309699292*A),255*Eo(-1.2684380046*T+2.6097574011*w-.3413193965*A),255*Eo(-.0041960863*T-.7034186147*w+1.707614701*A),u.length>3?u[3]:1]},uc=_g;function Eo(u){var d=Math.abs(u);return d>.0031308?(vg(u)||1)*(1.055*Ys(d,1/2.4)-.055):u*12.92}var yg=p.unpack,xg=p.type,wg=$,fc=D,dc=m,kg=hc;fc.prototype.oklab=function(){return kg(this._rgb)},wg.oklab=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(fc,[null].concat(u,["oklab"])))},dc.format.oklab=uc,dc.autodetect.push({p:3,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=yg(u,"oklab"),xg(u)==="array"&&u.length===3)return"oklab"}});var Sg=p.unpack,Mg=hc,Cg=Kl,Pg=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];var b=Sg(u,"rgb"),_=b[0],P=b[1],T=b[2],w=Mg(_,P,T),A=w[0],L=w[1],j=w[2];return Cg(A,L,j)},Tg=Pg,Dg=p.unpack,Eg=Zl,Og=uc,Ag=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];u=Dg(u,"lch");var b=u[0],_=u[1],P=u[2],T=Eg(b,_,P),w=T[0],A=T[1],L=T[2],j=Og(w,A,L),B=j[0],q=j[1],H=j[2];return[B,q,H,u.length>3?u[3]:1]},Rg=Ag,Lg=p.unpack,Fg=p.type,Ig=$,pc=D,gc=m,$g=Tg;pc.prototype.oklch=function(){return $g(this._rgb)},Ig.oklch=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];return new(Function.prototype.bind.apply(pc,[null].concat(u,["oklch"])))},gc.format.oklch=Rg,gc.autodetect.push({p:3,test:function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];if(u=Lg(u,"oklch"),Fg(u)==="array"&&u.length===3)return"oklch"}});var mc=D,jg=p.type;mc.prototype.alpha=function(u,d){return d===void 0&&(d=!1),u!==void 0&&jg(u)==="number"?d?(this._rgb[3]=u,this):new mc([this._rgb[0],this._rgb[1],this._rgb[2],u],"rgb"):this._rgb[3]};var zg=D;zg.prototype.clipped=function(){return this._rgb._clipped||!1};var jn=D,Bg=Ns;jn.prototype.darken=function(u){u===void 0&&(u=1);var d=this,b=d.lab();return b[0]-=Bg.Kn*u,new jn(b,"lab").alpha(d.alpha(),!0)},jn.prototype.brighten=function(u){return u===void 0&&(u=1),this.darken(-u)},jn.prototype.darker=jn.prototype.darken,jn.prototype.brighter=jn.prototype.brighten;var Ng=D;Ng.prototype.get=function(u){var d=u.split("."),b=d[0],_=d[1],P=this[b]();if(_){var T=b.indexOf(_)-(b.substr(0,2)==="ok"?2:0);if(T>-1)return P[T];throw new Error("unknown channel "+_+" in mode "+b)}else return P};var di=D,Hg=p.type,Wg=Math.pow,Vg=1e-7,Yg=20;di.prototype.luminance=function(u){if(u!==void 0&&Hg(u)==="number"){if(u===0)return new di([0,0,0,this._rgb[3]],"rgb");if(u===1)return new di([255,255,255,this._rgb[3]],"rgb");var d=this.luminance(),b="rgb",_=Yg,P=function(w,A){var L=w.interpolate(A,.5,b),j=L.luminance();return Math.abs(u-j)u?P(w,L):P(L,A)},T=(d>u?P(new di([0,0,0]),this):P(this,new di([255,255,255]))).rgb();return new di(T.concat([this._rgb[3]]))}return Xg.apply(void 0,this._rgb.slice(0,3))};var Xg=function(u,d,b){return u=Oo(u),d=Oo(d),b=Oo(b),.2126*u+.7152*d+.0722*b},Oo=function(u){return u/=255,u<=.03928?u/12.92:Wg((u+.055)/1.055,2.4)},we={},bc=D,vc=p.type,Xs=we,_c=function(u,d,b){b===void 0&&(b=.5);for(var _=[],P=arguments.length-3;P-- >0;)_[P]=arguments[P+3];var T=_[0]||"lrgb";if(!Xs[T]&&!_.length&&(T=Object.keys(Xs)[0]),!Xs[T])throw new Error("interpolation mode "+T+" is not defined");return vc(u)!=="object"&&(u=new bc(u)),vc(d)!=="object"&&(d=new bc(d)),Xs[T](u,d,b).alpha(u.alpha()+b*(d.alpha()-u.alpha()))},yc=D,qg=_c;yc.prototype.mix=yc.prototype.interpolate=function(u,d){d===void 0&&(d=.5);for(var b=[],_=arguments.length-2;_-- >0;)b[_]=arguments[_+2];return qg.apply(void 0,[this,u,d].concat(b))};var xc=D;xc.prototype.premultiply=function(u){u===void 0&&(u=!1);var d=this._rgb,b=d[3];return u?(this._rgb=[d[0]*b,d[1]*b,d[2]*b,b],this):new xc([d[0]*b,d[1]*b,d[2]*b,b],"rgb")};var Ao=D,Gg=Ns;Ao.prototype.saturate=function(u){u===void 0&&(u=1);var d=this,b=d.lch();return b[1]+=Gg.Kn*u,b[1]<0&&(b[1]=0),new Ao(b,"lch").alpha(d.alpha(),!0)},Ao.prototype.desaturate=function(u){return u===void 0&&(u=1),this.saturate(-u)};var wc=D,kc=p.type;wc.prototype.set=function(u,d,b){b===void 0&&(b=!1);var _=u.split("."),P=_[0],T=_[1],w=this[P]();if(T){var A=P.indexOf(T)-(P.substr(0,2)==="ok"?2:0);if(A>-1){if(kc(d)=="string")switch(d.charAt(0)){case"+":w[A]+=+d;break;case"-":w[A]+=+d;break;case"*":w[A]*=+d.substr(1);break;case"/":w[A]/=+d.substr(1);break;default:w[A]=+d}else if(kc(d)==="number")w[A]=d;else throw new Error("unsupported value for Color.set");var L=new wc(w,P);return b?(this._rgb=L._rgb,this):L}throw new Error("unknown channel "+T+" in mode "+P)}else return w};var Ug=D,Kg=function(u,d,b){var _=u._rgb,P=d._rgb;return new Ug(_[0]+b*(P[0]-_[0]),_[1]+b*(P[1]-_[1]),_[2]+b*(P[2]-_[2]),"rgb")};we.rgb=Kg;var Zg=D,Ro=Math.sqrt,pi=Math.pow,Jg=function(u,d,b){var _=u._rgb,P=_[0],T=_[1],w=_[2],A=d._rgb,L=A[0],j=A[1],B=A[2];return new Zg(Ro(pi(P,2)*(1-b)+pi(L,2)*b),Ro(pi(T,2)*(1-b)+pi(j,2)*b),Ro(pi(w,2)*(1-b)+pi(B,2)*b),"rgb")};we.lrgb=Jg;var Qg=D,tm=function(u,d,b){var _=u.lab(),P=d.lab();return new Qg(_[0]+b*(P[0]-_[0]),_[1]+b*(P[1]-_[1]),_[2]+b*(P[2]-_[2]),"lab")};we.lab=tm;var Sc=D,gi=function(u,d,b,_){var P,T,w,A;_==="hsl"?(w=u.hsl(),A=d.hsl()):_==="hsv"?(w=u.hsv(),A=d.hsv()):_==="hcg"?(w=u.hcg(),A=d.hcg()):_==="hsi"?(w=u.hsi(),A=d.hsi()):_==="lch"||_==="hcl"?(_="hcl",w=u.hcl(),A=d.hcl()):_==="oklch"&&(w=u.oklch().reverse(),A=d.oklch().reverse());var L,j,B,q,H,Q;(_.substr(0,1)==="h"||_==="oklch")&&(P=w,L=P[0],B=P[1],H=P[2],T=A,j=T[0],q=T[1],Q=T[2]);var K,ct,mt,_t;return!isNaN(L)&&!isNaN(j)?(j>L&&j-L>180?_t=j-(L+360):j180?_t=j+360-L:_t=j-L,ct=L+b*_t):isNaN(L)?isNaN(j)?ct=Number.NaN:(ct=j,(H==1||H==0)&&_!="hsv"&&(K=q)):(ct=L,(Q==1||Q==0)&&_!="hsv"&&(K=B)),K===void 0&&(K=B+b*(q-B)),mt=H+b*(Q-H),_==="oklch"?new Sc([mt,K,ct],_):new Sc([ct,K,mt],_)},em=gi,Mc=function(u,d,b){return em(u,d,b,"lch")};we.lch=Mc,we.hcl=Mc;var nm=D,im=function(u,d,b){var _=u.num(),P=d.num();return new nm(_+b*(P-_),"num")};we.num=im;var sm=gi,rm=function(u,d,b){return sm(u,d,b,"hcg")};we.hcg=rm;var om=gi,am=function(u,d,b){return om(u,d,b,"hsi")};we.hsi=am;var lm=gi,cm=function(u,d,b){return lm(u,d,b,"hsl")};we.hsl=cm;var hm=gi,um=function(u,d,b){return hm(u,d,b,"hsv")};we.hsv=um;var fm=D,dm=function(u,d,b){var _=u.oklab(),P=d.oklab();return new fm(_[0]+b*(P[0]-_[0]),_[1]+b*(P[1]-_[1]),_[2]+b*(P[2]-_[2]),"oklab")};we.oklab=dm;var pm=gi,gm=function(u,d,b){return pm(u,d,b,"oklch")};we.oklch=gm;var Lo=D,mm=p.clip_rgb,Fo=Math.pow,Io=Math.sqrt,$o=Math.PI,Cc=Math.cos,Pc=Math.sin,bm=Math.atan2,vm=function(u,d,b){d===void 0&&(d="lrgb"),b===void 0&&(b=null);var _=u.length;b||(b=Array.from(new Array(_)).map(function(){return 1}));var P=_/b.reduce(function(ct,mt){return ct+mt});if(b.forEach(function(ct,mt){b[mt]*=P}),u=u.map(function(ct){return new Lo(ct)}),d==="lrgb")return _m(u,b);for(var T=u.shift(),w=T.get(d),A=[],L=0,j=0,B=0;B=360;)K-=360;w[Q]=K}else w[Q]=w[Q]/A[Q];return H/=_,new Lo(w,d).alpha(H>.99999?1:H,!0)},_m=function(u,d){for(var b=u.length,_=[0,0,0,0],P=0;P.9999999&&(_[3]=1),new Lo(mm(_))},Pe=$,mi=p.type,ym=Math.pow,jo=function(u){var d="rgb",b=Pe("#ccc"),_=0,P=[0,1],T=[],w=[0,0],A=!1,L=[],j=!1,B=0,q=1,H=!1,Q={},K=!0,ct=1,mt=function(W){if(W=W||["#fff","#000"],W&&mi(W)==="string"&&Pe.brewer&&Pe.brewer[W.toLowerCase()]&&(W=Pe.brewer[W.toLowerCase()]),mi(W)==="array"){W.length===1&&(W=[W[0],W[0]]),W=W.slice(0);for(var st=0;st=A[dt];)dt++;return dt-1}return 0},Mt=function(W){return W},oe=function(W){return W},ne=function(W,st){var dt,ht;if(st==null&&(st=!1),isNaN(W)||W===null)return b;if(st)ht=W;else if(A&&A.length>2){var ae=_t(W);ht=ae/(A.length-2)}else q!==B?ht=(W-B)/(q-B):ht=1;ht=oe(ht),st||(ht=Mt(ht)),ct!==1&&(ht=ym(ht,ct)),ht=w[0]+ht*(1-w[0]-w[1]),ht=Math.min(1,Math.max(0,ht));var $t=Math.floor(ht*1e4);if(K&&Q[$t])dt=Q[$t];else{if(mi(L)==="array")for(var yt=0;yt=Tt&&yt===T.length-1){dt=L[yt];break}if(ht>Tt&&ht2){var yt=W.map(function(Dt,At){return At/(W.length-1)}),Tt=W.map(function(Dt){return(Dt-B)/(q-B)});Tt.every(function(Dt,At){return yt[At]===Dt})||(oe=function(Dt){if(Dt<=0||Dt>=1)return Dt;for(var At=0;Dt>=Tt[At+1];)At++;var De=(Dt-Tt[At])/(Tt[At+1]-Tt[At]),mn=yt[At]+De*(yt[At+1]-yt[At]);return mn})}}return P=[B,q],vt},vt.mode=function(W){return arguments.length?(d=W,ge(),vt):d},vt.range=function(W,st){return mt(W),vt},vt.out=function(W){return j=W,vt},vt.spread=function(W){return arguments.length?(_=W,vt):_},vt.correctLightness=function(W){return W==null&&(W=!0),H=W,ge(),H?Mt=function(st){for(var dt=ne(0,!0).lab()[0],ht=ne(1,!0).lab()[0],ae=dt>ht,$t=ne(st,!0).lab()[0],yt=dt+(ht-dt)*st,Tt=$t-yt,Dt=0,At=1,De=20;Math.abs(Tt)>.01&&De-- >0;)(function(){return ae&&(Tt*=-1),Tt<0?(Dt=st,st+=(At-st)*.5):(At=st,st+=(Dt-st)*.5),$t=ne(st,!0).lab()[0],Tt=$t-yt})();return st}:Mt=function(st){return st},vt},vt.padding=function(W){return W!=null?(mi(W)==="number"&&(W=[W,W]),w=W,vt):w},vt.colors=function(W,st){arguments.length<2&&(st="hex");var dt=[];if(arguments.length===0)dt=L.slice(0);else if(W===1)dt=[vt(.5)];else if(W>1){var ht=P[0],ae=P[1]-ht;dt=xm(0,W,!1).map(function(At){return vt(ht+At/(W-1)*ae)})}else{u=[];var $t=[];if(A&&A.length>2)for(var yt=1,Tt=A.length,Dt=1<=Tt;Dt?ytTt;Dt?yt++:yt--)$t.push((A[yt-1]+A[yt])*.5);else $t=P;dt=$t.map(function(At){return vt(At)})}return Pe[st]&&(dt=dt.map(function(At){return At[st]()})),dt},vt.cache=function(W){return W!=null?(K=W,vt):K},vt.gamma=function(W){return W!=null?(ct=W,vt):ct},vt.nodata=function(W){return W!=null?(b=Pe(W),vt):b},vt};function xm(u,d,b){for(var _=[],P=uT;P?w++:w--)_.push(w);return _}var Bi=D,wm=jo,km=function(u){for(var d=[1,1],b=1;b=5){var j,B,q;j=u.map(function(H){return H.lab()}),q=u.length-1,B=km(q),P=function(H){var Q=1-H,K=[0,1,2].map(function(ct){return j.reduce(function(mt,_t,Mt){return mt+B[Mt]*Math.pow(Q,q-Mt)*Math.pow(H,Mt)*_t[ct]},0)});return new Bi(K,"lab")}}else throw new RangeError("No point in running bezier with only one color.");return P},Mm=function(u){var d=Sm(u);return d.scale=function(){return wm(d)},d},zo=$,Te=function(u,d,b){if(!Te[b])throw new Error("unknown blend mode "+b);return Te[b](u,d)},pn=function(u){return function(d,b){var _=zo(b).rgb(),P=zo(d).rgb();return zo.rgb(u(_,P))}},gn=function(u){return function(d,b){var _=[];return _[0]=u(d[0],b[0]),_[1]=u(d[1],b[1]),_[2]=u(d[2],b[2]),_}},Cm=function(u){return u},Pm=function(u,d){return u*d/255},Tm=function(u,d){return u>d?d:u},Dm=function(u,d){return u>d?u:d},Em=function(u,d){return 255*(1-(1-u/255)*(1-d/255))},Om=function(u,d){return d<128?2*u*d/255:255*(1-2*(1-u/255)*(1-d/255))},Am=function(u,d){return 255*(1-(1-d/255)/(u/255))},Rm=function(u,d){return u===255?255:(u=255*(d/255)/(1-u/255),u>255?255:u)};Te.normal=pn(gn(Cm)),Te.multiply=pn(gn(Pm)),Te.screen=pn(gn(Em)),Te.overlay=pn(gn(Om)),Te.darken=pn(gn(Tm)),Te.lighten=pn(gn(Dm)),Te.dodge=pn(gn(Rm)),Te.burn=pn(gn(Am));for(var Lm=Te,Bo=p.type,Fm=p.clip_rgb,Im=p.TWOPI,$m=Math.pow,jm=Math.sin,zm=Math.cos,Tc=$,Bm=function(u,d,b,_,P){u===void 0&&(u=300),d===void 0&&(d=-1.5),b===void 0&&(b=1),_===void 0&&(_=1),P===void 0&&(P=[0,1]);var T=0,w;Bo(P)==="array"?w=P[1]-P[0]:(w=0,P=[P,P]);var A=function(L){var j=Im*((u+120)/360+d*L),B=$m(P[0]+w*L,_),q=T!==0?b[0]+L*T:b,H=q*B*(1-B)/2,Q=zm(j),K=jm(j),ct=B+H*(-.14861*Q+1.78277*K),mt=B+H*(-.29227*Q-.90649*K),_t=B+H*(1.97294*Q);return Tc(Fm([ct*255,mt*255,_t*255,1]))};return A.start=function(L){return L==null?u:(u=L,A)},A.rotations=function(L){return L==null?d:(d=L,A)},A.gamma=function(L){return L==null?_:(_=L,A)},A.hue=function(L){return L==null?b:(b=L,Bo(b)==="array"?(T=b[1]-b[0],T===0&&(b=b[1])):T=0,A)},A.lightness=function(L){return L==null?P:(Bo(L)==="array"?(P=L,w=L[1]-L[0]):(P=[L,L],w=0),A)},A.scale=function(){return Tc.scale(A)},A.hue(b),A},Nm=D,Hm="0123456789abcdef",Wm=Math.floor,Vm=Math.random,Ym=function(){for(var u="#",d=0;d<6;d++)u+=Hm.charAt(Wm(Vm()*16));return new Nm(u,"hex")},No=a,Dc=Math.log,Xm=Math.pow,qm=Math.floor,Gm=Math.abs,Ec=function(u,d){d===void 0&&(d=null);var b={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0};return No(u)==="object"&&(u=Object.values(u)),u.forEach(function(_){d&&No(_)==="object"&&(_=_[d]),_!=null&&!isNaN(_)&&(b.values.push(_),b.sum+=_,_b.max&&(b.max=_),b.count+=1)}),b.domain=[b.min,b.max],b.limits=function(_,P){return Oc(b,_,P)},b},Oc=function(u,d,b){d===void 0&&(d="equal"),b===void 0&&(b=7),No(u)=="array"&&(u=Ec(u));var _=u.min,P=u.max,T=u.values.sort(function(Wo,Vo){return Wo-Vo});if(b===1)return[_,P];var w=[];if(d.substr(0,1)==="c"&&(w.push(_),w.push(P)),d.substr(0,1)==="e"){w.push(_);for(var A=1;A 0");var L=Math.LOG10E*Dc(_),j=Math.LOG10E*Dc(P);w.push(_);for(var B=1;B200&&(oe=!1)}for(var bn={},bi=0;bi_?(b+.05)/(_+.05):(_+.05)/(b+.05)},Lc=D,Ge=Math.sqrt,Kt=Math.pow,Km=Math.min,Zm=Math.max,Fc=Math.atan2,Ic=Math.abs,qs=Math.cos,$c=Math.sin,Jm=Math.exp,jc=Math.PI,Qm=function(u,d,b,_,P){b===void 0&&(b=1),_===void 0&&(_=1),P===void 0&&(P=1);var T=function(Bn){return 360*Bn/(2*jc)},w=function(Bn){return 2*jc*Bn/360};u=new Lc(u),d=new Lc(d);var A=Array.from(u.lab()),L=A[0],j=A[1],B=A[2],q=Array.from(d.lab()),H=q[0],Q=q[1],K=q[2],ct=(L+H)/2,mt=Ge(Kt(j,2)+Kt(B,2)),_t=Ge(Kt(Q,2)+Kt(K,2)),Mt=(mt+_t)/2,oe=.5*(1-Ge(Kt(Mt,7)/(Kt(Mt,7)+Kt(25,7)))),ne=j*(1+oe),ge=Q*(1+oe),vt=Ge(Kt(ne,2)+Kt(B,2)),W=Ge(Kt(ge,2)+Kt(K,2)),st=(vt+W)/2,dt=T(Fc(B,ne)),ht=T(Fc(K,ge)),ae=dt>=0?dt:dt+360,$t=ht>=0?ht:ht+360,yt=Ic(ae-$t)>180?(ae+$t+360)/2:(ae+$t)/2,Tt=1-.17*qs(w(yt-30))+.24*qs(w(2*yt))+.32*qs(w(3*yt+6))-.2*qs(w(4*yt-63)),Dt=$t-ae;Dt=Ic(Dt)<=180?Dt:$t<=ae?Dt+360:Dt-360,Dt=2*Ge(vt*W)*$c(w(Dt)/2);var At=H-L,De=W-vt,mn=1+.015*Kt(ct-50,2)/Ge(20+Kt(ct-50,2)),bn=1+.045*st,bi=1+.015*st*Tt,vi=30*Jm(-Kt((yt-275)/25,2)),Ue=2*Ge(Kt(st,7)/(Kt(st,7)+Kt(25,7))),zn=-Ue*$c(2*w(vi)),Ni=Ge(Kt(At/(b*mn),2)+Kt(De/(_*bn),2)+Kt(Dt/(P*bi),2)+zn*(De/(_*bn))*(Dt/(P*bi)));return Zm(0,Km(100,Ni))},zc=D,tb=function(u,d,b){b===void 0&&(b="lab"),u=new zc(u),d=new zc(d);var _=u.get(b),P=d.get(b),T=0;for(var w in _){var A=(_[w]||0)-(P[w]||0);T+=A*A}return Math.sqrt(T)},eb=D,nb=function(){for(var u=[],d=arguments.length;d--;)u[d]=arguments[d];try{return new(Function.prototype.bind.apply(eb,[null].concat(u))),!0}catch(b){return!1}},Bc=$,Nc=jo,ib={cool:function(){return Nc([Bc.hsl(180,1,.9),Bc.hsl(250,.7,.4)])},hot:function(){return Nc(["#000","#f00","#ff0","#fff"]).mode("rgb")}},Gs={OrRd:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"],PuBu:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"],BuPu:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"],Oranges:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"],BuGn:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"],YlOrBr:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"],YlGn:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"],Reds:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"],RdPu:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"],Greens:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"],YlGnBu:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],Purples:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"],GnBu:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"],Greys:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"],YlOrRd:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"],PuRd:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"],Blues:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"],PuBuGn:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"],Viridis:["#440154","#482777","#3f4a8a","#31678e","#26838f","#1f9d8a","#6cce5a","#b6de2b","#fee825"],Spectral:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],RdYlGn:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],RdBu:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],PiYG:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],PRGn:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],RdYlBu:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],BrBG:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],RdGy:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],PuOr:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],Set2:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"],Accent:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"],Set1:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"],Set3:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"],Dark2:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"],Paired:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"],Pastel2:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"],Pastel1:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"]},Ho=0,Hc=Object.keys(Gs);Ho{(function(n,t){typeof qr=="object"&&typeof Qu!="undefined"?t(qr):typeof define=="function"&&define.amd?define("@ts-stack/markdown",["exports"],t):(n=typeof globalThis!="undefined"?globalThis:n||self,t((n["ts-stack"]=n["ts-stack"]||{},n["ts-stack"].markdown={})))})(qr,function(n){"use strict";var t=function(){function k(v,x){x===void 0&&(x=""),this.source=v.source,this.flags=x}return k.prototype.setGroup=function(v,x){var R=typeof x=="string"?x:x.source;return R=R.replace(/(^|[^\[])\^/g,"$1"),this.source=this.source.replace(v,R),this},k.prototype.getRegexp=function(){return new RegExp(this.source,this.flags)},k}();var e=/[&<>"']/,i=/[&<>"']/g,s={"&":"&","<":"<",">":">",'"':""","'":"'"},r=/[<>"']|&(?!#?\w+;)/,o=/[<>"']|&(?!#?\w+;)/g;function a(k,v){if(v){if(e.test(k))return k.replace(i,function(x){return s[x]})}else if(r.test(k))return k.replace(o,function(x){return s[x]});return k}function l(k){return k.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(v,x){return x=x.toLowerCase(),x==="colon"?":":x.charAt(0)==="#"?x.charAt(1)==="x"?String.fromCharCode(parseInt(x.substring(2),16)):String.fromCharCode(+x.substring(1)):""})}n.TokenType=void 0,function(k){k[k.space=1]="space",k[k.text=2]="text",k[k.paragraph=3]="paragraph",k[k.heading=4]="heading",k[k.listStart=5]="listStart",k[k.listEnd=6]="listEnd",k[k.looseItemStart=7]="looseItemStart",k[k.looseItemEnd=8]="looseItemEnd",k[k.listItemStart=9]="listItemStart",k[k.listItemEnd=10]="listItemEnd",k[k.blockquoteStart=11]="blockquoteStart",k[k.blockquoteEnd=12]="blockquoteEnd",k[k.code=13]="code",k[k.table=14]="table",k[k.html=15]="html",k[k.hr=16]="hr"}(n.TokenType||(n.TokenType={}));var c=function(){function k(){this.gfm=!0,this.tables=!0,this.breaks=!1,this.pedantic=!1,this.sanitize=!1,this.mangle=!0,this.smartLists=!1,this.silent=!1,this.langPrefix="lang-",this.smartypants=!1,this.headerPrefix="",this.xhtml=!1,this.escape=a,this.unescape=l}return k}();var h=function(k,v){return h=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(x,R){x.__proto__=R}||function(x,R){for(var E in R)Object.prototype.hasOwnProperty.call(R,E)&&(x[E]=R[E])},h(k,v)};function f(k,v){if(typeof v!="function"&&v!==null)throw new TypeError("Class extends value "+String(v)+" is not a constructor or null");h(k,v);function x(){this.constructor=k}k.prototype=v===null?Object.create(v):(x.prototype=v.prototype,new x)}var g=function(){return g=Object.assign||function(v){for(var x,R=1,E=arguments.length;R=0;V--)(Z=k[V])&&(O=(E<3?Z(O):E>3?Z(v,x,O):Z(v,x))||O);return E>3&&O&&Object.defineProperty(v,x,O),O}function y(k,v){return function(x,R){v(x,R,k)}}function S(k,v){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(k,v)}function M(k,v,x,R){function E(O){return O instanceof x?O:new x(function(Z){Z(O)})}return new(x||(x=Promise))(function(O,Z){function V(xt){try{tt(R.next(xt))}catch(Ht){Z(Ht)}}function J(xt){try{tt(R.throw(xt))}catch(Ht){Z(Ht)}}function tt(xt){xt.done?O(xt.value):E(xt.value).then(V,J)}tt((R=R.apply(k,v||[])).next())})}function C(k,v){var x={label:0,sent:function(){if(O[0]&1)throw O[1];return O[1]},trys:[],ops:[]},R,E,O,Z;return Z={next:V(0),throw:V(1),return:V(2)},typeof Symbol=="function"&&(Z[Symbol.iterator]=function(){return this}),Z;function V(tt){return function(xt){return J([tt,xt])}}function J(tt){if(R)throw new TypeError("Generator is already executing.");for(;x;)try{if(R=1,E&&(O=tt[0]&2?E.return:tt[0]?E.throw||((O=E.return)&&O.call(E),0):E.next)&&!(O=O.call(E,tt[1])).done)return O;switch(E=0,O&&(tt=[tt[0]&2,O.value]),tt[0]){case 0:case 1:O=tt;break;case 4:return x.label++,{value:tt[1],done:!1};case 5:x.label++,E=tt[1],tt=[0];continue;case 7:tt=x.ops.pop(),x.trys.pop();continue;default:if(O=x.trys,!(O=O.length>0&&O[O.length-1])&&(tt[0]===6||tt[0]===2)){x=0;continue}if(tt[0]===3&&(!O||tt[1]>O[0]&&tt[1]=k.length&&(k=void 0),{value:k&&k[R++],done:!k}}};throw new TypeError(v?"Object is not iterable.":"Symbol.iterator is not defined.")}function $(k,v){var x=typeof Symbol=="function"&&k[Symbol.iterator];if(!x)return k;var R=x.call(k),E,O=[],Z;try{for(;(v===void 0||v-- >0)&&!(E=R.next()).done;)O.push(E.value)}catch(V){Z={error:V}}finally{try{E&&!E.done&&(x=R.return)&&x.call(R)}finally{if(Z)throw Z.error}}return O}function N(){for(var k=[],v=0;v1||V(Ot,Yt)})})}function V(Ot,Yt){try{J(R[Ot](Yt))}catch(Xt){Ht(O[0][3],Xt)}}function J(Ot){Ot.value instanceof it?Promise.resolve(Ot.value.v).then(tt,xt):Ht(O[0][2],Ot)}function tt(Ot){V("next",Ot)}function xt(Ot){V("throw",Ot)}function Ht(Ot,Yt){Ot(Yt),O.shift(),O.length&&V(O[0][0],O[0][1])}}function rt(k){var v,x;return v={},R("next"),R("throw",function(E){throw E}),R("return"),v[Symbol.iterator]=function(){return this},v;function R(E,O){v[E]=k[E]?function(Z){return(x=!x)?{value:it(k[E](Z)),done:E==="return"}:O?O(Z):Z}:O}}function Pt(k){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var v=k[Symbol.asyncIterator],x;return v?v.call(k):(k=typeof I=="function"?I(k):k[Symbol.iterator](),x={},R("next"),R("throw"),R("return"),x[Symbol.asyncIterator]=function(){return this},x);function R(O){x[O]=k[O]&&function(Z){return new Promise(function(V,J){Z=k[O](Z),E(V,J,Z.done,Z.value)})}}function E(O,Z,V,J){Promise.resolve(J).then(function(tt){O({value:tt,done:V})},Z)}}function zt(k,v){return Object.defineProperty?Object.defineProperty(k,"raw",{value:v}):k.raw=v,k}var et=Object.create?function(k,v){Object.defineProperty(k,"default",{enumerable:!0,value:v})}:function(k,v){k.default=v};function Et(k){if(k&&k.__esModule)return k;var v={};if(k!=null)for(var x in k)x!=="default"&&Object.prototype.hasOwnProperty.call(k,x)&&F(v,k,x);return et(v,k),v}function St(k){return k&&k.__esModule?k:{default:k}}function re(k,v){if(!v.has(k))throw new TypeError("attempted to get private field on non-instance");return v.get(k)}function ye(k,v,x){if(!v.has(k))throw new TypeError("attempted to set private field on non-instance");return v.set(k,x),x}var ot=function(){function k(v){this.options=v||Ut.options}return k.prototype.code=function(v,x,R,E){if(this.options.highlight){var O=this.options.highlight(v,x);O!=null&&O!==v&&(R=!0,v=O)}var Z=R?v:this.options.escape(v,!0);if(!x)return` +
`+Z+`
+
+`;var V=this.options.langPrefix+this.options.escape(x,!0);return` +
'+Z+`
+
+`},k.prototype.blockquote=function(v){return`
+`+v+`
+`},k.prototype.html=function(v){return v},k.prototype.heading=function(v,x,R){var E=this.options.headerPrefix+R.toLowerCase().replace(/[^\w]+/g,"-");return"'+v+" +`},k.prototype.hr=function(){return this.options.xhtml?`
+`:`
+`},k.prototype.list=function(v,x){var R=x?"ol":"ul";return` +<`+R+`> +`+v+" +`},k.prototype.listitem=function(v){return"
  • "+v+`
  • +`},k.prototype.paragraph=function(v){return"

    "+v+`

    +`},k.prototype.table=function(v,x){return` + + +`+v+` + +`+x+` +
    +`},k.prototype.tablerow=function(v){return` +`+v+` +`},k.prototype.tablecell=function(v,x){var R=x.header?"th":"td",E=x.align?"<"+R+' style="text-align:'+x.align+'">':"<"+R+">";return E+v+" +`},k.prototype.strong=function(v){return""+v+""},k.prototype.em=function(v){return""+v+""},k.prototype.codespan=function(v){return""+v+""},k.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},k.prototype.del=function(v){return""+v+""},k.prototype.link=function(v,x,R){if(this.options.sanitize){var E=void 0;try{E=decodeURIComponent(this.options.unescape(v)).replace(/[^\w:]/g,"").toLowerCase()}catch(Z){return R}if(E.indexOf("javascript:")===0||E.indexOf("vbscript:")===0||E.indexOf("data:")===0)return R}var O='",O},k.prototype.image=function(v,x,R){var E=''+R+'":">",E},k.prototype.text=function(v){return v},k}();var Lt=function(){function k(v,x,R,E){if(R===void 0&&(R=Ut.options),this.staticThis=v,this.links=x,this.options=R,this.renderer=E||this.options.renderer||new ot(this.options),!this.links)throw new Error("InlineLexer requires 'links' parameter.");this.setRules()}return k.output=function(v,x,R){var E=new this(this,x,R);return E.output(v)},k.getRulesBase=function(){if(this.rulesBase)return this.rulesBase;var v={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ <>]+(@|:\/)[^ <>]+)>/,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^<'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)([\s\S]*?[^`])\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/};return v.link=new t(v.link).setGroup("inside",v._inside).setGroup("href",v._href).getRegexp(),v.reflink=new t(v.reflink).setGroup("inside",v._inside).getRegexp(),this.rulesBase=v},k.getRulesPedantic=function(){return this.rulesPedantic?this.rulesPedantic:this.rulesPedantic=Object.assign(Object.assign({},this.getRulesBase()),{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/})},k.getRulesGfm=function(){if(this.rulesGfm)return this.rulesGfm;var v=this.getRulesBase(),x=new t(v.escape).setGroup("])","~|])").getRegexp(),R=new t(v.text).setGroup("]|","~]|").setGroup("|","|https?://|").getRegexp();return this.rulesGfm=Object.assign(Object.assign({},v),{escape:x,url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:R})},k.getRulesBreaks=function(){if(this.rulesBreaks)return this.rulesBreaks;var v=this.getRulesGfm(),x=this.getRulesGfm();return this.rulesBreaks=Object.assign(Object.assign({},x),{br:new t(v.br).setGroup("{2,}","*").getRegexp(),text:new t(x.text).setGroup("{2,}","*").getRegexp()})},k.prototype.setRules=function(){this.options.gfm?this.options.breaks?this.rules=this.staticThis.getRulesBreaks():this.rules=this.staticThis.getRulesGfm():this.options.pedantic?this.rules=this.staticThis.getRulesPedantic():this.rules=this.staticThis.getRulesBase(),this.hasRulesGfm=this.rules.url!==void 0},k.prototype.output=function(v){v=v;for(var x,R="";v;){if(x=this.rules.escape.exec(v)){v=v.substring(x[0].length),R+=x[1];continue}if(x=this.rules.autolink.exec(v)){var E=void 0,O=void 0;v=v.substring(x[0].length),x[2]==="@"?(E=this.options.escape(x[1].charAt(6)===":"?this.mangle(x[1].substring(7)):this.mangle(x[1])),O=this.mangle("mailto:")+E):(E=this.options.escape(x[1]),O=E),R+=this.renderer.link(O,null,E);continue}if(!this.inLink&&this.hasRulesGfm&&(x=this.rules.url.exec(v))){var E=void 0,O=void 0;v=v.substring(x[0].length),E=this.options.escape(x[1]),O=E,R+=this.renderer.link(O,null,E);continue}if(x=this.rules.tag.exec(v)){!this.inLink&&/^/i.test(x[0])&&(this.inLink=!1),v=v.substring(x[0].length),R+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(x[0]):this.options.escape(x[0]):x[0];continue}if(x=this.rules.link.exec(v)){v=v.substring(x[0].length),this.inLink=!0,R+=this.outputLink(x,{href:x[2],title:x[3]}),this.inLink=!1;continue}if((x=this.rules.reflink.exec(v))||(x=this.rules.nolink.exec(v))){v=v.substring(x[0].length);var Z=(x[2]||x[1]).replace(/\s+/g," "),V=this.links[Z.toLowerCase()];if(!V||!V.href){R+=x[0].charAt(0),v=x[0].substring(1)+v;continue}this.inLink=!0,R+=this.outputLink(x,V),this.inLink=!1;continue}if(x=this.rules.strong.exec(v)){v=v.substring(x[0].length),R+=this.renderer.strong(this.output(x[2]||x[1]));continue}if(x=this.rules.em.exec(v)){v=v.substring(x[0].length),R+=this.renderer.em(this.output(x[2]||x[1]));continue}if(x=this.rules.code.exec(v)){v=v.substring(x[0].length),R+=this.renderer.codespan(this.options.escape(x[2].trim(),!0));continue}if(x=this.rules.br.exec(v)){v=v.substring(x[0].length),R+=this.renderer.br();continue}if(this.hasRulesGfm&&(x=this.rules.del.exec(v))){v=v.substring(x[0].length),R+=this.renderer.del(this.output(x[1]));continue}if(x=this.rules.text.exec(v)){v=v.substring(x[0].length),R+=this.renderer.text(this.options.escape(this.smartypants(x[0])));continue}if(v)throw new Error("Infinite loop on byte: "+v.charCodeAt(0))}return R},k.prototype.outputLink=function(v,x){var R=this.options.escape(x.href),E=x.title?this.options.escape(x.title):null;return v[0].charAt(0)!=="!"?this.renderer.link(R,E,this.output(v[1])):this.renderer.image(R,E,this.options.escape(v[1]))},k.prototype.smartypants=function(v){return this.options.smartypants?v.replace(/---/g,"\u2014").replace(/--/g,"\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201C").replace(/"/g,"\u201D").replace(/\.{3}/g,"\u2026"):v},k.prototype.mangle=function(v){if(!this.options.mangle)return v;for(var x="",R=v.length,E=0;E.5&&(O="x"+v.charCodeAt(E).toString(16)),x+="&#"+O+";"}return x},k}();Lt.rulesBase=null,Lt.rulesPedantic=null,Lt.rulesGfm=null,Lt.rulesBreaks=null;var Bt=function(){function k(v){this.simpleRenderers=[],this.line=0,this.tokens=[],this.token=null,this.options=v||Ut.options,this.renderer=this.options.renderer||new ot(this.options)}return k.parse=function(v,x,R){var E=new this(R);return E.parse(x,v)},k.prototype.parse=function(v,x){this.inlineLexer=new Lt(Lt,v,this.options,this.renderer),this.tokens=x.reverse();for(var R="";this.next();)R+=this.tok();return R},k.prototype.debug=function(v,x){this.inlineLexer=new Lt(Lt,v,this.options,this.renderer),this.tokens=x.reverse();for(var R="";this.next();){var E=this.tok();this.token.line=this.line+=E.split(` +`).length-1,R+=E}return R},k.prototype.next=function(){return this.token=this.tokens.pop()},k.prototype.getNextElement=function(){return this.tokens[this.tokens.length-1]},k.prototype.parseText=function(){for(var v=this.token.text,x;(x=this.getNextElement())&&x.type==n.TokenType.text;)v+=` +`+this.next().text;return this.inlineLexer.output(v)},k.prototype.tok=function(){var v,x;switch(this.token.type){case n.TokenType.space:return"";case n.TokenType.paragraph:return this.renderer.paragraph(this.inlineLexer.output(this.token.text));case n.TokenType.text:return this.options.isNoP?this.parseText():this.renderer.paragraph(this.parseText());case n.TokenType.heading:return this.renderer.heading(this.inlineLexer.output(this.token.text),this.token.depth,this.token.text);case n.TokenType.listStart:{for(var R="",E=this.token.ordered;this.next().type!=n.TokenType.listEnd;)R+=this.tok();return this.renderer.list(R,E)}case n.TokenType.listItemStart:{for(var R="";this.next().type!=n.TokenType.listItemEnd;)R+=this.token.type==n.TokenType.text?this.parseText():this.tok();return this.renderer.listitem(R)}case n.TokenType.looseItemStart:{for(var R="";this.next().type!=n.TokenType.listItemEnd;)R+=this.tok();return this.renderer.listitem(R)}case n.TokenType.code:return this.renderer.code(this.token.text,this.token.lang,this.token.escaped,this.token.meta);case n.TokenType.table:{var O="",R="",Z=void 0;Z="";for(var V=0;VAn error occured:

    "+this.options.escape(v.message+"",!0)+"
    ";throw v},k}();Ut.options=new c,Ut.simpleRenderers=[];var Qt=function(){function k(v,x){this.staticThis=v,this.links={},this.tokens=[],this.options=x||Ut.options,this.setRules()}return k.lex=function(v,x,R,E){var O=new this(this,x);return O.getTokens(v,R,E)},k.getRulesBase=function(){if(this.rulesBase)return this.rulesBase;var v={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/,bullet:/(?:[*+-]|\d+\.)/,item:/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/};v.item=new t(v.item,"gm").setGroup(/bull/g,v.bullet).getRegexp(),v.list=new t(v.list).setGroup(/bull/g,v.bullet).setGroup("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))").setGroup("def","\\n+(?="+v.def.source+")").getRegexp();var x="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";return v.html=new t(v.html).setGroup("comment",//).setGroup("closed",/<(tag)[\s\S]+?<\/\1>/).setGroup("closing",/])*?>/).setGroup(/tag/g,x).getRegexp(),v.paragraph=new t(v.paragraph).setGroup("hr",v.hr).setGroup("heading",v.heading).setGroup("lheading",v.lheading).setGroup("blockquote",v.blockquote).setGroup("tag","<"+x).setGroup("def",v.def).getRegexp(),this.rulesBase=v},k.getRulesGfm=function(){if(this.rulesGfm)return this.rulesGfm;var v=this.getRulesBase(),x=Object.assign(Object.assign({},v),{fences:/^ *(`{3,}|~{3,})[ \.]*((\S+)? *[^\n]*)\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),R=x.fences.source.replace("\\1","\\2"),E=v.list.source.replace("\\1","\\3");return x.paragraph=new t(v.paragraph).setGroup("(?!","(?!"+R+"|"+E+"|").getRegexp(),this.rulesGfm=x},k.getRulesTable=function(){return this.rulesTables?this.rulesTables:this.rulesTables=Object.assign(Object.assign({},this.getRulesGfm()),{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/})},k.prototype.setRules=function(){this.options.gfm?this.options.tables?this.rules=this.staticThis.getRulesTable():this.rules=this.staticThis.getRulesGfm():this.rules=this.staticThis.getRulesBase(),this.hasRulesGfm=this.rules.fences!==void 0,this.hasRulesTables=this.rules.table!==void 0},k.prototype.getTokens=function(v,x,R){var E=v,O;t:for(;E;){if((O=this.rules.newline.exec(E))&&(E=E.substring(O[0].length),O[0].length>1&&this.tokens.push({type:n.TokenType.space})),O=this.rules.code.exec(E)){E=E.substring(O[0].length);var Z=O[0].replace(/^ {4}/gm,"");this.tokens.push({type:n.TokenType.code,text:this.options.pedantic?Z:Z.replace(/\n+$/,"")});continue}if(this.hasRulesGfm&&(O=this.rules.fences.exec(E))){E=E.substring(O[0].length),this.tokens.push({type:n.TokenType.code,meta:O[2],lang:O[3],text:O[4]||""});continue}if(O=this.rules.heading.exec(E)){E=E.substring(O[0].length),this.tokens.push({type:n.TokenType.heading,depth:O[1].length,text:O[2]});continue}if(x&&this.hasRulesTables&&(O=this.rules.nptable.exec(E))){E=E.substring(O[0].length);for(var V={type:n.TokenType.table,header:O[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:O[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:[]},J=0;J ?/gm,"");this.getTokens(xt),this.tokens.push({type:n.TokenType.blockquoteEnd});continue}if(O=this.rules.list.exec(E)){E=E.substring(O[0].length);var Ht=O[2];this.tokens.push({type:n.TokenType.listStart,ordered:Ht.length>1});for(var xt=O[0].match(this.rules.item),Ot=xt.length,Yt=!1,Xt=void 0,ue=void 0,ke=void 0,J=0;J1&&ue.length>1)&&(E=xt.slice(J+1).join(` +`)+E,J=Ot-1)),ke=Yt||/\n\n(?!\s*$)/.test(V),J!==Ot-1&&(Yt=V.charAt(V.length-1)===` +`,ke||(ke=Yt)),this.tokens.push({type:ke?n.TokenType.looseItemStart:n.TokenType.listItemStart}),this.getTokens(V,!1,R),this.tokens.push({type:n.TokenType.listItemEnd})}this.tokens.push({type:n.TokenType.listEnd});continue}if(O=this.rules.html.exec(E)){E=E.substring(O[0].length);var xe=O[1],Rn=xe==="pre"||xe==="script"||xe==="style";this.tokens.push({type:this.options.sanitize?n.TokenType.paragraph:n.TokenType.html,pre:!this.options.sanitizer&&Rn,text:O[0]});continue}if(x&&(O=this.rules.def.exec(E))){E=E.substring(O[0].length),this.links[O[1].toLowerCase()]={href:O[2],title:O[3]};continue}if(x&&this.hasRulesTables&&(O=this.rules.table.exec(E))){E=E.substring(O[0].length);for(var V={type:n.TokenType.table,header:O[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:O[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:[]},J=0;J0?n.TokenType.paragraph:n.TokenType.text,text:O[1]});continue}if(O=this.rules.text.exec(E)){E=E.substring(O[0].length),this.tokens.push({type:n.TokenType.text,text:O[0]});continue}if(E)throw new Error("Infinite loop on byte: "+E.charCodeAt(0)+(", near text '"+E.slice(0,30)+"...'"))}return{tokens:this.tokens,links:this.links}},k}();Qt.simpleRules=[],Qt.rulesBase=null,Qt.rulesGfm=null,Qt.rulesTables=null,n.BlockLexer=Qt,n.ExtendRegexp=t,n.InlineLexer=Lt,n.Marked=Ut,n.MarkedOptions=c,n.Parser=Bt,n.Renderer=ot,n.escape=a,n.unescape=l,Object.defineProperty(n,"__esModule",{value:!0})})});var ef=Xo(Ei=>{"use strict";var Dy=Ei&&Ei.__extends||function(){var n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var r in s)s.hasOwnProperty(r)&&(i[r]=s[r])},n(t,e)};return function(t,e){n(t,e);function i(){this.constructor=t}t.prototype=e===null?Object.create(e):(i.prototype=e.prototype,new i)}}();Object.defineProperty(Ei,"__esModule",{value:!0});Ei.Extractor=void 0;var Ua=tf(),Ey=function(n){Dy(t,n);function t(e,i){var s=n.call(this)||this;return s.lowercaseKeys=i??!1,s.reset(e),s}return Object.defineProperty(t.prototype,"tables",{get:function(){return this.extractedTables},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){var e=this;return this.extractedTables.map(function(i){return t.tableToObject(i,e.lowercaseKeys)})},enumerable:!1,configurable:!0}),t.prototype.reset=function(e){e===void 0&&(e="rows"),this.mode=e,this.currentRow=[],this.currentTable=[],this.extractedTables=[]},t.prototype.table=function(e,i){return this.extractedTables.push(this.mode==="rows"?this.currentTable:t.transposeTable(this.currentTable)),this.currentTable=[],n.prototype.table.call(this,e,i)},t.prototype.tablerow=function(e){return this.currentTable.push(this.currentRow),this.currentRow=[],n.prototype.tablerow.call(this,e)},t.prototype.tablecell=function(e,i){return this.currentRow.push(e),n.prototype.tablecell.call(this,e,i)},t.transposeTable=function(e){for(var i=[],s=e.length,r=e[0].length,o=0;o0?r[0]:null},t.extractAllObjects=function(e,i,s){var r=t.createExtractor(e,i,s);return r.objects},t.extractTable=function(e,i,s){var r=t.extractAllTables(e,i,s);return r.length>0?r[0]:null},t.extractAllTables=function(e,i,s){var r=t.createExtractor(e,i,s);return r.tables},t.extract=function(e,i,s){var r=t.createExtractor(e,i,s);return r.objects.length>0?JSON.stringify(r.objects[0]):null},t.extractAll=function(e,i,s){var r=t.createExtractor(e,i,s);return r.objects.map(function(o){return JSON.stringify(o)})},t}(Ua.Renderer);Ei.Extractor=Ey});fb(exports,{default:()=>Ol});var $e=ze(require("obsidian"));function Ee(){}var qo=function(){let n=0;return function(){return n++}}();function ut(n){return n===null||typeof n=="undefined"}function pt(n){if(Array.isArray&&Array.isArray(n))return!0;let t=Object.prototype.toString.call(n);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function at(n){return n!==null&&Object.prototype.toString.call(n)==="[object Object]"}var jt=n=>(typeof n=="number"||n instanceof Number)&&isFinite(+n);function me(n,t){return jt(n)?n:t}function nt(n,t){return typeof n=="undefined"?t:n}var Go=(n,t)=>typeof n=="string"&&n.endsWith("%")?parseFloat(n)/100:n/t,Ks=(n,t)=>typeof n=="string"&&n.endsWith("%")?parseFloat(n)/100*t:+n;function wt(n,t,e){if(n&&typeof n.call=="function")return n.apply(e,t)}function Ct(n,t,e,i){let s,r,o;if(pt(n))if(r=n.length,i)for(s=r-1;s>=0;s--)t.call(e,n[s],s);else for(s=0;sn,x:n=>n.x,y:n=>n.y};function Be(n,t){return(Zc[t]||(Zc[t]=pb(t)))(n)}function pb(n){let t=Jc(n);return e=>{for(let i of t){if(i==="")break;e=e&&e[i]}return e}}function Jc(n){let t=n.split("."),e=[],i="";for(let s of t)i+=s,i.endsWith("\\")?i=i.slice(0,-1)+".":(e.push(i),i="");return e}function Vi(n){return n.charAt(0).toUpperCase()+n.slice(1)}var Nt=n=>typeof n!="undefined",le=n=>typeof n=="function",Zs=(n,t)=>{if(n.size!==t.size)return!1;for(let e of n)if(!t.has(e))return!1;return!0};function Uo(n){return n.type==="mouseup"||n.type==="click"||n.type==="contextmenu"}var gt=Math.PI,kt=2*gt,Qc=kt+gt,Yi=Number.POSITIVE_INFINITY,Xi=gt/180,Rt=gt/2,Se=gt/4,xi=gt*2/3,be=Math.log10,Me=Math.sign;function Js(n){let t=Math.round(n);n=Vn(n,t,n/1e3)?t:n;let e=Math.pow(10,Math.floor(be(n))),i=n/e;return(i<=1?1:i<=2?2:i<=5?5:10)*e}function Ko(n){let t=[],e=Math.sqrt(n),i;for(i=1;is-r).pop(),t}function Oe(n){return!isNaN(parseFloat(n))&&isFinite(n)}function Vn(n,t,e){return Math.abs(n-t)=n}function Qs(n,t,e){let i,s,r;for(i=0,s=n.length;il&&c=Math.min(t,e)-i&&n<=Math.max(t,e)+i}function qi(n,t,e){e=e||(o=>n[o]1;)r=s+i>>1,e(r)?s=r:i=r;return{lo:s,hi:i}}var Re=(n,t,e,i)=>qi(n,e,i?s=>n[s][t]<=e:s=>n[s][t]qi(n,e,i=>n[i][t]>=e);function ta(n,t,e){let i=0,s=n.length;for(;ii&&n[s-1]>e;)s--;return i>0||s{let i="_onData"+Vi(e),s=n[e];Object.defineProperty(n,e,{configurable:!0,enumerable:!1,value(...r){let o=s.apply(this,r);return n._chartjs.listeners.forEach(a=>{typeof a[i]=="function"&&a[i](...r)}),o}})})}function nr(n,t){let e=n._chartjs;if(!e)return;let i=e.listeners,s=i.indexOf(t);s!==-1&&i.splice(s,1),!(i.length>0)&&(eh.forEach(r=>{delete n[r]}),delete n._chartjs)}function ir(n){let t=new Set,e,i;for(e=0,i=n.length;eArray.prototype.slice.call(o)),s=!1,r=[];return function(...o){r=i(o),s||(s=!0,sr.call(window,()=>{s=!1,n.apply(t,r)}))}}function na(n,t){let e;return function(...i){return t?(clearTimeout(e),e=setTimeout(n,t,i)):n.apply(this,i),t}}var Gi=n=>n==="start"?"left":n==="end"?"right":"center",ie=(n,t,e)=>n==="start"?t:n==="end"?e:(t+e)/2,ia=(n,t,e,i)=>n===(i?"left":"right")?e:n==="center"?(t+e)/2:t;function or(n,t,e){let i=t.length,s=0,r=i;if(n._sorted){let{iScale:o,_parsed:a}=n,l=o.axis,{min:c,max:h,minDefined:f,maxDefined:g}=o.getUserBounds();f&&(s=Zt(Math.min(Re(a,o.axis,c).lo,e?i:Re(t,l,o.getPixelForValue(c)).lo),0,i-1)),g?r=Zt(Math.max(Re(a,o.axis,h,!0).hi+1,e?0:Re(t,l,o.getPixelForValue(h),!0).hi+1),s,i)-s:r=i-s}return{start:s,count:r}}function ar(n){let{xScale:t,yScale:e,_scaleRanges:i}=n,s={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!i)return n._scaleRanges=s,!0;let r=i.xmin!==t.min||i.xmax!==t.max||i.ymin!==e.min||i.ymax!==e.max;return Object.assign(i,s),r}var lr=n=>n===0||n===1,nh=(n,t,e)=>-(Math.pow(2,10*(n-=1))*Math.sin((n-t)*kt/e)),ih=(n,t,e)=>Math.pow(2,-10*n)*Math.sin((n-t)*kt/e)+1,qn={linear:n=>n,easeInQuad:n=>n*n,easeOutQuad:n=>-n*(n-2),easeInOutQuad:n=>(n/=.5)<1?.5*n*n:-.5*(--n*(n-2)-1),easeInCubic:n=>n*n*n,easeOutCubic:n=>(n-=1)*n*n+1,easeInOutCubic:n=>(n/=.5)<1?.5*n*n*n:.5*((n-=2)*n*n+2),easeInQuart:n=>n*n*n*n,easeOutQuart:n=>-((n-=1)*n*n*n-1),easeInOutQuart:n=>(n/=.5)<1?.5*n*n*n*n:-.5*((n-=2)*n*n*n-2),easeInQuint:n=>n*n*n*n*n,easeOutQuint:n=>(n-=1)*n*n*n*n+1,easeInOutQuint:n=>(n/=.5)<1?.5*n*n*n*n*n:.5*((n-=2)*n*n*n*n+2),easeInSine:n=>-Math.cos(n*Rt)+1,easeOutSine:n=>Math.sin(n*Rt),easeInOutSine:n=>-.5*(Math.cos(gt*n)-1),easeInExpo:n=>n===0?0:Math.pow(2,10*(n-1)),easeOutExpo:n=>n===1?1:-Math.pow(2,-10*n)+1,easeInOutExpo:n=>lr(n)?n:n<.5?.5*Math.pow(2,10*(n*2-1)):.5*(-Math.pow(2,-10*(n*2-1))+2),easeInCirc:n=>n>=1?n:-(Math.sqrt(1-n*n)-1),easeOutCirc:n=>Math.sqrt(1-(n-=1)*n),easeInOutCirc:n=>(n/=.5)<1?-.5*(Math.sqrt(1-n*n)-1):.5*(Math.sqrt(1-(n-=2)*n)+1),easeInElastic:n=>lr(n)?n:nh(n,.075,.3),easeOutElastic:n=>lr(n)?n:ih(n,.075,.3),easeInOutElastic(n){let t=.1125,e=.45;return lr(n)?n:n<.5?.5*nh(n*2,t,e):.5+.5*ih(n*2-1,t,e)},easeInBack(n){let t=1.70158;return n*n*((t+1)*n-t)},easeOutBack(n){let t=1.70158;return(n-=1)*n*((t+1)*n+t)+1},easeInOutBack(n){let t=1.70158;return(n/=.5)<1?.5*(n*n*(((t*=1.525)+1)*n-t)):.5*((n-=2)*n*(((t*=1.525)+1)*n+t)+2)},easeInBounce:n=>1-qn.easeOutBounce(1-n),easeOutBounce(n){let t=7.5625,e=2.75;return n<1/e?t*n*n:n<2/e?t*(n-=1.5/e)*n+.75:n<2.5/e?t*(n-=2.25/e)*n+.9375:t*(n-=2.625/e)*n+.984375},easeInOutBounce:n=>n<.5?qn.easeInBounce(n*2)*.5:qn.easeOutBounce(n*2-1)*.5+.5};function Ui(n){return n+.5|0}var vn=(n,t,e)=>Math.max(Math.min(n,e),t);function Ki(n){return vn(Ui(n*2.55),0,255)}function _n(n){return vn(Ui(n*255),0,255)}function Ze(n){return vn(Ui(n/2.55)/100,0,1)}function sh(n){return vn(Ui(n*100),0,100)}var Ce={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},sa=[..."0123456789ABCDEF"],gb=n=>sa[n&15],mb=n=>sa[(n&240)>>4]+sa[n&15],cr=n=>(n&240)>>4==(n&15),bb=n=>cr(n.r)&&cr(n.g)&&cr(n.b)&&cr(n.a);function vb(n){var t=n.length,e;return n[0]==="#"&&(t===4||t===5?e={r:255&Ce[n[1]]*17,g:255&Ce[n[2]]*17,b:255&Ce[n[3]]*17,a:t===5?Ce[n[4]]*17:255}:(t===7||t===9)&&(e={r:Ce[n[1]]<<4|Ce[n[2]],g:Ce[n[3]]<<4|Ce[n[4]],b:Ce[n[5]]<<4|Ce[n[6]],a:t===9?Ce[n[7]]<<4|Ce[n[8]]:255})),e}var _b=(n,t)=>n<255?t(n):"";function yb(n){var t=bb(n)?gb:mb;return n?"#"+t(n.r)+t(n.g)+t(n.b)+_b(n.a,t):void 0}var xb=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function rh(n,t,e){let i=t*Math.min(e,1-e),s=(r,o=(r+n/30)%12)=>e-i*Math.max(Math.min(o-3,9-o,1),-1);return[s(0),s(8),s(4)]}function wb(n,t,e){let i=(s,r=(s+n/60)%6)=>e-e*t*Math.max(Math.min(r,4-r,1),0);return[i(5),i(3),i(1)]}function kb(n,t,e){let i=rh(n,1,.5),s;for(t+e>1&&(s=1/(t+e),t*=s,e*=s),s=0;s<3;s++)i[s]*=1-t-e,i[s]+=t;return i}function Sb(n,t,e,i,s){return n===s?(t-e)/i+(t.5?h/(2-r-o):h/(r+o),l=Sb(e,i,s,h,r),l=l*60+.5),[l|0,c||0,a]}function oa(n,t,e,i){return(Array.isArray(t)?n(t[0],t[1],t[2]):n(t,e,i)).map(_n)}function aa(n,t,e){return oa(rh,n,t,e)}function Mb(n,t,e){return oa(kb,n,t,e)}function Cb(n,t,e){return oa(wb,n,t,e)}function oh(n){return(n%360+360)%360}function Pb(n){let t=xb.exec(n),e=255,i;if(!t)return;t[5]!==i&&(e=t[6]?Ki(+t[5]):_n(+t[5]));let s=oh(+t[2]),r=+t[3]/100,o=+t[4]/100;return t[1]==="hwb"?i=Mb(s,r,o):t[1]==="hsv"?i=Cb(s,r,o):i=aa(s,r,o),{r:i[0],g:i[1],b:i[2],a:e}}function Tb(n,t){var e=ra(n);e[0]=oh(e[0]+t),e=aa(e),n.r=e[0],n.g=e[1],n.b=e[2]}function Db(n){if(!n)return;let t=ra(n),e=t[0],i=sh(t[1]),s=sh(t[2]);return n.a<255?`hsla(${e}, ${i}%, ${s}%, ${Ze(n.a)})`:`hsl(${e}, ${i}%, ${s}%)`}var ah={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},lh={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function Eb(){let n={},t=Object.keys(lh),e=Object.keys(ah),i,s,r,o,a;for(i=0;i>16&255,r>>8&255,r&255]}return n}var hr;function Ob(n){hr||(hr=Eb(),hr.transparent=[0,0,0,0]);let t=hr[n.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var Ab=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Rb(n){let t=Ab.exec(n),e=255,i,s,r;if(!!t){if(t[7]!==i){let o=+t[7];e=t[8]?Ki(o):vn(o*255,0,255)}return i=+t[1],s=+t[3],r=+t[5],i=255&(t[2]?Ki(i):vn(i,0,255)),s=255&(t[4]?Ki(s):vn(s,0,255)),r=255&(t[6]?Ki(r):vn(r,0,255)),{r:i,g:s,b:r,a:e}}}function Lb(n){return n&&(n.a<255?`rgba(${n.r}, ${n.g}, ${n.b}, ${Ze(n.a)})`:`rgb(${n.r}, ${n.g}, ${n.b})`)}var la=n=>n<=.0031308?n*12.92:Math.pow(n,1/2.4)*1.055-.055,wi=n=>n<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4);function Fb(n,t,e){let i=wi(Ze(n.r)),s=wi(Ze(n.g)),r=wi(Ze(n.b));return{r:_n(la(i+e*(wi(Ze(t.r))-i))),g:_n(la(s+e*(wi(Ze(t.g))-s))),b:_n(la(r+e*(wi(Ze(t.b))-r))),a:n.a+e*(t.a-n.a)}}function ur(n,t,e){if(n){let i=ra(n);i[t]=Math.max(0,Math.min(i[t]+i[t]*e,t===0?360:1)),i=aa(i),n.r=i[0],n.g=i[1],n.b=i[2]}}function ch(n,t){return n&&Object.assign(t||{},n)}function hh(n){var t={r:0,g:0,b:0,a:255};return Array.isArray(n)?n.length>=3&&(t={r:n[0],g:n[1],b:n[2],a:255},n.length>3&&(t.a=_n(n[3]))):(t=ch(n,{r:0,g:0,b:0,a:1}),t.a=_n(t.a)),t}function Ib(n){return n.charAt(0)==="r"?Rb(n):Pb(n)}var Zi=class{constructor(t){if(t instanceof Zi)return t;let e=typeof t,i;e==="object"?i=hh(t):e==="string"&&(i=vb(t)||Ob(t)||Ib(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=ch(this._rgb);return t&&(t.a=Ze(t.a)),t}set rgb(t){this._rgb=hh(t)}rgbString(){return this._valid?Lb(this._rgb):void 0}hexString(){return this._valid?yb(this._rgb):void 0}hslString(){return this._valid?Db(this._rgb):void 0}mix(t,e){if(t){let i=this.rgb,s=t.rgb,r,o=e===r?.5:e,a=2*o-1,l=i.a-s.a,c=((a*l==-1?a:(a+l)/(1+a*l))+1)/2;r=1-c,i.r=255&c*i.r+r*s.r+.5,i.g=255&c*i.g+r*s.g+.5,i.b=255&c*i.b+r*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=Fb(this._rgb,t._rgb,e)),this}clone(){return new Zi(this.rgb)}alpha(t){return this._rgb.a=_n(t),this}clearer(t){let e=this._rgb;return e.a*=1-t,this}greyscale(){let t=this._rgb,e=Ui(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=e,this}opaquer(t){let e=this._rgb;return e.a*=1+t,this}negate(){let t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return ur(this._rgb,2,t),this}darken(t){return ur(this._rgb,2,-t),this}saturate(t){return ur(this._rgb,1,t),this}desaturate(t){return ur(this._rgb,1,-t),this}rotate(t){return Tb(this._rgb,t),this}};function uh(n){return new Zi(n)}function ca(n){if(n&&typeof n=="object"){let t=n.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function Je(n){return ca(n)?n:uh(n)}function Gn(n){return ca(n)?n:uh(n).saturate(.5).darken(.1).hexString()}var yn=Object.create(null),fr=Object.create(null);function Ji(n,t){if(!t)return n;let e=t.split(".");for(let i=0,s=e.length;ie.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,i)=>Gn(i.backgroundColor),this.hoverBorderColor=(e,i)=>Gn(i.borderColor),this.hoverColor=(e,i)=>Gn(i.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t)}set(t,e){return ha(this,t,e)}get(t){return Ji(this,t)}describe(t,e){return ha(fr,t,e)}override(t,e){return ha(yn,t,e)}route(t,e,i,s){let r=Ji(this,t),o=Ji(this,i),a="_"+e;Object.defineProperties(r,{[a]:{value:r[e],writable:!0},[e]:{enumerable:!0,get(){let l=this[a],c=o[s];return at(l)?Object.assign({},c,l):nt(l,c)},set(l){this[a]=l}}})}},ft=new fh({_scriptable:n=>!n.startsWith("on"),_indexable:n=>n!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});function dh(n){return!n||ut(n.size)||ut(n.family)?null:(n.style?n.style+" ":"")+(n.weight?n.weight+" ":"")+n.size+"px "+n.family}function ki(n,t,e,i,s){let r=t[s];return r||(r=t[s]=n.measureText(s).width,e.push(s)),r>i&&(i=r),i}function ua(n,t,e,i){i=i||{};let s=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==t&&(s=i.data={},r=i.garbageCollect=[],i.font=t),n.save(),n.font=t;let o=0,a=e.length,l,c,h,f,g;for(l=0;le.length){for(l=0;l0&&n.stroke()}}function Un(n,t,e){return e=e||.5,!t||n&&n.x>t.left-e&&n.xt.top-e&&n.y0&&r.strokeColor!=="",l,c;for(n.save(),n.font=s.string,$b(n,r),l=0;l+n||0;function ts(n,t){let e={},i=at(t),s=i?Object.keys(t):t,r=at(n)?i?o=>nt(n[o],n[t[o]]):o=>n[o]:()=>n;for(let o of s)e[o]=Nb(r(o));return e}function gr(n){return ts(n,{top:"y",right:"x",bottom:"y",left:"x"})}function Le(n){return ts(n,["topLeft","topRight","bottomLeft","bottomRight"])}function Vt(n){let t=gr(n);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function Ft(n,t){n=n||{},t=t||ft.font;let e=nt(n.size,t.size);typeof e=="string"&&(e=parseInt(e,10));let i=nt(n.style,t.style);i&&!(""+i).match(Bb)&&(console.warn('Invalid font style specified: "'+i+'"'),i="");let s={family:nt(n.family,t.family),lineHeight:ph(nt(n.lineHeight,t.lineHeight),e),size:e,style:i,weight:nt(n.weight,t.weight),string:""};return s.string=dh(s),s}function Kn(n,t,e,i){let s=!0,r,o,a;for(r=0,o=n.length;re&&a===0?0:a+l;return{min:o(i,-Math.abs(r)),max:o(s,r)}}function Ne(n,t){return Object.assign(Object.create(n),t)}function es(n,t=[""],e=n,i,s=()=>n[0]){Nt(i)||(i=vh("_fallback",n));let r={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:n,_rootScopes:e,_fallback:i,_getTarget:s,override:o=>es([o,...n],t,e,i)};return new Proxy(r,{deleteProperty(o,a){return delete o[a],delete o._keys,delete n[0][a],!0},get(o,a){return gh(o,a,()=>Ub(a,t,n,o))},getOwnPropertyDescriptor(o,a){return Reflect.getOwnPropertyDescriptor(o._scopes[0],a)},getPrototypeOf(){return Reflect.getPrototypeOf(n[0])},has(o,a){return _h(o).includes(a)},ownKeys(o){return _h(o)},set(o,a,l){let c=o._storage||(o._storage=s());return o[a]=c[a]=l,delete o._keys,!0}})}function kn(n,t,e,i){let s={_cacheable:!1,_proxy:n,_context:t,_subProxy:e,_stack:new Set,_descriptors:mr(n,i),setContext:r=>kn(n,r,e,i),override:r=>kn(n.override(r),t,e,i)};return new Proxy(s,{deleteProperty(r,o){return delete r[o],delete n[o],!0},get(r,o,a){return gh(r,o,()=>Wb(r,o,a))},getOwnPropertyDescriptor(r,o){return r._descriptors.allKeys?Reflect.has(n,o)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(n,o)},getPrototypeOf(){return Reflect.getPrototypeOf(n)},has(r,o){return Reflect.has(n,o)},ownKeys(){return Reflect.ownKeys(n)},set(r,o,a){return n[o]=a,delete r[o],!0}})}function mr(n,t={scriptable:!0,indexable:!0}){let{_scriptable:e=t.scriptable,_indexable:i=t.indexable,_allKeys:s=t.allKeys}=n;return{allKeys:s,scriptable:e,indexable:i,isScriptable:le(e)?e:()=>e,isIndexable:le(i)?i:()=>i}}var Hb=(n,t)=>n?n+Vi(t):t,ga=(n,t)=>at(t)&&n!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function gh(n,t,e){if(Object.prototype.hasOwnProperty.call(n,t))return n[t];let i=e();return n[t]=i,i}function Wb(n,t,e){let{_proxy:i,_context:s,_subProxy:r,_descriptors:o}=n,a=i[t];return le(a)&&o.isScriptable(t)&&(a=Vb(t,a,n,e)),pt(a)&&a.length&&(a=Yb(t,a,n,o.isIndexable)),ga(t,a)&&(a=kn(a,s,r&&r[t],o)),a}function Vb(n,t,e,i){let{_proxy:s,_context:r,_subProxy:o,_stack:a}=e;if(a.has(n))throw new Error("Recursion detected: "+Array.from(a).join("->")+"->"+n);return a.add(n),t=t(r,o||i),a.delete(n),ga(n,t)&&(t=ma(s._scopes,s,n,t)),t}function Yb(n,t,e,i){let{_proxy:s,_context:r,_subProxy:o,_descriptors:a}=e;if(Nt(r.index)&&i(n))t=t[r.index%t.length];else if(at(t[0])){let l=t,c=s._scopes.filter(h=>h!==l);t=[];for(let h of l){let f=ma(c,s,n,h);t.push(kn(f,r,o&&o[n],a))}}return t}function mh(n,t,e){return le(n)?n(t,e):n}var Xb=(n,t)=>n===!0?t:typeof n=="string"?Be(t,n):void 0;function qb(n,t,e,i,s){for(let r of t){let o=Xb(e,r);if(o){n.add(o);let a=mh(o._fallback,e,s);if(Nt(a)&&a!==e&&a!==i)return a}else if(o===!1&&Nt(i)&&e!==i)return null}return!1}function ma(n,t,e,i){let s=t._rootScopes,r=mh(t._fallback,e,i),o=[...n,...s],a=new Set;a.add(i);let l=bh(a,o,e,r||e,i);return l===null||Nt(r)&&r!==e&&(l=bh(a,o,r,l,i),l===null)?!1:es(Array.from(a),[""],s,r,()=>Gb(t,e,i))}function bh(n,t,e,i,s){for(;e;)e=qb(n,t,e,i,s);return e}function Gb(n,t,e){let i=n._getTarget();t in i||(i[t]={});let s=i[t];return pt(s)&&at(e)?e:s}function Ub(n,t,e,i){let s;for(let r of t)if(s=vh(Hb(r,n),e),Nt(s))return ga(n,s)?ma(e,i,n,s):s}function vh(n,t){for(let e of t){if(!e)continue;let i=e[n];if(Nt(i))return i}}function _h(n){let t=n._keys;return t||(t=n._keys=Kb(n._scopes)),t}function Kb(n){let t=new Set;for(let e of n)for(let i of Object.keys(e).filter(s=>!s.startsWith("_")))t.add(i);return Array.from(t)}function br(n,t,e,i){let{iScale:s}=n,{key:r="r"}=this._parsing,o=new Array(i),a,l,c,h;for(a=0,l=i;atn==="x"?"y":"x";function xh(n,t,e,i){let s=n.skip?t:n,r=t,o=e.skip?t:e,a=Ke(r,s),l=Ke(o,r),c=a/(a+l),h=l/(a+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;let f=i*c,g=i*h;return{previous:{x:r.x-f*(o.x-s.x),y:r.y-f*(o.y-s.y)},next:{x:r.x+g*(o.x-s.x),y:r.y+g*(o.y-s.y)}}}function Jb(n,t,e){let i=n.length,s,r,o,a,l,c=Si(n,0);for(let h=0;h!c.skip)),t.cubicInterpolationMode==="monotone")wh(n,s);else{let c=i?n[n.length-1]:n[0];for(r=0,o=n.length;rwindow.getComputedStyle(n,null);function kh(n,t){return xr(n).getPropertyValue(t)}var e0=["top","right","bottom","left"];function Zn(n,t,e){let i={};e=e?"-"+e:"";for(let s=0;s<4;s++){let r=e0[s];i[r]=parseFloat(n[t+"-"+r+e])||0}return i.width=i.left+i.right,i.height=i.top+i.bottom,i}var n0=(n,t,e)=>(n>0||t>0)&&(!e||!e.shadowRoot);function i0(n,t){let e=n.touches,i=e&&e.length?e[0]:n,{offsetX:s,offsetY:r}=i,o=!1,a,l;if(n0(s,r,n.target))a=s,l=r;else{let c=t.getBoundingClientRect();a=i.clientX-c.left,l=i.clientY-c.top,o=!0}return{x:a,y:l,box:o}}function nn(n,t){if("native"in n)return n;let{canvas:e,currentDevicePixelRatio:i}=t,s=xr(e),r=s.boxSizing==="border-box",o=Zn(s,"padding"),a=Zn(s,"border","width"),{x:l,y:c,box:h}=i0(n,e),f=o.left+(h&&a.left),g=o.top+(h&&a.top),{width:p,height:m}=t;return r&&(p-=o.width+a.width,m-=o.height+a.height),{x:Math.round((l-f)/p*e.width/i),y:Math.round((c-g)/m*e.height/i)}}function s0(n,t,e){let i,s;if(t===void 0||e===void 0){let r=ns(n);if(!r)t=n.clientWidth,e=n.clientHeight;else{let o=r.getBoundingClientRect(),a=xr(r),l=Zn(a,"border","width"),c=Zn(a,"padding");t=o.width-c.width-l.width,e=o.height-c.height-l.height,i=yr(a.maxWidth,r,"clientWidth"),s=yr(a.maxHeight,r,"clientHeight")}}return{width:t,height:e,maxWidth:i||Yi,maxHeight:s||Yi}}var va=n=>Math.round(n*10)/10;function _a(n,t,e,i){let s=xr(n),r=Zn(s,"margin"),o=yr(s.maxWidth,n,"clientWidth")||Yi,a=yr(s.maxHeight,n,"clientHeight")||Yi,l=s0(n,t,e),{width:c,height:h}=l;if(s.boxSizing==="content-box"){let f=Zn(s,"border","width"),g=Zn(s,"padding");c-=g.width+f.width,h-=g.height+f.height}return c=Math.max(0,c-r.width),h=Math.max(0,i?Math.floor(c/i):h-r.height),c=va(Math.min(c,o,l.maxWidth)),h=va(Math.min(h,a,l.maxHeight)),c&&!h&&(h=va(c/2)),{width:c,height:h}}function wr(n,t,e){let i=t||1,s=Math.floor(n.height*i),r=Math.floor(n.width*i);n.height=s/i,n.width=r/i;let o=n.canvas;return o.style&&(e||!o.style.height&&!o.style.width)&&(o.style.height=`${n.height}px`,o.style.width=`${n.width}px`),n.currentDevicePixelRatio!==i||o.height!==s||o.width!==r?(n.currentDevicePixelRatio=i,o.height=s,o.width=r,n.ctx.setTransform(i,0,0,i,0,0),!0):!1}var ya=function(){let n=!1;try{let t={get passive(){return n=!0,!1}};window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(t){}return n}();function kr(n,t){let e=kh(n,t),i=e&&e.match(/^(\d+)(\.\d+)?px$/);return i?+i[1]:void 0}function sn(n,t,e,i){return{x:n.x+e*(t.x-n.x),y:n.y+e*(t.y-n.y)}}function xa(n,t,e,i){return{x:n.x+e*(t.x-n.x),y:i==="middle"?e<.5?n.y:t.y:i==="after"?e<1?n.y:t.y:e>0?t.y:n.y}}function wa(n,t,e,i){let s={x:n.cp2x,y:n.cp2y},r={x:t.cp1x,y:t.cp1y},o=sn(n,s,e),a=sn(s,r,e),l=sn(r,t,e),c=sn(o,a,e),h=sn(a,l,e);return sn(c,h,e)}var Sh=new Map;function r0(n,t){t=t||{};let e=n+JSON.stringify(t),i=Sh.get(e);return i||(i=new Intl.NumberFormat(n,t),Sh.set(e,i)),i}function Jn(n,t,e){return r0(t,e).format(n)}var o0=function(n,t){return{x(e){return n+n+t-e},setWidth(e){t=e},textAlign(e){return e==="center"?e:e==="right"?"left":"right"},xPlus(e,i){return e-i},leftForLtr(e,i){return e-i}}},a0=function(){return{x(n){return n},setWidth(n){},textAlign(n){return n},xPlus(n,t){return n+t},leftForLtr(n,t){return n}}};function Sn(n,t,e){return n?o0(t,e):a0()}function Sr(n,t){let e,i;(t==="ltr"||t==="rtl")&&(e=n.canvas.style,i=[e.getPropertyValue("direction"),e.getPropertyPriority("direction")],e.setProperty("direction",t,"important"),n.prevTextDirection=i)}function Mr(n,t){t!==void 0&&(delete n.prevTextDirection,n.canvas.style.setProperty("direction",t[0],t[1]))}function Mh(n){return n==="angle"?{between:Xn,compare:th,normalize:fe}:{between:Ae,compare:(t,e)=>t-e,normalize:t=>t}}function Ch({start:n,end:t,count:e,loop:i,style:s}){return{start:n%e,end:t%e,loop:i&&(t-n+1)%e==0,style:s}}function l0(n,t,e){let{property:i,start:s,end:r}=e,{between:o,normalize:a}=Mh(i),l=t.length,{start:c,end:h,loop:f}=n,g,p;if(f){for(c+=l,h+=l,g=0,p=l;gl(s,F,M)&&a(s,F)!==0,I=()=>a(r,M)===0||l(r,F,M),$=()=>y||D(),N=()=>!y||I();for(let G=h,U=h;G<=f;++G)C=t[G%o],!C.skip&&(M=c(C[i]),M!==F&&(y=l(M,s,r),S===null&&$()&&(S=a(M,s)===0?G:U),S!==null&&N()&&(m.push(Ch({start:S,end:G,loop:g,count:o,style:p})),S=null),U=G,F=M));return S!==null&&m.push(Ch({start:S,end:f,loop:g,count:o,style:p})),m}function Pr(n,t){let e=[],i=n.segments;for(let s=0;ss&&n[r%t].skip;)r--;return r%=t,{start:s,end:r}}function h0(n,t,e,i){let s=n.length,r=[],o=t,a=n[t],l;for(l=t+1;l<=e;++l){let c=n[l%s];c.skip||c.stop?a.skip||(i=!1,r.push({start:t%s,end:(l-1)%s,loop:i}),t=o=c.stop?l:null):(o=l,a.skip&&(t=l)),a=c}return o!==null&&r.push({start:t%s,end:o%s,loop:i}),r}function ka(n,t){let e=n.points,i=n.options.spanGaps,s=e.length;if(!s)return[];let r=!!n._loop,{start:o,end:a}=c0(e,s,r,i);if(i===!0)return Ph(n,[{start:o,end:a,loop:r}],e,t);let l=aa({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)}))}_refresh(){this._request||(this._running=!0,this._request=sr.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((i,s)=>{if(!i.running||!i.items.length)return;let r=i.items,o=r.length-1,a=!1,l;for(;o>=0;--o)l=r[o],l._active?(l._total>i.duration&&(i.duration=l._total),l.tick(t),a=!0):(r[o]=r[r.length-1],r.pop());a&&(s.draw(),this._notify(s,i,t,"progress")),r.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=r.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){let e=this._charts,i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){!e||!e.length||this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){let e=this._charts.get(t);!e||(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((i,s)=>Math.max(i,s._duration),0),this._refresh())}running(t){if(!this._running)return!1;let e=this._charts.get(t);return!(!e||!e.running||!e.items.length)}stop(t){let e=this._charts.get(t);if(!e||!e.items.length)return;let i=e.items,s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}},rn=new Dh,Eh="transparent",d0={boolean(n,t,e){return e>.5?t:n},color(n,t,e){let i=Je(n||Eh),s=i.valid&&Je(t||Eh);return s&&s.valid?s.mix(i,e).hexString():t},number(n,t,e){return n+(t-n)*e}},Oh=class{constructor(t,e,i,s){let r=e[i];s=Kn([t.to,s,r,t.from]);let o=Kn([t.from,r,s]);this._active=!0,this._fn=t.fn||d0[t.type||typeof o],this._easing=qn[t.easing]||qn.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);let s=this._target[this._prop],r=i-this._start,o=this._duration-r;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=r,this._loop=!!t.loop,this._to=Kn([t.to,e,s,t.from]),this._from=Kn([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){let e=t-this._start,i=this._duration,s=this._prop,r=this._from,o=this._loop,a=this._to,l;if(this._active=r!==a&&(o||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[s]=this._fn(r,a,l)}wait(){let t=this._promises||(this._promises=[]);return new Promise((e,i)=>{t.push({res:e,rej:i})})}_notify(t){let e=t?"res":"rej",i=this._promises||[];for(let s=0;sn!=="onProgress"&&n!=="onComplete"&&n!=="fn"});ft.set("animations",{colors:{type:"color",properties:g0},numbers:{type:"number",properties:p0}});ft.describe("animations",{_fallback:"animation"});ft.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:n=>n|0}}}});var is=class{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!at(t))return;let e=this._properties;Object.getOwnPropertyNames(t).forEach(i=>{let s=t[i];if(!at(s))return;let r={};for(let o of m0)r[o]=s[o];(pt(s.properties)&&s.properties||[i]).forEach(o=>{(o===i||!e.has(o))&&e.set(o,r)})})}_animateOptions(t,e){let i=e.options,s=v0(t,i);if(!s)return[];let r=this._createAnimations(s,i);return i.$shared&&b0(t.options.$animations,i).then(()=>{t.options=i},()=>{}),r}_createAnimations(t,e){let i=this._properties,s=[],r=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now(),l;for(l=o.length-1;l>=0;--l){let c=o[l];if(c.charAt(0)==="$")continue;if(c==="options"){s.push(...this._animateOptions(t,e));continue}let h=e[c],f=r[c],g=i.get(c);if(f)if(g&&f.active()){f.update(g,h,a);continue}else f.cancel();if(!g||!g.duration){t[c]=h;continue}r[c]=f=new Oh(g,t,c,h),s.push(f)}return s}update(t,e){if(this._properties.size===0){Object.assign(t,e);return}let i=this._createAnimations(t,e);if(i.length)return rn.add(this._chart,i),!0}};function b0(n,t){let e=[],i=Object.keys(t);for(let s=0;s0||!e&&r<0)return s.index}return null}function $h(n,t){let{chart:e,_cachedMeta:i}=n,s=e._stacks||(e._stacks={}),{iScale:r,vScale:o,index:a}=i,l=r.axis,c=o.axis,h=w0(r,o,i),f=t.length,g;for(let p=0;pe[i].axis===t).shift()}function M0(n,t){return Ne(n,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function C0(n,t,e){return Ne(n,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:e,index:t,mode:"default",type:"data"})}function ss(n,t){let e=n.controller.index,i=n.vScale&&n.vScale.axis;if(!!i){t=t||n._parsed;for(let s of t){let r=s._stacks;if(!r||r[i]===void 0||r[i][e]===void 0)return;delete r[i][e]}}}var Ma=n=>n==="reset"||n==="none",jh=(n,t)=>t?n:Object.assign({},n),P0=(n,t,e)=>n&&!t.hidden&&t._stacked&&{keys:Rh(e,!0),values:null},ve=class{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){let t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Fh(t.vScale,t),this.addElements()}updateIndex(t){this.index!==t&&ss(this._cachedMeta),this.index=t}linkScales(){let t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(f,g,p,m)=>f==="x"?g:f==="r"?m:p,r=e.xAxisID=nt(i.xAxisID,Sa(t,"x")),o=e.yAxisID=nt(i.yAxisID,Sa(t,"y")),a=e.rAxisID=nt(i.rAxisID,Sa(t,"r")),l=e.indexAxis,c=e.iAxisID=s(l,r,o,a),h=e.vAxisID=s(l,o,r,a);e.xScale=this.getScaleForId(r),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(c),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){let e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){let t=this._cachedMeta;this._data&&nr(this._data,this),t._stacked&&ss(t)}_dataCheck(){let t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(at(e))this._data=x0(e);else if(i!==e){if(i){nr(i,this);let s=this._cachedMeta;ss(s),s._parsed=[]}e&&Object.isExtensible(e)&&ea(e,this),this._syncList=[],this._data=e}}addElements(){let t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){let e=this._cachedMeta,i=this.getDataset(),s=!1;this._dataCheck();let r=e._stacked;e._stacked=Fh(e.vScale,e),e.stack!==i.stack&&(s=!0,ss(e),e.stack=i.stack),this._resyncElements(t),(s||r!==e._stacked)&&$h(this,e._parsed)}configure(){let t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){let{_cachedMeta:i,_data:s}=this,{iScale:r,_stacked:o}=i,a=r.axis,l=t===0&&e===s.length?!0:i._sorted,c=t>0&&i._parsed[t-1],h,f,g;if(this._parsing===!1)i._parsed=s,i._sorted=!0,g=s;else{pt(s[t])?g=this.parseArrayData(i,s,t,e):at(s[t])?g=this.parseObjectData(i,s,t,e):g=this.parsePrimitiveData(i,s,t,e);let p=()=>f[a]===null||c&&f[a]y||f=0;--g)if(!m()){this.updateRangeFromParsed(c,t,p,l);break}}return c}getAllParsedValues(t){let e=this._cachedMeta._parsed,i=[],s,r,o;for(s=0,r=e.length;s=0&&tthis.getContext(i,s),y=c.resolveNamedOptions(g,p,m,f);return y.$shared&&(y.$shared=l,r[o]=Object.freeze(jh(y,l))),y}_resolveAnimations(t,e,i){let s=this.chart,r=this._cachedDataOpts,o=`animation-${e}`,a=r[o];if(a)return a;let l;if(s.options.animation!==!1){let h=this.chart.config,f=h.datasetAnimationScopeKeys(this._type,e),g=h.getOptionScopes(this.getDataset(),f);l=h.createResolver(g,this.getContext(t,i,e))}let c=new is(s,l&&l.animations);return l&&l._cacheable&&(r[o]=Object.freeze(c)),c}getSharedOptions(t){if(!!t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Ma(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){let i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,r=this.getSharedOptions(i),o=this.includeOptions(e,r)||r!==s;return this.updateSharedOptions(r,e,i),{sharedOptions:r,includeOptions:o}}updateElement(t,e,i,s){Ma(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Ma(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;let r=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(r)||r})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){let e=this._data,i=this._cachedMeta.data;for(let[a,l,c]of this._syncList)this[a](l,c);this._syncList=[];let s=i.length,r=e.length,o=Math.min(r,s);o&&this.parse(0,o),r>s?this._insertElements(s,r-s,t):r{for(c.length+=e,a=c.length-1;a>=o;a--)c[a]=c[a-e]};for(l(r),a=t;as-r))}return n._cache.$bar}function D0(n){let t=n.iScale,e=T0(t,n.type),i=t._length,s,r,o,a,l=()=>{o===32767||o===-32768||(Nt(a)&&(i=Math.min(i,Math.abs(o-a)||i)),a=o)};for(s=0,r=e.length;s0?s[n-1]:null,a=nMath.abs(a)&&(l=a,c=o),t[e.axis]=c,t._custom={barStart:l,barEnd:c,start:s,end:r,min:o,max:a}}function zh(n,t,e,i){return pt(n)?A0(n,t,e,i):t[e.axis]=e.parse(n,i),t}function Bh(n,t,e,i){let s=n.iScale,r=n.vScale,o=s.getLabels(),a=s===r,l=[],c,h,f,g;for(c=e,h=e+i;c=e?1:-1)}function L0(n){let t,e,i,s,r;return n.horizontal?(t=n.base>n.x,e="left",i="right"):(t=n.basel.controller.options.grouped),r=i.options.stacked,o=[],a=l=>{let c=l.controller.getParsed(e),h=c&&c[l.vScale.axis];if(ut(h)||isNaN(h))return!0};for(let l of s)if(!(e!==void 0&&a(l))&&((r===!1||o.indexOf(l.stack)===-1||r===void 0&&l.stack===void 0)&&o.push(l.stack),l.index===t))break;return o.length||o.push(void 0),o}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){let s=this._getStacks(t,i),r=e!==void 0?s.indexOf(e):-1;return r===-1?s.length-1:r}_getRuler(){let t=this.options,e=this._cachedMeta,i=e.iScale,s=[],r,o;for(r=0,o=e.data.length;r=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){let e=this._cachedMeta,{xScale:i,yScale:s}=e,r=this.getParsed(t),o=i.getLabelForValue(r.x),a=s.getLabelForValue(r.y),l=r._custom;return{label:e.label,value:"("+o+", "+a+(l?", "+l:"")+")"}}update(t){let e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){let r=s==="reset",{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(e,s),h=o.axis,f=a.axis;for(let g=e;gXn(F,a,l,!0)?1:Math.max(D,D*e,I,I*e),m=(F,D,I)=>Xn(F,a,l,!0)?-1:Math.min(D,D*e,I,I*e),y=p(0,c,f),S=p(Rt,h,g),M=m(gt,c,f),C=m(gt+Rt,h,g);i=(y-M)/2,s=(S-C)/2,r=-(y+M)/2,o=-(S+C)/2}return{ratioX:i,ratioY:s,offsetX:r,offsetY:o}}var Qn=class extends ve{constructor(t,e){super(t,e);this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){let i=this.getDataset().data,s=this._cachedMeta;if(this._parsing===!1)s._parsed=i;else{let r=l=>+i[l];if(at(i[t])){let{key:l="value"}=this._parsing;r=c=>+Be(i[c],l)}let o,a;for(o=t,a=t+e;o0&&!isNaN(t)?kt*(Math.abs(t)/e):0}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart,s=i.data.labels||[],r=Jn(e._parsed[t],i.options.locale);return{label:s[t]||"",value:r}}getMaxBorderWidth(t){let e=0,i=this.chart,s,r,o,a,l;if(!t){for(s=0,r=i.data.datasets.length;sn!=="spacing",_indexable:n=>n!=="spacing"};Qn.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(n){let t=n.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:e}}=n.legend.options;return t.labels.map((i,s)=>{let o=n.getDatasetMeta(0).controller.getStyle(s);return{text:i,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,pointStyle:e,hidden:!n.getDataVisibility(s),index:s}})}return[]}},onClick(n,t,e){e.chart.toggleDataVisibility(t.index),e.chart.update()}},tooltip:{callbacks:{title(){return""},label(n){let t=n.label,e=": "+n.formattedValue;return pt(t)?(t=t.slice(),t[0]+=e):t+=e,t}}}}};var as=class extends ve{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){let e=this._cachedMeta,{dataset:i,data:s=[],_dataset:r}=e,o=this.chart._animationsDisabled,{start:a,count:l}=or(e,s,o);this._drawStart=a,this._drawCount=l,ar(e)&&(a=0,l=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!r._decimated,i.points=s;let c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:c},t),this.updateElements(s,a,l,t)}updateElements(t,e,i,s){let r=s==="reset",{iScale:o,vScale:a,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:h,includeOptions:f}=this._getSharedOptions(e,s),g=o.axis,p=a.axis,{spanGaps:m,segment:y}=this.options,S=Oe(m)?m:Number.POSITIVE_INFINITY,M=this.chart._animationsDisabled||r||s==="none",C=e>0&&this.getParsed(e-1);for(let F=e;F0&&Math.abs(I[g]-C[g])>S,y&&($.parsed=I,$.raw=c.data[F]),f&&($.options=h||this.resolveDataElementOptions(F,D.active?"active":s)),M||this.updateElement(D,F,$,s),C=I}}getMaxOverflow(){let t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;let r=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,r,o)/2}draw(){let t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}};as.id="line";as.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1};as.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};var ls=class extends ve{constructor(t,e){super(t,e);this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart,s=i.data.labels||[],r=Jn(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:r}}parseObjectData(t,e,i,s){return br.bind(this)(t,e,i,s)}update(t){let e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){let t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((i,s)=>{let r=this.getParsed(s).r;!isNaN(r)&&this.chart.getDataVisibility(s)&&(re.max&&(e.max=r))}),e}_updateRadius(){let t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),r=Math.max(s/2,0),o=Math.max(i.cutoutPercentage?r/100*i.cutoutPercentage:1,0),a=(r-o)/t.getVisibleDatasetCount();this.outerRadius=r-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(t,e,i,s){let r=s==="reset",o=this.chart,l=o.options.animation,c=this._cachedMeta.rScale,h=c.xCenter,f=c.yCenter,g=c.getIndexAngle(0)-.5*gt,p=g,m,y=360/this.countVisibleElements();for(m=0;m{!isNaN(this.getParsed(s).r)&&this.chart.getDataVisibility(s)&&e++}),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?Wt(this.resolveDataElementOptions(t,e).angle||i):0}};ls.id="polarArea";ls.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0};ls.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(n){let t=n.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:e}}=n.legend.options;return t.labels.map((i,s)=>{let o=n.getDatasetMeta(0).controller.getStyle(s);return{text:i,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,pointStyle:e,hidden:!n.getDataVisibility(s),index:s}})}return[]}},onClick(n,t,e){e.chart.toggleDataVisibility(t.index),e.chart.update()}},tooltip:{callbacks:{title(){return""},label(n){return n.chart.data.labels[n.dataIndex]+": "+n.formattedValue}}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};var Tr=class extends Qn{};Tr.id="pie";Tr.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};var cs=class extends ve{getLabelAndValue(t){let e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return br.bind(this)(t,e,i,s)}update(t){let e=this._cachedMeta,i=e.dataset,s=e.data||[],r=e.iScale.getLabels();if(i.points=s,t!=="resize"){let o=this.resolveDatasetElementOptions(t);this.options.showLine||(o.borderWidth=0);let a={_loop:!0,_fullLoop:r.length===s.length,options:o};this.updateElement(i,void 0,a,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){let r=this._cachedMeta.rScale,o=s==="reset";for(let a=e;a{s[r]=i[r]&&i[r].active()?i[r]._to:this[r]}),s}};qt.defaults={};qt.defaultRoutes=void 0;var Wh={values(n){return pt(n)?n:""+n},numeric(n,t,e){if(n===0)return"0";let i=this.chart.options.locale,s,r=n;if(e.length>1){let c=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(c<1e-4||c>1e15)&&(s="scientific"),r=z0(n,e)}let o=be(Math.abs(r)),a=Math.max(Math.min(-1*Math.floor(o),20),0),l={notation:s,minimumFractionDigits:a,maximumFractionDigits:a};return Object.assign(l,this.options.ticks.format),Jn(n,i,l)},logarithmic(n,t,e){if(n===0)return"0";let i=n/Math.pow(10,Math.floor(be(n)));return i===1||i===2||i===5?Wh.numeric.call(this,n,t,e):""}};function z0(n,t){let e=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(e)>=1&&n!==Math.floor(n)&&(e=n-Math.floor(n)),e}var Dr={formatters:Wh};ft.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(n,t)=>t.lineWidth,tickColor:(n,t)=>t.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Dr.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}});ft.route("scale.ticks","color","","color");ft.route("scale.grid","color","","borderColor");ft.route("scale.grid","borderColor","","borderColor");ft.route("scale.title","color","","color");ft.describe("scale",{_fallback:!1,_scriptable:n=>!n.startsWith("before")&&!n.startsWith("after")&&n!=="callback"&&n!=="parser",_indexable:n=>n!=="borderDash"&&n!=="tickBorderDash"});ft.describe("scales",{_fallback:"scale"});ft.describe("scale.ticks",{_scriptable:n=>n!=="backdropPadding"&&n!=="callback",_indexable:n=>n!=="backdropPadding"});function B0(n,t){let e=n.options.ticks,i=e.maxTicksLimit||N0(n),s=e.major.enabled?W0(t):[],r=s.length,o=s[0],a=s[r-1],l=[];if(r>i)return V0(t,l,s,r/i),l;let c=H0(s,t,i);if(r>0){let h,f,g=r>1?Math.round((a-o)/(r-1)):null;for(Er(t,l,c,ut(g)?0:o-g,o),h=0,f=r-1;hs)return l}return Math.max(s,1)}function W0(n){let t=[],e,i;for(e=0,i=n.length;en==="left"?"right":n==="right"?"left":n,Vh=(n,t,e)=>t==="top"||t==="left"?n[t]+e:n[t]-e;function Yh(n,t){let e=[],i=n.length/t,s=n.length,r=0;for(;ro+a)))return l}function G0(n,t){Ct(n,e=>{let i=e.gc,s=i.length/2,r;if(s>t){for(r=0;ri?i:e,i=s&&e>i?e:i,{min:me(e,me(i,e)),max:me(i,me(e,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){wt(this.options.beforeUpdate,[this])}update(t,e,i){let{beginAtZero:s,grace:r,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=pa(this,r,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let l=a=r||i<=1||!this.isHorizontal()){this.labelRotation=s;return}let h=this._getLabelSizes(),f=h.widest.width,g=h.highest.height,p=Zt(this.chart.width-f,0,this.maxWidth);a=t.offset?this.maxWidth/i:p/(i-1),f+6>a&&(a=p/(i-(t.offset?.5:1)),l=this.maxHeight-hs(t.grid)-e.padding-Xh(t.title,this.chart.options.font),c=Math.sqrt(f*f+g*g),o=Yn(Math.min(Math.asin(Zt((h.highest.height+6)/a,-1,1)),Math.asin(Zt(l/c,-1,1))-Math.asin(Zt(g/c,-1,1)))),o=Math.max(s,Math.min(r,o))),this.labelRotation=o}afterCalculateLabelRotation(){wt(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){wt(this.options.beforeFit,[this])}fit(){let t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:r}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){let l=Xh(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=hs(r)+l):(t.height=this.maxHeight,t.width=hs(r)+l),i.display&&this.ticks.length){let{first:c,last:h,widest:f,highest:g}=this._getLabelSizes(),p=i.padding*2,m=Wt(this.labelRotation),y=Math.cos(m),S=Math.sin(m);if(a){let M=i.mirror?0:S*f.width+y*g.height;t.height=Math.min(this.maxHeight,t.height+M+p)}else{let M=i.mirror?0:y*f.width+S*g.height;t.width=Math.min(this.maxWidth,t.width+M+p)}this._calculatePadding(c,h,S,y)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){let{ticks:{align:r,padding:o},position:a}=this.options,l=this.labelRotation!==0,c=a!=="top"&&this.axis==="x";if(this.isHorizontal()){let h=this.getPixelForTick(0)-this.left,f=this.right-this.getPixelForTick(this.ticks.length-1),g=0,p=0;l?c?(g=s*t.width,p=i*e.height):(g=i*t.height,p=s*e.width):r==="start"?p=e.width:r==="end"?g=t.width:r!=="inner"&&(g=t.width/2,p=e.width/2),this.paddingLeft=Math.max((g-h+o)*this.width/(this.width-h),0),this.paddingRight=Math.max((p-f+o)*this.width/(this.width-f),0)}else{let h=e.height/2,f=t.height/2;r==="start"?(h=0,f=t.height):r==="end"&&(h=e.height,f=0),this.paddingTop=h+o,this.paddingBottom=f+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){wt(this.options.afterFit,[this])}isHorizontal(){let{axis:t,position:e}=this.options;return e==="top"||e==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let e,i;for(e=0,i=t.length;e({width:r[N]||0,height:o[N]||0});return{first:$(0),last:$(e-1),widest:$(D),highest:$(I),widths:r,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){let e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);let e=this._startPixel+t*this._length;return Jo(this._alignToPixels?Qe(this.chart,e,0):e)}getDecimalForPixel(t){let e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){let e=this.ticks||[];if(t>=0&&ta*s?a/i:l/s:l*s0}_computeGridLineItems(t){let e=this.axis,i=this.chart,s=this.options,{grid:r,position:o}=s,a=r.offset,l=this.isHorizontal(),h=this.ticks.length+(a?1:0),f=hs(r),g=[],p=r.setContext(this.getContext()),m=p.drawBorder?p.borderWidth:0,y=m/2,S=function(et){return Qe(i,et,m)},M,C,F,D,I,$,N,G,U,it,lt,rt;if(o==="top")M=S(this.bottom),$=this.bottom-f,G=M-y,it=S(t.top)+y,rt=t.bottom;else if(o==="bottom")M=S(this.top),it=t.top,rt=S(t.bottom)-y,$=M+y,G=this.top+f;else if(o==="left")M=S(this.right),I=this.right-f,N=M-y,U=S(t.left)+y,lt=t.right;else if(o==="right")M=S(this.left),U=t.left,lt=S(t.right)-y,I=M+y,N=this.left+f;else if(e==="x"){if(o==="center")M=S((t.top+t.bottom)/2+.5);else if(at(o)){let et=Object.keys(o)[0],Et=o[et];M=S(this.chart.scales[et].getPixelForValue(Et))}it=t.top,rt=t.bottom,$=M+y,G=$+f}else if(e==="y"){if(o==="center")M=S((t.left+t.right)/2);else if(at(o)){let et=Object.keys(o)[0],Et=o[et];M=S(this.chart.scales[et].getPixelForValue(Et))}I=M-y,N=I-f,U=t.left,lt=t.right}let Pt=nt(s.ticks.maxTicksLimit,h),zt=Math.max(1,Math.ceil(h/Pt));for(C=0;Cr.value===t);return s>=0?e.setContext(this.getContext(s)).lineWidth:0}drawGrid(t){let e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),r,o,a=(l,c,h)=>{!h.width||!h.color||(i.save(),i.lineWidth=h.width,i.strokeStyle=h.color,i.setLineDash(h.borderDash||[]),i.lineDashOffset=h.borderDashOffset,i.beginPath(),i.moveTo(l.x,l.y),i.lineTo(c.x,c.y),i.stroke(),i.restore())};if(e.display)for(r=0,o=s.length;r{this.draw(s)}}]:[{z:i,draw:s=>{this.drawBackground(),this.drawGrid(s),this.drawTitle()}},{z:i+1,draw:()=>{this.drawBorder()}},{z:e,draw:s=>{this.drawLabels(s)}}]}getMatchingVisibleMetas(t){let e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[],r,o;for(r=0,o=e.length;r{let i=e.split("."),s=i.pop(),r=[n].concat(i).join("."),o=t[e].split("."),a=o.pop(),l=o.join(".");ft.route(r,s,l,a)})}function ev(n){return"id"in n&&"defaults"in n}var qh=class{constructor(){this.controllers=new us(ve,"datasets",!0),this.elements=new us(qt,"elements"),this.plugins=new us(Object,"plugins"),this.scales=new us(Mn,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach(s=>{let r=i||this._getRegistryForType(s);i||r.isForType(s)||r===this.plugins&&s.id?this._exec(t,r,s):Ct(s,o=>{let a=i||this._getRegistryForType(o);this._exec(t,a,o)})})}_exec(t,e,i){let s=Vi(t);wt(i["before"+s],[],i),e[t](i),wt(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;e0&&this.getParsed(e-1);for(let D=e;D0&&Math.abs($[p]-F[p])>M,S&&(N.parsed=$,N.raw=c.data[D]),g&&(N.options=f||this.resolveDataElementOptions(D,I.active?"active":s)),C||this.updateElement(I,D,N,s),F=$}this.updateSharedOptions(f,s,h)}getMaxOverflow(){let t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let a=0;for(let l=e.length-1;l>=0;--l)a=Math.max(a,e[l].size(this.resolveDataElementOptions(l))/2);return a>0&&a}let i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;let r=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,r,o)/2}};fs.id="scatter";fs.defaults={datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1};fs.overrides={interaction:{mode:"point"},plugins:{tooltip:{callbacks:{title(){return""},label(n){return"("+n.label+", "+n.formattedValue+")"}}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var nv=Object.freeze({__proto__:null,BarController:rs,BubbleController:os,DoughnutController:Qn,LineController:as,PolarAreaController:ls,PieController:Tr,RadarController:cs,ScatterController:fs});function ti(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var Or=class{constructor(t){this.options=t||{}}init(t){}formats(){return ti()}parse(t,e){return ti()}format(t,e){return ti()}add(t,e,i){return ti()}diff(t,e,i){return ti()}startOf(t,e,i){return ti()}endOf(t,e){return ti()}};Or.override=function(n){Object.assign(Or.prototype,n)};var Pa={_date:Or};function iv(n,t,e,i){let{controller:s,data:r,_sorted:o}=n,a=s._cachedMeta.iScale;if(a&&t===a.axis&&t!=="r"&&o&&r.length){let l=a._reversePixels?Qo:Re;if(i){if(s._sharedOptions){let c=r[0],h=typeof c.getRange=="function"&&c.getRange(t);if(h){let f=l(r,t,e-h),g=l(r,t,e+h);return{lo:f.lo,hi:g.hi}}}}else return l(r,t,e)}return{lo:0,hi:r.length-1}}function ds(n,t,e,i,s){let r=n.getSortedVisibleDatasetMetas(),o=e[t];for(let a=0,l=r.length;a{l[o](t[e],s)&&(r.push({element:l,datasetIndex:c,index:h}),a=a||l.inRange(t.x,t.y,s))}),i&&!a?[]:r}var av={evaluateInteractionItems:ds,modes:{index(n,t,e,i){let s=nn(t,n),r=e.axis||"x",o=e.includeInvisible||!1,a=e.intersect?Ta(n,s,r,i,o):Da(n,s,r,!1,i,o),l=[];return a.length?(n.getSortedVisibleDatasetMetas().forEach(c=>{let h=a[0].index,f=c.data[h];f&&!f.skip&&l.push({element:f,datasetIndex:c.index,index:h})}),l):[]},dataset(n,t,e,i){let s=nn(t,n),r=e.axis||"xy",o=e.includeInvisible||!1,a=e.intersect?Ta(n,s,r,i,o):Da(n,s,r,!1,i,o);if(a.length>0){let l=a[0].datasetIndex,c=n.getDatasetMeta(l).data;a=[];for(let h=0;he.pos===t)}function Kh(n,t){return n.filter(e=>Uh.indexOf(e.pos)===-1&&e.box.axis===t)}function gs(n,t){return n.sort((e,i)=>{let s=t?i:e,r=t?e:i;return s.weight===r.weight?s.index-r.index:s.weight-r.weight})}function lv(n){let t=[],e,i,s,r,o,a;for(e=0,i=(n||[]).length;ec.box.fullSize),!0),i=gs(ps(t,"left"),!0),s=gs(ps(t,"right")),r=gs(ps(t,"top"),!0),o=gs(ps(t,"bottom")),a=Kh(t,"x"),l=Kh(t,"y");return{fullSize:e,leftAndTop:i.concat(r),rightAndBottom:s.concat(l).concat(o).concat(a),chartArea:ps(t,"chartArea"),vertical:i.concat(s).concat(l),horizontal:r.concat(o).concat(a)}}function Zh(n,t,e,i){return Math.max(n[e],t[e])+Math.max(n[i],t[i])}function Jh(n,t){n.top=Math.max(n.top,t.top),n.left=Math.max(n.left,t.left),n.bottom=Math.max(n.bottom,t.bottom),n.right=Math.max(n.right,t.right)}function fv(n,t,e,i){let{pos:s,box:r}=e,o=n.maxPadding;if(!at(s)){e.size&&(n[s]-=e.size);let f=i[e.stack]||{size:0,count:1};f.size=Math.max(f.size,e.horizontal?r.height:r.width),e.size=f.size/f.count,n[s]+=e.size}r.getPadding&&Jh(o,r.getPadding());let a=Math.max(0,t.outerWidth-Zh(o,n,"left","right")),l=Math.max(0,t.outerHeight-Zh(o,n,"top","bottom")),c=a!==n.w,h=l!==n.h;return n.w=a,n.h=l,e.horizontal?{same:c,other:h}:{same:h,other:c}}function dv(n){let t=n.maxPadding;function e(i){let s=Math.max(t[i]-n[i],0);return n[i]+=s,s}n.y+=e("top"),n.x+=e("left"),e("right"),e("bottom")}function pv(n,t){let e=t.maxPadding;function i(s){let r={left:0,top:0,right:0,bottom:0};return s.forEach(o=>{r[o]=Math.max(t[o],e[o])}),r}return i(n?["left","right"]:["top","bottom"])}function ms(n,t,e,i){let s=[],r,o,a,l,c,h;for(r=0,o=n.length,c=0;r{typeof y.beforeLayout=="function"&&y.beforeLayout()});let h=l.reduce((y,S)=>S.box.options&&S.box.options.display===!1?y:y+1,0)||1,f=Object.freeze({outerWidth:t,outerHeight:e,padding:s,availableWidth:r,availableHeight:o,vBoxMaxWidth:r/2/h,hBoxMaxHeight:o/2}),g=Object.assign({},s);Jh(g,Vt(i));let p=Object.assign({maxPadding:g,w:r,h:o,x:s.left,y:s.top},s),m=hv(l.concat(c),f);ms(a.fullSize,p,f,m),ms(l,p,f,m),ms(c,p,f,m)&&ms(l,p,f,m),dv(p),Qh(a.leftAndTop,p,f,m),p.x+=p.w,p.y+=p.h,Qh(a.rightAndBottom,p,f,m),n.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Ct(a.chartArea,y=>{let S=y.box;Object.assign(S,n.chartArea),S.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},Ea=class{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}},tu=class extends Ea{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}},Rr="$chartjs",gv={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},eu=n=>n===null||n==="";function mv(n,t){let e=n.style,i=n.getAttribute("height"),s=n.getAttribute("width");if(n[Rr]={initial:{height:i,width:s,style:{display:e.display,height:e.height,width:e.width}}},e.display=e.display||"block",e.boxSizing=e.boxSizing||"border-box",eu(s)){let r=kr(n,"width");r!==void 0&&(n.width=r)}if(eu(i))if(n.style.height==="")n.height=n.width/(t||2);else{let r=kr(n,"height");r!==void 0&&(n.height=r)}return n}var nu=ya?{passive:!0}:!1;function bv(n,t,e){n.addEventListener(t,e,nu)}function vv(n,t,e){n.canvas.removeEventListener(t,e,nu)}function _v(n,t){let e=gv[n.type]||n.type,{x:i,y:s}=nn(n,t);return{type:e,chart:t,native:n,x:i!==void 0?i:null,y:s!==void 0?s:null}}function Lr(n,t){for(let e of n)if(e===t||e.contains(t))return!0}function yv(n,t,e){let i=n.canvas,s=new MutationObserver(r=>{let o=!1;for(let a of r)o=o||Lr(a.addedNodes,i),o=o&&!Lr(a.removedNodes,i);o&&e()});return s.observe(document,{childList:!0,subtree:!0}),s}function xv(n,t,e){let i=n.canvas,s=new MutationObserver(r=>{let o=!1;for(let a of r)o=o||Lr(a.removedNodes,i),o=o&&!Lr(a.addedNodes,i);o&&e()});return s.observe(document,{childList:!0,subtree:!0}),s}var bs=new Map,iu=0;function su(){let n=window.devicePixelRatio;n!==iu&&(iu=n,bs.forEach((t,e)=>{e.currentDevicePixelRatio!==n&&t()}))}function wv(n,t){bs.size||window.addEventListener("resize",su),bs.set(n,t)}function kv(n){bs.delete(n),bs.size||window.removeEventListener("resize",su)}function Sv(n,t,e){let i=n.canvas,s=i&&ns(i);if(!s)return;let r=rr((a,l)=>{let c=s.clientWidth;e(a,l),c{let l=a[0],c=l.contentRect.width,h=l.contentRect.height;c===0&&h===0||r(c,h)});return o.observe(s),wv(n,r),o}function Oa(n,t,e){e&&e.disconnect(),t==="resize"&&kv(n)}function Mv(n,t,e){let i=n.canvas,s=rr(r=>{n.ctx!==null&&e(_v(r,n))},n,r=>{let o=r[0];return[o,o.offsetX,o.offsetY]});return bv(i,t,s),s}var ru=class extends Ea{acquireContext(t,e){let i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(mv(t,e),i):null}releaseContext(t){let e=t.canvas;if(!e[Rr])return!1;let i=e[Rr].initial;["height","width"].forEach(r=>{let o=i[r];ut(o)?e.removeAttribute(r):e.setAttribute(r,o)});let s=i.style||{};return Object.keys(s).forEach(r=>{e.style[r]=s[r]}),e.width=e.width,delete e[Rr],!0}addEventListener(t,e,i){this.removeEventListener(t,e);let s=t.$proxies||(t.$proxies={}),o={attach:yv,detach:xv,resize:Sv}[e]||Mv;s[e]=o(t,e,i)}removeEventListener(t,e){let i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:Oa,detach:Oa,resize:Oa}[e]||vv)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return _a(t,e,i,s)}isAttached(t){let e=ns(t);return!!(e&&e.isConnected)}};function Cv(n){return!_r()||typeof OffscreenCanvas!="undefined"&&n instanceof OffscreenCanvas?tu:ru}var ou=class{constructor(){this._init=[]}notify(t,e,i,s){e==="beforeInit"&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,"install"));let r=s?this._descriptors(t).filter(s):this._descriptors(t),o=this._notify(r,t,e,i);return e==="afterDestroy"&&(this._notify(r,t,"stop"),this._notify(this._init,t,"uninstall")),o}_notify(t,e,i,s){s=s||{};for(let r of t){let o=r.plugin,a=o[i],l=[e,s,r.options];if(wt(a,l,o)===!1&&s.cancelable)return!1}return!0}invalidate(){ut(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;let e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){let i=t&&t.config,s=nt(i.options&&i.options.plugins,{}),r=Pv(i);return s===!1&&!e?[]:Dv(t,r,s,e)}_notifyStateChanges(t){let e=this._oldCache||[],i=this._cache,s=(r,o)=>r.filter(a=>!o.some(l=>a.plugin.id===l.plugin.id));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}};function Pv(n){let t={},e=[],i=Object.keys(He.plugins.items);for(let r=0;r{let l=i[a];if(!at(l))return console.error(`Invalid scale configuration for scale: ${a}`);if(l._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${a}`);let c=Ra(a,l),h=Av(c,s),f=e.scales||{};r[c]=r[c]||a,o[a]=Wn(Object.create(null),[{axis:c},l,f[c],f[h]])}),n.data.datasets.forEach(a=>{let l=a.type||n.type,c=a.indexAxis||Aa(l,t),f=(yn[l]||{}).scales||{};Object.keys(f).forEach(g=>{let p=Ov(g,c),m=a[p+"AxisID"]||r[p]||p;o[m]=o[m]||Object.create(null),Wn(o[m],[{axis:p},i[m],f[g]])})}),Object.keys(o).forEach(a=>{let l=o[a];Wn(l,[ft.scales[l.type],ft.scale])}),o}function au(n){let t=n.options||(n.options={});t.plugins=nt(t.plugins,{}),t.scales=Lv(n,t)}function lu(n){return n=n||{},n.datasets=n.datasets||[],n.labels=n.labels||[],n}function Fv(n){return n=n||{},n.data=lu(n.data),au(n),n}var cu=new Map,hu=new Set;function Fr(n,t){let e=cu.get(n);return e||(e=t(),cu.set(n,e),hu.add(e)),e}var vs=(n,t,e)=>{let i=Be(t,e);i!==void 0&&n.add(i)},uu=class{constructor(t){this._config=Fv(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=lu(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){let t=this._config;this.clearCache(),au(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Fr(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return Fr(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return Fr(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){let e=t.id,i=this.type;return Fr(`${i}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){let i=this._scopeCache,s=i.get(t);return(!s||e)&&(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){let{options:s,type:r}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;let l=new Set;e.forEach(h=>{t&&(l.add(t),h.forEach(f=>vs(l,t,f))),h.forEach(f=>vs(l,s,f)),h.forEach(f=>vs(l,yn[r]||{},f)),h.forEach(f=>vs(l,ft,f)),h.forEach(f=>vs(l,fr,f))});let c=Array.from(l);return c.length===0&&c.push(Object.create(null)),hu.has(e)&&o.set(e,c),c}chartOptionScopes(){let{options:t,type:e}=this;return[t,yn[e]||{},ft.datasets[e]||{},{type:e},ft,fr]}resolveNamedOptions(t,e,i,s=[""]){let r={$shared:!0},{resolver:o,subPrefixes:a}=fu(this._resolverCache,t,s),l=o;if($v(o,e)){r.$shared=!1,i=le(i)?i():i;let c=this.createResolver(t,i,a);l=kn(o,i,c)}for(let c of e)r[c]=l[c];return r}createResolver(t,e,i=[""],s){let{resolver:r}=fu(this._resolverCache,t,i);return at(e)?kn(r,e,void 0,s):r}};function fu(n,t,e){let i=n.get(t);i||(i=new Map,n.set(t,i));let s=e.join(),r=i.get(s);return r||(r={resolver:es(t,e),subPrefixes:e.filter(a=>!a.toLowerCase().includes("hover"))},i.set(s,r)),r}var Iv=n=>at(n)&&Object.getOwnPropertyNames(n).reduce((t,e)=>t||le(n[e]),!1);function $v(n,t){let{isScriptable:e,isIndexable:i}=mr(n);for(let s of t){let r=e(s),o=i(s),a=(o||r)&&n[s];if(r&&(le(a)||Iv(a))||o&&pt(a))return!0}return!1}var jv="3.9.1",zv=["top","bottom","left","right","chartArea"];function du(n,t){return n==="top"||n==="bottom"||zv.indexOf(n)===-1&&t==="x"}function pu(n,t){return function(e,i){return e[n]===i[n]?e[t]-i[t]:e[n]-i[n]}}function gu(n){let t=n.chart,e=t.options.animation;t.notifyPlugins("afterRender"),wt(e&&e.onComplete,[n],t)}function Bv(n){let t=n.chart,e=t.options.animation;wt(e&&e.onProgress,[n],t)}function mu(n){return _r()&&typeof n=="string"?n=document.getElementById(n):n&&n.length&&(n=n[0]),n&&n.canvas&&(n=n.canvas),n}var Ir={},bu=n=>{let t=mu(n);return Object.values(Ir).filter(e=>e.canvas===t).pop()};function Nv(n,t,e){let i=Object.keys(n);for(let s of i){let r=+s;if(r>=t){let o=n[s];delete n[s],(e>0||r>t)&&(n[r+e]=o)}}}function Hv(n,t,e,i){return!e||n.type==="mouseout"?null:i?t:n}var se=class{constructor(t,e){let i=this.config=new uu(e),s=mu(t),r=bu(s);if(r)throw new Error("Canvas is already in use. Chart with ID '"+r.id+"' must be destroyed before the canvas with ID '"+r.canvas.id+"' can be reused.");let o=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||Cv(s)),this.platform.updateConfig(i);let a=this.platform.acquireContext(s,o.aspectRatio),l=a&&a.canvas,c=l&&l.height,h=l&&l.width;if(this.id=qo(),this.ctx=a,this.canvas=l,this.width=h,this.height=c,this._options=o,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new ou,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=na(f=>this.update(f),o.resizeDelay||0),this._dataChanges=[],Ir[this.id]=this,!a||!l){console.error("Failed to create chart: can't acquire context from the given item");return}rn.listen(this,"complete",gu),rn.listen(this,"progress",Bv),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:s,_aspectRatio:r}=this;return ut(t)?e&&r?r:s?i/s:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():wr(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return dr(this.canvas,this.ctx),this}stop(){return rn.stop(this),this}resize(t,e){rn.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){let i=this.options,s=this.canvas,r=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,r),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,!!wr(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),wt(i.onResize,[this,o],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){let e=this.options.scales||{};Ct(e,(i,s)=>{i.id=s})}buildOrUpdateScales(){let t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce((o,a)=>(o[a]=!1,o),{}),r=[];e&&(r=r.concat(Object.keys(e).map(o=>{let a=e[o],l=Ra(o,a),c=l==="r",h=l==="x";return{options:a,dposition:c?"chartArea":h?"bottom":"left",dtype:c?"radialLinear":h?"category":"linear"}}))),Ct(r,o=>{let a=o.options,l=a.id,c=Ra(l,a),h=nt(a.type,o.dtype);(a.position===void 0||du(a.position,c)!==du(o.dposition))&&(a.position=o.dposition),s[l]=!0;let f=null;if(l in i&&i[l].type===h)f=i[l];else{let g=He.getScale(h);f=new g({id:l,type:h,ctx:this.ctx,chart:this}),i[f.id]=f}f.init(a,t)}),Ct(s,(o,a)=>{o||delete i[a]}),Ct(i,o=>{he.configure(this,o,o.options),he.addBox(this,o)})}_updateMetasets(){let t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((s,r)=>s.index-r.index),i>e){for(let s=e;se.length&&delete this._stacks,t.forEach((i,s)=>{e.filter(r=>r===i._dataset).length===0&&this._destroyDatasetMeta(s)})}buildOrUpdateControllers(){let t=[],e=this.data.datasets,i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){let e=this.config;e.update();let i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;let r=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let c=0,h=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(pu("z","_idx"));let{_active:a,_lastEvent:l}=this;l?this._eventHandler(l,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){Ct(this.scales,t=>{he.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);(!Zs(e,i)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(let{method:i,start:s,count:r}of e){let o=i==="_removeElements"?-r:r;Nv(t,s,o)}}_getUniformDataChanges(){let t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];let e=this.data.datasets.length,i=r=>new Set(t.filter(o=>o[0]===r).map((o,a)=>a+","+o.splice(1).join(","))),s=i(0);for(let r=1;rr.split(",")).map(r=>({method:r[1],start:+r[2],count:+r[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;he.update(this,this.width,this.height,t);let e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],Ct(this.boxes,s=>{i&&s.position==="chartArea"||(s.configure&&s.configure(),this._layers.push(...s._layers()))},this),this._layers.forEach((s,r)=>{s._idx=r}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,i=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){let e=this.ctx,i=t._clip,s=!i.disabled,r=this.chartArea,o={meta:t,index:t.index,cancelable:!0};this.notifyPlugins("beforeDatasetDraw",o)!==!1&&(s&&xn(e,{left:i.left===!1?0:r.left-i.left,right:i.right===!1?this.width:r.right+i.right,top:i.top===!1?0:r.top-i.top,bottom:i.bottom===!1?this.height:r.bottom+i.bottom}),t.controller.draw(),s&&wn(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Un(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){let r=av.modes[e];return typeof r=="function"?r(this,t,i,s):[]}getDatasetMeta(t){let e=this.data.datasets[t],i=this._metasets,s=i.filter(r=>r&&r._dataset===e).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ne(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){let e=this.data.datasets[t];if(!e)return!1;let i=this.getDatasetMeta(t);return typeof i.hidden=="boolean"?!i.hidden:!e.hidden}setDatasetVisibility(t,e){let i=this.getDatasetMeta(t);i.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){let s=i?"show":"hide",r=this.getDatasetMeta(t),o=r.controller._resolveAnimations(void 0,s);Nt(e)?(r.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(r,{visible:i}),this.update(a=>a.datasetIndex===t?s:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){let e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),rn.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,r,o),t[r]=o},s=(r,o,a)=>{r.offsetX=o,r.offsetY=a,this._eventHandler(r)};Ct(this.options.events,r=>i(r,s))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let t=this._responsiveListeners,e=this.platform,i=(l,c)=>{e.addEventListener(this,l,c),t[l]=c},s=(l,c)=>{t[l]&&(e.removeEventListener(this,l,c),delete t[l])},r=(l,c)=>{this.canvas&&this.resize(l,c)},o,a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",r),i("detach",o)};o=()=>{this.attached=!1,s("resize",r),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){Ct(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},Ct(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){let s=i?"set":"remove",r,o,a,l;for(e==="dataset"&&(r=this.getDatasetMeta(t[0].datasetIndex),r.controller["_"+s+"DatasetHoverStyle"]()),a=0,l=t.length;a{let a=this.getDatasetMeta(r);if(!a)throw new Error("No dataset found at index "+r);return{datasetIndex:r,element:a.data[o],index:o}});!yi(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){let s=this.options.hover,r=(l,c)=>l.filter(h=>!c.some(f=>h.datasetIndex===f.datasetIndex&&h.index===f.index)),o=r(e,t),a=i?t:r(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){let i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=o=>(o.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",i,s)===!1)return;let r=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(r||i.changed)&&this.render(),this}_handleEvent(t,e,i){let{_active:s=[],options:r}=this,o=e,a=this._getActiveElements(t,s,i,o),l=Uo(t),c=Hv(t,this._lastEvent,i,l);i&&(this._lastEvent=null,wt(r.onHover,[t,a,this],this),l&&wt(r.onClick,[t,a,this],this));let h=!yi(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=c,h}_getActiveElements(t,e,i,s){if(t.type==="mouseout")return[];if(!i)return e;let r=this.options.hover;return this.getElementsAtEventForMode(t,r.mode,r,s)}},vu=()=>Ct(se.instances,n=>n._plugins.invalidate()),Cn=!0;Object.defineProperties(se,{defaults:{enumerable:Cn,value:ft},instances:{enumerable:Cn,value:Ir},overrides:{enumerable:Cn,value:yn},registry:{enumerable:Cn,value:He},version:{enumerable:Cn,value:jv},getChart:{enumerable:Cn,value:bu},register:{enumerable:Cn,value:(...n)=>{He.add(...n),vu()}},unregister:{enumerable:Cn,value:(...n)=>{He.remove(...n),vu()}}});function _u(n,t,e){let{startAngle:i,pixelMargin:s,x:r,y:o,outerRadius:a,innerRadius:l}=t,c=s/a;n.beginPath(),n.arc(r,o,a,i-c,e+c),l>s?(c=s/l,n.arc(r,o,l,e+c,i-c,!0)):n.arc(r,o,s,e+Rt,i-Rt),n.closePath(),n.clip()}function Wv(n){return ts(n,["outerStart","outerEnd","innerStart","innerEnd"])}function Vv(n,t,e,i){let s=Wv(n.options.borderRadius),r=(e-t)/2,o=Math.min(r,i*t/2),a=l=>{let c=(e-Math.min(r,l))*i/2;return Zt(l,0,Math.min(r,c))};return{outerStart:a(s.outerStart),outerEnd:a(s.outerEnd),innerStart:Zt(s.innerStart,0,o),innerEnd:Zt(s.innerEnd,0,o)}}function Mi(n,t,e,i){return{x:e+n*Math.cos(t),y:i+n*Math.sin(t)}}function La(n,t,e,i,s,r){let{x:o,y:a,startAngle:l,pixelMargin:c,innerRadius:h}=t,f=Math.max(t.outerRadius+i+e-c,0),g=h>0?h+i+e+c:0,p=0,m=s-l;if(i){let et=h>0?h-i:0,Et=f>0?f-i:0,St=(et+Et)/2,re=St!==0?m*St/(St+i):m;p=(m-re)/2}let y=Math.max(.001,m*f-e/gt)/f,S=(m-y)/2,M=l+S+p,C=s-S-p,{outerStart:F,outerEnd:D,innerStart:I,innerEnd:$}=Vv(t,g,f,C-M),N=f-F,G=f-D,U=M+F/N,it=C-D/G,lt=g+I,rt=g+$,Pt=M+I/lt,zt=C-$/rt;if(n.beginPath(),r){if(n.arc(o,a,f,U,it),D>0){let St=Mi(G,it,o,a);n.arc(St.x,St.y,D,it,C+Rt)}let et=Mi(rt,C,o,a);if(n.lineTo(et.x,et.y),$>0){let St=Mi(rt,zt,o,a);n.arc(St.x,St.y,$,C+Rt,zt+Math.PI)}if(n.arc(o,a,g,C-$/g,M+I/g,!0),I>0){let St=Mi(lt,Pt,o,a);n.arc(St.x,St.y,I,Pt+Math.PI,M-Rt)}let Et=Mi(N,M,o,a);if(n.lineTo(Et.x,Et.y),F>0){let St=Mi(N,U,o,a);n.arc(St.x,St.y,F,M-Rt,U)}}else{n.moveTo(o,a);let et=Math.cos(U)*f+o,Et=Math.sin(U)*f+a;n.lineTo(et,Et);let St=Math.cos(it)*f+o,re=Math.sin(it)*f+a;n.lineTo(St,re)}n.closePath()}function Yv(n,t,e,i,s){let{fullCircles:r,startAngle:o,circumference:a}=t,l=t.endAngle;if(r){La(n,t,e,i,o+kt,s);for(let c=0;c=kt||Xn(r,a,l),y=Ae(o,c+g,h+g);return m&&y}getCenterPoint(t){let{x:e,y:i,startAngle:s,endAngle:r,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:l,spacing:c}=this.options,h=(s+r)/2,f=(o+a+c+l)/2;return{x:e+Math.cos(h)*f,y:i+Math.sin(h)*f}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){let{options:e,circumference:i}=this,s=(e.offset||0)/2,r=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin=e.borderAlign==="inner"?.33:0,this.fullCircles=i>kt?Math.floor(i/kt):0,i===0||this.innerRadius<0||this.outerRadius<0)return;t.save();let a=0;if(s){a=s/2;let c=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(c)*a,Math.sin(c)*a),this.circumference>=gt&&(a=s)}t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor;let l=Yv(t,this,a,r,o);qv(t,this,a,r,l,o),t.restore()}};_s.id="arc";_s.defaults={borderAlign:"center",borderColor:"#fff",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0};_s.defaultRoutes={backgroundColor:"backgroundColor"};function yu(n,t,e=t){n.lineCap=nt(e.borderCapStyle,t.borderCapStyle),n.setLineDash(nt(e.borderDash,t.borderDash)),n.lineDashOffset=nt(e.borderDashOffset,t.borderDashOffset),n.lineJoin=nt(e.borderJoinStyle,t.borderJoinStyle),n.lineWidth=nt(e.borderWidth,t.borderWidth),n.strokeStyle=nt(e.borderColor,t.borderColor)}function Gv(n,t,e){n.lineTo(e.x,e.y)}function Uv(n){return n.stepped?fa:n.tension||n.cubicInterpolationMode==="monotone"?da:Gv}function xu(n,t,e={}){let i=n.length,{start:s=0,end:r=i-1}=e,{start:o,end:a}=t,l=Math.max(s,o),c=Math.min(r,a),h=sa&&r>a;return{count:i,start:l,loop:t.loop,ilen:c(o+(c?a-D:D))%r,F=()=>{y!==S&&(n.lineTo(h,S),n.lineTo(h,y),n.lineTo(h,M))};for(l&&(p=s[C(0)],n.moveTo(p.x,p.y)),g=0;g<=a;++g){if(p=s[C(g)],p.skip)continue;let D=p.x,I=p.y,$=D|0;$===m?(IS&&(S=I),h=(f*h+D)/++f):(F(),n.lineTo(D,I),m=$,f=0,y=S=I),M=I}F()}function Fa(n){let t=n.options,e=t.borderDash&&t.borderDash.length;return!n._decimated&&!n._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?Zv:Kv}function Jv(n){return n.stepped?xa:n.tension||n.cubicInterpolationMode==="monotone"?wa:sn}function Qv(n,t,e,i){let s=t._path;s||(s=t._path=new Path2D,t.path(s,e,i)&&s.closePath()),yu(n,t.options),n.stroke(s)}function t_(n,t,e,i){let{segments:s,options:r}=t,o=Fa(t);for(let a of s)yu(n,r,a.style),n.beginPath(),o(n,t,a,{start:e,end:e+i-1})&&n.closePath(),n.stroke()}var e_=typeof Path2D=="function";function n_(n,t,e,i){e_&&!t.options.segment?Qv(n,t,e,i):t_(n,t,e,i)}var on=class extends qt{constructor(t){super();this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){let i=this.options;if((i.tension||i.cubicInterpolationMode==="monotone")&&!i.stepped&&!this._pointsUpdated){let s=i.spanGaps?this._loop:this._fullLoop;ba(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=ka(this,this.options.segment))}first(){let t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){let t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){let i=this.options,s=t[e],r=this.points,o=Pr(this,{property:e,start:s,end:s});if(!o.length)return;let a=[],l=Jv(i),c,h;for(c=0,h=o.length;cn!=="borderDash"&&n!=="fill"};function wu(n,t,e,i){let s=n.options,{[e]:r}=n.getProps([e],i);return Math.abs(t-r)=e)return n.slice(t,t+e);let o=[],a=(e-2)/(r-2),l=0,c=t+e-1,h=t,f,g,p,m,y;for(o[l++]=n[h],f=0;fp&&(p=m,g=n[C],y=C);o[l++]=g,h=y}return o[l++]=n[c],o}function h_(n,t,e,i){let s=0,r=0,o,a,l,c,h,f,g,p,m,y,S=[],M=t+e-1,C=n[t].x,D=n[M].x-C;for(o=t;oy&&(y=c,g=o),s=(r*s+a.x)/++r;else{let $=o-1;if(!ut(f)&&!ut(g)){let N=Math.min(f,g),G=Math.max(f,g);N!==p&&N!==$&&S.push({...n[N],x:s}),G!==p&&G!==$&&S.push({...n[G],x:s})}o>0&&$!==p&&S.push(n[$]),S.push(a),h=I,r=0,m=y=c,f=g=p=o}}return S}function Su(n){if(n._decimated){let t=n._data;delete n._decimated,delete n._data,Object.defineProperty(n,"data",{value:t})}}function Mu(n){n.data.datasets.forEach(t=>{Su(t)})}function u_(n,t){let e=t.length,i=0,s,{iScale:r}=n,{min:o,max:a,minDefined:l,maxDefined:c}=r.getUserBounds();return l&&(i=Zt(Re(t,r.axis,o).lo,0,e-1)),c?s=Zt(Re(t,r.axis,a).hi+1,i,e)-i:s=e-i,{start:i,count:s}}var f_={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(n,t,e)=>{if(!e.enabled){Mu(n);return}let i=n.width;n.data.datasets.forEach((s,r)=>{let{_data:o,indexAxis:a}=s,l=n.getDatasetMeta(r),c=o||s.data;if(Kn([a,n.options.indexAxis])==="y"||!l.controller.supportsDecimation)return;let h=n.scales[l.xAxisID];if(h.type!=="linear"&&h.type!=="time"||n.options.parsing)return;let{start:f,count:g}=u_(l,c),p=e.threshold||4*i;if(g<=p){Su(s);return}ut(o)&&(s._data=c,delete s.data,Object.defineProperty(s,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(y){this._data=y}}));let m;switch(e.algorithm){case"lttb":m=c_(c,f,g,i,e);break;case"min-max":m=h_(c,f,g,i);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}s._decimated=m})},destroy(n){Mu(n)}};function d_(n,t,e){let i=n.segments,s=n.points,r=t.points,o=[];for(let a of i){let{start:l,end:c}=a;c=za(l,c,s);let h=ja(e,s[l],s[c],a.loop);if(!t.segments){o.push({source:a,target:h,start:s[l],end:s[c]});continue}let f=Pr(t,h);for(let g of f){let p=ja(e,r[g.start],r[g.end],g.loop),m=Cr(a,s,p);for(let y of m)o.push({source:y,target:g,start:{[e]:Cu(h,p,"start",Math.max)},end:{[e]:Cu(h,p,"end",Math.min)}})}}return o}function ja(n,t,e,i){if(i)return;let s=t[n],r=e[n];return n==="angle"&&(s=fe(s),r=fe(r)),{property:n,start:s,end:r}}function p_(n,t){let{x:e=null,y:i=null}=n||{},s=t.points,r=[];return t.segments.forEach(({start:o,end:a})=>{a=za(o,a,s);let l=s[o],c=s[a];i!==null?(r.push({x:l.x,y:i}),r.push({x:c.x,y:i})):e!==null&&(r.push({x:e,y:l.y}),r.push({x:e,y:c.y}))}),r}function za(n,t,e){for(;t>n;t--){let i=e[t];if(!isNaN(i.x)&&!isNaN(i.y))break}return t}function Cu(n,t,e,i){return n&&t?i(n[e],t[e]):n?n[e]:t?t[e]:0}function Pu(n,t){let e=[],i=!1;return pt(n)?(i=!0,e=n):e=p_(n,t),e.length?new on({points:e,options:{tension:0},_loop:i,_fullLoop:i}):null}function Tu(n){return n&&n.fill!==!1}function g_(n,t,e){let s=n[t].fill,r=[t],o;if(!e)return s;for(;s!==!1&&r.indexOf(s)===-1;){if(!jt(s))return s;if(o=n[s],!o)return!1;if(o.visible)return s;r.push(s),s=o.fill}return!1}function m_(n,t,e){let i=y_(n);if(at(i))return isNaN(i.value)?!1:i;let s=parseFloat(i);return jt(s)&&Math.floor(s)===s?b_(i[0],t,s,e):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function b_(n,t,e,i){return(n==="-"||n==="+")&&(e=t+e),e===t||e<0||e>=i?!1:e}function v_(n,t){let e=null;return n==="start"?e=t.bottom:n==="end"?e=t.top:at(n)?e=t.getPixelForValue(n.value):t.getBasePixel&&(e=t.getBasePixel()),e}function __(n,t,e){let i;return n==="start"?i=e:n==="end"?i=t.options.reverse?t.min:t.max:at(n)?i=n.value:i=t.getBaseValue(),i}function y_(n){let t=n.options,e=t.fill,i=nt(e&&e.target,e);return i===void 0&&(i=!!t.backgroundColor),i===!1||i===null?!1:i===!0?"origin":i}function x_(n){let{scale:t,index:e,line:i}=n,s=[],r=i.segments,o=i.points,a=w_(t,e);a.push(Pu({x:null,y:t.bottom},i));for(let l=0;l=0;--o){let a=s[o].$filler;!a||(a.line.updateControlPoints(r,a.axis),i&&a.fill&&Na(n.ctx,a,r))}},beforeDatasetsDraw(n,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;let i=n.getSortedVisibleDatasetMetas();for(let s=i.length-1;s>=0;--s){let r=i[s].$filler;Tu(r)&&Na(n.ctx,r,n.chartArea)}},beforeDatasetDraw(n,t,e){let i=t.meta.$filler;!Tu(i)||e.drawTime!=="beforeDatasetDraw"||Na(n.ctx,i,n.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}},Au=(n,t)=>{let{boxHeight:e=t,boxWidth:i=t}=n;return n.usePointStyle&&(e=Math.min(e,t),i=n.pointStyleWidth||Math.min(i,t)),{boxWidth:i,boxHeight:e,itemHeight:Math.max(t,e)}},R_=(n,t)=>n!==null&&t!==null&&n.datasetIndex===t.datasetIndex&&n.index===t.index,Ha=class extends qt{constructor(t){super();this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let t=this.options.labels||{},e=wt(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(i=>t.filter(i,this.chart.data))),t.sort&&(e=e.sort((i,s)=>t.sort(i,s,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){let{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}let i=t.labels,s=Ft(i.font),r=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:l}=Au(i,r),c,h;e.font=s.string,this.isHorizontal()?(c=this.maxWidth,h=this._fitRows(o,r,a,l)+10):(h=this.maxHeight,c=this._fitCols(o,r,a,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){let{ctx:r,maxWidth:o,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],h=s+a,f=t;r.textAlign="left",r.textBaseline="middle";let g=-1,p=-h;return this.legendItems.forEach((m,y)=>{let S=i+e/2+r.measureText(m.text).width;(y===0||c[c.length-1]+S+2*a>o)&&(f+=h,c[c.length-(y>0?0:1)]=0,p+=h,g++),l[y]={left:0,top:p,row:g,width:S,height:s},c[c.length-1]+=S+a}),f}_fitCols(t,e,i,s){let{ctx:r,maxHeight:o,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],h=o-t,f=a,g=0,p=0,m=0,y=0;return this.legendItems.forEach((S,M)=>{let C=i+e/2+r.measureText(S.text).width;M>0&&p+s+2*a>h&&(f+=g+a,c.push({width:g,height:p}),m+=g+a,y++,g=p=0),l[M]={left:m,top:p,col:y,width:C,height:s},g=Math.max(g,C),p+=s+a}),f+=g,c.push({width:g,height:p}),f}adjustHitBoxes(){if(!this.options.display)return;let t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:r}}=this,o=Sn(r,this.left,this.width);if(this.isHorizontal()){let a=0,l=ie(i,this.left+s,this.right-this.lineWidths[a]);for(let c of e)a!==c.row&&(a=c.row,l=ie(i,this.left+s,this.right-this.lineWidths[a])),c.top+=this.top+t+s,c.left=o.leftForLtr(o.x(l),c.width),l+=c.width+s}else{let a=0,l=ie(i,this.top+t+s,this.bottom-this.columnSizes[a].height);for(let c of e)c.col!==a&&(a=c.col,l=ie(i,this.top+t+s,this.bottom-this.columnSizes[a].height)),c.top=l,c.left+=this.left+s,c.left=o.leftForLtr(o.x(c.left),c.width),l+=c.height+s}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){let t=this.ctx;xn(t,this),this._draw(),wn(t)}}_draw(){let{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:r,labels:o}=t,a=ft.color,l=Sn(t.rtl,this.left,this.width),c=Ft(o.font),{color:h,padding:f}=o,g=c.size,p=g/2,m;this.drawTitle(),s.textAlign=l.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=c.string;let{boxWidth:y,boxHeight:S,itemHeight:M}=Au(o,g),C=function(N,G,U){if(isNaN(y)||y<=0||isNaN(S)||S<0)return;s.save();let it=nt(U.lineWidth,1);if(s.fillStyle=nt(U.fillStyle,a),s.lineCap=nt(U.lineCap,"butt"),s.lineDashOffset=nt(U.lineDashOffset,0),s.lineJoin=nt(U.lineJoin,"miter"),s.lineWidth=it,s.strokeStyle=nt(U.strokeStyle,a),s.setLineDash(nt(U.lineDash,[])),o.usePointStyle){let lt={radius:S*Math.SQRT2/2,pointStyle:U.pointStyle,rotation:U.rotation,borderWidth:it},rt=l.xPlus(N,y/2),Pt=G+p;pr(s,lt,rt,Pt,o.pointStyleWidth&&y)}else{let lt=G+Math.max((g-S)/2,0),rt=l.leftForLtr(N,y),Pt=Le(U.borderRadius);s.beginPath(),Object.values(Pt).some(zt=>zt!==0)?en(s,{x:rt,y:lt,w:y,h:S,radius:Pt}):s.rect(rt,lt,y,S),s.fill(),it!==0&&s.stroke()}s.restore()},F=function(N,G,U){tn(s,U.text,N,G+M/2,c,{strikethrough:U.hidden,textAlign:l.textAlign(U.textAlign)})},D=this.isHorizontal(),I=this._computeTitleHeight();D?m={x:ie(r,this.left+f,this.right-i[0]),y:this.top+f+I,line:0}:m={x:this.left+f,y:ie(r,this.top+I+f,this.bottom-e[0].height),line:0},Sr(this.ctx,t.textDirection);let $=M+f;this.legendItems.forEach((N,G)=>{s.strokeStyle=N.fontColor||h,s.fillStyle=N.fontColor||h;let U=s.measureText(N.text).width,it=l.textAlign(N.textAlign||(N.textAlign=o.textAlign)),lt=y+p+U,rt=m.x,Pt=m.y;l.setWidth(this.width),D?G>0&&rt+lt+f>this.right&&(Pt=m.y+=$,m.line++,rt=m.x=ie(r,this.left+f,this.right-i[m.line])):G>0&&Pt+$>this.bottom&&(rt=m.x=rt+e[m.line].width+f,m.line++,Pt=m.y=ie(r,this.top+I+f,this.bottom-e[m.line].height));let zt=l.x(rt);C(zt,Pt,N),rt=ia(it,rt+y+p,D?rt+lt:this.right,t.rtl),F(l.x(rt),Pt,N),D?m.x+=lt+f:m.y+=$}),Mr(this.ctx,t.textDirection)}drawTitle(){let t=this.options,e=t.title,i=Ft(e.font),s=Vt(e.padding);if(!e.display)return;let r=Sn(t.rtl,this.left,this.width),o=this.ctx,a=e.position,l=i.size/2,c=s.top+l,h,f=this.left,g=this.width;if(this.isHorizontal())g=Math.max(...this.lineWidths),h=this.top+c,f=ie(t.align,f,this.right-g);else{let m=this.columnSizes.reduce((y,S)=>Math.max(y,S.height),0);h=c+ie(t.align,this.top,this.bottom-m-t.labels.padding-this._computeTitleHeight())}let p=ie(a,f,f+g);o.textAlign=r.textAlign(Gi(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,tn(o,e.text,p,h,i)}_computeTitleHeight(){let t=this.options.title,e=Ft(t.font),i=Vt(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,r;if(Ae(t,this.left,this.right)&&Ae(e,this.top,this.bottom)){for(r=this.legendHitBoxes,i=0;in.chart.options.color,boxWidth:40,padding:10,generateLabels(n){let t=n.data.datasets,{labels:{usePointStyle:e,pointStyle:i,textAlign:s,color:r}}=n.legend.options;return n._getSortedDatasetMetas().map(o=>{let a=o.controller.getStyle(e?0:void 0),l=Vt(a.borderWidth);return{text:t[o.index].label,fillStyle:a.backgroundColor,fontColor:r,hidden:!o.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(l.width+l.height)/4,strokeStyle:a.borderColor,pointStyle:i||a.pointStyle,rotation:a.rotation,textAlign:s||a.textAlign,borderRadius:0,datasetIndex:o.index}},this)}},title:{color:n=>n.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:n=>!n.startsWith("on"),labels:{_scriptable:n=>!["generateLabels","filter","sort"].includes(n)}}},$r=class extends qt{constructor(t){super();this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){let i=this.options;if(this.left=0,this.top=0,!i.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=e;let s=pt(i.text)?i.text.length:1;this._padding=Vt(i.padding);let r=s*Ft(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=r:this.width=r}isHorizontal(){let t=this.options.position;return t==="top"||t==="bottom"}_drawArgs(t){let{top:e,left:i,bottom:s,right:r,options:o}=this,a=o.align,l=0,c,h,f;return this.isHorizontal()?(h=ie(a,i,r),f=e+t,c=r-i):(o.position==="left"?(h=i+t,f=ie(a,s,e),l=gt*-.5):(h=r-t,f=ie(a,e,s),l=gt*.5),c=s-e),{titleX:h,titleY:f,maxWidth:c,rotation:l}}draw(){let t=this.ctx,e=this.options;if(!e.display)return;let i=Ft(e.font),r=i.lineHeight/2+this._padding.top,{titleX:o,titleY:a,maxWidth:l,rotation:c}=this._drawArgs(r);tn(t,e.text,0,0,i,{color:e.color,maxWidth:l,rotation:c,textAlign:Gi(e.align),textBaseline:"middle",translation:[o,a]})}};function I_(n,t){let e=new $r({ctx:n.ctx,options:t,chart:n});he.configure(n,e,t),he.addBox(n,e),n.titleBlock=e}var $_={id:"title",_element:$r,start(n,t,e){I_(n,e)},stop(n){let t=n.titleBlock;he.removeBox(n,t),delete n.titleBlock},beforeUpdate(n,t,e){let i=n.titleBlock;he.configure(n,i,e),i.options=e},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},jr=new WeakMap,j_={id:"subtitle",start(n,t,e){let i=new $r({ctx:n.ctx,options:e,chart:n});he.configure(n,i,e),he.addBox(n,i),jr.set(n,i)},stop(n){he.removeBox(n,jr.get(n)),jr.delete(n)},beforeUpdate(n,t,e){let i=jr.get(n);he.configure(n,i,e),i.options=e},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},ws={average(n){if(!n.length)return!1;let t,e,i=0,s=0,r=0;for(t=0,e=n.length;t-1?n.split(` +`):n}function z_(n,t){let{element:e,datasetIndex:i,index:s}=t,r=n.getDatasetMeta(i).controller,{label:o,value:a}=r.getLabelAndValue(s);return{chart:n,label:o,parsed:r.getParsed(s),raw:n.data.datasets[i].data[s],formattedValue:a,dataset:r.getDataset(),dataIndex:s,datasetIndex:i,element:e}}function Ru(n,t){let e=n.chart.ctx,{body:i,footer:s,title:r}=n,{boxWidth:o,boxHeight:a}=t,l=Ft(t.bodyFont),c=Ft(t.titleFont),h=Ft(t.footerFont),f=r.length,g=s.length,p=i.length,m=Vt(t.padding),y=m.height,S=0,M=i.reduce((D,I)=>D+I.before.length+I.lines.length+I.after.length,0);if(M+=n.beforeBody.length+n.afterBody.length,f&&(y+=f*c.lineHeight+(f-1)*t.titleSpacing+t.titleMarginBottom),M){let D=t.displayColors?Math.max(a,l.lineHeight):l.lineHeight;y+=p*D+(M-p)*l.lineHeight+(M-1)*t.bodySpacing}g&&(y+=t.footerMarginTop+g*h.lineHeight+(g-1)*t.footerSpacing);let C=0,F=function(D){S=Math.max(S,e.measureText(D).width+C)};return e.save(),e.font=c.string,Ct(n.title,F),e.font=l.string,Ct(n.beforeBody.concat(n.afterBody),F),C=t.displayColors?o+2+t.boxPadding:0,Ct(i,D=>{Ct(D.before,F),Ct(D.lines,F),Ct(D.after,F)}),C=0,e.font=h.string,Ct(n.footer,F),e.restore(),S+=m.width,{width:S,height:y}}function B_(n,t){let{y:e,height:i}=t;return en.height-i/2?"bottom":"center"}function N_(n,t,e,i){let{x:s,width:r}=i,o=e.caretSize+e.caretPadding;if(n==="left"&&s+r+o>t.width||n==="right"&&s-r-o<0)return!0}function H_(n,t,e,i){let{x:s,width:r}=e,{width:o,chartArea:{left:a,right:l}}=n,c="center";return i==="center"?c=s<=(a+l)/2?"left":"right":s<=r/2?c="left":s>=o-r/2&&(c="right"),N_(c,n,t,e)&&(c="center"),c}function Lu(n,t,e){let i=e.yAlign||t.yAlign||B_(n,e);return{xAlign:e.xAlign||t.xAlign||H_(n,t,e,i),yAlign:i}}function W_(n,t){let{x:e,width:i}=n;return t==="right"?e-=i:t==="center"&&(e-=i/2),e}function V_(n,t,e){let{y:i,height:s}=n;return t==="top"?i+=e:t==="bottom"?i-=s+e:i-=s/2,i}function Fu(n,t,e,i){let{caretSize:s,caretPadding:r,cornerRadius:o}=n,{xAlign:a,yAlign:l}=e,c=s+r,{topLeft:h,topRight:f,bottomLeft:g,bottomRight:p}=Le(o),m=W_(t,a),y=V_(t,l,c);return l==="center"?a==="left"?m+=c:a==="right"&&(m-=c):a==="left"?m-=Math.max(h,g)+s:a==="right"&&(m+=Math.max(f,p)+s),{x:Zt(m,0,i.width-t.width),y:Zt(y,0,i.height-t.height)}}function zr(n,t,e){let i=Vt(e.padding);return t==="center"?n.x+n.width/2:t==="right"?n.x+n.width-i.right:n.x+i.left}function Iu(n){return We([],an(n))}function Y_(n,t,e){return Ne(n,{tooltip:t,tooltipItems:e,type:"tooltip"})}function $u(n,t){let e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?n.override(e):n}var Br=class extends qt{constructor(t){super();this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart||t._chart,this._chart=this.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){let t=this._cachedAnimations;if(t)return t;let e=this.chart,i=this.options.setContext(this.getContext()),s=i.enabled&&e.options.animation&&i.animations,r=new is(this.chart,s);return s._cacheable&&(this._cachedAnimations=Object.freeze(r)),r}getContext(){return this.$context||(this.$context=Y_(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){let{callbacks:i}=e,s=i.beforeTitle.apply(this,[t]),r=i.title.apply(this,[t]),o=i.afterTitle.apply(this,[t]),a=[];return a=We(a,an(s)),a=We(a,an(r)),a=We(a,an(o)),a}getBeforeBody(t,e){return Iu(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){let{callbacks:i}=e,s=[];return Ct(t,r=>{let o={before:[],lines:[],after:[]},a=$u(i,r);We(o.before,an(a.beforeLabel.call(this,r))),We(o.lines,a.label.call(this,r)),We(o.after,an(a.afterLabel.call(this,r))),s.push(o)}),s}getAfterBody(t,e){return Iu(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){let{callbacks:i}=e,s=i.beforeFooter.apply(this,[t]),r=i.footer.apply(this,[t]),o=i.afterFooter.apply(this,[t]),a=[];return a=We(a,an(s)),a=We(a,an(r)),a=We(a,an(o)),a}_createItems(t){let e=this._active,i=this.chart.data,s=[],r=[],o=[],a=[],l,c;for(l=0,c=e.length;lt.filter(h,f,g,i))),t.itemSort&&(a=a.sort((h,f)=>t.itemSort(h,f,i))),Ct(a,h=>{let f=$u(t.callbacks,h);s.push(f.labelColor.call(this,h)),r.push(f.labelPointStyle.call(this,h)),o.push(f.labelTextColor.call(this,h))}),this.labelColors=s,this.labelPointStyles=r,this.labelTextColors=o,this.dataPoints=a,a}update(t,e){let i=this.options.setContext(this.getContext()),s=this._active,r,o=[];if(!s.length)this.opacity!==0&&(r={opacity:0});else{let a=ws[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);let l=this._size=Ru(this,i),c=Object.assign({},a,l),h=Lu(this.chart,i,c),f=Fu(i,c,h,this.chart);this.xAlign=h.xAlign,this.yAlign=h.yAlign,r={opacity:1,x:f.x,y:f.y,width:l.width,height:l.height,caretX:a.x,caretY:a.y}}this._tooltipItems=o,this.$context=void 0,r&&this._resolveAnimations().update(this,r),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){let r=this.getCaretPosition(t,i,s);e.lineTo(r.x1,r.y1),e.lineTo(r.x2,r.y2),e.lineTo(r.x3,r.y3)}getCaretPosition(t,e,i){let{xAlign:s,yAlign:r}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:l,topRight:c,bottomLeft:h,bottomRight:f}=Le(a),{x:g,y:p}=t,{width:m,height:y}=e,S,M,C,F,D,I;return r==="center"?(D=p+y/2,s==="left"?(S=g,M=S-o,F=D+o,I=D-o):(S=g+m,M=S+o,F=D-o,I=D+o),C=S):(s==="left"?M=g+Math.max(l,h)+o:s==="right"?M=g+m-Math.max(c,f)-o:M=this.caretX,r==="top"?(F=p,D=F-o,S=M-o,C=M+o):(F=p+y,D=F+o,S=M+o,C=M-o),I=F),{x1:S,x2:M,x3:C,y1:F,y2:D,y3:I}}drawTitle(t,e,i){let s=this.title,r=s.length,o,a,l;if(r){let c=Sn(i.rtl,this.x,this.width);for(t.x=zr(this,i.titleAlign,i),e.textAlign=c.textAlign(i.titleAlign),e.textBaseline="middle",o=Ft(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,l=0;lF!==0)?(t.beginPath(),t.fillStyle=r.multiKeyBackground,en(t,{x:S,y,w:c,h:l,radius:C}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),en(t,{x:M,y:y+1,w:c-2,h:l-2,radius:C}),t.fill()):(t.fillStyle=r.multiKeyBackground,t.fillRect(S,y,c,l),t.strokeRect(S,y,c,l),t.fillStyle=o.backgroundColor,t.fillRect(M,y+1,c-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){let{body:s}=this,{bodySpacing:r,bodyAlign:o,displayColors:a,boxHeight:l,boxWidth:c,boxPadding:h}=i,f=Ft(i.bodyFont),g=f.lineHeight,p=0,m=Sn(i.rtl,this.x,this.width),y=function(G){e.fillText(G,m.x(t.x+p),t.y+g/2),t.y+=g+r},S=m.textAlign(o),M,C,F,D,I,$,N;for(e.textAlign=o,e.textBaseline="middle",e.font=f.string,t.x=zr(this,S,i),e.fillStyle=i.bodyColor,Ct(this.beforeBody,y),p=a&&S!=="right"?o==="center"?c/2+h:c+2+h:0,D=0,$=s.length;D<$;++D){for(M=s[D],C=this.labelTextColors[D],e.fillStyle=C,Ct(M.before,y),F=M.lines,a&&F.length&&(this._drawColorBox(e,t,D,m,i),g=Math.max(f.lineHeight,l)),I=0,N=F.length;I0&&e.stroke()}_updateAnimationTarget(t){let e=this.chart,i=this.$animations,s=i&&i.x,r=i&&i.y;if(s||r){let o=ws[t.position].call(this,this._active,this._eventPosition);if(!o)return;let a=this._size=Ru(this,t),l=Object.assign({},o,this._size),c=Lu(e,t,l),h=Fu(t,l,c,e);(s._to!==h.x||r._to!==h.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=a.width,this.height=a.height,this.caretX=o.x,this.caretY=o.y,this._resolveAnimations().update(this,h))}}_willRender(){return!!this.opacity}draw(t){let e=this.options.setContext(this.getContext()),i=this.opacity;if(!i)return;this._updateAnimationTarget(e);let s={width:this.width,height:this.height},r={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;let o=Vt(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(r,t,s,e),Sr(t,e.textDirection),r.y+=o.top,this.drawTitle(r,t,e),this.drawBody(r,t,e),this.drawFooter(r,t,e),Mr(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){let i=this._active,s=t.map(({datasetIndex:a,index:l})=>{let c=this.chart.getDatasetMeta(a);if(!c)throw new Error("Cannot find a dataset at index "+a);return{datasetIndex:a,element:c.data[l],index:l}}),r=!yi(i,s),o=this._positionChanged(s,e);(r||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let s=this.options,r=this._active||[],o=this._getActiveElements(t,r,e,i),a=this._positionChanged(o,t),l=e||!yi(o,r)||a;return l&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,i,s){let r=this.options;if(t.type==="mouseout")return[];if(!s)return e;let o=this.chart.getElementsAtEventForMode(t,r.mode,r,i);return r.reverse&&o.reverse(),o}_positionChanged(t,e){let{caretX:i,caretY:s,options:r}=this,o=ws[r.position].call(this,t,e);return o!==!1&&(i!==o.x||s!==o.y)}};Br.positioners=ws;var X_={id:"tooltip",_element:Br,positioners:ws,afterInit(n,t,e){e&&(n.tooltip=new Br({chart:n,options:e}))},beforeUpdate(n,t,e){n.tooltip&&n.tooltip.initialize(e)},reset(n,t,e){n.tooltip&&n.tooltip.initialize(e)},afterDraw(n){let t=n.tooltip;if(t&&t._willRender()){let e={tooltip:t};if(n.notifyPlugins("beforeTooltipDraw",e)===!1)return;t.draw(n.ctx),n.notifyPlugins("afterTooltipDraw",e)}},afterEvent(n,t){if(n.tooltip){let e=t.replay;n.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(n,t)=>t.bodyFont.size,boxWidth:(n,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:Ee,title(n){if(n.length>0){let t=n[0],e=t.chart.data.labels,i=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(i>0&&t.dataIndexn!=="filter"&&n!=="itemSort"&&n!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},q_=Object.freeze({__proto__:null,Decimation:f_,Filler:A_,Legend:F_,SubTitle:j_,Title:$_,Tooltip:X_}),G_=(n,t,e,i)=>(typeof t=="string"?(e=n.push(t)-1,i.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function U_(n,t,e,i){let s=n.indexOf(t);if(s===-1)return G_(n,t,e,i);let r=n.lastIndexOf(t);return s!==r?e:s}var K_=(n,t)=>n===null?null:Zt(Math.round(n),0,t),ks=class extends Mn{constructor(t){super(t);this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){let e=this._addedLabels;if(e.length){let i=this.getLabels();for(let{index:s,label:r}of e)i[s]===r&&i.splice(s,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(ut(t))return null;let i=this.getLabels();return e=isFinite(e)&&i[e]===t?e:U_(i,t,nt(e,t),this._addedLabels),K_(e,i.length-1)}determineDataLimits(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),{min:i,max:s}=this.getMinMax(!0);this.options.bounds==="ticks"&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){let t=this.min,e=this.max,i=this.options.offset,s=[],r=this.getLabels();r=t===0&&e===r.length-1?r:r.slice(t,e+1),this._valueRange=Math.max(r.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let o=t;o<=e;o++)s.push({value:o});return s}getLabelForValue(t){let e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}};ks.id="category";ks.defaults={ticks:{callback:ks.prototype.getLabelForValue}};function Z_(n,t){let e=[],i=1e-14,{bounds:s,step:r,min:o,max:a,precision:l,count:c,maxTicks:h,maxDigits:f,includeBounds:g}=n,p=r||1,m=h-1,{min:y,max:S}=t,M=!ut(o),C=!ut(a),F=!ut(c),D=(S-y)/(f+1),I=Js((S-y)/m/p)*p,$,N,G,U;if(Im&&(I=Js(U*I/m/p)*p),ut(l)||($=Math.pow(10,l),I=Math.ceil(I*$)/$),s==="ticks"?(N=Math.floor(y/I)*I,G=Math.ceil(S/I)*I):(N=y,G=S),M&&C&&r&&Zo((a-o)/r,I/1e3)?(U=Math.round(Math.min((a-o)/I,h)),I=(a-o)/U,N=o,G=a):F?(N=M?o:N,G=C?a:G,U=c-1,I=(G-N)/U):(U=(G-N)/I,Vn(U,Math.round(U),I/1e3)?U=Math.round(U):U=Math.ceil(U));let it=Math.max(tr(I),tr(N));$=Math.pow(10,ut(l)?it:l),N=Math.round(N*$)/$,G=Math.round(G*$)/$;let lt=0;for(M&&(g&&N!==o?(e.push({value:o}),Ns=e?s:l,a=l=>r=i?r:l;if(t){let l=Me(s),c=Me(r);l<0&&c<0?a(0):l>0&&c>0&&o(0)}if(s===r){let l=1;(r>=Number.MAX_SAFE_INTEGER||s<=Number.MIN_SAFE_INTEGER)&&(l=Math.abs(r*.05)),a(r+l),t||o(s-l)}this.min=s,this.max=r}getTickLimit(){let t=this.options.ticks,{maxTicksLimit:e,stepSize:i}=t,s;return i?(s=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,s>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${s} ticks. Limiting to 1000.`),s=1e3)):(s=this.computeTickLimit(),e=e||11),e&&(s=Math.min(e,s)),s}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){let t=this.options,e=t.ticks,i=this.getTickLimit();i=Math.max(2,i);let s={maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},r=this._range||this,o=Z_(s,r);return t.bounds==="ticks"&&Qs(o,this,"value"),t.reverse?(o.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),o}configure(){let t=this.ticks,e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){let s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return Jn(t,this.chart.options.locale,this.options.ticks.format)}},Nr=class extends Ss{determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=jt(t)?t:0,this.max=jt(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){let t=this.isHorizontal(),e=t?this.width:this.height,i=Wt(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,r=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,r.lineHeight/s))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}};Nr.id="linear";Nr.defaults={ticks:{callback:Dr.formatters.numeric}};function zu(n){return n/Math.pow(10,Math.floor(be(n)))===1}function J_(n,t){let e=Math.floor(be(t.max)),i=Math.ceil(t.max/Math.pow(10,e)),s=[],r=me(n.min,Math.pow(10,Math.floor(be(t.min)))),o=Math.floor(be(r)),a=Math.floor(r/Math.pow(10,o)),l=o<0?Math.pow(10,Math.abs(o)):1;do s.push({value:r,major:zu(r)}),++a,a===10&&(a=1,++o,l=o>=0?1:l),r=Math.round(a*Math.pow(10,o)*l)/l;while(o0?i:null}determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=jt(t)?Math.max(0,t):null,this.max=jt(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),i=this.min,s=this.max,r=l=>i=t?i:l,o=l=>s=e?s:l,a=(l,c)=>Math.pow(10,Math.floor(be(l))+c);i===s&&(i<=0?(r(1),o(10)):(r(a(i,-1)),o(a(s,1)))),i<=0&&r(a(s,-1)),s<=0&&o(a(i,1)),this._zero&&this.min!==this._suggestedMin&&i===a(this.min,0)&&r(a(i,-1)),this.min=i,this.max=s}buildTicks(){let t=this.options,e={min:this._userMin,max:this._userMax},i=J_(e,this);return t.bounds==="ticks"&&Qs(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return t===void 0?"0":Jn(t,this.chart.options.locale,this.options.ticks.format)}configure(){let t=this.min;super.configure(),this._startValue=be(t),this._valueRange=be(this.max)-be(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(be(t)-this._startValue)/this._valueRange)}getValueForPixel(t){let e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}};Hr.id="logarithmic";Hr.defaults={ticks:{callback:Dr.formatters.logarithmic,major:{enabled:!0}}};function Wa(n){let t=n.ticks;if(t.display&&n.display){let e=Vt(t.backdropPadding);return nt(t.font&&t.font.size,ft.font.size)+e.height}return 0}function Q_(n,t,e){return e=pt(e)?e:[e],{w:ua(n,t.string,e),h:e.length*t.lineHeight}}function Bu(n,t,e,i,s){return n===i||n===s?{start:t-e/2,end:t+e/2}:ns?{start:t-e,end:t}:{start:t,end:t+e}}function ty(n){let t={l:n.left+n._padding.left,r:n.right-n._padding.right,t:n.top+n._padding.top,b:n.bottom-n._padding.bottom},e=Object.assign({},t),i=[],s=[],r=n._pointLabels.length,o=n.options.pointLabels,a=o.centerPointLabels?gt/r:0;for(let l=0;lt.r&&(a=(i.end-t.r)/r,n.r=Math.max(n.r,t.r+a)),s.startt.b&&(l=(s.end-t.b)/o,n.b=Math.max(n.b,t.b+l))}function ny(n,t,e){let i=[],s=n._pointLabels.length,r=n.options,o=Wa(r)/2,a=n.drawingArea,l=r.pointLabels.centerPointLabels?gt/s:0;for(let c=0;c270||e<90)&&(n-=t),n}function oy(n,t){let{ctx:e,options:{pointLabels:i}}=n;for(let s=t-1;s>=0;s--){let r=i.setContext(n.getPointLabelContext(s)),o=Ft(r.font),{x:a,y:l,textAlign:c,left:h,top:f,right:g,bottom:p}=n._pointLabelItems[s],{backdropColor:m}=r;if(!ut(m)){let y=Le(r.borderRadius),S=Vt(r.backdropPadding);e.fillStyle=m;let M=h-S.left,C=f-S.top,F=g-h+S.width,D=p-f+S.height;Object.values(y).some(I=>I!==0)?(e.beginPath(),en(e,{x:M,y:C,w:F,h:D,radius:y}),e.fill()):e.fillRect(M,C,F,D)}tn(e,n._pointLabels[s],a,l+o.lineHeight/2,o,{color:r.color,textAlign:c,textBaseline:"middle"})}}function Nu(n,t,e,i){let{ctx:s}=n;if(e)s.arc(n.xCenter,n.yCenter,t,0,kt);else{let r=n.getPointPosition(0,t);s.moveTo(r.x,r.y);for(let o=1;o{let s=wt(this.options.pointLabels.callback,[e,i],this);return s||s===0?s:""}).filter((e,i)=>this.chart.getDataVisibility(i))}fit(){let t=this.options;t.display&&t.pointLabels.display?ty(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){let e=kt/(this._pointLabels.length||1),i=this.options.startAngle||0;return fe(t*e+Wt(i))}getDistanceFromCenterForValue(t){if(ut(t))return NaN;let e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(ut(t))return NaN;let e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){let e=this._pointLabels||[];if(t>=0&&t{if(h!==0){a=this.getDistanceFromCenterForValue(c.value);let f=s.setContext(this.getContext(h-1));ay(this,f,a,r)}}),i.display){for(t.save(),o=r-1;o>=0;o--){let c=i.setContext(this.getPointLabelContext(o)),{color:h,lineWidth:f}=c;!f||!h||(t.lineWidth=f,t.strokeStyle=h,t.setLineDash(c.borderDash),t.lineDashOffset=c.borderDashOffset,a=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(o,a),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){let t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;let s=this.getIndexAngle(0),r,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((a,l)=>{if(l===0&&!e.reverse)return;let c=i.setContext(this.getContext(l)),h=Ft(c.font);if(r=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=h.string,o=t.measureText(a.label).width,t.fillStyle=c.backdropColor;let f=Vt(c.backdropPadding);t.fillRect(-o/2-f.left,-r-h.size/2-f.top,o+f.width,h.size+f.height)}tn(t,a.label,0,-r,h,{color:c.color})}),t.restore()}drawTitle(){}};Ci.id="radialLinear";Ci.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Dr.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(n){return n},padding:5,centerPointLabels:!1}};Ci.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};Ci.descriptors={angleLines:{_fallback:"grid"}};var Wr={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},_e=Object.keys(Wr);function cy(n,t){return n-t}function Hu(n,t){if(ut(t))return null;let e=n._adapter,{parser:i,round:s,isoWeekday:r}=n._parseOpts,o=t;return typeof i=="function"&&(o=i(o)),jt(o)||(o=typeof i=="string"?e.parse(o,i):e.parse(o)),o===null?null:(s&&(o=s==="week"&&(Oe(r)||r===!0)?e.startOf(o,"isoWeek",r):e.startOf(o,s)),+o)}function Wu(n,t,e,i){let s=_e.length;for(let r=_e.indexOf(n);r=_e.indexOf(e);r--){let o=_e[r];if(Wr[o].common&&n._adapter.diff(s,i,o)>=t-1)return o}return _e[e?_e.indexOf(e):0]}function uy(n){for(let t=_e.indexOf(n)+1,e=_e.length;t=t?e[i]:e[s];n[r]=!0}}function fy(n,t,e,i){let s=n._adapter,r=+s.startOf(t[0].value,i),o=t[t.length-1].value,a,l;for(a=r;a<=o;a=+s.add(a,1,i))l=e[a],l>=0&&(t[l].major=!0);return t}function Yu(n,t,e){let i=[],s={},r=t.length,o,a;for(o=0;o+t.value))}initOffsets(t){let e=0,i=0,s,r;this.options.offset&&t.length&&(s=this.getDecimalForValue(t[0]),t.length===1?e=1-s:e=(this.getDecimalForValue(t[1])-s)/2,r=this.getDecimalForValue(t[t.length-1]),t.length===1?i=r:i=(r-this.getDecimalForValue(t[t.length-2]))/2);let o=t.length<3?.5:.25;e=Zt(e,0,o),i=Zt(i,0,o),this._offsets={start:e,end:i,factor:1/(e+1+i)}}_generate(){let t=this._adapter,e=this.min,i=this.max,s=this.options,r=s.time,o=r.unit||Wu(r.minUnit,e,i,this._getLabelCapacity(e)),a=nt(r.stepSize,1),l=o==="week"?r.isoWeekday:!1,c=Oe(l)||l===!0,h={},f=e,g,p;if(c&&(f=+t.startOf(f,"isoWeek",l)),f=+t.startOf(f,c?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);let m=s.ticks.source==="data"&&this.getDataTimestamps();for(g=f,p=0;gy-S).map(y=>+y)}getLabelForValue(t){let e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,s){let r=this.options,o=r.time.displayFormats,a=this._unit,l=this._majorUnit,c=a&&o[a],h=l&&o[l],f=i[e],g=l&&h&&f&&f.major,p=this._adapter.format(t,s||(g?h:c)),m=r.ticks.callback;return m?wt(m,[p,e,i],this):p}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t=this._cache.data||[],e,i;if(t.length)return t;let s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(e=0,i=s.length;e=n[i].pos&&t<=n[s].pos&&({lo:i,hi:s}=Re(n,"pos",t)),{pos:r,time:a}=n[i],{pos:o,time:l}=n[s]):(t>=n[i].time&&t<=n[s].time&&({lo:i,hi:s}=Re(n,"time",t)),{time:r,pos:a}=n[i],{time:o,pos:l}=n[s]);let c=o-r;return c?a+(l-a)*(t-r)/c:a}var Yr=class extends Pi{constructor(t){super(t);this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Vr(e,this.min),this._tableRange=Vr(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){let{min:e,max:i}=this,s=[],r=[],o,a,l,c,h;for(o=0,a=t.length;o=e&&c<=i&&s.push(c);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;on!==void 0;function gy(n,t){let e=new Set(t.map(o=>o.to)),i=new Set(t.map(o=>o.from)),s=new Set([...n.keys()]),r=0;for(;s.size;){let o=my([...s],e);for(let a of o){let l=n.get(a);Tn(l.x)||(l.x=r),s.delete(a)}s.size&&(e.clear(),t.filter(a=>s.has(a.from)).forEach(a=>e.add(a.to)),r++)}return[...n.keys()].filter(o=>!i.has(o)).forEach(o=>{let a=n.get(o);a.column||(a.x=r)}),r}function my(n,t){let e=n.filter(i=>!t.has(i));return e.length?e:n.slice(0,1)}var by=(n,t)=>n.x!==t.x?n.x-t.x:n.y-t.y,Xr=-1;function vy(){return Xr=Xr<100?Xr+1:0,Xr}function Ya(n,t,e=vy()){let i=0;for(let s of n)s.node._visited!==e&&(s.node._visited=e,i+=s.node[t].length+Ya(s.node[t],t,e));return i}var qu=n=>(t,e)=>Ya(t.node[n],n)-Ya(e.node[n],n)||t.node[n].length-e.node[n].length;function Xa(n,t){n.from.sort(qu("from"));for(let e of n.from){let i=e.node;Tn(i.y)||(i.y=t,Xa(i,t)),t=Math.max(i.y+i.out,t)}return t}function ei(n,t){n.to.sort(qu("to"));for(let e of n.to){let i=e.node;Tn(i.y)||(i.y=t,ei(i,t)),t=Math.max(i.y+i.in,t)}return t}function Ms(n,t){return Tn(n.y)?n.y:(n.y=t,t)}function _y(n,t){let e=n.filter(h=>h.x===0),i=n.filter(h=>h.x===t),s=e.filter(h=>!Tn(h.y)),r=i.filter(h=>!Tn(h.y)),o=n.filter(h=>h.x>0&&h.xMath.max(h,f.y+f.out||0),0),l=i.reduce((h,f)=>Math.max(h,f.y+f.in||0),0),c=0;return a>=l?(s.forEach(h=>{a=Ms(h,a),a=Math.max(a+h.out,ei(h,a))}),r.forEach(h=>{l=Ms(h,l),l=Math.max(l+h.in,ei(h,l))})):(r.forEach(h=>{l=Ms(h,l),l=Math.max(l+h.in,ei(h,l))}),s.forEach(h=>{a=Ms(h,a),a=Math.max(a+h.out,ei(h,a))})),o.forEach(h=>{let f=n.filter(g=>g.x===h.x&&Tn(g.y)).reduce((g,p)=>Math.max(g,p.y+Math.max(p.in,p.out)),0);f=Ms(h,f),f=Math.max(f+h.in,Xa(h,f)),f=Math.max(f+h.out,ei(h,f)),c=Math.max(c,f)}),Math.max(a,l,c)}function yy(n,t){n.sort((o,a)=>Math.max(a.in,a.out)-Math.max(o.in,o.out));let e=n[0];e.y=0;let i=Xa(e,0),s=ei(e,0),r=_y(n,t);return Math.max(i,s,r)}function xy(n,t){let e=0,i=0;for(let s=0;s<=t;s++){let r=i,o=n.filter(a=>a.x===s).sort((a,l)=>a.priority-l.priority);i=o[0].to.filter(a=>a.node.x>s+1).reduce((a,l)=>a+l.flow,0)||0;for(let a of o)a.y=r,r+=Math.max(a.out,a.in);e=Math.max(r,e)}return e}function wy(n,t){let e=1,i=0,s=0,r=0,o=[];n.sort(by);for(let a of n){if(a.y){if(a.x===0)o.push(a.y);else{for(i!==a.x&&(i=a.x,s=0),e=s+1;ea.y);e++);s=e}a.y+=e*t,e++}r=Math.max(r,a.y+Math.max(a.in,a.out))}return r}function ky(n,t){n.forEach(e=>{let i=Math[t](e.in||e.out,e.out||e.in),s=il.node.y+l.node.out/2-(c.node.y+c.node.out/2)).forEach((l,c)=>{s?l.addY=c*(i-l.flow)/(a-1):(l.addY=o,o+=l.flow)}),o=0,a=e.to.length,e.to.sort((l,c)=>l.node.y+l.node.in/2-(c.node.y+c.node.in/2)).forEach((l,c)=>{r?l.addY=c*(i-l.flow)/(a-1):(l.addY=o,o+=l.flow)})})}function Sy(n,t,e,i){let s=[...n.values()],r=gy(n,t),a=(e?xy(s,r):yy(s,r))*.03,l=wy(s,a);return ky(s,i),{maxX:r,maxY:l}}function My(n){let t=new Map;for(let i=0;is.flow-i.flow;return[...t.values()].forEach(i=>{i.from=i.from.sort(e),i.from.forEach(s=>{s.node=t.get(s.key)}),i.to=i.to.sort(e),i.to.forEach(s=>{s.node=t.get(s.key)})}),t}function Gu(n,t,e){for(let i of n)if(i.key===t&&i.index===e)return i.addY;return 0}var Ti=class extends ve{parseObjectData(t,e,i,s){let{from:r="from",to:o="to",flow:a="flow"}=this.options.parsing,l=e.map(({[r]:C,[o]:F,[a]:D})=>({from:C,to:F,flow:D})),{xScale:c,yScale:h}=t,f=[],g=this._nodes=My(l),{column:p,priority:m,size:y}=this.getDataset();if(m)for(let C of g.values())C.key in m&&(C.priority=m[C.key]);if(p)for(let C of g.values())C.key in p&&(C.column=!0,C.x=p[C.key]);let{maxX:S,maxY:M}=Sy(g,l,!!m,Va(y));this._maxX=S,this._maxY=M;for(let C=0,F=l.length;C1){let g=c-h*l/2+f;for(let p=0;pn.type==="data"?(n.parsed._custom.x-n.parsed.x)*200:void 0,delay:n=>n.type==="data"?n.parsed.x*500+n.dataIndex*20:void 0},colors:{type:"color",properties:["colorFrom","colorTo"]}},transitions:{hide:{animations:{colors:{type:"color",properties:["colorFrom","colorTo"],to:"transparent"}}},show:{animations:{colors:{type:"color",properties:["colorFrom","colorTo"],from:"transparent"}}}}};Ti.overrides={interaction:{mode:"nearest",intersect:!0},datasets:{clip:!1,parsing:!0},plugins:{tooltip:{callbacks:{title(){return""},label(n){let t=n.dataset.data[n.dataIndex];return t.from+" -> "+t.to+": "+t.flow}}},legend:{display:!1}},scales:{x:{type:"linear",bounds:"data",display:!1,min:0,offset:!1},y:{type:"linear",bounds:"data",display:!1,min:0,reverse:!0,offset:!1}},layout:{padding:{top:3,left:3,right:13,bottom:3}}};var Uu=(n,t,e,i)=>n({x:n.x+e*(t.x-n.x),y:n.y+e*(t.y-n.y)});function Cy(n,{x:t,x2:e,options:i}){let s;i.colorMode==="from"?s=Je(i.colorFrom).alpha(.5).rgbString():i.colorMode==="to"?s=Je(i.colorTo).alpha(.5).rgbString():(s=n.createLinearGradient(t,0,e,0),s.addColorStop(0,Je(i.colorFrom).alpha(.5).rgbString()),s.addColorStop(1,Je(i.colorTo).alpha(.5).rgbString())),n.fillStyle=s,n.strokeStyle=s,n.lineWidth=.5}var Cs=class extends qt{constructor(t){super();this.options=void 0,this.x=void 0,this.y=void 0,this.x2=void 0,this.y2=void 0,this.height=void 0,t&&Object.assign(this,t)}draw(t){let e=this,{x:i,x2:s,y:r,y2:o,height:a,progress:l}=e,{cp1:c,cp2:h}=Uu(i,r,s,o);l!==0&&(t.save(),l<1&&(t.beginPath(),t.rect(i,Math.min(r,o),(s-i)*l+1,Math.abs(o-r)+a+1),t.clip()),Cy(t,e),t.beginPath(),t.moveTo(i,r),t.bezierCurveTo(c.x,c.y,h.x,h.y,s,o),t.lineTo(s,o+a),t.bezierCurveTo(h.x,h.y+a,c.x,c.y+a,i,r+a),t.lineTo(i,r),t.stroke(),t.closePath(),t.fill(),t.restore())}inRange(t,e,i){let{x:s,y:r,x2:o,y2:a,height:l}=this.getProps(["x","y","x2","y2","height"],i);if(to)return!1;let{cp1:c,cp2:h}=Uu(s,r,o,a),f=(t-s)/(o-s),g={x:s,y:r},p={x:o,y:a},m=Di(g,c,f),y=Di(c,h,f),S=Di(h,p,f),M=Di(m,y,f),C=Di(y,S,f),F=Di(M,C,f).y;return e>=F&&e<=F+l}inXRange(t,e){let{x:i,x2:s}=this.getProps(["x","x2"],e);return t>=i&&t<=s}inYRange(t,e){let{y:i,y2:s,height:r}=this.getProps(["y","y2","height"],e),o=Math.min(i,s),a=Math.max(i,s)+r;return t>=o&&t<=a}getCenterPoint(t){let{x:e,y:i,x2:s,y2:r,height:o}=this.getProps(["x","y","x2","y2","height"],t);return{x:(e+s)/2,y:(i+r+o)/2}}tooltipPosition(t){return this.getCenterPoint(t)}getRange(t){return t==="x"?this.width/2:this.height/2}};Cs.id="flow";Cs.defaults={colorFrom:"red",colorTo:"green",colorMode:"gradient",hoverColorFrom:(n,t)=>Gn(t.colorFrom),hoverColorTo:(n,t)=>Gn(t.colorTo)};var Fe=ze(require("obsidian"));var Py={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};Pa._date.override(typeof Fe.moment=="function"?{_id:"moment",formats:function(){return Py},parse:function(n,t){return typeof n=="string"&&typeof t=="string"?n=(0,Fe.moment)(n,t):n instanceof Fe.moment||(n=(0,Fe.moment)(n)),n.isValid()?n.valueOf():null},format:function(n,t){return(0,Fe.moment)(n).format(t)},add:function(n,t,e){return(0,Fe.moment)(n).add(t,e).valueOf()},diff:function(n,t,e){return(0,Fe.moment)(n).diff((0,Fe.moment)(t),e)},startOf:function(n,t,e){return n=(0,Fe.moment)(n),t==="isoWeek"?(e=Math.trunc(Math.min(Math.max(0,e),6)),n.isoWeekday(e).startOf("day").valueOf()):n.startOf(t).valueOf()},endOf:function(n,t){return(0,Fe.moment)(n).endOf(t).valueOf()}}:{});var Qr=ze(require("obsidian"));var Zu=ze(Ku());function ln(n,t=.25){if(typeof t!="number")throw"Provided alpha value is not a number";return n.map(e=>(0,Zu.default)(e.trim()).alpha(t).hex())}function cn(n,t){var i,s;let e=t.createDiv({cls:"chart-error"});e.createEl("b",{text:"Couldn't render Chart:"}),e.createEl("pre").createEl("code",{text:(s=(i=n.toString)==null?void 0:i.call(n))!=null?s:n}),e.createEl("hr"),e.createEl("span").innerHTML="You might also want to look for further Errors in the Console: Press CTRL + SHIFT + I to open it."}function Ty(n){for(var t=window.atob(n),e=t.length,i=new Uint8Array(e),s=0;s` - title: ${r.dataTitle} + data: [${r.data}]`).join(` +`)} +width: 80% +beginAtZero: true +\`\`\``;n.replaceSelection(s)}function Za(n,t,e){let i;try{i=sf.Extractor.extractObject(n,t,!1)}catch(o){throw new nf.Notice("Table malformed"),o}let s=Object.keys(Object.values(i)[0]),r=Object.keys(i).map(o=>({dataTitle:o,data:Object.values(i[o])}));return e&&(r=r.filter(o=>e.contains(o.dataTitle))),{labels:s,dataFields:r}}var rf={modes:{point(n,t){return Gr(n,t,{intersect:!0})},nearest(n,t,e){return Ry(n,t,e)},x(n,t,e){return Gr(n,t,{intersect:e.intersect,axis:"x"})},y(n,t,e){return Gr(n,t,{intersect:e.intersect,axis:"y"})}}};function Ja(n,t,e){return(rf.modes[e.mode]||rf.modes.nearest)(n,t,e)}function Oy(n,t,e){return e!=="x"&&e!=="y"?n.inRange(t.x,t.y,"x",!0)||n.inRange(t.x,t.y,"y",!0):n.inRange(t.x,t.y,e,!0)}function Ay(n,t,e){return e==="x"?{x:n.x,y:t.y}:e==="y"?{x:t.x,y:n.y}:t}function Gr(n,t,e){return n.visibleElements.filter(i=>e.intersect?i.inRange(t.x,t.y):Oy(i,t,e.axis))}function Ry(n,t,e){let i=Number.POSITIVE_INFINITY;return Gr(n,t,e).reduce((s,r)=>{let o=r.getCenterPoint(),a=Ay(t,o,e.axis),l=Ke(t,a);return ls._index-r._index).slice(0,1)}var Ly=(n,t)=>t>n||n.length>t.length&&n.slice(0,t.length)===t,ni=.001,Ur=(n,t,e)=>Math.min(e,Math.max(t,n));function Fy(n,t,e){for(let i of Object.keys(n))n[i]=Ur(n[i],t,e);return n}function Iy(n,t,e,i){if(!n||!t||e<=0)return!1;let s=i/2;return Math.pow(n.x-t.x,2)+Math.pow(n.y-t.y,2)<=Math.pow(e+s,2)}function of(n,{x:t,y:e,x2:i,y2:s},r,o){let a=o/2,l=n.x>=t-a-ni&&n.x<=i+a+ni,c=n.y>=e-a-ni&&n.y<=s+a+ni;return r==="x"?l:(r==="y"||l)&&c}function Oi(n,t){let{centerX:e,centerY:i}=n.getProps(["centerX","centerY"],t);return{x:e,y:i}}function $y(n,t,e,i=!0){let s=e.split("."),r=0;for(let o of t.split(".")){let a=s[r++];if(parseInt(o,10)typeof n=="string"&&n.endsWith("%"),lf=n=>parseFloat(n)/100,cf=n=>Ur(lf(n),0,1);function Qa(n,t){return t==="start"?0:t==="end"?n:af(t)?cf(t)*n:n/2}function Dn(n,t,e=!0){return typeof t=="number"?t:af(t)?(e?cf(t):lf(t))*n:n}function jy(n,t){let{x:e,width:i}=n,s=t.textAlign;return s==="center"?e+i/2:s==="end"||s==="right"?e+i:e}function tl(n,t="center"){return at(n)?{x:nt(n.x,t),y:nt(n.y,t)}:(n=nt(n,t),{x:n,y:n})}function hf(n){return n&&(Nt(n.xValue)||Nt(n.yValue))}function Ps(n,t,e,i=!1){let s=e.init;if(s){if(s===!0)return ff(t,i)}else return;return zy(t,i,wt(s,[{chart:n,properties:t,options:e}]))}function uf(n,t,e){let i=!1;return t.forEach(s=>{le(n[s])?(i=!0,e[s]=n[s]):Nt(e[s])&&delete e[s]}),i}function ff({centerX:n,centerY:t},e){return e?{centerX:n,centerY:t,radius:0,width:0,height:0}:{x:n,y:t,x2:n,y2:t,width:0,height:0}}function zy(n,t,e){if(e===!0)return ff(n,t);if(at(e))return e}var el=new Map,By=n=>isNaN(n)||n<=0,Ny=n=>n.reduce(function(t,e){return t+=e.string,t},"");function Kr(n){if(n&&typeof n=="object"){let t=n.toString();return t==="[object HTMLImageElement]"||t==="[object HTMLCanvasElement]"}}function nl(n,{x:t,y:e},i){i&&(n.translate(t,e),n.rotate(Wt(i)),n.translate(-t,-e))}function En(n,t){if(t&&t.borderWidth)return n.lineCap=t.borderCapStyle,n.setLineDash(t.borderDash),n.lineDashOffset=t.borderDashOffset,n.lineJoin=t.borderJoinStyle,n.lineWidth=t.borderWidth,n.strokeStyle=t.borderColor,!0}function Ai(n,t){n.shadowColor=t.backgroundShadowColor,n.shadowBlur=t.shadowBlur,n.shadowOffsetX=t.shadowOffsetX,n.shadowOffsetY=t.shadowOffsetY}function il(n,t){let e=t.content;if(Kr(e))return{width:Dn(e.width,t.width),height:Dn(e.height,t.height)};let i=t.font,s=pt(i)?i.map(l=>Ft(l)):[Ft(i)],r=t.textStrokeWidth,o=pt(e)?e:[e],a=o.join()+Ny(s)+r+(n._measureText?"-spriting":"");return el.has(a)||el.set(a,Xy(n,o,s,r)),el.get(a)}function df(n,t,e){let{x:i,y:s,width:r,height:o}=t;n.save(),Ai(n,e);let a=En(n,e);n.fillStyle=e.backgroundColor,n.beginPath(),en(n,{x:i,y:s,w:r,h:o,radius:Fy(Le(e.borderRadius),0,Math.min(r,o)/2)}),n.closePath(),n.fill(),a&&(n.shadowColor=e.borderShadowColor,n.stroke()),n.restore()}function Hy(n,t,e){let i=e.content;if(Kr(i)){n.save(),n.globalAlpha=Uy(e.opacity,i.style.opacity),n.drawImage(i,t.x,t.y,t.width,t.height),n.restore();return}let s=pt(i)?i:[i],r=e.font,o=pt(r)?r.map(f=>Ft(f)):[Ft(r)],a=e.color,l=pt(a)?a:[a],c=jy(t,e),h=t.y+e.textStrokeWidth/2;n.save(),n.textBaseline="middle",n.textAlign=e.textAlign,Wy(n,e)&&qy(n,{x:c,y:h},s,o),Gy(n,{x:c,y:h},s,{fonts:o,colors:l}),n.restore()}function Wy(n,t){if(t.textStrokeWidth>0)return n.lineJoin="round",n.miterLimit=2,n.lineWidth=t.textStrokeWidth,n.strokeStyle=t.textStrokeColor,!0}function Vy(n,t,e,i){let{radius:s,options:r}=t,o=r.pointStyle,a=r.rotation,l=(a||0)*Xi;if(Kr(o)){n.save(),n.translate(e,i),n.rotate(l),n.drawImage(o,-o.width/2,-o.height/2,o.width,o.height),n.restore();return}By(s)||Yy(n,{x:e,y:i,radius:s,rotation:a,style:o,rad:l})}function Yy(n,{x:t,y:e,radius:i,rotation:s,style:r,rad:o}){let a,l,c,h;switch(n.beginPath(),r){default:n.arc(t,e,i,0,kt),n.closePath();break;case"triangle":n.moveTo(t+Math.sin(o)*i,e-Math.cos(o)*i),o+=xi,n.lineTo(t+Math.sin(o)*i,e-Math.cos(o)*i),o+=xi,n.lineTo(t+Math.sin(o)*i,e-Math.cos(o)*i),n.closePath();break;case"rectRounded":h=i*.516,c=i-h,a=Math.cos(o+Se)*c,l=Math.sin(o+Se)*c,n.arc(t-a,e-l,h,o-gt,o-Rt),n.arc(t+l,e-a,h,o-Rt,o),n.arc(t+a,e+l,h,o,o+Rt),n.arc(t-l,e+a,h,o+Rt,o+gt),n.closePath();break;case"rect":if(!s){c=Math.SQRT1_2*i,n.rect(t-c,e-c,2*c,2*c);break}o+=Se;case"rectRot":a=Math.cos(o)*i,l=Math.sin(o)*i,n.moveTo(t-a,e-l),n.lineTo(t+l,e-a),n.lineTo(t+a,e+l),n.lineTo(t-l,e+a),n.closePath();break;case"crossRot":o+=Se;case"cross":a=Math.cos(o)*i,l=Math.sin(o)*i,n.moveTo(t-a,e-l),n.lineTo(t+a,e+l),n.moveTo(t+l,e-a),n.lineTo(t-l,e+a);break;case"star":a=Math.cos(o)*i,l=Math.sin(o)*i,n.moveTo(t-a,e-l),n.lineTo(t+a,e+l),n.moveTo(t+l,e-a),n.lineTo(t-l,e+a),o+=Se,a=Math.cos(o)*i,l=Math.sin(o)*i,n.moveTo(t-a,e-l),n.lineTo(t+a,e+l),n.moveTo(t+l,e-a),n.lineTo(t-l,e+a);break;case"line":a=Math.cos(o)*i,l=Math.sin(o)*i,n.moveTo(t-a,e-l),n.lineTo(t+a,e+l);break;case"dash":n.moveTo(t,e),n.lineTo(t+Math.cos(o)*i,e+Math.sin(o)*i);break}n.fill()}function Xy(n,t,e,i){n.save();let s=t.length,r=0,o=i;for(let a=0;ao.axis&&o.axis===s);return r.length?r[0].id:s}function gf(n,t){if(n){let e=n.options.reverse,i=Ri(n,t.min,e?t.end:t.start),s=Ri(n,t.max,e?t.start:t.end);return{start:i,end:s}}}function mf(n,t){let{chartArea:e,scales:i}=n,s=i[ii(i,t,"xScaleID")],r=i[ii(i,t,"yScaleID")],o=e.width/2,a=e.height/2;return s&&(o=Ri(s,t.xValue,s.left+s.width/2)),r&&(a=Ri(r,t.yValue,r.top+r.height/2)),{x:o,y:a}}function sl(n,t){let e=n.scales,i=e[ii(e,t,"xScaleID")],s=e[ii(e,t,"yScaleID")];if(!i&&!s)return{};let{left:r,right:o}=i||n.chartArea,{top:a,bottom:l}=s||n.chartArea,c=_f(i,{min:t.xMin,max:t.xMax,start:r,end:o});r=c.start,o=c.end;let h=_f(s,{min:t.yMin,max:t.yMax,start:l,end:a});return a=h.start,l=h.end,{x:r,y:a,x2:o,y2:l,width:o-r,height:l-a,centerX:r+(o-r)/2,centerY:a+(l-a)/2}}function bf(n,t){if(!hf(t)){let e=sl(n,t),i=t.radius;(!i||isNaN(i))&&(i=Math.min(e.width,e.height)/2,t.radius=i);let s=i*2,r=e.centerX+t.xAdjust,o=e.centerY+t.yAdjust;return{x:r-i,y:o-i,x2:r+i,y2:o+i,centerX:r,centerY:o,width:s,height:s,radius:i}}return Zy(n,t)}function Ky(n,t){let{scales:e,chartArea:i}=n,s=e[t.scaleID],r={x:i.left,y:i.top,x2:i.right,y2:i.bottom};return s?Jy(s,r,t):Qy(e,r,t),r}function vf(n,t,e){let i=sl(n,t);return i.initProperties=Ps(n,i,t,e),i.elements=[{type:"label",optionScope:"label",properties:nx(n,i,t),initProperties:i.initProperties}],i}function Zy(n,t){let e=mf(n,t),i=t.radius*2;return{x:e.x-t.radius+t.xAdjust,y:e.y-t.radius+t.yAdjust,x2:e.x+t.radius+t.xAdjust,y2:e.y+t.radius+t.yAdjust,centerX:e.x+t.xAdjust,centerY:e.y+t.yAdjust,radius:t.radius,width:i,height:i}}function _f(n,t){let e=gf(n,t)||t;return{start:Math.min(e.start,e.end),end:Math.max(e.start,e.end)}}function Jy(n,t,e){let i=Ri(n,e.value,NaN),s=Ri(n,e.endValue,i);n.isHorizontal()?(t.x=i,t.x2=s):(t.y=i,t.y2=s)}function Qy(n,t,e){for(let i of Object.keys(pf)){let s=n[ii(n,e,i)];if(s){let{min:r,max:o,start:a,end:l,startProp:c,endProp:h}=pf[i],f=gf(s,{min:e[r],max:e[o],start:s[a],end:s[l]});t[c]=f.start,t[h]=f.end}}}function tx({properties:n,options:t},e,i,s){let{x:r,x2:o,width:a}=n;return yf({start:r,end:o,size:a,borderWidth:t.borderWidth},{position:i.x,padding:{start:s.left,end:s.right},adjust:t.label.xAdjust,size:e.width})}function ex({properties:n,options:t},e,i,s){let{y:r,y2:o,height:a}=n;return yf({start:r,end:o,size:a,borderWidth:t.borderWidth},{position:i.y,padding:{start:s.top,end:s.bottom},adjust:t.label.yAdjust,size:e.height})}function yf(n,t){let{start:e,end:i,borderWidth:s}=n,{position:r,padding:{start:o,end:a},adjust:l}=t,c=i-s-e-o-a-t.size;return e+s/2+l+Qa(c,r)}function nx(n,t,e){let i=e.label;i.backgroundColor="transparent",i.callout.display=!1;let s=tl(i.position),r=Vt(i.padding),o=il(n.ctx,i),a=tx({properties:t,options:e},o,s,r),l=ex({properties:t,options:e},o,s,r),c=o.width+r.width,h=o.height+r.height;return{x:a,y:l,x2:a+c,y2:l+h,width:c,height:h,centerX:a+c/2,centerY:l+h/2,rotation:i.rotation}}function si(n,t,e){let i=Math.cos(e),s=Math.sin(e),r=t.x,o=t.y;return{x:r+i*(n.x-r)-s*(n.y-o),y:o+s*(n.x-r)+i*(n.y-o)}}var rl=["enter","leave"],ol=rl.concat("click");function ix(n,t,e){t.listened=uf(e,ol,t.listeners),t.moveListened=!1,t._getElements=Ja,rl.forEach(i=>{le(e[i])&&(t.moveListened=!0)}),(!t.listened||!t.moveListened)&&t.annotations.forEach(i=>{!t.listened&&le(i.click)&&(t.listened=!0),t.moveListened||rl.forEach(s=>{le(i[s])&&(t.listened=!0,t.moveListened=!0)})})}function sx(n,t,e){if(n.listened)switch(t.type){case"mousemove":case"mouseout":return rx(n,t,e);case"click":return ox(n,t,e)}}function rx(n,t,e){if(!n.moveListened)return;let i;t.type==="mousemove"?i=Ja(n,t,e.interaction):i=[];let s=n.hovered;n.hovered=i;let r={state:n,event:t},o=xf(r,"leave",s,i);return xf(r,"enter",i,s)||o}function xf({state:n,event:t},e,i,s){let r;for(let o of i)s.indexOf(o)<0&&(r=wf(o.options[e]||n.listeners[e],o,t)||r);return r}function ox(n,t,e){let i=n.listeners,s=Ja(n,t,e.interaction),r;for(let o of s)r=wf(o.options.click||i.click,o,t)||r;return r}function wf(n,t,e){return wt(n,[t.$context,e])===!0}var Zr=["afterDraw","beforeDraw"];function ax(n,t,e){let i=t.visibleElements;t.hooked=uf(e,Zr,t.hooks),t.hooked||i.forEach(s=>{t.hooked||Zr.forEach(r=>{le(s.options[r])&&(t.hooked=!0)})})}function kf(n,t,e){if(n.hooked){let i=t.options[e]||n.hooks[e];return wt(i,[t.$context])}}function lx(n,t,e){let i=dx(n.scales,t,e),s=Sf(t,i,"min","suggestedMin");s=Sf(t,i,"max","suggestedMax")||s,s&&le(t.handleTickRangeOptions)&&t.handleTickRangeOptions()}function cx(n,t){for(let e of n)ux(e,t)}function Sf(n,t,e,i){if(jt(t[e])&&!hx(n.options,e,i)){let s=n[e]!==t[e];return n[e]=t[e],s}}function hx(n,t,e){return Nt(n[t])||Nt(n[e])}function ux(n,t){for(let e of["scaleID","xScaleID","yScaleID"]){let i=ii(t,n,e);i&&!t[i]&&fx(n,e)&&console.warn(`No scale found with id '${i}' for annotation '${n.id}'`)}}function fx(n,t){if(t==="scaleID")return!0;let e=t.charAt(0);for(let i of["Min","Max","Value"])if(Nt(n[e+i]))return!0;return!1}function dx(n,t,e){let i=t.axis,s=t.id,r=i+"ScaleID",o={min:nt(t.min,Number.NEGATIVE_INFINITY),max:nt(t.max,Number.POSITIVE_INFINITY)};for(let a of e)a.scaleID===s?Mf(a,t,["value","endValue"],o):ii(n,a,r)===s&&Mf(a,t,[i+"Min",i+"Max",i+"Value"],o);return o}function Mf(n,t,e,i){for(let s of e){let r=n[s];if(Nt(r)){let o=t.parse(r);i.min=Math.min(i.min,o),i.max=Math.max(i.max,o)}}}var ri=class extends qt{inRange(t,e,i,s){let{x:r,y:o}=si({x:t,y:e},this.getCenterPoint(s),Wt(-this.options.rotation));return of({x:r,y:o},this.getProps(["x","y","x2","y2"],s),i,this.options.borderWidth)}getCenterPoint(t){return Oi(this,t)}draw(t){t.save(),nl(t,this.getCenterPoint(),this.options.rotation),df(t,this,this.options),t.restore()}get label(){return this.elements&&this.elements[0]}resolveElementProperties(t,e){return vf(t,e)}};ri.id="boxAnnotation";ri.defaults={adjustScaleRange:!0,backgroundShadowColor:"transparent",borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderRadius:0,borderShadowColor:"transparent",borderWidth:1,display:!0,init:void 0,label:{backgroundColor:"transparent",borderWidth:0,callout:{display:!1},color:"black",content:null,display:!1,drawTime:void 0,font:{family:void 0,lineHeight:void 0,size:void 0,style:void 0,weight:"bold"},height:void 0,opacity:void 0,padding:6,position:"center",rotation:void 0,textAlign:"start",textStrokeColor:void 0,textStrokeWidth:0,width:void 0,xAdjust:0,yAdjust:0,z:void 0},rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,xMax:void 0,xMin:void 0,xScaleID:void 0,yMax:void 0,yMin:void 0,yScaleID:void 0,z:0};ri.defaultRoutes={borderColor:"color",backgroundColor:"color"};ri.descriptors={label:{_fallback:!0}};var Cf=["left","bottom","top","right"],Li=class extends qt{inRange(t,e,i,s){let{x:r,y:o}=si({x:t,y:e},this.getCenterPoint(s),Wt(-this.rotation));return of({x:r,y:o},this.getProps(["x","y","x2","y2"],s),i,this.options.borderWidth)}getCenterPoint(t){return Oi(this,t)}draw(t){let e=this.options,i=!Nt(this._visible)||this._visible;!e.display||!e.content||!i||(t.save(),nl(t,this.getCenterPoint(),this.rotation),gx(t,this),df(t,this,e),Hy(t,wx(this),e),t.restore())}resolveElementProperties(t,e){let i;if(hf(e))i=mf(t,e);else{let{centerX:a,centerY:l}=sl(t,e);i={x:a,y:l}}let s=Vt(e.padding),r=il(t.ctx,e),o=px(i,r,e,s);return{initProperties:Ps(t,o,e),pointX:i.x,pointY:i.y,...o,rotation:e.rotation}}};Li.id="labelAnnotation";Li.defaults={adjustScaleRange:!0,backgroundColor:"transparent",backgroundShadowColor:"transparent",borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderRadius:0,borderShadowColor:"transparent",borderWidth:0,callout:{borderCapStyle:"butt",borderColor:void 0,borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:1,display:!1,margin:5,position:"auto",side:5,start:"50%"},color:"black",content:null,display:!0,font:{family:void 0,lineHeight:void 0,size:void 0,style:void 0,weight:void 0},height:void 0,init:void 0,opacity:void 0,padding:6,position:"center",rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,textAlign:"center",textStrokeColor:void 0,textStrokeWidth:0,width:void 0,xAdjust:0,xMax:void 0,xMin:void 0,xScaleID:void 0,xValue:void 0,yAdjust:0,yMax:void 0,yMin:void 0,yScaleID:void 0,yValue:void 0,z:0};Li.defaultRoutes={borderColor:"color"};function px(n,t,e,i){let s=t.width+i.width+e.borderWidth,r=t.height+i.height+e.borderWidth,o=tl(e.position,"center"),a=Pf(n.x,s,e.xAdjust,o.x),l=Pf(n.y,r,e.yAdjust,o.y);return{x:a,y:l,x2:a+s,y2:l+r,width:s,height:r,centerX:a+s/2,centerY:l+r/2}}function Pf(n,t,e=0,i){return n-Qa(t,i)+e}function gx(n,t){let{pointX:e,pointY:i,options:s}=t,r=s.callout,o=r&&r.display&&yx(t,r);if(!o||kx(t,r,o))return;if(n.save(),n.beginPath(),!En(n,r))return n.restore();let{separatorStart:l,separatorEnd:c}=mx(t,o),{sideStart:h,sideEnd:f}=vx(t,o,l);(r.margin>0||s.borderWidth===0)&&(n.moveTo(l.x,l.y),n.lineTo(c.x,c.y)),n.moveTo(h.x,h.y),n.lineTo(f.x,f.y);let g=si({x:e,y:i},t.getCenterPoint(),Wt(-t.rotation));n.lineTo(g.x,g.y),n.stroke(),n.restore()}function mx(n,t){let{x:e,y:i,x2:s,y2:r}=n,o=bx(n,t),a,l;return t==="left"||t==="right"?(a={x:e+o,y:i},l={x:a.x,y:r}):(a={x:e,y:i+o},l={x:s,y:a.y}),{separatorStart:a,separatorEnd:l}}function bx(n,t){let{width:e,height:i,options:s}=n,r=s.callout.margin+s.borderWidth/2;return t==="right"?e+r:t==="bottom"?i+r:-r}function vx(n,t,e){let{y:i,width:s,height:r,options:o}=n,a=o.callout.start,l=_x(t,o.callout),c,h;return t==="left"||t==="right"?(c={x:e.x,y:i+Dn(r,a)},h={x:c.x+l,y:c.y}):(c={x:e.x+Dn(s,a),y:e.y},h={x:c.x,y:c.y+l}),{sideStart:c,sideEnd:h}}function _x(n,t){let e=t.side;return n==="left"||n==="top"?-e:e}function yx(n,t){let e=t.position;return Cf.includes(e)?e:xx(n,t)}function xx(n,t){let{x:e,y:i,x2:s,y2:r,width:o,height:a,pointX:l,pointY:c,centerX:h,centerY:f,rotation:g}=n,p={x:h,y:f},m=t.start,y=Dn(o,m),S=Dn(a,m),M=[e,e+y,e+y,s],C=[i+S,r,i,r],F=[];for(let D=0;D<4;D++){let I=si({x:M[D],y:C[D]},p,Wt(g));F.push({position:Cf[D],distance:Ke(I,{x:l,y:c})})}return F.sort((D,I)=>D.distance-I.distance)[0].position}function wx({x:n,y:t,width:e,height:i,options:s}){let r=s.borderWidth/2,o=Vt(s.padding);return{x:n+o.left+r,y:t+o.top+r,width:e-o.left-o.right-s.borderWidth,height:i-o.top-o.bottom-s.borderWidth}}function kx(n,t,e){let{pointX:i,pointY:s}=n,r=t.margin,o=i,a=s;return e==="left"?o+=r:e==="right"?o-=r:e==="top"?a+=r:e==="bottom"&&(a-=r),n.inRange(o,a)}var al=(n,t,e)=>({x:n.x+e*(t.x-n.x),y:n.y+e*(t.y-n.y)}),ll=(n,t,e)=>al(t,e,Math.abs((n-t.y)/(e.y-t.y))).x,Tf=(n,t,e)=>al(t,e,Math.abs((n-t.x)/(e.x-t.x))).y,Ts=n=>n*n,Sx=(n,t,{x:e,y:i,x2:s,y2:r},o)=>o==="y"?{start:Math.min(i,r),end:Math.max(i,r),value:t}:{start:Math.min(e,s),end:Math.max(e,s),value:n},Df=(n,t,e,i)=>(1-i)*(1-i)*n+2*(1-i)*i*t+i*i*e,cl=(n,t,e,i)=>({x:Df(n.x,t.x,e.x,i),y:Df(n.y,t.y,e.y,i)}),Ef=(n,t,e,i)=>2*(1-i)*(t-n)+2*i*(e-t),Of=(n,t,e,i)=>-Math.atan2(Ef(n.x,t.x,e.x,i),Ef(n.y,t.y,e.y,i))+.5*gt,Fi=class extends qt{inRange(t,e,i,s){let r=this.options.borderWidth/2;if(i!=="x"&&i!=="y"){let o={mouseX:t,mouseY:e},{path:a,ctx:l}=this;if(a){En(l,this.options);let{chart:h}=this.$context,f=t*h.currentDevicePixelRatio,g=e*h.currentDevicePixelRatio,p=l.isPointInStroke(a,f,g)||hl(this,o,s);return l.restore(),p}let c=Ts(r);return Tx(this,o,c,s)||hl(this,o,s)}return Mx(this,{mouseX:t,mouseY:e},i,{hBorderWidth:r,useFinalPosition:s})}getCenterPoint(t){return Oi(this,t)}draw(t){let{x:e,y:i,x2:s,y2:r,cp:o,options:a}=this;if(t.save(),!En(t,a))return t.restore();Ai(t,a);let l=Math.sqrt(Math.pow(s-e,2)+Math.pow(r-i,2));if(a.curve&&o)return Ix(t,this,o,l),t.restore();let{startOpts:c,endOpts:h,startAdjust:f,endAdjust:g}=If(this),p=Math.atan2(r-i,s-e);t.translate(e,i),t.rotate(p),t.beginPath(),t.moveTo(0+f,0),t.lineTo(l-g,0),t.shadowColor=a.borderShadowColor,t.stroke(),ul(t,0,f,c),ul(t,l,-g,h),t.restore()}get label(){return this.elements&&this.elements[0]}resolveElementProperties(t,e){let i=Ky(t,e),{x:s,y:r,x2:o,y2:a}=i,l=Cx(i,t.chartArea),c=l?Px({x:s,y:r},{x:o,y:a},t.chartArea):{x:s,y:r,x2:o,y2:a,width:Math.abs(o-s),height:Math.abs(a-r)};if(c.centerX=(o+s)/2,c.centerY=(a+r)/2,c.initProperties=Ps(t,c,e),e.curve){let f={x:c.x,y:c.y},g={x:c.x2,y:c.y2};c.cp=Fx(c,e,Ke(f,g))}let h=Dx(t,c,e.label);return h._visible=l,c.elements=[{type:"label",optionScope:"label",properties:h,initProperties:c.initProperties}],c}};Fi.id="lineAnnotation";var Af={backgroundColor:void 0,backgroundShadowColor:void 0,borderColor:void 0,borderDash:void 0,borderDashOffset:void 0,borderShadowColor:void 0,borderWidth:void 0,display:void 0,fill:void 0,length:void 0,shadowBlur:void 0,shadowOffsetX:void 0,shadowOffsetY:void 0,width:void 0};Fi.defaults={adjustScaleRange:!0,arrowHeads:{display:!1,end:Object.assign({},Af),fill:!1,length:12,start:Object.assign({},Af),width:6},borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:2,curve:!1,controlPoint:{y:"-50%"},display:!0,endValue:void 0,init:void 0,label:{backgroundColor:"rgba(0,0,0,0.8)",backgroundShadowColor:"transparent",borderCapStyle:"butt",borderColor:"black",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderRadius:6,borderShadowColor:"transparent",borderWidth:0,callout:Object.assign({},Li.defaults.callout),color:"#fff",content:null,display:!1,drawTime:void 0,font:{family:void 0,lineHeight:void 0,size:void 0,style:void 0,weight:"bold"},height:void 0,opacity:void 0,padding:6,position:"center",rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,textAlign:"center",textStrokeColor:void 0,textStrokeWidth:0,width:void 0,xAdjust:0,yAdjust:0,z:void 0},scaleID:void 0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,value:void 0,xMax:void 0,xMin:void 0,xScaleID:void 0,yMax:void 0,yMin:void 0,yScaleID:void 0,z:0};Fi.descriptors={arrowHeads:{start:{_fallback:!0},end:{_fallback:!0},_fallback:!0}};Fi.defaultRoutes={borderColor:"color"};function Mx(n,{mouseX:t,mouseY:e},i,{hBorderWidth:s,useFinalPosition:r}){let o=Sx(t,e,n.getProps(["x","y","x2","y2"],r),i);return o.value>=o.start-s&&o.value<=o.end+s||hl(n,{mouseX:t,mouseY:e},r,i)}function Cx({x:n,y:t,x2:e,y2:i},{top:s,right:r,bottom:o,left:a}){return!(nr&&e>r||to&&i>o)}function Rf({x:n,y:t},e,{top:i,right:s,bottom:r,left:o}){return ns&&(t=Tf(s,{x:n,y:t},e),n=s),tr&&(n=ll(r,{x:n,y:t},e),t=r),{x:n,y:t}}function Px(n,t,e){let{x:i,y:s}=Rf(n,t,e),{x:r,y:o}=Rf(t,n,e);return{x:i,y:s,x2:r,y2:o,width:Math.abs(r-i),height:Math.abs(o-s)}}function Tx(n,{mouseX:t,mouseY:e},i=ni,s){let{x:r,y:o,x2:a,y2:l}=n.getProps(["x","y","x2","y2"],s),c=a-r,h=l-o,f=Ts(c)+Ts(h),g=f===0?-1:((t-r)*c+(e-o)*h)/f,p,m;return g<0?(p=r,m=o):g>1?(p=a,m=l):(p=r+g*c,m=o+g*h),Ts(t-p)+Ts(e-m)<=i}function hl(n,{mouseX:t,mouseY:e},i,s){let r=n.label;return r.options.display&&r.inRange(t,e,s,i)}function Dx(n,t,e){let i=e.borderWidth,s=Vt(e.padding),r=il(n.ctx,e),o=r.width+s.width+i,a=r.height+s.height+i;return Ox(t,e,{width:o,height:a,padding:s},n.chartArea)}function Ex(n){let{x:t,y:e,x2:i,y2:s}=n,r=Math.atan2(s-e,i-t);return r>gt/2?r-gt:r0&&(s.w/2+r.left-i.x)/o,c=a>0&&(s.h/2+r.top-i.y)/a;return Ur(Math.max(l,c),0,.25)}function Lx(n,t){let{x:e,x2:i,y:s,y2:r}=n,o=Math.min(s,r)-t.top,a=Math.min(e,i)-t.left,l=t.bottom-Math.max(s,r),c=t.right-Math.max(e,i);return{x:Math.min(a,c),y:Math.min(o,l),dx:a<=c?1:-1,dy:o<=l?1:-1}}function Ff(n,t){let{size:e,min:i,max:s,padding:r}=t,o=e/2;return e>s-i?(s+i)/2:(i>=n-r-o&&(n=i+r+o),s<=n+r+o&&(n=s-r-o),n)}function If(n){let t=n.options,e=t.arrowHeads&&t.arrowHeads.start,i=t.arrowHeads&&t.arrowHeads.end;return{startOpts:e,endOpts:i,startAdjust:$f(n,e),endAdjust:$f(n,i)}}function $f(n,t){if(!t||!t.display)return 0;let{length:e,width:i}=t,s=n.options.borderWidth/2,r={x:e,y:i+s};return Math.abs(ll(0,r,{x:0,y:s}))}function ul(n,t,e,i){if(!i||!i.display)return;let{length:s,width:r,fill:o,backgroundColor:a,borderColor:l}=i,c=Math.abs(t-s)+e;n.beginPath(),Ai(n,i),En(n,i),n.moveTo(c,-r),n.lineTo(t+e,0),n.lineTo(c,r),o===!0?(n.fillStyle=a||l,n.closePath(),n.fill(),n.shadowColor="transparent"):n.shadowColor=i.borderShadowColor,n.stroke()}function Fx(n,t,e){let{x:i,y:s,x2:r,y2:o,centerX:a,centerY:l}=n,c=Math.atan2(o-s,r-i),h=tl(t.controlPoint,0),f={x:a+Dn(e,h.x,!1),y:l+Dn(e,h.y,!1)};return si(f,{x:a,y:l},c)}function jf(n,{x:t,y:e},{angle:i,adjust:s},r){!r||!r.display||(n.save(),n.translate(t,e),n.rotate(i),ul(n,0,-s,r),n.restore())}function Ix(n,t,e,i){let{x:s,y:r,x2:o,y2:a,options:l}=t,{startOpts:c,endOpts:h,startAdjust:f,endAdjust:g}=If(t),p={x:s,y:r},m={x:o,y:a},y=Of(p,e,m,0),S=Of(p,e,m,1)-gt,M=cl(p,e,m,f/i),C=cl(p,e,m,1-g/i),F=new Path2D;n.beginPath(),F.moveTo(M.x,M.y),F.quadraticCurveTo(e.x,e.y,C.x,C.y),n.shadowColor=l.borderShadowColor,n.stroke(F),t.path=F,t.ctx=n,jf(n,M,{angle:y,adjust:f},c),jf(n,C,{angle:S,adjust:g},h)}var Ii=class extends qt{inRange(t,e,i,s){let r=this.options.rotation,o=this.options.borderWidth;if(i!=="x"&&i!=="y")return $x({x:t,y:e},this.getProps(["width","height","centerX","centerY"],s),r,o);let{x:a,y:l,x2:c,y2:h}=this.getProps(["x","y","x2","y2"],s),f=o/2,g=i==="y"?{start:l,end:h}:{start:a,end:c},p=si({x:t,y:e},this.getCenterPoint(s),Wt(-r));return p[i]>=g.start-f-ni&&p[i]<=g.end+f+ni}getCenterPoint(t){return Oi(this,t)}draw(t){let{width:e,height:i,centerX:s,centerY:r,options:o}=this;t.save(),nl(t,this.getCenterPoint(),o.rotation),Ai(t,this.options),t.beginPath(),t.fillStyle=o.backgroundColor;let a=En(t,o);t.ellipse(s,r,i/2,e/2,gt/2,0,2*gt),t.fill(),a&&(t.shadowColor=o.borderShadowColor,t.stroke()),t.restore()}get label(){return this.elements&&this.elements[0]}resolveElementProperties(t,e){return vf(t,e,!0)}};Ii.id="ellipseAnnotation";Ii.defaults={adjustScaleRange:!0,backgroundShadowColor:"transparent",borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:1,display:!0,init:void 0,label:Object.assign({},ri.defaults.label),rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,xMax:void 0,xMin:void 0,xScaleID:void 0,yMax:void 0,yMin:void 0,yScaleID:void 0,z:0};Ii.defaultRoutes={borderColor:"color",backgroundColor:"color"};Ii.descriptors={label:{_fallback:!0}};function $x(n,t,e,i){let{width:s,height:r,centerX:o,centerY:a}=t,l=s/2,c=r/2;if(l<=0||c<=0)return!1;let h=Wt(e||0),f=i/2||0,g=Math.cos(h),p=Math.sin(h),m=Math.pow(g*(n.x-o)+p*(n.y-a),2),y=Math.pow(p*(n.x-o)-g*(n.y-a),2);return m/Math.pow(l+f,2)+y/Math.pow(c+f,2)<=1.0001}var Ds=class extends qt{inRange(t,e,i,s){let{x:r,y:o,x2:a,y2:l,width:c}=this.getProps(["x","y","x2","y2","width"],s),h=this.options.borderWidth;if(i!=="x"&&i!=="y")return Iy({x:t,y:e},this.getCenterPoint(s),c/2,h);let f=h/2,g=i==="y"?{start:o,end:l,value:e}:{start:r,end:a,value:t};return g.value>=g.start-f&&g.value<=g.end+f}getCenterPoint(t){return Oi(this,t)}draw(t){let e=this.options,i=e.borderWidth;if(e.radius<.1)return;t.save(),t.fillStyle=e.backgroundColor,Ai(t,e);let s=En(t,e);Vy(t,this,this.centerX,this.centerY),s&&!Kr(e.pointStyle)&&(t.shadowColor=e.borderShadowColor,t.stroke()),t.restore(),e.borderWidth=i}resolveElementProperties(t,e){let i=bf(t,e);return i.initProperties=Ps(t,i,e,!0),i}};Ds.id="pointAnnotation";Ds.defaults={adjustScaleRange:!0,backgroundShadowColor:"transparent",borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:1,display:!0,init:void 0,pointStyle:"circle",radius:10,rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,xAdjust:0,xMax:void 0,xMin:void 0,xScaleID:void 0,xValue:void 0,yAdjust:0,yMax:void 0,yMin:void 0,yScaleID:void 0,yValue:void 0,z:0};Ds.defaultRoutes={borderColor:"color",backgroundColor:"color"};var Es=class extends qt{inRange(t,e,i,s){if(i!=="x"&&i!=="y")return this.options.radius>=.1&&this.elements.length>1&&zx(this.elements,t,e,s);let r=si({x:t,y:e},this.getCenterPoint(s),Wt(-this.options.rotation)),o=this.elements.map(c=>i==="y"?c.bY:c.bX),a=Math.min(...o),l=Math.max(...o);return r[i]>=a&&r[i]<=l}getCenterPoint(t){return Oi(this,t)}draw(t){let{elements:e,options:i}=this;t.save(),t.beginPath(),t.fillStyle=i.backgroundColor,Ai(t,i);let s=En(t,i),r=!0;for(let o of e)r?(t.moveTo(o.x,o.y),r=!1):t.lineTo(o.x,o.y);t.closePath(),t.fill(),s&&(t.shadowColor=i.borderShadowColor,t.stroke()),t.restore()}resolveElementProperties(t,e){let i=bf(t,e),{sides:s,rotation:r}=e,o=[],a=2*gt/s,l=r*Xi;for(let c=0;ce!=r.bY>e&&t<(r.bX-a.bX)*(e-a.bY)/(r.bY-a.bY)+a.bX&&(s=!s),r=a}return s}var On={box:ri,ellipse:Ii,label:Li,line:Fi,point:Ds,polygon:Es};Object.keys(On).forEach(n=>{ft.describe(`elements.${On[n].id}`,{_fallback:"plugins.annotation.common"})});var Bx={update:Object.assign},Nx=ol.concat(Zr),zf=(n,t)=>at(t)?pl(n,t):n,fl=n=>n==="color"||n==="font";function dl(n="line"){return On[n]?n:(console.warn(`Unknown annotation type: '${n}', defaulting to 'line'`),"line")}function Hx(n,t,e,i){let s=Vx(n,e.animations,i),r=t.annotations,o=qx(t.elements,r);for(let a=0;azf(o,s)):e[i]=zf(r,s)}return e}function Xx(n,t,e){return t.$context||(t.$context=Object.assign(Object.create(n.getContext()),{element:t,id:e.id,type:"annotation"}))}function qx(n,t){let e=t.length,i=n.length;if(ie&&n.splice(e,i-e);return n}var Gx="2.2.1",An=new Map,Ux=ol.concat(Zr),Hf={id:"annotation",version:Gx,beforeRegister(){$y("chart.js","3.7",se.version)},afterRegister(){se.register(On)},afterUnregister(){se.unregister(On)},beforeInit(n){An.set(n,{annotations:[],elements:[],visibleElements:[],listeners:{},listened:!1,moveListened:!1,hooks:{},hooked:!1,hovered:[]})},beforeUpdate(n,t,e){let i=An.get(n),s=i.annotations=[],r=e.annotations;at(r)?Object.keys(r).forEach(o=>{let a=r[o];at(a)&&(a.id=o,s.push(a))}):pt(r)&&s.push(...r),cx(s,n.scales)},afterDataLimits(n,t){let e=An.get(n);lx(n,t.scale,e.annotations.filter(i=>i.display&&i.adjustScaleRange))},afterUpdate(n,t,e){let i=An.get(n);ix(n,i,e),Hx(n,i,e,t.mode),i.visibleElements=i.elements.filter(s=>!s.skip&&s.options.display),ax(n,i,e)},beforeDatasetsDraw(n,t,e){Jr(n,"beforeDatasetsDraw",e.clip)},afterDatasetsDraw(n,t,e){Jr(n,"afterDatasetsDraw",e.clip)},beforeDraw(n,t,e){Jr(n,"beforeDraw",e.clip)},afterDraw(n,t,e){Jr(n,"afterDraw",e.clip)},beforeEvent(n,t,e){let i=An.get(n);sx(i,t.event,e)&&(t.changed=!0)},afterDestroy(n){An.delete(n)},_getState(n){return An.get(n)},defaults:{animations:{numbers:{properties:["x","y","x2","y2","width","height","centerX","centerY","pointX","pointY","radius"],type:"number"}},clip:!0,interaction:{mode:void 0,axis:void 0,intersect:void 0},common:{drawTime:"afterDatasetsDraw",init:!1,label:{}}},descriptors:{_indexable:!1,_scriptable:n=>!Ux.includes(n)&&n!=="init",annotations:{_allKeys:!1,_fallback:(n,t)=>`elements.${On[dl(t.type)].id}`},interaction:{_fallback:!0},common:{label:{_indexable:fl,_fallback:!0},_indexable:fl}},additionalOptionScopes:[""]};function Jr(n,t,e){let{ctx:i,chartArea:s}=n,r=An.get(n);e&&xn(i,s);let o=Kx(r.visibleElements,t).sort((a,l)=>a.element.options.z-l.element.options.z);for(let a of o)Zx(i,s,r,a);e&&wn(i)}function Kx(n,t){let e=[];for(let i of n)if(i.options.drawTime===t&&e.push({element:i,main:!0}),i.elements&&i.elements.length)for(let s of i.elements)s.options.display&&s.options.drawTime===t&&e.push({element:s});return e}function Zx(n,t,e,i){let s=i.element;i.main?(kf(e,s,"beforeDraw"),s.draw(n,t),kf(e,s,"afterDraw")):s.draw(n,t)}se.register(...Xu,Hf,Ti,Cs);var to=class{constructor(t){this.plugin=t}async datasetPrep(t,e,i=!1){var h,f,g;let s=[];if(!t.id){let p=[];if(this.plugin.settings.themeable||i){let m=1;for(;;){let y=getComputedStyle(e).getPropertyValue(`--chart-color-${m}`);if(y)p.push(y),m++;else break}}for(let m=0;t.series.length>m;m++){let c=t.series[m],{title:y}=c,S=qc(c,["title"]),M=Nn({label:y!=null?y:"",backgroundColor:t.labelColors?p.length?ln(p,t.transparency):ln(this.plugin.settings.colors,t.transparency):p.length?ln(p,t.transparency)[m]:ln(this.plugin.settings.colors,t.transparency)[m],borderColor:t.labelColors?p.length?p:this.plugin.settings.colors:p.length?p[m]:this.plugin.settings.colors[m],borderWidth:1,fill:t.fill?t.stacked?m==0?"origin":"-1":!0:!1,tension:(h=t.tension)!=null?h:0},S);t.type==="sankey"&&(M.colorFrom&&(M.colorFrom=C=>{var F,D;return(D=(F=t.series[m].colorFrom[C.dataset.data[C.dataIndex].from])!=null?F:p[m])!=null?D:"green"}),M.colorTo&&(M.colorTo=C=>{var F,D;return(D=(F=t.series[m].colorTo[C.dataset.data[C.dataIndex].to])!=null?F:p[m])!=null?D:"green"})),s.push(M)}}let r=t.time?{type:"time",time:{unit:t.time}}:null,o=t.labels,a=getComputedStyle(e).getPropertyValue("--background-modifier-border"),l;return se.defaults.color=t.textColor||getComputedStyle(e).getPropertyValue("--text-muted"),se.defaults.font.family=getComputedStyle(e).getPropertyValue("--mermaid-font"),se.defaults.plugins=_i(Nn({},se.defaults.plugins),{legend:_i(Nn({},se.defaults.plugins.legend),{display:(f=t.legend)!=null?f:!0,position:(g=t.legendPosition)!=null?g:"top"})}),se.defaults.layout.padding=t.padding,t.type=="radar"||t.type=="polarArea"?l={type:t.type,data:{labels:o,datasets:s},options:{animation:{duration:0},scales:{r:_i(Nn({},r),{grid:{color:a},beginAtZero:t.beginAtZero,max:t.rMax,min:t.rMin,ticks:{backdropColor:a}})}}}:t.type=="bar"||t.type=="line"?l={type:t.type,data:{labels:o,datasets:s},options:{animation:{duration:0},indexAxis:t.indexAxis,spanGaps:t.spanGaps,scales:{y:{min:t.yMin,max:t.yMax,reverse:t.yReverse,ticks:{display:t.yTickDisplay,padding:t.yTickPadding},display:t.yDisplay,stacked:t.stacked,beginAtZero:t.beginAtZero,grid:{color:a},title:{display:t.yTitle,text:t.yTitle}},x:_i(Nn({},r),{min:t.xMin,max:t.xMax,reverse:t.xReverse,ticks:{display:t.xTickDisplay,padding:t.xTickPadding},display:t.xDisplay,stacked:t.stacked,grid:{color:a},title:{display:t.xTitle,text:t.xTitle}})}}}:t.type==="sankey"?(s=s.map(p=>_i(Nn({},p),{data:p.data.map(m=>Array.isArray(m)&&m.length===3?{from:m[0],flow:m[1],to:m[2]}:m)})),l={type:t.type,data:{labels:o,datasets:s},options:{animation:{duration:0}}}):l={type:t.type,data:{labels:o,datasets:s},options:{animation:{duration:0},spanGaps:t.spanGaps}},{chartOptions:l,width:t.width}}async imageRenderer(t,e){let i=l=>new Promise(c=>setTimeout(c,l)),s=document.createElement("canvas"),r=s.getContext("2d"),o=await this.datasetPrep(await(0,Qr.parseYaml)(t.replace("```chart","").replace("```","").replace(/\t/g," ")),document.body);new se(r,o.chartOptions),document.body.append(s),await i(250);let a=s.toDataURL(e.format,e.quality);return document.body.removeChild(s),a.substring(a.indexOf(",")+1)}renderRaw(t,e){var s;let i=e.createEl("canvas");if(t.chartOptions)try{let r=new se(i.getContext("2d"),t.chartOptions);return i.parentElement.style.width=(s=t.width)!=null?s:"100%",i.parentElement.style.margin="auto",r}catch(r){return cn(r,e),null}else try{return new se(i.getContext("2d"),t)}catch(r){return cn(r,e),null}}async renderFromYaml(t,e,i){this.plugin.app.workspace.onLayoutReady(()=>i.addChild(new Wf(t,e,this,i.sourcePath)))}},Wf=class extends Qr.MarkdownRenderChild{constructor(t,e,i,s){super(e);this.el=e,this.data=t,this.renderer=i,this.ownPath=s,this.changeHandler=this.changeHandler.bind(this),this.reload=this.reload.bind(this)}async onload(){var t,e,i,s;try{let r=await this.renderer.datasetPrep(this.data,this.el),o={};if(this.data.id){let a=[];if(this.renderer.plugin.settings.themeable){let g=1;for(;;){let p=getComputedStyle(this.el).getPropertyValue(`--chart-color-${g}`);if(p)a.push(p),g++;else break}}o.datasets=[];let l;this.data.file&&(l=this.renderer.plugin.app.metadataCache.getFirstLinkpathDest(this.data.file,this.renderer.plugin.app.workspace.getActiveFile().path));let c=(t=this.renderer.plugin.app.metadataCache.getFileCache(l!=null?l:this.renderer.plugin.app.vault.getAbstractFileByPath(this.ownPath)).sections.find(g=>g.id===this.data.id))==null?void 0:t.position;if(!c)throw"Invalid id and/or file";let h=(await this.renderer.plugin.app.vault.cachedRead(this.data.file?l:this.renderer.plugin.app.vault.getAbstractFileByPath(this.ownPath))).substring(c.start.offset,c.end.offset),f;try{f=Za(h,(e=this.data.layout)!=null?e:"columns",this.data.select)}catch(g){throw"There is no table at that id and/or file"}o.labels=f.labels;for(let g=0;f.dataFields.length>g;g++)o.datasets.push({label:(i=f.dataFields[g].dataTitle)!=null?i:"",data:f.dataFields[g].data,backgroundColor:this.data.labelColors?a.length?ln(a,this.data.transparency):ln(this.renderer.plugin.settings.colors,this.data.transparency):a.length?ln(a,this.data.transparency)[g]:ln(this.renderer.plugin.settings.colors,this.data.transparency)[g],borderColor:this.data.labelColors?a.length?a:this.renderer.plugin.settings.colors:a.length?a[g]:this.renderer.plugin.settings.colors[g],borderWidth:1,fill:this.data.fill?this.data.stacked?g==0?"origin":"-1":!0:!1,tension:(s=this.data.tension)!=null?s:0});r.chartOptions.data.labels=o.labels,r.chartOptions.data.datasets=o.datasets}this.chart=this.renderer.renderRaw(r,this.containerEl)}catch(r){cn(r,this.el)}this.data.id&&this.renderer.plugin.app.metadataCache.on("changed",this.changeHandler),this.renderer.plugin.app.workspace.on("css-change",this.reload)}changeHandler(t){(this.data.file?t.basename===this.data.file:t.path===this.ownPath)&&this.reload()}reload(){this.onunload(),this.onload()}onunload(){this.renderer.plugin.app.metadataCache.off("changed",this.changeHandler),this.renderer.plugin.app.workspace.off("css-change",this.reload),this.el.empty(),this.chart&&this.chart.destroy(),this.chart=null}};var eo={colors:["rgba(255, 99, 132, 1)","rgba(54, 162, 235, 1)","rgba(255, 206, 86, 1)","rgba(75, 192, 192, 1)","rgba(153, 102, 255, 1)","rgba(255, 159, 64, 1)"],contextMenu:!0,imageSettings:{format:"image/png",quality:.92},themeable:!1};var Ye=ze(require("obsidian"));var gl=function(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")},ml=function(){function n(t,e){for(var i=0;i1&&arguments[1]!==void 0?arguments[1]:1,e=t>0?n.toFixed(t).replace(/0+$/,"").replace(/\.$/,""):n.toString();return e||"0"}var Qx=function(){function n(t,e,i,s){gl(this,n);var r=this;function o(l){if(l.startsWith("hsl")){var c=l.match(/([\-\d\.e]+)/g).map(Number),h=no(c,4),f=h[0],g=h[1],p=h[2],m=h[3];m===void 0&&(m=1),f/=360,g/=100,p/=100,r.hsla=[f,g,p,m]}else if(l.startsWith("rgb")){var y=l.match(/([\-\d\.e]+)/g).map(Number),S=no(y,4),M=S[0],C=S[1],F=S[2],D=S[3];D===void 0&&(D=1),r.rgba=[M,C,F,D]}else l.startsWith("#")?r.rgba=n.hexToRgb(l):r.rgba=n.nameToRgb(l)||n.hexToRgb(l)}if(t!==void 0)if(Array.isArray(t))this.rgba=t;else if(i===void 0){var a=t&&""+t;a&&o(a.toLowerCase())}else this.rgba=[t,e,i,s===void 0?1:s]}return ml(n,[{key:"printRGB",value:function(e){var i=e?this.rgba:this.rgba.slice(0,3),s=i.map(function(r,o){return Vf(r,o===3?3:0)});return e?"rgba("+s+")":"rgb("+s+")"}},{key:"printHSL",value:function(e){var i=[360,100,100,1],s=["","%","%",""],r=e?this.hsla:this.hsla.slice(0,3),o=r.map(function(a,l){return Vf(a*i[l],l===3?3:1)+s[l]});return e?"hsla("+o+")":"hsl("+o+")"}},{key:"printHex",value:function(e){var i=this.hex;return e?i:i.substring(0,7)}},{key:"rgba",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error("No color is set");return this._rgba=n.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:"rgbString",get:function(){return this.printRGB()}},{key:"rgbaString",get:function(){return this.printRGB(!0)}},{key:"hsla",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error("No color is set");return this._hsla=n.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:"hslString",get:function(){return this.printHSL()}},{key:"hslaString",get:function(){return this.printHSL(!0)}},{key:"hex",get:function(){var e=this.rgba,i=e.map(function(s,r){return r<3?s.toString(16):Math.round(s*255).toString(16)});return"#"+i.map(function(s){return s.padStart(2,"0")}).join("")},set:function(e){this.rgba=n.hexToRgb(e)}}],[{key:"hexToRgb",value:function(e){var i=(e.startsWith("#")?e.slice(1):e).replace(/^(\w{3})$/,"$1F").replace(/^(\w)(\w)(\w)(\w)$/,"$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/,"$1FF");if(!i.match(/^([0-9a-fA-F]{8})$/))throw new Error("Unknown hex color; "+e);var s=i.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function(r){return parseInt(r,16)});return s[3]=s[3]/255,s}},{key:"nameToRgb",value:function(e){var i=e.toLowerCase().replace("at","T").replace(/[aeiouyldf]/g,"").replace("ght","L").replace("rk","D").slice(-5,4),s=Jx[i];return s===void 0?s:n.hexToRgb(s.replace(/\-/g,"00").padStart(6,"f"))}},{key:"rgbToHsl",value:function(e){var i=no(e,4),s=i[0],r=i[1],o=i[2],a=i[3];s/=255,r/=255,o/=255;var l=Math.max(s,r,o),c=Math.min(s,r,o),h=void 0,f=void 0,g=(l+c)/2;if(l===c)h=f=0;else{var p=l-c;switch(f=g>.5?p/(2-l-c):p/(l+c),l){case s:h=(r-o)/p+(r1&&(C-=1),C<1/6?S+(M-S)*6*C:C<1/2?M:C<2/3?S+(M-S)*(2/3-C)*6:S},g=o<.5?o*(1+r):o+r-o*r,p=2*o-g;l=f(p,g,s+1/3),c=f(p,g,s),h=f(p,g,s-1/3)}var m=[l*255,c*255,h*255].map(Math.round);return m[3]=a,m}}]),n}(),t1=function(){function n(){gl(this,n),this._events=[]}return ml(n,[{key:"add",value:function(e,i,s){e.addEventListener(i,s,!1),this._events.push({target:e,type:i,handler:s})}},{key:"remove",value:function(e,i,s){this._events=this._events.filter(function(r){var o=!0;return e&&e!==r.target&&(o=!1),i&&i!==r.type&&(o=!1),s&&s!==r.handler&&(o=!1),o&&n._doRemove(r.target,r.type,r.handler),!o})}},{key:"destroy",value:function(){this._events.forEach(function(e){return n._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:"_doRemove",value:function(e,i,s){e.removeEventListener(i,s,!1)}}]),n}();function e1(n){var t=document.createElement("div");return t.innerHTML=n,t.firstElementChild}function bl(n,t,e){var i=!1;function s(l,c,h){return Math.max(c,Math.min(l,h))}function r(l,c,h){if(h&&(i=!0),!!i){l.preventDefault();var f=t.getBoundingClientRect(),g=f.width,p=f.height,m=c.clientX,y=c.clientY,S=s(m-f.left,0,g),M=s(y-f.top,0,p);e(S/g,M/p)}}function o(l,c){var h=l.buttons===void 0?l.which:l.buttons;h===1?r(l,l,c):i=!1}function a(l,c){l.touches.length===1?r(l,l.touches[0],c):i=!1}n.add(t,"mousedown",function(l){o(l,!0)}),n.add(t,"touchstart",function(l){a(l,!0)}),n.add(window,"mousemove",o),n.add(t,"touchmove",a),n.add(window,"mouseup",function(l){i=!1}),n.add(t,"touchend",function(l){i=!1}),n.add(t,"touchcancel",function(l){i=!1})}var n1=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em, + linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em / 2em 2em`,i1=360,Yf="keydown",io="mousedown",vl="focusin";function Ve(n,t){return(t||document).querySelector(n)}function Xf(n){n.preventDefault(),n.stopPropagation()}function _l(n,t,e,i,s){n.add(t,Yf,function(r){e.indexOf(r.key)>=0&&(s&&Xf(r),i(r))})}var yl=function(){function n(t){gl(this,n),this.settings={popup:"right",layout:"default",alpha:!0,editor:!0,editorFormat:"hex",cancelButton:!1,defaultColor:"#0cf"},this._events=new t1,this.onChange=null,this.onDone=null,this.onOpen=null,this.onClose=null,this.setOptions(t)}return ml(n,[{key:"setOptions",value:function(e){var i=this;if(!e)return;var s=this.settings;function r(c,h,f){for(var g in c)f&&f.indexOf(g)>=0||(h[g]=c[g])}if(e instanceof HTMLElement)s.parent=e;else{s.parent&&e.parent&&s.parent!==e.parent&&(this._events.remove(s.parent),this._popupInited=!1),r(e,s),e.onChange&&(this.onChange=e.onChange),e.onDone&&(this.onDone=e.onDone),e.onOpen&&(this.onOpen=e.onOpen),e.onClose&&(this.onClose=e.onClose);var o=e.color||e.colour;o&&this._setColor(o)}var a=s.parent;if(a&&s.popup&&!this._popupInited){var l=function(h){return i.openHandler(h)};this._events.add(a,"click",l),_l(this._events,a,[" ","Spacebar","Enter"],l),this._popupInited=!0}else e.parent&&!s.popup&&this.show()}},{key:"openHandler",value:function(e){if(this.show()){e&&e.preventDefault(),this.settings.parent.style.pointerEvents="none";var i=e&&e.type===Yf?this._domEdit:this.domElement;setTimeout(function(){return i.focus()},100),this.onOpen&&this.onOpen(this.colour)}}},{key:"closeHandler",value:function(e){var i=e&&e.type,s=!1;if(!e)s=!0;else if(i===io||i===vl){var r=(this.__containedEvent||0)+100;e.timeStamp>r&&(s=!0)}else Xf(e),s=!0;s&&this.hide()&&(this.settings.parent.style.pointerEvents="",i!==io&&this.settings.parent.focus(),this.onClose&&this.onClose(this.colour))}},{key:"movePopup",value:function(e,i){this.closeHandler(),this.setOptions(e),i&&this.openHandler()}},{key:"setColor",value:function(e,i){this._setColor(e,{silent:i})}},{key:"_setColor",value:function(e,i){if(typeof e=="string"&&(e=e.trim()),!!e){i=i||{};var s=void 0;try{s=new Qx(e)}catch(o){if(i.failSilently)return;throw o}if(!this.settings.alpha){var r=s.hsla;r[3]=1,s.hsla=r}this.colour=this.color=s,this._setHSLA(null,null,null,null,i)}}},{key:"setColour",value:function(e,i){this.setColor(e,i)}},{key:"show",value:function(){var e=this.settings.parent;if(!e)return!1;if(this.domElement){var i=this._toggleDOM(!0);return this._setPosition(),i}var s=this.settings.template||'
    ',r=e1(s);return this.domElement=r,this._domH=Ve(".picker_hue",r),this._domSL=Ve(".picker_sl",r),this._domA=Ve(".picker_alpha",r),this._domEdit=Ve(".picker_editor input",r),this._domSample=Ve(".picker_sample",r),this._domOkay=Ve(".picker_done button",r),this._domCancel=Ve(".picker_cancel button",r),r.classList.add("layout_"+this.settings.layout),this.settings.alpha||r.classList.add("no_alpha"),this.settings.editor||r.classList.add("no_editor"),this.settings.cancelButton||r.classList.add("no_cancel"),this._ifPopup(function(){return r.classList.add("popup")}),this._setPosition(),this.colour?this._updateUI():this._setColor(this.settings.defaultColor),this._bindEvents(),!0}},{key:"hide",value:function(){return this._toggleDOM(!1)}},{key:"destroy",value:function(){this._events.destroy(),this.domElement&&this.settings.parent.removeChild(this.domElement)}},{key:"_bindEvents",value:function(){var e=this,i=this,s=this.domElement,r=this._events;function o(c,h,f){r.add(c,h,f)}o(s,"click",function(c){return c.preventDefault()}),bl(r,this._domH,function(c,h){return i._setHSLA(c)}),bl(r,this._domSL,function(c,h){return i._setHSLA(null,c,1-h)}),this.settings.alpha&&bl(r,this._domA,function(c,h){return i._setHSLA(null,null,null,1-h)});var a=this._domEdit;o(a,"input",function(c){i._setColor(this.value,{fromEditor:!0,failSilently:!0})}),o(a,"focus",function(c){var h=this;h.selectionStart===h.selectionEnd&&h.select()}),this._ifPopup(function(){var c=function(g){return e.closeHandler(g)};o(window,io,c),o(window,vl,c),_l(r,s,["Esc","Escape"],c);var h=function(g){e.__containedEvent=g.timeStamp};o(s,io,h),o(s,vl,h),o(e._domCancel,"click",c)});var l=function(h){e._ifPopup(function(){return e.closeHandler(h)}),e.onDone&&e.onDone(e.colour)};o(this._domOkay,"click",l),_l(r,s,["Enter"],l)}},{key:"_setPosition",value:function(){var e=this.settings.parent,i=this.domElement;e!==i.parentNode&&e.appendChild(i),this._ifPopup(function(s){getComputedStyle(e).position==="static"&&(e.style.position="relative");var r=s===!0?"popup_right":"popup_"+s;["popup_top","popup_bottom","popup_left","popup_right"].forEach(function(o){o===r?i.classList.add(o):i.classList.remove(o)}),i.classList.add(r)})}},{key:"_setHSLA",value:function(e,i,s,r,o){o=o||{};var a=this.colour,l=a.hsla;[e,i,s,r].forEach(function(c,h){(c||c===0)&&(l[h]=c)}),a.hsla=l,this._updateUI(o),this.onChange&&!o.silent&&this.onChange(a)}},{key:"_updateUI",value:function(e){if(!this.domElement)return;e=e||{};var i=this.colour,s=i.hsla,r="hsl("+s[0]*i1+", 100%, 50%)",o=i.hslString,a=i.hslaString,l=this._domH,c=this._domSL,h=this._domA,f=Ve(".picker_selector",l),g=Ve(".picker_selector",c),p=Ve(".picker_selector",h);function m($,N,G){N.style.left=G*100+"%"}function y($,N,G){N.style.top=G*100+"%"}m(l,f,s[0]),this._domSL.style.backgroundColor=this._domH.style.color=r,m(c,g,s[1]),y(c,g,1-s[2]),c.style.color=o,y(h,p,1-s[3]);var S=o,M=S.replace("hsl","hsla").replace(")",", 0)"),C="linear-gradient("+[S,M]+")";if(this._domA.style.background=C+", "+n1,!e.fromEditor){var F=this.settings.editorFormat,D=this.settings.alpha,I=void 0;switch(F){case"rgb":I=i.printRGB(D);break;case"hsl":I=i.printHSL(D);break;default:I=i.printHex(D)}this._domEdit.value=I}this._domSample.style.color=a}},{key:"_ifPopup",value:function(e,i){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):i&&i()}},{key:"_toggleDOM",value:function(e){var i=this.domElement;if(!i)return!1;var s=e?"":"none",r=i.style.display!==s;return r&&(i.style.display=s),r}}]),n}();so=document.createElement("style"),so.textContent='.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:"";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:"";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:"";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:"";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}',document.documentElement.firstElementChild.appendChild(so),yl.StyleElement=so;var so;var xl=class extends Ye.PluginSettingTab{constructor(t,e){super(t,e);this.plugin=e}isColor(t){var e=new Option().style;return e.color=t,e.color==t}display(){let{containerEl:t,plugin:e}=this;t.empty(),t.createEl("h2",{text:"Settings - Obsidian Charts"}),t.createEl("h3",{text:"General"}),new Ye.Setting(t).setName("Show Button in Context Menu").setDesc("If enabled, you will se a Button in your Editor Context Menu to open the Chart Creator.").addToggle(r=>{r.setValue(this.plugin.settings.contextMenu).onChange(async o=>{e.settings.contextMenu=o,await e.saveSettings()})}),new Ye.Setting(t).setName("Donate").setDesc("If you like this Plugin, consider donating to support continued development:").addButton(r=>{r.buttonEl.outerHTML='
    '}),t.createEl("h3",{text:"Colors",attr:{style:"margin-bottom: 0"}});let i=t.createEl("p",{cls:"setting-item-description"});i.append("Set the Colors for your Charts. This will set the border Color and the inner Color will be the same, but with less opacity. This ensures better compatibility with Dark and Light Mode. ","You can use any ",i.createEl("a",{href:"https://www.w3schools.com/cssref/css_colors.asp",text:"valid CSS Color."})),new Ye.Setting(t).setName("Enable Theme Colors").setDesc("If your Obsidian Theme (or snippet) provides Colors you can use them instead.").addToggle(r=>{r.setValue(e.settings.themeable).onChange(async o=>{e.settings.themeable=o,await e.saveSettings(),this.display()})}),e.settings.themeable||(e.settings.colors.forEach((r,o)=>{let a=document.createDocumentFragment();a.createSpan({text:"\u25CF",attr:{style:`color: ${r}`}}),a.appendText(` Color #${o+1}`),new Ye.Setting(t).setName(a).setDesc("This will be the border Color used in the Charts you create.").addButton(l=>{l.setButtonText("Change Color"),new yl({parent:l.buttonEl,onDone:async c=>{this.plugin.settings.colors[o]=c.hex,await this.plugin.saveSettings(),this.display()},popup:"left",color:r,alpha:!1})}).addExtraButton(l=>{l.setIcon("trash").setTooltip("Remove").onClick(async()=>{this.plugin.settings.colors.remove(r),await this.plugin.saveSettings(),this.display()}),this.plugin.settings.colors.length===1&&l.setDisabled(!0)}).addExtraButton(l=>{l.setIcon("reset").setTooltip("Reset to default").onClick(async()=>{var c;this.plugin.settings.colors[o]=(c=eo.colors[o])!=null?c:"#ffffff",await this.plugin.saveSettings(),this.display()})})}),new Ye.Setting(t).addButton(r=>{r.setButtonText("Add Color").onClick(async()=>{this.plugin.settings.colors.push("#ffffff"),await this.plugin.saveSettings(),this.display()})})),t.createEl("h3",{text:"Chart to Image Converter"});let s=t.createEl("details");s.createEl("summary",{text:"How to use"}),s.createEl("img",{attr:{src:"https://media.discordapp.net/attachments/855181471643861002/897811615037136966/charttoimage.gif"}}),new Ye.Setting(t).setName("Image Format").setDesc("The Format to be used, when generating a Image from a Chart.").addDropdown(r=>{r.addOptions({"image/jpeg":"jpeg","image/png":"png","image/webp":"webp"}),r.setValue(e.settings.imageSettings.format),r.onChange(async o=>{e.settings.imageSettings.format=o,await e.saveSettings()})}),new Ye.Setting(t).setName("Image Quality").setDesc("If using a lossy format, set the Image Quality.").addSlider(r=>{r.setDynamicTooltip().setLimits(.01,1,.01).setValue(e.settings.imageSettings.quality).onChange(async o=>{e.settings.imageSettings.quality=o,await e.saveSettings()})})}};var pd=ze(require("obsidian"));function wl(){}function s1(n,t){for(let e in t)n[e]=t[e];return n}function kl(n){return n()}function qf(){return Object.create(null)}function hn(n){n.forEach(kl)}function Gf(n){return typeof n=="function"}function ro(n,t){return n!=n?t==t:n!==t||n&&typeof n=="object"||typeof n=="function"}function Uf(n){return Object.keys(n).length===0}function Kf(n,t,e,i){if(n){let s=Zf(n,t,e,i);return n[0](s)}}function Zf(n,t,e,i){return n[1]&&i?s1(e.ctx.slice(),n[1](i(t))):e.ctx}function Jf(n,t,e,i){if(n[2]&&i){let s=n[2](i(e));if(t.dirty===void 0)return s;if(typeof s=="object"){let r=[],o=Math.max(t.dirty.length,s.length);for(let a=0;a32){let t=[],e=n.ctx.length/32;for(let i=0;in.removeEventListener(t,e,i)}function X(n,t,e){e==null?n.removeAttribute(t):n.getAttribute(t)!==e&&n.setAttribute(t,e)}function Ml(n){return n===""?null:+n}function c1(n){return Array.from(n.childNodes)}function id(n,t){t=""+t,n.wholeText!==t&&(n.data=t)}function de(n,t){n.value=t??""}function Gt(n,t,e,i){e===null?n.style.removeProperty(t):n.style.setProperty(t,e,i?"important":"")}function Cl(n,t){for(let e=0;e{let s=n.$$.callbacks[t];if(s){let r=h1(t,e,{cancelable:i});return s.slice().forEach(o=>{o.call(n,r)}),!r.defaultPrevented}return!0}}var Rs=[];var lo=[],co=[],rd=[],f1=Promise.resolve(),Tl=!1;function d1(){Tl||(Tl=!0,f1.then(od))}function Ls(n){co.push(n)}var Dl=new Set,ho=0;function od(){let n=Os;do{for(;ho{uo.delete(n),i&&(e&&n.d(1),i())}),n.o(t)}else i&&i()}var vw=typeof window!="undefined"?window:typeof globalThis!="undefined"?globalThis:global;var _w=new Set(["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"]);function ad(n){n&&n.c()}function El(n,t,e,i){let{fragment:s,on_mount:r,on_destroy:o,after_update:a}=n.$$;s&&s.m(t,e),i||Ls(()=>{let l=r.map(kl).filter(Gf);o?o.push(...l):hn(l),n.$$.on_mount=[]}),a.forEach(Ls)}function po(n,t){let e=n.$$;e.fragment!==null&&(hn(e.on_destroy),e.fragment&&e.fragment.d(t),e.on_destroy=e.fragment=null,e.ctx=[])}function m1(n,t){n.$$.dirty[0]===-1&&(Rs.push(n),d1(),n.$$.dirty.fill(0)),n.$$.dirty[t/31|0]|=1<{let m=p.length?p[0]:g;return c.ctx&&s(c.ctx[f],c.ctx[f]=m)&&(!c.skip_bound&&c.bound[f]&&c.bound[f](m),h&&m1(n,f)),g}):[],c.update(),h=!0,hn(c.before_update),c.fragment=i?i(c.ctx):!1,t.target){if(t.hydrate){r1();let f=c1(t.target);c.fragment&&c.fragment.l(f),f.forEach(Ie)}else c.fragment&&c.fragment.c();t.intro&&Fs(n.$$.fragment),El(n,t.target,t.anchor,t.customElement),o1(),od()}As(l)}var b1;typeof HTMLElement=="function"&&(b1=class extends HTMLElement{constructor(){super();this.attachShadow({mode:"open"})}connectedCallback(){let{on_mount:n}=this.$$;this.$$.on_disconnect=n.map(kl).filter(Gf);for(let t in this.$$.slotted)this.appendChild(this.$$.slotted[t])}attributeChangedCallback(n,t,e){this[n]=e}disconnectedCallback(){hn(this.$$.on_disconnect)}$destroy(){po(this,1),this.$destroy=wl}$on(n,t){let e=this.$$.callbacks[n]||(this.$$.callbacks[n]=[]);return e.push(t),()=>{let i=e.indexOf(t);i!==-1&&e.splice(i,1)}}$set(n){this.$$set&&!Uf(n)&&(this.$$.skip_bound=!0,this.$$set(n),this.$$.skip_bound=!1)}});var Is=class{$destroy(){po(this,1),this.$destroy=wl}$on(t,e){let i=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return i.push(e),()=>{let s=i.indexOf(e);s!==-1&&i.splice(s,1)}}$set(t){this.$$set&&!Uf(t)&&(this.$$.skip_bound=!0,this.$$set(t),this.$$.skip_bound=!1)}};var mo=ze(require("obsidian"));function v1(n){oo(n,"svelte-1lboqqp","h3.svelte-1lboqqp{margin:0}button.svelte-1lboqqp{display:flex;justify-content:space-between;width:100%;border:none;margin:0;padding:1em 0.5em}button.svelte-1lboqqp{fill:currentColor}svg.svelte-1lboqqp{height:0.7em;width:0.7em}")}function _1(n){let t,e,i,s,r,o,a,l,c,h,f,g,p,m,y=n[3].default,S=Kf(y,n,n[2],null);return{c(){t=Y("div"),e=Y("h3"),i=Y("button"),s=Sl(n[0]),r=It(),o=ao("svg"),a=ao("path"),l=ao("path"),c=It(),h=Y("div"),S&&S.c(),X(a,"class","vert"),X(a,"d","M10 1V19"),X(a,"stroke","black"),X(a,"stroke-width","2"),X(l,"d","M1 10L19 10"),X(l,"stroke","black"),X(l,"stroke-width","2"),X(o,"viewBox","0 0 20 20"),X(o,"fill","none"),X(o,"class","svelte-1lboqqp"),X(i,"aria-expanded",n[1]),X(i,"class","svelte-1lboqqp"),X(e,"class","svelte-1lboqqp"),X(h,"class","contents"),h.hidden=f=!n[1],X(t,"class","collapsible")},m(M,C){Xe(M,t,C),z(t,e),z(e,i),z(i,s),z(i,r),z(i,o),z(o,a),z(o,l),z(t,c),z(t,h),S&&S.m(h,null),g=!0,p||(m=Jt(i,"click",n[4]),p=!0)},p(M,[C]){(!g||C&1)&&id(s,M[0]),(!g||C&2)&&X(i,"aria-expanded",M[1]),S&&S.p&&(!g||C&4)&&Qf(S,y,M,M[2],g?Jf(y,M[2],C,null):td(M[2]),null),(!g||C&2&&f!==(f=!M[1]))&&(h.hidden=f)},i(M){g||(Fs(S,M),g=!0)},o(M){fo(S,M),g=!1},d(M){M&&Ie(t),S&&S.d(M),p=!1,m()}}}function y1(n,t,e){let{$$slots:i={},$$scope:s}=t,{headerText:r}=t,o=!1,a=()=>e(1,o=!o);return n.$$set=l=>{"headerText"in l&&e(0,r=l.headerText),"$$scope"in l&&e(2,s=l.$$scope)},[r,o,s,i,a]}var ld=class extends Is{constructor(t){super();go(this,t,y1,_1,ro,{headerText:0},v1)}},cd=ld;function x1(n){oo(n,"svelte-1tlkntj",".addMoreButtonContainer.svelte-1tlkntj{display:flex;justify-content:flex-end;margin-top:0.4rem}.subDesc.svelte-1tlkntj{font-size:smaller;opacity:0.5;margin:0}.desc.svelte-1tlkntj{padding-right:1em}.mainDesc.svelte-1tlkntj{margin:0}table.svelte-1tlkntj{margin:auto}.controlElement.svelte-1tlkntj{text-align:center}.chart-modal.svelte-1tlkntj{overflow-y:auto}.modalColumn.svelte-1tlkntj{display:flex;gap:2em}.chartPreview.svelte-1tlkntj{width:30vw;display:flex;justify-content:center;align-items:center}")}function hd(n,t,e){let i=n.slice();return i[33]=t[e],i[34]=t,i[35]=e,i}function ud(n){let t,e,i,s,r,o,a,l,c,h,f;function g(){n[23].call(r,n[34],n[35])}function p(){n[24].call(c,n[34],n[35])}return{c(){t=Y("tr"),e=Y("td"),e.innerHTML=`

    Y Axis

    +

    Set Data Fields (Comma seperated)

    `,i=It(),s=Y("td"),r=Y("input"),o=It(),a=Y("br"),l=It(),c=Y("input"),X(e,"class","desc svelte-1tlkntj"),X(r,"type","text"),X(r,"placeholder","Name"),X(c,"type","text"),X(c,"placeholder","1, -2, 11, 5"),Gt(c,"margin-top","3px"),X(s,"class","controlElement svelte-1tlkntj")},m(m,y){Xe(m,t,y),z(t,e),z(t,i),z(t,s),z(s,r),de(r,n[33].dataTitle),z(s,o),z(s,a),z(s,l),z(s,c),de(c,n[33].data),h||(f=[Jt(r,"input",g),Jt(c,"input",p)],h=!0)},p(m,y){n=m,y[0]&1024&&r.value!==n[33].dataTitle&&de(r,n[33].dataTitle),y[0]&1024&&c.value!==n[33].data&&de(c,n[33].data)},d(m){m&&Ie(t),h=!1,hn(f)}}}function w1(n){let t,e,i,s,r,o,a,l,c,h,f,g,p,m,y,S,M,C,F,D,I;return{c(){t=Y("hr"),e=It(),i=Y("table"),s=Y("tr"),r=Y("td"),r.innerHTML=`

    Line of Best Fit

    +

    Create a line of best fit

    `,o=Y("td"),a=Y("input"),l=It(),c=Y("tr"),h=Y("td"),h.innerHTML=`

    Best Fit Line ID

    +

    The line ID used to create the line of best fit

    `,f=Y("td"),g=Y("input"),p=Y("br"),m=It(),y=Y("tr"),S=Y("td"),S.innerHTML=`

    Line of Best Fit Title

    +

    The title for the line of best fit

    `,M=Y("td"),C=Y("input"),F=Y("br"),X(r,"class","desc svelte-1tlkntj"),X(a,"type","checkbox"),X(a,"class","task-list-item-checkbox"),Gt(a,"width","16px"),Gt(a,"height","16px"),X(o,"class","controlElement svelte-1tlkntj"),X(h,"class","desc svelte-1tlkntj"),X(g,"type","text"),X(g,"placeholder","0"),Gt(g,"width","26px"),Gt(g,"height","32px"),X(f,"class","controlElement svelte-1tlkntj"),X(S,"class","desc svelte-1tlkntj"),X(C,"type","text"),X(C,"placeholder","Line of Best Fit"),Gt(C,"width","96px"),Gt(C,"height","32px"),X(M,"class","controlElement svelte-1tlkntj"),Gt(i,"width","100%"),X(i,"class","svelte-1tlkntj")},m($,N){Xe($,t,N),Xe($,e,N),Xe($,i,N),z(i,s),z(s,r),z(s,o),z(o,a),a.checked=n[6],z(i,l),z(i,c),z(c,h),z(c,f),z(f,g),de(g,n[8]),z(f,p),z(i,m),z(i,y),z(y,S),z(y,M),z(M,C),de(C,n[7]),z(M,F),D||(I=[Jt(a,"change",n[26]),Jt(g,"input",n[27]),Jt(C,"input",n[28])],D=!0)},p($,N){N[0]&64&&(a.checked=$[6]),N[0]&256&&g.value!==$[8]&&de(g,$[8]),N[0]&128&&C.value!==$[7]&&de(C,$[7])},d($){$&&Ie(t),$&&Ie(e),$&&Ie(i),D=!1,hn(I)}}}function k1(n){let t,e,i,s,r,o,a,l,c,h,f,g,p,m,y,S,M,C,F,D,I,$,N,G,U,it,lt,rt,Pt,zt,et,Et,St,re,ye,ot,Lt,Bt,Ut,Qt,k,v,x,R,E,O,Z,V,J,tt,xt,Ht,Ot,Yt,Xt,ue,ke,xe,Rn,un,Ln,je,$i,Fn,oi,$s,ji,ai,qe,In,$n,li,js,fn=n[10],ce=[];for(let bt=0;btChart Type

    +

    Choose a Chart Type

    `,c=Y("td"),h=Y("select"),f=Y("option"),f.textContent="Bar",g=Y("option"),g.textContent="Line",p=Y("option"),p.textContent="Pie",m=Y("option"),m.textContent="Doughnut",y=Y("option"),y.textContent="Radar",S=Y("option"),S.textContent="Polar Area",M=It(),C=Y("tr"),F=Y("td"),F.innerHTML=`

    Smoothness

    +

    Changes the smoothness of the Chart

    `,D=Y("td"),I=Y("input"),$=It(),N=Y("tr"),G=Y("td"),G.innerHTML=`

    Width

    +

    Changes the horizontal width

    `,U=Y("td"),it=Y("input"),lt=It(),rt=Y("tr"),Pt=Y("td"),Pt.innerHTML=`

    Fill

    +

    Fill the underside of the Chart

    `,zt=Y("td"),et=Y("input"),Et=It(),St=Y("tr"),re=Y("td"),re.innerHTML=`

    Distinct Colors

    +

    Use distinct Colors for each Label

    `,ye=Y("td"),ot=Y("input"),Lt=It(),Bt=Y("tr"),Ut=Y("td"),Ut.innerHTML=`

    Start at Zero

    +

    Don't cut the graph at the bottom

    `,Qt=Y("td"),k=Y("input"),v=It(),x=Y("hr"),R=It(),E=Y("table"),O=Y("tr"),Z=Y("td"),Z.innerHTML=`

    X Axis

    +

    Set Labels (Comma seperated)

    `,V=It(),J=Y("td"),tt=Y("input"),xt=Y("br"),Ht=It(),Ot=Y("hr"),Yt=It(),Xt=Y("table");for(let bt=0;btn[16].call(h)),X(c,"class","controlElement svelte-1tlkntj"),X(F,"class","desc svelte-1tlkntj"),X(I,"type","range"),X(I,"min","0"),X(I,"max","100"),X(I,"class","slider"),X(D,"class","controlElement svelte-1tlkntj"),X(G,"class","desc svelte-1tlkntj"),X(it,"type","range"),X(it,"min","20"),X(it,"max","100"),X(it,"class","slider"),X(U,"class","controlElement svelte-1tlkntj"),X(Pt,"class","desc svelte-1tlkntj"),X(et,"type","checkbox"),X(et,"class","task-list-item-checkbox"),Gt(et,"width","16px"),Gt(et,"height","16px"),X(zt,"class","controlElement svelte-1tlkntj"),X(re,"class","desc svelte-1tlkntj"),X(ot,"type","checkbox"),X(ot,"class","task-list-item-checkbox"),Gt(ot,"width","16px"),Gt(ot,"height","16px"),X(ye,"class","controlElement svelte-1tlkntj"),X(Ut,"class","desc svelte-1tlkntj"),X(k,"type","checkbox"),X(k,"class","task-list-item-checkbox"),Gt(k,"width","16px"),Gt(k,"height","16px"),X(Qt,"class","controlElement svelte-1tlkntj"),Gt(o,"width","100%"),X(o,"class","svelte-1tlkntj"),X(Z,"class","desc svelte-1tlkntj"),X(tt,"type","text"),X(tt,"placeholder","Monday, Tuesday, ..."),X(J,"class","controlElement svelte-1tlkntj"),Gt(E,"width","100%"),X(E,"class","svelte-1tlkntj"),X(ke,"class","addMoreButtonContainer svelte-1tlkntj"),Gt(Xt,"width","100%"),X(Xt,"class","svelte-1tlkntj"),X(oi,"id","preview"),X(Fn,"class","chartPreview svelte-1tlkntj"),X(s,"class","modalColumn svelte-1tlkntj"),X(t,"class","chart-modal svelte-1tlkntj"),X(In,"class","mod-cta"),Gt(qe,"display","flex"),Gt(qe,"justify-content","center"),Gt(qe,"align-items","center")},m(bt,te){Xe(bt,t,te),z(t,e),z(t,i),z(t,s),z(s,r),z(r,o),z(o,a),z(a,l),z(a,c),z(c,h),z(h,f),z(h,g),z(h,p),z(h,m),z(h,y),z(h,S),Cl(h,n[0]),z(o,M),z(o,C),z(C,F),z(C,D),z(D,I),de(I,n[1]),z(o,$),z(o,N),z(N,G),z(N,U),z(U,it),de(it,n[2]),z(o,lt),z(o,rt),z(rt,Pt),z(rt,zt),z(zt,et),et.checked=n[3],z(o,Et),z(o,St),z(St,re),z(St,ye),z(ye,ot),ot.checked=n[4],z(o,Lt),z(o,Bt),z(Bt,Ut),z(Bt,Qt),z(Qt,k),k.checked=n[5],z(r,v),z(r,x),z(r,R),z(r,E),z(E,O),z(O,Z),z(O,V),z(O,J),z(J,tt),de(tt,n[9]),z(J,xt),z(r,Ht),z(r,Ot),z(r,Yt),z(r,Xt);for(let dn=0;dn{var Bt;a&&a.destroy(),(Bt=F.lastElementChild)===null||Bt===void 0||Bt.remove(),a=s.renderRaw(await s.datasetPrep((0,mo.parseYaml)(ot),Lt),Lt)},500,!0);function I(){let ot=i.getDoc(),Lt=ot.getCursor();a.destroy(),ot.replaceRange("```chart\n"+C+"\n```",Lt),r("close")}function $(){o=sd(this),e(0,o)}function N(){l=Ml(this.value),e(1,l)}function G(){c=Ml(this.value),e(2,c)}function U(){h=this.checked,e(3,h)}function it(){f=this.checked,e(4,f)}function lt(){g=this.checked,e(5,g)}function rt(){S=this.value,e(9,S)}function Pt(ot,Lt){ot[Lt].dataTitle=this.value,e(10,M)}function zt(ot,Lt){ot[Lt].data=this.value,e(10,M)}let et=()=>e(10,M=[...M,{data:"",dataTitle:""}]);function Et(){p=this.checked,e(6,p)}function St(){y=this.value,e(8,y)}function re(){m=this.value,e(7,m)}function ye(ot){lo[ot?"unshift":"push"](()=>{F=ot,e(11,F)})}return n.$$set=ot=>{"editor"in ot&&e(13,i=ot.editor),"renderer"in ot&&e(14,s=ot.renderer)},n.$$.update=()=>{if(n.$$.dirty[0]&2047){t:e(15,C=`type: ${o} +labels: [${S}] +series: +${M.map(ot=>` - title: ${ot.dataTitle} + data: [${ot.data}]`).join(` +`)} +tension: ${l/100} +width: ${c}% +labelColors: ${f} +fill: ${h} +beginAtZero: ${g} +bestFit: ${p} +bestFitTitle: ${m} +bestFitNumber: ${y}`)}if(n.$$.dirty[0]&34816){t:if(F)try{D(C,F)}catch(ot){cn(ot,F)}}},[o,l,c,h,f,g,p,m,y,S,M,F,I,i,s,C,$,N,G,U,it,lt,rt,Pt,zt,et,Et,St,re,ye]}var fd=class extends Is{constructor(t){super();go(this,t,S1,k1,ro,{editor:13,renderer:14},x1,[-1,-1])}},dd=fd;var bo=class extends pd.Modal{constructor(t,e,i,s){super(t);this.settings=i,this.view=e,this.renderer=s}onOpen(){let{contentEl:t,view:e,settings:i,renderer:s}=this;t.empty(),new dd({target:t,props:{editor:e.editor,renderer:s}}).$on("close",()=>this.close())}onClose(){let{contentEl:t}=this;t.empty()}};var gd=ze(require("obsidian")),md={chart:''},bd=()=>{Object.keys(md).forEach(n=>{(0,gd.addIcon)(n,md[n])})};var Ol=class extends $e.Plugin{constructor(){super(...arguments);this.postprocessor=async(t,e,i)=>{let s;try{s=await(0,$e.parseYaml)(t.replace(/ /g," "))}catch(a){cn(a,e);return}if(!s.id&&(!s||!s.type||!s.labels||!s.series)){cn("Missing type, labels or series",e);return}if(s.bestFit===!0&&s.type==="line"){if(s.bestFitNumber!=null)var r=s.series[Number(s.bestFitNumber)].data;else var r=s.series[0].data;let a=s.labels,l=0,c=0,h=0,f=0;for(let y=0;y{let e=this.app.workspace.activeLeaf;return e.view instanceof $e.MarkdownView?(t||new bo(this.app,e.view,this.settings,this.renderer).open(),!0):!1}}),this.addCommand({id:"chart-from-table-column",name:"Create Chart from Table (Column oriented Layout)",editorCheckCallback:(t,e,i)=>{let s=e.getSelection();return i instanceof $e.MarkdownView&&s.split(` +`).length>=3&&s.split("|").length>=2?(t||Ka(e,"columns"),!0):!1}}),this.addCommand({id:"chart-from-table-row",name:"Create Chart from Table (Row oriented Layout)",editorCheckCallback:(t,e,i)=>i instanceof $e.MarkdownView&&e.getSelection().split(` +`).length>=3&&e.getSelection().split("|").length>=2?(t||Ka(e,"rows"),!0):!1}),this.addCommand({id:"chart-to-svg",name:"Create Image from Chart",editorCheckCallback:(t,e,i)=>i instanceof $e.MarkdownView&&e.getSelection().startsWith("```chart")&&e.getSelection().endsWith("```")?(t||(new $e.Notice("Rendering Chart..."),Ju(e,this.app,this.renderer,i.file,this.settings)),!0):!1}),this.registerMarkdownCodeBlockProcessor("chart",this.postprocessor),this.registerMarkdownCodeBlockProcessor("advanced-chart",async(t,e)=>this.renderer.renderRaw(await JSON.parse(t),e)),this.registerEvent(this.app.workspace.on("editor-menu",(t,e,i)=>{i&&this.settings.contextMenu&&t.addItem(s=>{s.setTitle("Insert Chart").setIcon("chart").onClick(r=>{new bo(this.app,i,this.settings,this.renderer).open()})})}))}onunload(){console.log("unloading plugin: Obsidian Charts")}}; +/* + * @license + * + * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed) + * https://github.com/chjj/marked + * + * Copyright (c) 2018-2021, Костя Третяк. (MIT Licensed) + * https://github.com/ts-stack/markdown + */ +/*! + * chartjs-adapter-moment v1.0.0 + * https://www.chartjs.org + * (c) 2021 chartjs-adapter-moment Contributors + * Released under the MIT license + */ +/*! + * @kurkle/color v0.2.1 + * https://github.com/kurkle/color#readme + * (c) 2022 Jukka Kurkela + * Released under the MIT License + */ +/*! + * Chart.js v3.9.1 + * https://www.chartjs.org + * (c) 2022 Chart.js Contributors + * Released under the MIT License + */ +/*! + * chartjs-chart-sankey v0.12.0 + * https://github.com/kurkle/chartjs-chart-sankey#readme + * (c) 2022 Jukka Kurkela + * Released under the MIT license + */ +/*! + * vanilla-picker v2.12.1 + * https://vanilla-picker.js.org + * + * Copyright 2017-2021 Andreas Borgen (https://github.com/Sphinxxxx), Adam Brooks (https://github.com/dissimulate) + * Released under the ISC license. + */ +/*! +* chartjs-plugin-annotation v2.2.1 +* https://www.chartjs.org/chartjs-plugin-annotation/index + * (c) 2023 chartjs-plugin-annotation Contributors + * Released under the MIT License + */ +/*! ***************************************************************************** + 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. + ***************************************************************************** */ +/** + * @license + * + * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed) + * https://github.com/chjj/marked + * + * Copyright (c) 2018-2021, Костя Третяк. (MIT Licensed) + * https://github.com/ts-stack/markdown + */ +/** + * @license + * + * Copyright (c) 2018-2021, Костя Третяк. (MIT Licensed) + * https://github.com/ts-stack/markdown + */ +/** + * chroma.js - JavaScript library for color conversions + * + * Copyright (c) 2011-2019, Gregor Aisch + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name Gregor Aisch may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ------------------------------------------------------- + * + * chroma.js includes colors from colorbrewer2.org, which are released under + * the following license: + * + * Copyright (c) 2002 Cynthia Brewer, Mark Harrower, + * and The Pennsylvania State University. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + * + * ------------------------------------------------------ + * + * Named colors are taken from X11 Color Names. + * http://www.w3.org/TR/css3-color/#svg-color + * + * @preserve + */ diff --git a/enter/.obsidian/plugins/obsidian-charts/manifest.json b/enter/.obsidian/plugins/obsidian-charts/manifest.json new file mode 100644 index 0000000..e34538e --- /dev/null +++ b/enter/.obsidian/plugins/obsidian-charts/manifest.json @@ -0,0 +1,11 @@ +{ + "id": "obsidian-charts", + "name": "Obsidian Charts", + "version": "3.8.2", + "minAppVersion": "0.12.7", + "description": "This Plugin lets you create Charts within Obsidian", + "author": "phibr0", + "authorUrl": "https://github.com/phibr0", + "isDesktopOnly": false, + "fundingUrl": "https://ko-fi.com/phibr0" +} diff --git a/enter/.obsidian/plugins/obsidian-charts/styles.css b/enter/.obsidian/plugins/obsidian-charts/styles.css new file mode 100644 index 0000000..ae9c32b --- /dev/null +++ b/enter/.obsidian/plugins/obsidian-charts/styles.css @@ -0,0 +1,30 @@ +.picker_wrapper.popup, +.picker_wrapper.popup .picker_arrow::before, +.picker_wrapper.popup .picker_arrow::after, +.picker_editor > input { + background-color: var(--background-primary); +} + +.picker_editor > input { + color: var(--text-normal); +} + +div.chart-error { + padding: 1rem; + border-radius: 1rem; + background-color: var(--background-secondary); +} + +div.chart-error pre > code { + color: crimson !important; +} + +.print .block-language-chart { + /* Hardcoded with for printed Charts, see #41 */ + width: 500px !important; +} + +a[href="https://ko-fi.com/phibr0"] > img +{ + height: 3em; +} diff --git a/enter/.obsidian/plugins/recent-files-obsidian/data.json b/enter/.obsidian/plugins/recent-files-obsidian/data.json index 1e5b140..4b3860a 100644 --- a/enter/.obsidian/plugins/recent-files-obsidian/data.json +++ b/enter/.obsidian/plugins/recent-files-obsidian/data.json @@ -1,204 +1,204 @@ { "recentFiles": [ { - "basename": "Review & Putting it all together", - "path": "Review & Putting it all together.md" + "basename": "Obsidian-gitea process", + "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md" }, { - "basename": "Drawing 2023-11-15 14.12.08.excalidraw", - "path": "Excalidraw/Drawing 2023-11-15 14.12.08.excalidraw.md" - }, - { - "basename": "HTML Group Project", - "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML Group Project.md" - }, - { - "basename": "Week 3 Slides", - "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 3 Slides.md" - }, - { - "basename": "HTML & CSS Tricks", - "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML & CSS Tricks.md" - }, - { - "basename": "THE link", - "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/THE link.md" - }, - { - "basename": "Wikimedia Director", - "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Potential and Future/60 careers/Wikimedia Director.md" - }, - { - "basename": "About 60 Careers", - "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Potential and Future/About 60 Careers.md" - }, - { - "basename": "List of Quantum Benchmarks", - "path": "Machine Tips (Quantum)/Resources/Code & Circuit Operations/Languages/Tools & Software/List of Quantum Benchmarks.md" - }, - { - "basename": "GPU", - "path": "Machine Tips (Quantum)/QIS/GPU.md" - }, - { - "basename": "gdevelop.io", - "path": "Coding Tips (Classical)/Terminal Tips/GUIs/Games/gdevelop.io.md" - }, - { - "basename": "PLAY GAMES - Finally the fun part", - "path": "Machine Tips (Quantum)/Resources/Technologies, Orgs, & Apps/Applications/More specifically/Games!!/PLAY GAMES - Finally the fun part.md" - }, - { - "basename": "Quantum Ethics", - "path": "Machine Tips (Quantum)/QIS/Quantum Ethics.md" - }, - { - "basename": "QIS XML", - "path": "Machine Tips (Quantum)/QIS/QIS XML.md" - }, - { - "basename": "About terminal", - "path": "Coding Tips (Classical)/Terminal Tips/About terminal.md" + "basename": "Launchd", + "path": "Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Launchd.md" }, { "basename": "Notable Obsidians", "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Notable Obsidians.md" }, { - "basename": "Obsidian-gitea process", - "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md" + "basename": "My Domain Names", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/My Domain Names.md" }, { - "basename": "Obsidian-net process", - "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-net process.md" + "basename": "Web Doc Layout for QRG INK", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/QRG INK designs/Web Doc Layout for QRG INK.md" }, { - "basename": "Tips on Obsidian itself", - "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Tips on Obsidian itself.md" - }, - { - "basename": "Digital Garden Plugin", - "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Digital Garden Plugin.md" - }, - { - "basename": "Robots.txt Files", - "path": "Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Robots.txt Files.md" - }, - { - "basename": "Particle Terms", - "path": "Machine Tips (Quantum)/Physics/Particle Terms.md" - }, - { - "basename": "Ions", - "path": "Machine Tips (Quantum)/Physics/Ions.md" - }, - { - "basename": "Anti Charm Meson", - "path": "Machine Tips (Quantum)/Physics/Anti Charm Meson.md" - }, - { - "basename": "Agnostiq", - "path": "Machine Tips (Quantum)/Resources/Code & Circuit Operations/Languages/Tools & Software/Agnostiq.md" - }, - { - "basename": "Computers", - "path": "Machine Tips (Quantum)/Resources/Code & Circuit Operations/Languages/Tools & Software/Computers.md" - }, - { - "basename": "List of Quantum Tools", - "path": "Machine Tips (Quantum)/Resources/Code & Circuit Operations/Languages/Tools & Software/List of Quantum Tools.md" - }, - { - "basename": "Qyte vs Byte", - "path": "Machine Tips (Quantum)/QIS/Qyte vs Byte.md" - }, - { - "basename": "Quantum Formalism", - "path": "Machine Tips (Quantum)/Math/Quantum Formalism.md" - }, - { - "basename": "About Servers", - "path": "Coding Tips (Classical)/Terminal Tips/Servers/About Servers.md" + "basename": "LOGO for Qrg Ink", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/QRG INK designs/LOGO for Qrg Ink.md" }, { "basename": "Shwetha Jayaraj Notes", "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Shwetha Jayaraj Notes.md" }, { - "basename": "Manhattan Youth", - "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/Manhattan Youth.md" + "basename": "Main Page", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Main Page.md" }, { - "basename": "Week 7 Slides", - "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 7 Slides.md" + "basename": "Coding Projects", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Coding Projects.md" }, { - "basename": "Potentiometers & Analog SerialReader", - "path": "Machine Tips (Quantum)/Project Vault/Constructions/Hardware/Potentiometers & Analog SerialReader.md" + "basename": "Resume-ish - my occupations", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Resume-ish - my occupations.md" }, { - "basename": "1.About Languages", - "path": "Coding Tips (Classical)/Terminal Tips/Languages/1.About Languages.md" + "basename": "Quantum Stuff", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Quantum Stuff.md" }, { - "basename": "Mods", - "path": "Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Mods.md" + "basename": "pdf", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/pdf.md" }, { - "basename": "Windtelligent CTO", - "path": "Coding Tips (Classical)/Project Vault/Past Occupencies/Windtelligent.ai/Windtelligent CTO.md" + "basename": "Credits", + "path": "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Credits.md" }, { - "basename": "Mac X Code", - "path": "Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/Mac X Code.md" + "basename": "Generator Functions", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Generator Functions.md" + }, + { + "basename": "Explicitly Defining datatype in python function", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Explicitly Defining datatype in python function.md" + }, + { + "basename": "Lists", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/Lists.md" }, { "basename": "OSX Apps", - "path": "Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/OSX Apps.md" + "path": "Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/OSX Apps.md" + }, + { + "basename": "Mac X Code", + "path": "Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/Mac X Code.md" + }, + { + "basename": "QCVV", + "path": "Machine Tips (Quantum)/Resources/Post-Processing/QCVV.md" + }, + { + "basename": "QEC", + "path": "Machine Tips (Quantum)/Resources/Post-Processing/QEC.md" + }, + { + "basename": "Documentation", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Documentation.md" + }, + { + "basename": "About Tool", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/About Tool.md" + }, + { + "basename": "Discord Message Monitoring script", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Discord Message Monitoring script.md" + }, + { + "basename": "PHP", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/PHP.md" + }, + { + "basename": "Robots.txt Files", + "path": "Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Robots.txt Files.md" + }, + { + "basename": "Advanced Slides", + "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Slides & Tools/Advanced Slides.md" + }, + { + "basename": "CLI Tool Collection", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/CLI Tool Collection.md" + }, + { + "basename": "About GUIs", + "path": "Coding Tips (Classical)/Terminal Tips/3. GUIs/About GUIs.md" + }, + { + "basename": "Xonsh", + "path": "Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/xonsh/Xonsh.md" + }, + { + "basename": "Xontrib-avox", + "path": "Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/xonsh/Xontrib-avox.md" + }, + { + "basename": "fzf", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/fzf.md" }, { "basename": "Glow", - "path": "Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Glow.md" + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Glow.md" }, { - "basename": "MacFUSE", - "path": "Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/MacFUSE.md" + "basename": "Mods", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Mods.md" }, { - "basename": "Hard Disk & SSD", - "path": "Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Mac Tips/Hard Disk & SSD.md" + "basename": "Please", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Please.md" }, { - "basename": "iOS Apps", - "path": "Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/iOS Apps.md" + "basename": "VHS", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/VHS.md" }, { - "basename": "Untitled", - "path": "imgFiles/Untitled.png" + "basename": "Alt. Obsidian", + "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Alt. Obsidian.md" }, { - "basename": "redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891", - "path": "imgFiles/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4" + "basename": "Command Shortcuts", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/Command Shortcuts.md" }, { - "basename": "Pasted image 20231028152700", - "path": "imgFiles/Pasted image 20231028152700.png" + "basename": "Git", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/Git.md" }, { - "basename": "First Quarter Notebook", - "path": "Coding Tips (Classical)/Project Vault/Past Occupencies/Windtelligent.ai/First Quarter Notebook.md" + "basename": "Linear Algebra Basics", + "path": "Machine Tips (Quantum)/Math/Linear Algebra Basics.md" }, { - "basename": "Windtelligent Wishlist", - "path": "Coding Tips (Classical)/Project Vault/Past Occupencies/Windtelligent.ai/Intelligence/Windtelligent Wishlist.md" + "basename": "Anti Charm Meson", + "path": "Machine Tips (Quantum)/Physics/Anti Charm Meson.md" }, { - "basename": "Referenced Papers", - "path": "Coding Tips (Classical)/Project Vault/Past Occupencies/Windtelligent.ai/Intelligence/Referenced Papers.md" + "basename": "Choosing a Name for Your Computer", + "path": "Coding Tips (Classical)/Terminal Tips/System Client/Choosing a Name for Your Computer.md" }, { - "basename": "HRRR", - "path": "Coding Tips (Classical)/Project Vault/Past Occupencies/Windtelligent.ai/Intelligence/HRRR.md" + "basename": "Obsidian-net process", + "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-net process.md" + }, + { + "basename": "Encrypting Obsidian", + "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Encrypting Obsidian.md" + }, + { + "basename": "Digital Garden Plugin", + "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Digital Garden Plugin.md" + }, + { + "basename": "Calendar & DataView", + "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Calendar & DataView.md" + }, + { + "basename": "Tips on Obsidian itself", + "path": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Tips on Obsidian itself.md" + }, + { + "basename": "SQL", + "path": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/SQL.md" + }, + { + "basename": "About Servers", + "path": "Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/About Servers.md" + }, + { + "basename": "About Virtual Machines", + "path": "Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/About Virtual Machines.md" + }, + { + "basename": "Search", + "path": "Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Search.md" } ], "omittedPaths": [], diff --git a/enter/.obsidian/workspace.json b/enter/.obsidian/workspace.json index a0014e2..3f318bd 100644 --- a/enter/.obsidian/workspace.json +++ b/enter/.obsidian/workspace.json @@ -4,78 +4,139 @@ "type": "split", "children": [ { - "id": "802b58f22bd207de", + "id": "55748be17e759ab3", "type": "tabs", "children": [ { - "id": "1e3e6c09ac181572", + "id": "5a1ca95039ee4937", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Machine Tips (Quantum)/QIS/GPU.md", + "file": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md", "mode": "source", "source": false } } }, { - "id": "2e6c0d3dd634dc8f", + "id": "38b4fec6c32fc854", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Coding Tips (Classical)/Project Vault/Current Occupations/Potential and Future/About 60 Careers.md", + "file": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/Trampoline.md", "mode": "source", "source": false } } }, { - "id": "d7be544e2e1278bf", - "type": "leaf", - "state": { - "type": "empty", - "state": {} - } - }, - { - "id": "1824207fac20366b", + "id": "34eedd734ebace8e", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML Group Project.md", + "file": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Unison.md", "mode": "source", "source": false } } }, { - "id": "e08a3214e6ed5350", + "id": "db697339aa87a10c", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Review & Putting it all together.md", + "file": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/TypeScript.md", "mode": "source", "source": false } } - } - ], - "currentTab": 4 - }, - { - "id": "e45f9c1ed3a3378a", - "type": "tabs", - "children": [ + }, { - "id": "e905f53715e8369e", + "id": "8131402554cd8f7f", "type": "leaf", "state": { - "type": "reveal-preview-view", - "state": {} + "type": "markdown", + "state": { + "file": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/C++.md", + "mode": "source", + "source": false + } + } + }, + { + "id": "ff15b92a59a7736a", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Unison in Racket Scheme.md", + "mode": "source", + "source": false + } + } + }, + { + "id": "1264e99b4073b2a4", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Machine Tips (Quantum)/Resources/Code & Circuit Operations/Languages/Languages lost to Research....md", + "mode": "source", + "source": false + } + } + }, + { + "id": "c64f78f33ec53bde", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/VHS.md", + "mode": "source", + "source": false + } + } + }, + { + "id": "b01ff7cf370f0a54", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/xonsh/Xonsh.md", + "mode": "source", + "source": false + } + } + }, + { + "id": "583f1c2c5aa96424", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Robots.txt Files.md", + "mode": "source", + "source": false + } + } + }, + { + "id": "4d52f91a49f1cc15", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/OSX Apps.md", + "mode": "source", + "source": false + } } } ] @@ -132,12 +193,12 @@ "state": {} } } - ] + ], + "currentTab": 1 } ], "direction": "horizontal", - "width": 200, - "collapsed": true + "width": 200 }, "right": { "id": "4bd9c02fbfe6785f", @@ -153,7 +214,7 @@ "state": { "type": "backlink", "state": { - "file": "Review & Putting it all together.md", + "file": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -170,7 +231,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "Review & Putting it all together.md", + "file": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -193,11 +254,20 @@ "state": { "type": "outline", "state": { - "file": "Review & Putting it all together.md" + "file": "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md" } } + }, + { + "id": "b5bd91a881a9c776", + "type": "leaf", + "state": { + "type": "calendar", + "state": {} + } } - ] + ], + "currentTab": 4 } ], "direction": "horizontal", @@ -216,58 +286,59 @@ "digitalgarden:Digital Garden Publication Center": false, "omnisearch:Omnisearch": false, "templater-obsidian:Templater": false, - "obsidian-advanced-slides:Show Slide Preview": false + "obsidian-advanced-slides:Show Slide Preview": false, + "obsidian-excalidraw-plugin:Create new drawing": false } }, - "active": "09403aca8ace06de", + "active": "5a1ca95039ee4937", "lastOpenFiles": [ - "Excalidraw/Drawing 2023-11-15 14.12.08.excalidraw.md", - "Review & Putting it all together.md", - "Excalidraw", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML Group Project.md", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 3 Slides.md", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML & CSS Tricks.md", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/THE link.md", - "Coding Tips (Classical)/Project Vault/Current Occupations/Potential and Future/60 careers/Wikimedia Director.md", - "Coding Tips (Classical)/Project Vault/Current Occupations/Potential and Future/About 60 Careers.md", - "Machine Tips (Quantum)/Resources/Code & Circuit Operations/Languages/Tools & Software/List of Quantum Benchmarks.md", - "Machine Tips (Quantum)/QIS/GPU.md", - "Coding Tips (Classical)/Terminal Tips/GUIs/Games/gdevelop.io.md", - "Machine Tips (Quantum)/Resources/Technologies, Orgs, & Apps/Applications/More specifically/Games!!/PLAY GAMES - Finally the fun part.md", - "Machine Tips (Quantum)/QIS/Quantum Ethics.md", - "Machine Tips (Quantum)/QIS/QIS XML.md", - "Coding Tips (Classical)/Terminal Tips/About terminal.md", + "Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Launchd.md", "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Notable Obsidians.md", - "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md", - "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-net process.md", - "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Tips on Obsidian itself.md", - "Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Digital Garden Plugin.md", - "Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Robots.txt Files.md", - "Machine Tips (Quantum)/Physics/Particle Terms.md", - "Machine Tips (Quantum)/Physics/Ions.md", - "Machine Tips (Quantum)/Physics/Anti Charm Meson.md", - "Machine Tips (Quantum)/Resources/Code & Circuit Operations/Languages/Tools & Software/Agnostiq.md", - "Machine Tips (Quantum)/Resources/Code & Circuit Operations/Languages/Tools & Software/Computers.md", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/digital art", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design", - "imgFiles/Pasted image 20231101131959.png", - "imgFiles/Untitled.png", - "imgFiles/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4", - "imgFiles/Pasted image 20231028152700.png", - "Coding Tips (Classical)/Project Vault/Current Occupations/Communication Projects/Typewriter/gx6750.pdf", - "imgFiles/Pasted image 20231022162536.png", - "Machine Tips (Quantum)/Project Vault/Constructions/3D printing", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/My Domain Names.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/QRG INK designs/Web Doc Layout for QRG INK.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/QRG INK designs/LOGO for Qrg Ink.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Shwetha Jayaraj Notes.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Main Page.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Coding Projects.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Resume-ish - my occupations.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Quantum Stuff.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/pdf.md", + "Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Credits.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Generator Functions.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Explicitly Defining datatype in python function.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/Lists.md", + "Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/OSX Apps.md", + "Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/Mac X Code.md", + "Machine Tips (Quantum)/Resources/Post-Processing/QCVV.md", + "Machine Tips (Quantum)/Resources/Post-Processing/QEC.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Documentation.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/About Tool.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Discord Message Monitoring script.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/PHP.md", + "Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Robots.txt Files.md", + "Coding Tips (Classical)/Project Vault/About Obsidian/Slides & Tools/Advanced Slides.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/CLI Tool Collection.md", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc", + "Coding Tips (Classical)/Terminal Tips/1. Terminals", + "Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Fortran", + "Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231122170526.png", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120104008.png", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120103937.png", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120103915.png", + "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/FCFL 3D prints call 1.jpg", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/FCFL 3D prints call.jpg", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231101131959.png", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Untitled.png", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231028152700.png", + "Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231022162536.png", "Machine Tips (Quantum)/Quantum spaces.canvas", - "Coding Tips (Classical)/Project Vault/About Obsidian/Slides & Tools/export/Slides/Pasted image 20231010141612.png", - "Coding Tips (Classical)/Project Vault/About Obsidian/Slides & Tools", - "Untitled.canvas", - "Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth", - "imgFiles/Pasted image 20231011091043.png", - "Coding Tips (Classical)/Project Vault/About Obsidian/Slides & Tools/export/Slides/plugin/chalkboard/img/blackboard.png", - "Coding Tips (Classical)/Project Vault/About Obsidian/Slides & Tools/export/Slides/plugin/chalkboard/img/boardmarker-black.png", - "Coding Tips (Classical)/Project Vault/About Obsidian/Slides & Tools/export/Slides/plugin/chalkboard/img/boardmarker-blue.png", - "Coding Tips (Classical)/Project Vault/About Obsidian/Slides & Tools/export/Slides/plugin/chalkboard/img/boardmarker-green.png" + "Untitled.canvas" ] } \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Calendar & DataView.md b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Calendar & DataView.md new file mode 100644 index 0000000..81dcb9e --- /dev/null +++ b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Calendar & DataView.md @@ -0,0 +1,9 @@ + +Calendar is a great Obsidian plugin if needed for your own tracking while taking notes. While I don't use this as my daily note app, this is still a useful feature inside of Obsidian. Here is an example of how Calendar can work. + +![vi](https://www.youtube.com/watch?v=hxf3_dXIcqc) + + +Dataview is a **powerful** plugin. Use when ready to optimize querying your files. There are ways to define functions as well as defining [queries](https://blacksmithgu.github.io/obsidian-dataview/queries/query-types/#task-queries). + +Please read the full [documentation listed here. ](https://blacksmithgu.github.io/obsidian-dataview/#how-to-use-dataview) \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Notable Obsidians.md b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Notable Obsidians.md index dc1ec9a..affc4e2 100644 --- a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Notable Obsidians.md +++ b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Notable Obsidians.md @@ -9,4 +9,7 @@ I've run into many an inspiring obsidian as well as I've set up my own obsidian. - [Fork my Brain](https://notes.nicolevanderhoeven.com/Fork+My+Brain) has a lot of cool things on it - [Mindtopia](https://mindtopia.esteban-thilliez.com/) is another great one for inspo -![asoka](https://media.giphy.com/media/QtjNbzT6Zi5Cm2oyV2/giphy.gif) \ No newline at end of file +![asoka](https://media.giphy.com/media/QtjNbzT6Zi5Cm2oyV2/giphy.gif) + + +- This is an Obsidian [for TTRPGS](https://obsidianttrpgtutorials.com/Obsidian+TTRPG+Tutorials/Getting+Started/Vault+Structure) !! :O And [another](https://icewind.quest/) one!! \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md index b72a798..aa43388 100644 --- a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md +++ b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Obsidian-gitea process.md @@ -151,7 +151,7 @@ git push -q ###### *For Mac:* Sync Obsidian vault via `launchd` by writing a plist script: -1. We will be using launnchd. Check your list of services by: +1. We will be using launchd. Check your list of services by: ``` sudo launctl list ``` diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Tips on Obsidian itself.md b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Tips on Obsidian itself.md index fff59f4..72c55af 100644 --- a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Tips on Obsidian itself.md +++ b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/Obsidian Guides/Tips on Obsidian itself.md @@ -61,6 +61,252 @@ color yellow ^button-bananas +# Using Callouts in Obdidian +--- + +Callouts + +Use callouts to include additional content without breaking the flow of your notes. + +To create a callout, add `[!info]` to the first line of a blockquote, where `info` is the _type identifier_. The type identifier determines how the callout looks and feels. To see all available types, refer to [Supported types](https://help.obsidian.md/Editing+and+formatting/Callouts#Supported%20types). + +```markdown +> [!info] +> Here's a callout block. +> It supports **Markdown**, [[Internal link|Wikilinks]], and [[Embed files|embeds]]! +> ![[Engelbart.jpg]] +``` + +Info + +Here's a callout block. +It supports **Markdown**, [Wikilinks](https://help.obsidian.md/Linking+notes+and+files/Internal+links) and [embeds](https://help.obsidian.md/Linking+notes+and+files/Embedding+files)! +![Engelbart.jpg](https://publish-01.obsidian.md/access/f786db9fac45774fa4f0d8112e232d67/Attachments/Engelbart.jpg) + +Callouts are also supported natively on [Obsidian Publish](https://help.obsidian.md/Obsidian+Publish/Introduction+to+Obsidian+Publish). + +Note + +If you're also using the Admonitions plugin, you should update it to at least version 8.0.0 to avoid problems with the new callout feature. + +### Change the title + +By default, the title of the callout is its type identifier in title case. You can change it by adding text after the type identifier: + +```markdown +> [!tip] Callouts can have custom titles +> Like this one. +``` + +Callouts can have custom titles + +Like this one. + +You can even omit the body to create title-only callouts: + +```markdown +> [!tip] Title-only callout +``` + +Title-only callout + +### Foldable callouts + +You can make a callout foldable by adding a plus (+) or a minus (-) directly after the type identifier. + +A plus sign expands the callout by default, and a minus sign collapses it instead. + +```markdown +> [!faq]- Are callouts foldable? +> Yes! In a foldable callout, the contents are hidden when the callout is collapsed. +``` + +Are callouts foldable? + +### Nested callouts + +You can nest callouts in multiple levels. + +```markdown +> [!question] Can callouts be nested? +> > [!todo] Yes!, they can. +> > > [!example] You can even use multiple layers of nesting. +``` + +Can callouts be nested? + +Yes!, they can. + +You can even use multiple layers of nesting. + +### Customize callouts + +[CSS snippets](https://help.obsidian.md/Extending+Obsidian/CSS+snippets) and [Community plugins](https://help.obsidian.md/Extending+Obsidian/Community+plugins) can define custom callouts, or even overwrite the default configuration. + +To define a custom callout, create the following CSS block: + +```css +.callout[data-callout="custom-question-type"] { + --callout-color: 0, 0, 0; + --callout-icon: lucide-alert-circle; +} +``` + +The value of the `data-callout` attribute is the type identifier you want to use, for example `[!custom-question-type]`. + +- `--callout-color` defines the background color using numbers (0–255) for red, green, and blue. +- `--callout-icon` can be an icon ID from [lucide.dev](https://lucide.dev/), or an SVG element. + +Note about lucide icon versions + +Obsidian updates Lucide icons periodically. The current version included is shown below; use these or earlier icons in custom callouts. + +Version `0.268.0` +ISC License +Copyright (c) 2020, Lucide Contributors + +SVG icons + +Instead of using a Lucide icon, you can also use a SVG element as the callout icon. + +```css +--callout-icon: '...custom svg...'; +``` + +### Supported types + +You can use several callout types and aliases. Each type comes with a different background color and icon. + +To use these default styles, replace `info` in the examples with any of these types, such as `[!tip]` or `[!warning]`. + +Unless you [Customize callouts](https://help.obsidian.md/Editing+and+formatting/Callouts#Customize%20callouts), any unsupported type defaults to the `note` type. The type identifier is case-insensitive. + +Note + +```md +> [!note] +> Lorem ipsum dolor sit amet +``` + +--- + +Abstract + +>[!abstract] +> Lorem ipsum dolor sit amet + + + +Aliases: `summary`, `tldr` + +--- + +Info + +>[!info] +> Some info tab here + + +--- + +Todo +>[!todo] +>To do list here + +--- + +Tip +>[!tip]- +>This includes a tip that people will open + + +Aliases: `hint`, `important` + +--- + +Success + +>[!success]- +>Log time here at 12:32:03 + + +Aliases: `check`, `done` + +--- + +Question + +>[!question]- +>Have a question you'd like answered? +>Well here is an answer +>- there are many +>- way to answer this +> [x]such as this + + +Aliases: `help`, `faq` + +--- + +Warning + +>[!warning] This is not a drill! + +Aliases: `caution`, `attention` + +--- + +Failure + +>[!failure] This is not working!!!! + +Aliases: `fail`, `missing` + +--- + +Danger + +>[!danger] ABOUT TO EXPLODE + +Alias: `error` + +--- + +Bug + +>[!bug]- a bug has spread +>it is infecting your computer +>and spreading to others +>taking over the world soon... + +--- + +Example + +>[!example]- a bug has wings and legs. +>it is infecting your computer +>and spreading to others +>taking over the world soon... + +--- + +Quote + +>[!quote]- You can't have Everything in life but you *can* have Anything in life. + +Alias: `cite` + +--- + + +Further Obsidian Tips: + +[Basic formatting syntax](https://help.obsidian.md/Editing+and+formatting/Basic+formatting+syntax) + +[Obsidian Flavored Markdown](https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown) + +[Style guide](https://help.obsidian.md/Contributing+to+Obsidian/Style+guide) + --- ## More Examples: diff --git a/enter/imgFiles/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif similarity index 100% rename from enter/imgFiles/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/FCFL 3D prints call 1.jpg b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/FCFL 3D prints call 1.jpg new file mode 100644 index 0000000..8ef87f5 Binary files /dev/null and b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/FCFL 3D prints call 1.jpg differ diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/FCFL 3D prints call.jpg b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/FCFL 3D prints call.jpg new file mode 100644 index 0000000..8ef87f5 Binary files /dev/null and b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/FCFL 3D prints call.jpg differ diff --git a/enter/imgFiles/Pasted image 20220703231737.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220703231737.png similarity index 100% rename from enter/imgFiles/Pasted image 20220703231737.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220703231737.png diff --git a/enter/imgFiles/Pasted image 20220705203711.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220705203711.png similarity index 100% rename from enter/imgFiles/Pasted image 20220705203711.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220705203711.png diff --git a/enter/imgFiles/Pasted image 20220708092152.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708092152.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708092152.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708092152.png diff --git a/enter/imgFiles/Pasted image 20220708092319.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708092319.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708092319.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708092319.png diff --git a/enter/imgFiles/Pasted image 20220708093923.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708093923.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708093923.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708093923.png diff --git a/enter/imgFiles/Pasted image 20220708093939.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708093939.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708093939.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708093939.png diff --git a/enter/imgFiles/Pasted image 20220708094039.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094039.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708094039.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094039.png diff --git a/enter/imgFiles/Pasted image 20220708094155.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094155.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708094155.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094155.png diff --git a/enter/imgFiles/Pasted image 20220708094636.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094636.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708094636.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094636.png diff --git a/enter/imgFiles/Pasted image 20220708094651.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094651.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708094651.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094651.png diff --git a/enter/imgFiles/Pasted image 20220708094708.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094708.png similarity index 100% rename from enter/imgFiles/Pasted image 20220708094708.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220708094708.png diff --git a/enter/imgFiles/Pasted image 20220709153922.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709153922.png similarity index 100% rename from enter/imgFiles/Pasted image 20220709153922.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709153922.png diff --git a/enter/imgFiles/Pasted image 20220709155517.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709155517.png similarity index 100% rename from enter/imgFiles/Pasted image 20220709155517.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709155517.png diff --git a/enter/imgFiles/Pasted image 20220709155559.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709155559.png similarity index 100% rename from enter/imgFiles/Pasted image 20220709155559.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709155559.png diff --git a/enter/imgFiles/Pasted image 20220709161121.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709161121.png similarity index 100% rename from enter/imgFiles/Pasted image 20220709161121.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709161121.png diff --git a/enter/imgFiles/Pasted image 20220709161448.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709161448.png similarity index 100% rename from enter/imgFiles/Pasted image 20220709161448.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220709161448.png diff --git a/enter/imgFiles/Pasted image 20220730121832.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220730121832.png similarity index 100% rename from enter/imgFiles/Pasted image 20220730121832.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220730121832.png diff --git a/enter/imgFiles/Pasted image 20220825004820.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220825004820.png similarity index 100% rename from enter/imgFiles/Pasted image 20220825004820.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220825004820.png diff --git a/enter/imgFiles/Pasted image 20220827183015.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220827183015.png similarity index 100% rename from enter/imgFiles/Pasted image 20220827183015.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220827183015.png diff --git a/enter/imgFiles/Pasted image 20220908174202.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220908174202.png similarity index 100% rename from enter/imgFiles/Pasted image 20220908174202.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20220908174202.png diff --git a/enter/imgFiles/Pasted image 20221001152049.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221001152049.png similarity index 100% rename from enter/imgFiles/Pasted image 20221001152049.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221001152049.png diff --git a/enter/imgFiles/Pasted image 20221001152106.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221001152106.png similarity index 100% rename from enter/imgFiles/Pasted image 20221001152106.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221001152106.png diff --git a/enter/imgFiles/Pasted image 20221117183151.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221117183151.png similarity index 100% rename from enter/imgFiles/Pasted image 20221117183151.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221117183151.png diff --git a/enter/imgFiles/Pasted image 20221121101944.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221121101944.png similarity index 100% rename from enter/imgFiles/Pasted image 20221121101944.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221121101944.png diff --git a/enter/imgFiles/Pasted image 20221129134110.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129134110.png similarity index 100% rename from enter/imgFiles/Pasted image 20221129134110.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129134110.png diff --git a/enter/imgFiles/Pasted image 20221129134133.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129134133.png similarity index 100% rename from enter/imgFiles/Pasted image 20221129134133.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129134133.png diff --git a/enter/imgFiles/Pasted image 20221129134332.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129134332.png similarity index 100% rename from enter/imgFiles/Pasted image 20221129134332.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129134332.png diff --git a/enter/imgFiles/Pasted image 20221129134615.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129134615.png similarity index 100% rename from enter/imgFiles/Pasted image 20221129134615.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129134615.png diff --git a/enter/imgFiles/Pasted image 20221129135814.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129135814.png similarity index 100% rename from enter/imgFiles/Pasted image 20221129135814.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129135814.png diff --git a/enter/imgFiles/Pasted image 20221129140410.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129140410.png similarity index 100% rename from enter/imgFiles/Pasted image 20221129140410.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129140410.png diff --git a/enter/imgFiles/Pasted image 20221129155214.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129155214.png similarity index 100% rename from enter/imgFiles/Pasted image 20221129155214.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129155214.png diff --git a/enter/imgFiles/Pasted image 20221129161036.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129161036.png similarity index 100% rename from enter/imgFiles/Pasted image 20221129161036.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221129161036.png diff --git a/enter/imgFiles/Pasted image 20221208133914.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221208133914.png similarity index 100% rename from enter/imgFiles/Pasted image 20221208133914.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221208133914.png diff --git a/enter/imgFiles/Pasted image 20221208182151.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221208182151.png similarity index 100% rename from enter/imgFiles/Pasted image 20221208182151.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221208182151.png diff --git a/enter/imgFiles/Pasted image 20221211145937.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221211145937.png similarity index 100% rename from enter/imgFiles/Pasted image 20221211145937.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221211145937.png diff --git a/enter/imgFiles/Pasted image 20221212135426.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221212135426.png similarity index 100% rename from enter/imgFiles/Pasted image 20221212135426.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221212135426.png diff --git a/enter/imgFiles/Pasted image 20221212141116.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221212141116.png similarity index 100% rename from enter/imgFiles/Pasted image 20221212141116.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221212141116.png diff --git a/enter/imgFiles/Pasted image 20221212141353.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221212141353.png similarity index 100% rename from enter/imgFiles/Pasted image 20221212141353.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221212141353.png diff --git a/enter/imgFiles/Pasted image 20221212171637.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221212171637.png similarity index 100% rename from enter/imgFiles/Pasted image 20221212171637.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221212171637.png diff --git a/enter/imgFiles/Pasted image 20221217144843.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221217144843.png similarity index 100% rename from enter/imgFiles/Pasted image 20221217144843.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221217144843.png diff --git a/enter/imgFiles/Pasted image 20221217154914.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221217154914.png similarity index 100% rename from enter/imgFiles/Pasted image 20221217154914.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221217154914.png diff --git a/enter/imgFiles/Pasted image 20221218205543.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221218205543.png similarity index 100% rename from enter/imgFiles/Pasted image 20221218205543.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221218205543.png diff --git a/enter/imgFiles/Pasted image 20221218210829.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221218210829.png similarity index 100% rename from enter/imgFiles/Pasted image 20221218210829.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221218210829.png diff --git a/enter/imgFiles/Pasted image 20221220153731.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221220153731.png similarity index 100% rename from enter/imgFiles/Pasted image 20221220153731.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221220153731.png diff --git a/enter/imgFiles/Pasted image 20221220153821.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221220153821.png similarity index 100% rename from enter/imgFiles/Pasted image 20221220153821.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221220153821.png diff --git a/enter/imgFiles/Pasted image 20221220154008.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221220154008.png similarity index 100% rename from enter/imgFiles/Pasted image 20221220154008.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20221220154008.png diff --git a/enter/imgFiles/Pasted image 20230105170239.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230105170239.png similarity index 100% rename from enter/imgFiles/Pasted image 20230105170239.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230105170239.png diff --git a/enter/imgFiles/Pasted image 20230105172227.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230105172227.png similarity index 100% rename from enter/imgFiles/Pasted image 20230105172227.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230105172227.png diff --git a/enter/imgFiles/Pasted image 20230111145151.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230111145151.png similarity index 100% rename from enter/imgFiles/Pasted image 20230111145151.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230111145151.png diff --git a/enter/imgFiles/Pasted image 20230206134648.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230206134648.png similarity index 100% rename from enter/imgFiles/Pasted image 20230206134648.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230206134648.png diff --git a/enter/imgFiles/Pasted image 20230214113937.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230214113937.png similarity index 100% rename from enter/imgFiles/Pasted image 20230214113937.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230214113937.png diff --git a/enter/imgFiles/Pasted image 20230214115036.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230214115036.png similarity index 100% rename from enter/imgFiles/Pasted image 20230214115036.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230214115036.png diff --git a/enter/imgFiles/Pasted image 20230215035805.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230215035805.png similarity index 100% rename from enter/imgFiles/Pasted image 20230215035805.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230215035805.png diff --git a/enter/imgFiles/Pasted image 20230215040055.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230215040055.png similarity index 100% rename from enter/imgFiles/Pasted image 20230215040055.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230215040055.png diff --git a/enter/imgFiles/Pasted image 20230215042855.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230215042855.png similarity index 100% rename from enter/imgFiles/Pasted image 20230215042855.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230215042855.png diff --git a/enter/imgFiles/Pasted image 20230222143135.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230222143135.png similarity index 100% rename from enter/imgFiles/Pasted image 20230222143135.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230222143135.png diff --git a/enter/imgFiles/Pasted image 20230222143543.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230222143543.png similarity index 100% rename from enter/imgFiles/Pasted image 20230222143543.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230222143543.png diff --git a/enter/imgFiles/Pasted image 20230222144148.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230222144148.png similarity index 100% rename from enter/imgFiles/Pasted image 20230222144148.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230222144148.png diff --git a/enter/imgFiles/Pasted image 20230222144804.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230222144804.png similarity index 100% rename from enter/imgFiles/Pasted image 20230222144804.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230222144804.png diff --git a/enter/imgFiles/Pasted image 20230224122914.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230224122914.png similarity index 100% rename from enter/imgFiles/Pasted image 20230224122914.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230224122914.png diff --git a/enter/imgFiles/Pasted image 20230315004917.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230315004917.png similarity index 100% rename from enter/imgFiles/Pasted image 20230315004917.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230315004917.png diff --git a/enter/imgFiles/Pasted image 20230408064712.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230408064712.png similarity index 100% rename from enter/imgFiles/Pasted image 20230408064712.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230408064712.png diff --git a/enter/imgFiles/Pasted image 20230408070410.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230408070410.png similarity index 100% rename from enter/imgFiles/Pasted image 20230408070410.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230408070410.png diff --git a/enter/imgFiles/Pasted image 20230421093843.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230421093843.png similarity index 100% rename from enter/imgFiles/Pasted image 20230421093843.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230421093843.png diff --git a/enter/imgFiles/Pasted image 20230422215326.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230422215326.png similarity index 100% rename from enter/imgFiles/Pasted image 20230422215326.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230422215326.png diff --git a/enter/imgFiles/Pasted image 20230501164740.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230501164740.png similarity index 100% rename from enter/imgFiles/Pasted image 20230501164740.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230501164740.png diff --git a/enter/imgFiles/Pasted image 20230505201618.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230505201618.png similarity index 100% rename from enter/imgFiles/Pasted image 20230505201618.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230505201618.png diff --git a/enter/imgFiles/Pasted image 20230505201904.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230505201904.png similarity index 100% rename from enter/imgFiles/Pasted image 20230505201904.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230505201904.png diff --git a/enter/imgFiles/Pasted image 20230505214204.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230505214204.png similarity index 100% rename from enter/imgFiles/Pasted image 20230505214204.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230505214204.png diff --git a/enter/imgFiles/Pasted image 20230517160012.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517160012.png similarity index 100% rename from enter/imgFiles/Pasted image 20230517160012.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517160012.png diff --git a/enter/imgFiles/Pasted image 20230517165043.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517165043.png similarity index 100% rename from enter/imgFiles/Pasted image 20230517165043.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517165043.png diff --git a/enter/imgFiles/Pasted image 20230517171306.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517171306.png similarity index 100% rename from enter/imgFiles/Pasted image 20230517171306.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517171306.png diff --git a/enter/imgFiles/Pasted image 20230517172518.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517172518.png similarity index 100% rename from enter/imgFiles/Pasted image 20230517172518.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517172518.png diff --git a/enter/imgFiles/Pasted image 20230517172619.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517172619.png similarity index 100% rename from enter/imgFiles/Pasted image 20230517172619.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517172619.png diff --git a/enter/imgFiles/Pasted image 20230517182829.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517182829.png similarity index 100% rename from enter/imgFiles/Pasted image 20230517182829.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230517182829.png diff --git a/enter/imgFiles/Pasted image 20230607184535.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230607184535.png similarity index 100% rename from enter/imgFiles/Pasted image 20230607184535.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230607184535.png diff --git a/enter/imgFiles/Pasted image 20230607204133.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230607204133.png similarity index 100% rename from enter/imgFiles/Pasted image 20230607204133.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230607204133.png diff --git a/enter/imgFiles/Pasted image 20230610145132.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230610145132.png similarity index 100% rename from enter/imgFiles/Pasted image 20230610145132.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230610145132.png diff --git a/enter/imgFiles/Pasted image 20230619211526.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230619211526.png similarity index 100% rename from enter/imgFiles/Pasted image 20230619211526.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230619211526.png diff --git a/enter/imgFiles/Pasted image 20230620180623.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230620180623.png similarity index 100% rename from enter/imgFiles/Pasted image 20230620180623.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230620180623.png diff --git a/enter/imgFiles/Pasted image 20230624135042.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230624135042.png similarity index 100% rename from enter/imgFiles/Pasted image 20230624135042.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230624135042.png diff --git a/enter/imgFiles/Pasted image 20230624141105.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230624141105.png similarity index 100% rename from enter/imgFiles/Pasted image 20230624141105.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230624141105.png diff --git a/enter/imgFiles/Pasted image 20230624141130.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230624141130.png similarity index 100% rename from enter/imgFiles/Pasted image 20230624141130.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230624141130.png diff --git a/enter/imgFiles/Pasted image 20230624141203.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230624141203.png similarity index 100% rename from enter/imgFiles/Pasted image 20230624141203.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230624141203.png diff --git a/enter/imgFiles/Pasted image 20230625163218.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230625163218.png similarity index 100% rename from enter/imgFiles/Pasted image 20230625163218.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230625163218.png diff --git a/enter/imgFiles/Pasted image 20230625163413.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230625163413.png similarity index 100% rename from enter/imgFiles/Pasted image 20230625163413.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230625163413.png diff --git a/enter/imgFiles/Pasted image 20230626034045.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626034045.png similarity index 100% rename from enter/imgFiles/Pasted image 20230626034045.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626034045.png diff --git a/enter/imgFiles/Pasted image 20230626071733.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626071733.png similarity index 100% rename from enter/imgFiles/Pasted image 20230626071733.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626071733.png diff --git a/enter/imgFiles/Pasted image 20230626101300.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626101300.png similarity index 100% rename from enter/imgFiles/Pasted image 20230626101300.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626101300.png diff --git a/enter/imgFiles/Pasted image 20230626101329.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626101329.png similarity index 100% rename from enter/imgFiles/Pasted image 20230626101329.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626101329.png diff --git a/enter/imgFiles/Pasted image 20230626195256.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626195256.png similarity index 100% rename from enter/imgFiles/Pasted image 20230626195256.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230626195256.png diff --git a/enter/imgFiles/Pasted image 20230706133139.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230706133139.png similarity index 100% rename from enter/imgFiles/Pasted image 20230706133139.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230706133139.png diff --git a/enter/imgFiles/Pasted image 20230710132617.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230710132617.png similarity index 100% rename from enter/imgFiles/Pasted image 20230710132617.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230710132617.png diff --git a/enter/imgFiles/Pasted image 20230714005144.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714005144.png similarity index 100% rename from enter/imgFiles/Pasted image 20230714005144.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714005144.png diff --git a/enter/imgFiles/Pasted image 20230714160013.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714160013.png similarity index 100% rename from enter/imgFiles/Pasted image 20230714160013.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714160013.png diff --git a/enter/imgFiles/Pasted image 20230714160028.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714160028.png similarity index 100% rename from enter/imgFiles/Pasted image 20230714160028.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714160028.png diff --git a/enter/imgFiles/Pasted image 20230714171308.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714171308.png similarity index 100% rename from enter/imgFiles/Pasted image 20230714171308.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714171308.png diff --git a/enter/imgFiles/Pasted image 20230714193655.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714193655.png similarity index 100% rename from enter/imgFiles/Pasted image 20230714193655.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230714193655.png diff --git a/enter/imgFiles/Pasted image 20230715021300.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230715021300.png similarity index 100% rename from enter/imgFiles/Pasted image 20230715021300.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230715021300.png diff --git a/enter/imgFiles/Pasted image 20230716192907.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716192907.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716192907.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716192907.png diff --git a/enter/imgFiles/Pasted image 20230716195921.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716195921.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716195921.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716195921.png diff --git a/enter/imgFiles/Pasted image 20230716200157.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200157.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716200157.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200157.png diff --git a/enter/imgFiles/Pasted image 20230716200213.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200213.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716200213.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200213.png diff --git a/enter/imgFiles/Pasted image 20230716200429.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200429.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716200429.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200429.png diff --git a/enter/imgFiles/Pasted image 20230716200817.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200817.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716200817.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200817.png diff --git a/enter/imgFiles/Pasted image 20230716200829.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200829.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716200829.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716200829.png diff --git a/enter/imgFiles/Pasted image 20230716214554.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716214554.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716214554.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716214554.png diff --git a/enter/imgFiles/Pasted image 20230716220910.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716220910.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716220910.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716220910.png diff --git a/enter/imgFiles/Pasted image 20230716230115.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716230115.png similarity index 100% rename from enter/imgFiles/Pasted image 20230716230115.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230716230115.png diff --git a/enter/imgFiles/Pasted image 20230717000143.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230717000143.png similarity index 100% rename from enter/imgFiles/Pasted image 20230717000143.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230717000143.png diff --git a/enter/imgFiles/Pasted image 20230717104923.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230717104923.png similarity index 100% rename from enter/imgFiles/Pasted image 20230717104923.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230717104923.png diff --git a/enter/imgFiles/Pasted image 20230717132307.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230717132307.png similarity index 100% rename from enter/imgFiles/Pasted image 20230717132307.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230717132307.png diff --git a/enter/imgFiles/Pasted image 20230717204615.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230717204615.png similarity index 100% rename from enter/imgFiles/Pasted image 20230717204615.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230717204615.png diff --git a/enter/imgFiles/Pasted image 20230718105051.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230718105051.png similarity index 100% rename from enter/imgFiles/Pasted image 20230718105051.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230718105051.png diff --git a/enter/imgFiles/Pasted image 20230721173054.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230721173054.png similarity index 100% rename from enter/imgFiles/Pasted image 20230721173054.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230721173054.png diff --git a/enter/imgFiles/Pasted image 20230721173106.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230721173106.png similarity index 100% rename from enter/imgFiles/Pasted image 20230721173106.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230721173106.png diff --git a/enter/imgFiles/Pasted image 20230724024452.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230724024452.png similarity index 100% rename from enter/imgFiles/Pasted image 20230724024452.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230724024452.png diff --git a/enter/imgFiles/Pasted image 20230724153145.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230724153145.png similarity index 100% rename from enter/imgFiles/Pasted image 20230724153145.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230724153145.png diff --git a/enter/imgFiles/Pasted image 20230802150926.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230802150926.png similarity index 100% rename from enter/imgFiles/Pasted image 20230802150926.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230802150926.png diff --git a/enter/imgFiles/Pasted image 20230804094038.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804094038.png similarity index 100% rename from enter/imgFiles/Pasted image 20230804094038.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804094038.png diff --git a/enter/imgFiles/Pasted image 20230804094119.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804094119.png similarity index 100% rename from enter/imgFiles/Pasted image 20230804094119.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804094119.png diff --git a/enter/imgFiles/Pasted image 20230804094145.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804094145.png similarity index 100% rename from enter/imgFiles/Pasted image 20230804094145.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804094145.png diff --git a/enter/imgFiles/Pasted image 20230804094231.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804094231.png similarity index 100% rename from enter/imgFiles/Pasted image 20230804094231.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804094231.png diff --git a/enter/imgFiles/Pasted image 20230804095049.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804095049.png similarity index 100% rename from enter/imgFiles/Pasted image 20230804095049.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804095049.png diff --git a/enter/imgFiles/Pasted image 20230804095319.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804095319.png similarity index 100% rename from enter/imgFiles/Pasted image 20230804095319.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230804095319.png diff --git a/enter/imgFiles/Pasted image 20230808115623.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230808115623.png similarity index 100% rename from enter/imgFiles/Pasted image 20230808115623.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230808115623.png diff --git a/enter/imgFiles/Pasted image 20230809185553.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230809185553.png similarity index 100% rename from enter/imgFiles/Pasted image 20230809185553.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230809185553.png diff --git a/enter/imgFiles/Pasted image 20230810192136.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810192136.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810192136.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810192136.png diff --git a/enter/imgFiles/Pasted image 20230810193826.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193826.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810193826.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193826.png diff --git a/enter/imgFiles/Pasted image 20230810193908.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193908.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810193908.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193908.png diff --git a/enter/imgFiles/Pasted image 20230810193916.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193916.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810193916.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193916.png diff --git a/enter/imgFiles/Pasted image 20230810193924.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193924.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810193924.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193924.png diff --git a/enter/imgFiles/Pasted image 20230810193931.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193931.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810193931.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810193931.png diff --git a/enter/imgFiles/Pasted image 20230810204012.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810204012.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810204012.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810204012.png diff --git a/enter/imgFiles/Pasted image 20230810210354.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810210354.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810210354.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810210354.png diff --git a/enter/imgFiles/Pasted image 20230810210621.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810210621.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810210621.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810210621.png diff --git a/enter/imgFiles/Pasted image 20230810210631.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810210631.png similarity index 100% rename from enter/imgFiles/Pasted image 20230810210631.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230810210631.png diff --git a/enter/imgFiles/Pasted image 20230815110450.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230815110450.png similarity index 100% rename from enter/imgFiles/Pasted image 20230815110450.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230815110450.png diff --git a/enter/imgFiles/Pasted image 20230815154156.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230815154156.png similarity index 100% rename from enter/imgFiles/Pasted image 20230815154156.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230815154156.png diff --git a/enter/imgFiles/Pasted image 20230816173235.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230816173235.png similarity index 100% rename from enter/imgFiles/Pasted image 20230816173235.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230816173235.png diff --git a/enter/imgFiles/Pasted image 20230816174402.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230816174402.png similarity index 100% rename from enter/imgFiles/Pasted image 20230816174402.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230816174402.png diff --git a/enter/imgFiles/Pasted image 20230817040651.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817040651.png similarity index 100% rename from enter/imgFiles/Pasted image 20230817040651.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817040651.png diff --git a/enter/imgFiles/Pasted image 20230817142703.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817142703.png similarity index 100% rename from enter/imgFiles/Pasted image 20230817142703.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817142703.png diff --git a/enter/imgFiles/Pasted image 20230817143911.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817143911.png similarity index 100% rename from enter/imgFiles/Pasted image 20230817143911.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817143911.png diff --git a/enter/imgFiles/Pasted image 20230817182641.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817182641.png similarity index 100% rename from enter/imgFiles/Pasted image 20230817182641.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817182641.png diff --git a/enter/imgFiles/Pasted image 20230817184323.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817184323.png similarity index 100% rename from enter/imgFiles/Pasted image 20230817184323.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230817184323.png diff --git a/enter/imgFiles/Pasted image 20230818000111.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230818000111.png similarity index 100% rename from enter/imgFiles/Pasted image 20230818000111.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230818000111.png diff --git a/enter/imgFiles/Pasted image 20230818202254.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230818202254.png similarity index 100% rename from enter/imgFiles/Pasted image 20230818202254.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230818202254.png diff --git a/enter/imgFiles/Pasted image 20230818202825.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230818202825.png similarity index 100% rename from enter/imgFiles/Pasted image 20230818202825.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230818202825.png diff --git a/enter/imgFiles/Pasted image 20230822101036.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230822101036.png similarity index 100% rename from enter/imgFiles/Pasted image 20230822101036.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230822101036.png diff --git a/enter/imgFiles/Pasted image 20230822102448.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230822102448.png similarity index 100% rename from enter/imgFiles/Pasted image 20230822102448.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230822102448.png diff --git a/enter/imgFiles/Pasted image 20230822102804.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230822102804.png similarity index 100% rename from enter/imgFiles/Pasted image 20230822102804.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230822102804.png diff --git a/enter/imgFiles/Pasted image 20230822103145.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230822103145.png similarity index 100% rename from enter/imgFiles/Pasted image 20230822103145.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230822103145.png diff --git a/enter/imgFiles/Pasted image 20230828113948.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230828113948.png similarity index 100% rename from enter/imgFiles/Pasted image 20230828113948.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230828113948.png diff --git a/enter/imgFiles/Pasted image 20230901074121.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901074121.png similarity index 100% rename from enter/imgFiles/Pasted image 20230901074121.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901074121.png diff --git a/enter/imgFiles/Pasted image 20230901113142.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901113142.png similarity index 100% rename from enter/imgFiles/Pasted image 20230901113142.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901113142.png diff --git a/enter/imgFiles/Pasted image 20230901121505.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901121505.png similarity index 100% rename from enter/imgFiles/Pasted image 20230901121505.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901121505.png diff --git a/enter/imgFiles/Pasted image 20230901124958.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901124958.png similarity index 100% rename from enter/imgFiles/Pasted image 20230901124958.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901124958.png diff --git a/enter/imgFiles/Pasted image 20230901130417.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901130417.png similarity index 100% rename from enter/imgFiles/Pasted image 20230901130417.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901130417.png diff --git a/enter/imgFiles/Pasted image 20230901131941.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901131941.png similarity index 100% rename from enter/imgFiles/Pasted image 20230901131941.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901131941.png diff --git a/enter/imgFiles/Pasted image 20230901141639.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901141639.png similarity index 100% rename from enter/imgFiles/Pasted image 20230901141639.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230901141639.png diff --git a/enter/imgFiles/Pasted image 20230904232536.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230904232536.png similarity index 100% rename from enter/imgFiles/Pasted image 20230904232536.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230904232536.png diff --git a/enter/imgFiles/Pasted image 20230906115000.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230906115000.png similarity index 100% rename from enter/imgFiles/Pasted image 20230906115000.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230906115000.png diff --git a/enter/imgFiles/Pasted image 20230906115225.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230906115225.png similarity index 100% rename from enter/imgFiles/Pasted image 20230906115225.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230906115225.png diff --git a/enter/imgFiles/Pasted image 20230906120514.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230906120514.png similarity index 100% rename from enter/imgFiles/Pasted image 20230906120514.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230906120514.png diff --git a/enter/imgFiles/Pasted image 20230906120515.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230906120515.png similarity index 100% rename from enter/imgFiles/Pasted image 20230906120515.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230906120515.png diff --git a/enter/imgFiles/Pasted image 20230909180354.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230909180354.png similarity index 100% rename from enter/imgFiles/Pasted image 20230909180354.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230909180354.png diff --git a/enter/imgFiles/Pasted image 20230912012219.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230912012219.png similarity index 100% rename from enter/imgFiles/Pasted image 20230912012219.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230912012219.png diff --git a/enter/imgFiles/Pasted image 20230918142440.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230918142440.png similarity index 100% rename from enter/imgFiles/Pasted image 20230918142440.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230918142440.png diff --git a/enter/imgFiles/Pasted image 20230919232958.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230919232958.png similarity index 100% rename from enter/imgFiles/Pasted image 20230919232958.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230919232958.png diff --git a/enter/imgFiles/Pasted image 20230924025824.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230924025824.png similarity index 100% rename from enter/imgFiles/Pasted image 20230924025824.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230924025824.png diff --git a/enter/imgFiles/Pasted image 20230928132648.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230928132648.png similarity index 100% rename from enter/imgFiles/Pasted image 20230928132648.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230928132648.png diff --git a/enter/imgFiles/Pasted image 20230930015932.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230930015932.png similarity index 100% rename from enter/imgFiles/Pasted image 20230930015932.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230930015932.png diff --git a/enter/imgFiles/Pasted image 20230930133113.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230930133113.png similarity index 100% rename from enter/imgFiles/Pasted image 20230930133113.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20230930133113.png diff --git a/enter/imgFiles/Pasted image 20231010141612.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231010141612.png similarity index 100% rename from enter/imgFiles/Pasted image 20231010141612.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231010141612.png diff --git a/enter/imgFiles/Pasted image 20231011091043.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231011091043.png similarity index 100% rename from enter/imgFiles/Pasted image 20231011091043.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231011091043.png diff --git a/enter/imgFiles/Pasted image 20231022162536.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231022162536.png similarity index 100% rename from enter/imgFiles/Pasted image 20231022162536.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231022162536.png diff --git a/enter/imgFiles/Pasted image 20231028152700.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231028152700.png similarity index 100% rename from enter/imgFiles/Pasted image 20231028152700.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231028152700.png diff --git a/enter/imgFiles/Pasted image 20231101131959.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231101131959.png similarity index 100% rename from enter/imgFiles/Pasted image 20231101131959.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231101131959.png diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120103915.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120103915.png new file mode 100644 index 0000000..a3048cd Binary files /dev/null and b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120103915.png differ diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120103937.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120103937.png new file mode 100644 index 0000000..c441858 Binary files /dev/null and b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120103937.png differ diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120104008.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120104008.png new file mode 100644 index 0000000..1d0db3a Binary files /dev/null and b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231120104008.png differ diff --git a/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231122170526.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231122170526.png new file mode 100644 index 0000000..91c69a1 Binary files /dev/null and b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231122170526.png differ diff --git a/enter/imgFiles/Untitled.png b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Untitled.png similarity index 100% rename from enter/imgFiles/Untitled.png rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Untitled.png diff --git a/enter/imgFiles/grey-darkgrey-S.svg b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/grey-darkgrey-S.svg similarity index 100% rename from enter/imgFiles/grey-darkgrey-S.svg rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/grey-darkgrey-S.svg diff --git a/enter/imgFiles/orange-grey-S.svg b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/orange-grey-S.svg similarity index 100% rename from enter/imgFiles/orange-grey-S.svg rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/orange-grey-S.svg diff --git a/enter/imgFiles/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4 b/enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4 similarity index 100% rename from enter/imgFiles/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4 rename to enter/Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4 diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/3D Printing at Lab Middle School.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/3D Printing at Lab Middle School.md new file mode 100644 index 0000000..d667a32 --- /dev/null +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/3D Printing at Lab Middle School.md @@ -0,0 +1,22 @@ + + +# Materials + +- FlashForge Finder +- Makerbot Sketch + +# Activities + + + +# Projects + + +# Field Trips + + + +--- + + +Additional Resources: \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/Identify Parts of a 3D Printing.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/Identify Parts of a 3D Printing.md new file mode 100644 index 0000000..3ea4d9d --- /dev/null +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/Identify Parts of a 3D Printing.md @@ -0,0 +1,13 @@ + +3d printing lesson plan  +![[Pasted image 20231120103937.png]] +- Identify parts of a 3d printer makerbot pdf  +- IDE tofu parts of a 3d printer fusion pdf +- Identify parts of a 3d printer makerbot pdf  + + [https://m.youtube.com/watch?v=b_rI2lkkdXo](https://m.youtube.com/watch?v=b_rI2lkkdXo) + + +![[Pasted image 20231120103915.png]] +[https://www.schrockguide.net/uploads/3/9/2/2/392267/makerbot-educators-guidebook_third_edition.pdf](https://www.schrockguide.net/uploads/3/9/2/2/392267/makerbot-educators-guidebook_third_edition.pdf) +![[Pasted image 20231120104008.png]] \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/Week 10 - Guest Speaker Makerspace.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/Week 10 - Guest Speaker Makerspace.md new file mode 100644 index 0000000..d0a85a8 --- /dev/null +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/3d printing/Week 10 - Guest Speaker Makerspace.md @@ -0,0 +1,11 @@ + +Introduce the class to the concept of a makerspace and show that one of their prints are being printed there! + +Get someone ready and call and have them take the class around to their various facilities and tools that that 3D printing creators often need to use + + +**![[FCFL 3D prints call.jpg]]** + + + +Leave room for questions. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/Manhattan Youth.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/Manhattan Youth.md index 5d5d4a8..bcee3b1 100644 --- a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/Manhattan Youth.md +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/Manhattan Youth.md @@ -1,4 +1,16 @@ -Where I currently work as a STEM Middle School teacher. :-) +**Fall 2023** - Where I currently work as a STEM Middle School teacher. :-) +## Lab Middle School +- [3D printing ](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2F3d%20printing%2F3D%20Printing%20at%20Lab%20Middle%20School) +- [Web Design ](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fweb%20design%2FCoding%20%20%26%20Web%20Design) + +## Robert F. Wagner Middle School + +- [Web Design ](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fweb%20design%2FCoding%20%20%26%20Web%20Design) + +## Yorkville Middle School + +- [Coding](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fweb%20design%2FCoding%20%20%26%20Web%20Design) +-[ Digital Art ](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fdigital%20art%2FDigital%20Art%20at%20Yorkville%20Middle%20School) \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/digital art/Digital Art at Yorkville Middle School.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/digital art/Digital Art at Yorkville Middle School.md new file mode 100644 index 0000000..c28283f --- /dev/null +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/digital art/Digital Art at Yorkville Middle School.md @@ -0,0 +1,23 @@ +# Materials + +- Macbook Airs +- Imagination! +-[ Integrated Whiteboard tools](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fdigital%20art%2FIntegrated%20Whiteboard%20Tools) + +# Activities + +- Create your own vision board for artist + + +# Projects + +- + +# Field Trips +- Art Museum + + +--- + + +Additional Resources: diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Coding & Web Design.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Coding & Web Design.md new file mode 100644 index 0000000..d88898b --- /dev/null +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Coding & Web Design.md @@ -0,0 +1,24 @@ + + +# Materials & Games + +- computers +- Imagination! +- google docs + +# Activities & Projects + +- create an html website +- [Group Project](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fweb%20design%2Fweek%205%20web%20design%2FHTML%20Group%20Project) + + + +--- + + +Additional Resources: + +- [Week 3 Slides](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fweb%20design%2FWeek%203%20Slides) +- [Week 5 Slides](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fweb%20design%2Fweek%205%20web%20design%2FHTML%20%26%20CSS%20Tricks) +- [Week 7 Slides ](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fweb%20design%2FWeek%207%20Slides) +- [Review](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FProject%20Vault%2FCurrent%20Occupations%2FManhattan%20Youth%2Fweb%20design%2FReview%20%26%20Putting%20it%20all%20together) diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Review & Putting it all together.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Review & Putting it all together.md new file mode 100644 index 0000000..9a4f7d5 --- /dev/null +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Review & Putting it all together.md @@ -0,0 +1,192 @@ + +# Web Design with Shway ! +Welcome back. 😁 +
    + +![gif](https://c.tenor.com/MS_AYz3G8t4AAAAC/tenor.gif) + +--- +## WHAT DID WE LEARN: + +- AIDEN - LAST CLASS - GAMES IN SCRATCH +- LUKE - IN THE BEGINNING - LEARNED GITHUB (tried) +- GRAHAM - Ended up putting it in GOOGLE DOCS, and then we used html.viewer.net +- MADDUX - ` ` THE very FIRST line of an html document (thanks luke) + + + +--- + + +HAT DID WE LEARN (part 2): + +- MADDUX - ` ` THE very FIRST line of an html document (thanks luke) +- LUCAS - THE 2nd line is always + +``` + + + + + +``` + +- JUDE - EVERYTHING goes in between the html "tags" +- Tomer - What does the title do? It creates the literal title of your webpage (like the tab title) +- + +--- + + +# What did we learn part 3? +Misha - How to we embed vidoes/games into our site: (we go into the iframe code) + + + + +How do we input an image? + +```html + + + +Hi hello + + + + + +``` + + + +--- + +What did we learn part 3? + +How do we make different size fonts in html ? + +``` + +

    TEXT

    + +

    smaller test>

    + +``` + +

    TEXT

    + +

    smaller text

    +

    even smaller text

    + +
    even smaller text
    + +How do we change the background color? + +```html + + + + + + +  + + + + + + + + + +``` + + + +--- + + +WHAT WE NEED HELP WITH: + + +- + +--- + + +WHAT THE NEXT TRIMESTER IS GOING TO BE: + + +- + + + +--- + + + + +STEP 1: Open up a google doc, images & background color. + +[https://html.onlineviewer.net/](https://html.onlineviewer.net/) + + +```html +    + +  + +  +

    Blah balah

      + + + + + + +``` + + +--- + +### STEP 2: Adding tables & embedding games + videos! + +We have all heard about Scratch? Played games last week? +Let's play geometry dash --> [Geometry Dash ](https://scratch.mit.edu/projects/835488610/) + +But **On our website!** :D + +*Add your own games here* + +```html +    + +  + +  +

    Blah balah

      +

    Lorem ipsum about random stuff that interests me.

    + +

    Geometry Dash Blah

    + + + + + +``` + + + +--- + + +### STEP 3: Publishing the website & additional CSS.  + +[https://neocities.org/browse](https://neocities.org/browse)** + +--- + +### Step 4: Additional Tips + +* Go to [https://html-online.com/editor/](https://html-online.com/editor/) to learn about adding tables. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 3 Slides.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Week 3 Slides.md similarity index 95% rename from enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 3 Slides.md rename to enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Week 3 Slides.md index a0f4ce6..c4a0ee2 100644 --- a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 3 Slides.md +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Week 3 Slides.md @@ -17,7 +17,7 @@ Today we are going to start programming! -![[imgFiles/Pasted image 20231010141612.png]] +![[Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231010141612.png]] - HTML - the content and "bones" of a website diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 7 Slides.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Week 7 Slides.md similarity index 94% rename from enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 7 Slides.md rename to enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Week 7 Slides.md index 9501a31..4623a85 100644 --- a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/Week 7 Slides.md +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/Week 7 Slides.md @@ -36,7 +36,7 @@ Let me know if you'd like help with your website. -![[imgFiles/Pasted image 20231010141612.png]] +![[Coding Tips (Classical)/Project Vault/About Obsidian/imgFiles/Pasted image 20231010141612.png]] - HTML - the content and "bones" of a website diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML & CSS Tricks.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/week 5 web design/HTML & CSS Tricks.md similarity index 100% rename from enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML & CSS Tricks.md rename to enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/week 5 web design/HTML & CSS Tricks.md diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML Group Project.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/week 5 web design/HTML Group Project.md similarity index 100% rename from enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/HTML Group Project.md rename to enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/week 5 web design/HTML Group Project.md diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/THE link.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/week 5 web design/THE link.md similarity index 100% rename from enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/week 5 web design/THE link.md rename to enter/Coding Tips (Classical)/Project Vault/Current Occupations/Manhattan Youth/web design/WD Resources/week 5 web design/THE link.md diff --git a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Main Page.md b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Main Page.md index 082b157..a78aacc 100644 --- a/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Main Page.md +++ b/enter/Coding Tips (Classical)/Project Vault/Current Occupations/Website Projects/hi.shwethajayaraj/Main Page.md @@ -4,12 +4,15 @@ dg-home: true dg-publish: true --- +[Notes](https://www.shw3tha.lol/notes) | [Source Code](http://git.shwethajayaraj.com:3000/shway/netlify-hi) | [Credits](https://starwarsintrogenerator.com/scroller?i=B!mpoh!ujnf!bhp-!jo!b!hbmbyz!gbs-!%0Agbs!bxbz%2F%2F%2F%2Fdbmmfe!Dbmjgpsojb%2F%2F%2F!&t=Tixfuib!xbt!cpso&e=Njoj.tfsjft!JW%3B!&h=Uif!mbtu!HSBUVJUZ&p=%0AJu!xbt!uif!Dsfejut!Fsb!.!b!ujnf!xifsf!sjhiugvm!dsfeju!jt!BDUVBMMZ!usvmz!hjwfo!up!bmm!uif!pqfo.tpvsdf!dpousjcvupst!uibu!ifmqfe!eftjho!uif!tjnqmf!tjuf!uibu!zpv!xfsf!kvtu!tp!ibqqfojoh!up!mppl!bu%2F%0A%0AUibol!zpv!up!uif!dsfbupst!pg!Pctjejbo%2F%0A%0AUibol!zpv!up!uif!efwfmpqfs!pg!uif!Ejhjubm!Hbsefo-!uif!qmvhjo!uispvhi!xijdi!J!efqmpzfe!nz!Pctjejbo!opuft!uispvhi%2F%0A%0AUibolt!up!Sjdibse!Tubmmnbo%2F!Gps!cfjoh!uif!mfbefs!pg!uif!Sfcfm!Bsnz-!gps!nbljoh!HOV!%27!psjhjobups!pg!bmm!sjhiut!sfwfstfe%2F%0A%0AUibol!zpv!up!uif!Jdpot9%2Fdpn!xifsf!J!hpu!nz!S3E3!%2Ftwh!jdpo!gspn%2F!%0A%0AUibol!zpv!up!efwfmpqfst!pg!dvufsdpvoufs%2Fdpn!gps!ejtusjcvujoh!gsff!IUNM!iju!dpvoufst!bt!xfmm%2F!Uifjs!qsftfodf!usvmz!nblft!nf!cfmjfwf!uibu!uif!Gpsdf!jt!tuspoh!po!pvs!tjef%2F!%0A%0A%0AUibol!zpv!up!uif!efwfmpqfst!xip!nbef!Ofumjgz!%27!Wfsdfm%2F!%27!Uibol!zpv!up!dsfbupst!pg!Nbjmdijnq%2F!Uifz!tubsufe!uif!PH!f.nbjm!cvtjoftt!cbdl!jo!uif!ebz%2F!Uifz!cpputusbqqfe-!tuvdl!ju!uispvhi!%27!uifo!cfdbnf!wjdupsjpvt%2F!Bo!benjsbcmf!hpbm!gps!tpnfpof!mjlf!nf!up!mppl!vq!up!bt!J!gbdf!uif!Fnqjsf%2F!%27!gps!nf!up!iptu!nz!epnbjo!po%2F!%0A%0AB!uibolt!up!uif!uifnf!efwfmpqfst!%27!!eftjhofst!pg!uif!dvssfou!Pctjejbo!uifnf!J%28n!vtjoh%2F!Ejtusbdujoh!Kbccb!uif!Ivu!cz!mppljoh!qsfuuz%2F%0A!!!!!!%0AUibol!zpv!up!Obplp!Ublfvdij-!uif!bvuips!pg!Tbjmps!Nppo-!xip!nbef!nf!gjstu!cfmjfwf!jo!b!wvmofsbcmf!Nbhjdbm!Hjsm!xip!fwfouvbmmz!pof!ebz!hspxt!vq!up!cfdpnf!tuspoh%2F!%0A%0AUibol!zpv!up!Hfpshf!Mvdbt!gps!nbljoh!uif!Tubs!Xbst!tfsjft%2F%0A%0A!Uibol!zpv!up!Ofpqfut%2Fdpn!gps!gjstu!usbjojoh!nf!jo!uif!Kfej!Bsut!pg!IUNM!xifo!J!xbt!23%2F!Uibol!zpv!up!bmm!pg!nz!ufbdifst%2F%0A%0A%0AGjobmmz-!uibolt!up!zpv!gps!bduvbmmz!nbljoh!ju!uijt!gbs!up!dbsf!bcpvu!xip!hfut!uibolfe!gps!uifjs!pgufo!pqfo.tpvsdfe!%27!voqbje!dpousjcvujpot!gps!qfpqmf!mjlf!nf!up!vtf%2F!%0A%0AUif!Gpsdf!jt!tuspoh!gps!uiptf!uibu!usfbe!po!uif!qbui!pg!uif!Mjhiu!Tjef%2F!J%28n!wfsz!hsbufgvm%2F&s=20) + + #### Hi! Thanks for stopping by. ![c3p0](https://media.giphy.com/media/3oOWASkCzFuP6/giphy.gif?cid=ecf05e47clrhu097v44uwxnqhw1n977800c83ca9xhyus38e&ep=v1_gifs_search&rid=giphy.gif&ct=g) -Hello. Ny name is Shwetha! I love Star Wars, Neopets, & Sailor Moon. 🌙I loved playing Neopets as a kid which turned out to be helpful as it trained me to live in an increasingly virtual world. I like to make impact in the physical world a bit more nowadays. +Hello. Ny name is Shwetha! I love Star Wars, learning stuff, Neopets, playing music, & Sailor Moon. 🌙 My CV/resume for what I research & do professionally can be found [[pdf |here]]. -- my [[pdf|CV/resume]] for what I research & do professionally. +I am a programmer and research engineer based in NYC. Most recently I taught quantum computing full-time. I still teach and develop various programs in Manhattan. ^-^ >[!bug]+ Programming Guides & Niche Machine Optimizations: @@ -17,22 +20,19 @@ Hello. Ny name is Shwetha! I love Star Wars, Neopets, & Sailor Moon. 🌙I loved > - [[About terminal| The Terminal]] is my friend. 👾 > - This site is where my[ git server lives as well](http://git.shwethajayaraj.com:3000/) if you'd like to collaborate with me! 🤝 > - My rabbit hole of [[Quantum Stuff| quantum stuff ]]. 🕳️ -> - 📖This site will be where [my public notes are posted.](http://git.shwethajayaraj.com:3000/shway/Notepad) Eventually. +> - 📖 I'm working on $ai$ for small things. I'll post it [here](https://www.shw3tha.lol/). May the Force be with you. 💫 --- -This site is written by me in Markdown & HTML via [Obsidian](https://obsidian.md/). The theme is currently: `Serenity`. [Gratitude.](https://starwarsintrogenerator.com/scroller?i=B!mpoh!ujnf!bhp-!jo!b!hbmbyz!gbs-!%0Agbs!bxbz%2F%2F%2F%2Fdbmmfe!Dbmjgpsojb%2F%2F%2F!&t=Tixfuib!xbt!cpso&e=Njoj.tfsjft!JW%3B!&h=Uif!mbtu!HSBUVJUZ&p=%0AJu!xbt!uif!Dsfejut!Fsb!.!b!ujnf!xifsf!sjhiugvm!dsfeju!jt!BDUVBMMZ!usvmz!hjwfo!up!bmm!uif!pqfo.tpvsdf!dpousjcvupst!uibu!ifmqfe!eftjho!uif!tjnqmf!tjuf!uibu!zpv!xfsf!kvtu!tp!ibqqfojoh!up!mppl!bu%2F%0A%0AUibol!zpv!up!uif!dsfbupst!pg!Pctjejbo%2F%0A%0AUibol!zpv!up!uif!efwfmpqfs!pg!uif!Ejhjubm!Hbsefo-!uif!qmvhjo!uispvhi!xijdi!J!efqmpzfe!nz!Pctjejbo!opuft!uispvhi%2F%0A%0AUibolt!up!Sjdibse!Tubmmnbo%2F!Gps!cfjoh!uif!mfbefs!pg!uif!Sfcfm!Bsnz-!gps!nbljoh!HOV!%27!psjhjobups!pg!bmm!sjhiut!sfwfstfe%2F%0A%0AUibol!zpv!up!uif!Jdpot9%2Fdpn!xifsf!J!hpu!nz!S3E3!%2Ftwh!jdpo!gspn%2F!%0A%0AUibol!zpv!up!efwfmpqfst!pg!dvufsdpvoufs%2Fdpn!gps!ejtusjcvujoh!gsff!IUNM!iju!dpvoufst!bt!xfmm%2F!Uifjs!qsftfodf!usvmz!nblft!nf!cfmjfwf!uibu!uif!Gpsdf!jt!tuspoh!po!pvs!tjef%2F!%0A%0A%0AUibol!zpv!up!uif!efwfmpqfst!xip!nbef!Ofumjgz!%27!Wfsdfm%2F!%27!Uibol!zpv!up!dsfbupst!pg!Nbjmdijnq%2F!Uifz!tubsufe!uif!PH!f.nbjm!cvtjoftt!cbdl!jo!uif!ebz%2F!Uifz!cpputusbqqfe-!tuvdl!ju!uispvhi!%27!uifo!cfdbnf!wjdupsjpvt%2F!Bo!benjsbcmf!hpbm!gps!tpnfpof!mjlf!nf!up!mppl!vq!up!bt!J!gbdf!uif!Fnqjsf%2F!%27!gps!nf!up!iptu!nz!epnbjo!po%2F!%0A%0AB!uibolt!up!uif!uifnf!efwfmpqfst!%27!!eftjhofst!pg!uif!dvssfou!Pctjejbo!uifnf!J%28n!vtjoh%2F!Ejtusbdujoh!Kbccb!uif!Ivu!cz!mppljoh!qsfuuz%2F%0A!!!!!!%0AUibol!zpv!up!Obplp!Ublfvdij-!uif!bvuips!pg!Tbjmps!Nppo-!xip!nbef!nf!gjstu!cfmjfwf!jo!b!wvmofsbcmf!Nbhjdbm!Hjsm!xip!fwfouvbmmz!pof!ebz!hspxt!vq!up!cfdpnf!tuspoh%2F!%0A%0AUibol!zpv!up!Hfpshf!Mvdbt!gps!nbljoh!uif!Tubs!Xbst!tfsjft%2F%0A%0A!Uibol!zpv!up!Ofpqfut%2Fdpn!gps!gjstu!usbjojoh!nf!jo!uif!Kfej!Bsut!pg!IUNM!xifo!J!xbt!23%2F!Uibol!zpv!up!bmm!pg!nz!ufbdifst%2F%0A%0A%0AGjobmmz-!uibolt!up!zpv!gps!bduvbmmz!nbljoh!ju!uijt!gbs!up!dbsf!bcpvu!xip!hfut!uibolfe!gps!uifjs!pgufo!pqfo.tpvsdfe!%27!voqbje!dpousjcvujpot!gps!qfpqmf!mjlf!nf!up!vtf%2F!%0A%0AUif!Gpsdf!jt!tuspoh!gps!uiptf!uibu!usfbe!po!uif!qbui!pg!uif!Mjhiu!Tjef%2F!J%28n!wfsz!hsbufgvm%2F&s=20) - -Page Visits: # +You are visitor #: visitor counter >[!info]- I respect your right to privacy. ->I place no trackers or analytics on this site to aggregate or collect any of your personal data. +>Practice internet freedom safely (third)! I try to place no trackers or analytics on this site to aggregate or collect any of your personal data. No promises on what other third party softwares might do though. > - I will place retro 2000's hit counters instead > - You fondly reminisce back to a time when the internet was free & clicking on a site didn't cost anything. Rejoice! 🤠 - Ⓚ shwethajayaraj.com. 1995-2023. All rights reversed. - +Ⓚ shwethajayaraj.com. 1995-2023. All rights reversed. diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Aliases.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Aliases.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Aliases.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Aliases.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Shells/Bash.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Bash.md similarity index 88% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Shells/Bash.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Bash.md index db5b388..4406e5c 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Shells/Bash.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Bash.md @@ -39,4 +39,19 @@ Try out the script and see if `the file or directory not found` error comes up. ### More Tips: - a useful [bash history terminal command tweak ](https://danten.io/bash-history-searching-with-inputrc/) -= + +You can just use `exec` to replace your current shell with a new shell: + +Switch to `bash`: + +``` +exec bash +``` + +Switch to `zsh`: + +``` +exec zsh +``` + +This won't affect new terminal windows or anything, but it's convenient. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Extra customizations.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Extra customizations.md similarity index 56% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Extra customizations.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Extra customizations.md index 1da5608..88c74ce 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Extra customizations.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Extra customizations.md @@ -11,25 +11,6 @@ Because customizing your terminal for your computer is FUN! Here is a list of - `cmatrix` & `asciiquarium` after brew install - toilet --> turn any text into ascii art - check health of SSD on your laptop to make it [last longer ](https://www.macworld.com/article/334283/how-to-m1-intel-mac-ssd-health-terminal-smartmontools.html)through ```smartmontools``` -- Get cool terminal [customizations](https://ohmyposh.dev/docs/themes) with [oh my posh ](https://ohmyposh.dev/) - - ![[Pasted image 20230724024452.png]] - --- -# Terminal Emulators: -There are many terminal emulators that exist to try to replace the good ol' classic terminal. Just to keep things spicy, here are the other options: - -- iTerm2 - a very popular alt terminal with customizations -- Alacritty - a nice terminal emulator that I installed - - [git repo here ](https://github.com/alacritty/alacritty) -- Hyper - - - -To see your configurations set on default Terminal (for MacOS): -``` -defaults read com.apple.Terminal -``` - -Ah! [Quick](https://github.com/svenstaro/genact)!! [ACT BUSY! ](https://svenstaro.github.io/genact/) \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Terminal Emulators.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Terminal Emulators.md new file mode 100644 index 0000000..d2ae5f7 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Terminal Emulators.md @@ -0,0 +1,30 @@ + + +Of course the terminal that I have been using and continue to use is the just the tool called **Terminal** on MacOS. However, there are numerous terminal emulators to make your terminal environment a better place to live in. This sometimes enters a place of particularities and nit-picky minutia as it is really up to your own preference what you go with. + +--- + +There are many terminal emulators that exist to try to replace the good ol' classic terminal. Just to keep things spicy, here are the other options: + +- The Terminal +- iTerm +- iTerm2 +- Alacritty + - written in rust +- [Kitty](https://en.wikipedia.org/wiki/Kitty_(terminal_emulator)) +- Westerm +- [Foot](https://codeberg.org/dnkl/foot) +- iTerm2 - a very popular alt terminal with customizations +- Alacritty - a nice terminal emulator that I installed + - [git repo here ](https://github.com/alacritty/alacritty) +- Hyper + + +# Terminal Emulators: + +To see your configurations set on default Terminal (for MacOS): +``` +defaults read com.apple.Terminal +``` + +Ah! [Quick](https://github.com/svenstaro/genact)!! [ACT BUSY! ](https://svenstaro.github.io/genact/) \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Shells/Zsh.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Zsh.md similarity index 56% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Shells/Zsh.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Zsh.md index baba253..c1c96d6 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Shells/Zsh.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/Zsh.md @@ -2,9 +2,27 @@ Zsh is a bit trendier nowadays and it is the current shell of choice for my system now. So, having tips of navigation here is a bit important. +To check which shell you are using: + +``` +echo $SHELL +``` + --- - Oh-my-zsh is a very popular customization tool to [pimp](https://stackabuse.com/pimp-my-terminal-an-introduction-to-oh-my-zsh/) out your terminal + +cool terminal [customizations](https://ohmyposh.dev/docs/themes) with [oh my posh ](https://ohmyposh.dev/) + - ![[Pasted image 20230724024452.png]] + - [Zap](https://www.zapzsh.org) is another little zsh plugin manager - For scripting tests, try out [zunit](https://zunit.xyz/docs/usage/running-tests/) - - ![[Pasted image 20230901141639.png]] \ No newline at end of file + - ![[Pasted image 20230901141639.png]] + +Switch to `zsh`: + +``` +exec zsh +``` + +This won't affect new terminal windows or anything, but it's convenient. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/xonsh/Xonsh.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/xonsh/Xonsh.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/xonsh/Xonsh.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/xonsh/Xonsh.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/xonsh/Xontrib-avox.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/xonsh/Xontrib-avox.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/xonsh/Xontrib-avox.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Shells/xonsh/Xontrib-avox.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/ASCII.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/ASCII.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/ASCII.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/ASCII.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Kaumoji Text Emoticons.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Kaumoji Text Emoticons.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Kaumoji Text Emoticons.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Kaumoji Text Emoticons.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Vim/Emacs.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Vim/Emacs.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Vim/Emacs.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Vim/Emacs.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Vim/NeoVim.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Vim/NeoVim.md new file mode 100644 index 0000000..eb95aac --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Vim/NeoVim.md @@ -0,0 +1,4 @@ + +A way to maker your vim editor fancy. [Neovim](https://neovim.io/) is used by the l33t. + +Find extra things on [DotFyle](https://dotfyle.com/). \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Vim/Vim.md b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Vim/Vim.md similarity index 98% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Vim/Vim.md rename to enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Vim/Vim.md index 996a27a..756834a 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Vim/Vim.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/1. Terminals/Text & Editors/Vim/Vim.md @@ -3,6 +3,8 @@ I was extremely surprised I didn't set up a note about my default and OG editor of choice, vim. It is what has helped long term become very fast at typing and in general for understanding the power of just using whatever editor you are most comfortable with at the end of the day. Vim is what I used when I was editing t things on a chromebook and it is still what I am using to this day. Interact with a Vim tutorial on [Open Vim](https://www.openvim.com). Or open up the vim `tutorial` +- I currently use [Vim-plug.](https://github.com/junegunn/vim-plug) + --- There are many purposes to vim, you can use it for: diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/CLI Tool Collection.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/CLI Tool Collection.md similarity index 93% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/CLI Tool Collection.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/CLI Tool Collection.md index 92703fc..b59194b 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/CLI Tool Collection.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/CLI Tool Collection.md @@ -1,6 +1,7 @@ There are so many things to do through the command line in your terminal! Here are a list of packages or tools that I already have or want to later try out for me to come back to. + ##### Currently: --- - [VHS](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FTerminal%20Tips%2FCLI%20Tools%2FCLI%20Tool%20Collection%2FVHS) - cute gifs generated while typing in terminal @@ -9,8 +10,6 @@ There are so many things to do through the command line in your terminal! Here a - can be additionally used with `toilet` - [Vim](obsidian://open?vault=Obsidian&file=Coding%20Tips%20(Classical)%2FComputers%2FComputer%20Realm%2FTerminal%20Tips%2FCLI%20Tools%2FVim%2FVim) - my default command-line editor of choice - [Wikit](obsidian://open?vault=Obsidian&file=Coding%20Tips%20(Classical)%2FComputers%2FComputer%20Realm%2FTerminal%20Tips%2FCLI%20Tools%2Fpackage%20managers%2FFink) - wikipedia search anything within terminal -- -- @@ -22,4 +21,6 @@ There are so many things to do through the command line in your terminal! Here a - [Watchman](https://facebook.github.io/watchman/) - watches files & records/triggers actions when they change - [ChezMoi](https://www.chezmoi.io) - manage your dot files across different devices! - see [how it compares](https://dotfiles.github.io/utilities/) with other dot files solutions. - - here is the [git repo ](https://github.com/twpayne/chezmoi) \ No newline at end of file + - here is the [git repo ](https://github.com/twpayne/chezmoi) +- Kava - visualizer for music in your terminal +- t \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Command Shortcuts.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/Command Shortcuts.md similarity index 92% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Command Shortcuts.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/Command Shortcuts.md index 20b05b8..16b7db7 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Command Shortcuts.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/Command Shortcuts.md @@ -3,6 +3,10 @@ For when you run into those inevitable "how do I command to do that again?" moments to your trusty terminal. Remember: *Communication is key* +An absolutely perfect CLI reference site exists. It is [SS64](https://ss64.com/). + +--- + find password of public wifi network ; ``` security find-generic password -wa "James Coffee Co" | pbcopy diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Git.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/Git.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/Git.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/Git.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/package managers/Fink.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/package managers/Fink.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/package managers/Fink.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/package managers/Fink.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/package managers/Opam.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/package managers/Opam.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/package managers/Opam.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/package managers/Opam.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/package managers/Poetry.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/package managers/Poetry.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/package managers/Poetry.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/package managers/Poetry.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/package managers/RPM.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/package managers/RPM.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/package managers/RPM.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Commands + Settings/package managers/RPM.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Glow.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Glow.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Glow.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Glow.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Mods.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Mods.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Mods.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Mods.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Please.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Please.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Please.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/Please.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/VHS.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/VHS.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/VHS.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/VHS.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/fzf.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/fzf.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/fzf.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/CLI Tool Collection/fzf.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/1.About Languages.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/1.About Languages.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/1.About Languages.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/1.About Languages.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Documentation.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Documentation.md similarity index 87% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Documentation.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Documentation.md index c9bd975..520ae8e 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Documentation.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Documentation.md @@ -7,6 +7,8 @@ Documentation Sources: - Wikipedia - the original documentation site - this generally documents **concepts** though and serves as an encyclopedia for documentation on certain topics. + - MediaWiki powers wikipedia + - there are several such "wiki" based documentations - Notion - Notion has a wiki template too - Notion documents more adaptively and is user-friendly for many kinds of adaptation from **code** to task-assigning. @@ -14,7 +16,8 @@ Documentation Sources: - Especially with Obsidian Publish it can turn into a great wiki - Google Docs - you can now publish anything made in gDocs to the web! -- MkDocs +- MkDocs +- [Wiki.js ](https://docs.requarks.io/install/linux) - a powerful new way to create documentation - [Quarto](https://quarto.org/docs/websites/website-navigation.html) is a documentation software for academics built on top of pandocs --- diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/HTML & CSS.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/HTML & CSS.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/HTML & CSS.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/HTML & CSS.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/Code Conventions.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Code Conventions.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/Code Conventions.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Code Conventions.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/Example of Javascript plugin works.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Example of Javascript plugin works.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/Example of Javascript plugin works.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Example of Javascript plugin works.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/JS Date & Time.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/JS Date & Time.md new file mode 100644 index 0000000..0710c1f --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/JS Date & Time.md @@ -0,0 +1,28 @@ + +How do you define time in Javascript? + + +```javascript +// Create a new Date object +var currentDate = new Date(); + +// Get the current time components +var hours = currentDate.getHours(); +var minutes = currentDate.getMinutes(); +var seconds = currentDate.getSeconds(); + +// Format the time components +var formattedTime = hours + ":" + (minutes < 10 ? "0" : "") + minutes + ":" + (seconds < 10 ? "0" : "") + seconds; + +// Display the formatted time +console.log("Current Time: " + formattedTime); + + +``` + +This code creates a `Date` object representing the current date and time. It then extracts the hours, minutes, and seconds components and formats them into a string. The `console.log` statement is used to display the formatted time in the console. + +Note that the `getHours()`, `getMinutes()`, and `getSeconds()` methods return values in the local time zone of the user's computer. If you need to work with a specific time zone or perform more advanced date and time operations, you might want to consider using libraries like Moment.js or the built-in `Intl.DateTimeFormat` object. + + +Alternatively, there is now the new [Luxon](https://moment.github.io/luxon/#/) library for javascript for a more modern usage of pulling date and time. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/JSLint.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/JSLint.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/JSLint.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/JSLint.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/QML.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/QML.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/QML.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/QML.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Java.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/Java.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Java.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/Java.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/Trampoline.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/Trampoline.md new file mode 100644 index 0000000..4b85648 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/Trampoline.md @@ -0,0 +1,53 @@ + + +In computer programming, the word trampoline has a number of meanings, and is generally associated with **jump instructions** (i.e. moving to different code paths). + +--- + +## Low-level programming + +Trampolines (sometimes referred to as indirect jump vectors) are memory locations holding addresses pointing to interrupt service routines, I/O routines, etc. Execution jumps into the trampoline and then immediately jumps out, or bounces, hence the term trampoline. They have many uses: + + +- Trampoline can be used to overcome the limitations imposed by a central processing unit (CPU) architecture that expects to always find vectors in fixed locations. + +- When an operating system is booted on a symmetric multiprocessing (SMP) machine, only one processor, the bootstrap processor, will be active. After the operating system has configured itself, it will instruct the other processors to jump to a piece of trampoline code that will initialize the processors and wait for the operating system to start scheduling threads on them. + +## High-level programming + +As used in some **Lisp** implementations, a trampoline is a loop that iteratively invokes thunk-returning functions (continuation-passing style). A single trampoline suffices to express all control transfers of a program; a program so expressed is trampolined, or in trampolined style; converting a program to trampolined style is trampolining. Programmers can use trampolined functions to implement tail-recursive function calls in stack-oriented programming languages.[1] + +Continuation-passing style is a popular intermediate format for compilers of functional languages, because many control flow constructs can be elegantly expressed and tail call optimization is easy. When compiling to a language without optimized tail calls, one can avoid stack growth via a technique called trampolining. The idea is to not make the final continuation call inside the function, but to exit and to return the continuation to a trampoline. That trampoline is simply a loop that invokes the returned continuations. Hence, there are no nested function calls and the stack won’t grow.[2] + + + +- In Java, trampoline refers to using reflection to avoid using inner classes, for example in event listeners. The time overhead of a reflection call is traded for the space overhead of an inner class. Trampolines in Java usually involve the creation of a GenericListener to pass events to an outer class.[3] + +- In Mono Runtime, trampolines are small, hand-written pieces of assembly code used to perform various tasks.[4] + +When interfacing pieces of code with incompatible calling conventions, a trampoline is used to convert the caller's convention into the callee's convention. + +- In embedded systems, trampolines are short snippets of code that start up other snippets of code. For example, rather than write interrupt handlers entirely in assembly language, another option is to write interrupt handlers mostly in C, and use a short trampoline to convert the assembly-language interrupt calling convention into the C calling convention.[5] + +When passing a callback to a system that expects to call a C function, but one wants it to execute the method of a particular instance of a class written in C++, one uses a short trampoline to convert the C function-calling convention to the C++ method-calling convention. One way of writing such a trampoline is to use a thunk.[6] Another method is to use a generic listener.[3] + +- In Objective-C, a trampoline is an object returned by a method that captures and reifies all messages sent to it and then "bounces" those messages on to another object, for example in higher order messaging.[7] + +In the GCC compiler, trampoline refers to a technique for implementing pointers to nested functions.[8] The trampoline is a small piece of code which is constructed on the fly on the stack when the address of a nested function is taken. The trampoline sets up the static link pointer, which allows the nested function to access local variables of the enclosing function. The function pointer is then simply the address of the trampoline. This avoids having to use "fat" function pointers for nested functions which carry both the code address and the static link.[9][10][11] This, however, conflicts with the desire to make the stack non-executable for security reasons. + +- In the esoteric programming language *Befunge*, a trampoline is an instruction to skip the next cell in the control flow. + +- No-execute stacks- Some implementations of trampolines cause a loss of no-execute stacks (NX stack). In the GNU Compiler Collection (GCC) in particular, a nested function builds a trampoline on the stack at runtime, and then calls the nested function through the data on stack. The trampoline requires the stack to be executable. +No-execute stacks and nested functions are mutually exclusive under GCC. If a nested function is used in the development of a program, then the NX stack is silently lost. GCC offers the -Wtrampolines warning to alert of the condition. + + + +Software engineered using secure development lifecycle often do not allow the use of nested functions due to the loss of NX stacks. + +See also + +DLL trampolining + +Retpoline + + via [Wiki](https://en.wikipedia.org/wiki/Trampoline_(computing)) \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/TypeScript.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/TypeScript.md new file mode 100644 index 0000000..42227e3 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Related/TypeScript.md @@ -0,0 +1,11 @@ + +A powerful language. + + +Useful repos: +- [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master) - a repo of high quality type definitions. + - Here is the [admin manual. ](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/docs/admin.md) + + +Tools made in Typescript: +- [Screenshot-to-code ](https://github.com/abi/screenshot-to-code/blob/main/frontend/src/App.tsx): Drop in Screenshot and convert to HTML/Tailwind/JS code diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/Welcome to JavaScript.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Welcome to JavaScript.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Javascript/Welcome to JavaScript.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Javascript/Welcome to JavaScript.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Markdown.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Markdown.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Markdown.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/High level - Front-end/Markdown.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/C++.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/C++.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/C++.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/C++.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Fortran 1.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Fortran/Fortran 1.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Fortran 1.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Fortran/Fortran 1.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Fortran.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Fortran/Fortran.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Fortran.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Fortran/Fortran.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Lisp.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Lisp.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Lisp.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Lisp.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Unison in Racket Scheme.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Unison in Racket Scheme.md new file mode 100644 index 0000000..135ca25 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Unison in Racket Scheme.md @@ -0,0 +1,97 @@ + +[This](https://github.com/unisonweb/unison/blob/trunk/scheme-libs/racket/unison/Readme.md) directory contains libraries necessary for building and running +unison programs via Racket Scheme. + +## Prerequisites + +You'll need to have a couple things installed on your system: + +* [libcrypto](https://github.com/openssl/openssl) (you probably already have this installed) +* [Racket](https://racket-lang.org/), with the executable `racket` on your path somewhere +* [BLAKE2](https://github.com/BLAKE2/libb2) (you may need to install this manually) + + +In particular, our crypto functions require on both `libcrypto` (from openssl) and `libb2`. You may have to tell racket where to find `libb2`, by adding an entry to the hash table in your [`config.rktd` file](https://docs.racket-lang.org/raco/config-file.html). This is what I had, for an M1 mac w/ libb2 installed via Homebrew: +``` +(lib-search-dirs . (#f "/opt/homebrew/Cellar/libb2/0.98.1/lib/")) +``` +You'll also need to install `x509-lib` with `raco pkg install x509-lib` + + +## Running the unison test suite + +To run the test suite, first `stack build` (or `stack build --fast`), then: + +``` +./unison-src/builtin-tests/jit-tests.sh +``` + +OR if you want to run the same tests in interpreted mode: + +``` +./unison-src/builtin-tests/interpreter-tests.sh +``` + +The above scripts fetch and cache a copy of base and the scheme-generating libraries, and copy this directory to `$XDG_DATA_DIRECTORY/unisonlanguage/scheme-libs`. + +## Iterating more quickly + +If running the above transcripts is too slow for you, here's a few things you can do instead: + +### Run without needing to bounce ucm + +First, tell UCM to load scheme files from this directory, by adding +a `SchemeLibs.Static` item to your `~/.unisonConfig`. + +``` +SchemeLibs.Static = "/path/to/unisoncode" +``` + +With this set, the compiler commands will look in `/path/to/somewhere/scheme-libs/` for the subdirectories containing the library files. + +Once that's done, you can load the testing library and tests: + +``` +.jit> load unison-src/builtin-tests/testlib.u +.jit> add +.jit> load unison-src/builtin-tests/tests.u +.jit> add +``` + +And then, without needing to bounce `ucm` every time you edit your scheme files, you can do: + +``` +.jit> run.native tests +``` + +### Run without needing to regenerate the scheme + +`run.native` produces a scheme file in `$XDG_CACHE_DIRECTORY/unisonlanguage/scheme-tmp`, so going one step further, you can grab these files and run them directly using Racket, bypassing `ucm` entirely. + +``` +~/unison » ls ~/.cache/unisonlanguage/scheme-tmp +testSuite.scm tests.scm +``` + +When running `tests.scm` directly with Racket, you'll need to add this `scheme-libs` directory and the generated builtins library to the path. + +``` +racket -S ~/.cache/unisonlanguage/scheme-libs/ -S ~/.local/share/unisonlanguage/scheme-libs/racket/ -S ~/.local/share/unisonlanguage/scheme-libs/common/ ~/.cache/unisonlanguage/scheme-tmp/tests.scm +`` + +## Loading in Racket + +To load these libraries into a racket runtime, racket should be invoked like this: +```bash +$ racket -S scheme-libs/racket +Welcome to Racket v8.7 [cs]. +> (require unison/core) +> ; now you can try out the definitions in core.ss! +``` + +You can then run racket tests with: + +```bash +$ raco test scheme-libs/racket/unison/tests/your-test-file.rkt +``` + diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Unison.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Unison.md new file mode 100644 index 0000000..1083b0b --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/Lisp/Unison.md @@ -0,0 +1,97 @@ +The Unison programming language is a fun and intuitive programming language for storage. + +For a helpful list of practice problems, try out the exercises [found on here in Exercism](https://exercism.org/tracks/unison/). + + +--- + + +# Run your first program on Unison + +There is a [fantastic tutorial](https://www.unison-lang.org/learn/quickstart/) on how to get started here. + + +When running the `ucm` (unison code manager), the following appears: + +```ucm +> ./unisonlanguage/ucm + + + + +  I created a new codebase for you at /Users/shwethajayaraj + + + +  Now starting the Unison Codebase Manager (UCM)... + + + + + +   _____     _              + +  |  |  |___|_|___ ___ ___  + +  |  |  |   | |_ -| . |   | + +  |_____|_|_|_|___|___|_|_| + +  👋 Welcome to Unison! + +  You are running version: **79eeee7** + + + + + +  📚 Read the official docs at https://www.unison-lang.org/learn/ + +  Type 'project.create' to get started. + + + +.> project.create                                                                                  + + + +  🎉 I've created the project with the randomly-chosen name jolly-cheetah (use + +  `project.rename ` to change it). + + + + + +  I'll now fetch the latest version of the base Unison library... + + + + + +  Downloaded 12648 entities. + + + + + +  🎨 Type `ui` to explore this project's code in your browser. + +  🔭 Discover libraries at https://share.unison-lang.org + +  📖 Use `help-topic projects` to learn more about projects. + +  Write your first Unison code with UCM: + +    1. Open scratch.u. + +    2. Write some Unison code and save the file. + +    3. In UCM, type `add` to save it to your new project. + +  🎉 🥳 Happy coding! + + + +jolly-cheetah/main> +``` diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/PHP.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/PHP.md new file mode 100644 index 0000000..a20df58 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Low level - Back-end/PHP.md @@ -0,0 +1,6 @@ + +A necessary evil. + +- [PHPBB](https://www.phpbb.com/) - create fully featured Bulletin Board Forums for free +- DokuWiki was suggested to me as a wiki that generates in PHP and thus not needing to write in it ([Template Engine](https://en.wikipedia.org/wiki/Template_processor)) +- [WackoWiki](https://wackowiki.org/doc/) was found when trying to search for DokuWiki \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Go/Testing in Go.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/Go/Testing in Go.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Go/Testing in Go.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/Go/Testing in Go.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Go/Welcome to Go.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/Go/Welcome to Go.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Go/Welcome to Go.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/Go/Welcome to Go.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/LaTeX.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/LaTeX.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/LaTeX.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/LaTeX.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Haskell.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Haskell.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Haskell.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Haskell.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Hazel.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Hazel.md new file mode 100644 index 0000000..3521f61 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Hazel.md @@ -0,0 +1,206 @@ + +Try out the online editor [here](https://hazel.org/build/dev/). + +--- + + +[Hazel](https://github.com/hazelgrove/hazel/) is a live functional-programming environment rooted in the principles of +type theory. You can find the relevant papers and more motivation at [the Hazel +website](https://hazel.org/). + +You can try Hazel online: the +[dev](https://hazel.org/build/dev) branch is the main branch at the +moment. Every other branch that has been pushed to GitHub and successfully builds +can also be accessed at: + + `https://hazel.org/build/` + + + +## Building and Running Hazel + +### Short version + +If you already have `ocaml` version 5.0.0 and least version 2.0 of `opam` +installed, you can build Hazel by running the following commands. + +- `git clone git@github.com:hazelgrove/hazel.git` +- `cd hazel` +- `make deps` +- `make dev` + +To view Hazel, you have to serve it, on localhost for development (you can't +run it from a `file:///` URL due to browser restrictions on e.g. web workers.) + +If you have `python3` on your path, you can use the Python server via +`make serve`, then navigate to `http://0.0.0.0:8000/` in your browser. + +Otherwise, run `make echo-html-dir` which will echo the directory that needs +to be served using some other server of your choice. + +### Long Version + +If you are unfamiliar with `ocaml` or `opam`, do not have them installed, or +just get stuck, we recommend you follow the step-by-step installation +instructions contained in [INSTALL.md](INSTALL.md). + +## Contributing + +### From OCaml to ReasonML + +Hazel is written in ReasonML, which is a syntactic sugar atop OCaml. +This link lets you type OCaml and see what the corresponding ReasonML syntax is: +. + +This is useful if you are trying to figure out the ReasonML syntax for something +that you know the OCaml syntax for. + +You can also convert between OCaml and ReasonML syntax at the terminal using +`refmt` at the terminal. See `refmt --help` for the details. + +### Suggested Extensions for VS Code + +Most of our team uses Visual Studio Code (VS Code) to write code. +If you use VS Code, here are a few extensions that might be helpful. + +- This extension provides full support for editing ReasonML source code and + relevant tools: + + - [ocaml-platform](https://github.com/ocamllabs/vscode-ocaml-platform) + +- Due to Reason's poor parse errors, unbalanced parentheses can be difficult + to find. The following extensions help with that. + + - [Bracket Pair Colorizer 2](https://marketplace.visualstudio.com/items?itemName=coenraads.bracket-pair-colorizer-2) + - [Indenticator](https://marketplace.visualstudio.com/items?itemName=sirtori.indenticator) + - [indent-rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow) + +In addition to these extensions, enabling the breadcrumbs bar can make +navigating a large code base easier. There are multiple ways to make the +breadcrumbs bar visible: + +- Click **View** / **Show Breadcrumbs** from the menu bar. +- Press `Ctrl+Shift+P` (macOS: `Cmd+Shift+P`), start typing `breadcrumbs`, and + select `View: Toggle Breadcrumbs` from the dropdown menu to toggle breadcrumbs + on and off. +- Press `Ctrl+Shift+.` to start breadcrumbs navigation. + +### Suggested Setup for NeoVim + +If you enjoy your Vim binding and Vim setup, the following may help you set up your Reason IDE in NeoVim. + +If you use vim, I recommend you to switch to NeoVim since it has a better support for multi-thread, +and thus less likely to block you when you are programming. + +To set up the LSP (Language Server Protocol), you need to set up your Language Client for Neovim and Language Server for ocaml. +- [ocaml-language-server](https://www.npmjs.com/package/ocaml-language-server) +- [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim) + +After installing the previous two, you may want to copy the following to your neovim config file. +(assuming `npm` have ocaml-language-server installed under `/usr/bin`) +``` +let g:LanguageClient_serverCommands = { + \ 'ocaml': ['/usr/bin/ocaml-language-server', '--stdio'], + \ 'reason': ['/usr/bin/ocaml-language-server', '--stdio'] + \ } +" LanguageClient-neovim +nnoremap :call LanguageClient_contextMenu() +" Or map each action separately +nnoremap K :call LanguageClient#textDocument_hover() +nnoremap gd :call LanguageClient#textDocument_definition() +nnoremap gr :call LanguageClient#textDocument_references() +nnoremap gf :call LanguageClient#textDocument_formatting() +nnoremap :call LanguageClient#textDocument_rename() +``` + +### Build System Details + +Hazel is compiled to Javascript for the web browser via the `js_of_ocaml` compiler. + +Though `make` targets are provided as a convenience, they mostly translate to +`dune` commands. + +Invoking `make` by itself is equivalent to invoking `make dev`. With these +commands we pass additional flags to `js_of_ocaml` that cause the insertion of +comments that map locations in the generated JS to locations in the source +files. This is useful for debugging purposes. + +`make dev` also auto-formats Reason source files using `refmt` (this is what the +`@src/fmt` alias is for). This ensures code from all contributors follows the +same style. + +The `make dev` and `make release` commands do three things: + +1. Generate some internal parsers using `menhir`. +2. Compile the Reason code to OCaml bytecode using the OCaml compiler. +3. Compile the OCaml bytecode to JavaScript + (`_build/default/src/hazelweb/www/hazel.js`) using `js_of_ocaml`. + +For a smoother dev experience, use `make watch` to automatically watch +for file changes. This may require installing `fswatch` (see INSTALL.md). +You can also run `make watch-release` to continuously build the release +build (takes longer per build). + +#### Clean Build + +To obtain an clean build, you may need to: + +- Clone the repository (if you have not), and + enter the project root of your cloned Hazel project. + + ```sh + git clone git@github.com:hazelgrove/hazel.git + cd hazel + ``` + +- Setup a local OCaml environment specific to the project, and compile. + If you have setup a local OCaml environment (there is a directory + called `_opam`), you may want to first remove it. + + ```sh + # opam switch remove ./ + opam switch create ./ 5.0.0 + eval $(opam env) + make deps + make + ``` + +This sets up a standalone OCaml environment in the cloned project, +independent of the one you sent in your home directory. This allow you to +alternate dependencies, or test dependencies changes, without affect +existing OCaml projects. + +NOTE: You may see the following warning when building: + +``` +Warning 58 [no-cmx-file]: no cmx file was found in path for module Ezjs_idb, and its interface was not compiled with -opaque +``` + +This is due to an upstream library issue and does not cause problems with Hazel: + + https://github.com/OCamlPro/ezjs_idb/issues/1 + +### Debugging + +#### Printing +You can print to the browser console using the standard `print_endline` function. This is probably the easiest method right now. +Most datatypes in the codebase have something like `[@deriving (show({with_path: false}), sexp, yojson)]` on them. This generates +helper functions for printing and serializing this data. For a type named `t`, the `show` function will be named `show`. Otherwise, +for a type named something else like `q`, it will be `show_q`. + +#### Source Maps +`js_of_ocaml` does support source maps and has some other flags that might be useful. If you experiment with those and get them to work, please update this README with some notes. + +#### Debug Mode +If Hazel is hanging on load or when you perform certain actions, you can load into Debug Mode by appending `#debug` to the URL and reloading. From there, you have some buttons that will change settings or reset local storage. Refresh without the `#debug` flag and hopefully you can resolve the situation from there. + +### Continuous Integration + +When you push your branch to the main `hazelgrove/hazel` repository, we +have a GitHub Action setup (see `.github/workflows/deploy_branches.yml`) +that will build that branch (in `release` mode) and deploy it to the URL +`https://hazel.org/build/`, assuming the build succeeds. + +--- + +- Extended [Abstract](https://github.com/hazelgrove/editor-tyde19/blob/master/editor-tyde19.pdf) for Types \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Languages Lost to Research.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Languages Lost to Research.md new file mode 100644 index 0000000..b80ad6b --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Languages Lost to Research.md @@ -0,0 +1,8 @@ + + +A list of languages that never made it, sadly. Probably more to be added as time & research goes on : + +--- + +- [Frank](https://github.com/frank-lang/frank)- a compiler programming language written in [Haskell](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FTerminal%20Tips%2FLanguages%2FMiddle%2FHaskell) + - here is a [paper](https://arxiv.org/pdf/1611.09259.pdf) on the Frank tutorial. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Wolfram.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Wolfram.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Wolfram.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/More Misc/Wolfram.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/SQL.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/SQL.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/SQL.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/SQL.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/XML/DOM.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/XML/DOM.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/XML/DOM.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/XML/DOM.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/XML/Resources & Generators.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/XML/Resources & Generators.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/XML/Resources & Generators.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/XML/Resources & Generators.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/XML/XML.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/XML/XML.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/XML/XML.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/XML/XML.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/XML/XSL.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/XML/XSL.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/XML/XSL.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Middle/XML/XSL.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Discord Message Monitoring script.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Discord Message Monitoring script.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Discord Message Monitoring script.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Discord Message Monitoring script.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Fire.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Fire.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Fire.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Fire.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/API Python.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/API Python.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/API Python.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/API Python.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Creating a Tree generator in python.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Creating a Tree generator in python.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Creating a Tree generator in python.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Creating a Tree generator in python.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Machine Learning/ML Management.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Machine Learning/ML Management.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Machine Learning/ML Management.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Machine Learning/ML Management.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Machine Learning/OpenAI.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Machine Learning/OpenAI.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Machine Learning/OpenAI.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Machine Learning/OpenAI.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Machine Learning/WEKA.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Machine Learning/WEKA.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Machine Learning/WEKA.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Machine Learning/WEKA.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Testing/Testing in python.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Testing/Testing in python.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Projects/Testing/Testing in python.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Projects/Testing/Testing in python.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Render Engine.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Render Engine.md new file mode 100644 index 0000000..e968e20 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Render Engine.md @@ -0,0 +1,42 @@ + + +Render is a static site generator for Python. There are a multitude of ways to set up a static site generator but with the current trend of desiring a "stack" for building things - Render seems to answer that call nicely. + +--- + +# Render Engine + +[![PyTest](https://github.com/kjaymiller/render_engine/actions/workflows/test.yml/badge.svg)](https://github.com/kjaymiller/render_engine/actions/workflows/test.yml) +[![Discord](https://img.shields.io/discord/1174377880118104156?label=Discord&color=purple)](https://discord.gg/2xMQ4j4d8m) + +## Learn More + +- [Check out the Documentation](https://render-engine.readthedocs.io/en/latest/) +- [Contributors and Builders, Check out the Wiki](https://github.com/render-engine/.github/wiki) +- [Join the community!](https://discord.gg/2xMQ4j4d8m) + +## What is [RenderEngine](https://github.com/render-engine/render-engine#what-is-renderengine) + +## The _3 layer_ Architecture + +- **[Page](.github/render_engine/page.html)** - A single webpage item built from content, a template, raw data, or a combination of those things. +- **[Collection](.github/render_engine/collection.html)** - A group of webpages built from the same template, organized in a single directory +- **[Site](.github/render_engine/site.html)** - The container that helps to render all Pages and Collections in with uniform settigns and variables + +## Installing Render Engine + +In order to use render engine, you must have python 3.10 installed. You can download python from [python.org](https://python.org). + +- Linux/MacOS: [python.org](https://python.org) +- Windows: [Microsoft Store](https://apps.microsoft.com/store/detail/python-311/9NRWMJP3717K) + +Render Engine is available in PyPI and can be installed using pip: + +```bash +pip install render-engine +``` + +## Getting Started + +Check out the [Getting Started](https://render-engine.readthedocs.io/en/latest/page/) Section in the [Documentation](https://render-engine.readthedocs.io) + diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Textual.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Textual.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Textual.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Textual.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Welcome to Python.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Welcome to Python.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/Welcome to Python.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/Welcome to Python.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/About codes.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/About codes.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/About codes.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/About codes.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Classes.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Classes.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Classes.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Classes.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/Enumerate().md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/Enumerate().md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/Enumerate().md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/Enumerate().md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/Itertools Next() in list.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/Itertools Next() in list.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/Itertools Next() in list.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/Itertools Next() in list.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/List len().md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/List len().md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/List len().md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/List len().md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/Lists.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/Lists.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/Lists.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/Lists.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/list comprehension example.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/list comprehension example.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/Lists/list comprehension example.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/Lists/list comprehension example.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/More data types/Explicitly Defining datatype in python function.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Explicitly Defining datatype in python function.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/More data types/Explicitly Defining datatype in python function.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Explicitly Defining datatype in python function.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Generator Functions.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Generator Functions.md new file mode 100644 index 0000000..e2bdda7 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Generator Functions.md @@ -0,0 +1,6 @@ + +#### 3.2.8.3. [Generator functions](https://docs.python.org/3/reference/datamodel.html#generator-functions) + +A function or method which uses the [`yield`](https://docs.python.org/3/reference/simple_stmts.html#yield) statement (see section [The yield statement](https://docs.python.org/3/reference/simple_stmts.html#yield)) is called a _generator function_. Such a function, when called, always returns an [iterator](https://docs.python.org/3/glossary.html#term-iterator) object which can be used to execute the body of the function: calling the iterator’s [`iterator.__next__()`](https://docs.python.org/3/library/stdtypes.html#iterator.__next__ "iterator.__next__") method will cause the function to execute until it provides a value using the `yield` statement. When the function executes a [`return`](https://docs.python.org/3/reference/simple_stmts.html#return) statement or falls off the end, a [`StopIteration`](https://docs.python.org/3/library/exceptions.html#StopIteration "StopIteration") exception is raised and the iterator will have reached the end of the set of values to be returned. + +An example of where this is used is in the [stateless](https://github.com/suned/stateless) python tool. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/More data types/Trees in python.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Trees in python.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/More data types/Trees in python.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/Trees in python.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/More data types/lambda.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/lambda.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/More data types/lambda.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/More data types/lambda.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/String Manipulation.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/String Manipulation.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/String Manipulation.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/String Manipulation.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/arrays/About arrays.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/arrays/About arrays.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/arrays/About arrays.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/arrays/About arrays.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/arrays/Initialize array of fixed length.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/arrays/Initialize array of fixed length.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/code/arrays/Initialize array of fixed length.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/code/arrays/Initialize array of fixed length.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/About Tool.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/About Tool.md similarity index 90% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/About Tool.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/About Tool.md index 3f873e6..f7d881f 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/About Tool.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/About Tool.md @@ -15,4 +15,6 @@ There are already hundreds maybe thousands of tools for python that are already - here are some numpy tips - At the heart of any analysis project is a good set of labeled data, Make sure to use annotations with [tortus](https://towardsdatascience.com/tortus-e4002d95134b). - [Visidata](https://github.com/saulpw/visidata) is for spreadsheet and data visualization with python in terminal -- [Music Library ](https://github.com/beetbox/beets)manager in python \ No newline at end of file +- [Music Library ](https://github.com/beetbox/beets)manager in python +- [Genshi](https://en.wikipedia.org/wiki/Genshi_(templating_language)) is a XML-based vocabulary template engine + - [many](https://genshi.edgewall.org/) use this engine \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Formatting/Cookiecutter.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Formatting/Cookiecutter.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Formatting/Cookiecutter.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Formatting/Cookiecutter.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Formatting/Formatting in python.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Formatting/Formatting in python.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Formatting/Formatting in python.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Formatting/Formatting in python.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Frameworks/About Frameworks.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Frameworks/About Frameworks.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Frameworks/About Frameworks.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Frameworks/About Frameworks.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Intro to Python Environments.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Intro to Python Environments.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Intro to Python Environments.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Intro to Python Environments.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Venv/Venv.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Venv/Venv.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Venv/Venv.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Venv/Venv.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Venv/Virtualenv.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Venv/Virtualenv.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/Venv/Virtualenv.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/Venv/Virtualenv.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/conda/Anaconda.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/conda/Anaconda.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/conda/Anaconda.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/conda/Anaconda.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/conda/Conda.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/conda/Conda.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Environments/conda/Conda.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Environments/conda/Conda.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IDEs/0. INTRO Python Editors.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IDEs/0. INTRO Python Editors.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IDEs/0. INTRO Python Editors.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IDEs/0. INTRO Python Editors.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IDEs/VSCode.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IDEs/VSCode.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IDEs/VSCode.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IDEs/VSCode.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/About Colab.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/About Colab.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/About Colab.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/About Colab.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Code Snippets.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Code Snippets.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Code Snippets.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Code Snippets.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Command Palette.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Command Palette.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Command Palette.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Command Palette.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Forms.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Forms.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Forms.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Forms.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Scratch Code Cells.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Scratch Code Cells.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Scratch Code Cells.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Scratch Code Cells.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Shortcuts.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Shortcuts.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Colab/Colab Shortcuts.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Colab/Colab Shortcuts.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/IPython.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/IPython.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/IPython.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/IPython.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Jupyter.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Jupyter.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/Jupyter.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/Jupyter.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/convert a .ipynb to .py.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/convert a .ipynb to .py.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/convert a .ipynb to .py.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/convert a .ipynb to .py.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/merge multiple notebooks.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/merge multiple notebooks.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/merge multiple notebooks.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/merge multiple notebooks.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/notebook launcher.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/notebook launcher.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/IPython/notebook launcher.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/IPython/notebook launcher.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Performance Profiling Libraries.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Performance Profiling Libraries.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Performance Profiling Libraries.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Performance Profiling Libraries.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Starlette.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Starlette.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Starlette.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Starlette.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Tensorflow/About TensorFlow.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Tensorflow/About TensorFlow.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Tensorflow/About TensorFlow.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Tensorflow/About TensorFlow.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Tensorflow/Quantization in TFLite.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Tensorflow/Quantization in TFLite.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Tensorflow/Quantization in TFLite.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Tensorflow/Quantization in TFLite.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Tornado.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Tornado.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/Tornado.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/Tornado.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/beautiful soup.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/beautiful soup.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/beautiful soup.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/beautiful soup.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/matplotlib.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/matplotlib.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/matplotlib.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/matplotlib.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/nbdev.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/nbdev.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/nbdev.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/nbdev.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/numpy/numpy.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/numpy/numpy.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/numpy/numpy.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/numpy/numpy.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/pandas/Pandas tips.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/pandas/Pandas tips.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/pandas/Pandas tips.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/pandas/Pandas tips.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/pandas/Summary Stats & EDA.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/pandas/Summary Stats & EDA.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/pandas/Summary Stats & EDA.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/pandas/Summary Stats & EDA.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/pandas/common pandas commands.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/pandas/common pandas commands.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/pandas/common pandas commands.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/pandas/common pandas commands.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/requests.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/requests.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/requests.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/requests.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/xlswriter/About xlswriter.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/xlswriter/About xlswriter.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Languages/Python/tools/Libraries/xlswriter/About xlswriter.md rename to enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Libraries/xlswriter/About xlswriter.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Py Wall.md b/enter/Coding Tips (Classical)/Terminal Tips/2. CLI Tools/Languages/Python/tools/Py Wall.md new file mode 100644 index 0000000..e69de29 diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/About GUIs.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/About GUIs.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/About GUIs.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/About GUIs.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Games/Neopets.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Games/Neopets.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Games/Neopets.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Games/Neopets.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Games/Ruffle.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Games/Ruffle.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Games/Ruffle.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Games/Ruffle.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Games/gdevelop.io.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Games/gdevelop.io.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Games/gdevelop.io.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Games/gdevelop.io.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/About Servers.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/About Servers.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/About Servers.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/About Servers.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Cloud Servers/About Cloud Servers.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Cloud Servers/About Cloud Servers.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Cloud Servers/About Cloud Servers.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Cloud Servers/About Cloud Servers.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Cloud Servers/Cloudron.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Cloud Servers/Cloudron.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Cloud Servers/Cloudron.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Cloud Servers/Cloudron.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Cloud Servers/Linode.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Cloud Servers/Linode.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Cloud Servers/Linode.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Cloud Servers/Linode.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Cloud Servers/Nginx.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Cloud Servers/Nginx.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Cloud Servers/Nginx.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Cloud Servers/Nginx.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/About Databases.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/About Databases.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/About Databases.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/About Databases.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/About Repositories.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/About Repositories.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/About Repositories.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/About Repositories.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Codeberg.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Codeberg.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Codeberg.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Codeberg.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Gitea.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Gitea.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Gitea.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Gitea.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Github.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Github.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Github.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Github.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Gitlab.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Gitlab.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Gitlab.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Gitlab.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Replit.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Replit.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Repos/Replit.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Repos/Replit.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Search.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Search.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Search.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Search.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Tools & Tables/AirTable.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Tools & Tables/AirTable.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Tools & Tables/AirTable.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Tools & Tables/AirTable.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Tools & Tables/Google Sheets.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Tools & Tables/Google Sheets.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Tools & Tables/Google Sheets.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Tools & Tables/Google Sheets.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Tools & Tables/Microsoft Excel.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Tools & Tables/Microsoft Excel.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Tools & Tables/Microsoft Excel.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Tools & Tables/Microsoft Excel.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Tools & Tables/Notions about Notion.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Tools & Tables/Notions about Notion.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Databases/Tools & Tables/Notions about Notion.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Databases/Tools & Tables/Notions about Notion.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Grafana.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Grafana.md new file mode 100644 index 0000000..ad795a1 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Grafana.md @@ -0,0 +1,52 @@ + +A fantastic operational **dashboard** + +It works for: + +Windows | [Mac](https://grafana.com/grafana/download?pg=graf-deployment-options&platform=mac&plcmt=deploy-box-1&edition=oss) | Linux | Docker | Linux on ARM64 + +--- + +# Getting Started (OSX) + +1. The Install page is located [here](https://grafana.com/grafana/download?pg=graf-deployment-options&platform=mac&plcmt=deploy-box-1&edition=oss). + +OS X(via Homebrew) +``` +brew update +brew install grafana +``` + + +Read the MacOS [installation guide](https://grafana.com/docs/grafana/latest/installation/mac/) for more information. + +Standalone MacOS/Darwin Binaries(64 Bit)SHA256: 5bb5fb4784f0fb98cc14584d49adf52b5382be40f45199b96ea7abc96d173c1b + +Read the MacOS [installation guide](https://grafana.com/docs/grafana/latest/installation/mac/) for more information. + +``` +curl -O [https://dl.grafana.com/oss/release/grafana-10.2.2.darwin-amd64.tar.gz](https://dl.grafana.com/oss/release/grafana-10.2.2.darwin-amd64.tar.gz) +tar -zxvf grafana-10.2.2.darwin-amd64.tar.gz +``` + +Untar the `gz` file and copy the files to the location of your preference. + +To start Grafana service, go to the directory and run the command: + +``` +./bin/grafana server +``` + + +--- + +Using Grafana Plugins to connect many dashboard: + + + +**During this video, understand how to:** + +- Visualizing data and performing analytics on that data in one place, without storing it in another place. +- Querying, visualizing, and alerting on metrics stored in almost any data source. +- Using Grafana’s plugin architecture, which offers instant access to 300+ data sources, including Enterprise plugins for Elasticsearch, Jira, Datadog, Splunk, AppDynamics, Oracle, MongoDB, Snowflake, ServiceNow, and more. +- Using Grafana to lower MTTI/MTTR. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/About Networking.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/About Networking.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/About Networking.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/About Networking.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/DNS.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/DNS.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/DNS.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/DNS.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Fly.io.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Fly.io.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Fly.io.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Fly.io.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/OpenWRT.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/OpenWRT.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/OpenWRT.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/OpenWRT.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/APIs/About APIs.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/APIs/About APIs.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/APIs/About APIs.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/APIs/About APIs.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/APIs/Useful APIs.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/APIs/Useful APIs.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/APIs/Useful APIs.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/APIs/Useful APIs.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/About Protocols.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/About Protocols.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/About Protocols.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/About Protocols.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/IP (Internet Protocol).md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/IP (Internet Protocol).md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/IP (Internet Protocol).md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/IP (Internet Protocol).md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/List of Protocols.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/List of Protocols.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/List of Protocols.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/List of Protocols.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/SFTP.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/SFTP.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/SFTP.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/SFTP.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/Uniform Resource Identifier.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/Uniform Resource Identifier.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/Protocols/Uniform Resource Identifier.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/Protocols/Uniform Resource Identifier.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/VPN/About VPNs.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/VPN/About VPNs.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/VPN/About VPNs.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/VPN/About VPNs.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/VPN/OpenVPN.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/VPN/OpenVPN.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/VPN/OpenVPN.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/VPN/OpenVPN.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/VPN/ProtonVPN.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/VPN/ProtonVPN.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Networking/VPN/ProtonVPN.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Networking/VPN/ProtonVPN.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Physical Servers/Raspberry Pis.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Physical Servers/Raspberry Pis.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Physical Servers/Raspberry Pis.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Physical Servers/Raspberry Pis.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/About Virtual Machines.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/About Virtual Machines.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/About Virtual Machines.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/About Virtual Machines.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/DOS Box.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/DOS Box.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/DOS Box.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/DOS Box.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Docker/About Docker.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Docker/About Docker.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Docker/About Docker.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Docker/About Docker.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Docker/Docker Compose.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Docker/Docker Compose.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Docker/Docker Compose.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Docker/Docker Compose.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Docker/Docker Machine.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Docker/Docker Machine.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Docker/Docker Machine.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Docker/Docker Machine.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Docker/Docker tutorial.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Docker/Docker tutorial.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Docker/Docker tutorial.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Docker/Docker tutorial.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Podman.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Podman.md new file mode 100644 index 0000000..3f7fa99 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Podman.md @@ -0,0 +1,37 @@ + +Another containerization tool similar to Docker. + +To get started: + + +# Installation: + +MacOS + +``` +sudo port install podman +``` + +For more information on Podman on ArchLinux [click here](https://wiki.archlinux.org/title/Podman) + +Alpine Linux. + +``` +sudo apk add podman +``` + +For further details, please refer to the instructions on the [Alpine Linux wiki](https://wiki.alpinelinux.org/wiki/Podman). + + +Create and start your first Podman machine: + +``` +podman machine init +podman machine start +``` + +You can then verify the installation information using: + +``` +podman info +``` diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Quay/Quay Docker Tutorial.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Quay/Quay Docker Tutorial.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Quay/Quay Docker Tutorial.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Quay/Quay Docker Tutorial.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Quay/Quay Setup with Clair.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Quay/Quay Setup with Clair.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/Quay/Quay Setup with Clair.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/Quay/Quay Setup with Clair.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/VirtualBox/Connect to a VirtualBox VM desktop remotely.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/VirtualBox/Connect to a VirtualBox VM desktop remotely.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Servers/Virtual Machines/VirtualBox/Connect to a VirtualBox VM desktop remotely.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Servers/Virtual Machines/VirtualBox/Connect to a VirtualBox VM desktop remotely.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/1. Quick & Easy Website Making.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/1. Quick & Easy Website Making.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/1. Quick & Easy Website Making.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/1. Quick & Easy Website Making.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/2. On Hosts.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/2. On Hosts.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/2. On Hosts.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/2. On Hosts.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Browsers/About Browsers.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Browsers/About Browsers.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Browsers/About Browsers.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Browsers/About Browsers.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Browsers/Chromium.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Browsers/Chromium.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Browsers/Chromium.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Browsers/Chromium.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Browsers/Using Vivaldi.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Browsers/Using Vivaldi.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Browsers/Using Vivaldi.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Browsers/Using Vivaldi.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Domains.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Domains.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Domains.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Domains.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Github Pages.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Github Pages.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Github Pages.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Github Pages.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Media Hosts/JellyFin.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Media Hosts/JellyFin.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Media Hosts/JellyFin.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Media Hosts/JellyFin.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Media Hosts/Plex.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Media Hosts/Plex.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Media Hosts/Plex.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Media Hosts/Plex.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Neocities.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Neocities.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Neocities.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Neocities.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Netlify & Vercel.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Netlify & Vercel.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Netlify & Vercel.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Netlify & Vercel.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/TLD.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/TLD.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/TLD.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/TLD.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Uniform Resource Locator.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Uniform Resource Locator.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/Uniform Resource Locator.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/Uniform Resource Locator.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/WordPress.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/WordPress.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Hosting/WordPress.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Hosting/WordPress.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Robots.txt Files.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Robots.txt Files.md similarity index 91% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Robots.txt Files.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Robots.txt Files.md index af5bbee..ce3dc55 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Internet/Websites/Robots.txt Files.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Internet/Websites/Robots.txt Files.md @@ -6,4 +6,4 @@ Fun Fact: Google [open-sourced](https://opensource.googleblog.com/2019/07/google *Resources*: - [Robots.txt file examples](https://blog.hubspot.com/marketing/robots-txt-file) - Robots.txt [generator tool](https://www.internetmarketingninjas.com/tools/robots-txt-generator/) - +- another [robots.txt](https://www.cutercounter.com/robots.txt) file sample diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Dynaboard.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Dynaboard.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Dynaboard.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Dynaboard.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Email.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Email.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Email.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Email.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Extensions.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Extensions.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Extensions.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Extensions.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Frontend Tools.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Frontend Tools.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Frontend Tools.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Frontend Tools.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Issue Tracking.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Issue Tracking.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Issue Tracking.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Issue Tracking.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Maps.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Maps.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Maps.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Maps.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Progressive Web Apps.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Progressive Web Apps.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Progressive Web Apps.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Progressive Web Apps.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Prototyping tools.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Prototyping tools.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Prototyping tools.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Prototyping tools.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/StackBlitz.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/StackBlitz.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/StackBlitz.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/StackBlitz.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Webi.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Webi.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Webi.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Webi.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Webscraping.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Webscraping.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Webscraping.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Webscraping.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Workspaces.md b/enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Workspaces.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/GUIs/Tools/Workspaces.md rename to enter/Coding Tips (Classical)/Terminal Tips/3. GUIs/Tools/Workspaces.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Terminal Emulators.md b/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Terminal Emulators.md deleted file mode 100644 index e0b3180..0000000 --- a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/Terminal Emulators.md +++ /dev/null @@ -1,12 +0,0 @@ - - -Of course the terminal that I have been using and continue to use is the just the tool called **Terminal** on MacOS. However, there are numerous terminal emulators to make your terminal environment a better place to live in. This sometimes enters a place of particularities and nit-picky minutia as it is really up to your own preference what you go with. - -- The Terminal -- iTerm -- iTerm2 -- Alacritty - - written in rust -- [Kitty](https://en.wikipedia.org/wiki/Kitty_(terminal_emulator)) -- Westerm -- [Foot](https://codeberg.org/dnkl/foot) \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Choosing a Name for Your Computer.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Choosing a Name for Your Computer.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Choosing a Name for Your Computer.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Choosing a Name for Your Computer.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Cron.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Cron.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Cron.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Cron.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/AlpaLinux.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/AlpaLinux.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/AlpaLinux.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/AlpaLinux.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/Android Apps.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/Android Apps.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/Android Apps.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/Android Apps.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/KDE/KDE Linux.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/KDE/KDE Linux.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/KDE/KDE Linux.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/KDE/KDE Linux.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/KDE/Users.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/KDE/Users.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/KDE/Users.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/KDE/Users.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/KDE/Wifi.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/KDE/Wifi.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/KDE/Wifi.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/KDE/Wifi.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/Linux Distributions.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/Linux Distributions.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/Linux Distributions.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/Linux Distributions.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/NixOS.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/NixOS.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/Distributions/NixOS.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/Distributions/NixOS.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/How Fuzzing with AFL Works.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/How Fuzzing with AFL Works.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Linux/How Fuzzing with AFL Works.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/How Fuzzing with AFL Works.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/NixOS Package Manager.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/NixOS Package Manager.md new file mode 100644 index 0000000..1e6ea06 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/System Client/Linux/NixOS Package Manager.md @@ -0,0 +1,3 @@ + +A way to start a nix server. +Follow the steps [outlined here](https://nixos.org/download.html#nix-install-docker) for all operating systems. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/Apple Script.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Apple Script.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/Apple Script.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Apple Script.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/BBEdit.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/BBEdit.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/BBEdit.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/BBEdit.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/CLM.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/CLM.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/CLM.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/CLM.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/Example CLM.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Example CLM.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/Example CLM.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Example CLM.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/Launchd.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Launchd.md similarity index 96% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/Launchd.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Launchd.md index 1dea963..b1a48e4 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/Launchd.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/Launchd.md @@ -1,5 +1,7 @@ A MacOS specific version of a [cron](obsidian://open?vault=enter&file=Coding%20Tips%20(Classical)%2FTerminal%20Tips%2FShells%2FComputers%20(operating%20system)%2FLinux%2FCrontab) that automates scripts and programs. +For the `man` page for `launchctl`, please visit [here](https://ss64.com/osx/launchctl.html). + In computing, **launchd**, a unified operating system service management framework, starts, stops and manages daemons, applications, processes, and scripts in macOS. It was introduced with Mac OS X Tiger and is licensed under the Apache License —Wikipedia. For more tips with launchd please head [here](https://www.maketecheasier.com/use-launchd-run-scripts-on-schedule-macos/). The official source is found [here](https://launchd.info/). My version of LaunchControl for GUI troubleshooting is found [here](https://soma-zone.com/download/). diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/List of language modules.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/List of language modules.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/List of language modules.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/List of language modules.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/plist.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/plist.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/BBEdit/plist.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/BBEdit/plist.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/Mac X Code.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/Mac X Code.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/Mac X Code.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/Mac X Code.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/MacFUSE.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/MacFUSE.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/IDEs & APIs/MacFUSE.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/IDEs & APIs/MacFUSE.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Mac Tips/Hard Disk & SSD.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Mac Tips/Hard Disk & SSD.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Mac Tips/Hard Disk & SSD.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Mac Tips/Hard Disk & SSD.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Mac Tips/How to delete a file on macOS that’s “in use”.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Mac Tips/How to delete a file on macOS that’s “in use”.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Mac Tips/How to delete a file on macOS that’s “in use”.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Mac Tips/How to delete a file on macOS that’s “in use”.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/OSX Apps.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/OSX Apps.md similarity index 78% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/OSX Apps.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/OSX Apps.md index 5708505..75d6ce9 100644 --- a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/OSX Apps.md +++ b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/OSX Apps.md @@ -9,4 +9,8 @@ - [nVALT](https://brettterpstra.com/projects/nvalt/) - a version of [notational](https://notational.net/) velocity. - [Airfoil](https://www.rogueamoeba.com/airfoil/mac/buy.php)- send music to any device - [Bean](https://www.bean-osx.com/Bean.html) - a MacOS word processor that builds upon TextEdit - - check outpossibilities [here](https://www.bean-osx.com/screenshots.html). \ No newline at end of file + - check outpossibilities [here](https://www.bean-osx.com/screenshots.html). + + +Alternatively, for Open Source OSX there is [PureDarwin](https://github.com/PureDarwin/PureDarwin), a wonderful project that needs more hands! +- Darwin is the Open Source core of macOS, and PureDarwin is a community project to extend Darwin into a complete, usable operating system. \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Package Managers/Homebrew.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Package Managers/Homebrew.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Package Managers/Homebrew.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Package Managers/Homebrew.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Package Managers/Launchd info.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Package Managers/Launchd info.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Package Managers/Launchd info.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Package Managers/Launchd info.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Package Managers/MacPorts.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Package Managers/MacPorts.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Package Managers/MacPorts.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Package Managers/MacPorts.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/m-cli.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Package Managers/m-cli.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection/Commands + Settings/m-cli.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Package Managers/m-cli.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Safe Mode & Login Problems.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Safe Mode & Login Problems.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/Safe Mode & Login Problems.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Safe Mode & Login Problems.md diff --git a/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Yabai.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Yabai.md new file mode 100644 index 0000000..14d0773 --- /dev/null +++ b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/Yabai.md @@ -0,0 +1,16 @@ + + +[Yabai](https://github.com/koekeishiya/yabai) is a tiling windows manager for MacOS + +![img](https://github.com/koekeishiya/yabai/blob/master/assets/screenshot.png?raw=true) + + +### Installation + +> [!info]- For MacOS Mojave +> Here's a callout block. + + +> +> +> It supports **Markdown**, [[Internal link|Wikilinks]], and [[Embed files|embeds]]! > ![[Engelbart.jpg]] \ No newline at end of file diff --git a/enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/iOS Apps.md b/enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/iOS Apps.md similarity index 100% rename from enter/Coding Tips (Classical)/Terminal Tips/Computers/Apple Macbook/iOS Apps.md rename to enter/Coding Tips (Classical)/Terminal Tips/System Client/OSX Apple Macbook/iOS Apps.md diff --git a/enter/Excalidraw/Drawing 2023-11-15 14.12.08.excalidraw.md b/enter/Excalidraw/Drawing 2023-11-15 14.12.08.excalidraw.md deleted file mode 100644 index eadc299..0000000 --- a/enter/Excalidraw/Drawing 2023-11-15 14.12.08.excalidraw.md +++ /dev/null @@ -1,15 +0,0 @@ ---- - -excalidraw-plugin: parsed -tags: [excalidraw] - ---- -==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== - - -%% -# Drawing -```json -{"type":"excalidraw","version":2,"source":"https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/1.9.23","elements":[],"appState":{"gridSize":null,"viewBackgroundColor":"#ffffff"}} -``` -%% \ No newline at end of file diff --git a/enter/Machine Tips (Quantum)/Math/Math Software.md b/enter/Machine Tips (Quantum)/Math/Math Software.md index 5f08ae6..8d4fca3 100644 --- a/enter/Machine Tips (Quantum)/Math/Math Software.md +++ b/enter/Machine Tips (Quantum)/Math/Math Software.md @@ -1,7 +1,7 @@ - Here are a list of really great math software to use as you will need to use them in your continued math journey into quantum computation. - [Cantor](https://cantor.kde.org/) - the KDE based mathematical front-end to render your calculations! - ![input text](https://cantor.kde.org/assets/img/variables.gif) - [WolframAlpha](https://www.wolframalpha.com) - a classic math software -- [OmniCalculator](https://www.omnicalculator.com/all) - quite literally all the calculators for all the [calculations](https://www.omnicalculator.com/all) you'll ever need! \ No newline at end of file +- [OmniCalculator](https://www.omnicalculator.com/all) - quite literally all the calculators for all the [calculations](https://www.omnicalculator.com/all) you'll ever need! + diff --git a/enter/Machine Tips (Quantum)/Math/Proofs & Theorems/Charts & Graphs.md b/enter/Machine Tips (Quantum)/Math/Proofs & Theorems/Charts & Graphs.md new file mode 100644 index 0000000..aacd468 --- /dev/null +++ b/enter/Machine Tips (Quantum)/Math/Proofs & Theorems/Charts & Graphs.md @@ -0,0 +1,83 @@ +Use math. Display your empirical findings with charts and graphs. + +## Charts +--- + +A chart is used to map the numbers that you end up. Thanks to Obsidian plugin creating charts is a bit easier now ([documentation](https://charts.phibr0.de/Meta/Charts/Other+Resources)) when needed. For example, a Sankey chart can be created like so: + +```chart +type: sankey +labels: [Oil, "Natural Gas", Coal, "Fossil Fuel", Electricity, Energy] +series: + - data: + - [Oil, 15, "Fossil Fuels"] + - ["Natural Gas", 20, "Fossil Fuels"] + - ["Coal", 25, "Fossil Fuels"] + - ["Coal", 25, "Electricity"] + - ["Fossil Fuels", 60, "Energy"] + - ["Electricity", 25, "Energy"] +priority: + Oil: 1 + Natural Gas: 2 + Coal: 3 + Fossil Fuels: 1 + Electricity: 2 + Energy: 1 +colorFrom: + Oil: "black" + Coal: "gray" + "Fossil Fuels": "slategray" + Electricity: "blue" + Energy: "orange" +colorTo: + Oil: "black" + Coal: "gray" + "Fossil Fuels": "slategray" + Electricity: "blue" + Energy: "orange" +``` + + +Chart Terminology: + +- **Sankey Chart** - a type of flow diagram that visualizes the flow of resources or information between multiple entities. It is particularly useful for showing the distribution of resources, such as energy, materials, costs, or information, through a system. The chart is named after Captain Matthew Henry Phineas Riall Sankey, an Irish engineer who created a diagram to represent the energy efficiency of a steam engine in 1898. + +![sankey](https://upload.wikimedia.org/wikipedia/commons/1/10/JIE_Sankey_V5_Fig1.png) + +In a Sankey chart, entities are represented as nodes, and the flow between them is depicted as directed links or arrows. The width of the arrows is proportional to the quantity of the flow, making it easy to see the relative importance of different flows within the system. The chart is typically used to visualize the input, output, and transformation of resources within a process or system. + +Sankey charts find applications in various fields, including energy management, resource allocation, finance, and environmental analysis. They are effective in communicating complex information in a clear and intuitive manner, helping stakeholders understand the distribution and utilization of resources within a system. + +How to read: +Identify the categories being shown. Follow the paths from one side of the chart to the other. Look out for the big values on each side, the widest connecting bands, the connections that create a trend and those that seem to buck the trend. +These diagrams can get quite busy when made static so be sure to make this interactive. + +![[Pasted image 20231122170526.png]] +- **Heat Map** - uses a matrix layout with color and shading to show the relationship between **two** categories of values. The values are presented along each axis and the corresponding cell is then color-coded to represent the relationship between the two categories. A heat map might be used to show the percentage of people surveyed in different countries (y axis) who voted for different favorite sports (x axis). The darker cells would indicate they were the most popular sports in each country. + +An example of this would be the GitHub activity heat map. However, many more examples are also found in cases of biology and physics in research journals. There is additionally a [heat map plugin ](https://github.com/Richardsl/heatmap-calendar-obsidian)inside of Obsidian. + +How to read: +Look for the general hierarchy of shades from the darkest (highest values) through the mid range shades and to the light shades (lowest). + + + +## Graphs +--- + +[Desmos](https://www.desmos.com/calculator/nnncrmrbrj) is a fantastic online graphing calculator utility. For additional math tools, read [[math software]]. + +- A Bar Graph is easy to read but can have complex data + + +```chart + type: bar + labels: [Monday,Tuesday,Wednesday,Thursday,Friday, Saturday, Sunday,"next Week", "next Month"] + series: + - title: Title 1 + - data: [1,2,3,4,5,6,7,8,9] + - title: Title 2 + - data: [5,4,3,2,1,0,-1,-2,-3] +``` + +``` \ No newline at end of file diff --git a/enter/Machine Tips (Quantum)/Resources/Post-Processing/QCVV.md b/enter/Machine Tips (Quantum)/Resources/Post-Processing/QCVV.md index 7c20a17..055efb8 100644 --- a/enter/Machine Tips (Quantum)/Resources/Post-Processing/QCVV.md +++ b/enter/Machine Tips (Quantum)/Resources/Post-Processing/QCVV.md @@ -2,4 +2,6 @@ QCVV or quantum computer verification and validation is the set of tools that ar - There is an abandoned project called [Decodoku](https://github.com/decodoku/A_Game_to_Benchmark_Quantum_Computers) that is used to benchmark quantum computers? - the [paper is found here](https://arxiv.org/pdf/1806.02736.pdf) and states that [error mitigation](obsidian://open?vault=Obsidian&file=Quantum%20Vault%2FQuantum%20Realm%2FPost-Processing%2FQEC) is a necessary step to determine comparitive behavior -![[Pasted image 20230214113937.png]] \ No newline at end of file +![[Pasted image 20230214113937.png]] + +- [Inspo](https://validator.w3.org/nu/?doc=https%3A%2F%2Fwww.dokuwiki.org%2Fdokuwiki) on a validator site similar to the HTML checker \ No newline at end of file diff --git a/enter/Review & Putting it all together.md b/enter/Review & Putting it all together.md deleted file mode 100644 index 5fea25d..0000000 --- a/enter/Review & Putting it all together.md +++ /dev/null @@ -1,71 +0,0 @@ - -# Web Design with Shway ! -Welcome back. 😁 -
    - -![gif](https://c.tenor.com/MS_AYz3G8t4AAAAC/tenor.gif) - ---- -## STEP 1: Open up a google doc, images & background color. - -[https://html.onlineviewer.net/](https://html.onlineviewer.net/) - - -```html -    - -  - -  -

    Blah balah

      - - - - - - -``` - - ---- - -### STEP 2: Adding tables & embedding games + videos! - -We have all heard about Scratch? Played games last week? -Let's play geometry dash --> [Geometry Dash ](https://scratch.mit.edu/projects/835488610/) - -But **On our website!** :D - -*Add your own games here* - -```html -    - -  - -  -

    Blah balah

      -

    Lorem ipsum about random stuff that interests me.

    - -

    Geometry Dash Blah

    - - - - - -``` - - - ---- - - -### STEP 3: Publishing the website & additional CSS.  - -[https://neocities.org/browse](https://neocities.org/browse)** - ---- - -### Step 4: Additional Tips - -* Go to [https://html-online.com/editor/](https://html-online.com/editor/) to learn about adding tables. \ No newline at end of file