obsidian-dev-utils 82.0.0-beta.9 → 83.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -16
- package/dist/dev/main.js +31004 -0
- package/dist/dev/manifest.json +9 -0
- package/dist/lib/cjs/blob.cjs +3 -3
- package/dist/lib/cjs/debug.cjs +4 -11
- package/dist/lib/cjs/generated-during-build.cjs +139 -0
- package/dist/lib/cjs/generated-during-build.d.cts +19 -0
- package/dist/lib/cjs/html-element.cjs +103 -31
- package/dist/lib/cjs/html-element.d.cts +8 -8
- package/dist/lib/cjs/index.cjs +4 -4
- package/dist/lib/cjs/index.d.cts +1 -1
- package/dist/lib/cjs/library.cjs +58 -7
- package/dist/lib/cjs/library.d.cts +65 -6
- package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +5 -1
- package/dist/lib/cjs/obsidian/css-class.cjs +180 -0
- package/dist/lib/cjs/{css-class.d.cts → obsidian/css-class.d.cts} +9 -1
- package/dist/lib/cjs/obsidian/editor-lock.cjs +107 -31
- package/dist/lib/cjs/obsidian/editor-lock.d.cts +10 -7
- package/dist/lib/cjs/obsidian/{plugin/plugin-id.cjs → html-element.cjs} +11 -19
- package/dist/lib/cjs/obsidian/html-element.d.cts +18 -0
- package/dist/lib/cjs/obsidian/index.cjs +7 -1
- package/dist/lib/cjs/obsidian/index.d.cts +2 -0
- package/dist/lib/cjs/obsidian/modals/alert.cjs +2 -2
- package/dist/lib/cjs/obsidian/modals/confirm.cjs +2 -2
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +4 -2
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +2 -2
- package/dist/lib/cjs/obsidian/modals/select-item.cjs +2 -2
- package/dist/lib/cjs/obsidian/plugin/index.cjs +1 -4
- package/dist/lib/cjs/obsidian/plugin/index.d.cts +0 -1
- package/dist/lib/cjs/obsidian/plugin/plugin-context.cjs +15 -8
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/date-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/date-time-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/email-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/file-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/month-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-file-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/number-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/password-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/time-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/setting-components/url-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/setting-components/week-component.cjs +2 -2
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +60 -8
- package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.cjs +145 -0
- package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.d.cts +32 -0
- package/dist/lib/cjs/script-utils/linters/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +3 -3
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +4 -4
- package/dist/lib/cjs/setup.cjs +3 -1
- package/dist/lib/cjs/setup.d.cts +6 -4
- package/dist/lib/esm/blob.mjs +3 -3
- package/dist/lib/esm/debug.mjs +8 -15
- package/dist/lib/esm/generated-during-build.d.mts +19 -0
- package/dist/lib/esm/generated-during-build.mjs +30 -0
- package/dist/lib/esm/html-element.d.mts +8 -8
- package/dist/lib/esm/html-element.mjs +103 -30
- package/dist/lib/esm/index.d.mts +1 -1
- package/dist/lib/esm/index.mjs +3 -3
- package/dist/lib/esm/library.d.mts +65 -6
- package/dist/lib/esm/library.mjs +57 -5
- package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +5 -1
- package/dist/lib/esm/{css-class.d.mts → obsidian/css-class.d.mts} +9 -1
- package/dist/lib/esm/obsidian/css-class.mjs +72 -0
- package/dist/lib/esm/obsidian/editor-lock.d.mts +10 -7
- package/dist/lib/esm/obsidian/editor-lock.mjs +109 -32
- package/dist/lib/esm/obsidian/html-element.d.mts +18 -0
- package/dist/lib/esm/obsidian/html-element.mjs +33 -0
- package/dist/lib/esm/obsidian/index.d.mts +2 -0
- package/dist/lib/esm/obsidian/index.mjs +5 -1
- package/dist/lib/esm/obsidian/modals/alert.mjs +2 -2
- package/dist/lib/esm/obsidian/modals/confirm.mjs +2 -2
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +4 -2
- package/dist/lib/esm/obsidian/modals/prompt.mjs +2 -2
- package/dist/lib/esm/obsidian/modals/select-item.mjs +2 -2
- package/dist/lib/esm/obsidian/plugin/index.d.mts +0 -1
- package/dist/lib/esm/obsidian/plugin/index.mjs +1 -3
- package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +15 -9
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/date-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/email-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/file-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/month-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/number-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/password-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/time-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/url-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/week-component.mjs +2 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +54 -9
- package/dist/lib/esm/script-utils/linters/eslint-agnostic-core-boundary.d.mts +32 -0
- package/dist/lib/esm/script-utils/linters/eslint-agnostic-core-boundary.mjs +37 -0
- package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +4 -4
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +3 -3
- package/dist/lib/esm/setup.d.mts +6 -4
- package/dist/lib/esm/setup.mjs +3 -1
- package/dist/styles.css +12 -2
- package/obsidian/css-class/package.json +6 -0
- package/obsidian/html-element/package.json +6 -0
- package/package.json +9 -9
- package/script-utils/linters/eslint-agnostic-core-boundary/package.json +6 -0
- package/dist/lib/cjs/css-class.cjs +0 -178
- package/dist/lib/cjs/obsidian/plugin/plugin-id.d.cts +0 -22
- package/dist/lib/esm/css-class.mjs +0 -70
- package/dist/lib/esm/obsidian/plugin/plugin-id.d.mts +0 -22
- package/dist/lib/esm/obsidian/plugin/plugin-id.mjs +0 -39
- package/obsidian/Plugin/plugin-id/package.json +0 -6
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function initEsm() {
|
|
7
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
8
|
+
if (globalThis.process) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const browserProcess = {
|
|
13
|
+
browser: true,
|
|
14
|
+
cwd() {
|
|
15
|
+
return '/';
|
|
16
|
+
},
|
|
17
|
+
env: {},
|
|
18
|
+
platform: 'android'
|
|
19
|
+
};
|
|
20
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
21
|
+
globalThis.process = browserProcess;
|
|
22
|
+
})();
|
|
23
|
+
|
|
24
|
+
const LIBRARY_VERSION = "83.0.0";
|
|
25
|
+
const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;ACvEJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACRJ;EACE;;;ACDF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
26
|
+
export {
|
|
27
|
+
LIBRARY_STYLES,
|
|
28
|
+
LIBRARY_VERSION
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dlbmVyYXRlZC1kdXJpbmctYnVpbGQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWYWx1ZXMgc3Vic3RpdHV0ZWQgaW50byB0aGUgYnVpbHQgbGlicmFyeSBkdXJpbmcgcmVsZWFzZS5cbiAqXG4gKiBUaGUgYCQoLi4uKWAgcGxhY2Vob2xkZXJzIGJlbG93IGFyZSBpbmVydCBzb3VyY2UgdGV4dDsgdGhlIHJlbGVhc2Ugc3RlcCAoYHNjcmlwdHMvdmVyc2lvbi50c2ApXG4gKiByZXdyaXRlcyB0aGVtIGluIHRoZSBjb21waWxlZCBgZ2VuZXJhdGVkLWR1cmluZy1idWlsZC57Y2pzLG1qc31gIG91dHB1dCB3aXRoIHRoZSByZWFsIGxpYnJhcnlcbiAqIHZlcnNpb24gYW5kIGJ1bmRsZWQgc3R5bGVzLiBUaGV5IGNhcnJ5IG5vIE9ic2lkaWFuIGltcG9ydCBvciBBUEksIHNvIHRoaXMgbW9kdWxlIHN0YXlzXG4gKiBPYnNpZGlhbi1ydW50aW1lLWFnbm9zdGljLlxuICovXG5cbi8qKlxuICogQSB2ZXJzaW9uIG9mIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBsaWJyYXJ5LlxuICovXG5leHBvcnQgY29uc3QgTElCUkFSWV9WRVJTSU9OID0gJyQoTElCUkFSWV9WRVJTSU9OKSc7XG5cbi8qKlxuICogQSBzdHlsZXMgb2YgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX1NUWUxFUyA9ICckKExJQlJBUllfU1RZTEVTKSc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNPLE1BQU0sa0JBQWtCO0FBS3hCLE1BQU0saUJBQWlCOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -2,7 +2,14 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* @file
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Obsidian-runtime-agnostic helpers for working with HTML elements.
|
|
6
|
+
*
|
|
7
|
+
* Several helpers here mirror behavior that the Obsidian runtime injects onto the DOM prototypes
|
|
8
|
+
* (`createEl`/`createDiv`/`createSpan`/`createSvg`/`createFragment`, `Node.prototype.instanceOf`,
|
|
9
|
+
* `Element.prototype.setText`/`setAttrs`). To stay independent of the Obsidian runtime, that behavior
|
|
10
|
+
* is reimplemented here in standard DOM, ported from Obsidian's own implementation in
|
|
11
|
+
* `obsidian.asar/enhance.js`. See the `obsidian-versions` project; revalidate the port when Obsidian
|
|
12
|
+
* changes `enhance.js` (there is a reminder in `CLAUDE.md`).
|
|
6
13
|
*/
|
|
7
14
|
import type { Promisable } from 'type-fest';
|
|
8
15
|
/**
|
|
@@ -30,13 +37,6 @@ export interface ValidatorElement extends HTMLElement {
|
|
|
30
37
|
*/
|
|
31
38
|
readonly validationMessage: string;
|
|
32
39
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Appends a code block to the given DocumentFragment or HTMLElement.
|
|
35
|
-
*
|
|
36
|
-
* @param el - The DocumentFragment or HTMLElement to append the code block to.
|
|
37
|
-
* @param code - The code to be displayed in the code block.
|
|
38
|
-
*/
|
|
39
|
-
export declare function appendCodeBlock(el: DocumentFragment | HTMLElement, code: string): void;
|
|
40
40
|
/**
|
|
41
41
|
* Creates a div asynchronously.
|
|
42
42
|
*
|
|
@@ -22,33 +22,29 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
24
|
import { CallbackDisposable } from "./disposable.mjs";
|
|
25
|
-
|
|
26
|
-
el.createEl("strong", { cls: "markdown-rendered code" }, (strong) => {
|
|
27
|
-
strong.createEl("code", { text: code });
|
|
28
|
-
});
|
|
29
|
-
}
|
|
25
|
+
const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
|
|
30
26
|
async function createDivAsync(o, callback) {
|
|
31
|
-
const div =
|
|
27
|
+
const div = createHtmlElement("div", o);
|
|
32
28
|
await callback?.(div);
|
|
33
29
|
return div;
|
|
34
30
|
}
|
|
35
31
|
async function createElAsync(tag, o, callback) {
|
|
36
|
-
const el =
|
|
32
|
+
const el = createHtmlElement(tag, o);
|
|
37
33
|
await callback?.(el);
|
|
38
34
|
return el;
|
|
39
35
|
}
|
|
40
36
|
async function createFragmentAsync(callback) {
|
|
41
|
-
const fragment =
|
|
37
|
+
const fragment = document.createDocumentFragment();
|
|
42
38
|
await callback?.(fragment);
|
|
43
39
|
return fragment;
|
|
44
40
|
}
|
|
45
41
|
async function createSpanAsync(o, callback) {
|
|
46
|
-
const span =
|
|
42
|
+
const span = createHtmlElement("span", o);
|
|
47
43
|
await callback?.(span);
|
|
48
44
|
return span;
|
|
49
45
|
}
|
|
50
46
|
async function createSvgAsync(tag, o, callback) {
|
|
51
|
-
const svg =
|
|
47
|
+
const svg = createSvgElement(tag, o);
|
|
52
48
|
await callback?.(svg);
|
|
53
49
|
return svg;
|
|
54
50
|
}
|
|
@@ -56,7 +52,8 @@ async function ensureLoaded(el) {
|
|
|
56
52
|
if (isLoaded(el)) {
|
|
57
53
|
return;
|
|
58
54
|
}
|
|
59
|
-
|
|
55
|
+
const win = getNodeWindow(el);
|
|
56
|
+
if (isInstanceOf(el, win.HTMLBodyElement) || isInstanceOf(el, win.HTMLImageElement) || isInstanceOf(el, win.HTMLIFrameElement) || isInstanceOf(el, win.HTMLEmbedElement) || isInstanceOf(el, win.HTMLLinkElement) || isInstanceOf(el, win.HTMLObjectElement) || isInstanceOf(el, win.HTMLStyleElement) || isInstanceOf(el, win.HTMLTrackElement)) {
|
|
60
57
|
await new Promise((resolve) => {
|
|
61
58
|
el.addEventListener("load", resolve);
|
|
62
59
|
el.addEventListener("error", resolve);
|
|
@@ -87,40 +84,43 @@ function isElementVisibleInOffsetParent(el) {
|
|
|
87
84
|
return parentElRect.top <= elRect.top && elRect.bottom <= parentElRect.bottom && parentElRect.left <= elRect.left && elRect.right <= parentElRect.right;
|
|
88
85
|
}
|
|
89
86
|
function isLoaded(el) {
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
const win = getNodeWindow(el);
|
|
88
|
+
if (isInstanceOf(el, win.HTMLBodyElement)) {
|
|
89
|
+
const readyState = el.ownerDocument.readyState;
|
|
90
|
+
return readyState === "complete" || readyState === "interactive";
|
|
92
91
|
}
|
|
93
|
-
if (el.
|
|
92
|
+
if (isInstanceOf(el, win.HTMLImageElement)) {
|
|
94
93
|
return el.complete && el.naturalWidth > 0;
|
|
95
94
|
}
|
|
96
|
-
if (el.
|
|
95
|
+
if (isInstanceOf(el, win.HTMLIFrameElement)) {
|
|
97
96
|
return !!el.contentDocument;
|
|
98
97
|
}
|
|
99
|
-
if (el.
|
|
98
|
+
if (isInstanceOf(el, win.HTMLEmbedElement)) {
|
|
100
99
|
return !!el.getSVGDocument();
|
|
101
100
|
}
|
|
102
|
-
if (el.
|
|
101
|
+
if (isInstanceOf(el, win.HTMLLinkElement)) {
|
|
103
102
|
return el.rel === "stylesheet" ? el.sheet !== null : true;
|
|
104
103
|
}
|
|
105
|
-
if (el.
|
|
104
|
+
if (isInstanceOf(el, win.HTMLObjectElement)) {
|
|
106
105
|
return !!el.contentDocument || !!el.getSVGDocument();
|
|
107
106
|
}
|
|
108
|
-
if (el.
|
|
107
|
+
if (isInstanceOf(el, win.HTMLScriptElement)) {
|
|
109
108
|
return true;
|
|
110
109
|
}
|
|
111
|
-
if (el.
|
|
110
|
+
if (isInstanceOf(el, win.HTMLStyleElement)) {
|
|
112
111
|
return !!el.sheet;
|
|
113
112
|
}
|
|
114
|
-
if (el.
|
|
113
|
+
if (isInstanceOf(el, win.HTMLTrackElement)) {
|
|
115
114
|
const READY_STATE_LOADED = 2;
|
|
116
115
|
return el.readyState === READY_STATE_LOADED;
|
|
117
116
|
}
|
|
118
117
|
return getLoadableElements(el).every(isLoaded);
|
|
119
118
|
}
|
|
120
119
|
function onAncestorScrollOrResize(node, callback) {
|
|
120
|
+
const win = getNodeWindow(node);
|
|
121
121
|
const ancestors = [];
|
|
122
|
-
ancestors.push(
|
|
123
|
-
ancestors.push(
|
|
122
|
+
ancestors.push(node.ownerDocument ?? win.document);
|
|
123
|
+
ancestors.push(win);
|
|
124
124
|
let currentNode = node;
|
|
125
125
|
while (currentNode) {
|
|
126
126
|
ancestors.push(currentNode);
|
|
@@ -144,7 +144,7 @@ function onAncestorScrollOrResize(node, callback) {
|
|
|
144
144
|
return;
|
|
145
145
|
}
|
|
146
146
|
isEventTriggered = true;
|
|
147
|
-
|
|
147
|
+
win.requestAnimationFrame(() => {
|
|
148
148
|
try {
|
|
149
149
|
callback();
|
|
150
150
|
} finally {
|
|
@@ -160,18 +160,91 @@ function waitUntilConnected(el) {
|
|
|
160
160
|
return new Promise((resolve) => {
|
|
161
161
|
if (el.isConnected) {
|
|
162
162
|
resolve();
|
|
163
|
-
|
|
164
|
-
el.onNodeInserted(() => {
|
|
165
|
-
resolve();
|
|
166
|
-
}, true);
|
|
163
|
+
return;
|
|
167
164
|
}
|
|
165
|
+
const ownerDocument = el.ownerDocument;
|
|
166
|
+
const observer = new (getNodeWindow(el)).MutationObserver(() => {
|
|
167
|
+
if (el.isConnected) {
|
|
168
|
+
observer.disconnect();
|
|
169
|
+
resolve();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
observer.observe(ownerDocument, { childList: true, subtree: true });
|
|
168
173
|
});
|
|
169
174
|
}
|
|
175
|
+
function applyDomElementInfo(el, o) {
|
|
176
|
+
const info = typeof o === "string" ? { cls: o } : o ?? {};
|
|
177
|
+
if (info.cls !== void 0) {
|
|
178
|
+
el.className = Array.isArray(info.cls) ? info.cls.join(" ") : info.cls;
|
|
179
|
+
}
|
|
180
|
+
if (info.text !== void 0) {
|
|
181
|
+
setElementText(el, info.text);
|
|
182
|
+
}
|
|
183
|
+
if (info.attr) {
|
|
184
|
+
setElementAttrs(el, info.attr);
|
|
185
|
+
}
|
|
186
|
+
if (info.title !== void 0) {
|
|
187
|
+
el.title = info.title;
|
|
188
|
+
}
|
|
189
|
+
insertIntoParent(el, info);
|
|
190
|
+
}
|
|
191
|
+
function createHtmlElement(tag, o) {
|
|
192
|
+
const el = document.createElement(tag);
|
|
193
|
+
applyDomElementInfo(el, o);
|
|
194
|
+
return el;
|
|
195
|
+
}
|
|
196
|
+
function createSvgElement(tag, o) {
|
|
197
|
+
const svg = document.createElementNS(SVG_NAMESPACE, tag);
|
|
198
|
+
const info = typeof o === "string" ? { cls: o } : o ?? {};
|
|
199
|
+
if (info.cls !== void 0) {
|
|
200
|
+
if (Array.isArray(info.cls)) {
|
|
201
|
+
svg.classList.add(...info.cls);
|
|
202
|
+
} else {
|
|
203
|
+
svg.classList.add(info.cls);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (info.attr) {
|
|
207
|
+
setElementAttrs(svg, info.attr);
|
|
208
|
+
}
|
|
209
|
+
insertIntoParent(svg, info);
|
|
210
|
+
return svg;
|
|
211
|
+
}
|
|
170
212
|
function getLoadableElements(el) {
|
|
171
213
|
return Array.from(el.querySelectorAll("body, img, iframe, embed, link, object, script, style, track"));
|
|
172
214
|
}
|
|
215
|
+
function getNodeWindow(node) {
|
|
216
|
+
return node.ownerDocument?.defaultView ?? window;
|
|
217
|
+
}
|
|
218
|
+
function insertIntoParent(el, info) {
|
|
219
|
+
if (!info.parent) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (info.prepend) {
|
|
223
|
+
info.parent.insertBefore(el, info.parent.firstChild);
|
|
224
|
+
} else {
|
|
225
|
+
info.parent.appendChild(el);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function isInstanceOf(node, ctor) {
|
|
229
|
+
return node instanceof ctor;
|
|
230
|
+
}
|
|
231
|
+
function setElementAttrs(el, attr) {
|
|
232
|
+
for (const [name, value] of Object.entries(attr)) {
|
|
233
|
+
if (value === null) {
|
|
234
|
+
el.removeAttribute(name);
|
|
235
|
+
} else {
|
|
236
|
+
el.setAttribute(name, String(value));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function setElementText(el, text) {
|
|
241
|
+
if (text instanceof DocumentFragment) {
|
|
242
|
+
el.replaceChildren(text);
|
|
243
|
+
} else {
|
|
244
|
+
el.textContent = text;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
173
247
|
export {
|
|
174
|
-
appendCodeBlock,
|
|
175
248
|
createDivAsync,
|
|
176
249
|
createElAsync,
|
|
177
250
|
createFragmentAsync,
|
|
@@ -185,4 +258,4 @@ export {
|
|
|
185
258
|
toPx,
|
|
186
259
|
waitUntilConnected
|
|
187
260
|
};
|
|
188
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0bWwtZWxlbWVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEhlbHBlcnMgZm9yIHdvcmtpbmcgd2l0aCBIVE1MIGVsZW1lbnRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IENhbGxiYWNrRGlzcG9zYWJsZSB9IGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5cbi8qKlxuICogQSBIVE1MIGVsZW1lbnQgdGhhdCBjYW4gYmUgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgaXMgdmFsaWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHRoZSB2YWxpZGl0eSBvZiB0aGUgZWxlbWVudC5cbiAgICovXG4gIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSBvbiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2V0IG9uIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3I6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFuIGVycm9yIG1lc3NhZ2Ugb2YgdGhlIGVsZW1lbnQuXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFwcGVuZHMgYSBjb2RlIGJsb2NrIHRvIHRoZSBnaXZlbiBEb2N1bWVudEZyYWdtZW50IG9yIEhUTUxFbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBEb2N1bWVudEZyYWdtZW50IG9yIEhUTUxFbGVtZW50IHRvIGFwcGVuZCB0aGUgY29kZSBibG9jayB0by5cbiAqIEBwYXJhbSBjb2RlIC0gVGhlIGNvZGUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjb2RlIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29kZUJsb2NrKGVsOiBEb2N1bWVudEZyYWdtZW50IHwgSFRNTEVsZW1lbnQsIGNvZGU6IHN0cmluZyk6IHZvaWQge1xuICBlbC5jcmVhdGVFbCgnc3Ryb25nJywgeyBjbHM6ICdtYXJrZG93bi1yZW5kZXJlZCBjb2RlJyB9LCAoc3Ryb25nKSA9PiB7XG4gICAgc3Ryb25nLmNyZWF0ZUVsKCdjb2RlJywgeyB0ZXh0OiBjb2RlIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGl2IGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBkaXYgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRpdi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURpdkFzeW5jKFxuICBvPzogRG9tRWxlbWVudEluZm8gfCBzdHJpbmcsXG4gIGNhbGxiYWNrPzogKGVsOiBIVE1MRGl2RWxlbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MRGl2RWxlbWVudD4ge1xuICBjb25zdCBkaXYgPSBjcmVhdGVEaXYobyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZGl2KTtcbiAgcmV0dXJuIGRpdjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHR5cGVQYXJhbSBLIC0gVGhlIHRhZyBuYW1lIGtleSBmcm9tIGBIVE1MRWxlbWVudFRhZ05hbWVNYXBgLlxuICogQHBhcmFtIHRhZyAtIFRoZSB0YWcgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBjcmVhdGUuXG4gKiBAcGFyYW0gbyAtIFRoZSBlbGVtZW50IGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZWxlbWVudC5cbiAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI2NyZWF0ZUVsfSAob3IgY3JlYXRlU3ZnLCBjb3JyZXNwb25kaW5nbHkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRWxBc3luYzxLIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwPihcbiAgdGFnOiBLLFxuICBvPzogRG9tRWxlbWVudEluZm8gfCBzdHJpbmcsXG4gIGNhbGxiYWNrPzogKGVsOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS10pID0+IFByb21pc2FibGU8dm9pZD5cbik6IFByb21pc2U8SFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tdPiB7XG4gIGNvbnN0IGVsID0gY3JlYXRlRWwodGFnLCBvKTtcbiAgYXdhaXQgY2FsbGJhY2s/LihlbCk7XG4gIHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgRG9jdW1lbnRGcmFnbWVudCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBEb2N1bWVudEZyYWdtZW50IGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBEb2N1bWVudEZyYWdtZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRBc3luYyhjYWxsYmFjaz86IChlbDogRG9jdW1lbnRGcmFnbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8RG9jdW1lbnRGcmFnbWVudD4ge1xuICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZnJhZ21lbnQpO1xuICByZXR1cm4gZnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNwYW4gYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIG8gLSBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHNwYW4gaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNwYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTcGFuQXN5bmMoXG4gIG8/OiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyxcbiAgY2FsbGJhY2s/OiAoZWw6IEhUTUxTcGFuRWxlbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MU3BhbkVsZW1lbnQ+IHtcbiAgY29uc3Qgc3BhbiA9IGNyZWF0ZVNwYW4obyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oc3Bhbik7XG4gIHJldHVybiBzcGFuO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdmcgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHR5cGVQYXJhbSBLIC0gVGhlIHRhZyBuYW1lIGtleSBmcm9tIGBTVkdFbGVtZW50VGFnTmFtZU1hcGAuXG4gKiBAcGFyYW0gdGFnIC0gVGhlIHRhZyBuYW1lIG9mIHRoZSBzdmcgdG8gY3JlYXRlLlxuICogQHBhcmFtIG8gLSBUaGUgc3ZnIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgc3ZnIGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdmcuXG4gKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNjcmVhdGVTdmd9IChvciBjcmVhdGVFbCwgY29ycmVzcG9uZGluZ2x5KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN2Z0FzeW5jPEsgZXh0ZW5kcyBrZXlvZiBTVkdFbGVtZW50VGFnTmFtZU1hcD4oXG4gIHRhZzogSyxcbiAgbz86IHN0cmluZyB8IFN2Z0VsZW1lbnRJbmZvLFxuICBjYWxsYmFjaz86IChlbDogU1ZHRWxlbWVudFRhZ05hbWVNYXBbS10pID0+IFByb21pc2FibGU8dm9pZD5cbik6IFByb21pc2U8U1ZHRWxlbWVudFRhZ05hbWVNYXBbS10+IHtcbiAgY29uc3Qgc3ZnID0gY3JlYXRlU3ZnKHRhZywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oc3ZnKTtcbiAgcmV0dXJuIHN2Zztcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGVuc3VyZSBpcyBsb2FkZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaXMgbG9hZGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTG9hZGVkKGVsOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpc0xvYWRlZChlbCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKFxuICAgIGVsLmluc3RhbmNlT2YoSFRNTEJvZHlFbGVtZW50KVxuICAgIHx8IGVsLmluc3RhbmNlT2YoSFRNTEltYWdlRWxlbWVudClcbiAgICB8fCBlbC5pbnN0YW5jZU9mKEhUTUxJRnJhbWVFbGVtZW50KVxuICAgIHx8IGVsLmluc3RhbmNlT2YoSFRNTEVtYmVkRWxlbWVudClcbiAgICB8fCBlbC5pbnN0YW5jZU9mKEhUTUxMaW5rRWxlbWVudClcbiAgICB8fCBlbC5pbnN0YW5jZU9mKEhUTUxPYmplY3RFbGVtZW50KVxuICAgIHx8IGVsLmluc3RhbmNlT2YoSFRNTFN0eWxlRWxlbWVudClcbiAgICB8fCBlbC5pbnN0YW5jZU9mKEhUTUxUcmFja0VsZW1lbnQpXG4gICkge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHJlc29sdmUpO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKGdldExvYWRhYmxlRWxlbWVudHMoZWwpLm1hcChlbnN1cmVMb2FkZWQpKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB6LWluZGV4IG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGdldCB0aGUgei1pbmRleCBvZi5cbiAqIEByZXR1cm5zIFRoZSB6LWluZGV4IG9mIHRoZSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0WkluZGV4KGVsOiBFbGVtZW50KTogbnVtYmVyIHtcbiAgbGV0IGVsMjogRWxlbWVudCB8IG51bGwgPSBlbDtcblxuICB3aGlsZSAoZWwyKSB7XG4gICAgY29uc3QgekluZGV4U3RyID0gZ2V0Q29tcHV0ZWRTdHlsZShlbDIpLnpJbmRleDtcbiAgICBjb25zdCB6SW5kZXggPSBOdW1iZXIucGFyc2VJbnQoekluZGV4U3RyLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oekluZGV4KSkge1xuICAgICAgcmV0dXJuIHpJbmRleDtcbiAgICB9XG4gICAgZWwyID0gZWwyLnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgb2Zmc2V0IHBhcmVudC5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIHRoZSBvZmZzZXQgcGFyZW50LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudFZpc2libGVJbk9mZnNldFBhcmVudChlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50RWwgPSBlbC5vZmZzZXRQYXJlbnQ7XG4gIGlmICghcGFyZW50RWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgcGFyZW50RWxSZWN0ID0gcGFyZW50RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgcmV0dXJuIChcbiAgICBwYXJlbnRFbFJlY3QudG9wIDw9IGVsUmVjdC50b3BcbiAgICAmJiBlbFJlY3QuYm90dG9tIDw9IHBhcmVudEVsUmVjdC5ib3R0b21cbiAgICAmJiBwYXJlbnRFbFJlY3QubGVmdCA8PSBlbFJlY3QubGVmdFxuICAgICYmIGVsUmVjdC5yaWdodCA8PSBwYXJlbnRFbFJlY3QucmlnaHRcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIGxvYWRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvYWRlZChlbDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICBpZiAoZWwuaW5zdGFuY2VPZihIVE1MQm9keUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGFjdGl2ZURvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScgfHwgYWN0aXZlRG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJztcbiAgfVxuXG4gIGlmIChlbC5pbnN0YW5jZU9mKEhUTUxJbWFnZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsLmNvbXBsZXRlICYmIGVsLm5hdHVyYWxXaWR0aCA+IDA7XG4gIH1cblxuICBpZiAoZWwuaW5zdGFuY2VPZihIVE1MSUZyYW1lRWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbC5jb250ZW50RG9jdW1lbnQ7XG4gIH1cblxuICBpZiAoZWwuaW5zdGFuY2VPZihIVE1MRW1iZWRFbGVtZW50KSkge1xuICAgIHJldHVybiAhIWVsLmdldFNWR0RvY3VtZW50KCk7XG4gIH1cblxuICBpZiAoZWwuaW5zdGFuY2VPZihIVE1MTGlua0VsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsLnJlbCA9PT0gJ3N0eWxlc2hlZXQnID8gZWwuc2hlZXQgIT09IG51bGwgOiB0cnVlO1xuICB9XG5cbiAgaWYgKGVsLmluc3RhbmNlT2YoSFRNTE9iamVjdEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWwuY29udGVudERvY3VtZW50IHx8ICEhZWwuZ2V0U1ZHRG9jdW1lbnQoKTtcbiAgfVxuXG4gIGlmIChlbC5pbnN0YW5jZU9mKEhUTUxTY3JpcHRFbGVtZW50KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVsLmluc3RhbmNlT2YoSFRNTFN0eWxlRWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbC5zaGVldDtcbiAgfVxuXG4gIGlmIChlbC5pbnN0YW5jZU9mKEhUTUxUcmFja0VsZW1lbnQpKSB7XG4gICAgY29uc3QgUkVBRFlfU1RBVEVfTE9BREVEID0gMjtcbiAgICByZXR1cm4gZWwucmVhZHlTdGF0ZSA9PT0gUkVBRFlfU1RBVEVfTE9BREVEO1xuICB9XG5cbiAgcmV0dXJuIGdldExvYWRhYmxlRWxlbWVudHMoZWwpLmV2ZXJ5KGlzTG9hZGVkKTtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBhbmNlc3RvciBub2RlcyBvZiB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZCB0aGUgZXZlbnQgbGlzdGVuZXIgdG8uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyB3aGVuIGRpc3Bvc2VkLCBmb3IgdXNlIHdpdGggYHVzaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQW5jZXN0b3JTY3JvbGxPclJlc2l6ZShub2RlOiBOb2RlLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6IERpc3Bvc2FibGUge1xuICBjb25zdCBhbmNlc3RvcnM6IEV2ZW50VGFyZ2V0W10gPSBbXTtcbiAgYW5jZXN0b3JzLnB1c2goYWN0aXZlRG9jdW1lbnQpO1xuICBhbmNlc3RvcnMucHVzaChhY3RpdmVXaW5kb3cpO1xuXG4gIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgPSBub2RlO1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGFuY2VzdG9ycy5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICBsZXQgaXNFdmVudFRyaWdnZXJlZCA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgYW5jZXN0b3Igb2YgYW5jZXN0b3JzKSB7XG4gICAgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICBhbmNlc3Rvci5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgICAgICBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgICBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2tTbW9vdGgoKTogdm9pZCB7XG4gICAgaWYgKGlzRXZlbnRUcmlnZ2VyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpc0V2ZW50VHJpZ2dlcmVkID0gdHJ1ZTtcblxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbnVtYmVyIHRvIGEgc3RyaW5nIHdpdGggJ3B4JyBhcHBlbmRlZC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtYmVyIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIGFzIGEgc3RyaW5nIHdpdGggJ3B4JyBhcHBlbmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHgodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtTdHJpbmcodmFsdWUpfXB4YDtcbn1cblxuLyoqXG4gKiBXYWl0cyB1bnRpbCB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdFVudGlsQ29ubmVjdGVkKGVsOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwub25Ob2RlSW5zZXJ0ZWQoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRMb2FkYWJsZUVsZW1lbnRzKGVsOiBFbGVtZW50KTogRWxlbWVudFtdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oZWwucXVlcnlTZWxlY3RvckFsbCgnYm9keSwgaW1nLCBpZnJhbWUsIGVtYmVkLCBsaW5rLCBvYmplY3QsIHNjcmlwdCwgc3R5bGUsIHRyYWNrJykpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLDBCQUEwQjtBQXFDNUIsU0FBUyxnQkFBZ0IsSUFBb0MsTUFBb0I7QUFDdEYsS0FBRyxTQUFTLFVBQVUsRUFBRSxLQUFLLHlCQUF5QixHQUFHLENBQUMsV0FBVztBQUNuRSxXQUFPLFNBQVMsUUFBUSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQUEsRUFD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
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0bWwtZWxlbWVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE9ic2lkaWFuLXJ1bnRpbWUtYWdub3N0aWMgaGVscGVycyBmb3Igd29ya2luZyB3aXRoIEhUTUwgZWxlbWVudHMuXG4gKlxuICogU2V2ZXJhbCBoZWxwZXJzIGhlcmUgbWlycm9yIGJlaGF2aW9yIHRoYXQgdGhlIE9ic2lkaWFuIHJ1bnRpbWUgaW5qZWN0cyBvbnRvIHRoZSBET00gcHJvdG90eXBlc1xuICogKGBjcmVhdGVFbGAvYGNyZWF0ZURpdmAvYGNyZWF0ZVNwYW5gL2BjcmVhdGVTdmdgL2BjcmVhdGVGcmFnbWVudGAsIGBOb2RlLnByb3RvdHlwZS5pbnN0YW5jZU9mYCxcbiAqIGBFbGVtZW50LnByb3RvdHlwZS5zZXRUZXh0YC9gc2V0QXR0cnNgKS4gVG8gc3RheSBpbmRlcGVuZGVudCBvZiB0aGUgT2JzaWRpYW4gcnVudGltZSwgdGhhdCBiZWhhdmlvclxuICogaXMgcmVpbXBsZW1lbnRlZCBoZXJlIGluIHN0YW5kYXJkIERPTSwgcG9ydGVkIGZyb20gT2JzaWRpYW4ncyBvd24gaW1wbGVtZW50YXRpb24gaW5cbiAqIGBvYnNpZGlhbi5hc2FyL2VuaGFuY2UuanNgLiBTZWUgdGhlIGBvYnNpZGlhbi12ZXJzaW9uc2AgcHJvamVjdDsgcmV2YWxpZGF0ZSB0aGUgcG9ydCB3aGVuIE9ic2lkaWFuXG4gKiBjaGFuZ2VzIGBlbmhhbmNlLmpzYCAodGhlcmUgaXMgYSByZW1pbmRlciBpbiBgQ0xBVURFLm1kYCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ2FsbGJhY2tEaXNwb3NhYmxlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcblxuY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5cbi8qKlxuICogQSBIVE1MIGVsZW1lbnQgdGhhdCBjYW4gYmUgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgaXMgdmFsaWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHRoZSB2YWxpZGl0eSBvZiB0aGUgZWxlbWVudC5cbiAgICovXG4gIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSBvbiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2V0IG9uIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3I6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFuIGVycm9yIG1lc3NhZ2Ugb2YgdGhlIGVsZW1lbnQuXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXYgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIG8gLSBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGRpdiBpcyBjcmVhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZGl2LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGl2QXN5bmMoXG4gIG8/OiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyxcbiAgY2FsbGJhY2s/OiAoZWw6IEhUTUxEaXZFbGVtZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4pOiBQcm9taXNlPEhUTUxEaXZFbGVtZW50PiB7XG4gIGNvbnN0IGRpdiA9IGNyZWF0ZUh0bWxFbGVtZW50KCdkaXYnLCBvKTtcbiAgYXdhaXQgY2FsbGJhY2s/LihkaXYpO1xuICByZXR1cm4gZGl2O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZWxlbWVudCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAdHlwZVBhcmFtIEsgLSBUaGUgdGFnIG5hbWUga2V5IGZyb20gYEhUTUxFbGVtZW50VGFnTmFtZU1hcGAuXG4gKiBAcGFyYW0gdGFnIC0gVGhlIHRhZyBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBlbGVtZW50LlxuICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCB7QGxpbmsgb2JzaWRpYW4jY3JlYXRlRWx9IChvciBjcmVhdGVTdmcsIGNvcnJlc3BvbmRpbmdseSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVFbEFzeW5jPEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXA+KFxuICB0YWc6IEssXG4gIG8/OiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyxcbiAgY2FsbGJhY2s/OiAoZWw6IEhUTUxFbGVtZW50VGFnTmFtZU1hcFtLXSkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MRWxlbWVudFRhZ05hbWVNYXBbS10+IHtcbiAgY29uc3QgZWwgPSBjcmVhdGVIdG1sRWxlbWVudCh0YWcsIG8pO1xuICBhd2FpdCBjYWxsYmFjaz8uKGVsKTtcbiAgcmV0dXJuIGVsO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBEb2N1bWVudEZyYWdtZW50IGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIERvY3VtZW50RnJhZ21lbnQgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIERvY3VtZW50RnJhZ21lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudEFzeW5jKGNhbGxiYWNrPzogKGVsOiBEb2N1bWVudEZyYWdtZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTxEb2N1bWVudEZyYWdtZW50PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3ByZWZlci1hY3RpdmUtZG9jIC0tIEFnbm9zdGljIG1vZHVsZTogdXNlIHRoZSBzdGFuZGFyZCBET00gYGRvY3VtZW50YCwgbm90IE9ic2lkaWFuJ3MgYGFjdGl2ZURvY3VtZW50YC5cbiAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZnJhZ21lbnQpO1xuICByZXR1cm4gZnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNwYW4gYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIG8gLSBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHNwYW4gaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNwYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTcGFuQXN5bmMoXG4gIG8/OiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyxcbiAgY2FsbGJhY2s/OiAoZWw6IEhUTUxTcGFuRWxlbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MU3BhbkVsZW1lbnQ+IHtcbiAgY29uc3Qgc3BhbiA9IGNyZWF0ZUh0bWxFbGVtZW50KCdzcGFuJywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oc3Bhbik7XG4gIHJldHVybiBzcGFuO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdmcgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHR5cGVQYXJhbSBLIC0gVGhlIHRhZyBuYW1lIGtleSBmcm9tIGBTVkdFbGVtZW50VGFnTmFtZU1hcGAuXG4gKiBAcGFyYW0gdGFnIC0gVGhlIHRhZyBuYW1lIG9mIHRoZSBzdmcgdG8gY3JlYXRlLlxuICogQHBhcmFtIG8gLSBUaGUgc3ZnIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgc3ZnIGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdmcuXG4gKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNjcmVhdGVTdmd9IChvciBjcmVhdGVFbCwgY29ycmVzcG9uZGluZ2x5KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN2Z0FzeW5jPEsgZXh0ZW5kcyBrZXlvZiBTVkdFbGVtZW50VGFnTmFtZU1hcD4oXG4gIHRhZzogSyxcbiAgbz86IHN0cmluZyB8IFN2Z0VsZW1lbnRJbmZvLFxuICBjYWxsYmFjaz86IChlbDogU1ZHRWxlbWVudFRhZ05hbWVNYXBbS10pID0+IFByb21pc2FibGU8dm9pZD5cbik6IFByb21pc2U8U1ZHRWxlbWVudFRhZ05hbWVNYXBbS10+IHtcbiAgY29uc3Qgc3ZnID0gY3JlYXRlU3ZnRWxlbWVudCh0YWcsIG8pO1xuICBhd2FpdCBjYWxsYmFjaz8uKHN2Zyk7XG4gIHJldHVybiBzdmc7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGlzIGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBlbnN1cmUgaXMgbG9hZGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGlzIGxvYWRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUxvYWRlZChlbDogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaXNMb2FkZWQoZWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHdpbiA9IGdldE5vZGVXaW5kb3coZWwpO1xuICBpZiAoXG4gICAgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTEJvZHlFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxJbWFnZUVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTEVtYmVkRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MTGlua0VsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTE9iamVjdEVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTFN0eWxlRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MVHJhY2tFbGVtZW50KVxuICApIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlc29sdmUpO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCByZXNvbHZlKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChnZXRMb2FkYWJsZUVsZW1lbnRzKGVsKS5tYXAoZW5zdXJlTG9hZGVkKSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgei1pbmRleCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBnZXQgdGhlIHotaW5kZXggb2YuXG4gKiBAcmV0dXJucyBUaGUgei1pbmRleCBvZiB0aGUgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpJbmRleChlbDogRWxlbWVudCk6IG51bWJlciB7XG4gIGxldCBlbDI6IEVsZW1lbnQgfCBudWxsID0gZWw7XG5cbiAgd2hpbGUgKGVsMikge1xuICAgIGNvbnN0IHpJbmRleFN0ciA9IGdldENvbXB1dGVkU3R5bGUoZWwyKS56SW5kZXg7XG4gICAgY29uc3QgekluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHpJbmRleFN0ciwgMTApO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHpJbmRleCkpIHtcbiAgICAgIHJldHVybiB6SW5kZXg7XG4gICAgfVxuICAgIGVsMiA9IGVsMi5wYXJlbnRFbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIG9mZnNldCBwYXJlbnQuXG4gKlxuICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgb2Zmc2V0IHBhcmVudCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnRWaXNpYmxlSW5PZmZzZXRQYXJlbnQoZWw6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcmVudEVsID0gZWwub2Zmc2V0UGFyZW50O1xuICBpZiAoIXBhcmVudEVsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZWxSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHBhcmVudEVsUmVjdCA9IHBhcmVudEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIHJldHVybiAoXG4gICAgcGFyZW50RWxSZWN0LnRvcCA8PSBlbFJlY3QudG9wXG4gICAgJiYgZWxSZWN0LmJvdHRvbSA8PSBwYXJlbnRFbFJlY3QuYm90dG9tXG4gICAgJiYgcGFyZW50RWxSZWN0LmxlZnQgPD0gZWxSZWN0LmxlZnRcbiAgICAmJiBlbFJlY3QucmlnaHQgPD0gcGFyZW50RWxSZWN0LnJpZ2h0XG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBpcyBsb2FkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMb2FkZWQoZWw6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgY29uc3Qgd2luID0gZ2V0Tm9kZVdpbmRvdyhlbCk7XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxCb2R5RWxlbWVudCkpIHtcbiAgICBjb25zdCByZWFkeVN0YXRlID0gZWwub3duZXJEb2N1bWVudC5yZWFkeVN0YXRlO1xuICAgIHJldHVybiByZWFkeVN0YXRlID09PSAnY29tcGxldGUnIHx8IHJlYWR5U3RhdGUgPT09ICdpbnRlcmFjdGl2ZSc7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTEltYWdlRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZWwuY29tcGxldGUgJiYgZWwubmF0dXJhbFdpZHRoID4gMDtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MSUZyYW1lRWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbC5jb250ZW50RG9jdW1lbnQ7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTEVtYmVkRWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbC5nZXRTVkdEb2N1bWVudCgpO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxMaW5rRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZWwucmVsID09PSAnc3R5bGVzaGVldCcgPyBlbC5zaGVldCAhPT0gbnVsbCA6IHRydWU7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTE9iamVjdEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWwuY29udGVudERvY3VtZW50IHx8ICEhZWwuZ2V0U1ZHRG9jdW1lbnQoKTtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MU2NyaXB0RWxlbWVudCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MU3R5bGVFbGVtZW50KSkge1xuICAgIHJldHVybiAhIWVsLnNoZWV0O1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxUcmFja0VsZW1lbnQpKSB7XG4gICAgY29uc3QgUkVBRFlfU1RBVEVfTE9BREVEID0gMjtcbiAgICByZXR1cm4gZWwucmVhZHlTdGF0ZSA9PT0gUkVBRFlfU1RBVEVfTE9BREVEO1xuICB9XG5cbiAgcmV0dXJuIGdldExvYWRhYmxlRWxlbWVudHMoZWwpLmV2ZXJ5KGlzTG9hZGVkKTtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBhbmNlc3RvciBub2RlcyBvZiB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZCB0aGUgZXZlbnQgbGlzdGVuZXIgdG8uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyB3aGVuIGRpc3Bvc2VkLCBmb3IgdXNlIHdpdGggYHVzaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQW5jZXN0b3JTY3JvbGxPclJlc2l6ZShub2RlOiBOb2RlLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6IERpc3Bvc2FibGUge1xuICBjb25zdCB3aW4gPSBnZXROb2RlV2luZG93KG5vZGUpO1xuICBjb25zdCBhbmNlc3RvcnM6IEV2ZW50VGFyZ2V0W10gPSBbXTtcbiAgYW5jZXN0b3JzLnB1c2gobm9kZS5vd25lckRvY3VtZW50ID8/IHdpbi5kb2N1bWVudCk7XG4gIGFuY2VzdG9ycy5wdXNoKHdpbik7XG5cbiAgbGV0IGN1cnJlbnROb2RlOiBOb2RlIHwgbnVsbCA9IG5vZGU7XG5cbiAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XG4gICAgYW5jZXN0b3JzLnB1c2goY3VycmVudE5vZGUpO1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgfVxuXG4gIGxldCBpc0V2ZW50VHJpZ2dlcmVkID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBhbmNlc3RvciBvZiBhbmNlc3RvcnMpIHtcbiAgICBhbmNlc3Rvci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIGFuY2VzdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGNhbGxiYWNrU21vb3RoLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3QgYW5jZXN0b3Igb2YgYW5jZXN0b3JzKSB7XG4gICAgICAgIGFuY2VzdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGNhbGxiYWNrU21vb3RoLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgICAgIGFuY2VzdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGNhbGxiYWNrU21vb3RoLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiBjYWxsYmFja1Ntb290aCgpOiB2b2lkIHtcbiAgICBpZiAoaXNFdmVudFRyaWdnZXJlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzRXZlbnRUcmlnZ2VyZWQgPSB0cnVlO1xuXG4gICAgd2luLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNFdmVudFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIgdG8gYSBzdHJpbmcgd2l0aCAncHgnIGFwcGVuZGVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBudW1iZXIgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgYXMgYSBzdHJpbmcgd2l0aCAncHgnIGFwcGVuZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QeCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke1N0cmluZyh2YWx1ZSl9cHhgO1xufVxuXG4vKipcbiAqIFdhaXRzIHVudGlsIHRoZSBnaXZlbiBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0VW50aWxDb25uZWN0ZWQoZWw6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmIChlbC5pc0Nvbm5lY3RlZCkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ic2lkaWFuJ3MgYGVsLm9uTm9kZUluc2VydGVkYCB1c2VzIGEgYG5vZGUtaW5zZXJ0ZWRgIENTUyBrZXlmcmFtZSBmcm9tIE9ic2lkaWFuJ3Mgc3R5bGVzaGVldC5cbiAgICAvLyBUaGUgYWdub3N0aWMgZXF1aXZhbGVudCBpbnN0ZWFkIG9ic2VydmVzIHRoZSBlbGVtZW50J3MgZG9jdW1lbnQgZm9yIGl0IGJlY29taW5nIGNvbm5lY3RlZC5cbiAgICBjb25zdCBvd25lckRvY3VtZW50ID0gZWwub3duZXJEb2N1bWVudDtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyAoZ2V0Tm9kZVdpbmRvdyhlbCkpLk11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGVsLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUob3duZXJEb2N1bWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIGVsZW1lbnQtdHlwZS1hZ25vc3RpYyBzdWJzZXQgb2Yge0BsaW5rIERvbUVsZW1lbnRJbmZvfSB0aGF0IE9ic2lkaWFuJ3MgYGNyZWF0ZUVsYFxuICogc3VwcG9ydHMgXHUyMDE0IGBjbHNgLCBgdGV4dGAsIGBhdHRyYCwgYHRpdGxlYCwgYW5kIGBwYXJlbnRgL2BwcmVwZW5kYC4gVGhlIGVsZW1lbnQtdHlwZS1zcGVjaWZpY1xuICogZmllbGRzIChgdmFsdWVgLCBgdHlwZWAsIGBwbGFjZWhvbGRlcmAsIGBocmVmYCkgYW5kIHRoZSBgb24qYCBldmVudC1oYW5kbGVyIGtleXMgYXJlIGludGVudGlvbmFsbHlcbiAqIE5PVCBwb3J0ZWQgKG5vIGludGVybmFsIGNhbGxlciBuZWVkcyB0aGVtKTsgZXh0ZW5kIHRoaXMgaWYgYSBjb25zdW1lciBkb2VzIFx1MjAxNCBhbmQgcmV2YWxpZGF0ZSBhZ2FpbnN0XG4gKiBgZW5oYW5jZS5qc2AgKHNlZSB0aGUgYEBmaWxlYCBub3RlIGFuZCBgQ0xBVURFLm1kYCkuXG4gKlxuICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIGluZm8gdG8uXG4gKiBAcGFyYW0gbyAtIFRoZSBlbGVtZW50IGluZm8gKG9yIGEgYmFyZSBjbGFzcyBzdHJpbmcpLlxuICovXG5mdW5jdGlvbiBhcHBseURvbUVsZW1lbnRJbmZvKGVsOiBIVE1MRWxlbWVudCwgbzogRG9tRWxlbWVudEluZm8gfCBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgaW5mbzogRG9tRWxlbWVudEluZm8gPSB0eXBlb2YgbyA9PT0gJ3N0cmluZycgPyB7IGNsczogbyB9IDogbyA/PyB7fTtcblxuICBpZiAoaW5mby5jbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGVsLmNsYXNzTmFtZSA9IEFycmF5LmlzQXJyYXkoaW5mby5jbHMpID8gaW5mby5jbHMuam9pbignICcpIDogaW5mby5jbHM7XG4gIH1cbiAgaWYgKGluZm8udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2V0RWxlbWVudFRleHQoZWwsIGluZm8udGV4dCk7XG4gIH1cbiAgaWYgKGluZm8uYXR0cikge1xuICAgIHNldEVsZW1lbnRBdHRycyhlbCwgaW5mby5hdHRyKTtcbiAgfVxuICBpZiAoaW5mby50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZWwudGl0bGUgPSBpbmZvLnRpdGxlO1xuICB9XG4gIGluc2VydEludG9QYXJlbnQoZWwsIGluZm8pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIdG1sRWxlbWVudDxLIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEssIG8/OiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyk6IEhUTUxFbGVtZW50VGFnTmFtZU1hcFtLXSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3ByZWZlci1hY3RpdmUtZG9jIC0tIEFnbm9zdGljIG1vZHVsZTogdXNlIHRoZSBzdGFuZGFyZCBET00gYGRvY3VtZW50YCwgbm90IE9ic2lkaWFuJ3MgYGFjdGl2ZURvY3VtZW50YC5cbiAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGFwcGx5RG9tRWxlbWVudEluZm8oZWwsIG8pO1xuICByZXR1cm4gZWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN2Z0VsZW1lbnQ8SyBleHRlbmRzIGtleW9mIFNWR0VsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEssIG8/OiBzdHJpbmcgfCBTdmdFbGVtZW50SW5mbyk6IFNWR0VsZW1lbnRUYWdOYW1lTWFwW0tdIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvcHJlZmVyLWFjdGl2ZS1kb2MgLS0gQWdub3N0aWMgbW9kdWxlOiB1c2UgdGhlIHN0YW5kYXJkIERPTSBgZG9jdW1lbnRgLCBub3QgT2JzaWRpYW4ncyBgYWN0aXZlRG9jdW1lbnRgLlxuICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgdGFnKTtcbiAgY29uc3QgaW5mbzogU3ZnRWxlbWVudEluZm8gPSB0eXBlb2YgbyA9PT0gJ3N0cmluZycgPyB7IGNsczogbyB9IDogbyA/PyB7fTtcblxuICBpZiAoaW5mby5jbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGluZm8uY2xzKSkge1xuICAgICAgc3ZnLmNsYXNzTGlzdC5hZGQoLi4uaW5mby5jbHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdmcuY2xhc3NMaXN0LmFkZChpbmZvLmNscyk7XG4gICAgfVxuICB9XG4gIGlmIChpbmZvLmF0dHIpIHtcbiAgICBzZXRFbGVtZW50QXR0cnMoc3ZnLCBpbmZvLmF0dHIpO1xuICB9XG4gIGluc2VydEludG9QYXJlbnQoc3ZnLCBpbmZvKTtcbiAgcmV0dXJuIHN2Zztcbn1cblxuZnVuY3Rpb24gZ2V0TG9hZGFibGVFbGVtZW50cyhlbDogRWxlbWVudCk6IEVsZW1lbnRbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHksIGltZywgaWZyYW1lLCBlbWJlZCwgbGluaywgb2JqZWN0LCBzY3JpcHQsIHN0eWxlLCB0cmFjaycpKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvbm8tZ2xvYmFsLXRoaXMgLS0gVHlwZS1vbmx5OiB0aGUgcmVzb2x2ZWQgd2luZG93IG5lZWRzIHRoZSBnbG9iYWwgRE9NIGNvbnN0cnVjdG9yIHR5cGluZ3MuXG5mdW5jdGlvbiBnZXROb2RlV2luZG93KG5vZGU6IE5vZGUpOiB0eXBlb2YgZ2xvYmFsVGhpcyAmIFdpbmRvdyB7XG4gIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3ID8/IHdpbmRvdztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0SW50b1BhcmVudChlbDogRWxlbWVudCwgaW5mbzogRG9tRWxlbWVudEluZm8gfCBTdmdFbGVtZW50SW5mbyk6IHZvaWQge1xuICBpZiAoIWluZm8ucGFyZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpbmZvLnByZXBlbmQpIHtcbiAgICBpbmZvLnBhcmVudC5pbnNlcnRCZWZvcmUoZWwsIGluZm8ucGFyZW50LmZpcnN0Q2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGluZm8ucGFyZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luc3RhbmNlT2Y8VCBleHRlbmRzIE5vZGU+KG5vZGU6IE5vZGUsIGN0b3I6IGFic3RyYWN0IG5ldyAoLi4uYXJnczogbmV2ZXJbXSkgPT4gVCk6IG5vZGUgaXMgVCB7XG4gIC8vIEFnbm9zdGljIHJlaW1wbGVtZW50YXRpb24gb2YgT2JzaWRpYW4ncyBgTm9kZS5wcm90b3R5cGUuaW5zdGFuY2VPZmAgKGVuaGFuY2UuanMpLlxuICAvLyBUaGUgY2FsbGVyIHJlc29sdmVzIGBjdG9yYCBpbiB0aGUgbm9kZSdzIG93biByZWFsbSAodmlhIGBnZXROb2RlV2luZG93YCksIGtlZXBpbmcgaXQgY3Jvc3Mtd2luZG93IHNhZmUuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3ByZWZlci1pbnN0YW5jZW9mIC0tIFRoaXMgSVMgdGhlIGFnbm9zdGljIGAuaW5zdGFuY2VPZmAgcmVwbGFjZW1lbnQuXG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgY3Rvcjtcbn1cblxuZnVuY3Rpb24gc2V0RWxlbWVudEF0dHJzKGVsOiBFbGVtZW50LCBhdHRyOiBOb25OdWxsYWJsZTxEb21FbGVtZW50SW5mb1snYXR0ciddPik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cikpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKG5hbWUsIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRFbGVtZW50VGV4dChlbDogSFRNTEVsZW1lbnQsIHRleHQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHRleHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgZWwucmVwbGFjZUNoaWxkcmVuKHRleHQpO1xuICB9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
|
package/dist/lib/esm/index.d.mts
CHANGED
|
@@ -5,13 +5,13 @@ export * as 'async-events' from './async-events.mjs';
|
|
|
5
5
|
export * as 'async' from './async.mjs';
|
|
6
6
|
export * as 'blob' from './blob.mjs';
|
|
7
7
|
export * as 'codemirror' from './codemirror/index.mjs';
|
|
8
|
-
export * as 'css-class' from './css-class.mjs';
|
|
9
8
|
export * as 'debug-controller' from './debug-controller.mjs';
|
|
10
9
|
export * as 'debug' from './debug.mjs';
|
|
11
10
|
export * as 'disposable' from './disposable.mjs';
|
|
12
11
|
export * as 'enum' from './enum.mjs';
|
|
13
12
|
export * as 'error' from './error.mjs';
|
|
14
13
|
export * as 'function' from './function.mjs';
|
|
14
|
+
export * as 'generated-during-build' from './generated-during-build.mjs';
|
|
15
15
|
export * as 'html-element' from './html-element.mjs';
|
|
16
16
|
export * as 'library' from './library.mjs';
|
|
17
17
|
export * as 'object-utils' from './object-utils.mjs';
|
package/dist/lib/esm/index.mjs
CHANGED
|
@@ -27,13 +27,13 @@ import * as async_events from "./async-events.mjs";
|
|
|
27
27
|
import * as async from "./async.mjs";
|
|
28
28
|
import * as blob from "./blob.mjs";
|
|
29
29
|
import * as codemirror from "./codemirror/index.mjs";
|
|
30
|
-
import * as css_class from "./css-class.mjs";
|
|
31
30
|
import * as debug_controller from "./debug-controller.mjs";
|
|
32
31
|
import * as debug from "./debug.mjs";
|
|
33
32
|
import * as disposable from "./disposable.mjs";
|
|
34
33
|
import * as enum2 from "./enum.mjs";
|
|
35
34
|
import * as error from "./error.mjs";
|
|
36
35
|
import * as function2 from "./function.mjs";
|
|
36
|
+
import * as generated_during_build from "./generated-during-build.mjs";
|
|
37
37
|
import * as html_element from "./html-element.mjs";
|
|
38
38
|
import * as library from "./library.mjs";
|
|
39
39
|
import * as object_utils from "./object-utils.mjs";
|
|
@@ -57,13 +57,13 @@ export {
|
|
|
57
57
|
async_events as "async-events",
|
|
58
58
|
blob,
|
|
59
59
|
codemirror,
|
|
60
|
-
css_class as "css-class",
|
|
61
60
|
debug,
|
|
62
61
|
debug_controller as "debug-controller",
|
|
63
62
|
disposable,
|
|
64
63
|
enum2 as enum,
|
|
65
64
|
error,
|
|
66
65
|
function2 as function,
|
|
66
|
+
generated_during_build as "generated-during-build",
|
|
67
67
|
html_element as "html-element",
|
|
68
68
|
library,
|
|
69
69
|
object_utils as "object-utils",
|
|
@@ -81,4 +81,4 @@ export {
|
|
|
81
81
|
value_provider as "value-provider",
|
|
82
82
|
value_wrapper as "value-wrapper"
|
|
83
83
|
};
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2Fib3J0LWNvbnRyb2xsZXInIGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXknIGZyb20gJy4vYXJyYXkudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLWV2ZW50cycgZnJvbSAnLi9hc3luYy1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jJyBmcm9tICcuL2FzeW5jLnRzJztcbmV4cG9ydCAqIGFzICdibG9iJyBmcm9tICcuL2Jsb2IudHMnO1xuZXhwb3J0ICogYXMgJ2NvZGVtaXJyb3InIGZyb20gJy4vY29kZW1pcnJvci9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAnZGVidWctY29udHJvbGxlcicgZnJvbSAnLi9kZWJ1Zy1jb250cm9sbGVyLnRzJztcbmV4cG9ydCAqIGFzICdkZWJ1ZycgZnJvbSAnLi9kZWJ1Zy50cyc7XG5leHBvcnQgKiBhcyAnZGlzcG9zYWJsZScgZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcbmV4cG9ydCAqIGFzICdlbnVtJyBmcm9tICcuL2VudW0udHMnO1xuZXhwb3J0ICogYXMgJ2Vycm9yJyBmcm9tICcuL2Vycm9yLnRzJztcbmV4cG9ydCAqIGFzICdmdW5jdGlvbicgZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5leHBvcnQgKiBhcyAnZ2VuZXJhdGVkLWR1cmluZy1idWlsZCcgZnJvbSAnLi9nZW5lcmF0ZWQtZHVyaW5nLWJ1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdodG1sLWVsZW1lbnQnIGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmV4cG9ydCAqIGFzICdsaWJyYXJ5JyBmcm9tICcuL2xpYnJhcnkudHMnO1xuZXhwb3J0ICogYXMgJ29iamVjdC11dGlscycgZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ29ic2lkaWFuJyBmcm9tICcuL29ic2lkaWFuL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdvYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUnIGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmV4cG9ydCAqIGFzICdwYXRoJyBmcm9tICcuL3BhdGgudHMnO1xuZXhwb3J0ICogYXMgJ3JlZy1leHAnIGZyb20gJy4vcmVnLWV4cC50cyc7XG5leHBvcnQgKiBhcyAnc3RyaWN0LXByb3h5JyBmcm9tICcuL3N0cmljdC1wcm94eS50cyc7XG5leHBvcnQgKiBhcyAnc3RyaW5nJyBmcm9tICcuL3N0cmluZy50cyc7XG5leHBvcnQgKiBhcyAndHJhbnNmb3JtZXJzJyBmcm9tICcuL3RyYW5zZm9ybWVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndHdvLXdheS1tYXAnIGZyb20gJy4vdHdvLXdheS1tYXAudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGUtZ3VhcmRzJyBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcbmV4cG9ydCAqIGFzICd0eXBlJyBmcm9tICcuL3R5cGUudHMnO1xuZXhwb3J0ICogYXMgJ3VybCcgZnJvbSAnLi91cmwudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbHVlLXByb3ZpZGVyJyBmcm9tICcuL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmV4cG9ydCAqIGFzICd2YWx1ZS13cmFwcGVyJyBmcm9tICcuL3ZhbHVlLXdyYXBwZXIudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxZQUFZQSxzQkFBd0I7QUFDcEMsWUFBWSxXQUFhO0FBQ3pCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZLFdBQWE7QUFDekIsWUFBWSxVQUFZO0FBQ3hCLFlBQVksZ0JBQWtCO0FBQzlCLFlBQVlDLHNCQUF3QjtBQUNwQyxZQUFZLFdBQWE7QUFDekIsWUFBWSxnQkFBa0I7QUFDOUIsWUFBWUMsV0FBWTtBQUN4QixZQUFZLFdBQWE7QUFDekIsWUFBWUMsZUFBZ0I7QUFDNUIsWUFBWUMsNEJBQThCO0FBQzFDLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZLGFBQWU7QUFDM0IsWUFBWUMsa0JBQW9CO0FBQ2hDLFlBQVksY0FBZ0I7QUFDNUIsWUFBWUMsOEJBQWdDO0FBQzVDLFlBQVksVUFBWTtBQUN4QixZQUFZQyxhQUFlO0FBQzNCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZLFlBQWM7QUFDMUIsWUFBWSxrQkFBb0I7QUFDaEMsWUFBWUMsaUJBQW1CO0FBQy9CLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZLFVBQVk7QUFDeEIsWUFBWSxTQUFXO0FBQ3ZCLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZQyxtQkFBcUI7IiwKICAibmFtZXMiOiBbImFib3J0LWNvbnRyb2xsZXIiLCAiYXN5bmMtZXZlbnRzIiwgImRlYnVnLWNvbnRyb2xsZXIiLCAiZW51bSIsICJmdW5jdGlvbiIsICJnZW5lcmF0ZWQtZHVyaW5nLWJ1aWxkIiwgImh0bWwtZWxlbWVudCIsICJvYmplY3QtdXRpbHMiLCAib2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlIiwgInJlZy1leHAiLCAic3RyaWN0LXByb3h5IiwgInR3by13YXktbWFwIiwgInR5cGUtZ3VhcmRzIiwgInZhbHVlLXByb3ZpZGVyIiwgInZhbHVlLXdyYXBwZXIiXQp9Cg==
|
|
@@ -8,15 +8,74 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Helpers for working with the `obsidian-dev-utils` library.
|
|
10
10
|
*/
|
|
11
|
-
/**
|
|
12
|
-
* A version of the `obsidian-dev-utils` library.
|
|
13
|
-
*/
|
|
14
|
-
export declare const LIBRARY_VERSION = "$(LIBRARY_VERSION)";
|
|
15
11
|
/**
|
|
16
12
|
* A name of the `obsidian-dev-utils` library.
|
|
17
13
|
*/
|
|
18
14
|
export declare const LIBRARY_NAME = "obsidian-dev-utils";
|
|
19
15
|
/**
|
|
20
|
-
*
|
|
16
|
+
* Parameters for {@link Library.init}.
|
|
17
|
+
*
|
|
18
|
+
* These are purely cosmetic values the host plugin injects once at initialization — deliberately NOT
|
|
19
|
+
* the plugin ID itself, so the agnostic core cannot reconstruct a capability from them.
|
|
20
|
+
*/
|
|
21
|
+
export interface LibraryInitParams {
|
|
22
|
+
/**
|
|
23
|
+
* The per-plugin CSS class scope applied alongside the library class by `addPluginCssClasses`.
|
|
24
|
+
*/
|
|
25
|
+
readonly cssClassScope: string;
|
|
26
|
+
/**
|
|
27
|
+
* The namespace prefix prepended to the library's debug namespaces (e.g. `${pluginId}:`).
|
|
28
|
+
*/
|
|
29
|
+
readonly debugPrefixNamespace: string;
|
|
30
|
+
/**
|
|
31
|
+
* Whether debug logging should append a rich DevTools stack trace.
|
|
32
|
+
*/
|
|
33
|
+
readonly shouldPrintStackTrace: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The single, deterministic initialization entry point for the `obsidian-dev-utils` library.
|
|
37
|
+
*
|
|
38
|
+
* The host plugin calls {@link Library.init} exactly once (via `initPluginContext`) to push the
|
|
39
|
+
* cosmetic per-plugin configuration; the Obsidian-runtime-agnostic core only reads it through the
|
|
40
|
+
* getters. Calling {@link Library.init} more than once throws — {@link Library.resetToDefault} clears
|
|
41
|
+
* the state (e.g. between tests, or on plugin unload) and allows re-initialization.
|
|
42
|
+
*/
|
|
43
|
+
declare class LibraryContext {
|
|
44
|
+
/**
|
|
45
|
+
* The per-plugin CSS class scope applied alongside the library class by `addPluginCssClasses`.
|
|
46
|
+
* Empty until {@link init} is called.
|
|
47
|
+
*
|
|
48
|
+
* @returns The CSS class scope.
|
|
49
|
+
*/
|
|
50
|
+
get cssClassScope(): string;
|
|
51
|
+
/**
|
|
52
|
+
* The namespace prefix prepended to the library's debug namespaces. Empty until {@link init} is called.
|
|
53
|
+
*
|
|
54
|
+
* @returns The debug namespace prefix.
|
|
55
|
+
*/
|
|
56
|
+
get debugPrefixNamespace(): string;
|
|
57
|
+
/**
|
|
58
|
+
* Whether debug logging should append a rich DevTools stack trace. `false` until {@link init} is called.
|
|
59
|
+
*
|
|
60
|
+
* @returns Whether to print stack traces.
|
|
61
|
+
*/
|
|
62
|
+
get shouldPrintStackTrace(): boolean;
|
|
63
|
+
private isInitialized;
|
|
64
|
+
private params;
|
|
65
|
+
/**
|
|
66
|
+
* Initializes the library with the host plugin's cosmetic configuration. Must be called exactly
|
|
67
|
+
* once; calling it again before {@link resetToDefault} throws.
|
|
68
|
+
*
|
|
69
|
+
* @param params - The cosmetic configuration to inject.
|
|
70
|
+
*/
|
|
71
|
+
init(params: LibraryInitParams): void;
|
|
72
|
+
/**
|
|
73
|
+
* Resets the library back to its default (uninitialized) state, allowing {@link init} to be called again.
|
|
74
|
+
*/
|
|
75
|
+
resetToDefault(): void;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The single {@link LibraryContext} instance — the library's deterministic initialization entry point.
|
|
21
79
|
*/
|
|
22
|
-
export declare const
|
|
80
|
+
export declare const Library: LibraryContext;
|
|
81
|
+
export {};
|