diff --git a/.github/workflows/compat-smoke.yml b/.github/workflows/compat-smoke.yml index b7360251..2ec2f929 100644 --- a/.github/workflows/compat-smoke.yml +++ b/.github/workflows/compat-smoke.yml @@ -18,7 +18,7 @@ jobs: python-version: ["3.10", "3.11", "3.12", "3.14"] steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: ${{ matrix.python-version }} - name: Install deps @@ -41,7 +41,7 @@ jobs: python-version: ["3.10", "3.12"] steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: ${{ matrix.python-version }} - name: Install deps diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 935bb6fa..6c89cd82 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0401bdf3..a2375633 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -27,7 +27,7 @@ jobs: - name: Check out code uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" - name: Set up Node.js @@ -71,7 +71,7 @@ jobs: - name: Check out code uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" - name: Set up Node.js diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 97fc18b3..2b1ebe29 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -29,7 +29,7 @@ jobs: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" @@ -96,6 +96,9 @@ jobs: - name: Typecheck frontend run: npx tsc -p tsconfig.json --noEmit --pretty false + - name: Typecheck frontend tests + run: npx tsc -p tsconfig.test.json --noEmit --pretty false + - name: Build frontend bundle run: npm run build @@ -119,7 +122,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Tune Git HTTP settings run: | @@ -133,7 +136,7 @@ jobs: fetch-depth: 0 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: ${{ matrix.python-version }} @@ -186,7 +189,7 @@ jobs: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" diff --git a/CHANGELOG.md b/CHANGELOG.md index 622999d3..9ad60c9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,66 @@ All notable changes to this project are documented in this file. ### Fixed - **`mjr_am_backend.adapters.tools` missing from Registry installs**: `.comfyignore`'s unanchored `tools/` pattern also matched `mjr_am_backend/adapters/tools/`, stripping the ExifTool/FFProbe adapters out of every Registry-published package and causing `ModuleNotFoundError: No module named 'mjr_am_backend.adapters.tools'` at startup. The pattern is now anchored to the repo-root `/tools/` dev-scripts folder only. +### New Features (viewer) +- **Studio viewer (new default main viewer)**: a simpler, modern viewer for reviewing generations — header with navigation and file summary, zoom/pan image stage with transparency checkerboard, a new video/audio player (frame stepping, frame counter, A-B loop, speed, volume, fullscreen, save frame as PNG, auto-hiding controls), an inspector with rating, tags and the same Generation / Workflow / File data as the asset sidebar, and a filmstrip. Keyboard-first (see the viewer tutorial). *Viewer → Use the classic viewer* switches back entirely. + +- **Floating viewer: Studio player and refreshed look**: in Simple mode, video and audio now play in the Studio player (compact, width-aware controls; same frame stepping, A-B loop, speed, volume, fullscreen and frame export as the main viewer), keeping the floating viewer's keyboard forwarding, mute/speed persistence and media release. The floating window gets the Studio styling (flat buttons that light up on hover or when active, softer window chrome, neutral stage). Compare modes keep their synchronised players; *Use the classic viewer* also restores the legacy floating player. + +- **Studio viewer: every tool of the classic viewer, as a HUD**: a tool rail on the left of the stage brings channels (R/G/B/alpha/luma), exposure and gamma, zebra, histogram / waveform scopes, composition guides (thirds, golden, centre, safe areas), aspect-ratio masks, pixel probe, loupe, copy to clipboard and A/B compare (wipe ↔/↕, side by side, difference, add, subtract, multiply, screen) with B selection, pin and swap. Colour tools run on the GPU and work on playing video; video compare keeps both players in sync. 3D models and the grid's A/B / side-by-side actions now open in the Studio viewer too, and audio files show a live spectrum. New shortcuts: `C`, `B`, `X`, `Z`, `S`, `G`, `P`, `L`, `R`, `Ctrl+C`. + +### Removed +- **Classic viewer**: the Studio viewer is now the only main viewer. The classic overlay (toolbar, panzoom, A/B and side-by-side engine, scopes, loupe, probe, grading pipeline, WebGL video processor, filmstrip and its context menu) and about 20 000 lines of code, styles and tests are gone. Everything it did is in the Studio viewer's tool rail; the grid's A/B / side-by-side actions open the Studio viewer with that compare mode on. +- **Viewer settings**: *Use the classic viewer*, *Pan without zoom* and *Disable WebGL video* (classic-only) are removed, with the internal `videoGradeThrottleFps`, `scopesFps`, `metaTtlMs` and `metaMaxEntries` options. Existing values in saved settings are simply ignored. +- The unused *viewerbar* variant of the legacy video controls (the floating viewer's compare modes keep the regular variant). + +### Changed +- **Floating viewer: one player everywhere**: A/B, side-by-side and grid compare now also use the Studio player for the primary video / audio (the other slots stay bare, synced elements). The legacy video controls (in/out, Nuke-style bar, ~2 000 lines, their styles and tests) are gone; the asset sidebar keeps its small preview controls. GIF / animated WebP keep their own simple player. + +### Fixed (follow-ups) +- **Floating viewer compare modes ignored the Studio player's video**: zoom, pan, exposure / channel tone and the overlay guides only addressed bare media elements, so in A/B, side-by-side and grid the primary video (the Studio player) stayed untouched while the other slots changed. The player's video now takes part in all of them. +- **Floating viewer A/B divider drew over the player controls**: it now stops above the control bar (and extends fully again when the controls auto-hide). +- **Studio compare of different sizes**: B keeps its own aspect ratio instead of being stretched to A's frame (wipe, blend and side by side). +- **Floating viewer topbar button position**: the *Viewer* button sometimes landed at the far end of the actionbar after reloading the interface. The Run group is rendered asynchronously inside the actionbar and its late arrival was never observed; the button now re-anchors next to Run as soon as it appears. +- **Floating viewer A/B hid the player**: with the Studio player on A, the B layer covered the right half of its controls. A now sits on top and only its picture is clipped at the divider, so the controls stay visible and usable everywhere. +- **Light dismiss in the Studio viewer**: clicking the empty area around the image or video (not the picture, a tool, the inspector or the player bar) closes the viewer again, as the classic viewer did. Dragging to pan never closes it. +- **Grid selection after closing the viewer**: the Studio viewer now tells the grid which asset you ended on (selection, scroll and focus), as the classic viewer did. +- **Studio viewer shortcuts after navigating**: moving to another asset focused the tag field, so the next shortcuts were typed into it. The inspector's tag editor no longer grabs focus. +- **Search by part of a file name**: typing `F` (or `flow`) only found names with a *word starting* with it (`Flux…`, `field…`), never `sunflower.png` or `ComfyUI_…`. Single-word searches now also list file names that contain the text (ranked after word matches); `_` and `%` are matched literally. Multi-word and quoted searches are unchanged. +- **Sidecar JSON added after a file was indexed** is now picked up: the watcher maps a new/changed `.json` / `.json` to its media, invalidates that file's metadata cache and scan journal, and forces a re-extraction (a non-incremental re-index no longer trusts an existing metadata row when the cache was invalidated). +- **Duplicate index rows for one file (Windows)**: rows whose paths differ only by case or separator (left by older versions) are merged at startup, keeping the highest rating, all tags, the stack cover, execution ids and the embedding. +- **Generated feed** drops items deleted from the UI or removed on disk. +- **Floating viewer shortcuts** (`v`, `k`, `l`, `c`) only act when the pointer or focus is in the viewer (or from its pop-out), instead of swallowing those keys page-wide while it is open. +- Types now come from `@comfyorg/comfyui-frontend-types` (dropped the separate `@comfyorg/litegraph` package); removed 5 dead frontend files; fixed an order-dependent backend test that leaked an input-directory override. + +### Fixed (search, JSON, viewers) +- **Search errors while typing**: queries such as `at-7`, `(2)`, `AND`, `NOT x`, a single letter or a lone `"` returned "Invalid search query syntax" because every token was filtered out (stopword, 1-char, operator word) and an empty FTS `MATCH` was sent. Search now falls back to the raw words, treats punctuation-only input as browse-all, and keeps non-Latin scripts (Cyrillic, CJK...) that were stripped before; only Latin accents are folded, matching the FTS5 tokenizer. +- **Sidecar JSON for images, videos and audio**: `..json` or `.json` next to a media file now provides its workflow / prompt / generation data when nothing is embedded (previously 3D models only). Embedded metadata always wins; UTF-8 BOM is accepted. +- **Workflow tab listed non-workflows and version snapshots**: every `*.json` under a workflow root became a card, including `.history//.json` version snapshots and arbitrary JSON (settings, node configs). Hidden folders are skipped and only UI graph exports, API prompt graphs and `{workflow}`/`{prompt}` wrappers are listed (`workflow_format`: `ui`/`api`). BOM-prefixed workflows are no longer silently dropped; stale rows are purged (workflow index version 5). +- **API-format workflows opened as an empty canvas**: they are now loaded with ComfyUI's `app.loadApiJson`; `{workflow: ...}` exports are unwrapped. +- **Floating viewer leaked media players**: re-rendering (every generation in Live mode) and disposing only paused videos before detaching them; Chromium caps live media players, so videos could stop playing. Media is now released (src, ``, `load()`), as the main viewer already did. + +### Fixed (duplicate stacks) +- **Clicking a duplicate-stack badge froze ComfyUI**: three passes (`displayAssets`, the per-card ref callback `syncRenderedDuplicateCards`, the live-upsert dedupe) each rewrote `_mjrDupStack` / `_mjrDupMembers` on reactive assets read by the grid template, with a fresh array on every pass and conflicting representatives. The ref callback ran on every render (a new closure each time), so every write scheduled another render: an endless update loop (production Vue has no recursion limit). Duplicate stacks are now computed in one place with change-guarded writes, card refs are stable, and the other passes no longer touch these fields. +- **"Corrupted" duplicate stacks**: stacks were also built from the file name alone across folders, so unrelated files sharing a name (e.g. frame grabs `at-7.958s.png` from different videos) were stacked, hidden from the grid and given another file's generation time. A duplicate is now the same name in the same source/root/subfolder only. +- **Duplicates view collapsed back to one card**: the "Duplicates - N copies" view re-grouped its own members; it now lists every copy, using cycle-free copies of the members. + +### Fixed (asset sync) +- **Renamed / moved files lost their ratings, tags and collections**: the `assets_fts` triggers ran a plain `UPDATE`/`DELETE` on an external-content FTS5 table, so every filename/subfolder change failed with "database disk image is malformed" (and could start a needless DB recovery). The watcher then fell back to delete + re-index, creating a new asset id. Triggers now use FTS5's `'delete'` command (update trigger limited to `filename, subfolder`); existing databases are repaired and the FTS index rebuilt automatically at startup. +- **Outputs missed after a generation**: ComfyUI calls `on_prompt_end` before it stores the prompt history, so post-execution ingestion could read an empty history and index nothing (prompts queued from the API, another tab or another device). Ingestion now waits briefly for the history entry. +- **Scan prune could wipe user data**: a stat error (offline share, permission hiccup) counted as "file deleted". Like ComfyUI core's reconciler, only a confirmed absence removes an asset, and an unreadable scan root is never pruned. The `pruned` count no longer includes cascade/trigger rows. +- **Stale cards after external deletes/moves**: files removed or moved outside Majoor (watcher, scan prune) now emit `mjr-assets-removed` / `mjr-asset-updated`, so open grids update in place. +- **Background scans never refreshed the grid**: `mjr-scan-complete` now carries `origin` and `needs_refresh`; the grid reloads once when live events could not cover the change, and a finished directory scan shows one ComfyUI core toast ("N new, M removed"). Per-generation index runs stay silent (live cards + sidebar badge). + +### Changed (ComfyUI integration) +- **Compat assets API moved to `/mjr/am/compat/assets/*`**: the read-only OpenAPI-aligned surface no longer squats ComfyUI core's `/api` namespace. The old `/api/v2/assets/*` paths are only registered when `MJR_AM_LEGACY_API_V2_ASSETS=1` (deprecated). +- **Python 3.14**: `requires-python` is now `>=3.10, <3.15`; CI runs the full suite on 3.14. +- **Execution tracking without wrapping `api.queuePrompt`**: the floating viewer progress reads the running prompt from ComfyUI's Jobs API (`GET /api/jobs/{id}`), then `/queue` and `/history/{id}` on older cores, driven by websocket events. No more conflicts with other extensions that wrap `queuePrompt`. +- **Optional: hide ComfyUI's native Assets tab** (`Majoor.Integration.HideNativeAssetsTab`, off by default). Uses the official `getSidebarTabs`/`unregisterSidebarTab` API and restores the tab when turned off. +- **Workflow serialization** uses the root graph instead of the async `graphToPrompt()`; dirty state reads the frontend workflow store. +- **Typed aiohttp request keys** (`web.RequestKey`) — no more `NotAppKeyWarning` on aiohttp ≥ 3.13. +- **Notifications on ComfyUI core toasts only**: Majoor now uses the typed ToastManager API (`success/error/info/warning/loading`) instead of the deprecated `add()` (kept as fallback for older frontends). Long operations (DB restore/reset, vector backfill) show one `loading` toast updated in place instead of stacking a toast per step; links become native toast action buttons; in-progress toasts are dismissed on teardown. Toasts no longer disappear if ComfyUI removes `add()`. The Majoor message center stays as a read-only history (release notes, toast log, shortcuts) and no longer pops open by itself. +- **Frontend test typing**: `tsconfig.test.json` now type-checks with 0 errors (was 913) and runs in CI. + ## [2.5.2] - 2026-09-27 ### Changed diff --git a/README.md b/README.md index 363e1a36..810536dc 100644 --- a/README.md +++ b/README.md @@ -716,7 +716,7 @@ See [`docs/TESTING.md`](docs/TESTING.md), [`tests/README.md`](tests/README.md), - Linux (Ubuntu 22.04+, Fedora, Debian) - **Browsers**: Modern browsers with ES2020+ support -The automated CI matrix currently validates Python 3.10-3.13 and the frontend on Ubuntu. Windows and macOS support is maintained through portable code paths and contributor/user testing rather than dedicated hosted CI jobs. +The automated CI matrix currently validates Python 3.10-3.14 and the frontend on Ubuntu. Windows and macOS support is maintained through portable code paths and contributor/user testing rather than dedicated hosted CI jobs. --- diff --git a/dist/chunks/FloatingViewer-BiEeZ0CS.js b/dist/chunks/FloatingViewer--x61GAzy.js similarity index 79% rename from dist/chunks/FloatingViewer-BiEeZ0CS.js rename to dist/chunks/FloatingViewer--x61GAzy.js index b17ecf26..d2f4ab0d 100644 --- a/dist/chunks/FloatingViewer-BiEeZ0CS.js +++ b/dist/chunks/FloatingViewer--x61GAzy.js @@ -1,27 +1,271 @@ -import { en as e, g as t, y as n } from "./viewerRuntimeHosts-n0pKLECw.js"; -import { B as r, C as i, I as a, M as o, O as s, P as c, R as l, V as u, j as d, m as f, o as p, r as m, rt as h, v as g, w as _, x as v } from "./events-C65wdOHm.js"; -import { a as y, i as b, o as x, s as S } from "./graphTraversal-DTdQWkn5.js"; -import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-W-G40j3K.js"; -import { r as k, v as A } from "./SidebarWorkflowSection-DrCNoS04.js"; -import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-2yBqYLc0.js"; -import { a as W, n as ae, r as oe } from "./model3dRenderer-BnFOXFbn.js"; -import { i as se, o as ce, r as le, t as ue } from "./geninfoParser-CgHp-y-n.js"; -import { t as de } from "./genInfo-DD23-sz2.js"; +import { En as e, Mn as t, Sn as n, Wt as r, Yn as i, cn as a, dn as o, in as s, jn as c, kn as l, mn as u, pn as d, s as f, t as p, u as m, vn as h, wn as g, xn as _ } from "./config-C9a-wT5M.js"; +import { a as v, i as y, o as b, s as x } from "./graphTraversal-DTdQWkn5.js"; +import { c as S, l as C, m as w, p as ee, s as T, t as E, u as D, v as O } from "./generationSectionState-DuXxSw-j.js"; +import { r as k } from "./events-1iwo5blr.js"; +import { C as A, D as j, E as M, T as N, _ as P, a as F, b as I, d as L, f as R, g as z, h as B, m as te, n as V, o as ne, p as H, r as re, s as ie, t as U, v as ae, w as oe, y as se } from "./tooltipShortcuts-Ury2eTek.js"; +import { I as ce } from "./mjr-primevue-C07IsEdU.js"; +import { C as le, S as ue, n as de, t as fe, w as pe } from "./genInfo-Dk8cerKp.js"; +// ui/features/viewer/videoSync.ts +var me = () => { + try { + return !!p?.DEBUG_VIEWER; + } catch { + return !1; + } +}; +function he(e, t, { threshold: n = .15, correctionCooldownMs: r = 250 } = {}) { + let i = new AbortController(); + try { + if (!e) return i; + let a = Array.isArray(t) ? t.filter((t) => t && t !== e) : []; + if (!a.length) return i; + let o = [e, ...a].filter(Boolean), s = !1, c = /* @__PURE__ */ new WeakSet(), l = { + source: null, + rafId: null, + rvfcId: null + }, u = 0, d = () => { + try { + let e = l.source; + l.rvfcId != null && typeof e?.cancelVideoFrameCallback == "function" && e.cancelVideoFrameCallback(l.rvfcId); + } catch (e) { + console.debug?.(e); + } + l.rvfcId = null; + try { + l.rafId != null && typeof cancelAnimationFrame == "function" && cancelAnimationFrame(l.rafId); + } catch (e) { + console.debug?.(e); + } + l.rafId = null, l.source = null; + }, f = (e) => { + try { + if (e && e.paused === !1) return; + try { + c.add(e); + } catch (e) { + console.debug?.(e); + } + let t = e.play?.(); + t && typeof t.catch == "function" && t.catch(() => {}); + } catch (e) { + console.debug?.(e); + } + }, p = () => { + try { + return typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(); + } catch { + return Date.now(); + } + }, m = (e, { force: t = !1 } = {}) => { + if (!s) try { + let i = Number(e?.currentTime) || 0, a = e?.paused === !1, c = p(), l = Math.max(0, Number(r) || 0), d = t || !a || !u || c - u >= l, f = !1; + for (let t of o) if (t && t !== e) try { + Math.abs((Number(t.currentTime) || 0) - i) > n && d && (s = !0, t.currentTime = i, s = !1, f = !0); + } catch { + s = !1; + } + a && f && (u = c); + } catch { + s = !1; + } + }, h = () => { + let t = l.source || e; + if (l.rafId = null, l.rvfcId = null, !(!t || i.signal.aborted || t.paused)) { + m(t); + try { + if (typeof t?.requestVideoFrameCallback == "function") { + l.rvfcId = t.requestVideoFrameCallback(h); + return; + } + } catch (e) { + console.debug?.(e); + } + try { + typeof requestAnimationFrame == "function" && (l.rafId = requestAnimationFrame(h)); + } catch (e) { + console.debug?.(e); + } + } + }, g = (t = e) => { + d(), l.source = t || e, !(!l.source || l.source.paused || i.signal.aborted) && h(); + }; + try { + i.signal.addEventListener("abort", d, { once: !0 }); + } catch (e) { + console.debug?.(e); + } + let _ = (t = {}) => m(e, t), v = (t, n = e) => { + if (!s) { + for (let e of o) if (e && e !== n) try { + if (t) f(e); + else { + try { + c.add(e); + } catch (e) { + console.debug?.(e); + } + e.pause?.(); + } + } catch (e) { + console.debug?.(e); + } + } + }, y = (t = e) => { + if (!s) { + for (let e of o) if (e && e !== t) try { + e.muted = !!t.muted, e.volume = Number(t.volume) || 0; + } catch (e) { + console.debug?.(e); + } + } + }, b = (t = e) => { + if (!s) { + for (let e of o) if (e && e !== t) try { + e.playbackRate = Number(t.playbackRate) || 1; + } catch (e) { + console.debug?.(e); + } + } + }; + try { + for (let e of a) { + try { + e.muted = !0; + } catch (e) { + console.debug?.(e); + } + try { + e.loop = !1; + } catch (e) { + console.debug?.(e); + } + } + } catch (e) { + console.debug?.(e); + } + try { + y(), b(), _(), e.paused || (v(!0), g(e)); + } catch (e) { + console.debug?.(e); + } + e.addEventListener("play", () => v(!0), { + signal: i.signal, + passive: !0 + }), e.addEventListener("play", () => g(e), { + signal: i.signal, + passive: !0 + }), e.addEventListener("pause", () => { + d(), v(!1); + }, { + signal: i.signal, + passive: !0 + }), e.addEventListener("timeupdate", () => _(), { + signal: i.signal, + passive: !0 + }), e.addEventListener("seeking", () => _({ force: !0 }), { + signal: i.signal, + passive: !0 + }), e.addEventListener("seeked", () => _({ force: !0 }), { + signal: i.signal, + passive: !0 + }), e.addEventListener("ended", () => _({ force: !0 }), { + signal: i.signal, + passive: !0 + }), e.addEventListener("volumechange", y, { + signal: i.signal, + passive: !0 + }), e.addEventListener("ratechange", b, { + signal: i.signal, + passive: !0 + }); + for (let t of a) try { + t.addEventListener("play", () => { + c.has(t) ? (c.delete(t), g(e)) : (m(t, { force: !0 }), b(t), v(!0, t), g(t)); + }, { + signal: i.signal, + passive: !0 + }), t.addEventListener("pause", () => { + c.has(t) ? c.delete(t) : t?.ended || (d(), v(!1, t)); + }, { + signal: i.signal, + passive: !0 + }), t.addEventListener("seeking", () => m(t, { force: !0 }), { + signal: i.signal, + passive: !0 + }), t.addEventListener("seeked", () => m(t, { force: !0 }), { + signal: i.signal, + passive: !0 + }), t.addEventListener("ratechange", () => b(t), { + signal: i.signal, + passive: !0 + }); + } catch (e) { + console.debug?.(e); + } + try { + for (let t of a) try { + t.addEventListener("ended", () => { + if (!s) { + try { + s = !0, t.currentTime = Number(e.currentTime) || 0; + } catch (e) { + console.debug?.(e); + } finally { + s = !1; + } + try { + e.paused || f(t); + } catch (e) { + console.debug?.(e); + } + } + }, { + signal: i.signal, + passive: !0 + }); + } catch (e) { + console.debug?.(e); + } + } catch (e) { + console.debug?.(e); + } + try { + for (let e of a) try { + e.addEventListener("loadedmetadata", () => _({ force: !0 }), { + signal: i.signal, + passive: !0, + once: !0 + }); + } catch (e) { + console.debug?.(e); + } + } catch (e) { + console.debug?.(e); + } + } catch (e) { + if (me()) try { + console.warn("[Viewer] follower video sync setup failed", e); + } catch (e) { + console.debug?.(e); + } + } + return i; +} // ui/features/viewer/floatingViewerConstants.ts -var G = Object.freeze({ +var W = Object.freeze({ SIMPLE: "simple", AB: "ab", SIDE: "side", GRID: "grid", GRAPH: "graph" -}), fe = .25, pe = 8e-4, me = 30; -function he(e) { +}), ge = .25, _e = 8e-4, ve = 30; +function ye(e) { let t = Number(e); if (!Number.isFinite(t) || t < 0) return "0:00"; let n = Math.floor(t), r = Math.floor(n / 3600), i = Math.floor(n % 3600 / 60), a = n % 60; return r > 0 ? `${r}:${String(i).padStart(2, "0")}:${String(a).padStart(2, "0")}` : `${i}:${String(a).padStart(2, "0")}`; } -function ge(e) { +function be(e) { try { let t = e?.play?.(); t && typeof t.catch == "function" && t.catch(() => {}); @@ -29,40 +273,40 @@ function ge(e) { console.debug?.(e); } } -function _e(e, t) { +function xe(e, t) { let n = Math.floor(Number(e) || 0), r = Math.max(0, Math.floor(Number(t) || 0)); return n < 0 ? 0 : r > 0 && n > r ? r : n; } -function ve(e, t) { - let n = Number(e?.currentTime || 0), r = Number(t) > 0 ? Number(t) : me; +function Se(e, t) { + let n = Number(e?.currentTime || 0), r = Number(t) > 0 ? Number(t) : ve; return Math.max(0, Math.floor(n * r)); } -function ye(e, t) { - let n = Number(e?.duration || 0), r = Number(t) > 0 ? Number(t) : me; +function Ce(e, t) { + let n = Number(e?.duration || 0), r = Number(t) > 0 ? Number(t) : ve; return !Number.isFinite(n) || n <= 0 ? 0 : Math.max(0, Math.floor(n * r)); } -function be(e, t, n) { - let r = Number(n) > 0 ? Number(n) : me, i = _e(t, ye(e, r)) / r; +function we(e, t, n) { + let r = Number(n) > 0 ? Number(n) : ve, i = xe(t, Ce(e, r)) / r; try { e.currentTime = Math.max(0, i); } catch (e) { console.debug?.(e); } } -function xe(e) { +function Te(e) { return e instanceof HTMLMediaElement; } -function Se(e, t) { +function Ee(e, t) { return String(e || "").toLowerCase() === "video" || t instanceof HTMLVideoElement; } -function Ce(e, t) { +function De(e, t) { return String(e || "").toLowerCase() === "audio" || t instanceof HTMLAudioElement; } -function we(e) { +function Oe(e) { let t = String(e || "").toLowerCase(); return t === "gif" || t === "animated-image"; } -function Te(e) { +function ke(e) { try { let t = Number(e?.naturalWidth || e?.width || 0), n = Number(e?.naturalHeight || e?.height || 0); if (!(t > 0 && n > 0)) return ""; @@ -74,10 +318,10 @@ function Te(e) { return console.debug?.(e), ""; } } -function Ee(e, t = null, { kind: n = "" } = {}) { +function Ae(e, t = null, { kind: n = "" } = {}) { if (!e || e._mjrSimplePlayerMounted) return e?.parentElement || null; e._mjrSimplePlayerMounted = !0; - let r = ee(t) || me, i = xe(e), a = Se(n, e), o = Ce(n, e), s = we(n), c = document.createElement("div"); + let r = ee(t) || ve, i = Te(e), a = Ee(n, e), o = De(n, e), s = Oe(n), c = document.createElement("div"); c.className = "mjr-mfv-simple-player", c.tabIndex = 0, c.setAttribute("role", "group"), c.setAttribute("aria-label", "Media player"), o && c.classList.add("is-audio"), s && c.classList.add("is-animated-image"); let l = document.createElement("div"); l.className = "mjr-mfv-simple-player-controls"; @@ -120,7 +364,7 @@ function Ee(e, t = null, { kind: n = "" } = {}) { e instanceof HTMLMediaElement ? x.className = e.muted ? "pi pi-volume-off" : "pi pi-volume-up" : (x.className = "pi pi-volume-off", b.disabled = !0, b.classList.add("is-disabled")); }, k = () => { if (!a || !(e instanceof HTMLVideoElement)) return; - let t = ve(e, r), n = ye(e, r); + let t = Se(e, r), n = Ce(e, r); y.textContent = n > 0 ? `F: ${t}/${n}` : `F: ${t}`; }, A = () => { let e = Math.max(0, Math.min(100, Number(u.value) / 1e3 * 100)); @@ -133,8 +377,8 @@ function Ee(e, t = null, { kind: n = "" } = {}) { let t = Number(e.currentTime || 0), n = Number(e.duration || 0); if (Number.isFinite(n) && n > 0) { let e = Math.max(0, Math.min(1, t / n)); - u.value = String(Math.round(e * 1e3)), v.textContent = `${he(t)} / ${he(n)}`; - } else u.value = "0", v.textContent = `${he(t)} / 0:00`; + u.value = String(Math.round(e * 1e3)), v.textContent = `${ye(t)} / ${ye(n)}`; + } else u.value = "0", v.textContent = `${ye(t)} / 0:00`; A(); }, M = () => { try { @@ -182,7 +426,7 @@ function Ee(e, t = null, { kind: n = "" } = {}) { }, I = (t) => { F(t); try { - i ? e.paused ? ge(e) : e.pause?.() : s && (C ? (e.src = S ? `${S}${S.includes("?") ? "&" : "?"}mjr_anim=${Date.now()}` : e.src, C = !1) : (w ||= Te(e), w && (e.src = w), C = !0)); + i ? e.paused ? be(e) : e.pause?.() : s && (C ? (e.src = S ? `${S}${S.includes("?") ? "&" : "?"}mjr_anim=${Date.now()}` : e.src, C = !1) : (w ||= ke(e), w && (e.src = w), C = !0)); } catch (e) { console.debug?.(e); } @@ -194,9 +438,9 @@ function Ee(e, t = null, { kind: n = "" } = {}) { } catch (e) { console.debug?.(e); } - be(e, ve(e, r) + t, r), D(), k(), j(); + we(e, Se(e, r) + t, r), D(), k(), j(); } - }, te = (t) => { + }, R = (t) => { if (F(t), e instanceof HTMLMediaElement) { try { e.muted = !e.muted; @@ -205,7 +449,7 @@ function Ee(e, t = null, { kind: n = "" } = {}) { } O(); } - }, R = (t) => { + }, z = (t) => { if (F(t), !i) return; A(); let n = Number(e.duration || 0); @@ -217,14 +461,14 @@ function Ee(e, t = null, { kind: n = "" } = {}) { console.debug?.(e); } k(), j(); - }, z = (e) => F(e), ne = (e) => { + }, B = (e) => F(e), te = (e) => { try { if (e?.target?.closest?.("button, input, textarea, select")) return; c.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } - }, B = (e) => { + }, V = (e) => { let t = String(e?.key || ""); if (!(!t || e?.altKey || e?.ctrlKey || e?.metaKey)) { if (t === " " || t === "Spacebar") e.preventDefault?.(), I(e); @@ -238,11 +482,11 @@ function Ee(e, t = null, { kind: n = "" } = {}) { } }; try { - c._mjrSimplePlayerHandleKeydown = B; + c._mjrSimplePlayerHandleKeydown = V; } catch (e) { console.debug?.(e); } - f.addEventListener("click", I), m.addEventListener("click", (e) => L(-1, e)), g.addEventListener("click", (e) => L(1, e)), b.addEventListener("click", te), u.addEventListener("input", R), l.addEventListener("pointerdown", z), l.addEventListener("click", z), l.addEventListener("dblclick", z), c.addEventListener("pointerdown", ne), c.addEventListener("keydown", B), e instanceof HTMLMediaElement && (e.addEventListener("play", () => { + f.addEventListener("click", I), m.addEventListener("click", (e) => L(-1, e)), g.addEventListener("click", (e) => L(1, e)), b.addEventListener("click", R), u.addEventListener("input", z), l.addEventListener("pointerdown", B), l.addEventListener("click", B), l.addEventListener("dblclick", B), c.addEventListener("pointerdown", te), c.addEventListener("keydown", V), e instanceof HTMLMediaElement && (e.addEventListener("play", () => { D(), P(); }, { passive: !0 }), e.addEventListener("pause", () => { M(), D(), k(), j(); @@ -254,7 +498,7 @@ function Ee(e, t = null, { kind: n = "" } = {}) { k(), j(); }, { passive: !0 }), e.addEventListener("loadedmetadata", () => { k(), j(); - }, { passive: !0 })), ge(e), D(), O(), k(), j(), P(); + }, { passive: !0 })), be(e), D(), O(), k(), j(), P(); try { c._mjrSimplePlayerDestroy = M, c._mjrMediaControlsHandle = { destroy: M }; } catch (e) { @@ -262,15 +506,58 @@ function Ee(e, t = null, { kind: n = "" } = {}) { } return c; } +// ui/features/viewer/studio/mountStudioPlayer.ts +function je(e) { + if (!e?.src || e.kind !== "video" && e.kind !== "audio") return null; + let t = document.createElement("div"); + t.className = `mjr-mfv-player-host mjr-mfv-player-host--studio${e.fill ? " mjr-mfv-player-host--fill" : ""}`, t.tabIndex = -1, t.addEventListener("pointerdown", (e) => { + e.target?.closest?.("button, input, textarea, select, a, [contenteditable='true']") || t.focus?.({ preventScroll: !0 }); + }); + let n = null, { app: r } = ie({ render: () => ce(de, { + ref: (e) => { + n = e; + }, + src: e.src, + kind: e.kind, + filename: e.filename, + fps: e.fps ?? null, + frameCount: e.frameCount ?? null, + initialMuted: !!e.initialMuted, + initialRate: e.initialRate, + compact: e.compact !== !1, + mediaClass: e.mediaClass + }) }); + r.mount(t); + let i = !1; + return t._mjrMediaControlsHandle = { + togglePlay: () => n?.togglePlay?.(), + stepFrames: (e) => n?.stepFrame?.(e), + destroy: () => { + if (!i) { + i = !0; + try { + n?.release?.(); + } catch (e) { + console.debug?.(e); + } + try { + r.unmount(); + } catch (e) { + console.debug?.(e); + } + } + } + }, t; +} // ui/features/viewer/floatingViewerMedia.ts -var De = /* @__PURE__ */ new Set([ +var Me = /* @__PURE__ */ new Set([ ".mp4", ".webm", ".mov", ".avi", ".mkv", ".m4v" -]), Oe = /* @__PURE__ */ new Set([ +]), Ne = /* @__PURE__ */ new Set([ ".mp3", ".wav", ".flac", @@ -280,7 +567,7 @@ var De = /* @__PURE__ */ new Set([ ".opus", ".wma" ]); -function ke(e) { +function Pe(e) { try { let t = String(e || "").trim(), n = t.lastIndexOf("."); return n >= 0 ? t.slice(n).toLowerCase() : ""; @@ -288,7 +575,7 @@ function ke(e) { return ""; } } -function K(e) { +function G(e) { let t = String(e?.kind || "").toLowerCase(); if (t === "video") return "video"; if (t === "audio") return "audio"; @@ -301,21 +588,21 @@ function K(e) { if (i.startsWith("video/")) return "video"; if (i.startsWith("audio/")) return "audio"; if (i.startsWith("image/gif")) return "gif"; - let a = ke(e?.filename || ""); - return a === ".gif" ? "gif" : De.has(a) ? "video" : Oe.has(a) ? "audio" : ae.has(a) ? "model3d" : "image"; + let a = Pe(e?.filename || ""); + return a === ".gif" ? "gif" : Me.has(a) ? "video" : Ne.has(a) ? "audio" : ue.has(a) ? "model3d" : "image"; } -function Ae(e) { - return e ? e.url ? String(e.url) : e.filename && h(e) || "" : ""; +function Fe(e) { + return e ? e.url ? String(e.url) : e.filename && i(e) || "" : ""; } -function q(e = "No media - select assets in the grid") { +function K(e = "No media - select assets in the grid") { let t = document.createElement("div"); return t.className = "mjr-mfv-empty", t.textContent = e, t; } -function J(e, t) { +function q(e, t) { let n = document.createElement("div"); return n.className = `mjr-mfv-label label-${t}`, n.textContent = e, n; } -function je(e) { +function Ie(e) { if (e && typeof e.play == "function") try { let t = e.play(); t && typeof t.catch == "function" && t.catch(() => {}); @@ -323,12 +610,12 @@ function je(e) { console.debug?.(e); } } -function Me(e) { +function Le(e) { if (e && typeof e.play == "function") try { let t = e.play(); t && typeof t.catch == "function" && t.catch(() => { try { - e.muted = !0, je(e); + e.muted = !0, Ie(e); } catch (e) { console.debug?.(e); } @@ -337,7 +624,7 @@ function Me(e) { console.debug?.(e); } } -function Ne(e, t) { +function Re(e, t) { let n = e && e.nodeType === 1 ? e : e?.parentElement || null; for (; n && n !== t;) { try { @@ -350,7 +637,7 @@ function Ne(e, t) { } return null; } -function Pe(e, t, n) { +function ze(e, t, n) { if (!e) return !1; if (Math.abs(Number(n) || 0) >= Math.abs(Number(t) || 0)) { let t = Number(e.scrollTop || 0), r = Math.max(0, Number(e.scrollHeight || 0) - Number(e.clientHeight || 0)); @@ -359,7 +646,7 @@ function Pe(e, t, n) { let r = Number(e.scrollLeft || 0), i = Math.max(0, Number(e.scrollWidth || 0) - Number(e.clientWidth || 0)); return t < 0 && r > 0 || t > 0 && r < i; } -function Fe(e) { +function Be(e) { if (e) try { let t = e.querySelectorAll?.("video, audio"); if (!t || !t.length) return; @@ -372,95 +659,113 @@ function Fe(e) { console.debug?.(e); } } -function Y(e, { fill: t = !1, controls: n = !0, initialMuted: r = !1, initialPlaybackRate: i = 1 } = {}) { - let a = Ae(e); +function Ve(e) { + if (e) try { + let t = e.querySelectorAll?.("video, audio"); + if (!t || !t.length) return; + for (let e of t) { + try { + e.pause?.(); + } catch (e) { + console.debug?.(e); + } + try { + e.removeAttribute?.("src"); + for (let t of Array.from(e.querySelectorAll?.("source") || [])) t.remove?.(); + e.load?.(); + } catch (e) { + console.debug?.(e); + } + } + } catch (e) { + console.debug?.(e); + } +} +function He(e, { initialMuted: t = !1, initialPlaybackRate: n = 1, fill: r = !1 } = {}) { + let i = G(e); + if (i !== "video" && i !== "audio") return null; + let a = Fe(e); if (!a) return null; - let o = K(e), s = `mjr-mfv-media mjr-mfv-media--fit-height${t ? " mjr-mfv-media--fill" : ""}`, c = ke(e?.filename || "") === ".webp" && Number(e?.duration ?? e?.metadata_raw?.duration ?? 0) > 0, l = (r, a) => { - if (!n) return r; - let o = document.createElement("div"); - if (o.className = `mjr-mfv-player-host${t ? " mjr-mfv-player-host--fill" : ""}`, a === "audio") { - o.classList.add("mjr-mfv-player-host--audio"); - let t = document.createElement("div"); - t.className = "mjr-mfv-player-audio-backdrop", t.textContent = String(e?.filename || "Audio"), o.appendChild(t); - } - o.appendChild(r); - try { - o.tabIndex = -1, o.addEventListener("pointerdown", (e) => { - try { - if (e?.target?.closest?.("button, input, textarea, select, a, [contenteditable='true']")) return; - o.focus?.({ preventScroll: !0 }); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - let s = D(r, { - variant: "viewer", - hostEl: o, - mediaKind: a, - initialFps: ee(e) || void 0, - initialFrameCount: T(e, ee(e)) || void 0, - initialPlaybackRate: i + try { + let o = ee(e); + return je({ + src: a, + kind: i, + filename: String(e?.filename || ""), + fps: o, + frameCount: w(e, o) || null, + initialMuted: e?._isPreview ? !0 : t, + initialRate: n, + compact: !0, + fill: r, + mediaClass: "mjr-mfv-media" }); - try { - s && (o._mjrMediaControlsHandle = s); - } catch (e) { - console.debug?.(e); - } - return o; - }; + } catch (e) { + return console.debug?.(e), null; + } +} +function J(e, { fill: t = !1, controls: n = !0, initialMuted: r = !1, initialPlaybackRate: i = 1 } = {}) { + let a = Fe(e); + if (!a) return null; + let o = G(e), s = `mjr-mfv-media mjr-mfv-media--fit-height${t ? " mjr-mfv-media--fill" : ""}`, c = Pe(e?.filename || "") === ".webp" && Number(e?.duration ?? e?.metadata_raw?.duration ?? 0) > 0; + if (n && (o === "audio" || o === "video")) { + let n = He(e, { + initialMuted: r, + initialPlaybackRate: i, + fill: t + }); + if (n) return n; + } if (o === "audio") { let e = document.createElement("audio"); e.className = s, e.src = a, e.controls = !1, e.autoplay = !0, e.preload = "metadata", e.loop = !0, e.muted = r, e.playbackRate = i; - let t = r ? () => je(e) : () => Me(e); + let t = r ? () => Ie(e) : () => Le(e); try { e.addEventListener("loadedmetadata", t, { once: !0 }); } catch (e) { console.debug?.(e); } - return t(), l(e, "audio"); + return t(), e; } if (o === "video") { let t = document.createElement("video"); t.className = s, t.src = a, t.controls = !1, t.loop = !0, t.preload = "metadata", t.muted = e?._isPreview ? !0 : r, t.playbackRate = i, t.autoplay = !0, t.playsInline = !0; - let n = t.muted ? () => je(t) : () => Me(t); + let n = t.muted ? () => Ie(t) : () => Le(t); try { t.addEventListener("loadedmetadata", n, { once: !0 }); } catch (e) { console.debug?.(e); } - return n(), l(t, "video"); + return n(), t; } - if (o === "model3d") return oe(e, a, { + if (o === "model3d") return le(e, a, { hostClassName: `mjr-model3d-host mjr-mfv-model3d-host${t ? " mjr-mfv-model3d-host--fill" : ""}`, canvasClassName: `mjr-mfv-media mjr-model3d-render-canvas${t ? " mjr-mfv-media--fill" : ""}`, hintText: "Rotate: left drag Pan: right drag Zoom: wheel or middle drag", disableViewerTransform: !0, pauseDuringExecution: !!p.FLOATING_VIEWER_PAUSE_DURING_EXECUTION }); - let u = document.createElement("img"); - return u.className = s, u.src = a, u.alt = String(e?.filename || ""), u.draggable = !1, (o === "gif" || c) && Ee(u, e, { kind: o === "gif" ? "gif" : "animated-image" }) || u; + let l = document.createElement("img"); + return l.className = s, l.src = a, l.alt = String(e?.filename || ""), l.draggable = !1, (o === "gif" || c) && Ae(l, e, { kind: o === "gif" ? "gif" : "animated-image" }) || l; } -function Ie(e, t, n, r, i, a) { +function Ue(e, t, n, r, i, a) { e.beginPath(), typeof e.roundRect == "function" ? e.roundRect(t, n, r, i, a) : (e.moveTo(t + a, n), e.lineTo(t + r - a, n), e.quadraticCurveTo(t + r, n, t + r, n + a), e.lineTo(t + r, n + i - a), e.quadraticCurveTo(t + r, n + i, t + r - a, n + i), e.lineTo(t + a, n + i), e.quadraticCurveTo(t, n + i, t, n + i - a), e.lineTo(t, n + a), e.quadraticCurveTo(t, n, t + a, n), e.closePath()); } -function Le(e, t, n, r) { +function Y(e, t, n, r) { e.save(), e.font = "bold 10px system-ui, sans-serif"; let i = e.measureText(t).width; - e.fillStyle = "rgba(0,0,0,0.58)", Ie(e, n, r, i + 10, 18, 4), e.fill(), e.fillStyle = "#fff", e.fillText(t, n + 5, r + 13), e.restore(); + e.fillStyle = "rgba(0,0,0,0.58)", Ue(e, n, r, i + 10, 18, 4), e.fill(), e.fillStyle = "#fff", e.fillText(t, n + 5, r + 13), e.restore(); } // ui/features/viewer/workflowSidebar/NodeWidgetRenderer.ts -var Re = /* @__PURE__ */ new Set([ +var We = /* @__PURE__ */ new Set([ "imageupload", "button", "hidden" -]), ze = /\bnote\b|markdown/i; -function Be(e) { - return ze.test(String(e?.type || "")); +]), Ge = /\bnote\b|markdown/i; +function Ke(e) { + return Ge.test(String(e?.type || "")); } -function Ve(e) { +function qe(e) { let t = e?.properties ?? {}; if (typeof t.text == "string") return t.text; if (typeof t.value == "string") return t.value; @@ -468,35 +773,35 @@ function Ve(e) { let n = e?.widgets?.[0]; return n != null && n.value != null ? String(n.value) : ""; } -function He(e, t) { +function Je(e, t) { let n = e?.properties; n && ("text" in n ? n.text = t : "value" in n ? n.value = t : "markdown" in n ? n.markdown = t : n.text = t); let r = e?.widgets?.[0]; r && (r.value = t); } -var Ue = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, We = /^[0-9a-f]{20,}$/i; -function Ge(...e) { +var Ye = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Xe = /^[0-9a-f]{20,}$/i; +function Ze(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function Ke(e) { - return Ue.test(e) || We.test(e); +function Qe(e) { + return Ye.test(e) || Xe.test(e); } -function qe(e) { - return Ge(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); +function $e(e) { + return Ze(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); } -function Je(e, { isSubgraph: t = !1 } = {}) { - let n = String(e?.type || "").trim(), r = qe(e); - return (t || Ke(n)) && r ? r : Ke(n) ? "Subgraph" : n || r || `Node #${e?.id}`; +function et(e, { isSubgraph: t = !1 } = {}) { + let n = String(e?.type || "").trim(), r = $e(e); + return (t || Qe(n)) && r ? r : Qe(n) ? "Subgraph" : n || r || `Node #${e?.id}`; } -function Ye(e, t, { isSubgraph: n = !1 } = {}) { - let r = String(e?.type || "").trim(), i = qe(e); - return n && r && !Ke(r) && r !== t ? r : i && i !== r && i !== t ? i : ""; +function tt(e, t, { isSubgraph: n = !1 } = {}) { + let r = String(e?.type || "").trim(), i = $e(e); + return n && r && !Qe(r) && r !== t ? r : i && i !== r && i !== t ? i : ""; } -var Xe = class { +var nt = class { _node; _onLocate; _onToggle; @@ -523,7 +828,7 @@ var Xe = class { syncFromGraph() { if (this._noteTextarea) { if ((this._el?.ownerDocument || document)?.activeElement !== this._noteTextarea) { - let e = Ve(this._node); + let e = qe(this._node); this._noteTextarea.value !== e && (this._noteTextarea.value = e, this._noteTextarea._mjrAutoFit?.()); } return; @@ -531,7 +836,7 @@ var Xe = class { if (!this._node?.widgets) return; let e = (this._el?.ownerDocument || document)?.activeElement || null; for (let t of this._node.widgets) { - let n = this._inputMap.get(t.name), r = Ze(n); + let n = this._inputMap.get(t.name), r = rt(n); if (!r) continue; if (r.type === "checkbox") { let e = !!t.value; @@ -567,9 +872,9 @@ var Xe = class { r.className = "mjr-ws-node-title-wrap"; let i = document.createElement("span"); i.className = "mjr-ws-node-type"; - let a = Je(e, { isSubgraph: this._isSubgraph }); + let a = et(e, { isSubgraph: this._isSubgraph }); i.textContent = a, r.appendChild(i); - let o = Ye(e, a, { isSubgraph: this._isSubgraph }); + let o = tt(e, a, { isSubgraph: this._isSubgraph }); if (o) { let e = document.createElement("span"); e.className = "mjr-ws-node-title", e.textContent = o, r.appendChild(e); @@ -589,14 +894,14 @@ var Xe = class { e.stopPropagation(), this._locateNode(); }), n.appendChild(s), t.appendChild(n); let c = document.createElement("div"); - if (c.className = "mjr-ws-node-body", Be(e)) { + if (c.className = "mjr-ws-node-body", Ke(e)) { let n = document.createElement("textarea"); - n.className = "mjr-ws-input mjr-ws-textarea mjr-ws-note-textarea", n.value = Ve(e), n.rows = 4; + n.className = "mjr-ws-input mjr-ws-textarea mjr-ws-note-textarea", n.value = qe(e), n.rows = 4; let r = () => { n.style.height = "auto", n.style.height = n.scrollHeight + "px"; }; return n.addEventListener("input", () => { - He(e, n.value); + Je(e, n.value); let t = e?.widgets?.[0], i = t?.inputEl ?? t?.element ?? t?.el ?? null; i != null && "value" in i && i.value !== n.value && (i.value = n.value), r(); try { @@ -607,7 +912,7 @@ var Xe = class { let u = e.widgets ?? [], d = !1; for (let t of u) { let n = String(t.type || "").toLowerCase(); - if (Re.has(n) || t.hidden || t.options?.hidden) continue; + if (We.has(n) || t.hidden || t.options?.hidden) continue; d = !0; let r = n === "text" || n === "string" || n === "customtext", i = document.createElement("div"); i.className = r ? "mjr-ws-widget-row mjr-ws-widget-row--block" : "mjr-ws-widget-row"; @@ -615,7 +920,7 @@ var Xe = class { a.className = "mjr-ws-widget-label", a.textContent = t.name || ""; let o = document.createElement("div"); o.className = "mjr-ws-widget-input"; - let s = re(t, () => {}, e); + let s = F(t, () => {}, e); o.appendChild(s), this._inputMap.set(t.name, s); let l = s._mjrAutoFit ?? s.querySelector?.("textarea")?._mjrAutoFit; l && this._autoFits.push(l), i.appendChild(a), i.appendChild(o), c.appendChild(i); @@ -647,7 +952,7 @@ var Xe = class { } let e = this._node; if (e) try { - i(e, { + d(e, { select: !1, focusCanvas: !1 }); @@ -656,11 +961,11 @@ var Xe = class { } } }; -function Ze(e) { +function rt(e) { return e ? e.classList?.contains?.("mjr-ws-text-wrapper") ? e.querySelector?.("textarea") ?? e : e : null; } // ui/features/viewer/workflowSidebar/WorkflowNodesTab.ts -var Qe = class { +var it = class { _searchQuery; _expandedNodeIds; _expandedChildrenIds; @@ -702,7 +1007,7 @@ var Qe = class { }), t.appendChild(r), e.appendChild(t), this._list = document.createElement("div"), this._list.className = "mjr-ws-nodes-list", e.appendChild(this._list), e; } _syncCanvasSelection() { - let e = ot()[0] || "", t = null; + let e = ft()[0] || "", t = null; for (let n of this._renderers) { let r = String(n._node?.id ?? "") === e; n.el?.classList?.toggle("is-selected-from-graph", r), r && (t = n); @@ -724,7 +1029,7 @@ var Qe = class { } } _maybeRebuildList() { - let e = tt($e()), t = (this._searchQuery || "").toLowerCase().trim(), n = t ? nt(e, t) : e, r = rt(n); + let e = st(at()), t = (this._searchQuery || "").toLowerCase().trim(), n = t ? ct(e, t) : e, r = lt(n); if (r === this._lastNodeSig) this._syncCanvasSelection(); else { this._lastNodeSig = r; @@ -739,13 +1044,13 @@ var Qe = class { for (let { node: i, children: a } of e) { let e = String(i?.id ?? ""), o = a.length, s = document.createElement("div"); s.className = "mjr-ws-tree-item", s.dataset.nodeId = e, s._mjrNodeId = e, s._mjrParentTreeItem = r || null, o > 0 && s.classList.add("mjr-ws-tree-item--subgraph"), n > 0 && s.classList.add("mjr-ws-tree-item--nested"); - let c = new Xe(i, { + let c = new nt(i, { collapsible: !0, expanded: this._expandedNodeIds.has(e), depth: n, isSubgraph: o > 0, childCount: o, - onLocate: () => at(i), + onLocate: () => dt(i), onToggle: (t) => { if (t) { this._expandedNodeIds = /* @__PURE__ */ new Set([e]); @@ -755,7 +1060,7 @@ var Qe = class { }); if (c._mjrTreeItemEl = s, this._renderers.push(c), s.appendChild(c.el), o > 0) { let t = this._expandedChildrenIds.has(e), r = document.createElement("button"); - r.type = "button", r.className = "mjr-ws-children-toggle", n > 0 && r.classList.add("mjr-ws-children-toggle--nested"), it(r, o, t); + r.type = "button", r.className = "mjr-ws-children-toggle", n > 0 && r.classList.add("mjr-ws-children-toggle--nested"), ut(r, o, t); let i = document.createElement("div"); i.className = "mjr-ws-children", i.hidden = !t, s._mjrChildrenToggle = r, s._mjrChildrenEl = i, s._mjrChildCount = o, this._renderItems(a, i, n + 1, s), r.addEventListener("click", () => { this._setTreeItemChildrenOpen(s, i.hidden); @@ -767,7 +1072,7 @@ var Qe = class { _setTreeItemChildrenOpen(e, t) { if (!e?._mjrChildrenEl || !e?._mjrChildrenToggle) return; let n = String(e._mjrNodeId || ""); - e._mjrChildrenEl.hidden = !t, n && (t ? this._expandedChildrenIds.add(n) : this._expandedChildrenIds.delete(n)), it(e._mjrChildrenToggle, Number(e._mjrChildCount) || 0, t); + e._mjrChildrenEl.hidden = !t, n && (t ? this._expandedChildrenIds.add(n) : this._expandedChildrenIds.delete(n)), ut(e._mjrChildrenToggle, Number(e._mjrChildCount) || 0, t); } _openTreeBranch(e) { let t = e || null; @@ -778,23 +1083,23 @@ var Qe = class { this._setTreeItemChildrenOpen(e, !0); } }; -function $e() { +function at() { try { - return s(); + return h(); } catch { return null; } } -function et(e) { - return x(e); +function ot(e) { + return b(e); } -function tt(e, t = /* @__PURE__ */ new Set()) { +function st(e, t = /* @__PURE__ */ new Set()) { if (!e || t.has(e)) return []; t.add(e); - let n = b(e), r = []; + let n = y(e), r = []; for (let e of n) { if (!e) continue; - let n = et(e).flatMap((e) => tt(e, t)); + let n = ot(e).flatMap((e) => st(e, t)); r.push({ node: e, children: n @@ -802,10 +1107,10 @@ function tt(e, t = /* @__PURE__ */ new Set()) { } return r; } -function nt(e, t) { +function ct(e, t) { let n = []; for (let { node: r, children: i } of e) { - let e = (r.type || "").toLowerCase().includes(t) || (r.title || "").toLowerCase().includes(t), a = nt(i, t); + let e = (r.type || "").toLowerCase().includes(t) || (r.title || "").toLowerCase().includes(t), a = ct(i, t); (e || a.length > 0) && n.push({ node: r, children: a @@ -813,14 +1118,14 @@ function nt(e, t) { } return n; } -function rt(e) { +function lt(e) { let t = []; function n(e) { for (let { node: r, children: i } of e) t.push(r.id), t.push("["), n(i), t.push("]"); } return n(e), t.join(","); } -function it(e, t, n) { +function ut(e, t, n) { let r = n ? "pi-chevron-down" : "pi-chevron-right"; e.textContent = ""; let i = document.createElement("i"); @@ -828,31 +1133,31 @@ function it(e, t, n) { let a = document.createElement("span"); a.textContent = `${t} inner node${t === 1 ? "" : "s"}`, e.appendChild(a), e.setAttribute("aria-expanded", String(n)); } -function at(e) { +function dt(e) { try { - i(e); + d(e); } catch (e) { console.debug?.("[MFV] _focusNode", e); } } -function ot() { +function ft() { try { - return o(); + return n(); } catch (e) { console.debug?.("[MFV] _getSelectedNodeIds", e); } return []; } // ui/features/viewer/workflowGraphMap/workflowGraphMapActions.ts -async function st(e) { +async function pt(e) { if (!e) return !1; - let t = JSON.stringify(ht(e), null, 2); - return O(t); + let t = JSON.stringify(xt(e), null, 2); + return I(t); } -async function ct(e) { - return O(lt(e)); +async function mt(e) { + return I(ht(e)); } -function lt(e) { +function ht(e) { if (e == null) return ""; if (typeof e == "string") return e; if (typeof e == "number" || typeof e == "boolean") return String(e); @@ -862,89 +1167,89 @@ function lt(e) { return String(e); } } -function ut(e) { - return c(e); +function gt(e) { + return g(e); } -function dt(e) { - let t = s(); +function _t(e) { + let t = h(); if (!e || !t || typeof t.add != "function") return !1; let n = String(e?.type || e?.class_type || e?.comfyClass || "").trim(), r = null; try { - r = v(n); + r = o(n); } catch (e) { console.debug?.("[MFV Graph Map] createNode failed", e); } if (!r) return !1; try { let t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); - return gt(t, e), delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof r.configure == "function" ? r.configure(t) : Object.assign(r, t), g(r); + return St(t, e), delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof r.configure == "function" ? r.configure(t) : Object.assign(r, t), a(r); } catch (e) { return console.debug?.("[MFV Graph Map] import node failed", e), !1; } } -function ft(e) { - let t = pt(); - if (!e || !t) return { +function vt(e) { + let n = yt(); + if (!e || !n) return { ok: !1, count: 0, reason: "no-target" }; - let n = mt(e), r = Array.isArray(t.widgets) ? t.widgets : []; - if (!n.length || !r.length) return { + let r = bt(e), i = Array.isArray(n.widgets) ? n.widgets : []; + if (!r.length || !i.length) return { ok: !1, count: 0, reason: "no-widgets" }; - let i = /* @__PURE__ */ new Map(); - r.forEach((e, t) => { - for (let n of vt(e)) i.has(n) || i.set(n, { + let a = /* @__PURE__ */ new Map(); + i.forEach((e, t) => { + for (let n of wt(e)) a.has(n) || a.set(n, { widget: e, index: t }); }); - let a = bt(R(e)), o = bt(t?.type || t?.comfyClass || t?.class_type), s = !!(a && o && a === o), c = /* @__PURE__ */ new Set(), l = 0; - for (let e of n) { - let n = yt(e.label), a = n ? i.get(n) : null, o = e.index; - if ((!a || c.has(a.index)) && s && typeof o == "number" && Number.isInteger(o)) { - let e = r[o]; - e && (a = { + let o = Et(B(e)), s = Et(n?.type || n?.comfyClass || n?.class_type), c = !!(o && s && o === s), l = /* @__PURE__ */ new Set(), u = 0; + for (let e of r) { + let t = Tt(e.label), r = t ? a.get(t) : null, o = e.index; + if ((!r || l.has(r.index)) && c && typeof o == "number" && Number.isInteger(o)) { + let e = i[o]; + e && (r = { widget: e, index: o }); } - a && !c.has(a.index) && te(a.widget, X(e.value), t) && (c.add(a.index), l += 1); + r && !l.has(r.index) && ne(r.widget, X(e.value), n) && (l.add(r.index), u += 1); } - return u(), { - ok: l > 0, - count: l, - reason: l > 0 ? "ok" : "no-match", - targetNode: t + return t(), { + ok: u > 0, + count: u, + reason: u > 0 ? "ok" : "no-match", + targetNode: n }; } -function pt() { - return _() || null; +function yt() { + return u() || null; } -function mt(e) { - let t = N(e); +function bt(e) { + let t = te(e); return Array.isArray(t) && t.length ? t.map(([e, t]) => ({ label: e, value: t })) : P(e); } -function ht(e) { +function xt(e) { let t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); - return gt(t, e), t; + return St(t, e), t; } -function gt(e, t) { +function St(e, t) { let n = t?._mjrPromptInputs && typeof t._mjrPromptInputs == "object" ? t._mjrPromptInputs : null; if (n) { - let r = _t(t, n); + let r = Ct(t, n); r && (e.widgets_values = r); } delete e._mjrPromptInputs, delete e._mjrSubgraphProxyParams; } -function _t(e, t) { - let n = bt(R(e)), r = P(e), i = new Map(r.map((e) => [yt(e.label), e.value])); +function Ct(e, t) { + let n = Et(B(e)), r = P(e), i = new Map(r.map((e) => [Tt(e.label), e.value])); if (n.includes("ksamplerselect")) return t.sampler_name == null ? null : [X(t.sampler_name)]; if (n.includes("ksampler")) { let e = t.control_after_generate ?? i.get("control_after_generate") ?? r[1]?.value; @@ -960,18 +1265,18 @@ function _t(e, t) { } return null; } -function vt(e) { +function wt(e) { return [ e?.name, e?.label, e?.options?.name, e?.options?.label - ].map(yt).filter(Boolean); + ].map(Tt).filter(Boolean); } -function yt(e) { +function Tt(e) { return String(e ?? "").trim().toLowerCase().replace(/\s+/g, "_"); } -function bt(e) { +function Et(e) { return String(e ?? "").trim().toLowerCase(); } function X(e) { @@ -983,7 +1288,7 @@ function X(e) { } } // ui/features/viewer/workflowGraphMap/WorkflowGraphMapPanel.ts -var xt = 64, St = class { +var Dt = 64, Ot = class { constructor({ large: e = !1 } = {}) { this._asset = null, this._workflow = null, this._selectedNodeId = "", this._renderInfo = null, this._resizeObserver = null, this._resizeObservedTarget = null, this._resizeObserverWindow = null, this._large = !!e, this._view = { zoom: 1, @@ -995,11 +1300,11 @@ var xt = 64, St = class { return this._el; } setAsset(e) { - this._asset !== e && (this._asset = e || null, this._workflow = B(this._asset), this._selectedNodeId = "", this._view = { + this._asset !== e && (this._asset = e || null, this._workflow = se(this._asset), this._selectedNodeId = "", this._view = { zoom: 1, centerX: null, centerY: null - }, this.refresh(), M(this._workflow).then(() => this.refresh()).catch(() => {})); + }, this.refresh(), L(this._workflow).then(() => this.refresh()).catch(() => {})); } refresh() { this._ensureResizeObserver(), this._el?.isConnected && (this._renderCanvas(), this._renderDetails()); @@ -1040,7 +1345,7 @@ var xt = 64, St = class { let t = e.getBoundingClientRect(), n = Math.max(1, Math.floor(t.width || e.clientWidth || 1)), r = Math.max(1, Math.floor(t.height || e.clientHeight || 1)), i = Z(e), a = Math.max(1, Math.min(2, Number(i?.devicePixelRatio) || 1)), o = Math.floor(n * a), s = Math.floor(r * a); (e.width !== o || e.height !== s) && (e.width = o, e.height = s); let c = e.getContext?.("2d"); - c && c.setTransform(a, 0, 0, a, 0, 0), this._workflow ? (this._renderInfo = A(e, this._workflow, { + c && c.setTransform(a, 0, 0, a, 0, 0), this._workflow ? (this._renderInfo = O(e, this._workflow, { showNodeLabels: !0, showViewport: !1, expandSubgraphs: this._subgraphDisplayMode !== "host", @@ -1053,26 +1358,26 @@ var xt = 64, St = class { }), this._renderInfo?.resolvedView && (this._view.centerX = this._renderInfo.resolvedView.centerX, this._view.centerY = this._renderInfo.resolvedView.centerY, this._view.zoom = this._renderInfo.resolvedView.zoom)) : (c?.clearRect?.(0, 0, n, r), this._renderInfo = null); } _renderDetails() { - let e = this._subgraphDisplayMode !== "host", t = F(this._workflow, { includeSubgraphs: e }).length; + let e = this._subgraphDisplayMode !== "host", t = ae(this._workflow, { includeSubgraphs: e }).length; if (!this._workflow) { - this._status.textContent = this._large ? "No workflow graph in selected image" : "Selected asset - no workflow graph", Ct(this._details); + this._status.textContent = this._large ? "No workflow graph in selected image" : "Selected asset - no workflow graph", kt(this._details); return; } this._status.textContent = this._large ? this._selectedNodeId ? `${t} nodes (${this._subgraphDisplayMode}) - selected #${this._selectedNodeId}` : `${t} nodes (${this._subgraphDisplayMode}) - select a node` : `${t} nodes - graph opened in viewer`; - let n = ne(this._workflow, this._selectedNodeId, { includeSubgraphs: e }); + let n = R(this._workflow, this._selectedNodeId, { includeSubgraphs: e }); if (!n) { let e = document.createElement("div"); - e.className = "mjr-ws-sidebar-empty", e.textContent = this._large ? "Click a node in the graph map" : "Use the large Graph Map in the viewer to select nodes", Ct(this._details, e); + e.className = "mjr-ws-sidebar-empty", e.textContent = this._large ? "Click a node in the graph map" : "Use the large Graph Map in the viewer to select nodes", kt(this._details, e); return; } let r = document.createElement("div"); - r.className = "mjr-wgm-node-title", r.textContent = V(n); + r.className = "mjr-wgm-node-title", r.textContent = H(n); let i = document.createElement("div"); - i.className = "mjr-wgm-node-meta", i.textContent = `#${this._selectedNodeId} ${H(n) || R(n) || "Node"}`; + i.className = "mjr-wgm-node-meta", i.textContent = `#${this._selectedNodeId} ${z(n) || B(n) || "Node"}`; let a = this._buildBreadcrumb(n), o = document.createElement("div"); - o.className = "mjr-wgm-actions", o.appendChild(this._makeAction("Copy node", "pi pi-copy", () => st(n))), o.appendChild(this._makeAction("Import node", "pi pi-plus-circle", () => dt(n))), o.appendChild(this._makeAction("Import workflow", "pi pi-download", () => ut(this._workflow))), o.appendChild(this._makeAction("Transfer params to selected canvas node", "pi pi-arrow-right-arrow-left", () => ft(n)?.ok)); + o.className = "mjr-wgm-actions", o.appendChild(this._makeAction("Copy node", "pi pi-copy", () => pt(n))), o.appendChild(this._makeAction("Import node", "pi pi-plus-circle", () => _t(n))), o.appendChild(this._makeAction("Import workflow", "pi pi-download", () => gt(this._workflow))), o.appendChild(this._makeAction("Transfer params to selected canvas node", "pi pi-arrow-right-arrow-left", () => vt(n)?.ok)); let s = this._buildNodeVisual(n); - Ct(this._details, r, i, a, s, o); + kt(this._details, r, i, a, s, o); } _makeModeButton(e, t) { let n = document.createElement("button"); @@ -1082,7 +1387,7 @@ var xt = 64, St = class { let t = document.createElement("div"); t.className = "mjr-wgm-breadcrumb"; let n = ["Workflow"], r = String(e?._mjrSubgraphName || "").trim(), i = String(this._selectedNodeId || ""); - (r || i.includes("::")) && n.push(r || String(i.split("::")[0] || "Subgraph")), n.push(V(e)); + (r || i.includes("::")) && n.push(r || String(i.split("::")[0] || "Subgraph")), n.push(H(e)); for (let e = 0; e < n.length; e += 1) { if (e > 0) { let e = document.createElement("span"); @@ -1101,11 +1406,11 @@ var xt = 64, St = class { } _buildNodeVisual(e) { let t = document.createElement("section"); - t.className = "mjr-wgm-node-visual", t.classList.add(`is-${Nt(e)}`); + t.className = "mjr-wgm-node-visual", t.classList.add(`is-${zt(e)}`); let n = document.createElement("div"); n.className = "mjr-wgm-node-visual-header"; let r = document.createElement("span"); - r.className = "mjr-wgm-node-visual-type", r.textContent = H(e) || R(e) || "Node"; + r.className = "mjr-wgm-node-visual-type", r.textContent = z(e) || B(e) || "Node"; let i = document.createElement("span"); i.className = "mjr-wgm-node-visual-id", i.textContent = `#${String(e?.id ?? this._selectedNodeId ?? "")}`, n.append(r, i); let a = document.createElement("div"); @@ -1116,7 +1421,7 @@ var xt = 64, St = class { c.className = "mjr-wgm-node-widgets"; let l = document.createElement("div"); l.className = "mjr-wgm-node-widgets-title", l.textContent = "Widgets", c.appendChild(l); - let u = Mt(e); + let u = Rt(e); if (u.length) { for (let e of u.slice(0, 12)) { let t = document.createElement("div"); @@ -1127,8 +1432,8 @@ var xt = 64, St = class { r.className = "mjr-wgm-node-widget-key", r.textContent = n; let i = document.createElement("span"); i.className = "mjr-wgm-node-widget-value"; - let a = Tt(e?.value); - i.textContent = a, Et(e?.value, a) && t.classList.add("is-multiline"), Dt(n) && t.classList.add("is-text-field"), t.append(r, i), t.addEventListener("click", () => this._copyParam(t, e?.value)), t.addEventListener("keydown", (n) => { + let a = jt(e?.value); + i.textContent = a, Mt(e?.value, a) && t.classList.add("is-multiline"), Nt(n) && t.classList.add("is-text-field"), t.append(r, i), t.addEventListener("click", () => this._copyParam(t, e?.value)), t.addEventListener("keydown", (n) => { (n.key === "Enter" || n.key === " ") && (n.preventDefault?.(), this._copyParam(t, e?.value)); }), c.appendChild(t); } @@ -1149,7 +1454,7 @@ var xt = 64, St = class { i.className = "mjr-wgm-node-ports-title", i.textContent = String(e), r.appendChild(i); let a = document.createElement("div"); a.className = "mjr-wgm-node-ports-list"; - let o = Ot(t).slice(0, 8); + let o = Pt(t).slice(0, 8); if (o.length) for (let e of o) { let t = document.createElement("div"); t.className = "mjr-wgm-node-port"; @@ -1157,7 +1462,7 @@ var xt = 64, St = class { r.className = `mjr-wgm-node-port-dot is-${n}`; let i = document.createElement("span"); i.className = "mjr-wgm-node-port-name"; - let o = At(e); + let o = It(e); if (i.textContent = o.label, t.append(r, i), o.type) { let e = document.createElement("span"); e.className = "mjr-wgm-node-port-type", e.textContent = o.type, t.appendChild(e); @@ -1183,7 +1488,7 @@ var xt = 64, St = class { } async _copyParam(e, t) { try { - let n = await ct(t); + let n = await mt(t); e.classList.toggle("is-ok", !!n), e.classList.toggle("is-error", !n), Z(e).setTimeout(() => { e.classList.remove("is-ok"), e.classList.remove("is-error"); }, 750); @@ -1193,19 +1498,19 @@ var xt = 64, St = class { } _renderPreview() { if (!this._preview) return; - let e = Pt(this._asset), t = Ft(e); + let e = Bt(this._asset), t = Vt(e); if (this._previewMedia && t && t === this._previewKey) { - (this._preview.firstChild !== this._previewMedia || this._preview.childNodes.length !== 1) && Ct(this._preview, this._previewMedia); + (this._preview.firstChild !== this._previewMedia || this._preview.childNodes.length !== 1) && kt(this._preview, this._previewMedia); return; } this._disposePreviewMedia(); - let n = Y(e, { fill: !0 }); + let n = J(e, { fill: !0 }); if (n) { n.classList?.add?.("mjr-wgm-preview-media"), this._previewMedia = n, this._previewKey = t, this._preview.appendChild(n); return; } let r = document.createElement("div"); - r.className = "mjr-wgm-preview-empty", r.textContent = "No preview", Ct(this._preview, r); + r.className = "mjr-wgm-preview-empty", r.textContent = "No preview", kt(this._preview, r); } _disposePreviewMedia() { let e = this._previewMedia; @@ -1232,7 +1537,7 @@ var xt = 64, St = class { _handleWheel(e) { if (!this._workflow) return; e.preventDefault?.(); - let t = (Number(e.deltaY) > 0 ? -1 : 1) > 0 ? 1.18 : 1 / 1.18, n = Number(this._view.zoom || 1), r = Math.max(1, Math.min(xt, n * t)); + let t = (Number(e.deltaY) > 0 ? -1 : 1) > 0 ? 1.18 : 1 / 1.18, n = Number(this._view.zoom || 1), r = Math.max(1, Math.min(Dt, n * t)); if (r === n) return; let i = this._renderInfo?.resolvedView; if (i?.renderScale && i?.viewMinX != null && i?.viewMinY != null) { @@ -1254,7 +1559,7 @@ var xt = 64, St = class { let i = this._renderInfo; if (!i?.bounds) return; let { bounds: a } = i, o = Math.max(1, a.maxX - a.minX), s = Math.max(1, a.maxY - a.minY), c = o / Math.max(1, n * 2), l = s / Math.max(1, r * 2); - this._view.zoom = Math.max(1, Math.min(xt, Math.min(c, l))), this._view.centerX = e + n / 2, this._view.centerY = t + r / 2, this.refresh(); + this._view.zoom = Math.max(1, Math.min(Dt, Math.min(c, l))), this._view.centerX = e + n / 2, this._view.centerY = t + r / 2, this.refresh(); } _handlePointerDown(e) { if (!this._workflow || e.button !== 0) return; @@ -1287,13 +1592,13 @@ var xt = 64, St = class { function Z(e) { return e?.ownerDocument?.defaultView || window; } -function Ct(e, ...t) { +function kt(e, ...t) { if (e) { for (; e.firstChild;) e.removeChild(e.firstChild); for (let n of t) e.appendChild(n); } } -function wt(e) { +function At(e) { if (e == null) return ""; if (typeof e == "string") return e.replace(/\s+/g, " ").trim(); if (typeof e == "number" || typeof e == "boolean") return String(e); @@ -1303,39 +1608,39 @@ function wt(e) { return String(e); } } -function Tt(e) { - return e == null ? "" : typeof e == "string" ? e.replace(/\r\n?/g, "\n").trim() : wt(e); +function jt(e) { + return e == null ? "" : typeof e == "string" ? e.replace(/\r\n?/g, "\n").trim() : At(e); } -function Et(e, t) { +function Mt(e, t) { if (typeof e != "string") return !1; let n = String(t || ""); return n.includes("\n") || n.length > 120; } -function Dt(e) { +function Nt(e) { let t = String(e || "").toLowerCase().replace(/[^a-z0-9]/g, ""); return t ? t === "text" || t === "prompt" || t === "positive" || t === "negative" || t === "string" || t === "caption" : !1; } -function Ot(e) { - return Array.isArray(e) ? e.filter((e) => e && !kt(e)).map((e) => ({ +function Pt(e) { + return Array.isArray(e) ? e.filter((e) => e && !Ft(e)).map((e) => ({ name: String(e?.name || e?.label || "").trim(), type: String(e?.type || e?.slot_type || e?.data_type || "").trim() })) : []; } -function kt(e) { +function Ft(e) { return !e || typeof e != "object" ? !1 : !!(e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim() || e.widget_index != null || e.widgetIndex != null); } -function At(e) { - let t = String(e?.name || e?.label || e?.type || "port").trim() || "port", n = String(e?.type || "").trim(), r = jt(t), i = jt(n); +function It(e) { + let t = String(e?.name || e?.label || e?.type || "port").trim() || "port", n = String(e?.type || "").trim(), r = Lt(t), i = Lt(n); return { label: t, type: i && i !== r ? n : "" }; } -function jt(e) { +function Lt(e) { return String(e || "").toLowerCase().replace(/[^a-z0-9]/g, ""); } -function Mt(e) { - let t = N(e), n = Array.isArray(t) ? t.map(([e, t]) => ({ +function Rt(e) { + let t = te(e), n = Array.isArray(t) ? t.map(([e, t]) => ({ label: e, value: t })) : []; @@ -1347,11 +1652,11 @@ function Mt(e) { value: e?.value })) : []; } -function Nt(e) { - let t = `${String(R(e) || "").toLowerCase()} ${String(H(e) || "").toLowerCase()}`; +function zt(e) { + let t = `${String(B(e) || "").toLowerCase()} ${String(z(e) || "").toLowerCase()}`; return t.trim() ? /ksampler|sampler|scheduler|cfg|steps|noise|seed/.test(t) ? "sampler" : /checkpoint|clip|vae|unet|lora|model|loader/.test(t) ? "model" : /text|prompt|token|encode|decoder|caption|florence/.test(t) ? "text" : /latent|image|mask|video|audio|preview|save|load|upscale/.test(t) ? "media" : /controlnet|conditioning|guidance|adapter|ipadapter/.test(t) ? "control" : /math|logic|switch|merge|concat|combine|route|branch|reroute/.test(t) ? "logic" : "generic" : "generic"; } -function Pt(e) { +function Bt(e) { if (!e || typeof e != "object") return e; let t = (Array.isArray(e.previewCandidates) ? e.previewCandidates : []).find((e) => String(e || "").trim()) || e.url || "", n = String(e.type || "").toLowerCase(), r = String(e.kind || "").toLowerCase(), i = String(e.filename || e.name || ""), a = r || (e.isVideo || n === "video" || /\.(mp4|mov|webm|mkv|avi)$/i.test(i) ? "video" : e.isAudio || n === "audio" || /\.(mp3|wav|flac|ogg|m4a|aac|opus|wma)$/i.test(i) ? "audio" : e.isModel3d || n === "model3d" ? "model3d" : ""); return { @@ -1363,7 +1668,7 @@ function Pt(e) { } : null }; } -function Ft(e) { +function Vt(e) { return !e || typeof e != "object" ? "" : JSON.stringify({ url: String(e.url || ""), filename: String(e.filename || e.name || ""), @@ -1373,7 +1678,7 @@ function Ft(e) { }); } // ui/features/viewer/workflowSidebar/WorkflowSidebar.ts -var It = 16, Lt = 250, Rt = class { +var Ht = 16, Ut = 250, Wt = class { _hostEl; _onClose; _onOpenGraphMap; @@ -1392,7 +1697,7 @@ var It = 16, Lt = 250, Rt = class { _nodesModeBtn; _graphModeBtn; constructor({ hostEl: e, onClose: t, onOpenGraphMap: n, onCloseGraphMap: r } = {}) { - this._hostEl = e, this._onClose = t ?? null, this._onOpenGraphMap = n ?? null, this._onCloseGraphMap = r ?? null, this._visible = !1, this._liveSyncHandle = null, this._liveSyncMode = "", this._lastLiveSyncAt = 0, this._resizeCleanup = null, this._nodesTab = new Qe(), this._graphMapPanel = new St(), this._activeMode = "nodes", this._asset = null, this._body = null, this._nodesModeBtn = null, this._graphModeBtn = null, this._el = this._build(); + this._hostEl = e, this._onClose = t ?? null, this._onOpenGraphMap = n ?? null, this._onCloseGraphMap = r ?? null, this._visible = !1, this._liveSyncHandle = null, this._liveSyncMode = "", this._lastLiveSyncAt = 0, this._resizeCleanup = null, this._nodesTab = new it(), this._graphMapPanel = new Ot(), this._activeMode = "nodes", this._asset = null, this._body = null, this._nodesModeBtn = null, this._graphModeBtn = null, this._el = this._build(); } get el() { return this._el; @@ -1401,7 +1706,7 @@ var It = 16, Lt = 250, Rt = class { return this._visible; } show() { - this._visible = !0, this._el.classList.add("open"), this.refresh(), this._lastLiveSyncAt = Bt(this._el), this._startLiveSync(); + this._visible = !0, this._el.classList.add("open"), this.refresh(), this._lastLiveSyncAt = Kt(this._el), this._startLiveSync(); } hide() { this._visible = !1, this._el.classList.remove("open"), this._stopLiveSync(); @@ -1430,14 +1735,14 @@ var It = 16, Lt = 250, Rt = class { let t = document.createElement("div"); t.className = "mjr-ws-sidebar-header"; let n = document.createElement("span"); - n.className = "mjr-ws-sidebar-title", n.textContent = f("workflowSidebar.nodes", "Nodes"), t.appendChild(n); + n.className = "mjr-ws-sidebar-title", n.textContent = s("workflowSidebar.nodes", "Nodes"), t.appendChild(n); let r = document.createElement("button"); - r.type = "button", r.className = "mjr-icon-btn", r.title = f("workflowSidebar.close", "Close sidebar"), r.innerHTML = "", r.addEventListener("click", () => { + r.type = "button", r.className = "mjr-icon-btn", r.title = s("workflowSidebar.close", "Close sidebar"), r.innerHTML = "", r.addEventListener("click", () => { let e = this._activeMode === "graph"; this.hide(), e && this._onCloseGraphMap?.(), this._onClose?.(); }), t.appendChild(r), e.appendChild(t); let i = document.createElement("div"); - i.className = "mjr-ws-tab-bar", this._nodesModeBtn = this._makeModeButton(f("workflowSidebar.nodes", "Nodes"), "pi pi-sliders-h", "nodes"), this._graphModeBtn = this._makeModeButton(f("workflowSidebar.graphMap", "Graph Map"), "pi pi-sitemap", "graph"), i.appendChild(this._nodesModeBtn), i.appendChild(this._graphModeBtn), e.appendChild(i); + i.className = "mjr-ws-tab-bar", this._nodesModeBtn = this._makeModeButton(s("workflowSidebar.nodes", "Nodes"), "pi pi-sliders-h", "nodes"), this._graphModeBtn = this._makeModeButton(s("workflowSidebar.graphMap", "Graph Map"), "pi pi-sitemap", "graph"), i.appendChild(this._nodesModeBtn), i.appendChild(this._graphModeBtn), e.appendChild(i); let a = document.createElement("div"); return a.className = "mjr-ws-sidebar-resizer", a.setAttribute("role", "separator"), a.setAttribute("aria-orientation", "vertical"), a.setAttribute("aria-hidden", "true"), e.appendChild(a), this._bindResize(a), this._body = document.createElement("div"), this._body.className = "mjr-ws-sidebar-body", e.appendChild(this._body), this._renderActiveMode(), e; } @@ -1460,16 +1765,16 @@ var It = 16, Lt = 250, Rt = class { } _startLiveSync() { if (this._liveSyncHandle != null) return; - let e = zt(this._el), t = (e) => { + let e = Gt(this._el), t = (e) => { if (this._liveSyncHandle = null, this._liveSyncMode = "", !this._visible) return; - let t = Number.isFinite(Number(e)) ? Number(e) : Bt(this._el); - t - this._lastLiveSyncAt >= Lt && (this._lastLiveSyncAt = t, this.syncFromGraph()), this._startLiveSync(); + let t = Number.isFinite(Number(e)) ? Number(e) : Kt(this._el); + t - this._lastLiveSyncAt >= Ut && (this._lastLiveSyncAt = t, this.syncFromGraph()), this._startLiveSync(); }; - typeof e.requestAnimationFrame == "function" ? (this._liveSyncMode = "raf", this._liveSyncHandle = e.requestAnimationFrame(t)) : (this._liveSyncMode = "timeout", this._liveSyncHandle = e.setTimeout(t, It)); + typeof e.requestAnimationFrame == "function" ? (this._liveSyncMode = "raf", this._liveSyncHandle = e.requestAnimationFrame(t)) : (this._liveSyncMode = "timeout", this._liveSyncHandle = e.setTimeout(t, Ht)); } _stopLiveSync() { if (this._liveSyncHandle == null) return; - let e = zt(this._el); + let e = Gt(this._el); try { this._liveSyncMode === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(this._liveSyncHandle) : typeof e.clearTimeout == "function" && e.clearTimeout(this._liveSyncHandle); } catch (e) { @@ -1505,11 +1810,11 @@ var It = 16, Lt = 250, Rt = class { this._resizeCleanup = null; } }; -function zt(e) { +function Gt(e) { return e?.ownerDocument?.defaultView || (typeof window < "u" ? window : globalThis); } -function Bt(e) { - let t = zt(e), n = t?.performance?.now; +function Kt(e) { + let t = Gt(e), n = t?.performance?.now; if (typeof n == "function") try { return Number(n.call(t.performance)) || Date.now(); } catch { @@ -1523,97 +1828,97 @@ var Q = Object.freeze({ RUNNING: "running", STOPPING: "stopping", ERROR: "error" -}), Vt = /* @__PURE__ */ new Set([ +}), qt = /* @__PURE__ */ new Set([ "default", "auto", "latent2rgb", "taesd", "none" -]), Ht = "progress-update", Ut = (e, t = "") => f(e, t, void 0); -function Wt() { - let e = document.createElement("div"); - e.className = "mjr-mfv-run-controls"; - let t = document.createElement("button"); - t.type = "button", t.className = "mjr-icon-btn mjr-mfv-run-btn"; - let n = Ut("tooltip.queuePrompt", "Queue Prompt (Run)"); - t.title = n, t.setAttribute("aria-label", n); - let r = document.createElement("i"); - r.className = "pi pi-play", r.setAttribute("aria-hidden", "true"), t.appendChild(r); - let i = document.createElement("button"); - i.type = "button", i.className = "mjr-icon-btn mjr-mfv-stop-btn"; +]), Jt = "progress-update", Yt = (e, t = "") => s(e, t, void 0); +function Xt() { + let t = document.createElement("div"); + t.className = "mjr-mfv-run-controls"; + let n = document.createElement("button"); + n.type = "button", n.className = "mjr-icon-btn mjr-mfv-run-btn"; + let r = Yt("tooltip.queuePrompt", "Queue Prompt (Run)"); + n.title = r, n.setAttribute("aria-label", r); + let i = document.createElement("i"); + i.className = "pi pi-play", i.setAttribute("aria-hidden", "true"), n.appendChild(i); + let a = document.createElement("button"); + a.type = "button", a.className = "mjr-icon-btn mjr-mfv-stop-btn"; let o = document.createElement("i"); - o.className = "pi pi-stop", o.setAttribute("aria-hidden", "true"), i.appendChild(o), e.appendChild(t), e.appendChild(i); + o.className = "pi pi-stop", o.setAttribute("aria-hidden", "true"), a.appendChild(o), t.appendChild(n), t.appendChild(a); let s = Q.IDLE, c = !1, l = !1, u = null; - function f() { + function d() { u != null && (clearTimeout(u), u = null); } - function p(e, { canStop: n = !1 } = {}) { - s = e, t.classList.toggle("running", s === Q.RUNNING), t.classList.toggle("stopping", s === Q.STOPPING), t.classList.toggle("error", s === Q.ERROR), t.disabled = s === Q.RUNNING || s === Q.STOPPING, i.disabled = !n || s === Q.STOPPING, i.classList.toggle("active", n && s !== Q.STOPPING), i.classList.toggle("stopping", s === Q.STOPPING), s === Q.RUNNING || s === Q.STOPPING ? r.className = "pi pi-spin pi-spinner" : r.className = "pi pi-play"; + function f(e, { canStop: t = !1 } = {}) { + s = e, n.classList.toggle("running", s === Q.RUNNING), n.classList.toggle("stopping", s === Q.STOPPING), n.classList.toggle("error", s === Q.ERROR), n.disabled = s === Q.RUNNING || s === Q.STOPPING, a.disabled = !t || s === Q.STOPPING, a.classList.toggle("active", t && s !== Q.STOPPING), a.classList.toggle("stopping", s === Q.STOPPING), s === Q.RUNNING || s === Q.STOPPING ? i.className = "pi pi-spin pi-spinner" : i.className = "pi pi-play"; } - function m() { - let e = Ut("tooltip.queueStop", "Stop Generation"); - i.title = e, i.setAttribute("aria-label", e); + function p() { + let e = Yt("tooltip.queueStop", "Stop Generation"); + a.title = e, a.setAttribute("aria-label", e); } - function h(e = U.getSnapshot(), { authoritative: t = !1 } = {}) { + function m(e = j.getSnapshot(), { authoritative: t = !1 } = {}) { let n = Math.max(0, Number(e?.queue) || 0), r = e?.prompt || null, i = !!r?.currentlyExecuting, a = !!(r && (r.currentlyExecuting || r.errorDetails)), o = n > 0 || a, s = !!r?.errorDetails; t && n === 0 && !r && (c = !1, l = !1); let u = c || l || i || n > 0; - if ((i || o || n > 0) && (c = !1), s) l = !1, f(), p(Q.ERROR, { canStop: !1 }); + if ((i || o || n > 0) && (c = !1), s) l = !1, d(), f(Q.ERROR, { canStop: !1 }); else if (l) { if (!u) { - l = !1, h(e); + l = !1, m(e); return; } - p(Q.STOPPING, { canStop: !1 }); - } else c || i || o || n > 0 ? (f(), p(Q.RUNNING, { canStop: !0 })) : (f(), p(Q.IDLE, { canStop: !1 })); + f(Q.STOPPING, { canStop: !1 }); + } else c || i || o || n > 0 ? (d(), f(Q.RUNNING, { canStop: !0 })) : (d(), f(Q.IDLE, { canStop: !1 })); } - function g() { - c = !1, l = !1, f(), p(Q.ERROR, { canStop: !1 }), u = setTimeout(() => { - u = null, h(); + function h() { + c = !1, l = !1, d(), f(Q.ERROR, { canStop: !1 }), u = setTimeout(() => { + u = null, m(); }, 1500); } - async function _() { - return { tracked: await a(d()) }; + async function g() { + return { tracked: await e(_()) }; } async function v() { if (s !== Q.RUNNING && s !== Q.STOPPING) { - c = !0, l = !1, h(); + c = !0, l = !1, m(); try { - (await Xt())?.tracked || (c = !1), h(); + (await nn())?.tracked || (c = !1), m(); } catch (e) { - console.error?.("[MFV Run]", e), g(); + console.error?.("[MFV Run]", e), h(); } } } async function y() { if (s === Q.RUNNING) { - l = !0, h(); + l = !0, m(); try { - (await _())?.tracked || (l = !1, c = !1), h(); + (await g())?.tracked || (l = !1, c = !1), m(); } catch (e) { - console.error?.("[MFV Stop]", e), l = !1, h(); + console.error?.("[MFV Stop]", e), l = !1, m(); } } } - m(), i.disabled = !0, t.addEventListener("click", v), i.addEventListener("click", y); + p(), a.disabled = !0, n.addEventListener("click", v), a.addEventListener("click", y); let b = (e) => { - h(e?.detail || U.getSnapshot(), { authoritative: !0 }); + m(e?.detail || j.getSnapshot(), { authoritative: !0 }); }; - return U.addEventListener(Ht, b), j({ timeoutMs: 4e3 }).catch((e) => { + return j.addEventListener(Jt, b), M({ timeoutMs: 4e3 }).catch((e) => { console.debug?.(e); - }), h(), { - el: e, + }), m(), { + el: t, dispose() { - f(), t.removeEventListener("click", v), i.removeEventListener("click", y), U.removeEventListener(Ht, b); + d(), n.removeEventListener("click", v), a.removeEventListener("click", y), j.removeEventListener(Jt, b); } }; } -function Gt(e = p.MFV_PREVIEW_METHOD) { +function Zt(e = p.MFV_PREVIEW_METHOD) { let t = String(e || "").trim().toLowerCase(); - return Vt.has(t) ? t : p.MFV_PREVIEW_METHOD || "auto"; + return qt.has(t) ? t : p.MFV_PREVIEW_METHOD || "auto"; } -function Kt(e, t = p.MFV_PREVIEW_METHOD) { - let n = Gt(t), r = { +function Qt(e, t = p.MFV_PREVIEW_METHOD) { + let n = Zt(t), r = { ...e?.extra_data || {}, extra_pnginfo: { ...e?.extra_data?.extra_pnginfo || {} } }; @@ -1622,14 +1927,14 @@ function Kt(e, t = p.MFV_PREVIEW_METHOD) { extra_data: r }; } -function qt(e, { previewMethod: t = p.MFV_PREVIEW_METHOD, clientId: n = null } = {}) { - let r = Kt(e, t), i = { +function $t(e, { previewMethod: t = p.MFV_PREVIEW_METHOD, clientId: n = null } = {}) { + let r = Qt(e, t), i = { prompt: r?.output, extra_data: r?.extra_data || {} }, a = String(n || "").trim(); return a && (i.client_id = a), i; } -function Jt(e) { +function en(e) { let t = e?.constructor; return [ e?.type, @@ -1638,32 +1943,32 @@ function Jt(e) { t?.type ].some((e) => /Api$/i.test(String(e || "").trim())); } -function Yt(e) { +function tn(e) { let t = !1; - return S(e, ({ node: e }) => { - t ||= Jt(e); + return x(e, ({ node: e }) => { + t ||= en(e); }), t; } -async function Xt() { - let e = d(); +async function nn() { + let e = _(); if (!e) throw Error("ComfyUI app not available"); - let t = Yt(y(e)); - return { tracked: await r({ + let t = tn(v(e)); + return { tracked: await c({ app: e, forceNativeQueue: t, resolvePromptData(e) { return typeof e?.graphToPrompt == "function" ? e.graphToPrompt() : null; }, enrichPromptData(e) { - return Kt(e); + return Qt(e); }, buildPromptRequestBody(e, t) { - return qt(e, { clientId: t.clientId }); + return $t(e, { clientId: t.clientId }); } }) }; } // ui/features/viewer/floatingViewerUi.ts -function Zt(e) { +function rn(e) { let t = e?.models; if (!t || typeof t != "object") return ""; let n = [ @@ -1676,16 +1981,16 @@ function Zt(e) { ["VAE", t.vae] ], r = /* @__PURE__ */ new Set(), i = []; for (let [e, t] of n) { - let n = le(t?.name || t?.value || t || ""); + let n = S(t?.name || t?.value || t || ""); if (n && !r.has(n) && (r.add(n), i.push(`${e}: ${n}`), i.length >= 3)) break; } return i.join(" | "); } -function Qt(e) { - let t = ue(e); +function an(e) { + let t = T(e); return t.workflowLabel ? [t.workflowLabel, t.workflowBadge].filter(Boolean).join(" | ") : ""; } -function $t(e, t, n, r) { +function on(e, t, n, r) { let i = document.createElement("div"); i.className = "mjr-mfv-idrop"; let a = document.createElement("button"); @@ -1733,21 +2038,21 @@ function $t(e, t, n, r) { } }; } -var en = { +var sn = { rgb: "#e0e0e0", r: "#ff5555", g: "#44dd66", b: "#5599ff", a: "#ffffff", l: "#bbbbbb" -}, tn = { +}, cn = { rgb: "RGB", r: "R", g: "G", b: "B", a: "A", l: "L" -}, nn = { +}, ln = { rgb: "500", r: "700", g: "700", @@ -1755,20 +2060,20 @@ var en = { a: "700", l: "400" }; -function rn(e) { +function un(e) { let t = document.createElement("div"); - return t.className = "mjr-mfv", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "false"), t.setAttribute("aria-hidden", "true"), e.element = t, t.appendChild(e._buildHeader()), t.setAttribute("aria-labelledby", e._titleId), t.appendChild(e._buildToolbar()), t.appendChild(L(e)), e._contentWrapper = document.createElement("div"), e._contentWrapper.className = "mjr-mfv-content-wrapper", e._applySidebarPosition(), e._contentEl = document.createElement("div"), e._contentEl.className = "mjr-mfv-content", e._contentWrapper.appendChild(e._contentEl), e._overlayCanvas = document.createElement("canvas"), e._overlayCanvas.className = "mjr-mfv-overlay-canvas", e._contentEl.appendChild(e._overlayCanvas), e._contentEl.appendChild(z(e)), e._genSidebarEl = document.createElement("aside"), e._genSidebarEl.className = "mjr-mfv-gen-sidebar", e._genSidebarEl.setAttribute("aria-label", "Generation info"), e._genSidebarEl.setAttribute("hidden", ""), e._sidebar = new Rt({ + return t.className = "mjr-mfv", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "false"), t.setAttribute("aria-hidden", "true"), e.element = t, t.appendChild(e._buildHeader()), t.setAttribute("aria-labelledby", e._titleId), t.appendChild(e._buildToolbar()), t.appendChild(oe(e)), e._contentWrapper = document.createElement("div"), e._contentWrapper.className = "mjr-mfv-content-wrapper", e._applySidebarPosition(), e._contentEl = document.createElement("div"), e._contentEl.className = "mjr-mfv-content", e._contentWrapper.appendChild(e._contentEl), e._overlayCanvas = document.createElement("canvas"), e._overlayCanvas.className = "mjr-mfv-overlay-canvas", e._contentEl.appendChild(e._overlayCanvas), e._contentEl.appendChild(A(e)), e._genSidebarEl = document.createElement("aside"), e._genSidebarEl.className = "mjr-mfv-gen-sidebar", e._genSidebarEl.setAttribute("aria-label", "Generation info"), e._genSidebarEl.setAttribute("hidden", ""), e._sidebar = new Wt({ hostEl: t, onClose: () => e._updateSettingsBtnState(!1), - onOpenGraphMap: () => e.setMode?.(G.GRAPH), + onOpenGraphMap: () => e.setMode?.(W.GRAPH), onCloseGraphMap: () => { - e._mode === G.GRAPH && e.setMode?.(G.SIMPLE); + e._mode === W.GRAPH && e.setMode?.(W.SIMPLE); } }), e._contentWrapper.appendChild(e._genSidebarEl), e._contentWrapper.appendChild(e._sidebar.el), t.appendChild(e._contentWrapper), e._rebindControlHandlers(), e._bindPanelInteractions(), e._bindDocumentUiHandlers(), e._bindLayoutObserver?.(), e._onSidebarPosChanged = (t) => { t?.detail?.key === "viewer.mfvSidebarPosition" && e._applySidebarPosition(); }, window.addEventListener("mjr-settings-changed", e._onSidebarPosChanged), e._refresh(), t; } -function an(e) { +function dn(e) { let t = document.createElement("div"); t.className = "mjr-mfv-header"; let n = document.createElement("span"); @@ -1778,11 +2083,11 @@ function an(e) { let i = document.createElement("span"); i.textContent = "Majoor Floating Viewer", n.append(r, i); let a = document.createElement("button"); - e._closeBtn = a, a.type = "button", a.className = "mjr-icon-btn mjr-mfv-close-btn", C(a, f("tooltip.closeViewer", "Close viewer"), "Esc"); + e._closeBtn = a, a.type = "button", a.className = "mjr-icon-btn mjr-mfv-close-btn", V(a, s("tooltip.closeViewer", "Close viewer"), "Esc"); let o = document.createElement("i"); return o.className = "pi pi-times", o.setAttribute("aria-hidden", "true"), a.appendChild(o), t.appendChild(n), t.appendChild(a), t; } -function on(e) { +function fn(e) { let t = (e, { min: t, max: n, step: r, value: i } = {}) => { let a = document.createElement("div"); a.className = "mjr-mfv-toolbar-range"; @@ -1796,31 +2101,31 @@ function on(e) { }; }, n = document.createElement("div"); n.className = "mjr-mfv-toolbar"; - let r = $t("", f("viewer.mode", "Viewer mode"), [ + let r = on("", s("viewer.mode", "Viewer mode"), [ { - value: G.SIMPLE, - html: `${f("viewer.mode.simple", "Simple")}` + value: W.SIMPLE, + html: `${s("viewer.mode.simple", "Simple")}` }, { - value: G.AB, - html: `${f("viewer.mode.abCompare", "A/B Compare")}` + value: W.AB, + html: `${s("viewer.mode.abCompare", "A/B Compare")}` }, { - value: G.SIDE, - html: `${f("viewer.mode.sideBySide", "Side-by-side")}` + value: W.SIDE, + html: `${s("viewer.mode.sideBySide", "Side-by-side")}` }, { - value: G.GRID, - html: `${f("viewer.mode.grid", "Grid")}` + value: W.GRID, + html: `${s("viewer.mode.grid", "Grid")}` }, { - value: G.GRAPH, - html: `${f("workflowSidebar.graphMap", "Graph Map")}` + value: W.GRAPH, + html: `${s("workflowSidebar.graphMap", "Graph Map")}` } ], e); e._modeDrop = r, e._modeBtn = r.trigger, e._modeSelect = r.select, e._updateModeBtnUI(), n.appendChild(r.wrap); let i = document.createElement("button"); - i.type = "button", i.className = "mjr-icon-btn mjr-mfv-pin-trigger", i.title = f("viewer.pinSlots", "Pin slots A/B/C/D"), i.setAttribute("aria-haspopup", "dialog"), i.setAttribute("aria-expanded", "false"), i.innerHTML = "", n.appendChild(i); + i.type = "button", i.className = "mjr-icon-btn mjr-mfv-pin-trigger", i.title = s("viewer.pinSlots", "Pin slots A/B/C/D"), i.setAttribute("aria-haspopup", "dialog"), i.setAttribute("aria-expanded", "false"), i.innerHTML = "", n.appendChild(i); let a = document.createElement("div"); a.className = "mjr-mfv-pin-popover", e.element.appendChild(a); let o = document.createElement("div"); @@ -1839,25 +2144,25 @@ function on(e) { i.className = "pi pi-map-marker mjr-menu-item-check", i.style.opacity = "0", n.appendChild(r), n.appendChild(i), o.appendChild(n), e._pinBtns[t] = n; } e._updatePinUI(), e._pinBtn = i, e._pinPopover = a; - let s = () => { + let c = () => { let t = i.getBoundingClientRect(), n = e.element.getBoundingClientRect(); a.style.left = `${t.left - n.left}px`, a.style.top = `${t.bottom - n.top + 4}px`, a.classList.add("is-open"), i.setAttribute("aria-expanded", "true"); }; e._closePinPopover = () => { a.classList.remove("is-open"), i.setAttribute("aria-expanded", "false"); }, i.addEventListener("click", (t) => { - t.stopPropagation(), a.classList.contains("is-open") ? e._closePinPopover() : (e._closeAllToolbarPopovers?.(), s()); + t.stopPropagation(), a.classList.contains("is-open") ? e._closePinPopover() : (e._closeAllToolbarPopovers?.(), c()); }); - let c = document.createElement("button"); - c.type = "button", c.className = "mjr-icon-btn mjr-mfv-guides-trigger", c.title = "Guides", c.setAttribute("aria-haspopup", "listbox"), c.setAttribute("aria-expanded", "false"); - let l = document.createElement("img"); - l.src = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKi0lEQVR4nO2d+28dxRXH58dSQIW2gIoqpP7YX4qqUtLS2A4xNIQCMQTHTlOgCZDEia/vtR3b+O3r2PEjNnbiujFuo6oFU6DQl1rRpqjlEWiiUlQU+Hu+1Vjfg45Wd2d87fXYjPZIR7u5dnbn7mfPzHnt2phccskll1xyySWXXHLJJZfIBcBXAbQAWADwCwBlALXbYFzfBHAQwAkARwDsBnC9iVn4Zf8L4BMA1wB8DOB/AD4CsALg9i0Y01cA9AG4COCXAJYBvADgAoBZADUmRgHQA+BTwrgC4C8A/gjg7wA+pP4NwK0Bx3QTL/pFWus8gLPUc7Riu603MQmA79AiPiEIe/f9HMAi1d6Z7wG4CuB8wHG1E8YSgNMARgAMAxiiTgCYAzAD4GsmFuEUYGH8qwKMn1EvAvg3gA8A3BFgTLfxRrCWMVYBxiCAAQCTBNJsYhEAl2khKykw7NRwHsAlAO/bxTXAmO4jkAUHjAF+bqewXhOLcPH+mBcgDcZ5rikWXluAMT3GBXzOAaOf/7ZWMmZiEeVNLTtgnAPwewDv2rk9wJj2cyqddcAQPQNg3MQiyrVddsCYB/AGgHcAlAIBucDpKA1GH3XcLvomFiGMj3hHpsGYB/A6gLcBFANNWdZapx0werm1HtioiUUI40MCSYMxB+B3AP4JoBBgTA0cy5QDhuioXWdMLEIY/6G/nwZjDsBrAN4KBGQfxzDhgPEct3bRHzSxCGFcpcubBuN5AK8C+AeAkwHG9AjPe8YBQ9ROaf0mFiGMKwSSBmMWwCuMRU4EGNNDPO+4A0YPtT+2OOQKo/BFB4xZAL9lbqslEJAZRulpMLq5Xf3cxCKE8T49rDQYMwBeBvAmgGMBxvQgXd5RBwxR+1m3iUUI4zKBpMGYAfASgL8GArKXEXjZAaOLavc7zXYTAN+m63pZpUMk6BPXVhZwmaYExrt0M9NgnAXwIrPBfwbwJwB/YPT+Ol3iVzmtrRDebwD8GsCvUuoZiyqFLueVc01yQR/xwDhlYSS2yf2kdtibitBv2SwYPSqFfm0dMN7hxUmDMc0LHBLGOKP0LGGI6mPcvRmVvk9VCn2FaesXqEtUuRCSr1pQet4DY5oqn01RJ6kTvIhyIce5IJ+mlpWOqAzuYIVIXFIisna4YHTyju9g/aSU0KJNhlILAFqVdqjj3ZkVjFtV2bVSccmVm3It4EkYUwrARAUAYwkAoykAXIlClzdVDYyiAlFQIE5ST1Bb+Hvd/N0vZAGkRZVdcxioCsZxaifPsXEr4QW/Ru8nh4GqYRxTVrInCyDLXMBt8SiHgaphHOPv2nM9nAWQMr0pG0HnMFA1jKM8hj1vXRZAapVba13LHAaqgnFMnfPrGwZCKCsE8h59/q2EMfw5gnGc57DnbMoEBoHczia2qwz4LiWCtzdUAPcag7hXEoHciyq+SIMxn4hlxBJ1cCeg5VhyHIE5quAJtAEFSeB0rRFGkZ/Lz9tT4hH5P7LfoW4CC+aGzIAQyi28OB9UiMDfZqXvLdYzLnHNeZPemaRDZjyWccERgS9VGYGLdUlwuJpCl0RhIgJ3WUZbSgSuVaxOJyQFui2EXZcpjASYO9iULAuVDCr5xbSZSzrkrGeaWiQMexEPAfgxz9UM4ACARjYn2Hr4oyzD7mOx6UdUm8V9wLqYAO5n/1U9gHsB7KLW8LhiIa5pSgPZxePcmzie/mw3j/8tAF8y21HU9DbtWTMWaRlNAcZ0j7IQ15pREMswsYhaa6Y9C/gCp6nGAGP6gcrMuhbwVpkFTCyisrZTHm/qHNeM/YGAyDTr8qaiBCIe2JTHtZ3nAr4/4JTV4XFtT8YIROoZk544Y47p/McCT1muOCNKIFJcmvAEfc/TtW0ICKTdE/SdEJfWxCIqQJzwpENm6WntCzCmnQkgaRF4i8QZJhZR0fq4Jx1ylp7WIwGBdHjSIS0xWojUwMc9ualpeloPBbYQV27quETfJhZR6ZAxT6Jwigt7SCAlT6IwSiCSmzrtydpOcGF/MLCFuLK2kj7vMbGIShSe9qTQzzBRuDcQkC5aiCuFflSytiYWUVnbUU89Y5wL+wMBxlSjgKTBeJbb6CxEUuhlT3FpjMHjnsAWkgZDdLUL3sQiqp5R9lT6Rjlt3R/YQtJgPKOmrKiASHFpxFN2LXPaui8wkDQYzygLiepxBKn0jXhq4CNc+OsDAelmYjENxtPcrpZ9TSyiyq7DnoaEIU5buwOMqVZZSBqMI9yPzkKkBj7k6Q4ZJLRdgYCIhaTBOML91c4VE4uohoQhT6vOAKHUbQGQSjAOxwpEukMGPX1Tffx5beA1JA3GYe6vPh5tYhHVqjPgaWLrpdYEspAeFqfSYPyU29VxmVhE9U31ezoKn6PuDDCmOmUhaTCeihWINLH1edo7e7h/T0ALKTpgPMX97QuEb2KrVw1qD/OZb2lS28smtR+qRjXpKOzz9Np2sRPENsTdTd2R2Bf9XgXVn3+fjQyyTepBNWWlwXhSWwjXnZ3c1hBqndqK2ua5uwDcvNkvjGxnXmq97Z29m/yAZdca2jtl26OApMF4UllIX0L7Ey68xFeDSofYdZl5X++XE2/vXFhn4/NaHrDsrNAErXU9jc+6cVo/qFlkpjcNxhNU/VCnaPLfSe1UcZU9541ZApH32i7xQn+eHgl41hNnuGD8hCp9xtJrLP3GTdQDqvf4cep+/j95m9DhLN/4LJZh80w5DKwJhjSFN/N62VniG1kAOcg1w3YV5jBQFYxHqW2cujdeeOMXXmZHSA4DVcNo4JjKmXT180ssqZdF5jBQFYwGjrWcSYssfeoLKlubw0BVMBp4PazHuSMLINfTvV1Q7yfMYWBNMPZxnKO8Vl/cMBBCqVFB32Tiub3ki1z0q/G61wGjrcKLXDSUlgpQjlaA8nQCShKMwHliDTCqBdTI47UThtXvZgJDQalPPOa8ngcsfTDaM4zA5cbQL7PsraCFNcCoFIEPKa9T3NqRxFuJJDDenHKC/ZMNHGgvA8Qsn3Yt8OchYfTxvK5p6uA6YAzzO1hLuc1sN1FQfGtGO38vRD1kN4G0eqakz4CYWETd9b4FvEQL2BkQSMGzPjSLZZhYRE1Z7R5vqp1AarYASNpi3STTlIlF1JRV8ri2pcBA+jkGl+ckQIZjnbJccUYpMJABjsHlxh6QxdtECKToCfpKBBKi66SeFtLqiSmiBtLmicBLdGFrA09Zrgi8UVxbEykQVzqkFNhCBhSQtHRIo8QZJkIgBU9uqkgLqQkMxJWbEiBlEyGQVk+isBRwyqpnfNHqSRQ+LhG4iUVUSqTVk7UtEUiIwHAXgRQ8WdtGSYeYWIQXu0sBSUuhdzAHdWeAMd1FIJ2eFPohAjllYhE2z3XxgrteGNlDC7kpwJhuVgW3Q456hqTQN/0dXsGE72uUDG4x5VWqpwijIeC4pCOkl/vJSp8Ul8rbMmu7EWEr6Gd/HEUFibJudPMCXBdwTDfw/JJGL/IGaVFl19EQTsaWiF0bGItUqmc0Zd5yubYx3cgqYqXiUn/mlb7tJvZPNhDMHs7RdZm98XkDYpvY+DbTZq4nOzKrgeeSSy655JJLLrnkkksuuZjtK/8HkUQ57PG6Io0AAAAASUVORK5CYII=", "" + import.meta.url).href, l.className = "mjr-mfv-guides-icon", l.alt = "", l.setAttribute("aria-hidden", "true"), c.appendChild(l), n.appendChild(c); - let u = document.createElement("div"); - u.className = "mjr-mfv-guides-popover", e.element.appendChild(u); + let l = document.createElement("button"); + l.type = "button", l.className = "mjr-icon-btn mjr-mfv-guides-trigger", l.title = "Guides", l.setAttribute("aria-haspopup", "listbox"), l.setAttribute("aria-expanded", "false"); + let u = document.createElement("img"); + u.src = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKi0lEQVR4nO2d+28dxRXH58dSQIW2gIoqpP7YX4qqUtLS2A4xNIQCMQTHTlOgCZDEia/vtR3b+O3r2PEjNnbiujFuo6oFU6DQl1rRpqjlEWiiUlQU+Hu+1Vjfg45Wd2d87fXYjPZIR7u5dnbn7mfPzHnt2phccskll1xyySWXXHLJJZfIBcBXAbQAWADwCwBlALXbYFzfBHAQwAkARwDsBnC9iVn4Zf8L4BMA1wB8DOB/AD4CsALg9i0Y01cA9AG4COCXAJYBvADgAoBZADUmRgHQA+BTwrgC4C8A/gjg7wA+pP4NwK0Bx3QTL/pFWus8gLPUc7Riu603MQmA79AiPiEIe/f9HMAi1d6Z7wG4CuB8wHG1E8YSgNMARgAMAxiiTgCYAzAD4GsmFuEUYGH8qwKMn1EvAvg3gA8A3BFgTLfxRrCWMVYBxiCAAQCTBNJsYhEAl2khKykw7NRwHsAlAO/bxTXAmO4jkAUHjAF+bqewXhOLcPH+mBcgDcZ5rikWXluAMT3GBXzOAaOf/7ZWMmZiEeVNLTtgnAPwewDv2rk9wJj2cyqddcAQPQNg3MQiyrVddsCYB/AGgHcAlAIBucDpKA1GH3XcLvomFiGMj3hHpsGYB/A6gLcBFANNWdZapx0werm1HtioiUUI40MCSYMxB+B3AP4JoBBgTA0cy5QDhuioXWdMLEIY/6G/nwZjDsBrAN4KBGQfxzDhgPEct3bRHzSxCGFcpcubBuN5AK8C+AeAkwHG9AjPe8YBQ9ROaf0mFiGMKwSSBmMWwCuMRU4EGNNDPO+4A0YPtT+2OOQKo/BFB4xZAL9lbqslEJAZRulpMLq5Xf3cxCKE8T49rDQYMwBeBvAmgGMBxvQgXd5RBwxR+1m3iUUI4zKBpMGYAfASgL8GArKXEXjZAaOLavc7zXYTAN+m63pZpUMk6BPXVhZwmaYExrt0M9NgnAXwIrPBfwbwJwB/YPT+Ol3iVzmtrRDebwD8GsCvUuoZiyqFLueVc01yQR/xwDhlYSS2yf2kdtibitBv2SwYPSqFfm0dMN7hxUmDMc0LHBLGOKP0LGGI6mPcvRmVvk9VCn2FaesXqEtUuRCSr1pQet4DY5oqn01RJ6kTvIhyIce5IJ+mlpWOqAzuYIVIXFIisna4YHTyju9g/aSU0KJNhlILAFqVdqjj3ZkVjFtV2bVSccmVm3It4EkYUwrARAUAYwkAoykAXIlClzdVDYyiAlFQIE5ST1Bb+Hvd/N0vZAGkRZVdcxioCsZxaifPsXEr4QW/Ru8nh4GqYRxTVrInCyDLXMBt8SiHgaphHOPv2nM9nAWQMr0pG0HnMFA1jKM8hj1vXRZAapVba13LHAaqgnFMnfPrGwZCKCsE8h59/q2EMfw5gnGc57DnbMoEBoHczia2qwz4LiWCtzdUAPcag7hXEoHciyq+SIMxn4hlxBJ1cCeg5VhyHIE5quAJtAEFSeB0rRFGkZ/Lz9tT4hH5P7LfoW4CC+aGzIAQyi28OB9UiMDfZqXvLdYzLnHNeZPemaRDZjyWccERgS9VGYGLdUlwuJpCl0RhIgJ3WUZbSgSuVaxOJyQFui2EXZcpjASYO9iULAuVDCr5xbSZSzrkrGeaWiQMexEPAfgxz9UM4ACARjYn2Hr4oyzD7mOx6UdUm8V9wLqYAO5n/1U9gHsB7KLW8LhiIa5pSgPZxePcmzie/mw3j/8tAF8y21HU9DbtWTMWaRlNAcZ0j7IQ15pREMswsYhaa6Y9C/gCp6nGAGP6gcrMuhbwVpkFTCyisrZTHm/qHNeM/YGAyDTr8qaiBCIe2JTHtZ3nAr4/4JTV4XFtT8YIROoZk544Y47p/McCT1muOCNKIFJcmvAEfc/TtW0ICKTdE/SdEJfWxCIqQJzwpENm6WntCzCmnQkgaRF4i8QZJhZR0fq4Jx1ylp7WIwGBdHjSIS0xWojUwMc9ualpeloPBbYQV27quETfJhZR6ZAxT6Jwigt7SCAlT6IwSiCSmzrtydpOcGF/MLCFuLK2kj7vMbGIShSe9qTQzzBRuDcQkC5aiCuFflSytiYWUVnbUU89Y5wL+wMBxlSjgKTBeJbb6CxEUuhlT3FpjMHjnsAWkgZDdLUL3sQiqp5R9lT6Rjlt3R/YQtJgPKOmrKiASHFpxFN2LXPaui8wkDQYzygLiepxBKn0jXhq4CNc+OsDAelmYjENxtPcrpZ9TSyiyq7DnoaEIU5buwOMqVZZSBqMI9yPzkKkBj7k6Q4ZJLRdgYCIhaTBOML91c4VE4uohoQhT6vOAKHUbQGQSjAOxwpEukMGPX1Tffx5beA1JA3GYe6vPh5tYhHVqjPgaWLrpdYEspAeFqfSYPyU29VxmVhE9U31ezoKn6PuDDCmOmUhaTCeihWINLH1edo7e7h/T0ALKTpgPMX97QuEb2KrVw1qD/OZb2lS28smtR+qRjXpKOzz9Np2sRPENsTdTd2R2Bf9XgXVn3+fjQyyTepBNWWlwXhSWwjXnZ3c1hBqndqK2ua5uwDcvNkvjGxnXmq97Z29m/yAZdca2jtl26OApMF4UllIX0L7Ey68xFeDSofYdZl5X++XE2/vXFhn4/NaHrDsrNAErXU9jc+6cVo/qFlkpjcNxhNU/VCnaPLfSe1UcZU9541ZApH32i7xQn+eHgl41hNnuGD8hCp9xtJrLP3GTdQDqvf4cep+/j95m9DhLN/4LJZh80w5DKwJhjSFN/N62VniG1kAOcg1w3YV5jBQFYxHqW2cujdeeOMXXmZHSA4DVcNo4JjKmXT180ssqZdF5jBQFYwGjrWcSYssfeoLKlubw0BVMBp4PazHuSMLINfTvV1Q7yfMYWBNMPZxnKO8Vl/cMBBCqVFB32Tiub3ki1z0q/G61wGjrcKLXDSUlgpQjlaA8nQCShKMwHliDTCqBdTI47UThtXvZgJDQalPPOa8ngcsfTDaM4zA5cbQL7PsraCFNcCoFIEPKa9T3NqRxFuJJDDenHKC/ZMNHGgvA8Qsn3Yt8OchYfTxvK5p6uA6YAzzO1hLuc1sN1FQfGtGO38vRD1kN4G0eqakz4CYWETd9b4FvEQL2BkQSMGzPjSLZZhYRE1Z7R5vqp1AarYASNpi3STTlIlF1JRV8ri2pcBA+jkGl+ckQIZjnbJccUYpMJABjsHlxh6QxdtECKToCfpKBBKi66SeFtLqiSmiBtLmicBLdGFrA09Zrgi8UVxbEykQVzqkFNhCBhSQtHRIo8QZJkIgBU9uqkgLqQkMxJWbEiBlEyGQVk+isBRwyqpnfNHqSRQ+LhG4iUVUSqTVk7UtEUiIwHAXgRQ8WdtGSYeYWIQXu0sBSUuhdzAHdWeAMd1FIJ2eFPohAjllYhE2z3XxgrteGNlDC7kpwJhuVgW3Q456hqTQN/0dXsGE72uUDG4x5VWqpwijIeC4pCOkl/vJSp8Ul8rbMmu7EWEr6Gd/HEUFibJudPMCXBdwTDfw/JJGL/IGaVFl19EQTsaWiF0bGItUqmc0Zd5yubYx3cgqYqXiUn/mlb7tJvZPNhDMHs7RdZm98XkDYpvY+DbTZq4nOzKrgeeSSy655JJLLrnkkksuuZjtK/8HkUQ57PG6Io0AAAAASUVORK5CYII=", "" + import.meta.url).href, u.className = "mjr-mfv-guides-icon", u.alt = "", u.setAttribute("aria-hidden", "true"), l.appendChild(u), n.appendChild(l); let d = document.createElement("div"); - d.className = "mjr-menu", d.style.cssText = "display:grid;gap:4px;", u.appendChild(d); + d.className = "mjr-mfv-guides-popover", e.element.appendChild(d); + let f = document.createElement("div"); + f.className = "mjr-menu", f.style.cssText = "display:grid;gap:4px;", d.appendChild(f); let p = document.createElement("select"); - p.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", u.appendChild(p); + p.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", d.appendChild(p); let m = [ { value: "0", @@ -1884,25 +2189,25 @@ function on(e) { let r = document.createElement("span"); r.className = "mjr-menu-item-label", r.textContent = e.label; let i = document.createElement("i"); - i.className = "pi pi-check mjr-menu-item-check", i.style.opacity = e.value === h ? "1" : "0", n.appendChild(r), n.appendChild(i), d.appendChild(n), g.push(n), e.value === h && n.classList.add("is-active"); + i.className = "pi pi-check mjr-menu-item-check", i.style.opacity = e.value === h ? "1" : "0", n.appendChild(r), n.appendChild(i), f.appendChild(n), g.push(n), e.value === h && n.classList.add("is-active"); } - p.value = h, c.classList.toggle("is-on", h !== "0"), e._guidesSelect = p, e._guideBtn = c, e._guidePopover = u; + p.value = h, l.classList.toggle("is-on", h !== "0"), e._guidesSelect = p, e._guideBtn = l, e._guidePopover = d; let _ = () => { - let t = c.getBoundingClientRect(), n = e.element.getBoundingClientRect(); - u.style.left = `${t.left - n.left}px`, u.style.top = `${t.bottom - n.top + 4}px`, u.classList.add("is-open"), c.setAttribute("aria-expanded", "true"); + let t = l.getBoundingClientRect(), n = e.element.getBoundingClientRect(); + d.style.left = `${t.left - n.left}px`, d.style.top = `${t.bottom - n.top + 4}px`, d.classList.add("is-open"), l.setAttribute("aria-expanded", "true"); }; e._closeGuidePopover = () => { - u.classList.remove("is-open"), c.setAttribute("aria-expanded", "false"); - }, c.addEventListener("click", (t) => { - t.stopPropagation(), u.classList.contains("is-open") ? e._closeGuidePopover() : (e._closeAllToolbarPopovers?.(), _()); - }), d.addEventListener("click", (t) => { + d.classList.remove("is-open"), l.setAttribute("aria-expanded", "false"); + }, l.addEventListener("click", (t) => { + t.stopPropagation(), d.classList.contains("is-open") ? e._closeGuidePopover() : (e._closeAllToolbarPopovers?.(), _()); + }), f.addEventListener("click", (t) => { let n = t.target.closest(".mjr-menu-item"); if (!n) return; let r = n.dataset.value; p.value = r ?? "", p.dispatchEvent(new Event("change", { bubbles: !0 })), g.forEach((e) => { let t = e.dataset.value === r; e.classList.toggle("is-active", t), e.querySelector(".mjr-menu-item-check").style.opacity = t ? "1" : "0"; - }), c.classList.toggle("is-on", r !== "0"), e._closeGuidePopover(); + }), l.classList.toggle("is-on", r !== "0"), e._closeGuidePopover(); }); let v = String(e._channel || "rgb"), y = document.createElement("button"); y.type = "button", y.className = "mjr-icon-btn mjr-mfv-ch-trigger", y.title = "Channel", y.setAttribute("aria-haspopup", "listbox"), y.setAttribute("aria-expanded", "false"); @@ -1911,16 +2216,16 @@ function on(e) { let x = (e) => { if (!e || e === "rgb") y.replaceChildren(b); else { - let t = en[e] || "#e0e0e0", n = nn[e] || "500", r = tn[e] || e.toUpperCase(), i = document.createElement("span"); + let t = sn[e] || "#e0e0e0", n = ln[e] || "500", r = cn[e] || e.toUpperCase(), i = document.createElement("span"); i.className = "mjr-mfv-ch-label", i.style.color = t, i.style.fontWeight = n, i.textContent = r, y.replaceChildren(i); } }, S = document.createElement("div"); S.className = "mjr-mfv-ch-popover", e.element.appendChild(S); - let w = document.createElement("div"); - w.className = "mjr-menu", w.style.cssText = "display:grid;gap:4px;", S.appendChild(w); - let T = document.createElement("select"); - T.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", S.appendChild(T); - let E = [ + let C = document.createElement("div"); + C.className = "mjr-menu", C.style.cssText = "display:grid;gap:4px;", S.appendChild(C); + let w = document.createElement("select"); + w.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", S.appendChild(w); + let ee = [ { value: "rgb", color: "#e0e0e0", @@ -1957,10 +2262,10 @@ function on(e) { weight: "400", label: "L" } - ], ee = []; - for (let e of E) { + ], T = []; + for (let e of ee) { let t = document.createElement("option"); - t.value = e.value, T.appendChild(t); + t.value = e.value, w.appendChild(t); let n = document.createElement("button"); n.type = "button", n.className = "mjr-menu-item", n.dataset.value = e.value; let r = document.createElement("span"); @@ -1968,22 +2273,22 @@ function on(e) { let i = document.createElement("span"); i.textContent = e.label, i.style.color = e.color, i.style.fontWeight = e.weight, r.appendChild(i); let a = document.createElement("i"); - a.className = "pi pi-check mjr-menu-item-check", a.style.opacity = e.value === v ? "1" : "0", n.appendChild(r), n.appendChild(a), w.appendChild(n), ee.push(n), e.value === v && n.classList.add("is-active"); + a.className = "pi pi-check mjr-menu-item-check", a.style.opacity = e.value === v ? "1" : "0", n.appendChild(r), n.appendChild(a), C.appendChild(n), T.push(n), e.value === v && n.classList.add("is-active"); } - T.value = v, x(v), y.classList.toggle("is-on", v !== "rgb"), e._channelSelect = T, e._chBtn = y, e._chPopover = S; - let D = () => { + w.value = v, x(v), y.classList.toggle("is-on", v !== "rgb"), e._channelSelect = w, e._chBtn = y, e._chPopover = S; + let E = () => { let t = y.getBoundingClientRect(), n = e.element.getBoundingClientRect(); S.style.left = `${t.left - n.left}px`, S.style.top = `${t.bottom - n.top + 4}px`, S.classList.add("is-open"), y.setAttribute("aria-expanded", "true"); }; e._closeChPopover = () => { S.classList.remove("is-open"), y.setAttribute("aria-expanded", "false"); }, y.addEventListener("click", (t) => { - t.stopPropagation(), S.classList.contains("is-open") ? e._closeChPopover() : (e._closeAllToolbarPopovers?.(), D()); - }), w.addEventListener("click", (t) => { + t.stopPropagation(), S.classList.contains("is-open") ? e._closeChPopover() : (e._closeAllToolbarPopovers?.(), E()); + }), C.addEventListener("click", (t) => { let n = t.target.closest(".mjr-menu-item"); if (!n) return; let r = n.dataset.value; - T.value = r ?? "", T.dispatchEvent(new Event("change", { bubbles: !0 })), ee.forEach((e) => { + w.value = r ?? "", w.dispatchEvent(new Event("change", { bubbles: !0 })), T.forEach((e) => { let t = e.dataset.value === r; e.classList.toggle("is-active", t), e.querySelector(".mjr-menu-item-check").style.opacity = t ? "1" : "0"; }), x(r), y.classList.toggle("is-on", r !== "rgb"), e._closeChPopover(); @@ -1995,13 +2300,13 @@ function on(e) { step: .1, value: Number(e._exposureEV || 0) }), e._exposureCtl.out.textContent = `${Number(e._exposureEV || 0).toFixed(1)}EV`, e._exposureCtl.out.title = "Click to reset to 0 EV", e._exposureCtl.out.style.cursor = "pointer", e._exposureCtl.wrap.classList.toggle("is-active", (e._exposureEV || 0) !== 0), n.appendChild(e._exposureCtl.wrap), e._formatToggle = document.createElement("button"), e._formatToggle.type = "button", e._formatToggle.className = "mjr-icon-btn mjr-mfv-format-trigger", e._formatToggle.setAttribute("aria-haspopup", "dialog"), e._formatToggle.setAttribute("aria-expanded", "false"), e._formatToggle.setAttribute("aria-pressed", "false"), e._formatToggle.title = "Format mask", e._formatToggle.innerHTML = "", n.appendChild(e._formatToggle); + let D = document.createElement("div"); + D.className = "mjr-mfv-format-popover", e.element.appendChild(D); let O = document.createElement("div"); - O.className = "mjr-mfv-format-popover", e.element.appendChild(O); - let k = document.createElement("div"); - k.className = "mjr-menu", k.style.cssText = "display:grid;gap:4px;", O.appendChild(k); - let A = document.createElement("select"); - A.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", O.appendChild(A); - let j = [ + O.className = "mjr-menu", O.style.cssText = "display:grid;gap:4px;", D.appendChild(O); + let k = document.createElement("select"); + k.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", D.appendChild(k); + let A = [ { value: "off", label: "Off" @@ -2030,73 +2335,73 @@ function on(e) { value: "2.39", label: "2.39" } - ], M = [], N = e._overlayMaskEnabled ? String(e._overlayFormat || "image") : "off"; - for (let e of j) { + ], j = [], M = e._overlayMaskEnabled ? String(e._overlayFormat || "image") : "off"; + for (let e of A) { let t = document.createElement("option"); - t.value = e.value, A.appendChild(t); + t.value = e.value, k.appendChild(t); let n = document.createElement("button"); n.type = "button", n.className = "mjr-menu-item", n.dataset.value = e.value; let r = document.createElement("span"); r.className = "mjr-menu-item-label", r.textContent = e.label; let i = document.createElement("i"); - i.className = "pi pi-check mjr-menu-item-check", i.style.opacity = e.value === N ? "1" : "0", n.appendChild(r), n.appendChild(i), k.appendChild(n), M.push(n), e.value === N && n.classList.add("is-active"); + i.className = "pi pi-check mjr-menu-item-check", i.style.opacity = e.value === M ? "1" : "0", n.appendChild(r), n.appendChild(i), O.appendChild(n), j.push(n), e.value === M && n.classList.add("is-active"); } - A.value = N; + k.value = M; + let N = document.createElement("div"); + N.className = "mjr-mfv-format-sep", D.appendChild(N); let P = document.createElement("div"); - P.className = "mjr-mfv-format-sep", O.appendChild(P); - let F = document.createElement("div"); - F.className = "mjr-mfv-format-slider-row", O.appendChild(F); - let I = document.createElement("span"); - I.className = "mjr-mfv-format-slider-label", I.textContent = "Opacity", F.appendChild(I), e._maskOpacityCtl = t("Mask opacity", { + P.className = "mjr-mfv-format-slider-row", D.appendChild(P); + let F = document.createElement("span"); + F.className = "mjr-mfv-format-slider-label", F.textContent = "Opacity", P.appendChild(F), e._maskOpacityCtl = t("Mask opacity", { min: 0, max: .9, step: .01, value: Number(e._overlayMaskOpacity ?? .65) - }), F.appendChild(e._maskOpacityCtl.input), F.appendChild(e._maskOpacityCtl.out), e._formatSelect = A, e._formatPopover = O; - let L = () => { + }), P.appendChild(e._maskOpacityCtl.input), P.appendChild(e._maskOpacityCtl.out), e._formatSelect = k, e._formatPopover = D; + let I = () => { let t = e._formatToggle.getBoundingClientRect(), n = e.element.getBoundingClientRect(); - O.style.left = `${t.left - n.left}px`, O.style.top = `${t.bottom - n.top + 4}px`, O.classList.add("is-open"), e._formatToggle.setAttribute("aria-expanded", "true"); + D.style.left = `${t.left - n.left}px`, D.style.top = `${t.bottom - n.top + 4}px`, D.classList.add("is-open"), e._formatToggle.setAttribute("aria-expanded", "true"); }; e._closeFormatPopover = () => { - O.classList.remove("is-open"), e._formatToggle.setAttribute("aria-expanded", "false"); + D.classList.remove("is-open"), e._formatToggle.setAttribute("aria-expanded", "false"); }, e._formatToggle.addEventListener("click", (t) => { - t.stopPropagation(), O.classList.contains("is-open") ? e._closeFormatPopover() : (e._closeAllToolbarPopovers?.(), L()); - }), k.addEventListener("click", (t) => { + t.stopPropagation(), D.classList.contains("is-open") ? e._closeFormatPopover() : (e._closeAllToolbarPopovers?.(), I()); + }), O.addEventListener("click", (t) => { let n = t.target.closest(".mjr-menu-item"); if (!n) return; let r = n.dataset.value; - A.value = r ?? "", A.dispatchEvent(new Event("change", { bubbles: !0 })), M.forEach((e) => { + k.value = r ?? "", k.dispatchEvent(new Event("change", { bubbles: !0 })), j.forEach((e) => { let t = e.dataset.value === r; e.classList.toggle("is-active", t), e.querySelector(".mjr-menu-item-check").style.opacity = t ? "1" : "0"; }), e._closeFormatPopover(); }); - let te = document.createElement("div"); - te.className = "mjr-mfv-toolbar-sep", te.setAttribute("aria-hidden", "true"), n.appendChild(te), e._liveBtn = document.createElement("button"), e._liveBtn.type = "button", e._liveBtn.className = "mjr-icon-btn", e._liveBtn.innerHTML = "", e._liveBtn.setAttribute("aria-pressed", "false"), C(e._liveBtn, f("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L"), n.appendChild(e._liveBtn), e._previewBtn = document.createElement("button"), e._previewBtn.type = "button", e._previewBtn.className = "mjr-icon-btn", e._previewBtn.innerHTML = "", e._previewBtn.setAttribute("aria-pressed", "false"), C(e._previewBtn, f("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K"), n.appendChild(e._previewBtn), e._nodeStreamBtn = document.createElement("button"), e._nodeStreamBtn.type = "button", e._nodeStreamBtn.className = "mjr-icon-btn", e._nodeStreamBtn.innerHTML = "", e._nodeStreamBtn.setAttribute("aria-pressed", "false"), C(e._nodeStreamBtn, f("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N"), n.appendChild(e._nodeStreamBtn), e._genBtn = document.createElement("button"), e._genBtn.type = "button", e._genBtn.className = "mjr-icon-btn", e._genBtn.setAttribute("aria-pressed", String(!!e._genSidebarEnabled)); + let L = document.createElement("div"); + L.className = "mjr-mfv-toolbar-sep", L.setAttribute("aria-hidden", "true"), n.appendChild(L), e._liveBtn = document.createElement("button"), e._liveBtn.type = "button", e._liveBtn.className = "mjr-icon-btn", e._liveBtn.innerHTML = "", e._liveBtn.setAttribute("aria-pressed", "false"), V(e._liveBtn, s("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L"), n.appendChild(e._liveBtn), e._previewBtn = document.createElement("button"), e._previewBtn.type = "button", e._previewBtn.className = "mjr-icon-btn", e._previewBtn.innerHTML = "", e._previewBtn.setAttribute("aria-pressed", "false"), V(e._previewBtn, s("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K"), n.appendChild(e._previewBtn), e._nodeStreamBtn = document.createElement("button"), e._nodeStreamBtn.type = "button", e._nodeStreamBtn.className = "mjr-icon-btn", e._nodeStreamBtn.innerHTML = "", e._nodeStreamBtn.setAttribute("aria-pressed", "false"), V(e._nodeStreamBtn, s("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N"), n.appendChild(e._nodeStreamBtn), e._genBtn = document.createElement("button"), e._genBtn.type = "button", e._genBtn.className = "mjr-icon-btn", e._genBtn.setAttribute("aria-pressed", String(!!e._genSidebarEnabled)); let R = document.createElement("i"); R.className = "pi pi-info-circle", R.setAttribute("aria-hidden", "true"), e._genBtn.appendChild(R), n.appendChild(e._genBtn), e._updateGenBtnUI(), e._popoutBtn = document.createElement("button"), e._popoutBtn.type = "button", e._popoutBtn.className = "mjr-icon-btn"; - let z = f("tooltip.popOutViewer", "Pop out viewer to separate window"); + let z = s("tooltip.popOutViewer", "Pop out viewer to separate window"); e._popoutBtn.title = z, e._popoutBtn.setAttribute("aria-label", z), e._popoutBtn.setAttribute("aria-pressed", "false"); + let B = document.createElement("i"); + B.className = "pi pi-external-link", B.setAttribute("aria-hidden", "true"), e._popoutBtn.appendChild(B), n.appendChild(e._popoutBtn), e._captureBtn = document.createElement("button"), e._captureBtn.type = "button", e._captureBtn.className = "mjr-icon-btn"; + let te = s("tooltip.captureView", "Save view as image"); + e._captureBtn.title = te, e._captureBtn.setAttribute("aria-label", te); let ne = document.createElement("i"); - ne.className = "pi pi-external-link", ne.setAttribute("aria-hidden", "true"), e._popoutBtn.appendChild(ne), n.appendChild(e._popoutBtn), e._captureBtn = document.createElement("button"), e._captureBtn.type = "button", e._captureBtn.className = "mjr-icon-btn"; - let B = f("tooltip.captureView", "Save view as image"); - e._captureBtn.title = B, e._captureBtn.setAttribute("aria-label", B); - let re = document.createElement("i"); - re.className = "pi pi-download", re.setAttribute("aria-hidden", "true"), e._captureBtn.appendChild(re), n.appendChild(e._captureBtn); - let V = document.createElement("div"); - V.className = "mjr-mfv-toolbar-sep", V.style.marginLeft = "auto", V.setAttribute("aria-hidden", "true"), n.appendChild(V), e._settingsBtn = document.createElement("button"), e._settingsBtn.type = "button", e._settingsBtn.className = "mjr-icon-btn mjr-mfv-settings-btn"; - let ie = f("tooltip.nodeParams", "Node Parameters"); - e._settingsBtn.title = ie, e._settingsBtn.setAttribute("aria-label", ie), e._settingsBtn.setAttribute("aria-pressed", "false"); - let H = document.createElement("i"); - H.className = "pi pi-sliders-h", H.setAttribute("aria-hidden", "true"), e._settingsBtn.appendChild(H), n.appendChild(e._settingsBtn), e._runHandle = Wt(), n.appendChild(e._runHandle.el), e._majoorSettingsBtn = document.createElement("button"), e._majoorSettingsBtn.type = "button", e._majoorSettingsBtn.className = "mjr-icon-btn mjr-mfv-majoor-settings-btn"; - let U = f("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings"); + ne.className = "pi pi-download", ne.setAttribute("aria-hidden", "true"), e._captureBtn.appendChild(ne), n.appendChild(e._captureBtn); + let H = document.createElement("div"); + H.className = "mjr-mfv-toolbar-sep", H.style.marginLeft = "auto", H.setAttribute("aria-hidden", "true"), n.appendChild(H), e._settingsBtn = document.createElement("button"), e._settingsBtn.type = "button", e._settingsBtn.className = "mjr-icon-btn mjr-mfv-settings-btn"; + let re = s("tooltip.nodeParams", "Node Parameters"); + e._settingsBtn.title = re, e._settingsBtn.setAttribute("aria-label", re), e._settingsBtn.setAttribute("aria-pressed", "false"); + let ie = document.createElement("i"); + ie.className = "pi pi-sliders-h", ie.setAttribute("aria-hidden", "true"), e._settingsBtn.appendChild(ie), n.appendChild(e._settingsBtn), e._runHandle = Xt(), n.appendChild(e._runHandle.el), e._majoorSettingsBtn = document.createElement("button"), e._majoorSettingsBtn.type = "button", e._majoorSettingsBtn.className = "mjr-icon-btn mjr-mfv-majoor-settings-btn"; + let U = s("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings"); e._majoorSettingsBtn.title = U, e._majoorSettingsBtn.setAttribute("aria-label", U); - let W = document.createElement("i"); - return W.className = "pi pi-cog", W.setAttribute("aria-hidden", "true"), e._majoorSettingsBtn.appendChild(W), n.appendChild(e._majoorSettingsBtn), e._handleDocClick = (t) => { + let ae = document.createElement("i"); + return ae.className = "pi pi-cog", ae.setAttribute("aria-hidden", "true"), e._majoorSettingsBtn.appendChild(ae), n.appendChild(e._majoorSettingsBtn), e._handleDocClick = (t) => { let n = t?.target; e._chPopover?.classList?.contains("is-open") && !e._chBtn?.contains?.(n) && !e._chPopover.contains(n) && e._closeChPopover?.(), e._guidePopover?.classList?.contains("is-open") && !e._guideBtn?.contains?.(n) && !e._guidePopover.contains(n) && e._closeGuidePopover?.(), e._pinPopover?.classList?.contains("is-open") && !e._pinBtn?.contains?.(n) && !e._pinPopover.contains(n) && e._closePinPopover?.(), e._formatPopover?.classList?.contains("is-open") && !e._formatToggle?.contains?.(n) && !e._formatPopover.contains(n) && e._closeFormatPopover?.(), n?.closest?.(".mjr-mfv-idrop") || e.element?.querySelectorAll?.(".mjr-mfv-idrop-menu.is-open").forEach((e) => e.classList.remove("is-open")); }, e._bindDocumentUiHandlers(), n; } -function sn(e) { +function pn(e) { try { e._btnAC?.abort(); } catch (e) { @@ -2105,7 +2410,7 @@ function sn(e) { e._btnAC = new AbortController(); let t = e._btnAC.signal; e._closeBtn?.addEventListener("click", () => { - e._dispatchControllerAction("close", m.MFV_CLOSE); + e._dispatchControllerAction("close", k.MFV_CLOSE); }, { signal: t }), e._modeSelect?.addEventListener("change", () => { let t = e._modeSelect?.value; t && e.setMode(t); @@ -2113,21 +2418,21 @@ function sn(e) { let n = t.target?.closest?.(".mjr-mfv-pin-btn"); if (!n) return; let r = n.dataset.slot; - r && (e._pinnedSlots.has(r) ? e._pinnedSlots.delete(r) : e._pinnedSlots.add(r), e._pinnedSlots.has("C") || e._pinnedSlots.has("D") ? e._mode !== G.GRID && e.setMode(G.GRID) : e._pinnedSlots.size > 0 && e._mode === G.SIMPLE && e.setMode(G.AB), e._updatePinUI()); + r && (e._pinnedSlots.has(r) ? e._pinnedSlots.delete(r) : e._pinnedSlots.add(r), e._pinnedSlots.has("C") || e._pinnedSlots.has("D") ? e._mode !== W.GRID && e.setMode(W.GRID) : e._pinnedSlots.size > 0 && e._mode === W.SIMPLE && e.setMode(W.AB), e._updatePinUI()); }, { signal: t }), e._liveBtn?.addEventListener("click", () => { - e._dispatchControllerAction("toggleLive", m.MFV_LIVE_TOGGLE); + e._dispatchControllerAction("toggleLive", k.MFV_LIVE_TOGGLE); }, { signal: t }), e._previewBtn?.addEventListener("click", () => { - e._dispatchControllerAction("togglePreview", m.MFV_PREVIEW_TOGGLE); + e._dispatchControllerAction("togglePreview", k.MFV_PREVIEW_TOGGLE); }, { signal: t }), e._nodeStreamBtn?.addEventListener("click", () => { - e._dispatchControllerAction("toggleNodeStream", m.MFV_NODESTREAM_TOGGLE); + e._dispatchControllerAction("toggleNodeStream", k.MFV_NODESTREAM_TOGGLE); }, { signal: t }), e._genBtn?.addEventListener("click", (t) => { t.stopPropagation(), e._closeAllToolbarPopovers?.(), e._genSidebarEnabled = !e._genSidebarEnabled, e._updateGenBtnUI(), e._refresh(); }, { signal: t }), e._popoutBtn?.addEventListener("click", () => { - e._dispatchControllerAction("popOut", m.MFV_POPOUT); + e._dispatchControllerAction("popOut", k.MFV_POPOUT); }, { signal: t }), e._captureBtn?.addEventListener("click", () => e._captureView(), { signal: t }), e._settingsBtn?.addEventListener("click", () => { e._sidebar?.toggle(), e._updateSettingsBtnState(e._sidebar?.isVisible ?? !1); }, { signal: t }), e._majoorSettingsBtn?.addEventListener("click", (t) => { - t.stopPropagation(), e._closeAllToolbarPopovers?.(), ie(); + t.stopPropagation(), e._closeAllToolbarPopovers?.(), re(); }, { signal: t }), e._guidesSelect?.addEventListener("change", () => { e._gridMode = Number(e._guidesSelect.value) || 0, e._guideBtn?.classList.toggle("is-on", e._gridMode !== 0), e._redrawOverlayGuides?.(); }, { signal: t }), e._channelSelect?.addEventListener("change", () => { @@ -2145,15 +2450,15 @@ function sn(e) { e._overlayMaskOpacity = Math.round(Math.max(0, Math.min(.9, Number.isFinite(t) ? t : .65)) * 100) / 100, e._maskOpacityCtl.out.textContent = e._overlayMaskOpacity.toFixed(2), e._redrawOverlayGuides?.(); }, { signal: t }); } -function cn(e, t) { +function mn(e, t) { e._settingsBtn && (e._settingsBtn.classList.toggle("active", !!t), e._settingsBtn.setAttribute("aria-pressed", String(!!t))); } -function ln(e) { +function hn(e) { if (!e._contentWrapper) return; let t = p.MFV_SIDEBAR_POSITION || "right"; e._contentWrapper.setAttribute("data-sidebar-pos", t), e._sidebar?.el && e._contentEl && (t === "left" ? e._contentWrapper.insertBefore(e._sidebar.el, e._contentEl) : e._contentWrapper.appendChild(e._sidebar.el)); } -function un(e) { +function gn(e) { if (!e._handleDocClick) return; let t = e.element?.ownerDocument || document; if (e._docClickHost !== t) { @@ -2166,7 +2471,7 @@ function un(e) { e._docAC = new AbortController(), t.addEventListener("click", e._handleDocClick, { signal: e._docAC.signal }), e._docClickHost = t; } } -function dn(e) { +function _n(e) { try { e._docAC?.abort(); } catch (e) { @@ -2174,18 +2479,18 @@ function dn(e) { } e._docAC = new AbortController(), e._docClickHost = null; } -function fn(e) { +function vn(e) { if (!e._genBtn) return; let t = !!e._genSidebarEnabled; e._genBtn.classList.toggle("is-on", t), e._genBtn.classList.toggle("is-open", t); let n = t ? "Gen Info sidebar: ON" : "Gen Info sidebar: OFF"; e._genBtn.title = n, e._genBtn.setAttribute("aria-label", n), e._genBtn.setAttribute("aria-pressed", String(t)), e._genBtn.removeAttribute("aria-expanded"), e._genBtn.removeAttribute("aria-haspopup"), e._genBtn.removeAttribute("aria-controls"); } -function pn(e) { +function yn(e) { let t = Number(e); return !Number.isFinite(t) || t <= 0 ? "" : t >= 60 ? `${(t / 60).toFixed(1)}m` : `${t.toFixed(1)}s`; } -function mn(e) { +function bn(e) { let t = String(e || "").trim().toLowerCase(); if (!t) return 0; if (t.endsWith("m")) { @@ -2199,10 +2504,10 @@ function mn(e) { let n = Number.parseFloat(t); return Number.isFinite(n) ? n : 0; } -function hn(e, t) { +function xn(e, t) { if (!t) return {}; try { - let e = t.geninfo ? { geninfo: t.geninfo } : t.metadata || t.metadata_raw || t, n = se(e) || null, r = { + let e = t.geninfo ? { geninfo: t.geninfo } : t.metadata || t.metadata_raw || t, n = C(e) || null, r = { prompt: "", seed: "", model: "", @@ -2214,17 +2519,17 @@ function hn(e, t) { genTime: "" }; if (n && typeof n == "object") { - n.prompt && (r.prompt = ce(String(n.prompt))), n.seed != null && (r.seed = String(n.seed)), n.model && (r.model = Array.isArray(n.model) ? n.model.join(", ") : String(n.model)); - let i = Qt(n), a = Zt(n); - a && (r.model = a), i && (r.model = [i, r.model].filter(Boolean).join(" | ")), Array.isArray(n.loras) && (r.lora = n.loras.map((e) => typeof e == "string" ? e : e?.name || e?.lora_name || e?.model_name || "").filter(Boolean).join(", ")), n.sampler && (r.sampler = String(n.sampler)), n.scheduler && (r.scheduler = String(n.scheduler)), n.cfg != null && (r.cfg = String(n.cfg)), n.steps != null && (r.step = String(n.steps)), !r.prompt && e?.prompt && (r.prompt = ce(String(e.prompt || ""))); + n.prompt && (r.prompt = D(String(n.prompt))), n.seed != null && (r.seed = String(n.seed)), n.model && (r.model = Array.isArray(n.model) ? n.model.join(", ") : String(n.model)); + let i = an(n), a = rn(n); + a && (r.model = a), i && (r.model = [i, r.model].filter(Boolean).join(" | ")), Array.isArray(n.loras) && (r.lora = n.loras.map((e) => typeof e == "string" ? e : e?.name || e?.lora_name || e?.model_name || "").filter(Boolean).join(", ")), n.sampler && (r.sampler = String(n.sampler)), n.scheduler && (r.scheduler = String(n.scheduler)), n.cfg != null && (r.cfg = String(n.cfg)), n.steps != null && (r.step = String(n.steps)), !r.prompt && e?.prompt && (r.prompt = D(String(e.prompt || ""))); let o = t.generation_time_ms ?? t.metadata_raw?.generation_time_ms ?? e?.generation_time_ms ?? e?.geninfo?.generation_time_ms ?? 0; - return o && Number.isFinite(Number(o)) && o > 0 && o < 864e5 && (r.genTime = pn(Number(o) / 1e3)), r; + return o && Number.isFinite(Number(o)) && o > 0 && o < 864e5 && (r.genTime = yn(Number(o) / 1e3)), r; } } catch (e) { console.debug?.("[MFV] geninfo normalize failed", e); } let n = t?.metadata || t?.metadata_raw || t || {}, r = { - prompt: ce(String(n?.prompt || n?.positive || "")), + prompt: D(String(n?.prompt || n?.positive || "")), seed: n?.seed == null ? "" : String(n.seed), model: n?.checkpoint || n?.ckpt_name || n?.model || "", lora: Array.isArray(n?.loras) ? n.loras.join(", ") : n?.lora || "", @@ -2234,9 +2539,9 @@ function hn(e, t) { step: n?.steps == null ? "" : String(n.steps), genTime: "" }, i = t.generation_time_ms ?? t.metadata_raw?.generation_time_ms ?? n?.generation_time_ms ?? 0; - return i && Number.isFinite(Number(i)) && i > 0 && i < 864e5 && (r.genTime = pn(Number(i) / 1e3)), r; + return i && Number.isFinite(Number(i)) && i > 0 && i < 864e5 && (r.genTime = yn(Number(i) / 1e3)), r; } -function gn(e, t) { +function Sn(e, t) { let n = e._getGenFields(t); if (!n) return null; let r = document.createDocumentFragment(); @@ -2261,7 +2566,7 @@ function gn(e, t) { let s = document.createElement("strong"); if (s.textContent = `${a}: `, o.appendChild(s), t === "prompt") o.appendChild(document.createTextNode(i)); else if (t === "genTime") { - let e = mn(i), t = "#4CAF50"; + let e = bn(i), t = "#4CAF50"; e >= 60 ? t = "#FF9800" : e >= 30 ? t = "#FFC107" : e >= 10 && (t = "#8BC34A"); let n = document.createElement("span"); n.style.color = t, n.style.fontWeight = "600", n.textContent = i, o.appendChild(n); @@ -2271,30 +2576,30 @@ function gn(e, t) { return r.childNodes.length > 0 ? r : null; } // ui/features/viewer/floatingViewerMode.ts -function _n(e) { +function Cn(e) { try { e._controller?.onModeChanged?.(e._mode); } catch (e) { console.debug?.(e); } } -function vn(e) { +function wn(e) { let t = [ - G.SIMPLE, - G.AB, - G.SIDE, - G.GRID, - G.GRAPH + W.SIMPLE, + W.AB, + W.SIDE, + W.GRID, + W.GRAPH ]; e._mode = t[(t.indexOf(e._mode) + 1) % t.length], e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged(); } -function yn(e, t) { - Object.values(G).includes(t) && (e._mode = t, e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged()); +function Tn(e, t) { + Object.values(W).includes(t) && (e._mode = t, e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged()); } -function bn(e) { +function En(e) { return e._pinnedSlots; } -function xn(e) { +function Dn(e) { if (e._pinBtns) { for (let t of [ "A", @@ -2310,61 +2615,61 @@ function xn(e) { e._pinBtn?.classList.toggle("is-on", (e._pinnedSlots?.size ?? 0) > 0); } } -function Sn(e) { +function On(e) { if (!e._modeBtn) return; let { icon: t = "pi-image", label: n = "" } = { - [G.SIMPLE]: { + [W.SIMPLE]: { icon: "pi-image", label: "Mode: Simple - click to switch" }, - [G.AB]: { + [W.AB]: { icon: "pi-clone", label: "Mode: A/B Compare - click to switch" }, - [G.SIDE]: { + [W.SIDE]: { icon: "pi-table", label: "Mode: Side-by-Side - click to switch" }, - [G.GRID]: { + [W.GRID]: { icon: "pi-th-large", label: "Mode: Grid Compare (up to 4) - click to switch" }, - [G.GRAPH]: { + [W.GRAPH]: { icon: "pi-sitemap", label: "Mode: Graph Map - click to switch" } - }[e._mode] || {}, r = w(n, "C"), i = document.createElement("i"); - i.className = `pi ${t}`, i.setAttribute("aria-hidden", "true"), e._modeBtn.replaceChildren(i), e._modeBtn.title = r, e._modeBtn.setAttribute("aria-label", r), e._modeBtn.removeAttribute("aria-pressed"), e._modeBtn.classList.toggle("is-on", e._mode !== G.SIMPLE), e._modeDrop?.selectItem?.(e._mode); + }[e._mode] || {}, r = U(n, "C"), i = document.createElement("i"); + i.className = `pi ${t}`, i.setAttribute("aria-hidden", "true"), e._modeBtn.replaceChildren(i), e._modeBtn.title = r, e._modeBtn.setAttribute("aria-label", r), e._modeBtn.removeAttribute("aria-pressed"), e._modeBtn.classList.toggle("is-on", e._mode !== W.SIMPLE), e._modeDrop?.selectItem?.(e._mode); } -function Cn(e, t) { +function kn(e, t) { if (!e._liveBtn) return; let n = !!t; e._liveBtn.classList.toggle("mjr-live-active", n); - let r = n ? f("tooltip.liveStreamOn", "Live Stream: ON - follows final generation outputs after execution") : f("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), i = w(r, "L"); + let r = n ? s("tooltip.liveStreamOn", "Live Stream: ON - follows final generation outputs after execution") : s("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), i = U(r, "L"); e._liveBtn.setAttribute("aria-pressed", String(n)), e._liveBtn.setAttribute("aria-label", i); let a = document.createElement("i"); a.className = n ? "pi pi-circle-fill" : "pi pi-circle", a.setAttribute("aria-hidden", "true"), e._liveBtn.replaceChildren(a), e._liveBtn.title = i; } -function wn(e, t) { +function An(e, t) { if (e._previewActive = !!t, !e._previewBtn) return; e._previewBtn.classList.toggle("mjr-preview-active", e._previewActive); - let n = e._previewActive ? f("tooltip.previewStreamOn", "KSampler Preview: ON - streams sampler denoising frames during execution") : f("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), r = w(n, "K"); + let n = e._previewActive ? s("tooltip.previewStreamOn", "KSampler Preview: ON - streams sampler denoising frames during execution") : s("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), r = U(n, "K"); e._previewBtn.setAttribute("aria-pressed", String(e._previewActive)), e._previewBtn.setAttribute("aria-label", r); let i = document.createElement("i"); i.className = e._previewActive ? "pi pi-eye" : "pi pi-eye-slash", i.setAttribute("aria-hidden", "true"), e._previewBtn.replaceChildren(i), e._previewBtn.title = r; } -function Tn(e) { +function jn(e) { return e?._isPreview ? String(e?._previewBlobUrl || e?.url || "").trim() : ""; } -function En(e, t) { +function Mn(e, t) { let n = new Set([ "A", "B", "C", "D" - ].map((t) => Tn(e[`_media${t}`])).filter(Boolean)); + ].map((t) => jn(e[`_media${t}`])).filter(Boolean)); for (let r of t) { - let t = Tn(r); + let t = jn(r); if (t && !n.has(t)) { try { URL.revokeObjectURL(t); @@ -2373,12 +2678,12 @@ function En(e, t) { } } } -function Dn(e, t, n = {}) { +function Nn(e, t, n = {}) { if (!t || !(t instanceof Blob)) return; - let r = e._mode === G.AB || e._mode === G.SIDE || e._mode === G.GRID, i = "A"; + let r = e._mode === W.AB || e._mode === W.SIDE || e._mode === W.GRID, i = "A"; if (r) { let t = e.getPinnedSlots(); - if (i = e._mode === G.GRID ? [ + if (i = e._mode === W.GRID ? [ "A", "B", "C", @@ -2403,9 +2708,9 @@ function Dn(e, t, n = {}) { _previewTotal: Number.isFinite(Number(n?.total)) ? Number(n.total) : null, _previewBlobUrl: o }; - r ? e[`_media${i}`] = l : (e._mediaA = l, e._resetMfvZoom(), e._mode !== G.SIMPLE && (e._mode = G.SIMPLE, e._updateModeBtnUI())), En(e, [a]), ++e._refreshGen, e._refresh(); + r ? e[`_media${i}`] = l : (e._mediaA = l, e._resetMfvZoom(), e._mode !== W.SIMPLE && (e._mode = W.SIMPLE, e._updateModeBtnUI())), Mn(e, [a]), ++e._refreshGen, e._refresh(); } -function On(e) { +function Pn(e) { let t = /* @__PURE__ */ new Set(); e._previewBlobUrl && t.add(String(e._previewBlobUrl)); for (let n of [ @@ -2414,7 +2719,7 @@ function On(e) { "C", "D" ]) { - let r = Tn(e[`_media${n}`]); + let r = jn(e[`_media${n}`]); r && t.add(r); } for (let e of t) try { @@ -2422,17 +2727,17 @@ function On(e) { } catch {} e._previewBlobUrl = null; } -function kn(e, t) { +function Fn(e, t) { if (e._nodeStreamActive = !!t, e._nodeStreamActive || e.setNodeStreamSelection?.(null), !e._nodeStreamBtn) return; e._nodeStreamBtn.classList.toggle("mjr-nodestream-active", e._nodeStreamActive); - let n = e._nodeStreamActive ? f("tooltip.nodeStreamOn", "Node Stream: ON - follows the selected node preview when frontend media exists") : f("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), r = w(n, "N"); + let n = e._nodeStreamActive ? s("tooltip.nodeStreamOn", "Node Stream: ON - follows the selected node preview when frontend media exists") : s("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), r = U(n, "N"); e._nodeStreamBtn.setAttribute("aria-pressed", String(e._nodeStreamActive)), e._nodeStreamBtn.setAttribute("aria-label", r); let i = document.createElement("i"); i.className = "pi pi-sitemap", i.setAttribute("aria-hidden", "true"), e._nodeStreamBtn.replaceChildren(i), e._nodeStreamBtn.title = r; } // ui/features/viewer/floatingViewerPopout.ts -var An = /* @__PURE__ */ "--border-color.--border-default.--button-hover-surface.--button-surface.--comfy-accent.--comfy-font.--comfy-input-bg.--comfy-menu-bg.--comfy-menu-secondary-bg.--comfy-status-error.--comfy-status-success.--comfy-status-warning.--content-bg.--content-fg.--descrip-text.--destructive-background.--font-inter.--input-text.--interface-menu-surface.--interface-panel-hover-surface.--interface-panel-selected-surface.--interface-panel-surface.--modal-card-background.--muted-foreground.--primary-background.--primary-background-hover.--radius-lg.--radius-md.--radius-sm.--success-background.--warning-background".split("."); -function jn() { +var In = /* @__PURE__ */ "--border-color.--border-default.--button-hover-surface.--button-surface.--comfy-accent.--comfy-font.--comfy-input-bg.--comfy-menu-bg.--comfy-menu-secondary-bg.--comfy-status-error.--comfy-status-success.--comfy-status-warning.--content-bg.--content-fg.--descrip-text.--destructive-background.--font-inter.--input-text.--interface-menu-surface.--interface-panel-hover-surface.--interface-panel-selected-surface.--interface-panel-surface.--modal-card-background.--muted-foreground.--primary-background.--primary-background-hover.--radius-lg.--radius-md.--radius-sm.--success-background.--warning-background".split("."); +function Ln() { try { let e = typeof window < "u" ? window : globalThis, t = e?.process?.versions?.electron; if (typeof t == "string" && t.trim() || e?.electron || e?.ipcRenderer || e?.electronAPI) return !0; @@ -2461,10 +2766,10 @@ function $(e, t = null, n = "info") { console.debug?.(e); } } -function Mn(e, ...t) { +function Rn(e, ...t) { return Array.from(new Set([String(e || ""), ...t].join(" ").split(/\s+/).filter(Boolean))).join(" "); } -function Nn(e, t) { +function zn(e, t) { if (e && t) for (let n of Array.from(e.attributes || [])) { let e = String(n?.name || ""); if (e && e !== "class" && e !== "style") try { @@ -2474,7 +2779,7 @@ function Nn(e, t) { } } } -function Pn(e, t) { +function Bn(e, t) { if (!e || !t?.style) return; let n = typeof window < "u" && window?.getComputedStyle || globalThis?.getComputedStyle; if (typeof n != "function") return; @@ -2485,7 +2790,7 @@ function Pn(e, t) { console.debug?.(e); } if (r) { - for (let e of An) try { + for (let e of In) try { let n = String(r.getPropertyValue?.(e) || "").trim(); n && t.style.setProperty(e, n); } catch (e) { @@ -2499,12 +2804,12 @@ function Pn(e, t) { } } } -function Fn(e) { +function Vn(e) { if (!e?.documentElement || !e?.body || !document?.documentElement) return; let t = document.documentElement, n = document.body, r = e.documentElement, i = e.body; - r.className = Mn(t.className, "mjr-mfv-popout-document"), i.className = Mn(n?.className, "mjr-mfv-popout-body"), Nn(t, r), Nn(n, i), Pn(t, r), Pn(n, i), t?.lang && (r.lang = t.lang), t?.dir && (r.dir = t.dir); + r.className = Rn(t.className, "mjr-mfv-popout-document"), i.className = Rn(n?.className, "mjr-mfv-popout-body"), zn(t, r), zn(n, i), Bn(t, r), Bn(n, i), t?.lang && (r.lang = t.lang), t?.dir && (r.dir = t.dir); } -function In(e) { +function Hn(e) { if (!e?.body) return null; try { (e.getElementById?.("mjr-mfv-popout-root"))?.remove?.(); @@ -2514,10 +2819,10 @@ function In(e) { let t = e.createElement("div"); return t.id = "mjr-mfv-popout-root", t.className = "mjr-mfv-popout-root", e.body.appendChild(t), t; } -function Ln(e) { +function Un(e) { e._resetGenDropdownForCurrentDocument(), e._rebindControlHandlers(), e._bindPanelInteractions(), e._bindDocumentUiHandlers(), e._unbindLayoutObserver?.(), e._bindLayoutObserver?.(), e._refresh?.(), e._updatePopoutBtnUI(); } -function Rn(e, t) { +function Wn(e, t) { if (!e.element) return; let n = !!t; if (e._desktopExpanded === n) return; @@ -2527,28 +2832,28 @@ function Rn(e, t) { parent: r.parentNode || null, nextSibling: r.nextSibling || null, styleAttr: r.getAttribute("style") - }, r.parentNode !== document.body && document.body.appendChild(r), r.classList.add("mjr-mfv--desktop-expanded", "is-visible"), r.setAttribute("aria-hidden", "false"), r.style.position = "fixed", r.style.top = "12px", r.style.left = "12px", r.style.right = "12px", r.style.bottom = "12px", r.style.width = "auto", r.style.height = "auto", r.style.maxWidth = "none", r.style.maxHeight = "none", r.style.minWidth = "320px", r.style.minHeight = "240px", r.style.resize = "none", r.style.margin = "0", r.style.zIndex = "2147483000", e._desktopExpanded = !0, e.isVisible = !0, Ln(e), $("electron-in-app-expanded", { isVisible: e.isVisible }); + }, r.parentNode !== document.body && document.body.appendChild(r), r.classList.add("mjr-mfv--desktop-expanded", "is-visible"), r.setAttribute("aria-hidden", "false"), r.style.position = "fixed", r.style.top = "12px", r.style.left = "12px", r.style.right = "12px", r.style.bottom = "12px", r.style.width = "auto", r.style.height = "auto", r.style.maxWidth = "none", r.style.maxHeight = "none", r.style.minWidth = "320px", r.style.minHeight = "240px", r.style.resize = "none", r.style.margin = "0", r.style.zIndex = "2147483000", e._desktopExpanded = !0, e.isVisible = !0, Un(e), $("electron-in-app-expanded", { isVisible: e.isVisible }); return; } let i = e._desktopExpandRestore; - e._desktopExpanded = !1, r.classList.remove("mjr-mfv--desktop-expanded"), i?.styleAttr == null || i.styleAttr === "" ? r.removeAttribute("style") : r.setAttribute("style", i.styleAttr), i?.parent && i.parent.isConnected && (i.nextSibling && i.nextSibling.parentNode === i.parent ? i.parent.insertBefore(r, i.nextSibling) : i.parent.appendChild(r)), e._desktopExpandRestore = null, Ln(e), $("electron-in-app-restored", null); + e._desktopExpanded = !1, r.classList.remove("mjr-mfv--desktop-expanded"), i?.styleAttr == null || i.styleAttr === "" ? r.removeAttribute("style") : r.setAttribute("style", i.styleAttr), i?.parent && i.parent.isConnected && (i.nextSibling && i.nextSibling.parentNode === i.parent ? i.parent.insertBefore(r, i.nextSibling) : i.parent.appendChild(r)), e._desktopExpandRestore = null, Un(e), $("electron-in-app-restored", null); } -function zn(t, n) { - t._desktopPopoutUnsupported = !0, $("electron-in-app-fallback", { message: n?.message || String(n || "unknown error") }, "warn"), t._setDesktopExpanded(!0); +function Gn(e, t) { + e._desktopPopoutUnsupported = !0, $("electron-in-app-fallback", { message: t?.message || String(t || "unknown error") }, "warn"), e._setDesktopExpanded(!0); try { - e(f("toast.popoutElectronInAppFallback", "Desktop PiP is unavailable here. Viewer expanded inside the app instead."), "warning", 4500); + r(s("toast.popoutElectronInAppFallback", "Desktop PiP is unavailable here. Viewer expanded inside the app instead."), "warning", 4500); } catch (e) { console.debug?.(e); } } -function Bn(e, t, n, r, i) { +function Kn(e, t, n, r, i) { return $("electron-popup-fallback-attempt", { reason: i?.message || String(i || "unknown") }, "warn"), e._fallbackPopout(t, n, r), e._popoutWindow ? (e._desktopPopoutUnsupported = !1, $("electron-popup-fallback-opened", null), !0) : !1; } -function Vn(e) { +function qn(e) { if (e._isPopped || !e.element) return; let t = e.element; e._stopEdgeResize(); - let n = jn(), r = typeof window < "u" && "documentPictureInPicture" in window, i = String(window?.navigator?.userAgent || globalThis?.navigator?.userAgent || ""), a = Math.max(t.offsetWidth || 520, 400), o = Math.max(t.offsetHeight || 420, 300); + let n = Ln(), r = typeof window < "u" && "documentPictureInPicture" in window, i = String(window?.navigator?.userAgent || globalThis?.navigator?.userAgent || ""), a = Math.max(t.offsetWidth || 520, 400), o = Math.max(t.offsetHeight || 420, 300); $("start", { isElectronHost: n, hasDocumentPiP: r, @@ -2577,7 +2882,7 @@ function Vn(e) { e._popoutCloseHandler = i; let a = n.document; a.title = "Majoor Viewer", e._installPopoutStyles(a); - let o = In(a); + let o = Hn(a); if (!o) e._activateDesktopExpandedFallback(/* @__PURE__ */ Error("Popup root creation failed")); else { try { @@ -2593,7 +2898,7 @@ function Vn(e) { e._activateDesktopExpandedFallback(t); return; } - t.classList.add("is-visible"), e.isVisible = !0, Ln(e), $("electron-pip-ready", { isPopped: e._isPopped }), n.addEventListener("pagehide", i, { signal: r }), e._startPopoutCloseWatch(), e._popoutKeydownHandler = (t) => { + t.classList.add("is-visible"), e.isVisible = !0, Un(e), $("electron-pip-ready", { isPopped: e._isPopped }), n.addEventListener("pagehide", i, { signal: r }), e._startPopoutCloseWatch(), e._popoutKeydownHandler = (t) => { let n = String(t?.target?.tagName || "").toLowerCase(); t?.defaultPrevented || t?.target?.isContentEditable || n === "input" || n === "textarea" || n === "select" || e._forwardKeydownToController(t); }, n.addEventListener("keydown", e._popoutKeydownHandler, { signal: r }); @@ -2605,7 +2910,7 @@ function Vn(e) { height: o }), e._fallbackPopout(t, a, o))); } -function Hn(e, t, n, r) { +function Jn(e, t, n, r) { $("browser-popup-open", { width: n, height: r @@ -2633,7 +2938,7 @@ function Hn(e, t, n, r) { } if (!n) return; n.title = "Majoor Viewer", e._installPopoutStyles(n); - let r = In(n); + let r = Hn(n); if (r) { try { r.appendChild(n.adoptNode(t)); @@ -2641,7 +2946,7 @@ function Hn(e, t, n, r) { console.warn("[MFV] adoptNode failed", e); return; } - t.classList.add("is-visible"), e.isVisible = !0, Ln(e); + t.classList.add("is-visible"), e.isVisible = !0, Un(e); } }; try { @@ -2659,7 +2964,7 @@ function Hn(e, t, n, r) { t?.defaultPrevented || t?.target?.isContentEditable || n === "input" || n === "textarea" || n === "select" || e._forwardKeydownToController(t); }, a.addEventListener("keydown", e._popoutKeydownHandler, { signal: o }); } -function Un(e) { +function Yn(e) { if (e._popoutCloseTimer != null) { try { window.clearInterval(e._popoutCloseTimer); @@ -2669,7 +2974,7 @@ function Un(e) { e._popoutCloseTimer = null; } } -function Wn(e) { +function Xn(e) { e._clearPopoutCloseWatch(), e._popoutCloseTimer = window.setInterval(() => { if (!e._isPopped) { e._clearPopoutCloseWatch(); @@ -2679,7 +2984,7 @@ function Wn(e) { (!t || t.closed) && (e._clearPopoutCloseWatch(), e._schedulePopInFromPopupClose()); }, 250); } -function Gn(e) { +function Zn(e) { e._isPopped && !e._popoutRestoreGuard && (e._popoutRestoreGuard = !0, window.setTimeout(() => { try { e.popIn({ closePopupWindow: !1 }); @@ -2688,14 +2993,14 @@ function Gn(e) { } }, 0)); } -function Kn(e, t) { +function Qn(e, t) { if (!t?.head) return; try { for (let e of t.head.querySelectorAll("[data-mjr-popout-cloned-style='1']")) e.remove(); } catch (e) { console.debug?.(e); } - Fn(t); + Vn(t); try { let e = document.documentElement.style.cssText; if (e) { @@ -2719,7 +3024,7 @@ function Kn(e, t) { let n = t.createElement("style"); n.setAttribute("data-mjr-popout-cloned-style", "1"), n.textContent = "\n html.mjr-mfv-popout-document {\n min-height: 100%;\n background:\n radial-gradient(\n 1200px 420px at 50% 0%,\n color-mix(in srgb, var(--primary-background, var(--comfy-accent, #5fb3ff)) 10%, transparent),\n transparent 62%\n ),\n linear-gradient(\n 180deg,\n color-mix(in srgb, var(--interface-panel-surface, var(--content-bg, #16191f)) 82%, #000 18%),\n color-mix(in srgb, var(--interface-menu-surface, var(--comfy-menu-bg, #1f2227)) 84%, #000 16%)\n ) !important;\n }\n body.mjr-mfv-popout-body {\n margin: 0 !important;\n display: flex !important;\n min-height: 100vh !important;\n overflow: hidden !important;\n background: transparent !important;\n }\n #mjr-mfv-popout-root,\n .mjr-mfv-popout-root {\n flex: 1 !important;\n min-width: 0 !important;\n min-height: 0 !important;\n display: flex !important;\n isolation: isolate;\n }\n body.mjr-mfv-popout-body .mjr-mfv {\n position: static !important;\n width: 100% !important;\n height: 100% !important;\n min-width: 0 !important;\n min-height: 0 !important;\n resize: none !important;\n border-radius: 0 !important;\n display: flex !important;\n opacity: 1 !important;\n visibility: visible !important;\n pointer-events: auto !important;\n transform: none !important;\n max-width: none !important;\n max-height: none !important;\n overflow: hidden !important;\n }\n ", t.head.appendChild(n); } -function qn(e, { closePopupWindow: t = !0 } = {}) { +function $n(e, { closePopupWindow: t = !0 } = {}) { if (e._desktopExpanded) { e._setDesktopExpanded(!1); return; @@ -2739,22 +3044,22 @@ function qn(e, { closePopupWindow: t = !0 } = {}) { } catch (e) { console.debug?.("[MFV] pop-in adopt failed", e); } - if (document.body.appendChild(r), r.classList.add("is-visible"), r.setAttribute("aria-hidden", "false"), e.isVisible = !0, Ln(e), t) try { + if (document.body.appendChild(r), r.classList.add("is-visible"), r.setAttribute("aria-hidden", "false"), e.isVisible = !0, Un(e), t) try { n?.close(); } catch (e) { console.debug?.(e); } e._popoutWindow = null; } -function Jn(e) { +function er(e) { if (!e._popoutBtn) return; let t = e._isPopped || e._desktopExpanded; e.element && e.element.classList.toggle("mjr-mfv--popped", t), e._popoutBtn.classList.toggle("mjr-popin-active", t); - let n = e._popoutBtn.querySelector("i") || document.createElement("i"), r = t ? f("tooltip.popInViewer", "Return to floating panel") : f("tooltip.popOutViewer", "Pop out viewer to separate window"); + let n = e._popoutBtn.querySelector("i") || document.createElement("i"), r = t ? s("tooltip.popInViewer", "Return to floating panel") : s("tooltip.popOutViewer", "Pop out viewer to separate window"); n.className = t ? "pi pi-sign-in" : "pi pi-external-link", e._popoutBtn.title = r, e._popoutBtn.setAttribute("aria-label", r), e._popoutBtn.setAttribute("aria-pressed", String(t)), e._popoutBtn.contains(n) || e._popoutBtn.replaceChildren(n); } // ui/features/viewer/floatingViewerPanel.ts -function Yn(e) { +function tr(e) { return { n: "ns-resize", s: "ns-resize", @@ -2766,12 +3071,12 @@ function Yn(e) { sw: "nesw-resize" }[e] || ""; } -function Xn(e, t, n) { +function nr(e, t, n) { if (!n) return ""; let r = e <= n.left + 8, i = e >= n.right - 8, a = t <= n.top + 8, o = t >= n.bottom - 8; return a && r ? "nw" : a && i ? "ne" : o && r ? "sw" : o && i ? "se" : a ? "n" : o ? "s" : r ? "w" : i ? "e" : ""; } -function Zn(e) { +function rr(e) { if (e.element) { try { e._resizeWindowCleanup?.(); @@ -2786,7 +3091,7 @@ function Zn(e) { e._resizeState = null, e.element.classList.remove("mjr-mfv--resizing"), e.element.style.cursor = ""; } } -function Qn(e) { +function ir(e) { if (e.element) { e._stopEdgeResize(); try { @@ -2797,7 +3102,7 @@ function Qn(e) { e._panelAC = new AbortController(), e._initEdgeResize(e.element), e._initDrag(e.element.querySelector(".mjr-mfv-header")); } } -function $n(e, t) { +function ar(e, t) { if (!t) return; let n = (t) => { if (!e.element || e._isPopped) return ""; @@ -2868,7 +3173,7 @@ function $n(e, t) { !e._resizeState && e.element && (e.element.style.cursor = ""); }, { signal: r }); } -function er(e, t) { +function or(e, t) { if (!t) return; let n = e._panelAC?.signal, r = null; t.addEventListener("pointerdown", (n) => { @@ -2895,15 +3200,15 @@ function er(e, t) { }, n ? { signal: n } : void 0); } // ui/features/viewer/floatingViewerCapture.ts -async function tr(e, t, n, r, i, a, o, s) { +async function sr(e, t, n, r, i, a, o, s) { if (!n) return; - let c = K(n), l = null; + let c = G(n), l = null; if (c === "video" && (l = s instanceof HTMLVideoElement ? s : e._contentEl?.querySelector("video") || null), !l && c === "model3d") { let t = n?.id == null ? "" : String(n.id); t && (l = e._contentEl?.querySelector?.(`.mjr-model3d-render-canvas[data-mjr-asset-id="${t}"]`) || null), l ||= e._contentEl?.querySelector?.(".mjr-model3d-render-canvas") || null; } if (!l) { - let e = Ae(n); + let e = Fe(n); if (!e) return; l = await new Promise((t) => { let n = new Image(); @@ -2916,7 +3221,7 @@ async function tr(e, t, n, r, i, a, o, s) { let f = Math.min(a / u, o / d); t.drawImage(l, r + (a - u * f) / 2, i + (o - d * f) / 2, u * f, d * f); } -function nr(e, t, n, r) { +function cr(e, t, n, r) { if (!t || !n || !e._genInfoSelections.size) return 0; let i = e._getGenFields(n), a = [ "prompt", @@ -2948,7 +3253,7 @@ function nr(e, t, n, r) { } return s > 0 ? s * 16 + 16 : 0; } -function rr(e, t, n, r, i, a, o) { +function lr(e, t, n, r, i, a, o) { if (!n || !e._genInfoSelections.size) return; let s = e._getGenFields(n), c = { prompt: "#7ec8ff", @@ -3003,16 +3308,16 @@ function rr(e, t, n, r, i, a, o) { }); } let p = f.reduce((e, t) => e + t.lines.length, 0) * 16 + 16, m = r + 8, h = i + o - p - 8; - t.globalAlpha = .72, t.fillStyle = "#000", Ie(t, m, h, d, p, 6), t.fill(), t.globalAlpha = 1; + t.globalAlpha = .72, t.fillStyle = "#000", Ue(t, m, h, d, p, 6), t.fill(), t.globalAlpha = 1; let g = h + 8 + 11; for (let { label: e, labelW: n, lines: r, color: i } of f) for (let a = 0; a < r.length; a++) a === 0 ? (t.font = "bold 11px system-ui, sans-serif", t.fillStyle = i, t.fillText(e, m + 8, g), t.font = "11px system-ui, sans-serif", t.fillStyle = "rgba(255,255,255,0.88)", t.fillText(r[a], m + 8 + n, g)) : (t.font = "11px system-ui, sans-serif", t.fillStyle = "rgba(255,255,255,0.88)", t.fillText(r[a], m + 8 + n, g)), g += 16; t.restore(); } -async function ir(e) { +async function ur(e) { if (!e._contentEl) return; - e._captureBtn && (e._captureBtn.disabled = !0, e._captureBtn.setAttribute("aria-label", f("tooltip.capturingView", "Capturing..."))); + e._captureBtn && (e._captureBtn.disabled = !0, e._captureBtn.setAttribute("aria-label", s("tooltip.capturingView", "Capturing..."))); let t = e._contentEl.clientWidth || 480, n = e._contentEl.clientHeight || 360, r = n; - if (e._mode === G.SIMPLE && e._mediaA && e._genInfoSelections.size) { + if (e._mode === W.SIMPLE && e._mediaA && e._genInfoSelections.size) { let i = document.createElement("canvas"); i.width = t, i.height = n; let a = i.getContext("2d"), o = e._estimateGenInfoOverlayHeight(a, e._mediaA, t); @@ -3026,14 +3331,14 @@ async function ir(e) { let a = i.getContext("2d"); a.fillStyle = "#0d0d0d", a.fillRect(0, 0, t, r); try { - if (e._mode === G.SIMPLE) e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, t, n), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, t, r)); - else if (e._mode === G.AB) { + if (e._mode === W.SIMPLE) e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, t, n), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, t, r)); + else if (e._mode === W.AB) { let n = Math.round(e._abDividerX * t), i = e._contentEl.querySelector(".mjr-mfv-ab-layer:not(.mjr-mfv-ab-layer--b) video"), o = e._contentEl.querySelector(".mjr-mfv-ab-layer--b video"); - e._mediaA && await e._drawMediaFit(a, e._mediaA, 0, 0, t, r, i), e._mediaB && (a.save(), a.beginPath(), a.rect(n, 0, t - n, r), a.clip(), await e._drawMediaFit(a, e._mediaB, 0, 0, t, r, o), a.restore()), a.save(), a.strokeStyle = "rgba(255,255,255,0.88)", a.lineWidth = 2, a.beginPath(), a.moveTo(n, 0), a.lineTo(n, r), a.stroke(), a.restore(), Le(a, "A", 8, 8), Le(a, "B", n + 8, 8), e._mediaA && e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r), e._mediaB && e._drawGenInfoOverlay(a, e._mediaB, n, 0, t - n, r); - } else if (e._mode === G.SIDE) { + e._mediaA && await e._drawMediaFit(a, e._mediaA, 0, 0, t, r, i), e._mediaB && (a.save(), a.beginPath(), a.rect(n, 0, t - n, r), a.clip(), await e._drawMediaFit(a, e._mediaB, 0, 0, t, r, o), a.restore()), a.save(), a.strokeStyle = "rgba(255,255,255,0.88)", a.lineWidth = 2, a.beginPath(), a.moveTo(n, 0), a.lineTo(n, r), a.stroke(), a.restore(), Y(a, "A", 8, 8), Y(a, "B", n + 8, 8), e._mediaA && e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r), e._mediaB && e._drawGenInfoOverlay(a, e._mediaB, n, 0, t - n, r); + } else if (e._mode === W.SIDE) { let n = Math.floor(t / 2), i = e._contentEl.querySelector(".mjr-mfv-side-panel:first-child video"), o = e._contentEl.querySelector(".mjr-mfv-side-panel:last-child video"); - e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, n, r, i), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r)), a.fillStyle = "#111", a.fillRect(n, 0, 2, r), e._mediaB && (await e._drawMediaFit(a, e._mediaB, n, 0, n, r, o), e._drawGenInfoOverlay(a, e._mediaB, n, 0, n, r)), Le(a, "A", 8, 8), Le(a, "B", n + 8, 8); - } else if (e._mode === G.GRID) { + e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, n, r, i), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r)), a.fillStyle = "#111", a.fillRect(n, 0, 2, r), e._mediaB && (await e._drawMediaFit(a, e._mediaB, n, 0, n, r, o), e._drawGenInfoOverlay(a, e._mediaB, n, 0, n, r)), Y(a, "A", 8, 8), Y(a, "B", n + 8, 8); + } else if (e._mode === W.GRID) { let n = Math.floor(t / 2), i = Math.floor(r / 2), o = [ { media: e._mediaA, @@ -3070,7 +3375,7 @@ async function ir(e) { ], s = e._contentEl.querySelectorAll(".mjr-mfv-grid-cell"); for (let t = 0; t < o.length; t++) { let n = o[t], r = s[t]?.querySelector("video") || null; - n.media && (await e._drawMediaFit(a, n.media, n.x, n.y, n.w, n.h, r), e._drawGenInfoOverlay(a, n.media, n.x, n.y, n.w, n.h)), Le(a, n.label, n.x + 8, n.y + 8); + n.media && (await e._drawMediaFit(a, n.media, n.x, n.y, n.w, n.h, r), e._drawGenInfoOverlay(a, n.media, n.x, n.y, n.w, n.h)), Y(a, n.label, n.x + 8, n.y + 8); } a.save(), a.fillStyle = "#111", a.fillRect(n - 1, 0, 2, r), a.fillRect(0, i - 1, t, 2), a.restore(); } @@ -3078,9 +3383,9 @@ async function ir(e) { console.debug("[MFV] capture error:", e); } let o = `${{ - [G.AB]: "mfv-ab", - [G.SIDE]: "mfv-side", - [G.GRID]: "mfv-grid" + [W.AB]: "mfv-ab", + [W.SIDE]: "mfv-side", + [W.GRID]: "mfv-grid" }[e._mode] ?? "mfv"}-${Date.now()}.png`; try { let e = i.toDataURL("image/png"), t = document.createElement("a"); @@ -3088,65 +3393,65 @@ async function ir(e) { } catch (e) { console.warn("[MFV] download failed:", e); } finally { - e._captureBtn && (e._captureBtn.disabled = !1, e._captureBtn.setAttribute("aria-label", f("tooltip.captureView", "Save view as image"))); + e._captureBtn && (e._captureBtn.disabled = !1, e._captureBtn.setAttribute("aria-label", s("tooltip.captureView", "Save view as image"))); } } // ui/features/viewer/floatingViewerLoader.ts -var ar = "imageops-live-preview"; -function or(e) { - return String(e?._source || "") === ar; +var dr = "imageops-live-preview"; +function fr(e) { + return String(e?._source || "") === dr; } -function sr(e, r, { autoMode: i = !1 } = {}) { - let a = e._mediaA || null, o = or(r), s = o && or(a) && String(a?._nodeId || "") === String(r?._nodeId || ""); - if (e._mediaA = r || null, En(e, [a]), s || e._resetMfvZoom(), i && e._mode !== G.SIMPLE && e._mode !== G.GRAPH && (e._mode = G.SIMPLE, e._updateModeBtnUI()), e._refresh(), e._mediaA && !o && typeof de == "function") { - let r = ++e._refreshGen; +function pr(e, t, { autoMode: n = !1 } = {}) { + let r = e._mediaA || null, i = fr(t), a = i && fr(r) && String(r?._nodeId || "") === String(t?._nodeId || ""); + if (e._mediaA = t || null, Mn(e, [r]), a || e._resetMfvZoom(), n && e._mode !== W.SIMPLE && e._mode !== W.GRAPH && (e._mode = W.SIMPLE, e._updateModeBtnUI()), e._refresh(), e._mediaA && !i && typeof fe == "function") { + let t = ++e._refreshGen; (async () => { try { - let i = await de(e._mediaA, { - getAssetMetadata: t, - getFileMetadataScoped: n + let n = await fe(e._mediaA, { + getAssetMetadata: f, + getFileMetadataScoped: m }); - if (e._refreshGen !== r) return; - i && typeof i == "object" && (e._mediaA = i, e._refresh()); + if (e._refreshGen !== t) return; + n && typeof n == "object" && (e._mediaA = n, e._refresh()); } catch (e) { console.debug?.("[MFV] metadata enrich error", e); } })(); } } -function cr(e, r, i) { - let a = [e._mediaA, e._mediaB]; - e._mediaA = r || null, e._mediaB = i || null, En(e, a), e._resetMfvZoom(), e._mode === G.SIMPLE && (e._mode = G.AB, e._updateModeBtnUI()); - let o = ++e._refreshGen, s = async (e) => { +function mr(e, t, n) { + let r = [e._mediaA, e._mediaB]; + e._mediaA = t || null, e._mediaB = n || null, Mn(e, r), e._resetMfvZoom(), e._mode === W.SIMPLE && (e._mode = W.AB, e._updateModeBtnUI()); + let i = ++e._refreshGen, a = async (e) => { if (!e) return e; try { - return await de(e, { - getAssetMetadata: t, - getFileMetadataScoped: n + return await fe(e, { + getAssetMetadata: f, + getFileMetadataScoped: m }) || e; } catch { return e; } }; (async () => { - let [t, n] = await Promise.all([s(e._mediaA), s(e._mediaB)]); - e._refreshGen === o && (e._mediaA = t || null, e._mediaB = n || null, e._refresh()); + let [t, n] = await Promise.all([a(e._mediaA), a(e._mediaB)]); + e._refreshGen === i && (e._mediaA = t || null, e._mediaB = n || null, e._refresh()); })(); } -function lr(e, r, i, a, o) { - let s = [ +function hr(e, t, n, r, i) { + let a = [ e._mediaA, e._mediaB, e._mediaC, e._mediaD ]; - e._mediaA = r || null, e._mediaB = i || null, e._mediaC = a || null, e._mediaD = o || null, En(e, s), e._resetMfvZoom(), e._mode !== G.GRID && (e._mode = G.GRID, e._updateModeBtnUI()); - let c = ++e._refreshGen, l = async (e) => { + e._mediaA = t || null, e._mediaB = n || null, e._mediaC = r || null, e._mediaD = i || null, Mn(e, a), e._resetMfvZoom(), e._mode !== W.GRID && (e._mode = W.GRID, e._updateModeBtnUI()); + let o = ++e._refreshGen, s = async (e) => { if (!e) return e; try { - return await de(e, { - getAssetMetadata: t, - getFileMetadataScoped: n + return await fe(e, { + getAssetMetadata: f, + getFileMetadataScoped: m }) || e; } catch { return e; @@ -3154,25 +3459,25 @@ function lr(e, r, i, a, o) { }; (async () => { let [t, n, r, i] = await Promise.all([ - l(e._mediaA), - l(e._mediaB), - l(e._mediaC), - l(e._mediaD) + s(e._mediaA), + s(e._mediaB), + s(e._mediaC), + s(e._mediaD) ]); - e._refreshGen === c && (e._mediaA = t || null, e._mediaB = n || null, e._mediaC = r || null, e._mediaD = i || null, e._refresh()); + e._refreshGen === o && (e._mediaA = t || null, e._mediaB = n || null, e._mediaC = r || null, e._mediaD = i || null, e._refresh()); })(); } // ui/features/viewer/FloatingViewer.impl.ts -function ur(e) { +function gr(e) { try { return !!e?.classList?.contains("mjr-mfv-simple-player") || !!e?.classList?.contains("mjr-mfv-player-host") || !!e?.querySelector?.(".mjr-video-controls, .mjr-mfv-simple-player-controls"); } catch (e) { return console.debug?.(e), !1; } } -var dr = 0, fr = class { +var _r = 0, vr = class { constructor({ controller: e = null } = {}) { - this._instanceId = ++dr, this._controller = e && typeof e == "object" ? { ...e } : null, this.element = null, this.isVisible = !1, this._contentEl = null, this._genSidebarEl = null, this._closeBtn = null, this._modeBtn = null, this._pinGroup = null, this._pinBtns = null, this._liveBtn = null, this._genBtn = null, this._genDropdown = null, this._genSidebarEnabled = !1, this._captureBtn = null, this._genInfoSelections = /* @__PURE__ */ new Set([ + this._instanceId = ++_r, this._controller = e && typeof e == "object" ? { ...e } : null, this.element = null, this.isVisible = !1, this._contentEl = null, this._genSidebarEl = null, this._closeBtn = null, this._modeBtn = null, this._pinGroup = null, this._pinBtns = null, this._liveBtn = null, this._genBtn = null, this._genDropdown = null, this._genSidebarEnabled = !1, this._captureBtn = null, this._genInfoSelections = /* @__PURE__ */ new Set([ "prompt", "seed", "model", @@ -3182,7 +3487,7 @@ var dr = 0, fr = class { "cfg", "step", "genTime" - ]), this._mode = G.SIMPLE, this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this._pinnedSlots = /* @__PURE__ */ new Set(), this._abDividerX = .5, this._mfvMuted = !1, this._mfvPlaybackRate = 1, this._zoom = 1, this._panX = 0, this._panY = 0, this._panzoomAC = null, this._dragging = !1, this._compareSyncAC = null, this._btnAC = null, this._refreshGen = 0, this._popoutWindow = null, this._popoutBtn = null, this._isPopped = !1, this._desktopExpanded = !1, this._desktopExpandRestore = null, this._desktopPopoutUnsupported = !1, this._popoutCloseHandler = null, this._popoutKeydownHandler = null, this._popoutCloseTimer = null, this._popoutRestoreGuard = !1, this._previewBtn = null, this._previewBlobUrl = null, this._previewActive = !1, this._nodeStreamBtn = null, this._nodeStreamActive = !1, this._nodeStreamSelection = null, this._nodeStreamOverlayEl = null, this._docAC = new AbortController(), this._popoutAC = null, this._panelAC = new AbortController(), this._resizeState = null, this._titleId = `mjr-mfv-title-${this._instanceId}`, this._genDropdownId = `mjr-mfv-gen-dropdown-${this._instanceId}`, this._progressEl = null, this._progressNodesEl = null, this._progressStepsEl = null, this._progressTextEl = null, this._mediaProgressEl = null, this._mediaProgressTextEl = null, this._progressUpdateHandler = null, this._progressCurrentNodeId = null, this._docClickHost = null, this._handleDocClick = null, this._mediaControlHandles = [], this._layoutObserver = null, this._channel = "rgb", this._exposureEV = 0, this._gridMode = 0, this._overlayMaskEnabled = !1, this._overlayMaskOpacity = .65, this._overlayFormat = "image", this._graphMapPanel = new St({ large: !0 }); + ]), this._mode = W.SIMPLE, this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this._pinnedSlots = /* @__PURE__ */ new Set(), this._abDividerX = .5, this._mfvMuted = !1, this._mfvPlaybackRate = 1, this._zoom = 1, this._panX = 0, this._panY = 0, this._panzoomAC = null, this._dragging = !1, this._compareSyncAC = null, this._btnAC = null, this._refreshGen = 0, this._popoutWindow = null, this._popoutBtn = null, this._isPopped = !1, this._desktopExpanded = !1, this._desktopExpandRestore = null, this._desktopPopoutUnsupported = !1, this._popoutCloseHandler = null, this._popoutKeydownHandler = null, this._popoutCloseTimer = null, this._popoutRestoreGuard = !1, this._previewBtn = null, this._previewBlobUrl = null, this._previewActive = !1, this._nodeStreamBtn = null, this._nodeStreamActive = !1, this._nodeStreamSelection = null, this._nodeStreamOverlayEl = null, this._docAC = new AbortController(), this._popoutAC = null, this._panelAC = new AbortController(), this._resizeState = null, this._titleId = `mjr-mfv-title-${this._instanceId}`, this._genDropdownId = `mjr-mfv-gen-dropdown-${this._instanceId}`, this._progressEl = null, this._progressNodesEl = null, this._progressStepsEl = null, this._progressTextEl = null, this._mediaProgressEl = null, this._mediaProgressTextEl = null, this._progressUpdateHandler = null, this._progressCurrentNodeId = null, this._docClickHost = null, this._handleDocClick = null, this._mediaControlHandles = [], this._layoutObserver = null, this._channel = "rgb", this._exposureEV = 0, this._gridMode = 0, this._overlayMaskEnabled = !1, this._overlayMaskOpacity = .65, this._overlayFormat = "image", this._graphMapPanel = new Ot({ large: !0 }); } _dispatchControllerAction(e, t) { try { @@ -3226,32 +3531,32 @@ var dr = 0, fr = class { } } render() { - return rn(this); + return un(this); } _buildHeader() { - return an(this); + return dn(this); } _buildToolbar() { - return on(this); + return fn(this); } _rebindControlHandlers() { - return sn(this); + return pn(this); } _updateSettingsBtnState(e) { - return cn(this, e); + return mn(this, e); } _applySidebarPosition() { - return ln(this); + return hn(this); } refreshSidebar() { this._sidebar?.refresh(); } _resetGenDropdownForCurrentDocument() {} _bindDocumentUiHandlers() { - return un(this); + return gn(this); } _unbindDocumentUiHandlers() { - return dn(this); + return _n(this); } _isGenDropdownOpen() { return !1; @@ -3259,50 +3564,50 @@ var dr = 0, fr = class { _openGenDropdown() {} _closeGenDropdown() {} _updateGenBtnUI() { - return fn(this); + return vn(this); } _buildGenDropdown() { return null; } _getGenFields(e) { - return hn(this, e); + return xn(this, e); } _buildGenInfoDOM(e) { - return gn(this, e); + return Sn(this, e); } _notifyModeChanged() { - return _n(this); + return Cn(this); } _cycleMode() { - return vn(this); + return wn(this); } setMode(e) { - return yn(this, e); + return Tn(this, e); } getPinnedSlots() { - return bn(this); + return En(this); } _updatePinUI() { - return xn(this); + return Dn(this); } _updateModeBtnUI() { - return Sn(this); - } - setLiveActive(e) { - return Cn(this, e); - } - setPreviewActive(e) { - return wn(this, e); - } - loadPreviewBlob(e, t = {}) { - return Dn(this, e, t); - } - _revokePreviewBlob() { return On(this); } - setNodeStreamActive(e) { + setLiveActive(e) { return kn(this, e); } + setPreviewActive(e) { + return An(this, e); + } + loadPreviewBlob(e, t = {}) { + return Nn(this, e, t); + } + _revokePreviewBlob() { + return Pn(this); + } + setNodeStreamActive(e) { + return Fn(this, e); + } setNodeStreamSelection(e) { this._nodeStreamSelection = e && (e.nodeId != null || e.classType) ? { nodeId: String(e.nodeId ?? ""), @@ -3327,17 +3632,17 @@ var dr = 0, fr = class { this._nodeStreamOverlayEl.textContent = `${n} - ${r}${i}`.trim(); } loadMediaA(e, { autoMode: t = !1 } = {}) { - return sr(this, e, { autoMode: t }); + return pr(this, e, { autoMode: t }); } loadMediaPair(e, t) { - return cr(this, e, t); + return mr(this, e, t); } loadMediaQuad(e, t, n, r) { - return lr(this, e, t, n, r); + return hr(this, e, t, n, r); } _applyTransform() { if (!this._contentEl) return; - let e = Math.max(fe, Math.min(8, this._zoom)), t = this._contentEl.clientWidth || 0, n = this._contentEl.clientHeight || 0, r = Math.max(0, (e - 1) * t / 2), i = Math.max(0, (e - 1) * n / 2); + let e = Math.max(ge, Math.min(8, this._zoom)), t = this._contentEl.clientWidth || 0, n = this._contentEl.clientHeight || 0, r = Math.max(0, (e - 1) * t / 2), i = Math.max(0, (e - 1) * n / 2); this._panX = Math.max(-r, Math.min(r, this._panX)), this._panY = Math.max(-i, Math.min(i, this._panY)); let a = `translate(${this._panX}px,${this._panY}px) scale(${e})`; for (let e of this._contentEl.querySelectorAll(".mjr-mfv-media")) e?._mjrDisableViewerTransform || (e.style.transform = a, e.style.transformOrigin = "center"); @@ -3458,7 +3763,7 @@ var dr = 0, fr = class { for (let e of l) n.strokeRect(e.x + .5, e.y + .5, e.w - 1, e.h - 1); n.restore(); } - if (this._mode !== G.SIMPLE || !this._gridMode) return; + if (this._mode !== W.SIMPLE || !this._gridMode) return; let u = l[0]; if (!u) return; n.save(), n.translate(u.x, u.y), n.strokeStyle = "rgba(255,255,255,0.22)", n.lineWidth = Math.max(2, Math.round(1.25 * r)); @@ -3468,7 +3773,7 @@ var dr = 0, fr = class { this._gridMode === 1 ? (d(u.w / 3, 0, u.w / 3, u.h), d(2 * u.w / 3, 0, 2 * u.w / 3, u.h), d(0, u.h / 3, u.w, u.h / 3), d(0, 2 * u.h / 3, u.w, 2 * u.h / 3)) : this._gridMode === 2 ? (d(u.w / 2, 0, u.w / 2, u.h), d(0, u.h / 2, u.w, u.h / 2)) : this._gridMode === 3 && (n.strokeRect(u.w * .1 + .5, u.h * .1 + .5, u.w * .8 - 1, u.h * .8 - 1), n.strokeRect(u.w * .05 + .5, u.h * .05 + .5, u.w * .9 - 1, u.h * .9 - 1)), n.restore(); } _setMfvZoom(e, t, n) { - let r = Math.max(fe, Math.min(8, this._zoom)), i = Math.max(fe, Math.min(8, Number(e) || 1)); + let r = Math.max(ge, Math.min(8, this._zoom)), i = Math.max(ge, Math.min(8, Number(e) || 1)); if (t != null && n != null && this._contentEl) { let e = i / r, a = this._contentEl.getBoundingClientRect(), o = t - (a.left + a.width / 2), s = n - (a.top + a.height / 2); this._panX = this._panX * e + (1 - e) * o, this._panY = this._panY * e + (1 - e) * s; @@ -3502,11 +3807,11 @@ var dr = 0, fr = class { this._panzoomAC = new AbortController(); let t = { signal: this._panzoomAC.signal }; e.addEventListener("wheel", (t) => { - if (t.target?.closest?.("audio") || t.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || W(t.target)) return; - let n = Ne(t.target, e); - if (n && Pe(n, Number(t.deltaX || 0), Number(t.deltaY || 0))) return; + if (t.target?.closest?.("audio") || t.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || pe(t.target)) return; + let n = Re(t.target, e); + if (n && ze(n, Number(t.deltaX || 0), Number(t.deltaY || 0))) return; t.preventDefault(); - let r = 1 - (t.deltaY || t.deltaX || 0) * pe; + let r = 1 - (t.deltaY || t.deltaX || 0) * _e; this._setMfvZoom(this._zoom * r, t.clientX, t.clientY); }, { ...t, @@ -3514,7 +3819,7 @@ var dr = 0, fr = class { }); let n = !1, r = 0, i = 0, a = 0, o = 0; e.addEventListener("pointerdown", (t) => { - if ((t.button === 0 || t.button === 1) && !(this._zoom <= 1.01) && !t.target?.closest?.("video") && !t.target?.closest?.("audio") && !t.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") && !t.target?.closest?.(".mjr-mfv-ab-divider") && !W(t.target)) { + if ((t.button === 0 || t.button === 1) && !(this._zoom <= 1.01) && !t.target?.closest?.("video") && !t.target?.closest?.("audio") && !t.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") && !t.target?.closest?.(".mjr-mfv-ab-divider") && !pe(t.target)) { t.preventDefault(), n = !0, this._dragging = !0, r = t.clientX, i = t.clientY, a = this._panX, o = this._panY; try { e.setPointerCapture(t.pointerId); @@ -3538,7 +3843,7 @@ var dr = 0, fr = class { } }; e.addEventListener("pointerup", s, t), e.addEventListener("pointercancel", s, t), e.addEventListener("dblclick", (e) => { - if (e.target?.closest?.("video") || e.target?.closest?.("audio") || e.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || W(e.target)) return; + if (e.target?.closest?.("video") || e.target?.closest?.("audio") || e.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || pe(e.target)) return; let t = Math.abs(this._zoom - 1) < .05; this._setMfvZoom(t ? Math.min(4, this._zoom * 4) : 1, e.clientX, e.clientY); }, t); @@ -3601,43 +3906,43 @@ var dr = 0, fr = class { return e; } _initCompareSync() { - if (this._destroyCompareSync(), this._contentEl && this._mode !== G.SIMPLE) try { + if (this._destroyCompareSync(), this._contentEl && this._mode !== W.SIMPLE) try { let e = Array.from(this._contentEl.querySelectorAll("video, audio")); if (e.length < 2) return; let t = e[0] || null, n = e.slice(1); if (!t || !n.length) return; - this._compareSyncAC = E(t, n, { threshold: .08 }); + this._compareSyncAC = he(t, n, { threshold: .08 }); } catch (e) { console.debug?.(e); } } _refresh() { if (!this._contentEl) return; - this._sidebar?.setAsset?.(this._mediaA || null), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), Fe(this._contentEl); + this._sidebar?.setAsset?.(this._mediaA || null), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), Ve(this._contentEl); let e = this._overlayCanvas || null; switch (this._contentEl.replaceChildren(), this._contentEl.style.overflow = "hidden", this._mode) { - case G.SIMPLE: + case W.SIMPLE: this._renderSimple(); break; - case G.AB: + case W.AB: this._renderAB(); break; - case G.SIDE: + case W.SIDE: this._renderSide(); break; - case G.GRID: + case W.GRID: this._renderGrid(); break; - case G.GRAPH: this._renderGraphMap(); + case W.GRAPH: this._renderGraphMap(); } - e && this._contentEl.appendChild(e), this._nodeStreamSelection && this._updateNodeStreamOverlay(), this._mediaProgressEl && this._contentEl.appendChild(this._mediaProgressEl), this._applyMediaToneControls(), this._applyTransform(), this._mode !== G.GRAPH && this._initPanZoom(this._contentEl), this._initCompareSync(), this._renderGenInfoSidebar(); + e && this._contentEl.appendChild(e), this._nodeStreamSelection && this._updateNodeStreamOverlay(), this._mediaProgressEl && this._contentEl.appendChild(this._mediaProgressEl), this._applyMediaToneControls(), this._applyTransform(), this._mode !== W.GRAPH && this._initPanZoom(this._contentEl), this._initCompareSync(), this._renderGenInfoSidebar(); } _renderGenInfoSidebar() { let e = this._genSidebarEl; if (!e) return; e.replaceChildren(); let t = this._getGenInfoSidebarSlots(); - if (this._mode === G.GRAPH || !this._genSidebarEnabled || t.length === 0) { + if (this._mode === W.GRAPH || !this._genSidebarEnabled || t.length === 0) { e.classList.remove("open"), e.setAttribute("hidden", ""), this._updateGenBtnUI?.(); return; } @@ -3645,7 +3950,7 @@ var dr = 0, fr = class { n.className = "mjr-mfv-gen-sidebar-title", n.textContent = "Gen Info", e.appendChild(n); let r = 0; for (let n of t) { - if (K(n.media) === "audio") continue; + if (G(n.media) === "audio") continue; let i = this._buildGenInfoSidebarContent(n.media); if (!i) continue; let a = document.createElement("section"); @@ -3671,17 +3976,17 @@ var dr = 0, fr = class { media: this._mediaD, label: "D" }; - return (this._mode === G.GRID ? [ + return (this._mode === W.GRID ? [ e, t, n, r - ] : this._mode === G.AB || this._mode === G.SIDE ? [e, t] : [e]).filter((e) => e.media); + ] : this._mode === W.AB || this._mode === W.SIDE ? [e, t] : [e]).filter((e) => e.media); } _buildGenInfoSidebarContent(e) { let t = this._getGenFields(e)?.genTime || "", n = null; try { - n = k(e); + n = E(e); } catch (e) { console.debug?.(e); } @@ -3909,34 +4214,34 @@ var dr = 0, fr = class { } _renderSimple() { if (!this._mediaA) { - this._contentEl.appendChild(q()); + this._contentEl.appendChild(K()); return; } - let e = Y(this._mediaA, { + let e = { initialMuted: this._mfvMuted, initialPlaybackRate: this._mfvPlaybackRate - }), t = this._trackMediaControls?.(e) || e; - if (this._bindMfvPersistence?.(t), !t) { - this._contentEl.appendChild(q("Could not load media")); + }, t = He(this._mediaA, e) || J(this._mediaA, e), n = this._trackMediaControls?.(t) || t; + if (this._bindMfvPersistence?.(n), !n) { + this._contentEl.appendChild(K("Could not load media")); return; } - let n = document.createElement("div"); - n.className = "mjr-mfv-simple-container", n.appendChild(t), this._contentEl.appendChild(n); + let r = document.createElement("div"); + r.className = "mjr-mfv-simple-container", r.appendChild(n), this._contentEl.appendChild(r); } _renderAB() { - let e = this._mediaA ? Y(this._mediaA, { + let e = this._mediaA ? J(this._mediaA, { fill: !0, initialMuted: this._mfvMuted, initialPlaybackRate: this._mfvPlaybackRate - }) : null, t = this._mediaB ? Y(this._mediaB, { + }) : null, t = this._mediaB ? J(this._mediaB, { fill: !0, controls: !1, initialMuted: !0 }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t; this._bindMfvPersistence?.(n); - let i = this._mediaA ? K(this._mediaA) : "", a = this._mediaB ? K(this._mediaB) : ""; + let i = this._mediaA ? G(this._mediaA) : "", a = this._mediaB ? G(this._mediaB) : ""; if (!n && !r) { - this._contentEl.appendChild(q("Select 2 assets for A/B compare")); + this._contentEl.appendChild(K("Select 2 assets for A/B compare")); return; } if (!r) { @@ -3953,63 +4258,67 @@ var dr = 0, fr = class { s.className = "mjr-mfv-ab-layer", n && s.appendChild(n); let c = document.createElement("div"); c.className = "mjr-mfv-ab-layer mjr-mfv-ab-layer--b"; - let l = Math.round(this._abDividerX * 100); - c.style.clipPath = `inset(0 0 0 ${l}%)`, c.appendChild(r); - let u = document.createElement("div"); - u.className = "mjr-mfv-ab-divider", u.style.left = `${l}%`; - let d = this._buildGenInfoDOM(this._mediaA), f = null; - d && (f = document.createElement("div"), f.className = "mjr-mfv-geninfo-a", ur(n) && f.classList.add("mjr-mfv-geninfo--above-player"), f.appendChild(d), f.style.right = `calc(${100 - l}% + 8px)`); - let p = this._buildGenInfoDOM(this._mediaB), m = null; - p && (m = document.createElement("div"), m.className = "mjr-mfv-geninfo-b", ur(r) && m.classList.add("mjr-mfv-geninfo--above-player"), m.appendChild(p), m.style.left = `calc(${l}% + 8px)`); - let h = null; - u.addEventListener("pointerdown", (e) => { - e.preventDefault(), u.setPointerCapture(e.pointerId); + let l = Math.round(this._abDividerX * 100), u = !!n?.classList?.contains?.("mjr-mfv-player-host--studio"); + u && o.classList.add("has-studio-a"); + let d = (e) => { + u ? o.style.setProperty("--mjr-ab-x", `${e}%`) : c.style.clipPath = `inset(0 0 0 ${e}%)`; + }; + d(l), c.appendChild(r); + let f = document.createElement("div"); + f.className = "mjr-mfv-ab-divider", f.style.left = `${l}%`; + let p = this._buildGenInfoDOM(this._mediaA), m = null; + p && (m = document.createElement("div"), m.className = "mjr-mfv-geninfo-a", gr(n) && m.classList.add("mjr-mfv-geninfo--above-player"), m.appendChild(p), m.style.right = `calc(${100 - l}% + 8px)`); + let h = this._buildGenInfoDOM(this._mediaB), g = null; + h && (g = document.createElement("div"), g.className = "mjr-mfv-geninfo-b", gr(r) && g.classList.add("mjr-mfv-geninfo--above-player"), g.appendChild(h), g.style.left = `calc(${l}% + 8px)`); + let _ = null; + f.addEventListener("pointerdown", (e) => { + e.preventDefault(), f.setPointerCapture(e.pointerId); try { - h?.abort(); + _?.abort(); } catch {} - h = new AbortController(); - let t = h.signal, n = o.getBoundingClientRect(); - u.addEventListener("pointermove", (e) => { + _ = new AbortController(); + let t = _.signal, n = o.getBoundingClientRect(); + f.addEventListener("pointermove", (e) => { let t = Math.max(.02, Math.min(.98, (e.clientX - n.left) / n.width)); this._abDividerX = t; let r = Math.round(t * 100); - c.style.clipPath = `inset(0 0 0 ${r}%)`, u.style.left = `${r}%`, f && (f.style.right = `calc(${100 - r}% + 8px)`), m && (m.style.left = `calc(${r}% + 8px)`); - }, { signal: t }), u.addEventListener("pointerup", () => { + d(r), f.style.left = `${r}%`, m && (m.style.right = `calc(${100 - r}% + 8px)`), g && (g.style.left = `calc(${r}% + 8px)`); + }, { signal: t }), f.addEventListener("pointerup", () => { try { - h?.abort(); + _?.abort(); } catch {} }, { signal: t }); - }, this._panelAC?.signal ? { signal: this._panelAC.signal } : void 0), o.appendChild(s), o.appendChild(c), o.appendChild(u), f && o.appendChild(f), m && o.appendChild(m), o.appendChild(J("A", "left")), o.appendChild(J("B", "right")), this._contentEl.appendChild(o); + }, this._panelAC?.signal ? { signal: this._panelAC.signal } : void 0), o.appendChild(s), o.appendChild(c), o.appendChild(f), m && o.appendChild(m), g && o.appendChild(g), o.appendChild(q("A", "left")), o.appendChild(q("B", "right")), this._contentEl.appendChild(o); } _renderSide() { - let e = this._mediaA ? Y(this._mediaA, { + let e = this._mediaA ? J(this._mediaA, { initialMuted: this._mfvMuted, initialPlaybackRate: this._mfvPlaybackRate - }) : null, t = this._mediaB ? Y(this._mediaB, { + }) : null, t = this._mediaB ? J(this._mediaB, { controls: !1, initialMuted: !0 }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t; this._bindMfvPersistence?.(n); - let i = this._mediaA ? K(this._mediaA) : "", a = this._mediaB ? K(this._mediaB) : ""; + let i = this._mediaA ? G(this._mediaA) : "", a = this._mediaB ? G(this._mediaB) : ""; if (!n && !r) { - this._contentEl.appendChild(q("Select 2 assets for Side-by-Side")); + this._contentEl.appendChild(K("Select 2 assets for Side-by-Side")); return; } let o = document.createElement("div"); o.className = "mjr-mfv-side-container"; let s = document.createElement("div"); - s.className = "mjr-mfv-side-panel", n ? s.appendChild(n) : s.appendChild(q(" - ")), s.appendChild(J("A", "left")); + s.className = "mjr-mfv-side-panel", n ? s.appendChild(n) : s.appendChild(K(" - ")), s.appendChild(q("A", "left")); let c = i === "audio" ? null : this._buildGenInfoDOM(this._mediaA); if (c) { let e = document.createElement("div"); - e.className = "mjr-mfv-geninfo-a", ur(n) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(c), s.appendChild(e); + e.className = "mjr-mfv-geninfo-a", gr(n) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(c), s.appendChild(e); } let l = document.createElement("div"); - l.className = "mjr-mfv-side-panel", r ? l.appendChild(r) : l.appendChild(q(" - ")), l.appendChild(J("B", "right")); + l.className = "mjr-mfv-side-panel", r ? l.appendChild(r) : l.appendChild(K(" - ")), l.appendChild(q("B", "right")); let u = a === "audio" ? null : this._buildGenInfoDOM(this._mediaB); if (u) { let e = document.createElement("div"); - e.className = "mjr-mfv-geninfo-b", ur(r) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(u), l.appendChild(e); + e.className = "mjr-mfv-geninfo-b", gr(r) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(u), l.appendChild(e); } o.appendChild(s), o.appendChild(l), this._contentEl.appendChild(o); } @@ -4033,7 +4342,7 @@ var dr = 0, fr = class { } ]; if (!e.filter((e) => e.media).length) { - this._contentEl.appendChild(q("Select up to 4 assets for Grid Compare")); + this._contentEl.appendChild(K("Select up to 4 assets for Grid Compare")); return; } let t = document.createElement("div"); @@ -4041,19 +4350,19 @@ var dr = 0, fr = class { for (let { media: n, label: r } of e) { let e = document.createElement("div"); if (e.className = "mjr-mfv-grid-cell", n) { - let t = K(n), i = r === "A", a = Y(n, { + let t = G(n), i = r === "A", a = J(n, { controls: i, initialMuted: !i || this._mfvMuted, initialPlaybackRate: i ? this._mfvPlaybackRate : 1 }), o = this._trackMediaControls?.(a) || a; - if (i && this._bindMfvPersistence?.(o), o ? e.appendChild(o) : e.appendChild(q(" - ")), e.appendChild(J(r, r === "A" || r === "C" ? "left" : "right")), t !== "audio") { + if (i && this._bindMfvPersistence?.(o), o ? e.appendChild(o) : e.appendChild(K(" - ")), e.appendChild(q(r, r === "A" || r === "C" ? "left" : "right")), t !== "audio") { let t = this._buildGenInfoDOM(n); if (t) { let n = document.createElement("div"); - n.className = `mjr-mfv-geninfo-${r.toLowerCase()}`, ur(o) && n.classList.add("mjr-mfv-geninfo--above-player"), n.appendChild(t), e.appendChild(n); + n.className = `mjr-mfv-geninfo-${r.toLowerCase()}`, gr(o) && n.classList.add("mjr-mfv-geninfo--above-player"), n.appendChild(t), e.appendChild(n); } } - } else e.appendChild(q(" - ")), e.appendChild(J(r, r === "A" || r === "C" ? "left" : "right")); + } else e.appendChild(K(" - ")), e.appendChild(q(r, r === "A" || r === "C" ? "left" : "right")); t.appendChild(e); } this._contentEl.appendChild(t); @@ -4062,76 +4371,76 @@ var dr = 0, fr = class { this.element && (this._bindDocumentUiHandlers(), this.element.classList.add("is-visible"), this.element.setAttribute("aria-hidden", "false"), this.isVisible = !0); } hide() { - this.element && (this._destroyPanZoom(), this._destroyCompareSync(), this._stopEdgeResize(), this._closeGenDropdown(), Fe(this.element), this.element.classList.remove("is-visible"), this.element.setAttribute("aria-hidden", "true"), this.isVisible = !1); + this.element && (this._destroyPanZoom(), this._destroyCompareSync(), this._stopEdgeResize(), this._closeGenDropdown(), Be(this.element), this.element.classList.remove("is-visible"), this.element.setAttribute("aria-hidden", "true"), this.isVisible = !1); } _setDesktopExpanded(e) { - return Rn(this, e); + return Wn(this, e); } _activateDesktopExpandedFallback(e) { - return zn(this, e); + return Gn(this, e); } _tryElectronPopupFallback(e, t, n, r) { - return Bn(this, e, t, n, r); + return Kn(this, e, t, n, r); } popOut() { - return Vn(this); + return qn(this); } _fallbackPopout(e, t, n) { - return Hn(this, e, t, n); + return Jn(this, e, t, n); } _clearPopoutCloseWatch() { - return Un(this); + return Yn(this); } _startPopoutCloseWatch() { - return Wn(this); + return Xn(this); } _schedulePopInFromPopupClose() { - return Gn(this); + return Zn(this); } _installPopoutStyles(e) { - return Kn(this, e); + return Qn(this, e); } popIn(e) { - return qn(this, e); + return $n(this, e); } _updatePopoutBtnUI() { - return Jn(this); + return er(this); } get isPopped() { return this._isPopped || this._desktopExpanded; } _resizeCursorForDirection(e) { - return Yn(e); + return tr(e); } _getResizeDirectionFromPoint(e, t, n) { - return Xn(e, t, n); + return nr(e, t, n); } _stopEdgeResize() { - return Zn(this); + return rr(this); } _bindPanelInteractions() { - return Qn(this); - } - _initEdgeResize(e) { - return $n(this, e); - } - _initDrag(e) { - return er(this, e); - } - async _drawMediaFit(e, t, n, r, i, a, o) { - return tr(this, e, t, n, r, i, a, o); - } - _estimateGenInfoOverlayHeight(e, t, n) { - return nr(this, e, t, n); - } - _drawGenInfoOverlay(e, t, n, r, i, a) { - return rr(this, e, t, n, r, i, a); - } - async _captureView() { return ir(this); } + _initEdgeResize(e) { + return ar(this, e); + } + _initDrag(e) { + return or(this, e); + } + async _drawMediaFit(e, t, n, r, i, a, o) { + return sr(this, e, t, n, r, i, a, o); + } + _estimateGenInfoOverlayHeight(e, t, n) { + return cr(this, e, t, n); + } + _drawGenInfoOverlay(e, t, n, r, i, a) { + return lr(this, e, t, n, r, i, a); + } + async _captureView() { + return ur(this); + } dispose() { - I(this), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), this._unbindLayoutObserver(), this._stopEdgeResize(), this._clearPopoutCloseWatch(); + N(this), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), this._unbindLayoutObserver(), this._stopEdgeResize(), this._clearPopoutCloseWatch(); try { this._panelAC?.abort(), this._panelAC = null; } catch (e) { @@ -4169,7 +4478,7 @@ var dr = 0, fr = class { } this._revokePreviewBlob(), this._onSidebarPosChanged &&= (window.removeEventListener("mjr-settings-changed", this._onSidebarPosChanged), null); try { - this.element?.remove(); + Ve(this.element), this.element?.remove(); } catch (e) { console.debug?.(e); } @@ -4187,4 +4496,4 @@ var dr = 0, fr = class { this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this.isVisible = !1; } }; -export { fr as FloatingViewer }; +export { vr as FloatingViewer }; diff --git a/dist/chunks/LiveStreamTracker-B56NDtCP.js b/dist/chunks/LiveStreamTracker-C_DbXPzd.js similarity index 80% rename from dist/chunks/LiveStreamTracker-B56NDtCP.js rename to dist/chunks/LiveStreamTracker-C_DbXPzd.js index 1bfd645f..1fb365bc 100644 --- a/dist/chunks/LiveStreamTracker-B56NDtCP.js +++ b/dist/chunks/LiveStreamTracker-C_DbXPzd.js @@ -1,5 +1,6 @@ -import { J as e, o as t, r as n } from "./events-C65wdOHm.js"; -import { t as r } from "./floatingViewerManager-BzaQii21.js"; +import { Vn as e, t } from "./config-C9a-wT5M.js"; +import { t as n } from "./floatingViewerManager-B_I-SRbd.js"; +import { r } from "./events-1iwo5blr.js"; // ui/features/viewer/LiveStreamTracker.ts var i = !1, a = null, o = null, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = 0, h = !1, g = 400, _ = "kj_preview_override", v = /* @__PURE__ */ new Set([ "image/jpeg", @@ -74,12 +75,12 @@ function O(e) { let t = String(e?.node_id ?? "").trim(), n = Number(e?.step), r = Number(e?.total), i = Number.isFinite(n) && Number.isFinite(r) && r > 0 ? ` · ${n}/${r}` : ""; return `KJ Preview Override${t ? ` · Node ${t}` : ""}${i}`; } -async function k(n) { +async function k(r) { let i = ++p; try { A(); let a = await e({ - app: n, + app: r, timeoutMs: 8e3 }); if (i !== p) return; @@ -97,40 +98,40 @@ async function k(n) { h = !1; return; } - if (!r.canAcceptPreviewBlob()) return; - let n = e?.detail || null, i = D(n); + if (!n.canAcceptPreviewBlob()) return; + let r = e?.detail || null, i = D(r); if (!i) return; h = !0; - let a = String(n?.node_id ?? "").trim(); - r.feedPreviewBlob(i, { + let a = String(r?.node_id ?? "").trim(); + n.feedPreviewBlob(i, { source: "kj-preview-override", - sourceLabel: O(n), + sourceLabel: O(r), nodeId: a || null, mime: i.type, - width: Number(n?.w) || void 0, - height: Number(n?.h) || void 0, - fps: Number(n?.fps) || void 0, - step: Number.isFinite(Number(n?.step)) ? Number(n.step) : null, - total: Number.isFinite(Number(n?.total)) ? Number(n.total) : null + width: Number(r?.w) || void 0, + height: Number(r?.h) || void 0, + fps: Number(r?.fps) || void 0, + step: Number.isFinite(Number(r?.step)) ? Number(r.step) : null, + total: Number.isFinite(Number(r?.total)) ? Number(r.total) : null }); } catch (e) { console.debug?.("[MFV] KJNodes preview override error", e); } }, a.addEventListener(_, c), s = (e) => { try { - if (h && t.MFV_KJ_PREVIEW_OVERRIDE_ENABLED !== !1 || !r.canAcceptPreviewBlob()) return; - let { blob: n, nodeId: i, jobId: a } = e.detail || {}; - if (!n || !(n instanceof Blob) || (m = Date.now(), f && a && a !== f)) return; - r.feedPreviewBlob(n, { sourceLabel: i ? `Node ${i}` : null }); + if (h && t.MFV_KJ_PREVIEW_OVERRIDE_ENABLED !== !1 || !n.canAcceptPreviewBlob()) return; + let { blob: r, nodeId: i, jobId: a } = e.detail || {}; + if (!r || !(r instanceof Blob) || (m = Date.now(), f && a && a !== f)) return; + n.feedPreviewBlob(r, { sourceLabel: i ? `Node ${i}` : null }); } catch (e) { console.debug?.("[MFV] b_preview_with_metadata error", e); } }, a.addEventListener("b_preview_with_metadata", s), o = (e) => { try { - if (h && t.MFV_KJ_PREVIEW_OVERRIDE_ENABLED !== !1 || T() || !r.canAcceptPreviewBlob()) return; - let n = e.detail; - if (!n || !(n instanceof Blob)) return; - r.feedPreviewBlob(n); + if (h && t.MFV_KJ_PREVIEW_OVERRIDE_ENABLED !== !1 || T() || !n.canAcceptPreviewBlob()) return; + let r = e.detail; + if (!r || !(r instanceof Blob)) return; + n.feedPreviewBlob(r); } catch (e) { console.debug?.("[MFV] preview blob error", e); } @@ -187,17 +188,17 @@ function M(e) { function N(e) { a || (i = !0, a = (e) => { try { - if (!r.getLiveActive()) return; + if (!n.getLiveActive()) return; let t = M(e.detail?.files); if (!t) return; - r.upsertWithContent(t); + n.upsertWithContent(t); } catch (e) { console.debug?.("[MFV] generation output error", e); } - }, typeof window < "u" && window.addEventListener(n.NEW_GENERATION_OUTPUT, a), k(e), console.debug("[Majoor] LiveStreamTracker initialized")); + }, typeof window < "u" && window.addEventListener(r.NEW_GENERATION_OUTPUT, a), k(e), console.debug("[Majoor] LiveStreamTracker initialized")); } function P(e) { - a &&= (typeof window < "u" && window.removeEventListener(n.NEW_GENERATION_OUTPUT, a), null), p += 1, A(), f = null, i = !1, console.debug("[Majoor] LiveStreamTracker torn down"); + a &&= (typeof window < "u" && window.removeEventListener(r.NEW_GENERATION_OUTPUT, a), null), p += 1, A(), f = null, i = !1, console.debug("[Majoor] LiveStreamTracker torn down"); } function F() { return i; diff --git a/dist/chunks/SidebarWorkflowSection-DrCNoS04.js b/dist/chunks/SidebarWorkflowSection-DrCNoS04.js deleted file mode 100644 index 6c6e04dc..00000000 --- a/dist/chunks/SidebarWorkflowSection-DrCNoS04.js +++ /dev/null @@ -1,8225 +0,0 @@ -import { $ as e, $t as t, At as n, Ct as r, Dt as i, Et as a, Ft as o, Ht as s, It as c, Kt as l, L as u, Lt as d, Mt as f, N as p, Nt as m, O as h, Ot as g, Pt as _, Q as v, Qt as y, S as b, T as x, Tt as S, Ut as C, Vt as ee, Wt as te, X as w, Xt as T, Z as ne, _t as re, at as E, cn as ie, dt as ae, en as D, et as oe, ft as se, it as ce, jt as le, k as ue, kt as O, ln as de, lt as fe, nt as pe, ot as me, p as he, q as ge, qt as _e, rt as ve, st as ye, tn as be, tt as xe, ut as Se, w as Ce, wt as we, z as Te, zt as Ee } from "./viewerRuntimeHosts-n0pKLECw.js"; -import { Ct as De, K as Oe, N as ke, T as Ae, c as je, d as Me, f as Ne, h as Pe, j as Fe, l as Ie, m as k, o as A, p as Le, pt as Re, s as j, tt as ze, u as Be, x as Ve, y as He } from "./events-C65wdOHm.js"; -import { F as Ue, K as We, P as Ge, Y as Ke, f as qe, m as Je, p as Ye } from "./Viewer-W-G40j3K.js"; -import { t as Xe } from "./floatingViewerManager-BzaQii21.js"; -import { A as Ze, C as M, D as Qe, E as N, G as $e, J as et, K as tt, N as nt, O as P, R as rt, S as it, T as F, U as I, V as L, Y as at, _ as ot, a as st, b as ct, c as lt, d as ut, dt as R, f as dt, ft as z, g as ft, h as pt, i as mt, j as ht, k as B, l as gt, lt as V, m as _t, n as vt, nt as yt, o as bt, p as xt, r as St, rt as H, s as Ct, t as wt, u as Tt, ut as Et, y as Dt, z as Ot } from "./mjr-primevue-BRqtdXzb.js"; -import { t as kt } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { t as At } from "./viewerOpenRequest-WCeGPIlE.js"; -import { a as jt, i as Mt, n as Nt, o as Pt, r as Ft, t as It } from "./geninfoParser-CgHp-y-n.js"; -// ui/app/settings/settingsUtils.ts -var U = (e, t) => { - if (typeof e == "boolean") return e; - if (typeof e == "string") { - let t = e.trim().toLowerCase(); - if ([ - "1", - "true", - "yes", - "on" - ].includes(t)) return !0; - if ([ - "0", - "false", - "no", - "off" - ].includes(t)) return !1; - } - return !!t; -}, W = (e, t) => { - let n = Number(e); - return Number.isFinite(n) ? n : Number(t); -}, Lt = (e, t, n) => { - let r = typeof e == "string" ? e.trim() : String(e ?? ""); - return t.includes(r) ? r : n; -}, Rt = (e) => e === "__proto__" || e === "prototype" || e === "constructor", zt = (e, t) => { - let n = { ...e }; - return !t || typeof t != "object" || Object.keys(t).forEach((r) => { - if (Rt(r)) return; - let i = t[r]; - i && typeof i == "object" && !Array.isArray(i) ? n[r] = zt(e[r] || {}, i) : i !== void 0 && (n[r] = i); - }), n; -}, Bt = Object.freeze({ - small: 80, - medium: 120, - large: 180 -}), Vt = Object.freeze([ - "small", - "medium", - "large" -]), Ht = (e, t) => Math.max(60, Math.min(600, Math.round(W(e, t)))), Ut = (e = {}) => { - let t = Number(e?.minSize); - if (Number.isFinite(t)) return Ht(t, j.GRID_MIN_SIZE); - let n = Lt(String(e?.minSizePreset || "").toLowerCase(), Vt, ""); - return n ? Bt[n] : Ht(e?.minSize, j.GRID_MIN_SIZE); -}, Wt = (e = {}) => Ht(e?.minSize, j.FEED_GRID_MIN_SIZE), Gt = (e) => { - let t = Math.round(W(e, j.GRID_MIN_SIZE)); - return t <= 100 ? "small" : t >= 150 ? "large" : "medium"; -}, G = { - debug: { - safeCall: j.DEBUG_SAFE_CALL, - safeListeners: j.DEBUG_SAFE_LISTENERS, - viewer: j.DEBUG_VIEWER - }, - grid: { - pageSize: j.DEFAULT_PAGE_SIZE, - minSize: j.GRID_MIN_SIZE, - minSizePreset: Gt(j.GRID_MIN_SIZE), - gap: j.GRID_GAP, - showExtBadge: j.GRID_SHOW_BADGES_EXTENSION, - showRatingBadge: j.GRID_SHOW_BADGES_RATING, - showTagsBadge: j.GRID_SHOW_BADGES_TAGS, - showDetails: j.GRID_SHOW_DETAILS, - showFilename: j.GRID_SHOW_DETAILS_FILENAME, - showDate: j.GRID_SHOW_DETAILS_DATE, - showDimensions: j.GRID_SHOW_DETAILS_DIMENSIONS, - showGenTime: j.GRID_SHOW_DETAILS_GENTIME, - showHoverInfo: j.GRID_SHOW_HOVER_INFO, - showWorkflowDot: j.GRID_SHOW_WORKFLOW_DOT, - workflowGroupBy: j.WORKFLOW_GRID_GROUP_BY, - videoAutoplayMode: j.GRID_VIDEO_AUTOPLAY_MODE, - starColor: j.BADGE_STAR_COLOR, - badgeImageColor: j.BADGE_IMAGE_COLOR, - badgeVideoColor: j.BADGE_VIDEO_COLOR, - badgeAudioColor: j.BADGE_AUDIO_COLOR, - badgeModel3dColor: j.BADGE_MODEL3D_COLOR, - badgeDuplicateAlertColor: j.BADGE_DUPLICATE_ALERT_COLOR - }, - infiniteScroll: { - enabled: j.INFINITE_SCROLL_ENABLED, - rootMargin: j.INFINITE_SCROLL_ROOT_MARGIN, - threshold: j.INFINITE_SCROLL_THRESHOLD, - bottomGapPx: j.BOTTOM_GAP_PX - }, - siblings: { hidePngSiblings: !0 }, - autoScan: { onStartup: j.AUTO_SCAN_ON_STARTUP }, - scan: { - fastMode: !0, - jxlEnabled: !1 - }, - watcher: { - enabled: !0, - debounceMs: j.WATCHER_DEBOUNCE_MS, - dedupeTtlMs: j.WATCHER_DEDUPE_TTL_MS, - maxPending: 500, - minSize: 100, - maxSize: 4294967296 - }, - safety: { confirmDeletion: !0 }, - status: { pollInterval: j.STATUS_POLL_INTERVAL }, - viewer: { - allowPanAtZoom1: j.VIEWER_ALLOW_PAN_AT_ZOOM_1, - disableWebGL: j.VIEWER_DISABLE_WEBGL_VIDEO, - pauseDuringExecution: j.VIEWER_PAUSE_DURING_EXECUTION, - floatingPauseDuringExecution: j.FLOATING_VIEWER_PAUSE_DURING_EXECUTION, - mfvLiveDefault: j.MFV_LIVE_DEFAULT, - mfvPreviewDefault: j.MFV_PREVIEW_DEFAULT, - mfvTopbarButton: j.MFV_TOPBAR_BUTTON, - videoGradeThrottleFps: j.VIEWER_VIDEO_GRADE_THROTTLE_FPS, - scopesFps: j.VIEWER_SCOPES_FPS, - metaTtlMs: j.VIEWER_META_TTL_MS, - metaMaxEntries: j.VIEWER_META_MAX_ENTRIES, - mfvSidebarPosition: "right", - mfvPreviewMethod: j.MFV_PREVIEW_METHOD, - mfvKjPreviewOverrideEnabled: j.MFV_KJ_PREVIEW_OVERRIDE_ENABLED, - ltxavRgbFallback: !1 - }, - browser: { showFolders: !1 }, - rtHydrate: { - concurrency: j.RT_HYDRATE_CONCURRENCY, - queueMax: j.RT_HYDRATE_QUEUE_MAX, - seenMax: j.RT_HYDRATE_SEEN_MAX, - pruneBudget: j.RT_HYDRATE_PRUNE_BUDGET, - seenTtlMs: j.RT_HYDRATE_SEEN_TTL_MS - }, - observability: { - enabled: !1, - runtimeDashboardMode: "autoHide30", - verboseErrors: !1, - verboseRouteRegistrationLogs: !1, - verboseStartupLogs: !1 - }, - feed: { - minSize: j.FEED_GRID_MIN_SIZE, - showInfo: j.FEED_SHOW_INFO, - showFilename: j.FEED_SHOW_FILENAME, - showDimensions: j.FEED_SHOW_DIMENSIONS, - showDate: j.FEED_SHOW_DATE, - showGenTime: j.FEED_SHOW_GENTIME, - showWorkflowDot: j.FEED_SHOW_WORKFLOW_DOT, - showExtBadge: j.FEED_SHOW_BADGES_EXTENSION, - showRatingBadge: j.FEED_SHOW_BADGES_RATING, - showTagsBadge: j.FEED_SHOW_BADGES_TAGS - }, - sidebar: { - position: "right", - showPreviewThumb: !0, - widthPx: 360, - assetBadgeEnabled: j.SIDEBAR_ASSET_BADGE_ENABLED - }, - probeBackend: { mode: "auto" }, - i18n: { followComfyLanguage: !0 }, - metadataFallback: { - image: !0, - media: !0 - }, - paths: { - outputDirectory: "", - inputDirectory: "", - indexDirectory: "", - workflowRoots: "" - }, - db: { - timeoutMs: 5e3, - maxConnections: 10, - queryTimeoutMs: 1e3 - }, - ratingTagsSync: { enabled: !0 }, - cache: { tagsTTLms: 3e4 }, - search: { maxResults: j.SEARCH_DEFAULT_LIMIT }, - ai: { - vectorSearchEnabled: !0, - vectorCaptionOnIndex: !1, - verboseAiLogs: !1 - }, - executionGrouping: { enabled: j.EXECUTION_GROUPING_ENABLED }, - workflowMinimap: { - enabled: j.WORKFLOW_MINIMAP_ENABLED, - nodeColors: !0, - showLinks: !0, - showGroups: !0, - renderBypassState: !0, - renderErrorState: !0, - showViewport: !0, - showNodeLabels: !1, - size: "comfortable" - }, - ui: { - cardHoverColor: j.UI_CARD_HOVER_COLOR, - cardSelectionColor: j.UI_CARD_SELECTION_COLOR, - ratingColor: j.UI_RATING_COLOR, - tagColor: j.UI_TAG_COLOR - }, - security: { - safeMode: !1, - allowWrite: !0, - requireAuth: !1, - allowRemoteWrite: !1, - allowInsecureTokenTransport: !1, - allowDelete: !0, - allowRename: !0, - allowOpenInFolder: !0, - allowResetIndex: !0, - apiToken: "", - tokenConfigured: !1, - tokenHint: "" - } -}, Kt = () => { - try { - let e = Pe.get(de); - if (!e) return { ...G }; - let t = JSON.parse(e), n = t && typeof t == "object" && Number.isInteger(t.version) && t.data && typeof t.data == "object"; - if (!n && (!t || typeof t != "object" || Array.isArray(t))) return { ...G }; - if (n && Number(t.version) > 1) return console.warn("[Majoor] settings schema version is newer than this build, using defaults"), { ...G }; - let r = n ? t.data : t, i = /* @__PURE__ */ new Set(/* @__PURE__ */ "debug.grid.infiniteScroll.siblings.autoScan.scan.watcher.status.viewer.rtHydrate.observability.feed.sidebar.probeBackend.i18n.paths.db.ratingTagsSync.cache.search.ai.executionGrouping.workflowMinimap.ui.security.safety".split(".")), a = {}; - if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) i.has(e) && (a[e] = t); - let o = zt(G, a); - if (!n) try { - K(o); - } catch (e) { - console.debug?.(e); - } - return o; - } catch (e) { - return console.warn("[Majoor] settings load failed, using defaults", e), { ...G }; - } -}, K = (e) => { - try { - let t = JSON.parse(JSON.stringify(e || {})); - t?.security && typeof t.security == "object" && (t.security.apiToken = ""); - let n = { - version: 1, - data: t - }; - if (!Pe.set("mjrSettings", JSON.stringify(n))) throw Error("SettingsStore rejected the write"); - } catch (e) { - console.warn("[Majoor] settings save failed", e); - try { - let e = Date.now(); - e - (Number(window?._mjrSettingsSaveFailAt || 0) || 0) > 3e4 && (window._mjrSettingsSaveFailAt = e, We(k("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked)."))); - } catch (e) { - console.debug?.(e); - } - try { - Ke("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); - } catch (e) { - console.debug?.(e); - } - } -}, q = (e) => { - let t = Number(j.MAX_PAGE_SIZE) || 2e3, n = Math.max(50, Math.min(t, Number(e.grid?.pageSize) || j.DEFAULT_PAGE_SIZE)); - A.DEFAULT_PAGE_SIZE = n, A.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, A.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? j.EXECUTION_GROUPING_ENABLED), A.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || j.STATUS_POLL_INTERVAL), A.DEBUG_SAFE_CALL = !!e.debug?.safeCall, A.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, A.DEBUG_VIEWER = !!e.debug?.viewer, A.GRID_MIN_SIZE = Ut(e.grid), A.FEED_GRID_MIN_SIZE = Wt(e.feed), A.GRID_GAP = Math.max(0, Math.min(40, Math.round(W(e.grid?.gap, j.GRID_GAP)))), A.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? j.GRID_SHOW_BADGES_EXTENSION), A.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? j.GRID_SHOW_BADGES_RATING), A.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? j.GRID_SHOW_BADGES_TAGS), A.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? j.GRID_SHOW_DETAILS), A.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? j.GRID_SHOW_DETAILS_FILENAME), A.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? j.GRID_SHOW_DETAILS_DATE), A.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? j.GRID_SHOW_DETAILS_DIMENSIONS), A.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? j.GRID_SHOW_DETAILS_GENTIME), A.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? j.GRID_SHOW_HOVER_INFO), A.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? j.GRID_SHOW_WORKFLOW_DOT); - { - let t = String(e.grid?.workflowGroupBy ?? j.WORKFLOW_GRID_GROUP_BY).toLowerCase(); - A.WORKFLOW_GRID_GROUP_BY = [ - "none", - "task", - "model", - "category" - ].includes(t) ? t : j.WORKFLOW_GRID_GROUP_BY; - } - A.FEED_SHOW_INFO = !!(e.feed?.showInfo ?? j.FEED_SHOW_INFO), A.FEED_SHOW_FILENAME = !!(e.feed?.showFilename ?? j.FEED_SHOW_FILENAME), A.FEED_SHOW_DIMENSIONS = !!(e.feed?.showDimensions ?? j.FEED_SHOW_DIMENSIONS), A.FEED_SHOW_DATE = !!(e.feed?.showDate ?? j.FEED_SHOW_DATE), A.FEED_SHOW_GENTIME = !!(e.feed?.showGenTime ?? j.FEED_SHOW_GENTIME), A.FEED_SHOW_WORKFLOW_DOT = !!(e.feed?.showWorkflowDot ?? j.FEED_SHOW_WORKFLOW_DOT), A.FEED_SHOW_BADGES_EXTENSION = !!(e.feed?.showExtBadge ?? j.FEED_SHOW_BADGES_EXTENSION), A.FEED_SHOW_BADGES_RATING = !!(e.feed?.showRatingBadge ?? j.FEED_SHOW_BADGES_RATING), A.FEED_SHOW_BADGES_TAGS = !!(e.feed?.showTagsBadge ?? j.FEED_SHOW_BADGES_TAGS); - { - let t = e.grid?.videoAutoplayMode ?? j.GRID_VIDEO_AUTOPLAY_MODE; - t ??= e.grid?.videoHoverAutoplay === !1 ? "off" : "hover", t === !0 && (t = "hover"), t === !1 && (t = "off"), t !== "hover" && t !== "always" && t !== "off" && (t = "hover"), A.GRID_VIDEO_AUTOPLAY_MODE = t; - } - let r = (e, t) => { - let n = String(e || "").trim(); - return /^[0-9a-fA-F]{6}$/.test(n) && (n = `#${n}`), /^#[0-9a-fA-F]{3,8}$/.test(n) ? n : t; - }; - A.BADGE_STAR_COLOR = r(e.grid?.starColor, j.BADGE_STAR_COLOR), A.BADGE_IMAGE_COLOR = r(e.grid?.badgeImageColor, j.BADGE_IMAGE_COLOR), A.BADGE_VIDEO_COLOR = r(e.grid?.badgeVideoColor, j.BADGE_VIDEO_COLOR), A.BADGE_AUDIO_COLOR = r(e.grid?.badgeAudioColor, j.BADGE_AUDIO_COLOR), A.BADGE_MODEL3D_COLOR = r(e.grid?.badgeModel3dColor, j.BADGE_MODEL3D_COLOR), A.BADGE_DUPLICATE_ALERT_COLOR = r(e.grid?.badgeDuplicateAlertColor, j.BADGE_DUPLICATE_ALERT_COLOR), A.UI_CARD_HOVER_COLOR = r(e.ui?.cardHoverColor, j.UI_CARD_HOVER_COLOR), A.UI_CARD_SELECTION_COLOR = r(e.ui?.cardSelectionColor, j.UI_CARD_SELECTION_COLOR), A.UI_RATING_COLOR = r(e.ui?.ratingColor, j.UI_RATING_COLOR), A.UI_TAG_COLOR = r(e.ui?.tagColor, j.UI_TAG_COLOR); - try { - let e = Array.from(document.querySelectorAll(".mjr-assets-manager")); - for (let t of e) t.style.setProperty("--mjr-star-active", A.BADGE_STAR_COLOR), t.style.setProperty("--mjr-badge-image", A.BADGE_IMAGE_COLOR), t.style.setProperty("--mjr-badge-video", A.BADGE_VIDEO_COLOR), t.style.setProperty("--mjr-badge-audio", A.BADGE_AUDIO_COLOR), t.style.setProperty("--mjr-badge-model3d", A.BADGE_MODEL3D_COLOR), t.style.setProperty("--mjr-badge-duplicate-alert", A.BADGE_DUPLICATE_ALERT_COLOR), t.style.setProperty("--mjr-card-hover-color", A.UI_CARD_HOVER_COLOR), t.style.setProperty("--mjr-card-selection-color", A.UI_CARD_SELECTION_COLOR), t.style.setProperty("--mjr-rating-color", A.UI_RATING_COLOR), t.style.setProperty("--mjr-tag-color", A.UI_TAG_COLOR); - } catch (e) { - console.debug?.(e); - } - A.INFINITE_SCROLL_ENABLED = !!e.infiniteScroll?.enabled, A.INFINITE_SCROLL_ROOT_MARGIN = String(e.infiniteScroll?.rootMargin || j.INFINITE_SCROLL_ROOT_MARGIN), A.INFINITE_SCROLL_THRESHOLD = Math.max(0, Math.min(1, W(e.infiniteScroll?.threshold, j.INFINITE_SCROLL_THRESHOLD))), A.BOTTOM_GAP_PX = Math.max(0, Math.min(5e3, Math.round(W(e.infiniteScroll?.bottomGapPx, j.BOTTOM_GAP_PX)))), A.VIEWER_ALLOW_PAN_AT_ZOOM_1 = !!e.viewer?.allowPanAtZoom1, A.VIEWER_DISABLE_WEBGL_VIDEO = !!e.viewer?.disableWebGL, A.VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.pauseDuringExecution ?? j.VIEWER_PAUSE_DURING_EXECUTION), A.FLOATING_VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.floatingPauseDuringExecution ?? j.FLOATING_VIEWER_PAUSE_DURING_EXECUTION), A.MFV_LIVE_DEFAULT = e.viewer?.mfvLiveDefault ?? j.MFV_LIVE_DEFAULT, A.MFV_PREVIEW_DEFAULT = e.viewer?.mfvPreviewDefault ?? j.MFV_PREVIEW_DEFAULT, A.MFV_KJ_PREVIEW_OVERRIDE_ENABLED = !!(e.viewer?.mfvKjPreviewOverrideEnabled ?? j.MFV_KJ_PREVIEW_OVERRIDE_ENABLED), A.MFV_TOPBAR_BUTTON = !!(e.viewer?.mfvTopbarButton ?? j.MFV_TOPBAR_BUTTON), A.MFV_LIVE_AUTO_OPEN = !1, A.MFV_PREVIEW_AUTO_OPEN = !1, A.MFV_NODE_STREAM_AUTO_OPEN = !1; - { - let t = String(e.viewer?.mfvPreviewMethod || j.MFV_PREVIEW_METHOD).toLowerCase(); - A.MFV_PREVIEW_METHOD = [ - "default", - "auto", - "latent2rgb", - "taesd", - "none" - ].includes(t) ? t : j.MFV_PREVIEW_METHOD; - } - { - let t = String(e.viewer?.mfvSidebarPosition || "right").toLowerCase(); - A.MFV_SIDEBAR_POSITION = [ - "left", - "right", - "bottom" - ].includes(t) ? t : "right"; - } - A.VIEWER_VIDEO_GRADE_THROTTLE_FPS = Math.max(1, Math.min(60, Math.round(W(e.viewer?.videoGradeThrottleFps, j.VIEWER_VIDEO_GRADE_THROTTLE_FPS)))), A.VIEWER_SCOPES_FPS = Math.max(1, Math.min(60, Math.round(W(e.viewer?.scopesFps, j.VIEWER_SCOPES_FPS)))), A.VIEWER_META_TTL_MS = Math.max(1e3, Math.min(6e5, Math.round(W(e.viewer?.metaTtlMs, j.VIEWER_META_TTL_MS)))), A.VIEWER_META_MAX_ENTRIES = Math.max(50, Math.min(5e3, Math.round(W(e.viewer?.metaMaxEntries, j.VIEWER_META_MAX_ENTRIES)))), A.WORKFLOW_MINIMAP_ENABLED = !!(e.workflowMinimap?.enabled ?? j.WORKFLOW_MINIMAP_ENABLED), A.RT_HYDRATE_CONCURRENCY = Math.max(1, Math.min(16, Math.round(W(e.rtHydrate?.concurrency, j.RT_HYDRATE_CONCURRENCY)))), A.RT_HYDRATE_QUEUE_MAX = Math.max(10, Math.min(5e3, Math.round(W(e.rtHydrate?.queueMax, j.RT_HYDRATE_QUEUE_MAX)))), A.RT_HYDRATE_SEEN_MAX = Math.max(1e3, Math.min(2e5, Math.round(W(e.rtHydrate?.seenMax, j.RT_HYDRATE_SEEN_MAX)))), A.RT_HYDRATE_PRUNE_BUDGET = Math.max(10, Math.min(1e4, Math.round(W(e.rtHydrate?.pruneBudget, j.RT_HYDRATE_PRUNE_BUDGET)))), A.RT_HYDRATE_SEEN_TTL_MS = Math.max(5e3, Math.min(216e5, Math.round(W(e.rtHydrate?.seenTtlMs, j.RT_HYDRATE_SEEN_TTL_MS)))), A.DELETE_CONFIRMATION = !!e.safety?.confirmDeletion, A.DEBUG_VERBOSE_ERRORS = !!e.observability?.verboseErrors, A.WATCHER_MAX_PENDING = Math.max(10, Math.min(5e3, Math.round(W(e.watcher?.maxPending, 500)))), A.WATCHER_MIN_SIZE = Math.max(0, Math.min(1e6, Math.round(W(e.watcher?.minSize, 100)))), A.WATCHER_MAX_SIZE = Math.max(1e5, Math.min(17179869184, Math.round(W(e.watcher?.maxSize, 4294967296)))), A.DB_TIMEOUT_MS = Math.max(1e3, Math.min(3e4, Math.round(W(e.db?.timeoutMs, 5e3)))), A.DB_MAX_CONNECTIONS = Math.max(1, Math.min(100, Math.round(W(e.db?.maxConnections, 10)))), A.DB_QUERY_TIMEOUT_MS = Math.max(500, Math.min(1e4, Math.round(W(e.db?.queryTimeoutMs, 1e3)))), A.SIDEBAR_ASSET_BADGE_ENABLED = !!(e.sidebar?.assetBadgeEnabled ?? j.SIDEBAR_ASSET_BADGE_ENABLED), A.SEARCH_REQUEST_LIMIT = Math.max(10, Math.min(j.MAX_PAGE_SIZE || 2e3, Math.round(W(e.search?.maxResults, j.SEARCH_DEFAULT_LIMIT)))); -}; -async function qt() { - try { - let e = await me(); - if (!e?.ok) return; - let n = e.data?.prefs; - if (!n || typeof n != "object") return; - let r = Kt(); - if (r.security = r.security || {}, r.security.safeMode = U(n.safe_mode, r.security.safeMode), r.security.allowWrite = U(n.allow_write, r.security.allowWrite), r.security.requireAuth = U(n.require_auth, r.security.requireAuth), r.security.allowRemoteWrite = U(n.allow_remote_write, r.security.allowRemoteWrite), r.security.allowInsecureTokenTransport = U(n.allow_insecure_token_transport, r.security.allowInsecureTokenTransport), r.security.allowDelete = U(n.allow_delete, r.security.allowDelete), r.security.allowRename = U(n.allow_rename, r.security.allowRename), r.security.allowOpenInFolder = U(n.allow_open_in_folder, r.security.allowOpenInFolder), r.security.allowResetIndex = U(n.allow_reset_index, r.security.allowResetIndex), r.security.tokenConfigured = U(n.token_configured, r.security.tokenConfigured), r.security.tokenHint = String(n.token_hint || "").trim(), !String(r.security.apiToken || "").trim()) try { - let e = await Te(), n = String(e?.data?.token || "").trim(); - e?.ok && n && t(n); - } catch (e) { - console.debug?.(e); - } - K(r), q(r), Ke("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); - } catch (e) { - console.warn("[Majoor] failed to sync backend security settings", e); - } -} -async function Jt() { - try { - let e = await fe(); - if (!e?.ok) return; - let t = e.data?.prefs; - if (!t || typeof t != "object") return; - let n = Kt(); - n.ai = n.ai || {}, n.ai.vectorSearchEnabled = U(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = U(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), n.ai.vectorIndexOnScan = U(t.index_on_scan ?? t.indexOnScan, n.ai.vectorIndexOnScan ?? !1), n.ai.vectorUnloadAfterUse = U(t.unload_after_use ?? t.unloadAfterUse, n.ai.vectorUnloadAfterUse ?? !1), n.ai.vectorConcurrency = Math.max(1, Math.min(16, Math.floor(Number(t.concurrency ?? n.ai.vectorConcurrency ?? 1) || 1))), K(n), q(n), Ke("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); - } catch (e) { - console.warn("[Majoor] failed to sync backend vector search settings", e); - } -} -async function Yt() { - try { - let e = await w(); - if (!e?.ok) return; - let t = e.data?.prefs; - if (!t || typeof t != "object") return; - let n = Kt(); - n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = U(t.enabled, n.executionGrouping.enabled ?? j.EXECUTION_GROUPING_ENABLED), K(n), q(n), Ke("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); - } catch (e) { - console.warn("[Majoor] failed to sync backend execution grouping settings", e); - } -} -// ui/app/settings/settingsRuntime.ts -var Xt = "mjr-runtime-status-dashboard", Zt = 3e4; -function Qt() { - try { - let e = Kt(), t = String(e?.observability?.runtimeDashboardMode || G.observability.runtimeDashboardMode); - return [ - "autoHide30", - "always", - "hidden" - ].includes(t) ? t : "autoHide30"; - } catch { - return "autoHide30"; - } -} -function $t() { - try { - document.getElementById(Xt)?.remove?.(); - } catch (e) { - console.debug?.(e); - } -} -function en() { - try { - window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ && (clearTimeout(window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__), window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = null); - } catch (e) { - console.debug?.(e); - } -} -function tn(e, t) { - let n = t === "auth" ? "__mjrAuthLine" : "__mjrMetricsLine"; - if (e?.[n]) return e[n]; - let r = document.createElement("div"); - return r.style.whiteSpace = "nowrap", r.style.lineHeight = "1.35", t === "auth" && (r.style.marginTop = "4px", r.style.fontWeight = "600"), e.appendChild(r), e[n] = r, r; -} -function nn(e) { - let t = String(e?.token_hint || "").trim(), n = y(), r = t || (n ? "(session)" : ""), i = e?.allow_write !== !1, a = e?.require_auth === !0, o = e?.token_configured === !0; - return i ? n ? { - text: k("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: r || "(session)" }), - color: "#7ee0a0" - } : a && o ? { - text: k("runtime.writeAuthMissing", "Write auth: missing in this browser {tokenHint}", { tokenHint: r || "(server token configured)" }), - color: "#f1c36d" - } : a ? { - text: k("runtime.writeAuthRequired", "Write auth: required"), - color: "#f1c36d" - } : e && typeof e == "object" ? { - text: k("runtime.writeAuthNotRequired", "Write auth: not required"), - color: "#8fd0ff" - } : { - text: k("runtime.writeAuthUnknown", "Write auth: unknown"), - color: "#c8ced8" - } : { - text: k("runtime.writeAuthBlocked", "Write auth: writes blocked by server"), - color: "#ff9b9b" - }; -} -function rn() { - try { - if (Qt() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return $t(), null; - let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(Xt); - if (!e) { - try { - t?.remove?.(); - } catch (e) { - console.debug?.(e); - } - return null; - } - try { - let t = String(getComputedStyle(e).position || "").toLowerCase(); - t && t !== "static" || (e.style.position = "relative"); - } catch (e) { - console.debug?.(e); - } - let n = document.getElementById(Xt); - return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = Xt, n.style.position = "absolute", n.style.bottom = "10px", n.style.right = "10px", n.style.zIndex = "9999", n.style.padding = "6px 10px", n.style.borderRadius = "10px", n.style.border = "1px solid rgba(255,255,255,0.16)", n.style.background = "rgba(0,0,0,0.45)", n.style.backdropFilter = "blur(4px)", n.style.color = "var(--content-fg, #fff)", n.style.fontSize = "11px", n.style.pointerEvents = "none", n.style.display = "flex", n.style.flexDirection = "column", e.appendChild(n)), n; - } catch { - return null; - } -} -async function an() { - let e = rn(); - if (!e) return !1; - let t = tn(e, "metrics"), n = tn(e, "auth"); - try { - let [r, i] = await Promise.all([E(), me()]), a = k("runtime.unavailable", "Runtime: unavailable"); - if (!r?.ok || !r?.data) t.textContent = a; - else { - let e = r.data.db || {}, n = r.data.index || {}, i = r.data.watcher || {}, o = Number(e.active_connections || 0), s = Number(n.enrichment_queue_length || 0), c = Number(i.pending_files || 0); - t.textContent = k("runtime.metricsLine", "DB active: {active} | Enrich Q: {enrichQ} | Watcher pending: {pending}", { - active: o, - enrichQ: s, - pending: c - }), a = k("runtime.metricsTitle", "Runtime Metrics\nDB active connections: {active}\nEnrichment queue: {enrichQ}\nWatcher pending files: {pending}", { - active: o, - enrichQ: s, - pending: c - }); - } - let o = nn(i?.data?.prefs || null); - return n.textContent = o.text, n.style.color = o.color, e.title = `${a}\n${o.text}`, !0; - } catch { - return t.textContent = k("runtime.unavailable", "Runtime: unavailable"), n.textContent = k("runtime.writeAuthUnknown", "Write auth: unknown"), n.style.color = "#c8ced8", e.title = `${k("runtime.unavailable", "Runtime: unavailable")}\n${n.textContent}`, !0; - } -} -function on() { - try { - let e = Qt(); - if (e === "hidden") { - window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, en(), $t(); - return; - } - window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ || (window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ = (e) => { - if (e?.detail?.key !== "observability.runtimeDashboardMode") return; - let t = Qt(); - window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", en(), $t(), t !== "hidden" && on(); - }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, en(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => { - window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, $t(); - }, Zt)), an().catch(() => {}), window.__MJR_RUNTIME_STATUS_INFLIGHT__ ?? (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1), window.__MJR_RUNTIME_STATUS_MISS_COUNT__ ?? (window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0), window.__MJR_RUNTIME_STATUS_INTERVAL__ || (window.__MJR_RUNTIME_STATUS_INTERVAL__ = setInterval(() => { - window.__MJR_RUNTIME_STATUS_INFLIGHT__ || (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !0, an().then((e) => { - e ? window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0 : window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = Number(window.__MJR_RUNTIME_STATUS_MISS_COUNT__ || 0) + 1; - }).catch(() => {}).finally(() => { - window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1; - })); - }, 1e4)); - } catch (e) { - console.debug?.(e); - } -} -// ui/utils/debounce.ts -var sn = 300; -function cn(e, t = sn) { - let n, r = (...r) => { - clearTimeout(n), n = setTimeout(() => e(...r), t); - }; - return r.cancel = () => { - clearTimeout(n); - }, r.flush = (...t) => { - clearTimeout(n), e(...t); - }, r; -} -// ui/app/settings/settingsGrid.ts -var J = "Majoor", ln = "Majoor Assets Manager"; -function un(e, t, n) { - let r = (e, t) => [ - ln, - e, - t - ], i = (e) => [ - ln, - k("cat.cards", "Cards"), - e - ], a = (e) => [ - ln, - k("cat.badges", "Badges"), - e - ], o = (e) => [ - ln, - k("cat.badges", "Badges"), - e - ], s = (e, t) => { - let n = String(e || "").trim(); - return /^[0-9a-fA-F]{6}$/.test(n) && (n = `#${n}`), /^#[0-9a-fA-F]{6}$/.test(n) ? n.toUpperCase() : t; - }; - t.grid?.minSizePreset || (t.grid = t.grid || {}, t.grid.minSizePreset = Gt(t.grid.minSize), K(t)), e({ - id: `${J}.Cards.ThumbSize`, - category: i(k("setting.grid.cardSize.group", "Card size")), - name: k("setting.grid.cardSize.name", "Majoor: Card Size"), - tooltip: k("setting.grid.cardSize.desc", "Choose the card size preset used by the grid layout."), - type: "combo", - defaultValue: (() => { - let e = Lt(String(t.grid?.minSizePreset || "").toLowerCase(), Vt, Gt(t.grid?.minSize)), n = { - small: k("setting.grid.cardSize.small", "Small"), - medium: k("setting.grid.cardSize.medium", "Medium"), - large: k("setting.grid.cardSize.large", "Large") - }; - return n[e] || n.medium; - })(), - options: [ - k("setting.grid.cardSize.small", "Small"), - k("setting.grid.cardSize.medium", "Medium"), - k("setting.grid.cardSize.large", "Large") - ], - onChange: (e) => { - let r = String(e || "").trim().toLowerCase(), i = k("setting.grid.cardSize.small", "Small").toLowerCase(), a = k("setting.grid.cardSize.medium", "Medium").toLowerCase(), o = k("setting.grid.cardSize.large", "Large").toLowerCase(), s = "medium"; - r === i || r === "small" || r === "petit" ? s = "small" : r === o || r === "large" || r === "grand" ? s = "large" : (r === a || r === "medium" || r === "moyen") && (s = "medium"), t.grid.minSizePreset = s, t.grid.minSize = Bt[s], K(t), q(t), n("grid.minSizePreset"); - } - }), e({ - id: `${J}.Cards.CustomThumbSize`, - category: i(k("setting.grid.cardSize.group", "Card size")), - name: "Majoor: Custom Card Size (px)", - tooltip: "Set the minimum card width used by the main grid layout (60-600 px).", - type: "number", - defaultValue: Math.max(60, Math.min(600, Number(t.grid?.minSize) || 120)), - attrs: { - min: 60, - max: 600, - step: 10 - }, - onChange: (e) => { - let r = Math.max(60, Math.min(600, Math.round(Number(e) || 120))); - t.grid.minSize = r, t.grid.minSizePreset = Gt(r), K(t), q(t), n("grid.minSize"); - } - }), e({ - id: `${J}.Grid.ShowDetails`, - category: i("Show card details"), - name: "Show metadata panel", - tooltip: "Show the bottom details panel on asset cards (filename, date, etc.)", - type: "boolean", - defaultValue: !!t.grid?.showDetails, - onChange: (e) => { - t.grid.showDetails = !!e, K(t), q(t), n("grid.showDetails"); - } - }), e({ - id: `${J}.Grid.ShowFilename`, - category: i("Show filename"), - name: "Show filename", - tooltip: "Display filename in details panel", - type: "boolean", - defaultValue: !!t.grid?.showFilename, - onChange: (e) => { - t.grid.showFilename = !!e, K(t), q(t), n("grid.showFilename"); - } - }), e({ - id: `${J}.Grid.ShowDate`, - category: i("Show date/time"), - name: "Show date/time", - tooltip: "Display date and time in details panel", - type: "boolean", - defaultValue: !!t.grid?.showDate, - onChange: (e) => { - t.grid.showDate = !!e, K(t), q(t), n("grid.showDate"); - } - }), e({ - id: `${J}.Grid.ShowDimensions`, - category: i("Show dimensions"), - name: "Show dimensions", - tooltip: "Display resolution (WxH) in details panel", - type: "boolean", - defaultValue: !!t.grid?.showDimensions, - onChange: (e) => { - t.grid.showDimensions = !!e, K(t), q(t), n("grid.showDimensions"); - } - }), e({ - id: `${J}.Grid.ShowGenTime`, - category: i("Show generation time"), - name: "Show generation time", - tooltip: "Display seconds taken to generate the asset (if available)", - type: "boolean", - defaultValue: !!(t.grid?.showGenTime ?? j.GRID_SHOW_DETAILS_GENTIME), - onChange: (e) => { - t.grid.showGenTime = !!e, K(t), q(t), n("grid.showGenTime"); - } - }), e({ - id: `${J}.Grid.ShowHoverInfo`, - category: i("Show prompt on hover"), - name: "Show prompt on hover", - tooltip: "Show positive prompt and generation time as a tooltip overlay when hovering over a card thumbnail. Does not block video play-on-hover.", - type: "boolean", - defaultValue: !!(t.grid?.showHoverInfo ?? j.GRID_SHOW_HOVER_INFO), - onChange: (e) => { - t.grid.showHoverInfo = !!e, K(t), q(t), n("grid.showHoverInfo"); - } - }), e({ - id: `${J}.Grid.ShowWorkflowDot`, - category: i("Show workflow dot"), - name: "Show workflow indicator", - tooltip: "Display the green dot indicating workflow metadata availability (bottom right of card)", - type: "boolean", - defaultValue: !!t.grid?.showWorkflowDot, - onChange: (e) => { - t.grid.showWorkflowDot = !!e, K(t), q(t), n("grid.showWorkflowDot"); - } - }), e({ - id: `${J}.Grid.ShowExtBadge`, - category: a("Show format badges"), - name: "Show format badges", - tooltip: "Display format badges (e.g. JPG, MP4) on thumbnails", - type: "boolean", - defaultValue: !!t.grid?.showExtBadge, - onChange: (e) => { - t.grid.showExtBadge = !!e, K(t), q(t), n("grid.showExtBadge"); - } - }), e({ - id: `${J}.Grid.ShowRatingBadge`, - category: a("Show rating badges"), - name: "Show ratings", - tooltip: "Display star ratings on thumbnails", - type: "boolean", - defaultValue: !!t.grid?.showRatingBadge, - onChange: (e) => { - t.grid.showRatingBadge = !!e, K(t), q(t), n("grid.showRatingBadge"); - } - }), e({ - id: `${J}.Grid.ShowTagsBadge`, - category: a("Show tags badges"), - name: "Show tags", - tooltip: "Display a small indicator if an asset has tags", - type: "boolean", - defaultValue: !!t.grid?.showTagsBadge, - onChange: (e) => { - t.grid.showTagsBadge = !!e, K(t), q(t), n("grid.showTagsBadge"); - } - }), e({ - id: `${J}.Badges.StarColor`, - category: o(k("setting.starColor", "Star color")), - name: k("setting.starColor", "Majoor: Star color"), - tooltip: k("setting.starColor.tooltip", "Color of rating stars on thumbnails (hex, e.g. #FFD45A)"), - type: "color", - defaultValue: s(t.grid?.starColor, j.BADGE_STAR_COLOR), - onChange: (e) => { - t.grid.starColor = s(e, j.BADGE_STAR_COLOR), K(t), q(t), n("grid.starColor"); - } - }), e({ - id: `${J}.Badges.ImageColor`, - category: o(k("setting.badgeImageColor", "Image badge color")), - name: k("setting.badgeImageColor", "Majoor: Image badge color"), - tooltip: k("setting.badgeImageColor.tooltip", "Color for image badges: PNG, JPG, WEBP, GIF, BMP, TIF (hex)"), - type: "color", - defaultValue: s(t.grid?.badgeImageColor, j.BADGE_IMAGE_COLOR), - onChange: (e) => { - t.grid.badgeImageColor = s(e, j.BADGE_IMAGE_COLOR), K(t), q(t), n("grid.badgeImageColor"); - } - }), e({ - id: `${J}.Badges.VideoColor`, - category: o(k("setting.badgeVideoColor", "Video badge color")), - name: k("setting.badgeVideoColor", "Majoor: Video badge color"), - tooltip: k("setting.badgeVideoColor.tooltip", "Color for video badges: MP4, WEBM, MOV, AVI, MKV (hex)"), - type: "color", - defaultValue: s(t.grid?.badgeVideoColor, j.BADGE_VIDEO_COLOR), - onChange: (e) => { - t.grid.badgeVideoColor = s(e, j.BADGE_VIDEO_COLOR), K(t), q(t), n("grid.badgeVideoColor"); - } - }), e({ - id: `${J}.Badges.AudioColor`, - category: o(k("setting.badgeAudioColor", "Audio badge color")), - name: k("setting.badgeAudioColor", "Majoor: Audio badge color"), - tooltip: k("setting.badgeAudioColor.tooltip", "Color for audio badges: MP3, WAV, OGG, FLAC (hex)"), - type: "color", - defaultValue: s(t.grid?.badgeAudioColor, j.BADGE_AUDIO_COLOR), - onChange: (e) => { - t.grid.badgeAudioColor = s(e, j.BADGE_AUDIO_COLOR), K(t), q(t), n("grid.badgeAudioColor"); - } - }), e({ - id: `${J}.Badges.Model3dColor`, - category: o(k("setting.badgeModel3dColor", "3D model badge color")), - name: k("setting.badgeModel3dColor", "Majoor: 3D model badge color"), - tooltip: k("setting.badgeModel3dColor.tooltip", "Color for 3D model badges: OBJ, FBX, GLB, GLTF (hex)"), - type: "color", - defaultValue: s(t.grid?.badgeModel3dColor, j.BADGE_MODEL3D_COLOR), - onChange: (e) => { - t.grid.badgeModel3dColor = s(e, j.BADGE_MODEL3D_COLOR), K(t), q(t), n("grid.badgeModel3dColor"); - } - }), e({ - id: `${J}.Badges.DuplicateAlertColor`, - category: o(k("setting.badgeDuplicateAlertColor", "Duplicate alert badge color")), - name: k("setting.badgeDuplicateAlertColor", "Majoor: Duplicate alert badge color"), - tooltip: k("setting.badgeDuplicateAlertColor.tooltip", "Color for duplicate extension badges (PNG+, JPG+, etc)."), - type: "color", - defaultValue: s(t.grid?.badgeDuplicateAlertColor, j.BADGE_DUPLICATE_ALERT_COLOR), - onChange: (e) => { - t.grid.badgeDuplicateAlertColor = s(e, j.BADGE_DUPLICATE_ALERT_COLOR), K(t), q(t), n("grid.badgeDuplicateAlertColor"); - } - }), e({ - id: `${J}.Grid.PageSize`, - category: r(k("cat.grid"), k("setting.grid.pagesize.name").replace("Majoor: ", "")), - name: k("setting.grid.pagesize.name"), - tooltip: k("setting.grid.pagesize.desc"), - type: "number", - defaultValue: t.grid.pageSize, - attrs: { - min: 50, - max: Number(A.MAX_PAGE_SIZE) || 2e3, - step: 50 - }, - onChange: (e) => { - let r = Number(A.MAX_PAGE_SIZE) || 2e3; - t.grid.pageSize = Math.max(50, Math.min(r, Number(e) || j.DEFAULT_PAGE_SIZE)), K(t), q(t), n("grid.pageSize"); - } - }), e({ - id: `${J}.Grid.WorkflowGroupBy`, - category: r(k("cat.grid"), "Workflow grouping"), - name: "Workflow grid grouping", - tooltip: "In Workflow scope, insert titled separators and group cards by Task, Model, or Category.", - type: "combo", - defaultValue: (() => { - let e = String(t.grid?.workflowGroupBy || j.WORKFLOW_GRID_GROUP_BY).trim().toLowerCase(), n = { - none: "None", - task: "Task", - model: "Model", - category: "Category" - }; - return n[e] || n.none; - })(), - options: [ - "None", - "Task", - "Model", - "Category" - ], - onChange: (e) => { - let r = { - None: "none", - Task: "task", - Model: "model", - Category: "category" - }[String(e || "")] || "none"; - t.grid = t.grid || {}, t.grid.workflowGroupBy = r, K(t), q(t), n("grid.workflowGroupBy"); - } - }), e({ - id: `${J}.InfiniteScroll.Enabled`, - category: r(k("cat.grid"), k("setting.nav.infinite.name").replace("Majoor: ", "")), - name: k("setting.nav.infinite.name"), - tooltip: k("setting.nav.infinite.desc"), - type: "boolean", - defaultValue: !!t.infiniteScroll?.enabled, - onChange: (e) => { - t.infiniteScroll = t.infiniteScroll || {}, t.infiniteScroll.enabled = !!e, K(t), q(t), n("infiniteScroll.enabled"); - } - }), e({ - id: `${J}.Sidebar.Position`, - category: r(k("cat.grid"), k("setting.sidebar.pos.name").replace("Majoor: ", "")), - name: k("setting.sidebar.pos.name"), - tooltip: k("setting.sidebar.pos.desc"), - type: "combo", - defaultValue: t.sidebar?.position || "right", - options: ["left", "right"], - onChange: (e) => { - t.sidebar = t.sidebar || {}, t.sidebar.position = e === "left" ? "left" : "right", K(t), n("sidebar.position"); - } - }), e({ - id: `${J}.Sidebar.ShowPreviewThumb`, - category: r(k("cat.grid"), "Sidebar preview"), - name: "Show sidebar preview thumb", - tooltip: "Show/hide the large media preview at the top of the sidebar metadata panel.", - type: "boolean", - defaultValue: !!(t.sidebar?.showPreviewThumb ?? !0), - onChange: (e) => { - t.sidebar = t.sidebar || {}, t.sidebar.showPreviewThumb = !!e, K(t), n("sidebar.showPreviewThumb"); - } - }), e({ - id: `${J}.Sidebar.AssetBadgeEnabled`, - category: r(k("cat.grid"), "Sidebar asset notification badge"), - name: "Show new asset badge on sidebar icon", - tooltip: "Display a small counter on the Majoor sidebar icon only when a new asset is indexed by Assets Manager.", - type: "boolean", - defaultValue: !!(t.sidebar?.assetBadgeEnabled ?? j.SIDEBAR_ASSET_BADGE_ENABLED), - onChange: (e) => { - t.sidebar = t.sidebar || {}, t.sidebar.assetBadgeEnabled = !!e, K(t), q(t), n("sidebar.assetBadgeEnabled"); - } - }), e({ - id: `${J}.Sidebar.WidthPx`, - category: r(k("cat.grid"), "Sidebar width"), - name: "Sidebar width (px)", - tooltip: "Set the details sidebar width in pixels (240-640).", - type: "number", - defaultValue: Math.max(240, Math.min(640, Number(t.sidebar?.widthPx) || 360)), - attrs: { - min: 240, - max: 640, - step: 10 - }, - onChange: (e) => { - t.sidebar = t.sidebar || {}, t.sidebar.widthPx = Math.max(240, Math.min(640, Math.round(Number(e) || 360))), K(t), n("sidebar.widthPx"); - } - }), e({ - id: `${J}.General.HideSiblings`, - category: r(k("cat.grid"), k("setting.siblings.hide.name").replace("Majoor: ", "")), - name: k("setting.siblings.hide.name"), - tooltip: k("setting.siblings.hide.desc"), - type: "boolean", - defaultValue: !!t.siblings?.hidePngSiblings, - onChange: (e) => { - t.siblings = t.siblings || {}, t.siblings.hidePngSiblings = !!e, K(t), n("siblings.hidePngSiblings"); - } - }), e({ - id: `${J}.Grid.VideoAutoplayMode`, - category: r(k("cat.grid"), k("setting.grid.videoAutoplayMode.name", "Video autoplay").replace("Majoor: ", "")), - name: k("setting.grid.videoAutoplayMode.name", "Majoor: Video autoplay"), - tooltip: k("setting.grid.videoAutoplayMode.desc", "Controls video thumbnail playback in the grid. Off: static frame. Hover: play on mouse hover. Always: loop while visible."), - type: "combo", - defaultValue: (() => { - let e = t.grid?.videoAutoplayMode; - e ??= t.grid?.videoHoverAutoplay === !1 ? "off" : "hover", e === !0 && (e = "hover"), e === !1 && (e = "off"), e !== "hover" && e !== "always" && e !== "off" && (e = "hover"); - let n = { - off: k("setting.grid.videoAutoplayMode.off", "Off"), - hover: k("setting.grid.videoAutoplayMode.hover", "Hover"), - always: k("setting.grid.videoAutoplayMode.always", "Always") - }; - return n[e] || n.off; - })(), - options: [ - k("setting.grid.videoAutoplayMode.off", "Off"), - k("setting.grid.videoAutoplayMode.hover", "Hover"), - k("setting.grid.videoAutoplayMode.always", "Always") - ], - onChange: (e) => { - let r = { - [k("setting.grid.videoAutoplayMode.off", "Off")]: "off", - [k("setting.grid.videoAutoplayMode.hover", "Hover")]: "hover", - [k("setting.grid.videoAutoplayMode.always", "Always")]: "always" - }[e] || "off"; - t.grid = t.grid || {}, t.grid.videoAutoplayMode = r, delete t.grid.videoHoverAutoplay, K(t), q(t), n("grid.videoAutoplayMode"); - } - }), e({ - id: `${J}.Cards.HoverColor`, - category: i("Hover color"), - name: "Majoor: Card hover color", - tooltip: "Background tint used when hovering a card (hex, e.g. #3D3D3D).", - type: "color", - defaultValue: s(t.ui?.cardHoverColor, j.UI_CARD_HOVER_COLOR), - onChange: (e) => { - t.ui = t.ui || {}, t.ui.cardHoverColor = s(e, j.UI_CARD_HOVER_COLOR), K(t), q(t), n("ui.cardHoverColor"); - } - }), e({ - id: `${J}.Cards.SelectionColor`, - category: i("Selection color"), - name: "Majoor: Card selection color", - tooltip: "Outline/accent color used for selected cards (hex, e.g. #4A90E2).", - type: "color", - defaultValue: s(t.ui?.cardSelectionColor, j.UI_CARD_SELECTION_COLOR), - onChange: (e) => { - t.ui = t.ui || {}, t.ui.cardSelectionColor = s(e, j.UI_CARD_SELECTION_COLOR), K(t), q(t), n("ui.cardSelectionColor"); - } - }), e({ - id: `${J}.Badges.RatingColor`, - category: a("Rating color"), - name: "Majoor: Rating badge color", - tooltip: "Color used for rating badge text/accent (hex, e.g. #FF9500).", - type: "color", - defaultValue: s(t.ui?.ratingColor, j.UI_RATING_COLOR), - onChange: (e) => { - t.ui = t.ui || {}, t.ui.ratingColor = s(e, j.UI_RATING_COLOR), K(t), q(t), n("ui.ratingColor"); - } - }), e({ - id: `${J}.Badges.TagColor`, - category: a("Tag color"), - name: "Majoor: Tags badge color", - tooltip: "Color used for tags badge text/accent (hex, e.g. #4A90E2).", - type: "color", - defaultValue: s(t.ui?.tagColor, j.UI_TAG_COLOR), - onChange: (e) => { - t.ui = t.ui || {}, t.ui.tagColor = s(e, j.UI_TAG_COLOR), K(t), q(t), n("ui.tagColor"); - } - }); -} -// ui/app/settings/settingsViewer.ts -var dn = "Majoor", fn = "Majoor Assets Manager"; -function pn(e, t, r) { - let i = (e, t) => [ - fn, - e, - t - ], a = (e) => i(k("cat.viewer", "Viewer"), e), o = (e) => i(k("cat.floatingViewer", "Floating Viewer"), e); - e({ - id: `${dn}.Viewer.AllowPanAtZoom1`, - category: a(k("setting.viewer.pan.name").replace("Majoor: ", "")), - name: k("setting.viewer.pan.name"), - tooltip: k("setting.viewer.pan.desc"), - type: "boolean", - defaultValue: !!t.viewer?.allowPanAtZoom1, - onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.allowPanAtZoom1 = !!e, K(t), q(t), r("viewer.allowPanAtZoom1"); - } - }), e({ - id: `${dn}.Viewer.DisableWebGL`, - category: a("Disable WebGL Video"), - name: "Disable WebGL Video", - tooltip: "Use CPU rendering (Canvas 2D) for video playback. Fixes 'black screen' issues on incompatible hardware/browsers.", - type: "boolean", - defaultValue: !!t.viewer?.disableWebGL, - onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.disableWebGL = !!e, K(t), q(t), r("viewer.disableWebGL"); - } - }), e({ - id: `${dn}.Viewer.PauseDuringExecution`, - category: a(k("setting.viewer.pauseExecution.name").replace("Majoor: ", "")), - name: k("setting.viewer.pauseExecution.name"), - tooltip: k("setting.viewer.pauseExecution.desc"), - type: "boolean", - defaultValue: !!t.viewer?.pauseDuringExecution, - onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.pauseDuringExecution = !!e, K(t), q(t), r("viewer.pauseDuringExecution"); - } - }), e({ - id: `${dn}.Viewer.FloatingPauseDuringExecution`, - category: o(k("setting.viewer.floatingPauseExecution.name").replace("Majoor: ", "")), - name: k("setting.viewer.floatingPauseExecution.name"), - tooltip: k("setting.viewer.floatingPauseExecution.desc"), - type: "boolean", - defaultValue: !!t.viewer?.floatingPauseDuringExecution, - onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.floatingPauseDuringExecution = !!e, K(t), q(t), r("viewer.floatingPauseDuringExecution"); - } - }), e({ - id: `${dn}.Browser.ShowFolders`, - category: a("Browser"), - name: "Show folders in Input / Output panels", - tooltip: "When enabled, subdirectories under the Input and Output roots are shown as folder cards in the browser grid. Disable to see only files.", - type: "boolean", - defaultValue: !!(t.browser?.showFolders ?? !1), - onChange: async (e) => { - let n = !!e, i = !!(t.browser?.showFolders ?? !1); - t.browser = t.browser || {}, t.browser.showFolders = n, K(t), q(t), r("browser.showFolders"); - try { - let e = await we(n); - if (!e?.ok) throw Error(e?.error || "Failed to update show folders setting"); - } catch (e) { - t.browser.showFolders = i, K(t), q(t), r("browser.showFolders"), D(e?.message || "Failed to update show folders setting", "error"); - } - } - }), e({ - id: `${dn}.Viewer.MfvLiveDefault`, - category: o(k("setting.viewer.mfvLiveDefault.name").replace("Majoor: ", "")), - name: k("setting.viewer.mfvLiveDefault.name"), - tooltip: k("setting.viewer.mfvLiveDefault.desc"), - type: "boolean", - defaultValue: !!(t.viewer?.mfvLiveDefault ?? j.MFV_LIVE_DEFAULT), - onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.mfvLiveDefault = !!e, K(t), q(t), r("viewer.mfvLiveDefault"); - } - }), e({ - id: `${dn}.Viewer.MfvPreviewDefault`, - category: o(k("setting.viewer.mfvPreviewDefault.name").replace("Majoor: ", "")), - name: k("setting.viewer.mfvPreviewDefault.name"), - tooltip: k("setting.viewer.mfvPreviewDefault.desc"), - type: "boolean", - defaultValue: !!(t.viewer?.mfvPreviewDefault ?? j.MFV_PREVIEW_DEFAULT), - onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.mfvPreviewDefault = !!e, K(t), q(t), r("viewer.mfvPreviewDefault"); - } - }), e({ - id: `${dn}.Viewer.MfvTopbarButton`, - category: o("Top bar Viewer button"), - name: "Show Viewer button in the top bar", - tooltip: "Show a Viewer toggle button in the ComfyUI top bar next to the queue controls. Disable to hide it (the V shortcut keeps working).", - type: "boolean", - defaultValue: !!(t.viewer?.mfvTopbarButton ?? j.MFV_TOPBAR_BUTTON), - onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.mfvTopbarButton = !!e, K(t), q(t), r("viewer.mfvTopbarButton"); - } - }), e({ - id: `${dn}.Viewer.MfvSidebarPosition`, - category: o("Node Parameters sidebar position"), - name: "Node Parameters sidebar position", - tooltip: "Position of the Node Parameters sidebar in the Floating Viewer (right, left, or bottom).", - type: "combo", - defaultValue: t.viewer?.mfvSidebarPosition || "right", - options: [ - "right", - "left", - "bottom" - ], - onChange: (e) => { - let n = [ - "left", - "right", - "bottom" - ].includes(e) ? e : "right"; - t.viewer = t.viewer || {}, t.viewer.mfvSidebarPosition = n, K(t), q(t), r("viewer.mfvSidebarPosition"); - } - }), e({ - id: `${dn}.Viewer.MfvPreviewMethod`, - category: o(k("setting.viewer.mfvPreviewMethod.name").replace("Majoor: ", "")), - name: k("setting.viewer.mfvPreviewMethod.name"), - tooltip: k("setting.viewer.mfvPreviewMethod.desc"), - type: "combo", - defaultValue: t.viewer?.mfvPreviewMethod || j.MFV_PREVIEW_METHOD, - options: [ - "taesd", - "latent2rgb", - "auto", - "default", - "none" - ], - onChange: (e) => { - let n = [ - "taesd", - "latent2rgb", - "auto", - "default", - "none" - ].includes(e) ? e : j.MFV_PREVIEW_METHOD; - t.viewer = t.viewer || {}, t.viewer.mfvPreviewMethod = n, K(t), q(t), r("viewer.mfvPreviewMethod"); - } - }), e({ - id: `${dn}.Viewer.MfvKjPreviewOverrideEnabled`, - category: o(k("setting.viewer.mfvKjPreviewOverride.name").replace("Majoor: ", "")), - name: k("setting.viewer.mfvKjPreviewOverride.name"), - tooltip: k("setting.viewer.mfvKjPreviewOverride.desc"), - type: "boolean", - defaultValue: !!(t.viewer?.mfvKjPreviewOverrideEnabled ?? j.MFV_KJ_PREVIEW_OVERRIDE_ENABLED), - onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.mfvKjPreviewOverrideEnabled = !!e, K(t), q(t), r("viewer.mfvKjPreviewOverrideEnabled"); - } - }), e({ - id: `${dn}.Viewer.LtxavRgbFallback`, - category: o("LTXAV preview fallback"), - name: "Majoor: LTXAV RGB Preview Fallback (experimental)", - tooltip: "Reuse LTXV RGB projection for LTXAV when native latent preview is unavailable. Experimental; quality may be approximate.", - type: "boolean", - defaultValue: !!t.viewer?.ltxavRgbFallback, - onChange: async (e) => { - let i = !!e, a = !!t.viewer?.ltxavRgbFallback; - t.viewer = t.viewer || {}, t.viewer.ltxavRgbFallback = i, K(t), q(t), r("viewer.ltxavRgbFallback"); - try { - let e = await n(i); - if (!e?.ok) throw Error(e?.error || "Failed to update LTXAV RGB preview fallback setting"); - } catch (e) { - t.viewer.ltxavRgbFallback = a, K(t), q(t), r("viewer.ltxavRgbFallback"), D(e?.message || "Failed to update LTXAV RGB preview fallback setting", "error"); - } - } - }); - try { - xe().then((e) => { - if (!e?.ok) return; - let n = !!e?.data?.prefs?.enabled, i = Kt(); - i.viewer = i.viewer || {}, !!i.viewer.ltxavRgbFallback !== n && (i.viewer.ltxavRgbFallback = n, Object.assign(t, i), K(i), q(i), r("viewer.ltxavRgbFallback")); - }).catch(() => {}); - } catch (e) { - console.debug?.(e); - } - ((n, i, o, s) => { - e({ - id: `${dn}.WorkflowMinimap.${n}`, - category: a(k(o).replace("Majoor: ", "")), - name: k(o), - tooltip: k(s), - type: "boolean", - defaultValue: !!t.workflowMinimap?.[i], - onChange: (e) => { - t.workflowMinimap = t.workflowMinimap || {}, t.workflowMinimap[i] = !!e, K(t), r(`workflowMinimap.${i}`); - } - }); - })("Enabled", "enabled", "setting.minimap.enabled.name", "setting.minimap.enabled.desc"); -} -// ui/app/settings/settingsScanning.ts -var mn = "Majoor", hn = "Majoor Assets Manager"; -function gn(e, t, n) { - let r = (e, t) => [ - hn, - e, - t - ]; - e({ - id: `${mn}.ExecutionGrouping.Enabled`, - category: r(k("cat.scanning"), "Execution grouping"), - name: "Execution job/stack grouping", - tooltip: "Enable or disable all live job_id / stack_id tracking, grouping, and stack finalization logic.", - type: "boolean", - defaultValue: !!(t.executionGrouping?.enabled ?? j.EXECUTION_GROUPING_ENABLED), - onChange: async (e) => { - let r = !!(t.executionGrouping?.enabled ?? j.EXECUTION_GROUPING_ENABLED), i = !!e; - t.executionGrouping = t.executionGrouping || {}, t.executionGrouping.enabled = i, K(t), q(t), n("executionGrouping.enabled"); - try { - let e = await S(i); - if (!e?.ok) throw Error(e?.error || "Failed to update execution grouping setting"); - t.executionGrouping.enabled = !!e?.data?.prefs?.enabled, K(t), q(t), n("executionGrouping.enabled"); - } catch (e) { - t.executionGrouping.enabled = r, K(t), q(t), n("executionGrouping.enabled"), D(e?.message || "Failed to update execution grouping setting", "error"); - } - } - }), e({ - id: `${mn}.AutoScan.OnStartup`, - category: r(k("cat.scanning"), k("setting.scan.startup.name").replace("Majoor: ", "")), - name: k("setting.scan.startup.name"), - tooltip: k("setting.scan.startup.desc"), - type: "boolean", - defaultValue: !!t.autoScan?.onStartup, - onChange: (e) => { - t.autoScan = t.autoScan || {}, t.autoScan.onStartup = !!e, K(t), q(t), n("autoScan.onStartup"); - } - }), e({ - id: `${mn}.Scan.FastMode`, - category: r(k("cat.scanning"), "Scan mode"), - name: "Fast scan mode", - tooltip: "Use fast scan mode for manual backfill scans (skip heavier metadata work during scan).", - type: "boolean", - defaultValue: !!(t.scan?.fastMode ?? !0), - onChange: (e) => { - t.scan = t.scan || {}, t.scan.fastMode = !!e, K(t), n("scan.fastMode"); - } - }), e({ - id: `${mn}.Scan.JpegXL`, - category: r(k("cat.scanning"), "Image formats"), - name: "JPEG XL (JXL) support (Experimental)", - tooltip: "Index and preview .jxl images. Preview generation requires JPEG XL support in Pillow or FFmpeg. Run a new scan after enabling.", - type: "boolean", - defaultValue: !!t.scan?.jxlEnabled, - onChange: async (e) => { - let r = !!t.scan?.jxlEnabled, i = !!e; - t.scan = t.scan || {}, t.scan.jxlEnabled = i, K(t), n("scan.jxlEnabled"); - try { - let e = await O(i); - if (!e?.ok) throw Error(e?.error || "Failed to update JPEG XL support"); - } catch (e) { - t.scan.jxlEnabled = r, K(t), n("scan.jxlEnabled"), D(e?.message || "Failed to update JPEG XL support", "error"); - } - } - }), oe().then((e) => { - e?.ok && (t.scan = t.scan || {}, t.scan.jxlEnabled = !!e?.data?.prefs?.enabled, K(t), n("scan.jxlEnabled")); - }).catch(() => {}), e({ - id: `${mn}.RtHydrate.Concurrency`, - category: r(k("cat.scanning"), "Hydration"), - name: "Hydrate Concurrency", - tooltip: "Maximum concurrent hydration requests for rating/tags.", - type: "number", - defaultValue: Number(t.rtHydrate?.concurrency || j.RT_HYDRATE_CONCURRENCY || 5), - attrs: { - min: 1, - max: 20, - step: 1 - }, - onChange: (e) => { - t.rtHydrate = t.rtHydrate || {}, t.rtHydrate.concurrency = Math.max(1, Math.min(20, Math.round(W(e, j.RT_HYDRATE_CONCURRENCY || 5)))), K(t), q(t), n("rtHydrate.concurrency"); - } - }); - let i = (e, t, n, r) => { - let i = Math.round(W(e, t)); - return Math.max(n, Math.min(r, i)); - }, a = (e = {}) => { - let r = []; - if (t.watcher = t.watcher || {}, typeof e.debounce_ms == "number") { - let n = Math.max(50, Math.min(5e3, Math.round(e.debounce_ms))); - t.watcher.debounceMs !== n && (t.watcher.debounceMs = n, r.push("watcher.debounceMs")); - } - if (typeof e.dedupe_ttl_ms == "number") { - let n = Math.max(100, Math.min(3e4, Math.round(e.dedupe_ttl_ms))); - t.watcher.dedupeTtlMs !== n && (t.watcher.dedupeTtlMs = n, r.push("watcher.dedupeTtlMs")); - } - r.length && (K(t), r.forEach((e) => n(e))); - }, o = async () => { - try { - let e = await Se(); - if (!e?.ok) return; - a(e.data || {}); - } catch (e) { - console.debug?.(e); - } - }; - e({ - id: `${mn}.Watcher.Enabled`, - category: r(k("cat.scanning"), k("setting.watcher.enabled.label", "Enable watcher")), - name: k("setting.watcher.name"), - tooltip: k("setting.watcher.desc") + " (env: MJR_ENABLE_WATCHER)", - type: "boolean", - defaultValue: !!t.watcher?.enabled, - onChange: async (e) => { - t.watcher = t.watcher || {}, t.watcher.enabled = !!e, K(t), n("watcher.enabled"); - try { - let r = await ee(!!e); - r?.ok || (t.watcher.enabled = !e, K(t), n("watcher.enabled"), D(r?.error || k("toast.failedToggleWatcher", "Failed to toggle watcher"), "error")); - } catch { - t.watcher.enabled = !e, K(t), n("watcher.enabled"); - } - } - }), e({ - id: `${mn}.Watcher.DebounceDelay`, - category: r(k("cat.scanning"), k("setting.watcher.debounce.label", "Watcher debounce delay")), - name: k("setting.watcher.debounce.name"), - tooltip: k("setting.watcher.debounce.desc") + " (env: MJR_WATCHER_DEBOUNCE_MS)", - type: "number", - defaultValue: t.watcher?.debounceMs ?? j.WATCHER_DEBOUNCE_MS, - attrs: { - min: 50, - max: 6e4, - step: 50 - }, - onChange: async (e) => { - let r = j.WATCHER_DEBOUNCE_MS, a = i(e, r, 50, 6e4), o = t.watcher?.debounceMs ?? r; - if (a !== o) { - t.watcher = t.watcher || {}, t.watcher.debounceMs = a, K(t); - try { - let e = await C({ debounce_ms: a }); - if (!e?.ok) throw Error(e?.error || k("setting.watcher.debounce.error")); - let r = Math.round(Number(e?.data?.debounce_ms ?? a)); - t.watcher.debounceMs = r, K(t), n("watcher.debounceMs"); - } catch (e) { - t.watcher.debounceMs = o, K(t), n("watcher.debounceMs"), D(e?.message || k("setting.watcher.debounce.error"), "error"); - } - } - } - }), e({ - id: `${mn}.Watcher.DedupeWindow`, - category: r(k("cat.scanning"), k("setting.watcher.dedupe.label", "Watcher dedupe window")), - name: k("setting.watcher.dedupe.name"), - tooltip: k("setting.watcher.dedupe.desc") + " (env: MJR_WATCHER_DEDUPE_TTL_MS)", - type: "number", - defaultValue: t.watcher?.dedupeTtlMs ?? j.WATCHER_DEDUPE_TTL_MS, - attrs: { - min: 100, - max: 12e4, - step: 100 - }, - onChange: async (e) => { - let r = j.WATCHER_DEDUPE_TTL_MS, a = i(e, r, 100, 12e4), o = t.watcher?.dedupeTtlMs ?? r; - if (a !== o) { - t.watcher = t.watcher || {}, t.watcher.dedupeTtlMs = a, K(t); - try { - let e = await C({ dedupe_ttl_ms: a }); - if (!e?.ok) throw Error(e?.error || k("setting.watcher.dedupe.error")); - let r = Math.round(Number(e?.data?.dedupe_ttl_ms ?? a)); - t.watcher.dedupeTtlMs = r, K(t), n("watcher.dedupeTtlMs"); - } catch (e) { - t.watcher.dedupeTtlMs = o, K(t), n("watcher.dedupeTtlMs"), D(e?.message || k("setting.watcher.dedupe.error"), "error"); - } - } - } - }), e({ - id: `${mn}.Watcher.MaxPending`, - category: r(k("cat.scanning"), "Watcher queue"), - name: "Watcher: max pending files", - tooltip: "Maximum number of pending watcher files kept in memory.", - type: "number", - defaultValue: Number(t.watcher?.maxPending ?? 500), - attrs: { - min: 10, - max: 5e3, - step: 10 - }, - onChange: (e) => { - t.watcher = t.watcher || {}, t.watcher.maxPending = Math.max(10, Math.min(5e3, Math.round(W(e, 500)))), K(t), q(t), n("watcher.maxPending"); - } - }), e({ - id: `${mn}.Watcher.MinSize`, - category: r(k("cat.scanning"), "Watcher file size"), - name: "Watcher: min size (bytes)", - tooltip: "Minimum file size indexed by watcher.", - type: "number", - defaultValue: Number(t.watcher?.minSize ?? 100), - attrs: { - min: 0, - max: 1e6, - step: 100 - }, - onChange: (e) => { - t.watcher = t.watcher || {}, t.watcher.minSize = Math.max(0, Math.min(1e6, Math.round(W(e, 100)))), K(t), q(t), n("watcher.minSize"); - } - }), e({ - id: `${mn}.Watcher.MaxSize`, - category: r(k("cat.scanning"), "Watcher file size"), - name: "Watcher: max size (bytes)", - tooltip: "Maximum file size indexed by watcher.", - type: "number", - defaultValue: Number(t.watcher?.maxSize ?? 4294967296), - attrs: { - min: 1e5, - max: 17179869184, - step: 1e5 - }, - onChange: (e) => { - t.watcher = t.watcher || {}, t.watcher.maxSize = Math.max(1e5, Math.min(17179869184, Math.round(W(e, 4294967296)))), K(t), q(t), n("watcher.maxSize"); - } - }); - try { - o().catch(() => {}); - } catch (e) { - console.debug?.(e); - } - e({ - id: `${mn}.RatingTagsSync.Enabled`, - category: r(k("cat.scanning"), k("setting.sync.rating.name").replace("Majoor: ", "")), - name: k("setting.sync.rating.name"), - tooltip: k("setting.sync.rating.desc"), - type: "boolean", - defaultValue: !!t.ratingTagsSync?.enabled, - onChange: (e) => { - t.ratingTagsSync = t.ratingTagsSync || {}, t.ratingTagsSync.enabled = !!e, K(t), n("ratingTagsSync.enabled"); - } - }); -} -// ui/app/settings/settingsFeed.ts -var _n = "Majoor", vn = "Majoor Assets Manager"; -function yn(e, t, n) { - let r = (e) => [ - vn, - k("cat.feed", "Generated Feed"), - e - ], i = () => { - t.feed = t.feed || {}; - }; - e({ - id: `${_n}.Feed.CardSize`, - category: r("Card size"), - name: "Feed card size (px)", - tooltip: "Set the minimum card width used by the Generated Feed layout (60-600 px).", - type: "number", - defaultValue: Math.max(60, Math.min(600, Number(t.feed?.minSize) || 120)), - attrs: { - min: 60, - max: 600, - step: 10 - }, - onChange: (e) => { - i(), t.feed.minSize = Math.max(60, Math.min(600, Math.round(Number(e) || 120))), K(t), q(t), n("feed.minSize"); - } - }), e({ - id: `${_n}.Feed.ShowInfo`, - category: r("Show info section"), - name: "Show card info section", - tooltip: "Show or hide the entire info section (filename, metadata, dots) below thumbnails in the Generated Feed.", - type: "boolean", - defaultValue: !!(t.feed?.showInfo ?? j.FEED_SHOW_INFO), - onChange: (e) => { - i(), t.feed.showInfo = !!e, K(t), q(t), n("feed.showInfo"); - } - }), e({ - id: `${_n}.Feed.ShowFilename`, - category: r("Show filename"), - name: "Show filename", - tooltip: "Display the filename on feed cards.", - type: "boolean", - defaultValue: !!(t.feed?.showFilename ?? j.FEED_SHOW_FILENAME), - onChange: (e) => { - i(), t.feed.showFilename = !!e, K(t), q(t), n("feed.showFilename"); - } - }), e({ - id: `${_n}.Feed.ShowDimensions`, - category: r("Show dimensions"), - name: "Show dimensions", - tooltip: "Display resolution (WxH) and duration on feed cards.", - type: "boolean", - defaultValue: !!(t.feed?.showDimensions ?? j.FEED_SHOW_DIMENSIONS), - onChange: (e) => { - i(), t.feed.showDimensions = !!e, K(t), q(t), n("feed.showDimensions"); - } - }), e({ - id: `${_n}.Feed.ShowDate`, - category: r("Show date/time"), - name: "Show date/time", - tooltip: "Display date and time on feed cards.", - type: "boolean", - defaultValue: !!(t.feed?.showDate ?? j.FEED_SHOW_DATE), - onChange: (e) => { - i(), t.feed.showDate = !!e, K(t), q(t), n("feed.showDate"); - } - }), e({ - id: `${_n}.Feed.ShowGenTime`, - category: r("Show generation time"), - name: "Show generation time", - tooltip: "Display the generation time badge on feed cards.", - type: "boolean", - defaultValue: !!(t.feed?.showGenTime ?? j.FEED_SHOW_GENTIME), - onChange: (e) => { - i(), t.feed.showGenTime = !!e, K(t), q(t), n("feed.showGenTime"); - } - }), e({ - id: `${_n}.Feed.ShowWorkflowDot`, - category: r("Show workflow dot"), - name: "Show workflow indicator", - tooltip: "Display the workflow availability dot on feed cards.", - type: "boolean", - defaultValue: !!(t.feed?.showWorkflowDot ?? j.FEED_SHOW_WORKFLOW_DOT), - onChange: (e) => { - i(), t.feed.showWorkflowDot = !!e, K(t), q(t), n("feed.showWorkflowDot"); - } - }), e({ - id: `${_n}.Feed.ShowExtBadge`, - category: r("Show format badges"), - name: "Show format badges", - tooltip: "Display format badges (e.g. JPG, MP4) on feed card thumbnails.", - type: "boolean", - defaultValue: !!(t.feed?.showExtBadge ?? j.FEED_SHOW_BADGES_EXTENSION), - onChange: (e) => { - i(), t.feed.showExtBadge = !!e, K(t), q(t), n("feed.showExtBadge"); - } - }), e({ - id: `${_n}.Feed.ShowRatingBadge`, - category: r("Show rating badges"), - name: "Show ratings", - tooltip: "Display star ratings on feed card thumbnails.", - type: "boolean", - defaultValue: !!(t.feed?.showRatingBadge ?? j.FEED_SHOW_BADGES_RATING), - onChange: (e) => { - i(), t.feed.showRatingBadge = !!e, K(t), q(t), n("feed.showRatingBadge"); - } - }), e({ - id: `${_n}.Feed.ShowTagsBadge`, - category: r("Show tags badges"), - name: "Show tags", - tooltip: "Display tag indicators on feed card thumbnails.", - type: "boolean", - defaultValue: !!(t.feed?.showTagsBadge ?? j.FEED_SHOW_BADGES_TAGS), - onChange: (e) => { - i(), t.feed.showTagsBadge = !!e, K(t), q(t), n("feed.showTagsBadge"); - } - }); -} -// ui/app/settings/settingsSecurity.ts -var bn = "Majoor", xn = "Majoor Assets Manager", Sn = 16, Cn = { - safeMode: !1, - allowWrite: !0, - allowDelete: !0, - allowRename: !0, - allowOpenInFolder: !0, - allowResetIndex: !0 -}; -function wn(e) { - return !!e; -} -function Tn(e, t) { - return wn(e) === wn(t); -} -function En(e) { - return typeof e == "string" ? e.trim() : ""; -} -function Dn(e) { - let t = String(e || "").trim().toLowerCase(); - return t === "localhost" || t === "127.0.0.1" || t === "::1"; -} -function On() { - return globalThis.location || globalThis.window?.location || null; -} -function kn() { - let e = On(); - if (!e) return !1; - let t = String(e.protocol || "").toLowerCase(), n = String(e.hostname || "").trim(); - return t === "http:" && !Dn(n); -} -function An(e) { - let t = globalThis.crypto; - if (!t?.getRandomValues) throw Error("Secure token generation requires crypto.getRandomValues()."); - return t.getRandomValues(e); -} -function jn(e) { - let t = Math.max(4, Number(e) || 0), n = new Uint8Array(t); - return An(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); -} -function Mn() { - return `mjr_${jn(18)}`; -} -function Nn(e) { - return String(e?.apiToken || "").trim().length >= Sn && U(e?.allowWrite, !0) && U(e?.requireAuth, !1) && !U(e?.allowRemoteWrite, !1); -} -function Pn(e) { - let t = String((e && typeof e == "object" ? e : {}).apiToken || "").trim(); - return { - apiToken: t.length >= Sn ? t : Mn(), - allowWrite: !0, - requireAuth: !0, - allowRemoteWrite: !1, - allowInsecureTokenTransport: kn() - }; -} -function Fn(e) { - let t = e || {}; - return { - safe_mode: U(t.safeMode, !1), - allow_write: U(t.allowWrite, !0), - require_auth: U(t.requireAuth, !1), - allow_remote_write: U(t.allowRemoteWrite, !1), - allow_insecure_token_transport: U(t.allowInsecureTokenTransport, !1), - allow_delete: U(t.allowDelete, !0), - allow_rename: U(t.allowRename, !0), - allow_open_in_folder: U(t.allowOpenInFolder, !0), - allow_reset_index: U(t.allowResetIndex, !0), - ...String(t.apiToken || "").trim() ? { api_token: String(t.apiToken || "").trim() } : {} - }; -} -function In(e) { - return o(Fn(e)); -} -function Ln(e) { - let t = String(e?.security?.tokenHint || "").trim(); - return t ? k("setting.sec.token.placeholderConfigured", "Token configured on server ({tokenHint}). Leave blank to keep the current server token.", { tokenHint: t }) : e?.security?.tokenConfigured ? k("setting.sec.token.placeholderConfiguredGeneric", "Token configured on server. Leave blank to keep the current server token.") : k("setting.sec.token.placeholder", "Auto-generated for this browser session."); -} -function Rn(e, n, r) { - let i = (e, t) => [ - xn, - e, - t - ]; - e({ - id: `${bn}.Safety.ConfirmDeletion`, - category: i(k("cat.security"), "Confirm before deleting"), - name: "Confirm before deleting", - tooltip: "Show a confirmation dialog before deleting files. Disabling this allows instant deletion.", - type: "boolean", - defaultValue: n.safety?.confirmDeletion !== !1, - onChange: (e) => { - Tn(n.safety?.confirmDeletion !== !1, e) || (n.safety = n.safety || {}, n.safety.confirmDeletion = !!e, K(n), q(n), r("safety.confirmDeletion")); - } - }); - let a = (t, a, o, s = "cat.security") => { - e({ - id: `${bn}.Security.${t}`, - category: i(k(s), k(a).replace("Majoor: ", "")), - name: k(a), - tooltip: k(o), - type: "boolean", - defaultValue: U(n.security?.[t], Cn[t] ?? !1), - onChange: (e) => { - if (!Tn(n.security?.[t], e)) { - n.security = n.security || {}, n.security[t] = !!e, K(n), r(`security.${t}`); - try { - In(n.security).then((e) => { - e?.ok && e.data?.prefs ? qt() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e); - }).catch(() => {}); - } catch (e) { - console.debug?.(e); - } - } - } - }); - }; - a("safeMode", "setting.sec.safe.name", "setting.sec.safe.desc"), a("allowWrite", "setting.sec.write.name", "setting.sec.write.desc"), a("allowDelete", "setting.sec.del.name", "setting.sec.del.desc"), a("allowRename", "setting.sec.ren.name", "setting.sec.ren.desc"), a("allowOpenInFolder", "setting.sec.open.name", "setting.sec.open.desc"), a("allowResetIndex", "setting.sec.reset.name", "setting.sec.reset.desc"), e({ - id: `${bn}.Security.RemoteLanPreset`, - category: i(k("cat.remote"), k("setting.sec.remoteLanPreset.name").replace("Majoor: ", "")), - name: k("setting.sec.remoteLanPreset.name"), - tooltip: k("setting.sec.remoteLanPreset.desc"), - type: "boolean", - defaultValue: Nn(n.security), - onChange: (e) => { - if (n.security = n.security || {}, Tn(n.security.remoteLanPreset, e)) return; - if (n.security.remoteLanPreset = !!e, !e) { - K(n), r("security.remoteLanPreset"); - return; - } - let i; - try { - i = Pn(n.security); - } catch (e) { - D(e?.message || k("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); - return; - } - Object.assign(n.security, i), n.security.tokenConfigured = !0, n.security.tokenHint = String(i.apiToken || "").trim() ? `...${String(i.apiToken).trim().slice(-4)}` : "", i.apiToken && t(i.apiToken), K(n), r("security.remoteLanPreset"), r("security.apiToken"), r("security.allowWrite"), r("security.requireAuth"), r("security.allowRemoteWrite"), r("security.allowInsecureTokenTransport"); - try { - In(n.security).then((e) => { - e?.ok && e.data?.prefs ? (qt(), D(k("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (D(e.error || k("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"), console.warn("[Majoor] backend remote LAN preset update failed", e.error || e)); - }).catch((e) => { - D(e?.message || k("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); - }); - } catch (e) { - console.debug?.(e); - } - } - }), e({ - id: `${bn}.Security.ApiToken`, - category: i(k("cat.remote"), k("setting.sec.token.name").replace("Majoor: ", "")), - name: k("setting.sec.token.name", "Majoor: API Token"), - tooltip: k("setting.sec.token.desc", "Store the API token used for write operations. Majoor sends it via X-MJR-Token and Authorization headers."), - type: "text", - defaultValue: n.security?.apiToken || "", - attrs: { placeholder: Ln(n) }, - onChange: (e) => { - n.security = n.security || {}; - let i = En(e); - if (En(n.security.apiToken) !== i && (n.security.apiToken = i, n.security.apiToken && (n.security.tokenConfigured = !0, n.security.tokenHint = `...${n.security.apiToken.slice(-4)}`, t(n.security.apiToken)), K(n), r("security.apiToken"), n.security.apiToken)) try { - o({ api_token: n.security.apiToken }).then((e) => { - e?.ok && e.data?.prefs ? qt() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e); - }).catch(() => {}); - } catch (e) { - console.debug?.(e); - } - } - }), a("requireAuth", "setting.sec.requireAuth.name", "setting.sec.requireAuth.desc", "cat.remote"), a("allowRemoteWrite", "setting.sec.remote.name", "setting.sec.remote.desc", "cat.remote"), a("allowInsecureTokenTransport", "setting.sec.insecureTransport.name", "setting.sec.insecureTransport.desc", "cat.remote"); -} -// ui/app/settings/settingsAdvanced.ts -var Y = "Majoor", zn = "Majoor Assets Manager"; -function Bn(t, n, o, s) { - let l = (e, t) => [ - zn, - e, - t - ], u = String(n.paths?.outputDirectory || ""), d = null, p = 0, h = null; - t({ - id: `${Y}.Paths.OutputDirectory`, - category: l(k("cat.advanced"), "Paths / Output"), - name: "Majoor: Generation Output Directory", - tooltip: "Override the ComfyUI generation output directory used by Majoor (equivalent to --output-directory). Leave empty to keep the current backend default.", - type: "text", - defaultValue: String(n.paths?.outputDirectory || ""), - attrs: { placeholder: "D:\\\\____COMFY_OUTPUTS" }, - onChange: async (e) => { - let t = String(e || "").trim(); - n.paths = n.paths || {}, n.paths.outputDirectory = t, K(n); - try { - d &&= (clearTimeout(d), null); - } catch (e) { - console.debug?.(e); - } - d = setTimeout(async () => { - d = null; - let e = ++p; - try { - h?.abort?.(); - } catch (e) { - console.debug?.(e); - } - h = typeof AbortController < "u" ? new AbortController() : null; - try { - let r = await f(t, h ? { signal: h.signal } : {}); - if (e !== p) return; - if (!r?.ok) throw Error(r?.error || k("toast.failedSetOutputDirectory", "Failed to set output directory")); - let i = String(r?.data?.output_directory || t).trim(); - n.paths.outputDirectory = i, u = i, K(n), o("paths.outputDirectory"); - } catch (t) { - if (e !== p || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return; - n.paths.outputDirectory = u, K(n), o("paths.outputDirectory"), D(t?.message || k("toast.failedSetOutputDirectory", "Failed to set output directory"), "error"); - } - }, 700); - } - }); - try { - ve().then((e) => { - if (!e?.ok) return; - let t = String(e?.data?.output_directory || "").trim(); - n.paths = n.paths || {}, n.paths.outputDirectory !== t && (n.paths.outputDirectory = t, u = t, K(n), o("paths.outputDirectory")); - }).catch(() => {}); - } catch (e) { - console.debug?.(e); - } - let y = String(n.paths?.inputDirectory || ""), b = null, x = 0, S = null, C = (e) => { - n.paths = n.paths || {}, n.paths.inputDirectory = e, K(n), Oe(s, `${Y}.Paths.InputDirectory`, e), o("paths.inputDirectory"); - }; - t({ - id: `${Y}.Paths.InputDirectory`, - category: l(k("cat.advanced"), "Paths / Input"), - name: "Majoor: Input Directory", - tooltip: "Override the folder indexed by the Inputs tab. Leave empty to use ComfyUI's input directory (--input-directory). Run a scan after changing it.", - type: "text", - defaultValue: String(n.paths?.inputDirectory || ""), - attrs: { placeholder: "D:\\ComfyUI\\input" }, - onChange: (e) => { - let t = String(e || "").trim(); - if (t === String(n.paths?.inputDirectory || "")) return; - n.paths = n.paths || {}, n.paths.inputDirectory = t, K(n), b && clearTimeout(b); - let r = ++x; - S?.abort(), b = setTimeout(async () => { - b = null, S = typeof AbortController < "u" ? new AbortController() : null; - try { - let e = await g(t, S ? { signal: S.signal } : {}); - if (r !== x) return; - if (!e?.ok) throw Error(e?.error || "Failed to set input directory"); - let n = String(e?.data?.input_directory ?? t).trim(); - y = n, C(n); - } catch (e) { - if (r !== x || e?.name === "AbortError" || e?.code === "ABORTED") return; - C(y), D(e?.message || "Failed to set input directory", "error"); - } - }, 700); - } - }); - try { - e().then((e) => { - if (!e?.ok || x !== 0) return; - let t = String(e?.data?.input_directory || "").trim(); - y = t, C(t); - }).catch(() => {}); - } catch (e) { - console.debug?.(e); - } - let ee = String(n.paths?.indexDirectory || ""), w = null, re = 0, E = null; - t({ - id: `${Y}.Paths.IndexDirectory`, - category: l(k("cat.advanced"), "Paths / Index"), - name: "Majoor: Index Database Directory", - tooltip: "Override the Majoor index database directory. Use this to keep the SQLite index on a different local disk. Requires restart.", - type: "text", - defaultValue: String(n.paths?.indexDirectory || ""), - attrs: { placeholder: "D:\\MajoorIndex" }, - onChange: async (e) => { - let t = String(e || "").trim(); - n.paths = n.paths || {}, n.paths.indexDirectory = t, K(n); - try { - w &&= (clearTimeout(w), null); - } catch (e) { - console.debug?.(e); - } - w = setTimeout(async () => { - w = null; - let e = ++re; - try { - E?.abort?.(); - } catch (e) { - console.debug?.(e); - } - E = typeof AbortController < "u" ? new AbortController() : null; - try { - let r = await i(t, E ? { signal: E.signal } : {}); - if (e !== re) return; - if (!r?.ok) throw Error(r?.error || k("toast.failedSetIndexDirectory", "Failed to set index directory")); - let a = String(r?.data?.index_directory || t).trim(), s = a !== ee; - n.paths.indexDirectory = a, ee = a, K(n), o("paths.indexDirectory"), s && D(k("toast.indexDirectorySavedRestart", "Index directory saved. Restart ComfyUI to apply."), "success", void 0, { history: { trackId: "settings:index-directory-saved" } }); - } catch (t) { - if (e !== re || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return; - n.paths.indexDirectory = ee, K(n), o("paths.indexDirectory"), D(t?.message || k("toast.failedSetIndexDirectory", "Failed to set index directory"), "error"); - } - }, 700); - } - }); - try { - v().then((e) => { - if (!e?.ok) return; - let t = String(e?.data?.index_directory || "").trim(); - n.paths = n.paths || {}, n.paths.indexDirectory !== t && (n.paths.indexDirectory = t, ee = t, K(n), o("paths.indexDirectory")); - }).catch(() => {}); - } catch (e) { - console.debug?.(e); - } - let ie = String(n.paths?.workflowRoots || ""), ae = null, oe = 0, ue = null; - t({ - id: `${Y}.Paths.WorkflowRoots`, - category: l(k("cat.advanced"), "Paths / Workflows"), - name: "Majoor: Workflow Roots", - tooltip: "Folders scanned by the Workflow tab. Use one folder per line, or separate folders with semicolons. Leave empty to use ComfyUI defaults and MJR_AM_WORKFLOW_DIRECTORY.", - type: "text", - defaultValue: String(n.paths?.workflowRoots || ""), - attrs: { placeholder: "D:\\\\ComfyUI\\\\user\\\\default\\\\workflows" }, - onChange: async (e) => { - let t = String(e || "").trim(); - n.paths = n.paths || {}, n.paths.workflowRoots = t, K(n); - try { - ae &&= (clearTimeout(ae), null); - } catch (e) { - console.debug?.(e); - } - ae = setTimeout(async () => { - ae = null; - let e = ++oe; - try { - ue?.abort?.(); - } catch (e) { - console.debug?.(e); - } - ue = typeof AbortController < "u" ? new AbortController() : null; - try { - let r = await Ee(t, ue ? { signal: ue.signal } : {}); - if (e !== oe) return; - if (!r?.ok) throw Error(r?.error || k("toast.failedSetWorkflowRoots", "Failed to set workflow roots")); - let i = String(r?.data?.workflow_roots_text || t).trim(); - n.paths.workflowRoots = i, ie = i, K(n), o("paths.workflowRoots"), D(k("toast.workflowRootsSaved", "Workflow roots saved"), "success", 1800); - } catch (t) { - if (e !== oe || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return; - n.paths.workflowRoots = ie, K(n), o("paths.workflowRoots"), D(t?.message || k("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); - } - }, 700); - } - }); - try { - se().then((e) => { - if (!e?.ok) return; - let t = String(e?.data?.workflow_roots_text || "").trim(); - n.paths = n.paths || {}, n.paths.workflowRoots !== t && (n.paths.workflowRoots = t, ie = t, K(n), o("paths.workflowRoots")); - }).catch(() => {}); - } catch (e) { - console.debug?.(e); - } - let O = Ie().map((e) => e.code), de = ["auto", ...O]; - t({ - id: `${Y}.Language`, - category: l(k("cat.advanced"), k("setting.language.name", "Language")), - name: k("setting.language.name", "Majoor: Language"), - tooltip: "Use auto to detect and follow ComfyUI language. Or choose a fixed language for Majoor only.", - type: "combo", - defaultValue: n.i18n?.followComfyLanguage ? "auto" : je(), - options: de, - onChange: (e) => { - n.i18n = n.i18n || {}, e === "auto" ? (n.i18n.followComfyLanguage = !0, Me(!0), Be(s), K(n), o("language")) : O.includes(e) && (n.i18n.followComfyLanguage = !1, Me(!1), Ne(e), K(n), o("language")); - } - }), t({ - id: `${Y}.ProbeBackend.Mode`, - category: l(k("cat.advanced"), k("setting.probe.mode.name").replace("Majoor: ", "")), - name: k("setting.probe.mode.name"), - tooltip: k("setting.probe.mode.desc") + " (env: MAJOOR_MEDIA_PROBE_BACKEND)", - type: "combo", - defaultValue: n.probeBackend?.mode || G.probeBackend.mode, - options: [ - "auto", - "exiftool", - "ffprobe", - "both" - ], - onChange: (e) => { - let t = Lt(e, [ - "auto", - "exiftool", - "ffprobe", - "both" - ], G.probeBackend.mode); - n.probeBackend = n.probeBackend || {}, n.probeBackend.mode = t, K(n), q(n), o("probeBackend.mode"), m(t).catch(() => {}); - } - }), t({ - id: `${Y}.MetadataFallback.Image`, - category: l(k("cat.advanced"), "Metadata"), - name: "Majoor: Metadata Fallback (Images)", - tooltip: "Enable Pillow fallback when ExifTool is missing or fails.", - type: "boolean", - defaultValue: n.metadataFallback?.image ?? G.metadataFallback.image, - onChange: async (e) => { - let t = !!e, r = !!(n.metadataFallback?.image ?? G.metadataFallback.image); - n.metadataFallback = n.metadataFallback || {}, n.metadataFallback.image = t, K(n), o("metadataFallback.image"); - try { - let e = await le({ - image: t, - media: n.metadataFallback?.media ?? G.metadataFallback.media - }); - if (!e?.ok) throw Error(e?.error || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings")); - } catch (e) { - n.metadataFallback.image = r, K(n), o("metadataFallback.image"), D(e?.message || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error"); - } - } - }), t({ - id: `${Y}.MetadataFallback.Media`, - category: l(k("cat.advanced"), "Metadata"), - name: "Majoor: Metadata Fallback (Audio/Video)", - tooltip: "Enable hachoir fallback when ffprobe is missing or fails.", - type: "boolean", - defaultValue: n.metadataFallback?.media ?? G.metadataFallback.media, - onChange: async (e) => { - let t = !!e, r = !!(n.metadataFallback?.media ?? G.metadataFallback.media); - n.metadataFallback = n.metadataFallback || {}, n.metadataFallback.media = t, K(n), o("metadataFallback.media"); - try { - let e = await le({ - image: n.metadataFallback?.image ?? G.metadataFallback.image, - media: t - }); - if (!e?.ok) throw Error(e?.error || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings")); - } catch (e) { - n.metadataFallback.media = r, K(n), o("metadataFallback.media"), D(e?.message || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error"); - } - } - }); - try { - pe().then((e) => { - if (!e?.ok || !e?.data?.prefs) return; - let t = e.data.prefs || {}, r = !!(t.image ?? G.metadataFallback.image), i = !!(t.media ?? G.metadataFallback.media); - n.metadataFallback = n.metadataFallback || {}; - let a = !1; - n.metadataFallback.image !== r && (n.metadataFallback.image = r, a = !0), n.metadataFallback.media !== i && (n.metadataFallback.media = i, a = !0), a && (K(n), o("metadataFallback")); - }).catch(() => {}); - } catch (e) { - console.debug?.(e); - } - t({ - id: `${Y}.Db.Timeout`, - category: l(k("cat.advanced"), "Database"), - name: "DB Timeout (ms)", - tooltip: "Client-side DB timeout preference (stored locally).", - type: "number", - defaultValue: Number(n.db?.timeoutMs || 5e3), - attrs: { - min: 1e3, - max: 3e4, - step: 1e3 - }, - onChange: (e) => { - n.db = n.db || {}, n.db.timeoutMs = Math.max(1e3, Math.min(3e4, Math.round(W(e, 5e3)))), K(n), q(n), o("db.timeoutMs"); - } - }), t({ - id: `${Y}.Db.MaxConnections`, - category: l(k("cat.advanced"), "Database"), - name: "DB Max Connections", - tooltip: "Client-side DB max connections preference (stored locally).", - type: "number", - defaultValue: Number(n.db?.maxConnections || 10), - attrs: { - min: 1, - max: 100, - step: 1 - }, - onChange: (e) => { - n.db = n.db || {}, n.db.maxConnections = Math.max(1, Math.min(100, Math.round(W(e, 10)))), K(n), q(n), o("db.maxConnections"); - } - }), t({ - id: `${Y}.Db.QueryTimeout`, - category: l(k("cat.advanced"), "Database"), - name: "DB Query Timeout (ms)", - tooltip: "Client-side DB query timeout preference (stored locally).", - type: "number", - defaultValue: Number(n.db?.queryTimeoutMs || 1e3), - attrs: { - min: 500, - max: 1e4, - step: 500 - }, - onChange: (e) => { - n.db = n.db || {}, n.db.queryTimeoutMs = Math.max(500, Math.min(1e4, Math.round(W(e, 1e3)))), K(n), q(n), o("db.queryTimeoutMs"); - } - }), t({ - id: `${Y}.Observability.Enabled`, - category: l(k("cat.advanced"), k("setting.obs.enabled.name").replace("Majoor: ", "")), - name: k("setting.obs.enabled.name"), - tooltip: k("setting.obs.enabled.desc"), - type: "boolean", - defaultValue: !!n.observability?.enabled, - onChange: (e) => { - n.observability = n.observability || {}, n.observability.enabled = !!e, K(n), q(n), o("observability.enabled"); - } - }), t({ - id: `${Y}.Observability.RuntimeDashboardMode`, - category: l(k("cat.advanced"), "Runtime metrics badge"), - name: "Majoor: Runtime metrics badge", - tooltip: "Controls the small DB/enrichment/watcher metrics badge in the Assets Manager panel.", - type: "combo", - defaultValue: n.observability?.runtimeDashboardMode || G.observability.runtimeDashboardMode, - options: [ - "autoHide30", - "always", - "hidden" - ], - onChange: (e) => { - let t = Lt(e, [ - "autoHide30", - "always", - "hidden" - ], G.observability.runtimeDashboardMode); - n.observability = n.observability || {}, n.observability.runtimeDashboardMode = t, K(n), o("observability.runtimeDashboardMode"); - } - }), t({ - id: `${Y}.Observability.VerboseErrors`, - category: l(k("cat.advanced"), "Verbose error logging"), - name: "Verbose error logging", - tooltip: "Show detailed error messages in toasts and console. Useful for debugging.", - type: "boolean", - defaultValue: !!n.observability?.verboseErrors, - onChange: (e) => { - n.observability = n.observability || {}, n.observability.verboseErrors = !!e, K(n), q(n), o("observability.verboseErrors"); - } - }), t({ - id: `${Y}.Observability.VerboseRouteRegistrationLogs`, - category: l(k("cat.advanced"), "Logs"), - name: "Majoor: Verbose route registration logs", - tooltip: "When disabled, Majoor prints a compact startup summary instead of listing every registered API route. Takes effect on the next backend restart.", - type: "boolean", - defaultValue: !!(n.observability?.verboseRouteRegistrationLogs ?? G.observability?.verboseRouteRegistrationLogs ?? !1), - onChange: async (e) => { - let t = !!e, r = !!(n.observability?.verboseRouteRegistrationLogs ?? G.observability?.verboseRouteRegistrationLogs ?? !1); - n.observability = n.observability || {}, n.observability.verboseRouteRegistrationLogs = t, K(n), o("observability.verboseRouteRegistrationLogs"); - try { - let e = await _(t); - if (!e?.ok) throw Error(e?.error || "Failed to update route logging settings"); - } catch (e) { - n.observability.verboseRouteRegistrationLogs = r, K(n), o("observability.verboseRouteRegistrationLogs"), D(e?.message || "Failed to update route logging settings", "error"); - } - } - }), (async () => { - try { - let e = !!(await ce())?.data?.prefs?.enabled; - n.observability = n.observability || {}, n.observability.verboseRouteRegistrationLogs !== e && (n.observability.verboseRouteRegistrationLogs = e, K(n), o("observability.verboseRouteRegistrationLogs")); - } catch (e) { - console.debug?.(e); - } - })(), t({ - id: `${Y}.Observability.VerboseStartupLogs`, - category: l(k("cat.advanced"), "Logs"), - name: "Majoor: Verbose startup logs", - tooltip: "When disabled, Majoor suppresses most informational bootstrap logs during backend startup while keeping warnings and errors. Takes effect on the next backend restart.", - type: "boolean", - defaultValue: !!(n.observability?.verboseStartupLogs ?? G.observability?.verboseStartupLogs ?? !1), - onChange: async (e) => { - let t = !!e, r = !!(n.observability?.verboseStartupLogs ?? G.observability?.verboseStartupLogs ?? !1); - n.observability = n.observability || {}, n.observability.verboseStartupLogs = t, K(n), o("observability.verboseStartupLogs"); - try { - let e = await c(t); - if (!e?.ok) throw Error(e?.error || "Failed to update startup logging settings"); - } catch (e) { - n.observability.verboseStartupLogs = r, K(n), o("observability.verboseStartupLogs"), D(e?.message || "Failed to update startup logging settings", "error"); - } - } - }), (async () => { - try { - let e = !!(await ye())?.data?.prefs?.enabled; - n.observability = n.observability || {}, n.observability.verboseStartupLogs !== e && (n.observability.verboseStartupLogs = e, K(n), o("observability.verboseStartupLogs")); - } catch (e) { - console.debug?.(e); - } - })(); - { - let e = "HuggingFace Token", i = "", s = null, c = 0, u = !!n.ai?.huggingFaceTokenVisible, d = () => { - try { - let e = Array.from(document.querySelectorAll("input[data-mjr-hf-token=\"1\"]")); - for (let t of e) try { - t.type = u ? "text" : "password"; - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, f = (e) => { - try { - let t = String(e || "").trim(); - if (!t) return; - let n = Array.from(document.querySelectorAll("input[data-mjr-hf-token=\"1\"]")); - for (let e of n) try { - e.placeholder = t; - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }; - t({ - id: `${Y}.AI.HuggingFaceTokenVisible`, - category: l(k("cat.advanced"), e), - name: "Show HuggingFace token", - tooltip: "Show or hide the HuggingFace token while editing.", - type: "boolean", - defaultValue: u, - onChange: (e) => { - let t = !!e; - u = t, n.ai = n.ai || {}, n.ai.huggingFaceTokenVisible = t, K(n), o("ai.huggingFaceTokenVisible"), setTimeout(d, 0); - } - }), t({ - id: `${Y}.AI.HuggingFaceToken`, - category: l(k("cat.advanced"), e), - name: "HuggingFace Token", - tooltip: "Optional token for HuggingFace Hub downloads (higher rate limits).\nSaved server-side and used by CLIP model loading.\nLeave empty to clear the stored token.", - type: "text", - defaultValue: "", - attrs: { - placeholder: "Paste HuggingFace token (hf_...)", - type: u ? "text" : "password", - autocomplete: "new-password", - name: "mjr_huggingface_token", - "data-mjr-hf-token": "1" - }, - onChange: (e) => { - let t = String(e || "").trim(); - if (t !== i) { - try { - s &&= (clearTimeout(s), null); - } catch (e) { - console.debug?.(e); - } - s = setTimeout(async () => { - s = null; - let e = ++c; - try { - let n = await a(t); - if (e !== c) return; - if (!n?.ok) throw Error(n?.error || "Failed to update HuggingFace token"); - i = t, o("ai.huggingFaceToken"), t ? D("HuggingFace token saved", "success") : D("HuggingFace token cleared", "success", void 0, { noHistory: !0 }); - } catch (t) { - if (e !== c) return; - D(t?.message || "Failed to update HuggingFace token", "error"); - } - }, 900); - } - } - }), setTimeout(d, 0), (async () => { - try { - let e = (await ne())?.data?.prefs || {}, t = !!e?.has_token, n = String(e?.token_hint || "").trim(), r = t ? `Configured ${n || "(saved)"}` : "Paste HuggingFace token (hf_...)"; - f(r); - } catch (e) { - console.debug?.(e); - } - })(), t({ - id: `${Y}.AI.VerboseLogs`, - category: l(k("cat.advanced"), e), - name: "Majoor: Verbose AI logs", - tooltip: "Enable detailed HuggingFace/SigLIP2/X-CLIP logs and progress bars during model download/loading.", - type: "boolean", - defaultValue: !!(n.ai?.verboseAiLogs ?? G.ai?.verboseAiLogs ?? !1), - onChange: async (e) => { - let t = !!e, i = !!(n.ai?.verboseAiLogs ?? G.ai?.verboseAiLogs ?? !1); - n.ai = n.ai || {}, n.ai.verboseAiLogs = t, K(n), o("ai.verboseAiLogs"); - try { - let e = await r(t); - if (!e?.ok) throw Error(e?.error || "Failed to update AI logging settings"); - } catch (e) { - n.ai.verboseAiLogs = i, K(n), o("ai.verboseAiLogs"), D(e?.message || "Failed to update AI logging settings", "error"); - } - } - }), (async () => { - try { - let e = !!(await ge())?.data?.prefs?.enabled; - n.ai = n.ai || {}, n.ai.verboseAiLogs !== e && (n.ai.verboseAiLogs = e, K(n), o("ai.verboseAiLogs")); - } catch (e) { - console.debug?.(e); - } - })(); - } - t({ - id: `${Y}.AI.VectorStats`, - category: l(k("cat.advanced"), "AI / Vector Search"), - name: "Vector Index Status", - tooltip: "Current status of the SigLIP2/X-CLIP vector index used for semantic search", - type: "text", - defaultValue: "Loading vector status..." - }), (async () => { - try { - let e = await T(); - e?.ok ? console.debug?.("[Majoor] Vector status:", `${e.data?.total || 0} assets indexed | Model: ${e.data?.model || "N/A"}`) : console.debug?.("[Majoor] Vector status unavailable"); - } catch (e) { - console.debug?.("[Majoor] Vector status fetch failed", e); - } - })(), t({ - id: `${Y}.AI.VectorBackfillAction`, - category: l(k("cat.advanced"), "AI / Vector Search"), - name: "Vector Index Action", - tooltip: "Compute CLIP embeddings for all assets that don't have them yet.\nThis is required for AI semantic search to work.\n\nChoose 'Run backfill now' to start indexing.\nThis may take several minutes for large libraries.\n\nNote: New assets are indexed automatically during scanning.", - type: "combo", - defaultValue: "Idle", - options: ["Idle", "Run backfill now"], - onChange: async (e) => { - if (String(e || "") !== "Run backfill now") return; - let t = { history: { - trackId: "vector-backfill:advanced-settings", - title: "Vector Backfill", - source: "all", - operation: "vector_backfill", - forceStore: !0 - } }; - try { - D(k("toast.vectorBackfillStarting", "Starting vector backfill... This may take a while."), "info", void 0, { history: { - ...t.history, - status: "started", - detail: "Starting vector backfill... This may take a while." - } }); - let e = await te(64, { onProgress: (e) => { - let n = String(e?.status || "running").toLowerCase() || "running", r = e?.progress || e?.result || {}, i = Number(r?.candidates ?? r?.processed ?? 0), a = Number(r?.indexed ?? 0), o = Number(r?.skipped ?? 0), s = Number(r?.errors ?? 0), c = Math.max(i, a + o + s), l = c > 0 ? Math.round((a + o + s) / c * 100) : null, u = n === "queued" ? "Vector backfill queued" : `Candidates ${i}, indexed ${a}, skipped ${o}, errors ${s}`; - be({ - summary: "Vector Backfill", - detail: u - }, n === "failed" ? "error" : n === "succeeded" ? "success" : "info", 0, { history: { - ...t.history, - status: n, - detail: u, - progress: { - current: a + o + s, - total: c, - percent: l, - indexed: a, - skipped: o, - errors: s, - label: n - } - } }); - } }); - if (e?.ok) { - let n = e.data || {}, r = String(n?.status || "").toLowerCase(), i = !!n?.pending || [ - "queued", - "running", - "pending" - ].includes(r), a = n?.progress || {}, o = Number(n?.processed ?? a?.candidates ?? 0), s = Number(n?.indexed ?? a?.indexed ?? 0), c = Number(n?.skipped ?? a?.skipped ?? 0); - if (i) { - let e = String(n?.job_id || "").trim(); - D(k("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (job ${e.slice(0, 8)})` : "" }), "info", void 0, { history: { - ...t.history, - status: "running", - detail: `Vector backfill still running in background${e ? ` (${e.slice(0, 8)})` : ""}.`, - progress: { - current: s + c, - total: Math.max(o, s + c), - percent: Math.max(o, s + c) > 0 ? Math.round((s + c) / Math.max(o, s + c) * 100) : null, - indexed: s, - skipped: c, - label: "running" - } - } }); - } else { - let e = k("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { - processed: o, - indexed: s, - skipped: c - }); - D(e, "success", void 0, { history: { - ...t.history, - status: "succeeded", - detail: `Processed ${o}, indexed ${s}, skipped ${c}`, - progress: { - current: o, - total: o, - percent: o > 0 ? 100 : null, - indexed: s, - skipped: c, - label: "done" - } - } }); - } - try { - let e = await T(); - e?.ok && console.debug?.("[Majoor] Vector stats after backfill:", e.data); - } catch (e) { - console.debug?.("[Majoor] Failed to refresh vector stats:", e); - } - } else throw Error(e?.error || k("toast.vectorBackfillFailedGeneric", "Backfill failed")); - } catch (e) { - let n = e?.message || String(e || k("status.unknown", "unknown")); - D(k("toast.vectorBackfillFailedDetail", "Vector backfill failed: {error}", { error: n }), "error", void 0, { history: { - ...t.history, - status: "failed", - detail: n - } }), console.error("[Majoor] Vector backfill error:", e); - } - } - }); -} -// ui/app/settings/settingsSearch.ts -var Vn = "Majoor", Hn = "Majoor Assets Manager"; -function Un(e, t, n) { - let r = (e, t) => [ - Hn, - e, - t - ]; - e({ - id: `${Vn}.AI.VectorSearchEnabled`, - category: r(k("cat.search", "Search"), "AI"), - name: k("setting.ai.vector.enabled.name", "Enable AI semantic search"), - tooltip: k("setting.ai.vector.enabled.desc", "Enable/disable AI vector search features (SigLIP2/X-CLIP: description search, prompt alignment, AI tag suggestions, smart collections)."), - type: "boolean", - defaultValue: !!(t.ai?.vectorSearchEnabled ?? !0), - onChange: async (e) => { - t.ai = t.ai || {}; - let r = !!(t.ai.vectorSearchEnabled ?? !0), i = !!e; - t.ai.vectorSearchEnabled = i, K(t), q(t), n("ai.vectorSearchEnabled"); - try { - let e = await d(i); - if (!e?.ok) { - t.ai.vectorSearchEnabled = r, K(t), q(t), n("ai.vectorSearchEnabled"), D(e?.error || "Failed to update AI vector search setting", "error"); - return; - } - D(i ? "AI semantic search enabled" : "AI semantic search disabled", "info", 2200); - } catch (e) { - t.ai.vectorSearchEnabled = r, K(t), q(t), n("ai.vectorSearchEnabled"), D(e?.message || "Failed to update AI vector search setting", "error"); - } - } - }), e({ - id: `${Vn}.AI.VectorCaptionOnIndex`, - category: r(k("cat.search", "Search"), "AI"), - name: k("setting.ai.vector.captionOnIndex.name", "Generate AI captions during indexing"), - tooltip: k("setting.ai.vector.captionOnIndex.desc", "Allow automatic vector indexing and backfill to run Florence-2 captions for image assets. This is slower and can use significant VRAM/CPU; leave it off for faster grid startup."), - type: "boolean", - defaultValue: !!(t.ai?.vectorCaptionOnIndex ?? !1), - onChange: async (e) => { - t.ai = t.ai || {}; - let r = !!(t.ai.vectorCaptionOnIndex ?? !1), i = !!e; - t.ai.vectorCaptionOnIndex = i, K(t), q(t), n("ai.vectorCaptionOnIndex"); - try { - let e = await d({ caption_on_index: i }); - if (!e?.ok) { - t.ai.vectorCaptionOnIndex = r, K(t), q(t), n("ai.vectorCaptionOnIndex"), D(e?.error || "Failed to update AI caption indexing setting", "error"); - return; - } - i && D("AI captions during indexing enabled", "info", 2600); - } catch (e) { - t.ai.vectorCaptionOnIndex = r, K(t), q(t), n("ai.vectorCaptionOnIndex"), D(e?.message || "Failed to update AI caption indexing setting", "error"); - } - } - }), e({ - id: `${Vn}.AI.VectorIndexOnScan`, - category: r(k("cat.search", "Search"), "AI"), - name: k("setting.ai.vector.indexOnScan.name", "Index vectors during scans"), - tooltip: k("setting.ai.vector.indexOnScan.desc", "Compute SigLIP/X-CLIP embeddings while assets are scanned. Disable to avoid surprise VRAM use; run vector backfill manually when needed."), - type: "boolean", - defaultValue: !!(t.ai?.vectorIndexOnScan ?? !1), - onChange: async (e) => { - t.ai = t.ai || {}; - let r = !!(t.ai.vectorIndexOnScan ?? !1), i = !!e; - t.ai.vectorIndexOnScan = i, K(t), q(t), n("ai.vectorIndexOnScan"); - try { - let e = await d({ index_on_scan: i }); - if (!e?.ok) { - t.ai.vectorIndexOnScan = r, K(t), q(t), n("ai.vectorIndexOnScan"), D(e?.error || "Failed to update vector scan indexing", "error"); - return; - } - D(i ? "Vector indexing during scans enabled" : "Vector indexing during scans disabled", "info", 2400); - } catch (e) { - t.ai.vectorIndexOnScan = r, K(t), q(t), n("ai.vectorIndexOnScan"), D(e?.message || "Failed to update vector scan indexing", "error"); - } - } - }), e({ - id: `${Vn}.AI.VectorConcurrency`, - category: r(k("cat.search", "Search"), "AI"), - name: k("setting.ai.vector.concurrency.name", "Vector indexing concurrency"), - tooltip: k("setting.ai.vector.concurrency.desc", "Maximum concurrent vector embedding workers. Use 1 to minimize transient VRAM spikes."), - type: "number", - defaultValue: Number(t.ai?.vectorConcurrency || 1), - attrs: { - min: 1, - max: 16, - step: 1 - }, - onChange: async (e) => { - t.ai = t.ai || {}; - let r = Number(t.ai.vectorConcurrency || 1), i = Math.max(1, Math.min(16, Math.floor(Number(e) || 1))); - t.ai.vectorConcurrency = i, K(t), q(t), n("ai.vectorConcurrency"); - try { - let e = await d({ concurrency: i }); - e?.ok || (t.ai.vectorConcurrency = r, K(t), q(t), n("ai.vectorConcurrency"), D(e?.error || "Failed to update vector concurrency", "error")); - } catch (e) { - t.ai.vectorConcurrency = r, K(t), q(t), n("ai.vectorConcurrency"), D(e?.message || "Failed to update vector concurrency", "error"); - } - } - }), e({ - id: `${Vn}.AI.VectorUnloadAfterUse`, - category: r(k("cat.search", "Search"), "AI"), - name: k("setting.ai.vector.unloadAfterUse.name", "Unload AI models after use"), - tooltip: k("setting.ai.vector.unloadAfterUse.desc", "Unload Majoor SigLIP/X-CLIP/Florence models after heavy AI actions and call torch CUDA cache cleanup. This frees VRAM but makes the next AI action slower."), - type: "boolean", - defaultValue: !!(t.ai?.vectorUnloadAfterUse ?? !1), - onChange: async (e) => { - t.ai = t.ai || {}; - let r = !!(t.ai.vectorUnloadAfterUse ?? !1), i = !!e; - t.ai.vectorUnloadAfterUse = i, K(t), q(t), n("ai.vectorUnloadAfterUse"); - try { - let e = await d({ unload_after_use: i }); - if (!e?.ok) { - t.ai.vectorUnloadAfterUse = r, K(t), q(t), n("ai.vectorUnloadAfterUse"), D(e?.error || "Failed to update model unload setting", "error"); - return; - } - D(i ? "AI model unload after use enabled" : "AI model unload after use disabled", "info", 2400); - } catch (e) { - t.ai.vectorUnloadAfterUse = r, K(t), q(t), n("ai.vectorUnloadAfterUse"), D(e?.message || "Failed to update model unload setting", "error"); - } - } - }), e({ - id: `${Vn}.AI.VectorUnloadNow`, - category: r(k("cat.search", "Search"), "AI"), - name: k("setting.ai.vector.unloadNow.name", "Memory purge now"), - tooltip: k("setting.ai.vector.unloadNow.desc", "Immediately unload Majoor AI vector/caption models, ask ComfyUI to unload loaded models, and clear torch CUDA cache when idle."), - type: "combo", - options: ["Idle", "Unload now"], - defaultValue: "Idle", - onChange: async (e) => { - if (String(e || "") === "Unload now") try { - let e = await s(); - D(e?.ok ? "Majoor AI model cache unloaded" : e?.error || "Failed to unload Majoor AI model cache", e?.ok ? "info" : "error", 2600); - } catch (e) { - D(e?.message || "Failed to unload Majoor AI model cache", "error"); - } - } - }), e({ - id: `${Vn}.Search.MaxResults`, - category: r(k("cat.search", "Search")), - name: k("setting.search.maxResults.name", "Max search results (client)"), - tooltip: k("setting.search.maxResults.desc", "Maximum number of results requested per search. The backend still enforces MAJOOR_SEARCH_MAX_LIMIT; increase that env var if you need a higher hard cap."), - type: "number", - defaultValue: Number(t.search?.maxResults || j.SEARCH_DEFAULT_LIMIT), - attrs: { - min: 10, - max: j.MAX_PAGE_SIZE || 2e3, - step: 1 - }, - onChange: (e) => { - t.search = t.search || {}, t.search.maxResults = Math.max(10, Math.min(j.MAX_PAGE_SIZE || 2e3, Number(e) || j.SEARCH_DEFAULT_LIMIT)), K(t), q(t), n("search.maxResults"); - } - }), e({ - id: `${Vn}.EnvVars.Reference`, - category: r(k("cat.advanced"), "Environment variables"), - name: "Environment variables reference", - tooltip: "Set these env vars before starting ComfyUI to override defaults:\n\nMAJOOR_OUTPUT_DIRECTORY - Override output root directory\nMAJOOR_EXIFTOOL_PATH - Path to exiftool binary\nMAJOOR_FFPROBE_PATH - Path to ffprobe binary\nMAJOOR_MEDIA_PROBE_BACKEND - Probe mode: auto|exiftool|ffprobe|both\nMAJOOR_EXIFTOOL_TIMEOUT - ExifTool timeout in seconds (default: 15)\nMAJOOR_FFPROBE_TIMEOUT - FFprobe timeout in seconds (default: 10)\nMAJOOR_DB_TIMEOUT - Database timeout in seconds (default: 30)\nMAJOOR_DB_MAX_CONNECTIONS - Max DB connections (default: 8)\nMAJOOR_METADATA_CACHE_MAX - Metadata cache max entries (default: 100000)\nMAJOOR_METADATA_EXTRACT_CONCURRENCY - Parallel metadata workers (default: 1)\nMJR_ENABLE_WATCHER - Enable file watcher: 1|0 (default: 1)\nMJR_WATCHER_DEBOUNCE_MS - Watcher debounce delay in ms (default: 3000)\nMJR_WATCHER_DEDUPE_TTL_MS - Watcher dedupe window in ms (default: 3000)\nMJR_WATCHER_MAX_FILE_SIZE_BYTES - Max file size to index (default: 512MB)\nMJR_WATCHER_FLUSH_MAX_FILES - Max files per flush batch (default: 256)\nMJR_WATCHER_PENDING_MAX - Max pending watcher queue (default: 5000)\nMJR_AM_ENABLE_VECTOR_SEARCH - Enable AI vector/semantic search: 1|0 (default: 1)\nMJR_AM_VECTOR_INDEX_ON_SCAN - Compute vectors during scans: 1|0 (default: 0)\nMJR_AM_VECTOR_CAPTION_ON_INDEX - Generate Florence captions during vector indexing: 1|0 (default: 0)\nMJR_VECTOR_CONCURRENCY - Concurrent vector workers (default: 2, use 1 for lower VRAM spikes)\nMJR_AM_VECTOR_UNLOAD_AFTER_USE - Unload Majoor AI models after heavy vector actions: 1|0 (default: 0)\nMAJOOR_SEARCH_MAX_LIMIT - Max search results (default: 500)\nMAJOOR_BG_SCAN_ON_LIST - Scan on directory list: 0|1 (default: 0)", - type: "text", - defaultValue: "Hover for full list of environment variables" - }); -} -// ui/app/settings/SettingsPanel.ts -var Wn = "Majoor Assets Manager", Gn = /^\s*Majoor:\s*/i, Kn = Object.freeze({ - ASSETS_PANEL: "Assets Panel", - GENERATED_FEED: "Generated Feed", - VIEWER: "Viewer & Floating Viewer", - INDEXING: "Indexing & Watcher", - SEARCH_AI: "Search & AI", - GENERAL: "General", - ADVANCED: "Advanced", - SECURITY: "Security" -}), qn = /* @__PURE__ */ new Set([ - "grid.starColor", - "grid.badgeImageColor", - "grid.badgeVideoColor", - "grid.badgeAudioColor", - "grid.badgeModel3dColor", - "grid.badgeDuplicateAlertColor", - "ui.cardHoverColor", - "ui.cardSelectionColor", - "ui.ratingColor", - "ui.tagColor" -]), Jn = "Majoor.General.ResetAllSettings", Yn = "mjr-settings-reset-btn", Xn = null, Zn = null; -function Qn(e) { - let t = String(e || "").trim(); - return !t || t === Jn || t === "Majoor.Language" ? Kn.GENERAL : /^Majoor\.(Safety|Security)\./.test(t) ? Kn.SECURITY : /^Majoor\.(Paths|Db|ProbeBackend|MetadataFallback|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" ? Kn.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? Kn.VIEWER : /^Majoor\.Feed\./.test(t) ? Kn.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) || t === "Majoor.RtHydrate.Concurrency" ? Kn.INDEXING : /^Majoor\.AI\.(HuggingFaceTokenVisible|HuggingFaceToken|VerboseLogs|VectorStats|VectorBackfillAction|VectorSearchEnabled|VectorCaptionOnIndex|VectorIndexOnScan|VectorConcurrency|VectorUnloadAfterUse|VectorUnloadNow)$/.test(t) || /^Majoor\.Search\./.test(t) ? Kn.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? Kn.ASSETS_PANEL : Kn.GENERAL; -} -function $n(e) { - let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = Qn(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(Gn, "").trim(); - return [ - Wn, - n, - i || r || a || n - ]; -} -var er = !1, tr = null, nr = null, rr = !1, ir = /* @__PURE__ */ new Set(); -function ar(e) { - if (!e || typeof e != "object") return null; - let t = { ...e }; - try { - typeof t.name == "string" && (t.name = t.name.replace(Gn, "").trim()); - } catch (e) { - console.debug?.(e); - } - try { - t.category = $n(t); - } catch { - t.category = [Wn, Kn.GENERAL]; - } - return !t.tooltip && typeof t.name == "string" && t.name.trim() && (t.tooltip = t.name.trim()), t; -} -function or(e, t, n) { - let r = String(t?.id || "").trim(); - if (!r || ir.has(r)) return !1; - ir.add(r); - try { - return Oe(e, r, n); - } finally { - ir.delete(r); - } -} -function sr(e, t) { - if (!t || typeof t != "object") return t; - let n = { ...t }; - or(e, n, n.defaultValue); - let r = n.onChange; - return n.onChange = (t, ...i) => { - if (or(e, n, t), typeof r == "function") return r(t, ...i); - n.defaultValue = t; - }, n; -} -function cr(e) { - try { - return JSON.parse(JSON.stringify(e || {})); - } catch { - return { ...G }; - } -} -function lr(e, t, n, { wrapForComfy: r = !0 } = {}) { - let i = [], a = (e) => { - let n = ar(e); - n && i.push(r ? sr(t, n) : n); - }; - return un(a, e, n), yn(a, e, n), pn(a, e, n), gn(a, e, n), Rn(a, e, n), Bn(a, e, n, t), Un(a, e, n), i; -} -function ur(e, t) { - if (e === t) return !0; - try { - return JSON.stringify(e) === JSON.stringify(t); - } catch { - return !1; - } -} -function dr(e) { - return e ? e.querySelector(".form-input") || e.querySelector(".p-inputgroup") || e.querySelector(".setting-input") || e.querySelector("[class*='input']") : null; -} -function fr(e, t) { - let n = document.createElement("button"); - return n.type = "button", n.className = Yn, n.textContent = e, n.title = t, n.style.marginLeft = "8px", n.style.minWidth = e.length > 2 ? "auto" : "24px", n.style.height = "24px", n.style.padding = e.length > 2 ? "0 10px" : "0", n.style.borderRadius = "6px", n.style.border = "1px solid var(--border-color, #555)", n.style.background = "var(--comfy-input-bg, #2b2b2b)", n.style.color = "var(--input-text, inherit)", n.style.cursor = "pointer", n.style.fontSize = "12px", n.style.lineHeight = "22px", n.style.flexShrink = "0", n; -} -function pr(e, t, n) { - String(e?.id || "").trim() && (or(n, e, t), typeof e?.onChange == "function" && e.onChange(t)); -} -function mr(e, t, n, r) { - let i = !ur(ke(r, t.id, t.defaultValue), n); - e.disabled = !i, e.style.opacity = i ? "1" : "0.45"; -} -function hr() { - if (typeof document > "u" || !Zn) return; - let { app: e, definitions: t, defaultValues: n } = Zn, r = document.querySelector(`[data-setting-id="${Jn}"]`), i = dr(r); - if (r && i && !r.getAttribute("data-mjr-reset-injected")) { - r.setAttribute("data-mjr-reset-injected", "true"), i.innerHTML = ""; - let a = fr("Reset all settings", "Reset all Majoor settings to defaults"); - a.onclick = (r) => { - r.preventDefault(), r.stopPropagation(); - for (let r of t) r.id !== Jn && n.has(r.id) && pr(r, n.get(r.id), e); - hr(); - }, i.appendChild(a); - } - for (let r of t) { - if (!r?.id || r.id === Jn || !n.has(r.id)) continue; - let t = document.querySelector(`[data-setting-id="${r.id}"]`); - if (!t || t.getAttribute("data-mjr-reset-injected")) continue; - let i = dr(t); - if (!i) continue; - t.setAttribute("data-mjr-reset-injected", "true"); - let a = fr("Reset", "Reset this setting to default"); - mr(a, r, n.get(r.id), e), a.onclick = (t) => { - t.preventDefault(), t.stopPropagation(); - let i = n.get(r.id); - pr(r, i, e), mr(a, r, i, e); - }, i.appendChild(a); - } -} -function gr(e, t, n) { - typeof document < "u" && typeof MutationObserver < "u" && (Zn = { - app: e, - definitions: t, - defaultValues: new Map(n.filter((e) => e?.id && e.id !== Jn).map((e) => [e.id, e.defaultValue])) - }, hr(), !Xn && (Xn = new MutationObserver(() => hr()), Xn.observe(document.body, { - childList: !0, - subtree: !0 - }))); -} -function _r(e, t, { initRuntime: n = !1 } = {}) { - if (nr) typeof t == "function" && nr.onAppliedListeners.add(t), e && !nr.app && (nr.app = e); - else { - let n = Kt(); - n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? Me(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, Me(!0), K(n)); - let r = /* @__PURE__ */ new Set(); - typeof t == "function" && r.add(t); - let i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = () => { - if (!i.size) return; - let e = Array.from(i); - i.clear(); - for (let t of e) Ke("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); - }, s = () => { - if (!a.size) return; - let e = Array.from(a); - a.clear(); - for (let t of e) Ke("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); - }, c = cn(o, 120), l = cn(s, 450), u = (e) => { - typeof e == "string" && i.add(e), c(); - }, d = (e) => { - typeof e == "string" && a.add(e), l(); - }, f = () => { - let e = Kt(); - Object.assign(n, e), q(n), u("storage"); - }, p = (e) => { - e && e.key === "mjrSettings" && e.newValue !== e.oldValue && f(); - }; - if (!er) { - if (tr && typeof window < "u") try { - window.removeEventListener("storage", tr); - } catch (e) { - console.debug?.(e); - } - try { - window.addEventListener("storage", p), er = !0, tr = p; - } catch (e) { - console.debug?.(e); - } - } - nr = { - app: e, - notifyApplied: (e) => { - for (let t of r) try { - t(n, e); - } catch (e) { - console.debug?.(e); - } - qn.has(String(e || "")) ? d(e) : u(e); - }, - onAppliedListeners: r, - refreshFromStorage: f, - settings: n - }; - } - if (n && !rr) { - let t = e || nr.app, n = nr.settings; - Be(t), q(n), Le(t), qt(), Jt(), Yt(), n?.watcher && typeof n.watcher.enabled == "boolean" && ee(!!n.watcher.enabled).catch(() => {}), on(), rr = !0; - } - return nr; -} -var vr = (e, t) => _r(e, t, { initRuntime: !0 }).settings, yr = (e, t) => { - let n = _r(e, t, { initRuntime: !1 }); - Object.assign(n.settings, Kt()); - let r = e || n.app, i = lr(n.settings, r, n.notifyApplied), a = lr(cr(G), r, () => {}, { wrapForComfy: !1 }); - return i.unshift(sr(r, { - id: Jn, - category: [ - Wn, - Kn.GENERAL, - "Reset" - ], - name: "Reset all settings to defaults", - tooltip: "Reset every Majoor Assets Manager setting to its default value.", - type: "text", - defaultValue: "" - })), gr(r, i, a), i; -}; -try { - let e = Kt(); - e?.watcher && typeof e.watcher.enabled == "boolean" && ae().then((e) => { - let t = !!e?.ok && !!e?.data?.enabled, n = Kt(); - n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, K(n), Ke("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); - }).catch(() => {}); -} catch (e) { - console.debug?.(e); -} -// ui/features/contextmenu/gridContextMenuState.ts -function br() { - return { - open: !1, - x: 0, - y: 0, - items: [], - title: "" - }; -} -var X = yt({ - portalOwnerId: "", - mountedPortalIds: [], - main: br(), - submenu: br(), - tags: { - open: !1, - x: 0, - y: 0, - asset: null, - assets: null, - onChanged: null - } -}), xr = 1; -function Sr(e) { - e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = ""); -} -function Cr(e = "") { - try { - window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } })); - } catch (e) { - console.debug?.(e); - } -} -function wr() { - let e = `mjr-grid-context-menu-portal-${xr++}`; - return X.mountedPortalIds.push(e), X.portalOwnerId ||= e, e; -} -function Tr(e) { - let t = X.mountedPortalIds.filter((t) => t !== e); - X.mountedPortalIds.splice(0, X.mountedPortalIds.length, ...t), X.portalOwnerId === e && (X.portalOwnerId = X.mountedPortalIds[0] || ""); -} -function Er(e) { - return String(X.portalOwnerId || "") === String(e || ""); -} -function Dr({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - Cr("grid"), Mr(), Ar(), X.main.open = !0, X.main.x = Number(e) || 0, X.main.y = Number(t) || 0, X.main.items = Array.isArray(n) ? n.filter(Boolean) : [], X.main.title = String(r || ""); -} -function Or() { - Sr(X.main), Ar(); -} -function kr({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - X.submenu.open = !0, X.submenu.x = Number(e) || 0, X.submenu.y = Number(t) || 0, X.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], X.submenu.title = String(r || ""); -} -function Ar() { - Sr(X.submenu); -} -function jr({ x: e = 0, y: t = 0, asset: n = null, assets: r = null, onChanged: i = null } = {}) { - Or(); - let a = Array.isArray(r) && r.length > 1 ? r : null; - X.tags.open = !!(n || a), X.tags.x = Number(e) || 0, X.tags.y = Number(t) || 0, X.tags.asset = a ? a[0] || null : n || null, X.tags.assets = a, X.tags.onChanged = typeof i == "function" ? i : null; -} -function Mr() { - X.tags.open = !1, X.tags.x = 0, X.tags.y = 0, X.tags.asset = null, X.tags.assets = null, X.tags.onChanged = null; -} -function Nr() { - Or(), Mr(); -} -// ui/features/dnd/utils/constants.ts -var Pr = "application/x-mjr-asset", Fr = "application/x-mjr-assets", Ir = "application/x-comfy-asset-info", Lr = /* @__PURE__ */ new Set([ - ".png", - ".jpg", - ".jpeg", - ".webp", - ".gif", - ".bmp", - ".tif", - ".tiff", - ".avif", - ".jxl" -]), Rr = /* @__PURE__ */ new Set([ - ".mp4", - ".mov", - ".mkv", - ".webm", - ".avi", - ".m4v" -]), zr = /* @__PURE__ */ new Set([ - ".wav", - ".mp3", - ".flac", - ".ogg", - ".m4a", - ".aac", - ".opus" -]), Br = /* @__PURE__ */ new Set([ - ".obj", - ".fbx", - ".glb", - ".gltf", - ".stl", - ".ply", - ".splat", - ".ksplat", - ".spz" -]), Vr = (e) => { - if (!e) return !1; - let t = e.lastIndexOf("."); - return t !== -1 && Lr.has(e.slice(t).toLowerCase()); -}, Hr = (e) => e ? String(e.kind || "").toLowerCase() === "image" || Vr(e.filename) : !1, Ur = (e) => { - if (!e) return !1; - let t = e.lastIndexOf("."); - return t !== -1 && Rr.has(e.slice(t).toLowerCase()); -}, Wr = (e) => e ? String(e.kind || "").toLowerCase() === "video" || Ur(e.filename) : !1, Gr = (e) => { - if (!e) return !1; - let t = e.lastIndexOf("."); - return t !== -1 && zr.has(e.slice(t).toLowerCase()); -}, Kr = (e) => e ? String(e.kind || "").toLowerCase() === "audio" || Gr(e.filename) : !1, qr = (e) => { - if (!e) return !1; - let t = e.lastIndexOf("."); - return t !== -1 && Br.has(e.slice(t).toLowerCase()); -}, Jr = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" || qr(e.filename) : !1, Yr = (e) => Hr(e) || Wr(e) || Kr(e) || Jr(e) || String(e?.kind || "").toLowerCase() === "workflow", Xr = { - mp4: "video/mp4", - mov: "video/quicktime", - webm: "video/webm", - mkv: "video/x-matroska", - glb: "model/gltf-binary", - gltf: "model/gltf+json", - obj: "model/obj", - stl: "model/stl", - ply: "application/ply" -}, Zr = (e) => Xr[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", Qr = (e, t) => { - if (typeof e != "string") return !1; - let n = e.trim().toLowerCase(); - if (!n) return !1; - let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Rr.has(`.${r}`) : !1; -}, $r = (e, t, n) => { - if (!e || e.type !== "combo" || !e.options) return !1; - let r = Array.isArray(e.options.values) && e.options.values || e.options.values && Array.isArray(e.options.values.values) && e.options.values.values || null; - return Array.isArray(r) ? r.some((e) => n(typeof e == "string" ? e : e?.content ?? e?.value ?? e?.text, t)) : !1; -}, ei = (e, t) => $r(e, t, Qr), ti = (e, t) => { - if (typeof e != "string") return !1; - let n = e.trim().toLowerCase(); - if (!n) return !1; - let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Lr.has(`.${r}`) : !1; -}, ni = (e, t) => $r(e, t, ti), ri = (e, t) => { - if (typeof e != "string") return !1; - let n = e.trim().toLowerCase(); - if (!n) return !1; - let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : zr.has(`.${r}`) : !1; -}, ii = (e, t) => $r(e, t, ri), ai = (e, t) => { - if (typeof e != "string") return !1; - let n = e.trim().toLowerCase(); - if (!n) return !1; - let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Br.has(`.${r}`) : !1; -}, oi = (e, t) => $r(e, t, ai), si = /* @__PURE__ */ new WeakMap(), ci = (e) => { - if (!e || typeof e != "object") return { - node: null, - prev: null - }; - let t = si.get(e); - return t || (t = { - node: null, - prev: null - }, si.set(e, t)), t; -}, li = (e, t, n) => { - let r = e?.canvas?.canvas || document.querySelector("canvas"), i = e?.canvas?.graph, a = e?.canvas?.ds; - if (!r || !i || !a) return null; - let o = r.getBoundingClientRect(); - if (t < o.left || t > o.right || n < o.top || n > o.bottom) return null; - let s = Number(a.scale) || 1, c = a.offset || [0, 0], l = Array.isArray(c) ? Number(c[0]) || 0 : Number(c?.x) || 0, u = Array.isArray(c) ? Number(c[1]) || 0 : Number(c?.y) || 0, d = (t - o.left) / s - l, f = (n - o.top) / s - u; - if (typeof i.getNodeOnPos == "function") return i.getNodeOnPos(d, f); - let p = i._nodes || []; - for (let e = p.length - 1; e >= 0; e--) { - let t = p[e]; - if (!t?.pos || !t?.size) continue; - let n = t.size[0], r = t.size[1]; - if (t.flags && t.flags.collapsed && (r = 30), d >= t.pos[0] && f >= t.pos[1] && d <= t.pos[0] + n && f <= t.pos[1] + r) return t; - } - return null; -}, ui = (e, t, n) => { - let r = ci(e); - t && r.node !== t && (di(e, n), r.node = t, r.prev = { - color: t.color, - bgcolor: t.bgcolor - }, t.bgcolor = "#3355ff", t.color = "#a9c4ff", n(e)); -}, di = (e, t) => { - let n = ci(e); - if (n.node) { - try { - n.prev && (n.node.color = n.prev.color, n.node.bgcolor = n.prev.bgcolor); - } catch (e) { - console.debug?.(e); - } - n.node = null, n.prev = null, t(e); - } -}, fi = (e, t) => { - if (!e || e.type !== "combo" || !e.options) return; - let n = e.options.values, r = e.options; - if (typeof n != "function") { - if (!Array.isArray(n)) { - if (n && typeof n == "object" && Array.isArray(n.values)) r = n, n = n.values; - else return; - } - n.some((e) => typeof e == "string" ? e === t : (e?.content ?? e?.value ?? e?.text) === t) || (n.length === 0 || typeof n[0] == "string" ? n.unshift(t) : n.unshift({ - content: t, - text: t, - value: t - }), r.values = n); - } -}, pi = /* @__PURE__ */ new Set([ - "number", - "int", - "float", - "boolean", - "toggle", - "checkbox", - "button", - "hidden" -]), mi = [ - "output", - "save", - "export", - "folder", - "dir" -], hi = ["file", "path"], gi = [ - "path", - "file", - "input", - "src", - "source" -], _i = (e, t, n) => { - let r = e?.widgets; - if (!Array.isArray(r) || !r.length) return null; - let i = String(t || "").toLowerCase().replace(/^\./, ""), a = String(e?.type || "").toLowerCase(), o = n.knownNodeIncludes.some((e) => a.includes(e)), s = []; - for (let e of r) { - if (!e) continue; - let t = String(e?.type || "").toLowerCase(), r = e?.value; - if (pi.has(t) || typeof r == "number" || typeof r == "boolean") continue; - let a = t === "text" || t === "string" || t === "combo", c = typeof e?.callback == "function" && typeof r == "string"; - if (!a && !c) continue; - let l = String(e?.name || e?.label || "").toLowerCase().trim(), u = 0; - n.exactNames.has(l) && (u += 100), l === "file" && o && t === "combo" && n.comboChecker(e, i) && (u += 100); - let d = n.mediaTerms.some((e) => l.includes(e)), f = gi.some((e) => l.includes(e)); - d && f && (u += 80), hi.some((e) => l.includes(e)) && (u += 35); - for (let { terms: e, score: t } of n.extraTerms) e.some((e) => l.includes(e)) && (u += t); - mi.some((e) => l.includes(e)) && (u -= 90), n.exactSingleNames.has(l) && (typeof r == "string" && r.trim() === "" || n.looksLikeFn(r, i) ? u += 25 : u -= 10), o && (u += 15); - let p = typeof r == "string" && r.trim() === ""; - p && (u += 3), t === "combo" && n.comboChecker(e, i) && (u += 12), s.push({ - w: e, - score: u, - emptyValue: p, - combo: t === "combo" - }); - } - if (!s.length) return null; - s.sort((e, t) => t.score === e.score ? t.emptyValue === e.emptyValue ? t.combo === e.combo ? 0 : t.combo ? 1 : -1 : t.emptyValue ? 1 : -1 : t.score - e.score); - let c = s[0]; - if (!c || c.score < 20) return null; - try { - c.w[n.scoreKey] = c.score; - } catch (e) { - console.debug?.(e); - } - return c.w; -}, vi = { - exactNames: /* @__PURE__ */ new Set([ - "video_path", - "input_video", - "source_video", - "video", - "driven_video", - "footage", - "input_path", - "directory", - "folder_path", - "folder", - "path", - "video_directory" - ]), - knownNodeIncludes: [ - "loadvideo", - "vhs_loadvideo", - "videoloader", - "sadtalker", - "wav2lip", - "reactor", - "multiimageloader", - "ltxdirector", - "ltxsequencer", - "ltxkeyframer" - ], - mediaTerms: [ - "video", - "footage", - "clip", - "movie" - ], - extraTerms: [{ - terms: [ - "media", - "clip", - "footage", - "drive" - ], - score: 45 - }], - exactSingleNames: /* @__PURE__ */ new Set(["video"]), - looksLikeFn: Qr, - comboChecker: ei, - scoreKey: "__mjrVideoPickScore" -}, yi = { - exactNames: /* @__PURE__ */ new Set([ - "image", - "image_path", - "input_image", - "source_image", - "ref_image", - "pose_image", - "hint_image", - "target_image", - "ipadapter_image", - "input_path", - "directory", - "folder_path", - "folder", - "path", - "image_directory" - ]), - knownNodeIncludes: [ - "loadimage", - "loadimagemask", - "imageloader", - "reactor", - "roop", - "ipadapter", - "controlnet", - "instantid", - "pulid", - "multiimageloader", - "ltxdirector", - "ltxsequencer", - "ltxkeyframer" - ], - mediaTerms: [ - "image", - "img", - "mask", - "frame", - "photo", - "picture", - "face", - "ipadapter" - ], - extraTerms: [{ - terms: [ - "media", - "source", - "first", - "last", - "target", - "reference" - ], - score: 35 - }], - exactSingleNames: /* @__PURE__ */ new Set(["image", "face"]), - looksLikeFn: ti, - comboChecker: ni, - scoreKey: "__mjrImagePickScore" -}, bi = { - exactNames: /* @__PURE__ */ new Set([ - "audio_path", - "input_audio", - "source_audio", - "audio", - "driven_audio", - "voice", - "bgm", - "soundtrack", - "input_path", - "directory", - "folder_path", - "folder", - "path", - "audio_directory" - ]), - knownNodeIncludes: [ - "loadaudio", - "vhs_loadaudioupload", - "vhs_loadaudio", - "audioloader", - "inputaudio", - "sadtalker", - "wav2lip", - "multiimageloader", - "ltxdirector", - "ltxsequencer", - "ltxkeyframer" - ], - mediaTerms: [ - "audio", - "sound", - "music", - "voice", - "speech", - "wav", - "mp3" - ], - extraTerms: [{ - terms: [ - "media", - "track", - "drive" - ], - score: 45 - }], - exactSingleNames: /* @__PURE__ */ new Set(["audio", "voice"]), - looksLikeFn: ri, - comboChecker: ii, - scoreKey: "__mjrAudioPickScore" -}, xi = { - exactNames: /* @__PURE__ */ new Set([ - "model_path", - "input_model", - "source_model", - "mesh_path", - "input_mesh", - "geometry_path", - "scene_path", - "point_cloud_path", - "splat_path", - "model", - "mesh", - "geometry", - "input_path", - "directory", - "folder_path", - "folder", - "path", - "model_directory" - ]), - knownNodeIncludes: [ - "load3d", - "loadmodel", - "loadmesh", - "loadobj", - "loadgltf", - "loadglb", - "loadstl", - "loadply", - "pointcloud", - "meshloader", - "modelloader", - "tripo3d", - "unique3d", - "multiimageloader", - "ltxdirector", - "ltxsequencer", - "ltxkeyframer" - ], - mediaTerms: [ - "model", - "mesh", - "geometry", - "scene", - "object", - "point", - "cloud", - "splat" - ], - extraTerms: [{ - terms: ["asset", "resource"], - score: 30 - }], - exactSingleNames: /* @__PURE__ */ new Set([ - "model", - "mesh", - "geometry" - ]), - looksLikeFn: ai, - comboChecker: oi, - scoreKey: "__mjrModel3DPickScore" -}, Si = (e, t, n) => { - let r = String(t?.kind || "").toLowerCase(); - return _i(e, n, r === "model3d" ? xi : r === "audio" ? bi : r === "image" ? yi : vi); -}, Ci = (e, t, n, r) => { - if (!t || !t.inputs || !t.inputs.length) return null; - let i = e?.canvas?.canvas || document.querySelector("canvas"), a = e?.canvas?.ds; - if (!i || !a) return null; - let o = i.getBoundingClientRect(), s = Number(a.scale) || 1, c = a.offset || [0, 0], l = Array.isArray(c) ? Number(c[0]) || 0 : Number(c?.x) || 0, u = Array.isArray(c) ? Number(c[1]) || 0 : Number(c?.y) || 0, d = (n - o.left) / s - l, f = (r - o.top) / s - u, p = t.pos[0], m = t.pos[1], h = t.constructor.title_height || 30; - for (let e = 0; e < t.inputs.length; e++) { - let n = t.inputs[e], r = m + h + e * 20 + 10, i = d - p, a = f - r; - if (Math.abs(i) <= 18 && Math.abs(a) <= 12) return { - index: e, - input: n - }; - } - return null; -}, wi = (e) => { - let t = e?.canvas?.canvas || document.querySelector("canvas"); - return t ? t.getBoundingClientRect() : null; -}, Ti = (e, t) => { - let n = wi(e); - if (!n) return !1; - let r = t.clientX, i = t.clientY; - return r >= n.left && r <= n.right && i >= n.top && i <= n.bottom; -}, Ei = (e) => { - try { - e?.graph?.setDirtyCanvas?.(!0, !0); - } catch (e) { - console.debug?.(e); - } - try { - e?.canvas?.setDirty?.(!0, !0); - } catch (e) { - console.debug?.(e); - } -}, Di = (e) => { - let t = String(e?.filename || ""), n = t.lastIndexOf("."); - return n >= 0 ? t.slice(n).toLowerCase() : ""; -}, Oi = (e) => { - let t = String(e?.kind || "").toLowerCase(), n = Di(e); - return t === "image" || Lr.has(n) ? ["LoadImage"] : t === "video" || Rr.has(n) ? [ - "LoadVideo", - "VHS_LoadVideo", - "VideoLoader" - ] : t === "audio" || zr.has(n) ? [ - "LoadAudio", - "VHS_LoadAudioUpload", - "VHS_LoadAudio", - "AudioLoader" - ] : t === "model3d" || Br.has(n) ? [ - "Load3D", - "LoadModel", - "LoadMesh", - "LoadGLB", - "LoadOBJ", - "LoadSTL", - "LoadPLY" - ] : []; -}, ki = (e, t) => { - if (e) { - e.type === "combo" && fi(e, t), e.value = t; - try { - e.callback?.(e.value); - } catch (e) { - console.debug?.(e); - } - try { - typeof e.onchange == "function" && e.onchange(t); - } catch (e) { - console.debug?.(e); - } - } -}, Ai = (e) => { - let t = e?.canvas?.canvas || document.querySelector("canvas"), n = t?.getBoundingClientRect?.(), r = n ? Number(n.width || n.right - n.left) : 0, i = n ? Number(n.height || n.bottom - n.top) : 0, a = Number(r || t?.width || 800), o = Number(i || t?.height || 600); - if (!n) return [Math.max(0, a / 2), Math.max(0, o / 2)]; - let s = n && Number(n.left) || 0, c = n && Number(n.top) || 0; - return ji(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2)); -}, ji = (e, t, n) => { - let r = (e?.canvas?.canvas || document.querySelector("canvas"))?.getBoundingClientRect?.(), i = e?.canvas?.ds || {}, a = Number(i.scale) || 1, o = i.offset || [0, 0], s = Array.isArray(o) ? Number(o[0]) || 0 : Number(o?.x) || 0, c = Array.isArray(o) ? Number(o[1]) || 0 : Number(o?.y) || 0; - return !r || !Number.isFinite(Number(t)) || !Number.isFinite(Number(n)) ? Ai(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c]; -}, Mi = (e, t = null) => { - if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return ji(e, t.clientX, t.clientY); - try { - let n = e?.canvas?.convertEventToCanvasOffset?.(t); - if (Array.isArray(n)) return [Number(n[0]) || 0, Number(n[1]) || 0]; - } catch (e) { - console.debug?.(e); - } - return ji(e, t?.clientX, t?.clientY); -}, Ni = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => { - let o = e?.graph ?? e?.canvas?.graph ?? null; - if (!o || typeof o.add != "function") return !1; - let s = null; - for (let n of Oi(t)) try { - if (s = Ve(n, e), s) break; - } catch (e) { - console.debug?.(e); - } - if (!s) return !1; - s.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : Mi(e, r), o.add(s); - let c = Si(s, t, i); - return c && ki(c, n), Ei(e), !0; -}, Pi = ({ app: e, items: t = [], event: n = null, gap: r = 90 }) => { - let i = Array.isArray(t) ? t.filter(Boolean) : []; - if (!i.length) return 0; - let a = Mi(e, n), o = 0; - for (let t of i) Ni({ - app: e, - payload: t.payload, - relativePath: t.relativePath, - event: n, - droppedExt: t.droppedExt, - position: [a[0] + o * Number(r || 90), a[1]] - }) && (o += 1); - return o; -}, Fi = ki, Ii = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => { - let o = e?.graph ?? e?.canvas?.graph ?? null; - if (!o || typeof o.add != "function" || !r) return !1; - let s = null; - for (let n of Oi(t)) try { - if (s = Ve(n, e), s) break; - } catch (e) { - console.debug?.(e); - } - if (!s) return !1; - let c = Number(r.pos[0]) || 0, l = Number(r.pos[1]) || 0, u = Array.isArray(s.size) && Number(s.size[0]) || 220; - s.pos = [c - u - 60, l + Number(i) * 20], o.add(s); - let d = Di(t), f = Si(s, t, d); - f && ki(f, n); - try { - s.connect(0, r, i); - } catch (e) { - console.debug?.(e); - } - return Ei(e), !0; -}, Li = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { - let a = { - index: !!r, - files: [{ - filename: n.filename, - subfolder: n.subfolder || "", - dest_subfolder: "", - type: n.type || "output", - root_id: De(n) || void 0 - }] - }; - return i && (a.purpose = i), e(t, a); -}, Ri = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { - let a = await Li({ - post: e, - endpoint: t, - payload: n, - index: r, - purpose: i - }); - if (!a?.ok) return console.warn("Majoor: stage-to-input failed", a?.error || a), null; - let o = Array.isArray(a.data?.staged) ? a.data.staged[0] : null; - return o ? { - relativePath: (o?.subfolder ? `${o.subfolder}/${o.name}` : o?.name) || null, - absPath: o?.path || null, - name: o?.name || null, - subfolder: o?.subfolder || "" - } : null; -}, zi = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await Ri({ - post: e, - endpoint: t, - payload: n, - index: r, - purpose: i -}))?.relativePath || null, Bi = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Vi = /^[0-9a-f]{20,}$/i; -function Hi(...e) { - for (let t of e) { - let e = String(t || "").trim(); - if (e) return e; - } - return ""; -} -function Ui(e) { - let t = String(e || "").trim(); - return !!t && (Bi.test(t) || Vi.test(t)); -} -function Wi(e) { - return String(e?.type || e?.class_type || e?.comfyClass || e?.classType || "").trim(); -} -function Gi(e) { - return Hi(e?.properties?.subgraph_name, e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name, e?.subgraph?.name, e?.subgraph_instance?.name); -} -function Ki(e) { - let t = Wi(e), n = Gi(e); - return n && (!t || Ui(t) || n !== t) ? n : t && !Ui(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node"); -} -function qi(e) { - let t = Wi(e); - return t && !Ui(t) ? t : t ? "Subgraph" : "Node"; -} -// ui/components/sidebar/utils/minimap.ts -var Ji = 6, Yi = 1, Xi = 64, Zi = 74, Qi = 42, $i = [ - ["sampler", "#8e5cff"], - ["ksampler", "#8e5cff"], - ["loader", "#4f8cff"], - ["load", "#4f8cff"], - ["clip", "#d4a634"], - ["vae", "#36a7c9"], - ["latent", "#47a56d"], - ["image", "#8fb04a"], - ["video", "#c47b3d"], - ["mask", "#999999"], - ["conditioning", "#b56bd8"], - ["controlnet", "#c44f76"], - ["lora", "#d27a45"], - ["save", "#4aa37c"], - ["preview", "#4aa37c"], - ["api", "#3aa6a6"] -], ea = (e, t, n) => { - let r = Number(e); - return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; -}, ta = (e, t = !1) => { - let n = String(e || "").toUpperCase(); - return n.includes("IMAGE") ? "rgba(145,198,99,0.9)" : n.includes("LATENT") ? "rgba(89,178,118,0.9)" : n.includes("MODEL") ? "rgba(112,155,255,0.9)" : n.includes("CONDITIONING") ? "rgba(191,123,226,0.9)" : n.includes("CLIP") ? "rgba(220,178,77,0.9)" : n.includes("VAE") ? "rgba(72,184,214,0.9)" : n.includes("MASK") ? "rgba(190,190,190,0.88)" : n.includes("STRING") || n.includes("TEXT") ? "rgba(230,230,230,0.86)" : n.includes("INT") || n.includes("FLOAT") || n.includes("NUMBER") ? "rgba(130,210,220,0.88)" : t ? "rgba(170,220,255,0.82)" : "rgba(255,255,255,0.72)"; -}, na = (e, t, n) => { - let r = String(t || "").replace(/\s+/g, " ").trim(), i = Math.max(1, Number(n) || 1); - if (!r || e.measureText(r).width <= i) return r; - let a = r; - for (; a.length > 3 && e.measureText(`${a}...`).width > i;) a = a.slice(0, -1); - return a.length > 3 ? `${a}...` : r.slice(0, 3); -}; -function ra(e, t, n = null) { - if (!e) return; - let r = e.getContext?.("2d"); - if (!r) return; - let i = { - nodeColors: !0, - showLinks: !0, - showGroups: !0, - renderBypassState: !0, - renderErrorState: !0, - showViewport: !0, - showNodeLabels: !1, - expandSubgraphs: !0, - ...n && typeof n == "object" ? n : {} - }, a = i.expandSubgraphs === !1 ? t : ia(t), o = Array.isArray(a?.nodes) ? a.nodes : [], s = Array.isArray(a?.groups) && a.groups || Array.isArray(a?.extra?.groups) && a.extra.groups || Array.isArray(a?.extra?.groupNodes) && a.extra.groupNodes || Array.isArray(a?.extra?.group_nodes) && a.extra.group_nodes || [], c = Array.isArray(a?.links) && a.links || Array.isArray(a?.extra?.links) && a.extra.links || [], l = Math.max(1, e.clientWidth || e.width || 1), u = Math.max(1, e.clientHeight || e.height || 1); - if ((!o || o.length === 0) && (!s || s.length === 0)) return r.clearRect(0, 0, l, u), null; - let d = (e, t) => { - if (!e || typeof e != "string") return `rgba(255,255,255,${t})`; - let n = e.trim(); - if (!n) return `rgba(255,255,255,${t})`; - let r = n.match(/^rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([0-9.]+))?\)\s*$/i); - if (r) { - let e = Number(r[1]), n = Number(r[2]), i = Number(r[3]); - if ([ - e, - n, - i - ].every((e) => Number.isFinite(e))) return `rgba(${e},${n},${i},${t})`; - } - let i = n.startsWith("#") ? n.slice(1) : ""; - if (i.length === 3) { - let e = parseInt(i[0] + i[0], 16), n = parseInt(i[1] + i[1], 16), r = parseInt(i[2] + i[2], 16); - if ([ - e, - n, - r - ].every((e) => Number.isFinite(e))) return `rgba(${e},${n},${r},${t})`; - } - if (i.length === 6) { - let e = parseInt(i.slice(0, 2), 16), n = parseInt(i.slice(2, 4), 16), r = parseInt(i.slice(4, 6), 16); - if ([ - e, - n, - r - ].every((e) => Number.isFinite(e))) return `rgba(${e},${n},${r},${t})`; - } - return n; - }, f = (e) => { - let t = e?.bgcolor || e?.color || null; - if (t) return t; - let n = String(e?.category || e?.type || e?.comfyClass || e?.class_type || e?.title || "").toLowerCase(); - for (let [e, t] of $i) if (n.includes(e)) return t; - let r = 0; - for (let e = 0; e < n.length; e += 1) r = r * 31 + n.charCodeAt(e) | 0; - return `hsl(${Math.abs(r) % 360} 42% 42%)`; - }, p = (e) => { - let t = [], n = e?.inputs && typeof e.inputs == "object" && !Array.isArray(e.inputs) ? e.inputs : null; - if (n) { - for (let [e, r] of Object.entries(n)) if (!(Array.isArray(r) || r && typeof r == "object") && (t.push([e, r]), t.length >= 3)) return t; - } - let r = Array.isArray(e?.widgets_values) ? e.widgets_values : [], i = Array.isArray(e?.widgets) ? e.widgets : [], a = Array.isArray(e?.inputs) ? e.inputs : [], o = a.filter((e) => e?.widget === !0 || e?.widget && typeof e.widget == "object" || typeof e?.widget == "string" && e.widget.trim()), s = a.filter((e) => e?.link == null && fa(e?.type)), c = (o.length ? o : s.length ? s : a).map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); - return r.forEach((e, n) => { - let r = i[n]?.name || i[n]?.label || c[n] || `p${n + 1}`; - t.push([r, e]); - }), t.slice(0, 3); - }, m = [], h = /* @__PURE__ */ new Map(), g = (e) => { - if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; - if (e && typeof e == "object") { - let t = e[0] ?? e[0] ?? e.x ?? e.left ?? null, n = e[1] ?? e[1] ?? e.y ?? e.top ?? null; - if (t !== null && n !== null) return [Number(t), Number(n)]; - } - return null; - }, _ = (e) => { - if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; - if (e && typeof e == "object") { - let t = e[0] ?? e[0] ?? e.w ?? e.width ?? null, n = e[1] ?? e[1] ?? e.h ?? e.height ?? null; - if (t !== null && n !== null) return [Number(t), Number(n)]; - } - return null; - }; - for (let e of o || []) { - let t = e?.id ?? e?.ID ?? e?.node_id ?? null, n = t == null ? null : String(t), r = g(e?.pos), o = _(e?.size); - if (!r || !o) continue; - let s = Number(r[0]), c = Number(r[1]), l = Math.max(1, Number(o[0])), u = Math.max(1, Number(o[1])); - if (!Number.isFinite(s) || !Number.isFinite(c) || !Number.isFinite(l) || !Number.isFinite(u)) continue; - let d = Number(e?.mode), v = d === 2 || d === 4, y = a?.extra?.errors || a?.extra?.node_errors || null, b = !!(y && typeof y == "object" && n && y[n] || e?.error || e?.errors || e?.flags?.error || e?.properties?.error), x = f(e), S = Array.isArray(e?.inputs) ? e.inputs : [], C = Array.isArray(e?.outputs) ? e.outputs : []; - m.push({ - kind: "node", - id: n, - x: s, - y: c, - w: l, - h: u, - fill: i.nodeColors ? x : null, - stroke: i.nodeColors ? e?.color || x : null, - bypassed: v, - errored: b, - type: String(e?.type || e?.comfyClass || e?.class_type || "").trim(), - rows: p(e), - inputs: S, - outputs: C, - inputCount: S.length || (e?.inputs && typeof e.inputs == "object" ? Object.keys(e.inputs).length : 0), - outputCount: C.length, - label: Ki(e).replace(/\s+/g, " ").trim() - }), n && h.set(n, m[m.length - 1]); - } - if (i.showGroups) for (let e of s || []) { - let t = Array.isArray(e?.bounding) && e.bounding.length >= 4 ? e.bounding : null, n = t ? [Number(t[0]), Number(t[1])] : g(e?.pos), r = t ? [Number(t[2]), Number(t[3])] : _(e?.size); - if (!n || !r) continue; - let i = Number(n[0]), a = Number(n[1]), o = Math.max(1, Number(r[0])), s = Math.max(1, Number(r[1])); - Number.isFinite(i) && Number.isFinite(a) && Number.isFinite(o) && Number.isFinite(s) && m.push({ - kind: "group", - x: i, - y: a, - w: o, - h: s, - fill: e?.color || e?.bgcolor || e?.borderColor || null, - stroke: e?.borderColor || e?.color || e?.bgcolor || null - }); - } - if (!m.length) return r.clearRect(0, 0, l, u), null; - let v = m[0].x, y = m[0].y, b = m[0].x + m[0].w, x = m[0].y + m[0].h; - for (let e of m) v = Math.min(v, e.x), y = Math.min(y, e.y), b = Math.max(b, e.x + e.w), x = Math.max(x, e.y + e.h); - let S = Math.max(1, b - v), C = Math.max(1, x - y), ee = v + S / 2, te = y + C / 2, w = i.view && typeof i.view == "object" ? i.view : Object.create(null), T = ea(w.zoom ?? 1, Yi, Xi), ne = Math.max(1, S / T), re = Math.max(1, C / T), E = ne / 2, ie = re / 2, ae = ne >= S ? ee : ea(w.centerX ?? ee, v + E, b - E), D = re >= C ? te : ea(w.centerY ?? te, y + ie, x - ie), oe = ae - E, se = D - ie, ce = Ji, le = Math.min((l - 12) / ne, (u - 12) / re), ue = w.hoveredNodeId !== null && w.hoveredNodeId !== void 0 ? String(w.hoveredNodeId) : null; - r.clearRect(0, 0, l, u), r.fillStyle = "rgba(0,0,0,0.22)", r.fillRect(0, 0, l, u); - let O = (e, t) => ({ - x: ce + (e - oe) * le, - y: ce + (t - se) * le - }), de = (e, t) => ({ - x: ea(oe + (Number(e) - ce) / le, v, b), - y: ea(se + (Number(t) - ce) / le, y, x) - }), fe = (e) => ({ - x: ce + (e.x - oe) * le, - y: ce + (e.y - se) * le, - w: Math.max(1, e.w * le), - h: Math.max(1, e.h * le) - }), pe = (e) => Math.max(10, Math.min(24, Math.floor(Number(e) * .2))), me = (e, t, n) => { - let r = fe(e), i = pe(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = ea(t, 0, Math.max(0, o - 1)); - return r.y + i + (r.h - i) * (s + 1) / (o + 1); - }, he = (e) => Array.isArray(e) && e.length >= 5 ? { - originId: e[1], - originSlot: Number(e[2]) || 0, - targetId: e[3], - targetSlot: Number(e[4]) || 0, - type: e[5] - } : e && typeof e == "object" ? { - originId: e.origin_id ?? e.originId ?? e.from ?? null, - originSlot: Number(e.origin_slot ?? e.originSlot ?? e.fromSlot ?? 0) || 0, - targetId: e.target_id ?? e.targetId ?? e.to ?? null, - targetSlot: Number(e.target_slot ?? e.targetSlot ?? e.toSlot ?? 0) || 0, - type: e.type - } : null, ge = (e) => { - let t = String(e || "").toUpperCase(); - return t.includes("IMAGE") ? "rgba(145,198,99,0.38)" : t.includes("LATENT") ? "rgba(89,178,118,0.38)" : t.includes("MODEL") ? "rgba(112,155,255,0.38)" : t.includes("CONDITIONING") ? "rgba(191,123,226,0.38)" : t.includes("CLIP") ? "rgba(220,178,77,0.38)" : t.includes("VAE") ? "rgba(72,184,214,0.38)" : t.includes("MASK") ? "rgba(190,190,190,0.36)" : "rgba(255,255,255,0.2)"; - }, _e = () => { - if (i.showLinks && c && c.length !== 0) { - r.save(), r.globalAlpha = 1, r.lineWidth = 1; - for (let e of c) { - let t = he(e), n = t?.originId, i = t?.targetId; - if (n === null || i === null) continue; - let a = h.get(String(n)), o = h.get(String(i)); - if (!a || !o) continue; - let s = fe(a), c = fe(o), l = { - x: s.x + s.w, - y: me(a, t?.originSlot ?? 0, "output") - }, u = { - x: c.x, - y: me(o, t?.targetSlot ?? 0, "input") - }, d = Math.max(12, Math.min(80, Math.abs(u.x - l.x) * .35)); - r.strokeStyle = ge(t?.type), r.beginPath(), r.moveTo(l.x, l.y), r.bezierCurveTo(l.x + d, l.y, u.x - d, u.y, u.x, u.y), r.stroke(); - } - r.restore(); - } - }, ve = (e) => { - let { x: t, y: n, w: a, h: o } = fe(e), s = e.kind === "node", c = e.kind === "group", l = !!e.bypassed, u = !!e.errored, f = c ? .18 : l && i.renderBypassState ? .14 : .62, p = c ? .55 : l && i.renderBypassState ? .32 : .8, m = d(e.fill, f), h = d(e.stroke, p), g = s && i.showNodeLabels && a >= Zi && o >= Qi, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? pe(o) : 0; - if (r.save(), r.globalAlpha = 1, typeof m == "string" && (m.startsWith("#") || m.startsWith("rgb") || m.startsWith("hsl")) ? (r.fillStyle = m, r.globalAlpha = f) : (r.fillStyle = typeof m == "string" ? m : "rgba(82,88,96,0.72)", r.globalAlpha = f), typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, o, _), r.fill()) : r.fillRect(t, n, a, o), r.restore(), s && (r.save(), r.fillStyle = d(e.stroke || e.fill, l ? .34 : .9), typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, v, [ - _, - _, - 0, - 0 - ]), r.fill()) : r.fillRect(t, n, a, v), r.restore()), r.globalAlpha = 1, r.strokeStyle = "rgba(255,255,255,0.22)", typeof h == "string" && (h.startsWith("#") || h.startsWith("rgb") || h.startsWith("hsl")) && (r.save(), r.globalAlpha = p, r.strokeStyle = h, r.restore()), s && l && i.renderBypassState) try { - r.setLineDash([3, 2]); - } catch (e) { - console.debug?.(e); - } - else try { - r.setLineDash([]); - } catch (e) { - console.debug?.(e); - } - if (r.lineWidth = 1, typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, o, _), r.stroke()) : r.strokeRect(t, n, a, o), s && a >= 24 && o >= 20) { - let n = Math.min(g ? 16 : 6, Number(e.inputCount) || 0), i = Math.min(g ? 16 : 6, Number(e.outputCount) || 0); - r.save(), r.strokeStyle = "rgba(0,0,0,0.48)", r.lineWidth = 1; - for (let i = 0; i < n; i += 1) { - let n = me(e, i, "input"); - r.fillStyle = ta(e.inputs?.[i]?.type, !1), r.beginPath(), r.arc(t, n, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); - } - for (let n = 0; n < i; n += 1) { - let i = me(e, n, "output"); - r.fillStyle = ta(e.outputs?.[n]?.type, !0), r.beginPath(), r.arc(t + a, i, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); - } - r.restore(); - } - if (s && u && i.renderErrorState) { - try { - r.setLineDash([]); - } catch (e) { - console.debug?.(e); - } - r.strokeStyle = "rgba(244,67,54,0.95)", r.lineWidth = 1.5, r.strokeRect(t - .5, n - .5, a + 1, o + 1); - } - if (s && ue && String(e.id || "") === ue) { - try { - r.setLineDash([]); - } catch (e) { - console.debug?.(e); - } - r.strokeStyle = "rgba(255,224,130,0.96)", r.lineWidth = 2, r.strokeRect(t - 1, n - 1, a + 2, o + 2); - } - if (s && i.showNodeLabels && e.label && a >= 42 && o >= 12) { - let i = Math.max(8, Math.min(12, Math.floor(v * .58))), o = n + Math.max(8, Math.floor((v + i) / 2) - 1), s = Math.max(20, a - 6), c = e.label; - for (r.save(), r.beginPath(), r.rect(t + 2, n + 1, a - 4, v - 1), r.clip(), r.font = `600 ${i}px sans-serif`; c.length > 3 && r.measureText(`${c}...`).width > s;) c = c.slice(0, -1); - let l = c === e.label ? c : `${c}...`; - r.fillStyle = "rgba(255,255,255,0.92)", r.shadowColor = "rgba(0,0,0,0.5)", r.shadowBlur = 2, r.fillText(l, t + 3, o, s), r.restore(); - } - if (s && i.showNodeLabels && Array.isArray(e.rows) && a >= 76 && o >= 46) { - let i = Math.max(7, Math.min(10, Math.floor(o * .12))), s = Math.max(9, i + 4), c = n + v + 4; - r.save(), r.font = `500 ${i}px sans-serif`, r.fillStyle = "rgba(255,255,255,0.62)"; - for (let l = 0; l < e.rows.length; l += 1) { - let u = c + l * s; - if (u + s > n + o - 2) break; - let [d, f] = e.rows[l], p = `${String(d)}: ${String(f).replace(/\s+/g, " ").slice(0, 42)}`; - r.fillText(p, t + 5, u + i, Math.max(20, a - 10)); - } - r.restore(); - } - if (g && a >= 110) { - let n = Math.max(7, Math.min(9, Math.floor(o * .09))); - r.save(), r.font = `500 ${n}px sans-serif`, r.fillStyle = "rgba(255,255,255,0.5)"; - let i = Math.max(24, a * .34); - for (let a = 0; a < Math.min(8, e.inputs?.length || 0); a += 1) { - let o = e.inputs[a], s = String(o?.label || o?.localized_name || o?.name || "").trim(); - s && r.fillText(na(r, s, i), t + 7, me(e, a, "input") + n * .35, i); - } - for (let o = 0; o < Math.min(8, e.outputs?.length || 0); o += 1) { - let s = e.outputs[o], c = String(s?.label || s?.localized_name || s?.name || "").trim(); - if (!c) continue; - let l = na(r, c, i); - r.fillText(l, t + a - 7 - Math.min(i, r.measureText(l).width), me(e, o, "output") + n * .35, i); - } - r.restore(); - } - }; - for (let e of m.filter((e) => e.kind === "group")) ve(e); - _e(); - for (let e of m.filter((e) => e.kind === "node")) ve(e); - if (i.showViewport) try { - let e = Ae(); - if (e) { - let t = O(e.x0, e.y0), n = O(e.x1, e.y1), i = Math.min(t.x, n.x), a = Math.min(t.y, n.y), o = Math.abs(n.x - t.x), s = Math.abs(n.y - t.y); - r.save(), r.globalAlpha = 1, r.strokeStyle = "rgba(255,255,255,0.9)", r.lineWidth = 1, r.strokeRect(i, a, o, s), r.restore(); - } - } catch (e) { - console.debug?.(e); - } - return r.globalAlpha = 1, { - bounds: { - minX: v, - minY: y, - maxX: b, - maxY: x, - width: S, - height: C - }, - resolvedView: { - zoom: T, - centerX: ae, - centerY: D, - visibleW: ne, - visibleH: re, - viewMinX: oe, - viewMinY: se, - pad: ce, - renderScale: le - }, - canvasToWorld: de, - worldToCanvas: O, - hitTestNode: (e, t) => { - let n = de(e, t); - for (let e = m.length - 1; e >= 0; --e) { - let t = m[e]; - if (t.kind === "node" && n.x >= t.x && n.x <= t.x + t.w && n.y >= t.y && n.y <= t.y + t.h) return t; - } - return null; - } - }; -} -function ia(e, t = null) { - if (!e || typeof e != "object") return e; - let n = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], r = aa(e, t); - if (!n.length) return e; - let i = [], a = Array.isArray(e.links) ? [...e.links] : [], o = [...Array.isArray(e.groups) ? e.groups : [], ...Array.isArray(e.extra?.groups) ? e.extra.groups : []]; - for (let e of n) { - i.push(e); - let t = oa(e, r); - if (!t || !Array.isArray(t.nodes) || !t.nodes.length) continue; - let n = ca(e, ia(t, r)); - i.push(...n.nodes), a.push(...n.links), n.group && o.push(n.group); - } - return { - ...e, - nodes: i, - links: a, - groups: o, - extra: { - ...e.extra || {}, - groups: o - } - }; -} -function aa(e, t = null) { - let n = [ - ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], - ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], - ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] - ], r = new Map(t || []); - for (let e of n) for (let t of sa(e)) t != null && r.set(String(t), e); - return r; -} -function oa(e, t) { - let n = [ - e?.type, - e?.comfyClass, - e?.class_type, - e?.properties?.subgraph_id, - e?.properties?.subgraphId, - e?.subgraph?.id, - e?._subgraph?.id, - e?.subgraph_instance?.id - ]; - for (let e of n) { - if (e == null) continue; - let n = t.get(String(e)); - if (n) return n; - } - return [ - e?.subgraph, - e?._subgraph, - e?.subgraph?.graph, - e?.subgraph?.lgraph, - e?.properties?.subgraph, - e?.subgraph_instance, - e?.subgraph_instance?.graph, - e?.inner_graph, - e?.subgraph_graph - ].find((e) => e && typeof e == "object" && Array.isArray(e.nodes)) || null; -} -function sa(e) { - return [ - e?.id, - e?.name, - e?.type, - e?.uuid, - e?.workflowId, - e?.workflow_id, - e?.properties?.subgraph_id, - e?.properties?.subgraphId - ].filter((e) => e != null && String(e).trim()); -} -function ca(e, t) { - let n = String(e?.id ?? e?.ID ?? ""), r = ua(e?.pos) || [0, 0], i = da(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = la(a), s = Math.min(22, Math.max(8, i[0] * .08)), c = Math.min(34, Math.max(18, i[1] * .18)), l = Math.min(18, Math.max(8, i[1] * .08)), u = Math.max(40, i[0] - s * 2), d = Math.max(34, i[1] - c - l), f = Math.min(1, u / o.width, d / o.height), p = r[0] + s + (u - o.width * f) / 2, m = r[1] + c + (d - o.height * f) / 2, h = a.map((r) => { - let i = ua(r?.pos) || [o.minX, o.minY], a = da(r?.size) || [140, 60]; - return { - ...r, - id: `${n}::${r?.id ?? r?.ID ?? ""}`, - pos: [p + (i[0] - o.minX) * f, m + (i[1] - o.minY) * f], - size: [Math.max(18, a[0] * f), Math.max(14, a[1] * f)], - _mjrSubgraphParentId: n, - _mjrSubgraphName: t?.name || e?.title || e?.type || "Subgraph" - }; - }), g = (e) => `${n}::${e}`; - return { - nodes: h, - links: (Array.isArray(t.links) ? t.links : []).map((e) => { - if (Array.isArray(e) && e.length >= 4) { - let t = [...e]; - return t[1] = g(t[1]), t[3] = g(t[3]), t; - } - return e && typeof e == "object" ? { - ...e, - origin_id: e.origin_id == null ? e.origin_id : g(e.origin_id), - originId: e.originId == null ? e.originId : g(e.originId), - from: e.from == null ? e.from : g(e.from), - target_id: e.target_id == null ? e.target_id : g(e.target_id), - targetId: e.targetId == null ? e.targetId : g(e.targetId), - to: e.to == null ? e.to : g(e.to) - } : e; - }), - group: { - title: t?.name || e?.title || "Subgraph", - bounding: [ - r[0] + 4, - r[1] + 18, - Math.max(1, i[0] - 8), - Math.max(1, i[1] - 22) - ], - color: e?.color || e?.bgcolor || "#7f8ca3", - borderColor: "#9fb5d8" - } - }; -} -function la(e) { - let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity; - for (let a of e) { - let e = ua(a?.pos); - if (!e) continue; - let o = da(a?.size) || [140, 60]; - t = Math.min(t, e[0]), n = Math.min(n, e[1]), r = Math.max(r, e[0] + o[0]), i = Math.max(i, e[1] + o[1]); - } - return Number.isFinite(t) ? { - minX: t, - minY: n, - width: Math.max(1, r - t), - height: Math.max(1, i - n) - } : { - minX: 0, - minY: 0, - width: 1, - height: 1 - }; -} -function ua(e) { - if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; - if (e && typeof e == "object") { - let t = e[0] ?? e[0] ?? e.x ?? e.left ?? null, n = e[1] ?? e[1] ?? e.y ?? e.top ?? null; - if (t !== null && n !== null) return [Number(t), Number(n)]; - } - return null; -} -function da(e) { - if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; - if (e && typeof e == "object") { - let t = e[0] ?? e[0] ?? e.w ?? e.width ?? null, n = e[1] ?? e[1] ?? e.h ?? e.height ?? null; - if (t !== null && n !== null) return [Number(t), Number(n)]; - } - return null; -} -function fa(e) { - if (Array.isArray(e)) return !0; - let t = String(e || "").trim().toUpperCase(); - return t === "INT" || t === "FLOAT" || t === "STRING" || t === "BOOLEAN" || t === "BOOL" || t === "COMBO" || t === "ENUM"; -} -function pa(e, t = null) { - if (!e || typeof e != "object") return null; - let n = { - maxNodes: 220, - ...t && typeof t == "object" ? t : {} - }, r = Object.entries(e); - if (!r.length) return null; - let i = [], a = [], o = /* @__PURE__ */ new Map(), s = (e) => e == null ? null : String(e) || null, c = (e) => Array.isArray(e) && e.length === 2 && s(e[0]) != null && Number.isFinite(Number(e[1])); - for (let [e, t] of r.slice(0, n.maxNodes)) { - if (!t || typeof t != "object") continue; - let n = s(e); - if (!n) continue; - let r = String(t.class_type || t.type || t.classType || "").trim(), l = t.inputs && typeof t.inputs == "object" ? t.inputs : {}, u = {}, d = []; - for (let e of Object.values(l)) { - if (!c(e)) continue; - let t = s(e[0]); - t && (d.push(t), a.push([t, n])); - } - for (let [e, t] of Object.entries(l)) c(t) || (u[e] = t); - o.set(n, d); - let f = r.toLowerCase(), p = "#3a3a3a", m = "#6b6b6b"; - f.includes("ksampler") || f.includes("sampler") ? (p = "#6a4b1f", m = "#b07a2c") : f.includes("cliptext") || f.includes("textencode") || f.includes("conditioning") ? (p = "#1f5f3a", m = "#2cb06c") : f.includes("checkpoint") || f.includes("loader") || f.includes("model") ? (p = "#243a6a", m = "#3f6fd6") : (f.includes("save") || f.includes("preview") || f.includes("video")) && (p = "#4a2a5f", m = "#8c4cd1"), i.push({ - id: Number.isFinite(Number(n)) ? Number(n) : n, - type: r || "Node", - pos: [0, 0], - size: [180, 80], - bgcolor: p, - color: m, - title: String(t?._meta?.title || t?.title || "").trim() || void 0, - inputs: u, - outputs: [] - }); - } - if (!i.length) return null; - let l = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Set(), d = (e) => { - if (l.has(e)) return l.get(e); - if (u.has(e)) return 0; - u.add(e); - let t = 0, n = o.get(e) || []; - for (let e of n) t = Math.max(t, d(e) + 1); - return u.delete(e), l.set(e, t), t; - }; - for (let e of i) d(String(e.id)); - let f = /* @__PURE__ */ new Map(); - for (let e of i) { - let t = l.get(String(e.id)) ?? 0; - f.has(t) || f.set(t, []), f.get(t).push(e); - } - let p = Array.from(f.keys()).sort((e, t) => e - t); - for (let e of p) { - let t = f.get(e) || []; - t.sort((e, t) => Number(e.id) - Number(t.id)); - for (let n = 0; n < t.length; n++) t[n].pos = [e * 220, n * 110]; - } - let m = 1; - return { - id: "synthetic", - nodes: i, - links: a.filter(([e, t]) => e !== t).slice(0, 4e3).map(([e, t]) => [ - m++, - Number.isFinite(Number(e)) ? Number(e) : e, - 0, - Number.isFinite(Number(t)) ? Number(t) : t, - 0, - "LINK" - ]), - extra: { synthetic: !0 } - }; -} -// ui/features/workflows/workflowPickerState.ts -var Z = yt({ - open: !1, - mode: "workflow", - title: "", - sourceAsset: null, - workflow: null, - items: [], - resolve: null -}); -function ma({ title: e = "Select workflow", sourceAsset: t = null } = {}) { - return ga(null), Z.open = !0, Z.mode = "workflow", Z.title = String(e || "Select workflow"), Z.sourceAsset = t || null, Z.workflow = null, Z.items = [], new Promise((e) => { - Z.resolve = e; - }); -} -function ha({ title: e = "Select asset", workflow: t = null, items: n = [] } = {}) { - return ga(null), Z.open = !0, Z.mode = "asset", Z.title = String(e || "Select asset"), Z.sourceAsset = null, Z.workflow = t || null, Z.items = Array.isArray(n) ? n.filter(Boolean) : [], new Promise((e) => { - Z.resolve = e; - }); -} -function ga(e = null) { - let t = Z.resolve; - if (Z.open = !1, Z.mode = "workflow", Z.title = "", Z.sourceAsset = null, Z.workflow = null, Z.items = [], Z.resolve = null, typeof t == "function") try { - t(e || null); - } catch (e) { - console.debug?.(e); - } -} -// ui/vue/majoorPrimeVue.ts -var _a = { - Button: dt, - Checkbox: ut, - InputText: Tt, - Textarea: gt, - Select: Ct, - ToggleButton: bt, - Badge: xt, - Tag: st, - Dialog: mt, - Menu: St, - Listbox: vt, - Tree: wt, - VirtualScroller: lt -}; -function va(e) { - return e.use(ft, { - ripple: !1, - unstyled: !0, - zIndex: { overlay: 10100 } - }), e.use(pt), e.use(_t), Object.entries(_a).forEach(([t, n]) => { - e.component(`M${t}`, n); - }), e; -} -// ui/vue/createVueApp.ts -function ya(e, t = void 0) { - let n = kt(), r = ot(e, t); - return r.use(n), va(r), { - app: r, - pinia: n - }; -} -var ba = /* @__PURE__ */ new Map(); -function xa(e, t, n) { - try { - window.dispatchEvent(new CustomEvent("mjr:keepalive-attached", { detail: { - mountKey: String(e || "_mjrVueApp"), - host: t || null, - container: n || null - } })); - } catch {} -} -function Sa(e) { - let t = document.createElement("div"); - return t.dataset.mjrKeepAliveHost = String(e || "_mjrVueApp"), t.style.height = "100%", t.style.width = "100%", t.style.minHeight = "0", t.style.display = "flex", t.style.flexDirection = "column", t.style.overflow = "hidden", t; -} -function Ca(e, t) { - e && t && (e.style.height = "100%", e.style.minHeight = "0", e.style.display = "flex", e.style.flexDirection = "column", e.style.overflow = "hidden", (e.firstChild !== t || e.childNodes.length !== 1) && (e.replaceChildren(t), xa(t?.dataset?.mjrKeepAliveHost, t, e))); -} -function wa(e, t, n = "_mjrVueApp", { attachIfExists: r = !0 } = {}) { - if (!e) return !1; - let i = ba.get(n), a = !1; - if (!i) { - let e = Sa(n), { app: r } = ya(t); - r.mount(e), i = { - app: r, - host: e, - container: null - }, ba.set(n, i), a = !0; - } - return (a || r) && (Ca(e, i.host), i.container = e), a; -} -function Ta(e = "_mjrVueApp") { - return ba.has(e); -} -function Ea(e, t = "_mjrVueApp") { - let n = ba.get(t); - if (n?.app) { - try { - n.app.unmount(); - } catch {} - try { - n.host?.remove?.(); - } catch {} - ba.delete(t); - } -} -// ui/utils/format.ts -function Da(e) { - if (!e) return null; - let t = Number(e); - if (!isNaN(t)) return /* @__PURE__ */ new Date(t * 1e3); - let n = new Date(e); - return isNaN(n.getTime()) ? null : n; -} -function Oa(e) { - let t = Da(e); - return t ? `${t.getDate().toString().padStart(2, "0")}/${(t.getMonth() + 1).toString().padStart(2, "0")}` : ""; -} -function ka(e) { - let t = Da(e); - return t ? `${t.getHours().toString().padStart(2, "0")}:${t.getMinutes().toString().padStart(2, "0")}` : ""; -} -function Aa(e) { - return e ? e < 60 ? `${Math.round(e)}s` : `${Math.floor(e / 60)}m ${Math.round(e % 60)}s` : ""; -} -var ja = { - version: 1, - parser_family_version: "geninfo-catalog-v1", - sections: [ - { - key: "file_info", - title: "File Info", - searchField: "file", - aliases: [ - "filename", - "path", - "size", - "resolution" - ] - }, - { - key: "prompt", - title: "Prompt", - searchField: "prompt", - aliases: [ - "positive", - "negative", - "text" - ] - }, - { - key: "model", - title: "Models", - searchField: "model", - aliases: [ - "checkpoint", - "ckpt", - "vae", - "clip" - ] - }, - { - key: "sampler", - title: "Sampling", - searchField: "sampler", - aliases: [ - "sampling", - "scheduler", - "steps", - "cfg", - "seed", - "denoise" - ] - }, - { - key: "lora", - title: "LoRAs", - searchField: "lora", - aliases: ["loras", "lycoris"] - }, - { - key: "control", - title: "Control", - searchField: "control", - aliases: [ - "controlnet", - "adapter", - "ipadapter" - ] - }, - { - key: "upscale", - title: "Upscaling", - searchField: "upscale", - aliases: [ - "upscaler", - "upscaling", - "scale" - ] - }, - { - key: "workflow_nodes", - title: "Workflow Nodes", - searchField: "node", - aliases: [ - "nodes", - "workflow_node", - "workflow_nodes" - ] - }, - { - key: "tags", - title: "Tags", - searchField: "tag", - aliases: ["tags", "rating"] - } - ] -}; -function Ma() { - let e = {}; - for (let t of ja.sections) { - e[t.key] = t.searchField, e[t.searchField] = t.searchField; - for (let n of t.aliases || []) e[String(n).toLowerCase()] = t.searchField; - } - return e; -} -function Na(e) { - let t = String(e || "").trim().toLowerCase(); - return Ma()[t] || ""; -} -function Pa(e) { - let t = String(e || "").trim().toLowerCase(); - return t && ja.sections.find((e) => e.key === t) || null; -} -// ui/vue/components/panel/sidebar/SidebarFileInfoSection.vue?vue&type=script&setup=true&lang.ts -var Fa = { - key: 0, - class: "mjr-sidebar-section", - style: { - background: "rgba(255, 255, 255, 0.03)", - border: "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))", - "border-radius": "8px", - padding: "10px" - } -}, Ia = { style: { - display: "flex", - "flex-direction": "column", - gap: "6px" -} }, La = ["title"], Ra = ["title"], za = /* @__PURE__ */ nt({ - __name: "SidebarFileInfoSection", - props: { asset: {} }, - setup(e) { - let t = e; - function n(e) { - let t = Number(e); - if (!Number.isFinite(t) || t < 0) return "N/A"; - if (t === 0) return "0 bytes"; - let n = [ - "B", - "KB", - "MB", - "GB" - ], r = 0, i = t; - for (; i >= 1024 && r < n.length - 1;) i /= 1024, r += 1; - return r === 0 ? `${Math.round(i)} bytes` : `${i.toFixed(1)} ${n[r]}`; - } - function r(e) { - let t = e?.metadata_raw; - if (t && typeof t == "object") return t; - if (typeof t != "string" || !t.trim()) return {}; - try { - let e = JSON.parse(t); - return e && typeof e == "object" ? e : {}; - } catch { - return {}; - } - } - function i(...e) { - return e.find((e) => e != null && e !== ""); - } - function a(e) { - if (e == null) return !1; - let t = String(e).trim(); - return t !== "" && t.toUpperCase() !== "N/A"; - } - function o(e, t) { - let n = i(e.bits_per_raw_sample, e.bits_per_sample, t.bits_per_channel, t.bitsperchannel, t.bit_depth), r = String(i(e.pix_fmt, t.pixel_format, t.pix_fmt) || ""), a = Number(r.match(/(?:p|gray|gbrp)(\d+)(?:le|be)?$/i)?.[1]), o = Number(n) || (a >= 8 ? a : 0), s = String(i(e.sample_fmt, t.sample_format) || "").toLowerCase(), c = s.includes("flt") || s.includes("dbl") || /(?:16|32)f\b/i.test(r); - return o > 0 ? `${o}-bit ${c ? "float" : "fixed"}` : r ? `8-bit ${c ? "float" : "fixed"}` : c ? "float" : "N/A"; - } - function s(e, t) { - let n = e?.[t] ?? e?.file_info?.[t]; - return n != null && n !== "" ? n : t === "workflow_id" ? e?.user_metadata?.workflow?.id ?? e?.metadata?.workflow_id ?? "" : ""; - } - let c = F(() => { - let e = t.asset || {}, c = r(e), l = c?.raw_ffprobe && typeof c.raw_ffprobe == "object" ? c.raw_ffprobe : {}, u = l?.video_stream && typeof l.video_stream == "object" ? l.video_stream : {}, d = l?.format && typeof l.format == "object" ? l.format : {}, f = []; - e.width && e.height && f.push({ - label: "Dimensions", - value: `${e.width} x ${e.height}`, - tooltip: "Image/video resolution in pixels" - }), e.duration && e.duration > 0 && f.push({ - label: "Duration", - value: Aa(e.duration), - tooltip: "Video duration" - }); - let p = Ye(e); - p != null && f.push({ - label: "FPS", - value: qe(p), - tooltip: "Native frame rate" - }); - let m = Je(e, p); - f.push({ - label: "Frames", - value: m == null ? "N/A" : String(Math.max(0, Math.floor(m))), - tooltip: "Total frame count" - }), f.push({ - label: "Bits / Channel", - value: o(u, c), - tooltip: "Channel precision and numeric representation" - }), f.push({ - label: "Pixel Aspect", - value: String(i(u.sample_aspect_ratio, c.pixel_aspect_ratio) || "N/A"), - tooltip: "Pixel sample aspect ratio" - }), f.push({ - label: "Codec ID", - value: String(i(u.codec_tag_string, u.codec_tag, c.codec_id) || "N/A"), - tooltip: "Container codec identifier" - }), f.push({ - label: "Codec Name", - value: String(i(u.codec_long_name, u.codec_name, c.codec_name) || "N/A"), - tooltip: "Video codec name" - }), f.push({ - label: "Encoder", - value: String(i(u.tags?.encoder, d.tags?.encoder, c.encoder) || "N/A"), - tooltip: "Encoder recorded in file metadata" - }), f.push({ - label: "Pixel Format", - value: String(i(u.pix_fmt, c.pixel_format, c.pix_fmt) || "N/A"), - tooltip: "Stored pixel format" - }), f.push({ - label: "Color Space", - value: String(i(u.color_space, c.color_space, c.colorspace) || "N/A"), - tooltip: "Encoded color space" - }); - let h = Ue(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0); - h > 0 && f.push({ - label: "Generation Time", - value: `${(Number(h) / 1e3).toFixed(1)}s`, - tooltip: "Time taken to generate this asset (workflow execution time)", - valueStyle: `color: ${Ge(h)}; font-weight: 600;` - }); - let g = e.generation_time || e.file_creation_time || e.mtime || e.created_at; - if (g) { - let e = Oa(g), t = ka(g); - e && f.push({ - label: "Date", - value: e, - tooltip: "File creation/generation date" - }), t && f.push({ - label: "Time", - value: t, - tooltip: "File creation/generation time" - }); - } - f.push({ - label: "File Size", - value: n(i(e.size_bytes, e.size, e.file_info?.size_bytes, e.file_info?.size)), - tooltip: "File size on disk" - }), e.id != null && f.push({ - label: "Asset ID", - value: String(e.id), - tooltip: "Internal database asset identifier" - }); - let _ = String(s(e, "job_id") || "").trim(); - _ && f.push({ - label: "Job ID", - value: _, - tooltip: "Workflow execution job identifier (prompt_id)" - }); - let v = String(s(e, "source_node_id") || "").trim(); - v && f.push({ - label: "Source Node", - value: v, - tooltip: "ComfyUI node id that produced this file" - }); - let y = String(s(e, "source_node_type") || "").trim(); - y && f.push({ - label: "Node Type", - value: y, - tooltip: "ComfyUI node class that produced this file" - }); - let b = String(s(e, "workflow_id") || "").trim(); - return b && f.push({ - label: "Workflow ID", - value: b, - tooltip: "ComfyUI workflow identifier (from workflow.id in extra_data)" - }), f.filter((e) => a(e.value)); - }); - return (e, t) => c.value.length ? (L(), B("div", Fa, [t[0] ||= N("div", { style: { - "font-size": "12px", - "font-weight": "700", - color: "#607d8b", - "margin-bottom": "8px", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, " File Info ", -1), N("div", Ia, [(L(!0), B(M, null, I(c.value, (e) => (L(), B("div", { - key: e.label, - style: { - display: "flex", - gap: "10px", - "align-items": "flex-start", - "justify-content": "space-between" - } - }, [N("div", { - title: e.tooltip || "", - style: { - "font-size": "12px", - opacity: "0.68", - "min-width": "92px" - } - }, z(e.label), 9, La), N("div", { - style: R(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), - title: String(e.value || "") - }, z(e.value), 13, Ra)]))), 128))])])) : P("", !0); - } -}), Ba = /* @__PURE__ */ new Set([ - "png", - "jpg", - "jpeg", - "webp", - "gif", - "bmp", - "tiff", - "tif", - "avif", - "jxl", - "heic", - "heif", - "apng", - "hdr", - "svg" -]); -function Va(e) { - let t = String(e?.filename || e?.name || e?.filepath || e?.path || "").trim().toLowerCase(); - return !t || !t.includes(".") ? "" : t.split(".").pop() || ""; -} -function Ha(e) { - return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : Ba.has(Va(e)); -} -function Ua(e) { - let t = Va(e); - return t === "jpg" || t === "jpeg"; -} -function Wa() { - try { - return !!(Kt()?.ai?.vectorSearchEnabled ?? !0); - } catch { - return !0; - } -} -function Ga(e) { - return e >= .75 ? "#4CAF50" : e >= .5 ? "#8BC34A" : e >= .3 ? "#FF9800" : "#F44336"; -} -function Ka(e) { - return e >= .85 ? "Excellent" : e >= .7 ? "Good" : e >= .5 ? "Fair" : e >= .3 ? "Low" : "Very Low"; -} -function qa(e) { - let t = String(e || "").trim(); - if (!t) return ""; - let n = []; - for (let e of t.replace(/\r\n/g, "\n").split("\n")) { - let t = String(e || "").trim(); - t && (/^title\s*:/i.test(t) || (/^caption\s*:/i.test(t) && (t = t.replace(/^caption\s*:/i, "").trim()), t && n.push(t))); - } - return (n.length ? n.join(" ") : t).replace(/\s+/g, " ").replace(/:{2,}\s*$/, "").trim(); -} -function Ja(e) { - let t = String(e?.filename || "").trim(); - if (!t) return []; - let n = String(e?.subfolder || "").trim(), r = String(e?.folder_type || "input").trim().toLowerCase(), i = [], a = (e) => { - if (!e) return; - let r = Re(t, n, e); - r && !i.includes(r) && i.push(r); - }; - return (r === "input" || r === "output") && a(r), a("input"), a("output"), i; -} -function Ya(e) { - let t = String(e?.filepath || "").trim(), n = String(e?.filename || "").trim(); - return !t || t === n ? "" : t; -} -function Xa(e) { - let t = String(e || "").trim(); - if (!t) return !1; - if (t.startsWith("/")) return !0; - try { - let e = new URL(t); - return e.protocol === "http:" || e.protocol === "https:"; - } catch { - return !1; - } -} -function Q(e) { - return e == null || e === "" ? "-" : String(e); -} -function Za(e, t) { - let n = String(e?.pass_stage || e?.stage || e?.kind || "").trim().toLowerCase(); - if (n === "txt2img" || n === "text_to_image" || n === "text-to-image") return k("sidebar.generation.stageTextToImage", "Text-to-Image"); - if (n === "img2img" || n === "image_to_image" || n === "image-to-image") return k("sidebar.generation.stageImageToImage", "Image-to-Image"); - if (n === "inpaint" || n === "inpainting") return k("sidebar.generation.stageInpaint", "Inpaint"); - if (n === "upscale" || n === "upscaling") return k("sidebar.generation.stageUpscale", "Upscale"); - if (n === "refine" || n === "refiner") return k("sidebar.generation.stageRefine", "Refine"); - let r = String(e?.pass_name || "").trim(); - if (r && r.toLowerCase() !== "base") return r; - let i = Number(e?.denoise); - return t === 0 || i === 1 ? k("sidebar.generation.stageBase", "Base") : Number.isFinite(i) && i < 1 ? k("sidebar.generation.stageRefineUpscale", "Refine / Upscale") : k("sidebar.generation.stagePassN", "Pass {n}", { n: t + 1 }); -} -function Qa(e) { - let t = []; - return e?.metadata_raw && t.push(e.metadata_raw), e?.workflow && t.push(e.workflow), e?.metadata_raw?.workflow && t.push(e.metadata_raw.workflow), e?.metadata_raw?.raw_ffprobe?.format?.tags && t.push(e.metadata_raw.raw_ffprobe.format.tags), e?.metadata_raw?.ffprobe?.format?.tags && t.push(e.metadata_raw.ffprobe.format.tags), e?.geninfo && typeof e.geninfo == "object" && t.push({ geninfo: e.geninfo }), e?.metadata && (typeof e.metadata == "object" || typeof e.metadata == "string") && t.push(e.metadata), e?.prompt && (typeof e.prompt == "object" || typeof e.prompt == "string") && t.push(e.prompt), e?.exif && t.push(e.exif), e && typeof e == "object" && t.push(e), t; -} -function $a(e, t) { - for (let [n, r] of Object.entries(t)) r != null && r !== "" && (e[n] === void 0 || e[n] === null || e[n] === "") && (e[n] = r); -} -function eo(e) { - let t = Qa(e), n = {}; - for (let e of t) { - let t = Mt(e); - t && typeof t == "object" && $a(n, t); - } - return Object.keys(n).length ? n : null; -} -function to(e) { - try { - if (!e || typeof e != "object") return !1; - if (e.is_override || typeof e.workflow_notes == "string" && e.workflow_notes.trim() || typeof e.notes == "string" && e.notes.trim() || Array.isArray(e.custom_info) && e.custom_info.length > 0 || e.engine && typeof e.engine == "object" && e.engine.type || Pt(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && Pt(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || e.ltx_director && typeof e.ltx_director == "object" || e.ideogram && typeof e.ideogram == "object" || e.sampler || e.sampler_name || e.steps || e.cfg || e.cfg_scale || e.cfg_high_noise || e.cfg_low_noise || e.scheduler || Array.isArray(e.chained_passes) && e.chained_passes.length > 0 || Array.isArray(e.all_samplers) && e.all_samplers.length > 0 || e.seed || e.denoise || e.denoising || e.clip_skip || e.voice || e.language || e.temperature || e.top_k || e.top_p || e.repetition_penalty || e.max_new_tokens || e.device || e.voice_preset || e.instruct || e.dtype || e.attn_implementation || e.enable_chunking !== void 0 || e.max_chars_per_chunk || e.chunk_combination_method || e.silence_between_chunks_ms || e.enable_audio_cache !== void 0 || e.batch_size !== void 0 || e.use_torch_compile !== void 0 || e.use_cuda_graphs !== void 0 || e.compile_mode || typeof e.lyrics == "string" && e.lyrics.trim()) return !0; - } catch { - return !1; - } - return !1; -} -function $(e) { - return e ? typeof e == "string" ? Ft(e) : typeof e == "object" ? Ft(e.name || e.value || "") : "" : ""; -} -function no(e, t, n, r) { - let i = String(r || "").trim(); - if (!i) return; - let a = `${n}::${i}`; - t.has(a) || (t.add(a), e.push({ - label: n, - value: i - })); -} -function ro(e) { - let t = `${String(e?.source || "").toLowerCase()} ${String(e?.name || e?.lora_name || "").toLowerCase()}`; - return t.includes("high_noise") || t.includes("high noise") ? "high_noise" : t.includes("low_noise") || t.includes("low noise") ? "low_noise" : ""; -} -function io(e) { - let t = [], n = Array.isArray(e.model_groups) ? e.model_groups : []; - if (n.length) return n.forEach((e) => { - if (!e || typeof e != "object") return; - let n = $(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => Nt(e)).filter(Boolean) : []; - (n || r.length) && t.push({ - key: String(e.key || "").trim() || `group-${t.length + 1}`, - label: String(e.label || "").trim() || `Group ${t.length + 1}`, - model: n, - loras: r - }); - }), t; - let r = e.models && typeof e.models == "object" ? e.models : null, i = Array.isArray(e.loras) ? e.loras : []; - return r && [{ - key: "high_noise", - label: k("sidebar.generation.highNoise", "High Noise"), - model: $(r.unet_high_noise) - }, { - key: "low_noise", - label: k("sidebar.generation.lowNoise", "Low Noise"), - model: $(r.unet_low_noise) - }].forEach((e) => { - let n = i.filter((t) => ro(t) === e.key).map((e) => Nt(e)).filter(Boolean); - (e.model || n.length) && t.push({ - ...e, - loras: n - }); - }), t; -} -function ao(e, t) { - return t == null ? null : { - label: e, - value: t ? k("state.on", "on") : k("state.off", "off") - }; -} -function oo(e) { - return e != null && String(e).trim() !== ""; -} -function so(e) { - let t = String(e || "").toLowerCase(); - return t.includes("high") ? "#52ffe8" : t.includes("low") ? "#42A5F5" : t.includes("refine") ? "#AB47BC" : t.includes("upscale") ? "#66BB6A" : t.includes("interpolation") || t.includes("video") ? "#dace26" : "#9C27B0"; -} -function co(e) { - return String(e || "").trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, ""); -} -function lo(e, t) { - let n = String(t || e || "").trim(), r = String(e || n).toLowerCase(), i = r.match(/^pass_(\d+)$/); - return i ? k("sidebar.generation.stagePassN", "Pass {n}", { n: Number(i[1]) }) : r.includes("high") ? "High" : r.includes("low") ? "Low" : r.includes("refine") ? "Refiner" : r.includes("upscale") ? "Upscale" : r.includes("text_to_image") || r.includes("image_to_image") || r === "base" ? "Base" : n || "Branch"; -} -function uo(e, t) { - let n = new Set(t.map((e) => String(e).toLowerCase())); - return e.find((e) => n.has(String(e.label || "").toLowerCase())) || null; -} -function fo(e, t) { - return oo(t) ? { - label: e, - value: t - } : null; -} -function po(e) { - let t = String(e || "").toLowerCase(); - return t.includes("high_noise") || t.includes("high-noise") || t.includes("high noise") ? "high" : t.includes("low_noise") || t.includes("low-noise") || t.includes("low noise") ? "low" : ""; -} -function mo(e) { - return Array.isArray(e) || e && typeof e == "object" ? !1 : oo(e) && String(e).trim() !== "-"; -} -function ho(e) { - return typeof e == "number" ? Math.abs(e - Math.round(e)) < 1e-9 ? String(Math.round(e)) : e.toFixed(2).replace(/0+$/g, "").replace(/\.$/, "") : String(e ?? "").trim(); -} -function go(e) { - if (!oo(e)) return null; - let t = Number(e); - return !Number.isFinite(t) || t <= 0 ? null : e; -} -function _o(e, t) { - let n = go(e.seed); - if (n !== null) return n; - let r = [Array.isArray(e.chained_passes) ? e.chained_passes : [], Array.isArray(e.all_samplers) ? e.all_samplers : []]; - for (let e of r) for (let t of e) { - let e = go(t?.seed_val ?? t?.seed); - if (e !== null) return e; - } - for (let e of t || []) { - let t = go(uo(e.fields || [], ["Seed"])?.value); - if (t !== null) return t; - } - return null; -} -function vo(e, t) { - if (!t || !mo(t.value)) return; - let n = `${String(t.label || "").toLowerCase()}::${ho(t.value)}`; - e.some((e) => `${String(e.label || "").toLowerCase()}::${ho(e.value)}` === n) || e.push({ - ...t, - value: ho(t.value) - }); -} -function yo(e, t, n, r) { - let i = /* @__PURE__ */ new Map(), a = (e, t) => { - let n = co(e || t || "branch") || "branch"; - n.includes("high") && (n = "high"), n.includes("low") && (n = "low"); - let r = i.get(n); - if (r) return r; - let a = { - key: n, - label: lo(n, t), - accent: so(n), - modelFields: [], - samplingFields: [], - loras: [] - }; - return i.set(n, a), a; - }, o = (e, t, n) => { - let r = String(n || "").trim(); - r && (e.modelFields.some((e) => String(e.label || "").toLowerCase() === String(t || "").toLowerCase() && Ft(e.value) === Ft(r)) || e.modelFields.push({ - label: t, - value: r - })); - }, s = (e, t) => { - let n = String(t || "").trim(); - n && !e.loras.includes(n) && e.loras.push(n); - }; - for (let e of t || []) { - let t = a(e.key, e.label); - e.model && o(t, "UNet", e.model); - for (let n of e.loras || []) s(t, n); - } - let c = e.models && typeof e.models == "object" ? e.models : null; - if (c) { - let t = $(c.unet), n = po(t), r = $(c.checkpoint || (n ? null : c.unet) || e.model || e.checkpoint), i = $(c.unet_high_noise) || (n === "high" ? t : ""), l = $(c.unet_low_noise) || (n === "low" ? t : ""), u = $(c.clip), d = $(c.vae), f = Array.isArray(e.loras) ? e.loras.map((e) => Nt(e)).filter(Boolean) : [], p = !!(i || l), m = !p && (r || u || d || f.length) ? a("base", "Base") : null, h = p && (u || d) ? a("shared", "Shared") : null, g = i ? a("high", "High") : null, _ = l ? a("low", "Low") : null; - if (m) { - r && o(m, e.model || e.checkpoint || c.checkpoint ? "Model" : "UNet", r), u && o(m, "CLIP", u), d && o(m, "VAE", d); - for (let e of f) s(m, e); - } - h && (u && o(h, "CLIP", u), d && o(h, "VAE", d)), g && o(g, "UNet", i), _ && o(_, "UNet", l); - } - let l = i.get("high") || i.get("high_noise"), u = i.get("low") || i.get("low_noise"), d = [ - uo(n, ["Sampler"]), - uo(n, ["Scheduler"]), - uo(n, ["Steps"]), - uo(n, ["Seed"]) - ].filter(Boolean), f = fo("CFG", e.cfg_high_noise), p = fo("CFG", e.cfg_low_noise); - l && [...d, ...f ? [f] : []].forEach((e) => vo(l.samplingFields, e)), u && [...d, ...p ? [p] : []].forEach((e) => vo(u.samplingFields, e)); - let m = (r || []).some((e) => co(e.label).includes("upscale")), h = (r || []).length === 2 && (r || []).every((e) => ["base", "pass_2"].includes(co(e.label))); - for (let [e, t] of (r || []).entries()) { - let n = co(t.label); - if (!n) continue; - let i = (r || []).filter((e) => co(e.label) === co(t.label)).length, o = co(t.stage), s = o ? (r || []).filter((e) => co(e.stage) === o).length : 0, c = uo(t.fields || [], ["Model"]), d = po(c?.value); - ["high", "low"].includes(n) || (d ? n = d : s > 1 || i > 1 ? n = `pass_${e + 1}` : h ? n = e === 0 ? "high" : "low" : n === "base" && l && u ? n = "high" : ["text_to_image", "image_to_image"].includes(n) && (n = m ? "low" : "base")), n.includes("upscale") && m && (n = "high"); - let f = a(n, t.label); - if (!/^pass_\d+$/i.test(n) && c && String(c.value || "") !== "-") { - let e = Ft(c.value); - f.modelFields.some((t) => Ft(t.value) === e) || f.modelFields.push(c); - } - for (let e of t.fields || []) [ - "Sampler", - "Scheduler", - "Steps", - "CFG", - "Denoise", - "Seed", - "Start", - "End" - ].includes(String(e.label || "")) && vo(f.samplingFields, e); - } - return Array.from(i.values()).filter((e) => e.modelFields.length || e.samplingFields.length || e.loras.length); -} -function bo(e, t, n, r) { - let i = [], a = (e, t, n, r) => { - let a = r.filter((e) => e && oo(e.value) && String(e.value) !== "-"); - a.length && i.push({ - key: e, - title: t, - accent: n, - fields: a - }); - }; - for (let n of t || []) { - let t = co(n.label), r = (n.fields || []).some((e) => { - let t = String(e?.label || "").toLowerCase(), n = String(e?.value || "").toLowerCase(); - return t.includes("upscaler") || n.includes("upscale") || n.includes("upscaler") || /(?:^|[_\s-])to[_\s-]?\d{3,5}(?:[_\s.-]|$)/i.test(n); - }); - t.includes("upscale") && (e.upscaler || r) && a("upscale", "Upscale", "#66BB6A", n.fields || []), (t.includes("interpolation") || t.includes("rife") || t.includes("film")) && a("interpolation", "Interpolation", "#26C6DA", n.fields || []); - } - a("audio", "MMAudio", "#26A69A", [ - fo("Voice", e.voice), - fo("Language", e.language), - fo("Temperature", e.temperature), - fo("Lyrics Strength", e.lyrics_strength) - ].filter(Boolean)), a("interpolation", "Interpolation", "#26C6DA", [ - fo("Engine", e.interpolation_engine || e.frame_interpolation || e.interpolator), - fo("Source FPS", e.source_fps || e.input_fps), - fo("Final FPS", e.final_fps || e.output_fps || e.fps) - ].filter(Boolean)); - for (let e of n || []) i.push({ - key: co(e.title) || `module_${i.length}`, - title: e.title, - accent: e.color || "#2196F3", - fields: [{ - label: "Info", - value: e.content - }] - }); - r && !i.some((e) => String(e.title).toLowerCase() === String(r).toLowerCase()) && a("workflow_engine", r, "#2196F3", [fo("Engine", r)].filter(Boolean)); - let o = /* @__PURE__ */ new Set(); - return i.filter((e) => { - let t = `${e.key}:${e.title}:${JSON.stringify(e.fields)}`; - return !o.has(t) && (o.add(t), !0); - }); -} -function xo(e) { - return new Set(Array.isArray(e.override_fields) ? e.override_fields.map((e) => String(e || "").trim()).filter(Boolean) : []); -} -function So(e, ...t) { - return t.some((t) => e.has(t)); -} -function Co(e) { - return Array.isArray(e) ? e.filter((e) => e && typeof e == "object").map((e, t) => ({ - title: String(e.title || k("sidebar.generation.customInfoN", "Custom Info {n}", { n: t + 1 })).trim(), - content: String(e.content ?? e.value ?? "").trim(), - color: /^#[0-9a-fA-F]{6}$/.test(String(e.color || "").trim()) ? String(e.color).trim() : "#2196F3" - })).filter((e) => e.content) : []; -} -function wo(e) { - if (!e || typeof e != "object") return null; - let t = [], n = (e, n) => { - oo(n) && t.push({ - label: e, - value: ho(n) - }); - }; - n("FPS", e.frame_rate), n("Frames", e.duration_frames), n("Duration", e.duration_seconds), (oo(e.width) || oo(e.height)) && t.push({ - label: "Size", - value: `${e.width || "?"} x ${e.height || "?"}` - }); - let r = Array.isArray(e.segments) ? e.segments.map((e, t) => { - if (!e || typeof e != "object") return null; - let n = Pt(e.prompt || e.text || ""), r = String(e.filename || e.imageFile || e.videoFile || e.audioFile || "").trim(), i = String(e.filepath || e.path || r).trim(), a = String(e.in || e.in_label || e.start || e.start_frame || "").trim(), o = String(e.out || e.out_label || e.end || e.end_frame || "").trim(); - if (!n && !r && !a && !o) return null; - let s = String(e.type || "").trim().toLowerCase(), c = s === "video" || /\.(mp4|mov|webm|mkv|avi|m4v)$/i.test(r), l = s === "audio" || /\.(mp3|wav|flac|ogg|m4a|aac|opus)$/i.test(r); - return { - key: String(e.id || `segment-${t + 1}`), - label: `Segment ${t + 1}`, - prompt: n, - inLabel: a, - outLabel: o, - filename: r, - filepath: i, - type: String(e.type || "").trim(), - isVideo: c, - isAudio: l, - previewCandidates: r ? Ja({ - filename: r, - filepath: i, - folder_type: String(e.folder_type || e.folderType || "input").trim(), - subfolder: String(e.subfolder || "").trim() - }) : [] - }; - }).filter(Boolean) : [], i = Pt(e.global_prompt || e.globalPrompt || ""); - return !i && !r.length && !t.length ? null : { - title: String(e.title || "LTX Director").trim(), - globalPrompt: i, - fields: t, - segments: r - }; -} -function To(e) { - if (!e || typeof e != "object") return null; - let t = e.payload && typeof e.payload == "object" ? e.payload : e, n = typeof e.json == "string" && e.json.trim() ? e.json.trim() : JSON.stringify(t, null, 2), r = Pt(e.high_level_description || e.highLevelDescription || t.high_level_description || ""), i = Pt(e.background || t.background || ""), a = [], o = (e, t) => { - oo(t) && a.push({ - label: e, - value: ho(t) - }); - }; - o("Style", t.style), o("Photo Style", t.photo_style || t["style.photo"]), o("Medium", t.medium), o("Lighting", t.lighting), o("Aesthetics", t.aesthetics), o("BG Brightness", t.bg_brightness), (oo(t.width) || oo(t.height)) && a.push({ - label: "Size", - value: `${t.width || "?"} x ${t.height || "?"}` - }); - let s = (Array.isArray(e.elements) ? e.elements : Array.isArray(t.elements) ? t.elements : []).map((e, t) => { - if (!e || typeof e != "object") return null; - let n = [ - e.x, - e.y, - e.w, - e.h - ].map((e) => Number(e)).map((e) => Number.isFinite(e) ? e.toFixed(3).replace(/0+$/g, "").replace(/\.$/, "") : "").join(", "), r = Array.isArray(e.palette) ? e.palette.map((e) => String(e || "").trim()).filter(Boolean) : [], i = String(e.desc || e.description || "").trim(), a = String(e.text || "").trim(); - return !i && !a && !n && !r.length ? null : { - key: String(e.id || `ideogram-element-${t + 1}`), - label: `Element ${t + 1}`, - description: i, - text: a, - bbox: n, - palette: r - }; - }).filter(Boolean), c = Array.isArray(e.color_palette) ? e.color_palette : Array.isArray(t.color_palette) ? t.color_palette : []; - return !n && !r && !i && !s.length ? null : { - title: String(e.title || "Ideogram 4").trim(), - json: n, - highLevelDescription: r, - background: i, - fields: a, - elements: s, - colorPalette: c.map((e) => String(e || "").trim()).filter(Boolean) - }; -} -function Eo(e) { - let t = eo(e), n = { - kind: "empty", - title: k("sidebar.generation.title", "Generation"), - workflowType: "", - workflowLabel: "", - workflowBadge: "", - isTruncated: !1, - positivePrompt: "", - negativePrompt: "", - positivePromptOverride: !1, - negativePromptOverride: !1, - promptTabs: [], - mediaOnlyMessage: "", - showAlignment: !1, - captionLabel: k("sidebar.generation.imageDescription", "Image Description"), - emptyCaptionText: k("sidebar.generation.noImageDescription", "No image description yet."), - isImageAsset: Ha(e), - lyrics: "", - modelFields: [], - modelGroups: [], - branchCards: [], - pipelineTabs: [], - samplingFields: [], - ttsFields: [], - ttsEngineFields: [], - ttsInstruction: "", - ttsRuntimeFields: [], - audioFields: [], - seed: null, - imageFields: [], - inputFiles: [], - isOverride: !1, - overrideLabel: "", - notesFields: [], - customInfoBlocks: [], - moduleBlocks: [], - ltxDirector: null, - ideogram: null - }; - if (!t || typeof t == "object" && Object.keys(t).length === 0 || !to(t)) { - let t = e?.metadata_raw?.geninfo_status || e?.geninfo_status; - return t && typeof t == "object" && t.kind === "media_pipeline" ? { - ...n, - kind: "media-only", - mediaOnlyMessage: k("sidebar.generation.mediaOnlyPipeline", "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.") - } : Ha(e) || Ua(e) ? { - ...n, - kind: "caption-only", - showAlignment: !1 - } : n; - } - let r = t, i = wo(r.ltx_director), a = To(r.ideogram), o = xo(r), s = r.engine && typeof r.engine == "object" ? r.engine : null, c = !!(r.is_override || s?.mode === "override" || s?.parser_version === "geninfo-override-v1" || s?.source === "majoor_geninfo"), l = It(r), u = jt(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), d = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => { - let n = jt(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : ""); - return { - label: k("sidebar.generation.promptN", "Prompt {n}", { n: t + 1 }), - positive: Pt(n.positive), - negative: Pt(n.negative) - }; - }).filter((e) => e.positive) : [], f = [], p = /* @__PURE__ */ new Set(), m = r.models && typeof r.models == "object" ? r.models : null, h = io(r), g = new Set(h.map((e) => String(e.model || "").trim()).filter(Boolean)), _ = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null; - if (m) { - let e = new Set([ - $(m.unet_high_noise), - $(m.unet_low_noise), - ...g - ].filter(Boolean)); - if (_) _.forEach((e, t) => { - let n = $(e); - no(f, p, k("sidebar.generation.checkpointN", "Checkpoint {n}", { n: t + 1 }), n); - }); - else { - let t = $(m.checkpoint); - t && !e.has(t) && no(f, p, k("sidebar.generation.checkpoint", "Checkpoint"), t); - } - [ - ["UNet", $(m.unet)], - ["Diffusion", $(m.diffusion)], - [k("sidebar.generation.upscaler", "Upscaler"), $(m.upscaler)], - ["CLIP", $(m.clip)], - ["VAE", $(m.vae)] - ].forEach(([t, n]) => { - e.has(n) || no(f, p, t, n); - }); - } else (r.model || r.checkpoint) && no(f, p, k("sidebar.generation.model", "Model"), Ft(r.model || r.checkpoint)); - if (Array.isArray(r.loras) && r.loras.length > 0) { - let e = r.loras.map((e) => Nt(e)).filter(Boolean).join("\n"); - e && no(f, p, r.loras.length > 1 ? k("sidebar.generation.loras", "LoRAs") : "LoRA", e); - } - !m && r.clip && no(f, p, "CLIP", Ft(r.clip)), !m && r.vae && no(f, p, "VAE", Ft(r.vae)), !m && r.unet && no(f, p, "UNet", Ft(r.unet)), !m && r.diffusion && no(f, p, "Diffusion", Ft(r.diffusion)), !m && r.upscaler && no(f, p, k("sidebar.generation.upscaler", "Upscaler"), Ft(r.upscaler)), m && r.clip && no(f, p, "CLIP", Ft(r.clip)), m && r.vae && no(f, p, "VAE", Ft(r.vae)); - for (let e of f) { - let t = String(e.label || "").toLowerCase(); - (t.includes("checkpoint") || t === "model") && (e.override = So(o, "checkpoint", "model")), t === "clip" && (e.override = So(o, "clip")), t === "vae" && (e.override = So(o, "vae")), t.includes("lora") && (e.override = So(o, "loras")); - } - let v = []; - oo(r.seed) && v.push({ - label: k("sidebar.generation.seed", "Seed"), - value: r.seed, - override: So(o, "seed") - }), (r.sampler || r.sampler_name) && v.push({ - label: k("sidebar.generation.sampler", "Sampler"), - value: r.sampler || r.sampler_name, - override: So(o, "sampler", "sampler_name") - }), oo(r.steps) && v.push({ - label: k("sidebar.generation.steps", "Steps"), - value: r.steps, - override: So(o, "steps") - }); - let y = oo(r.cfg) ? r.cfg : r.cfg_scale; - oo(y) && v.push({ - label: k("sidebar.generation.cfgScale", "CFG Scale"), - value: y, - override: So(o, "cfg", "cfg_scale") - }), r.cfg_high_noise !== void 0 && r.cfg_high_noise !== null && v.push({ - label: k("sidebar.generation.cfgHighNoise", "CFG High Noise"), - value: r.cfg_high_noise - }), r.cfg_low_noise !== void 0 && r.cfg_low_noise !== null && v.push({ - label: k("sidebar.generation.cfgLowNoise", "CFG Low Noise"), - value: r.cfg_low_noise - }), r.scheduler && v.push({ - label: k("sidebar.generation.scheduler", "Scheduler"), - value: r.scheduler, - override: So(o, "scheduler") - }); - let b = oo(r.denoise) ? r.denoise : r.denoising; - oo(b) && v.push({ - label: k("sidebar.generation.denoise", "Denoise"), - value: b, - override: So(o, "denoise", "denoising") - }); - let x = []; - Array.isArray(r.chained_passes) && r.chained_passes.length > 1 ? x = r.chained_passes.filter((e) => e && typeof e == "object").map((e, t) => ({ - label: Za(e, t), - stage: String(e?.pass_stage || "").trim(), - fields: [ - { - label: k("sidebar.generation.model", "Model"), - value: Q(e?.model) - }, - { - label: k("sidebar.generation.sampler", "Sampler"), - value: Q(e?.sampler_name || e?.sampler) - }, - { - label: k("sidebar.generation.scheduler", "Scheduler"), - value: Q(e?.scheduler) - }, - { - label: k("sidebar.generation.steps", "Steps"), - value: Q(e?.steps) - }, - { - label: "CFG", - value: Q(e?.cfg) - }, - { - label: k("sidebar.generation.denoise", "Denoise"), - value: Q(e?.denoise) - }, - { - label: "Start", - value: Q(e?.start_at_step) - }, - { - label: "End", - value: Q(e?.end_at_step) - }, - { - label: k("sidebar.generation.seed", "Seed"), - value: Q(e?.seed_val ?? e?.seed) - } - ] - })) : Array.isArray(r.all_samplers) && r.all_samplers.length > 1 && (x = r.all_samplers.filter((e) => e && typeof e == "object").map((e, t) => ({ - label: Za(e, t), - stage: String(e?.pass_stage || "").trim(), - fields: [ - { - label: k("sidebar.generation.model", "Model"), - value: Q(e?.model) - }, - { - label: k("sidebar.generation.sampler", "Sampler"), - value: Q(e?.sampler_name || e?.sampler) - }, - { - label: k("sidebar.generation.scheduler", "Scheduler"), - value: Q(e?.scheduler) - }, - { - label: k("sidebar.generation.steps", "Steps"), - value: Q(e?.steps) - }, - { - label: "CFG", - value: Q(e?.cfg) - }, - { - label: k("sidebar.generation.denoise", "Denoise"), - value: Q(e?.denoise) - }, - { - label: "Start", - value: Q(e?.start_at_step) - }, - { - label: "End", - value: Q(e?.end_at_step) - }, - { - label: k("sidebar.generation.seed", "Seed"), - value: Q(e?.seed_val ?? e?.seed) - } - ] - }))); - let S = []; - r.voice && S.push({ - label: k("sidebar.generation.narratorVoice", "Narrator Voice"), - value: r.voice - }), r.language && S.push({ - label: k("sidebar.generation.language", "Language"), - value: r.language - }), r.top_k !== void 0 && r.top_k !== null && S.push({ - label: "Top-k", - value: r.top_k - }), r.top_p !== void 0 && r.top_p !== null && S.push({ - label: "Top-p", - value: r.top_p - }), r.temperature !== void 0 && r.temperature !== null && S.push({ - label: k("sidebar.generation.temperature", "Temperature"), - value: r.temperature - }), r.repetition_penalty !== void 0 && r.repetition_penalty !== null && S.push({ - label: k("sidebar.generation.repetitionPenalty", "Repetition Penalty"), - value: r.repetition_penalty - }), r.max_new_tokens !== void 0 && r.max_new_tokens !== null && S.push({ - label: k("sidebar.generation.maxNewTokens", "Max New Tokens"), - value: r.max_new_tokens - }); - let C = []; - r.device && C.push({ - label: k("sidebar.generation.device", "Device"), - value: r.device - }), r.voice_preset && C.push({ - label: k("sidebar.generation.voicePreset", "Voice Preset"), - value: r.voice_preset - }), r.dtype && C.push({ - label: k("sidebar.generation.dtype", "Dtype"), - value: r.dtype - }), r.attn_implementation && C.push({ - label: k("sidebar.generation.attention", "Attention"), - value: r.attn_implementation - }), r.compile_mode && C.push({ - label: k("sidebar.generation.compileMode", "Compile Mode"), - value: r.compile_mode - }), [ - ao(k("sidebar.generation.torchCompile", "Torch Compile"), r.use_torch_compile), - ao(k("sidebar.generation.cudaGraphs", "CUDA Graphs"), r.use_cuda_graphs), - ao(k("sidebar.generation.xVectorOnly", "X-Vector Only"), r.x_vector_only_mode) - ].filter(Boolean).forEach((e) => C.push(e)); - let ee = []; - [ - ao(k("sidebar.generation.chunking", "Chunking"), r.enable_chunking), - r.max_chars_per_chunk !== void 0 && r.max_chars_per_chunk !== null ? { - label: k("sidebar.generation.maxCharsChunk", "Max Chars/Chunk"), - value: r.max_chars_per_chunk - } : null, - r.chunk_combination_method ? { - label: k("sidebar.generation.chunkMethod", "Chunk Method"), - value: r.chunk_combination_method - } : null, - r.silence_between_chunks_ms !== void 0 && r.silence_between_chunks_ms !== null ? { - label: k("sidebar.generation.silenceBetweenChunks", "Silence Between Chunks (ms)"), - value: r.silence_between_chunks_ms - } : null, - ao(k("sidebar.generation.audioCache", "Audio Cache"), r.enable_audio_cache), - r.batch_size !== void 0 && r.batch_size !== null ? { - label: k("sidebar.generation.batchSize", "Batch Size"), - value: r.batch_size - } : null - ].filter(Boolean).forEach((e) => ee.push(e)); - let te = []; - r.lyrics_strength !== void 0 && r.lyrics_strength !== null && te.push({ - label: k("sidebar.generation.lyricsStrength", "Lyrics Strength"), - value: r.lyrics_strength - }); - let w = []; - oo(b) && !v.some((e) => e.label === "Denoise") && w.push({ - label: k("sidebar.generation.denoise", "Denoise"), - value: b - }), oo(r.clip_skip) && w.push({ - label: k("sidebar.generation.clipSkip", "Clip Skip"), - value: r.clip_skip - }); - let T = [], ne = String(r.workflow_notes || r.notes || "").trim(); - ne && T.push({ - label: k("sidebar.generation.workflowNotes", "Workflow Notes"), - value: ne, - override: So(o, "workflow_notes", "notes") - }); - let re = Co(r.custom_info), E = yo(r, h, v, x), ie = bo(r, x, re, l.workflowType), ae = _o(r, x), D = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ - id: `${e.filename}-${t}`, - filename: String(e.filename || "").trim(), - subfolder: String(e.subfolder || "").trim(), - type: String(e.folder_type || "input").trim().toLowerCase(), - root_id: String(e.root_id || e.rootId || "").trim(), - kind: String(e.kind || e.media_kind || e.type || "").trim().toLowerCase(), - filepath: Ya(e), - role: String(e.role || "").trim(), - roleLabel: String(e.role || "").trim().replace(/_/g, " "), - isVideo: String(e.type || "").toLowerCase() === "video" || /\.(mp4|mov|webm)$/i.test(String(e.filename || "")), - isAudio: String(e.type || "").toLowerCase() === "audio" || /\.(wav|mp3|flac|ogg|m4a|aac|opus)$/i.test(String(e.filename || "")), - previewCandidates: Ja(e) - })) : []; - return { - ...n, - kind: "full", - metadata: r, - workflowType: l.workflowType, - workflowLabel: l.workflowLabel, - workflowBadge: l.workflowBadge, - isTruncated: !!(e?.geninfo?._truncated || e?.metadata?._truncated || e?.prompt?._truncated), - positivePrompt: d.length || a ? "" : String(u.positive || "").trim(), - negativePrompt: d.length ? "" : String(u.negative || "").trim(), - positivePromptOverride: So(o, "prompt", "positive", "positive_prompt"), - negativePromptOverride: So(o, "negative_prompt", "negative", "negativePrompt"), - promptTabs: d, - showAlignment: !!e?.id && (!!String(u.positive || "").trim() || d.length > 0), - isImageAsset: Ha(e), - lyrics: String(r.lyrics || "").trim(), - modelFields: f, - modelGroups: h, - branchCards: E, - pipelineTabs: x, - samplingFields: v, - ttsFields: S, - ttsEngineFields: C, - ttsInstruction: String(r.instruct || "").trim(), - ttsRuntimeFields: ee, - audioFields: te, - seed: ae, - imageFields: w, - inputFiles: D, - isOverride: c, - overrideLabel: c ? "Gen Info Override" : "", - notesFields: T, - customInfoBlocks: re, - moduleBlocks: ie, - ltxDirector: i, - ideogram: a - }; -} -// ui/vue/components/panel/sidebar/GenerationInputThumb.vue?vue&type=script&setup=true&lang.ts -var Do = ["title"], Oo = ["src"], ko = { - key: 1, - style: { - width: "100%", - height: "100%", - display: "flex", - "flex-direction": "column", - "align-items": "center", - "justify-content": "center", - gap: "4px", - background: "linear-gradient(135deg, rgba(0,188,212,0.28), rgba(156,39,176,0.20))", - color: "white", - padding: "6px", - "text-align": "center" - } -}, Ao = { style: { - "font-size": "8px", - "font-weight": "700", - "max-width": "54px", - "white-space": "nowrap", - overflow: "hidden", - "text-overflow": "ellipsis" -} }, jo = ["src"], Mo = { - key: 3, - style: { - position: "absolute", - bottom: "0", - left: "0", - right: "0", - background: "rgba(0,0,0,0.7)", - color: "white", - "font-size": "8px", - padding: "2px", - "text-align": "center", - "white-space": "nowrap", - overflow: "hidden", - "text-overflow": "ellipsis" - } -}, No = { - key: 4, - title: "Video file", - style: { - position: "absolute", - color: "white", - opacity: "0.7", - "font-size": "16px", - "pointer-events": "none" - } -}, Po = /* @__PURE__ */ nt({ - __name: "GenerationInputThumb", - props: { inputFile: {} }, - setup(e) { - let t = e, n = H(0), r = H(!1), i = null; - function a() { - return i ||= import("./floatingViewerManager-BzaQii21.js").then((e) => e.n), i; - } - function o() { - return (Array.isArray(t.inputFile?.previewCandidates) ? t.inputFile.previewCandidates : [])[n.value] || ""; - } - function s() { - let e = Array.isArray(t.inputFile?.previewCandidates) ? t.inputFile.previewCandidates : []; - n.value < e.length - 1 && (n.value += 1); - } - async function c(e) { - e?.stopPropagation?.(); - let n = String(t.inputFile?.filepath || t.inputFile?.filename || "").trim(); - if (n) try { - await navigator.clipboard.writeText(n), r.value = !0, setTimeout(() => { - r.value = !1; - }, 350); - } catch (e) { - console.debug?.(e); - } - } - function l(e) { - e?.stopPropagation?.(), h(); - } - function u() { - let e = t.inputFile || {}, n = String(e.filepath || "").trim(); - return { - filename: e.filename || "", - name: e.filename || "", - filepath: n, - path: n, - subfolder: e.subfolder || "", - type: e.type || "input", - source: e.type || "input", - kind: d(e), - root_id: e.root_id || "", - preview_url: o() - }; - } - function d(e = t.inputFile || {}) { - let n = String(e.kind || "").trim().toLowerCase(); - if (n === "image" || n === "video" || n === "audio" || n === "model3d") return n; - if (e.isVideo) return "video"; - if (e.isAudio) return "audio"; - let r = String(e.filename || "").toLowerCase(); - return /\.(mp4|mov|webm|mkv|avi|m4v)$/i.test(r) ? "video" : /\.(wav|mp3|flac|ogg|m4a|aac|opus)$/i.test(r) ? "audio" : /\.(glb|gltf|obj|stl|ply|fbx)$/i.test(r) ? "model3d" : "image"; - } - function f(e, t, n, { disabled: r = !1 } = {}) { - return { - id: `mjr-generation-source-${String(e).toLowerCase().replace(/[^a-z0-9]+/g, "-")}`, - type: "item", - label: e, - iconClass: t, - rightHint: "", - tone: String(e).toLowerCase().includes("floating") ? "floating-viewer" : "", - disabled: r, - action: n - }; - } - function p() { - return { - id: "mjr-generation-source-separator", - type: "separator" - }; - } - function m() { - return Xa(o()) || !!t.inputFile?.filename || !!t.inputFile?.filepath; - } - function h() { - let e = u(); - if (At({ - asset: e, - index: 0 - })) return; - let t = o(); - if (Xa(t)) try { - window.open(t, "_blank", "noopener,noreferrer"); - } catch (e) { - console.debug?.(e); - } - } - async function g() { - try { - let { floatingViewerManager: e } = await a(); - await e.openAssets({ - assets: [u()], - index: 0 - }); - } catch (e) { - console.debug?.(e), D(k("toast.viewerOpenFailed", "Failed to open viewer."), "error"); - } - } - async function _() { - let e = await re(u()); - e?.ok ? D(k("toast.openedInFolder", "Opened in folder"), "info", 1600) : D(e?.error || k("toast.openFolderFailed", "Failed to open folder."), "error"); - } - async function v() { - let e = u(), t = { - filename: e.filename, - subfolder: e.subfolder, - type: e.type || "input", - root_id: e.root_id || void 0, - kind: e.kind - }, n = await Ri({ - post: ue, - endpoint: ze.STAGE_TO_INPUT, - payload: t, - index: !1 - }); - if (!n?.relativePath || !Pi({ - app: Fe(), - items: [{ - payload: t, - relativePath: n.relativePath, - droppedExt: String(t.filename || "").split(".").pop() || "" - }], - event: null - })) { - D(k("toast.loadAssetFailed", "Failed to load asset."), "error"); - return; - } - let r = e.kind ? e.kind.charAt(0).toUpperCase() + e.kind.slice(1) : "Asset"; - D(k("toast.assetLoadedToCanvas", "{kind} loader added to canvas.", { kind: r }), "success", 1800); - } - function y(e) { - e?.preventDefault?.(), e?.stopPropagation?.(); - let n = d(), r = n === "video" ? k("ctx.loadVideo", "Load video") : n === "audio" ? k("ctx.loadAudio", "Load audio") : n === "model3d" ? k("ctx.loadModel3d", "Load 3D model") : k("ctx.loadImage", "Load image"); - Dr({ - x: e?.clientX || 0, - y: e?.clientY || 0, - items: [ - f(k("ctx.openInViewer", "Open in viewer"), "pi pi-eye", h, { disabled: !m() }), - f(k("ctx.openInFloatingViewer", "Open in Floating Viewer"), "pi pi-window-maximize", g, { disabled: !m() }), - f(k("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", _, { disabled: !t.inputFile?.filepath }), - p(), - f(r, "pi pi-plus-circle", v, { disabled: !t.inputFile?.filename }), - f(k("ctx.copyPath", "Copy path"), "pi pi-copy", c, { disabled: !(t.inputFile?.filepath || t.inputFile?.filename) }) - ] - }); - } - function b(e) { - e.target?.play?.().catch?.(() => {}); - } - function x(e) { - try { - e.target?.pause?.(); - } catch (e) { - console.debug?.(e); - } - } - function S() { - return !!t.inputFile?.isAudio; - } - return (t, n) => (L(), B("div", { - title: `${e.inputFile.filename} (click to copy, double-click to open in new tab)`, - style: R({ - width: "64px", - height: "64px", - background: "#222", - borderRadius: "4px", - overflow: "hidden", - position: "relative", - cursor: "pointer", - display: "flex", - alignItems: "center", - justifyContent: "center", - outline: r.value ? "2px solid rgba(76, 175, 80, 0.9)" : "", - outlineOffset: r.value ? "1px" : "" - }), - onClick: c, - onDblclick: l, - onContextmenu: y - }, [e.inputFile.isVideo ? (L(), B("video", { - key: 0, - src: o(), - muted: "", - loop: "", - playsinline: "", - preload: "metadata", - style: { - width: "100%", - height: "100%", - "object-fit": "cover" - }, - onError: s, - onMouseover: b, - onMouseout: x - }, null, 40, Oo)) : S() ? (L(), B("div", ko, [n[0] ||= N("div", { style: { - "font-size": "18px", - "line-height": "1" - } }, "♪", -1), N("div", Ao, z(e.inputFile.filename), 1)])) : (L(), B("img", { - key: 2, - src: o(), - style: { - width: "100%", - height: "100%", - "object-fit": "cover" - }, - onError: s - }, null, 40, jo)), e.inputFile.role && e.inputFile.role !== "secondary" ? (L(), B("div", Mo, z(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (L(), B("div", No, " Play ")) : P("", !0)], 44, Do)); - } -}), Fo = { - key: 0, - style: { - display: "flex", - "flex-direction": "column", - gap: "12px" - } -}, Io = { - key: 0, - style: { - display: "flex", - alignItems: "center", - justifyContent: "space-between", - padding: "10px 12px", - background: "linear-gradient(135deg, rgba(33, 150, 243, 0.18) 0%, rgba(0, 188, 212, 0.10) 100%)", - borderLeft: "3px solid #2196F3", - border: "1px solid rgba(33, 150, 243, 0.45)", - boxShadow: "0 0 0 1px rgba(33, 150, 243, 0.15) inset", - borderRadius: "6px", - fontSize: "11px", - color: "var(--fg-color, #ccc)" - } -}, Lo = { style: { opacity: "0.85" } }, Ro = { style: { - display: "flex", - "align-items": "center", - gap: "8px", - "flex-wrap": "wrap", - "justify-content": "flex-end" -} }, zo = ["title"], Bo = ["title"], Vo = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "10px" -} }, Ho = { style: { - "font-size": "11px", - "font-weight": "700", - color: "#00BCD4", - "text-transform": "uppercase", - "letter-spacing": "0.6px" -} }, Uo = { style: { - "font-size": "11px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "font-weight": "600" -} }, Wo = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#FF9800", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" -} }, Go = { style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "line-height": "1.5", - "white-space": "pre-wrap", - "word-break": "break-word" -} }, Ko = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#9E9E9E", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" -} }, qo = { style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "line-height": "1.5", - "white-space": "pre-wrap", - "word-break": "break-word" -} }, Jo = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "8px", - "margin-bottom": "10px" -} }, Yo = { style: { - "font-size": "11px", - "font-weight": "800", - color: "#26C6DA", - "text-transform": "uppercase", - "letter-spacing": "0.5px" -} }, Xo = { - key: 0, - style: { - display: "grid", - "grid-template-columns": "repeat(auto-fit,minmax(92px,1fr))", - gap: "8px", - "margin-bottom": "10px" - } -}, Zo = { style: { - "font-size": "9px", - "font-weight": "800", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" -} }, Qo = { style: { - "font-size": "12px", - color: "var(--fg-color,#eee)", - "font-weight": "650", - "word-break": "break-word" -} }, $o = { - key: 1, - style: { - border: "1px solid rgba(76,175,80,0.36)", - "border-radius": "6px", - background: "rgba(76,175,80,0.10)", - padding: "10px", - "margin-bottom": "10px" - } -}, es = ["title"], ts = { - key: 2, - style: { - display: "flex", - "flex-direction": "column", - gap: "8px" - } -}, ns = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "8px", - "margin-bottom": "7px" -} }, rs = { style: { - "font-size": "10px", - "font-weight": "800", - color: "#26C6DA", - "text-transform": "uppercase", - "letter-spacing": "0.45px" -} }, is = { style: { - display: "flex", - "align-items": "center", - gap: "5px", - "flex-wrap": "wrap", - "justify-content": "flex-end" -} }, as = { - key: 0, - style: { - "font-size": "10px", - color: "#A7FFEB", - background: "rgba(0,150,136,0.16)", - border: "1px solid rgba(0,150,136,0.30)", - "border-radius": "4px", - padding: "2px 6px", - "font-weight": "700" - } -}, os = { - key: 1, - style: { - "font-size": "10px", - color: "#FFE082", - background: "rgba(255,193,7,0.14)", - border: "1px solid rgba(255,193,7,0.30)", - "border-radius": "4px", - padding: "2px 6px", - "font-weight": "700" - } -}, ss = { style: { - display: "flex", - gap: "10px", - "align-items": "flex-start", - "min-width": "0" -} }, cs = { style: { - "min-width": "0", - flex: "1" -} }, ls = ["title", "onClick"], us = { - key: 1, - style: { - "font-size": "10px", - color: "rgba(255,255,255,0.58)", - "margin-top": "7px", - display: "flex", - gap: "6px", - "flex-wrap": "wrap" - } -}, ds = { key: 0 }, fs = { key: 1 }, ps = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "8px", - "margin-bottom": "10px" -} }, ms = { style: { - "font-size": "11px", - "font-weight": "800", - color: "#FFB300", - "text-transform": "uppercase", - "letter-spacing": "0.5px" -} }, hs = { - key: 0, - style: { - display: "grid", - "grid-template-columns": "repeat(auto-fit,minmax(100px,1fr))", - gap: "8px", - "margin-bottom": "10px" - } -}, gs = { style: { - "font-size": "9px", - "font-weight": "800", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" -} }, _s = { style: { - "font-size": "12px", - color: "var(--fg-color,#eee)", - "font-weight": "650", - "word-break": "break-word" -} }, vs = { - key: 1, - style: { - border: "1px solid rgba(76,175,80,0.34)", - "border-radius": "6px", - background: "rgba(76,175,80,0.09)", - padding: "10px", - "margin-bottom": "10px" - } -}, ys = ["title"], bs = { - key: 2, - style: { - border: "1px solid rgba(33,150,243,0.32)", - "border-radius": "6px", - background: "rgba(33,150,243,0.08)", - padding: "10px", - "margin-bottom": "10px" - } -}, xs = ["title"], Ss = { - key: 3, - style: { - display: "flex", - "flex-direction": "column", - gap: "8px", - "margin-bottom": "10px" - } -}, Cs = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "8px", - "margin-bottom": "7px" -} }, ws = { style: { - "font-size": "10px", - "font-weight": "800", - color: "#FFCA28", - "text-transform": "uppercase", - "letter-spacing": "0.45px" -} }, Ts = { - key: 0, - style: { - "font-size": "10px", - color: "#FFE082", - background: "rgba(255,193,7,0.14)", - border: "1px solid rgba(255,193,7,0.30)", - "border-radius": "4px", - padding: "2px 6px", - "font-weight": "700" - } -}, Es = ["title", "onClick"], Ds = { - key: 1, - style: { - display: "flex", - "flex-wrap": "wrap", - gap: "5px", - "margin-top": "8px" - } -}, Os = ["title", "onClick"], ks = { style: { - border: "1px solid rgba(255,179,0,0.30)", - "border-radius": "6px", - background: "rgba(0,0,0,0.16)", - overflow: "hidden" -} }, As = ["title"], js = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#4CAF50", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" -} }, Ms = { style: { - display: "flex", - "flex-wrap": "wrap", - gap: "6px", - "margin-bottom": "10px" -} }, Ns = { style: { - "font-size": "10px", - "font-weight": "700", - color: "#4CAF50", - "letter-spacing": "0.4px" -} }, Ps = ["onClick"], Fs = { style: { - "font-size": "10px", - "font-weight": "700", - color: "#F44336", - "letter-spacing": "0.4px", - "margin-top": "4px" -} }, Is = ["onClick"], Ls = { style: { - display: "flex", - "justify-content": "space-between", - "align-items": "center", - "font-size": "11px", - "font-weight": "600", - color: "#4CAF50", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" -} }, Rs = ["title"], zs = ["title"], Bs = { style: { - display: "flex", - "justify-content": "space-between", - "align-items": "center", - "font-size": "11px", - "font-weight": "600", - color: "#F44336", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" -} }, Vs = ["title"], Hs = ["title"], Us = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#00BCD4", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - display: "flex", - "align-items": "center", - "justify-content": "space-between" -} }, Ws = ["title"], Gs = { style: { - display: "flex", - "align-items": "center", - gap: "10px" -} }, Ks = { style: { - flex: "1", - height: "8px", - background: "rgba(255,255,255,0.1)", - "border-radius": "4px", - overflow: "hidden" -} }, qs = { - key: 0, - style: { - "font-size": "10px", - color: "rgba(255,255,255,0.65)", - border: "1px dashed rgba(255,255,255,0.25)", - "border-radius": "4px", - padding: "6px 8px", - background: "rgba(255,255,255,0.04)" - } -}, Js = { style: { - "font-size": "10px", - "font-weight": "600", - color: "rgba(0, 188, 212, 0.75)", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-top": "8px", - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "8px" -} }, Ys = ["title"], Xs = { style: { - display: "flex", - "align-items": "center", - gap: "6px" -} }, Zs = ["title"], Qs = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#9C27B0", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" -} }, $s = { style: { - display: "grid", - "grid-template-columns": "repeat(auto-fit, minmax(190px, 1fr))", - gap: "10px" -} }, ec = { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.58)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" -} }, tc = ["onClick"], nc = { - key: 0, - style: { - display: "flex", - "flex-direction": "column", - gap: "5px" - } -}, rc = ["onClick"], ic = { style: { - display: "flex", - "justify-content": "space-between", - "align-items": "center", - "font-size": "11px", - "font-weight": "600", - color: "#00BCD4", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" -} }, ac = { style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "line-height": "1.5", - "white-space": "pre-wrap", - "word-break": "break-word" -} }, oc = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#FF9800", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" -} }, sc = { style: { - display: "grid", - "grid-template-columns": "repeat(auto-fit, minmax(130px, 1fr))", - gap: "8px" -} }, cc = ["onClick"], lc = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#9C27B0", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" -} }, uc = { style: { - display: "grid", - "grid-template-columns": "repeat(auto-fit, minmax(220px, 1fr))", - gap: "10px" -} }, dc = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "10px" -} }, fc = { style: { - display: "flex", - "flex-direction": "column", - gap: "4px" -} }, pc = ["onClick"], mc = { - key: 0, - style: { - display: "flex", - "flex-direction": "column", - gap: "6px" - } -}, hc = { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.58)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" -} }, gc = { style: { - display: "flex", - "flex-direction": "column", - gap: "5px" -} }, _c = ["onClick"], vc = { style: { - display: "grid", - "grid-template-columns": "auto 1fr", - gap: "8px 12px", - "align-items": "start" -} }, yc = ["title"], bc = ["title"], xc = ["title", "onClick"], Sc = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#4CAF50", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" -} }, Cc = ["title", "onClick"], wc = { style: { - "font-size": "11px", - "font-weight": "600", - color: "#26C6DA", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" -} }, Tc = { style: { - display: "grid", - "grid-template-columns": "repeat(auto-fit, minmax(190px, 1fr))", - gap: "10px" -} }, Ec = { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.58)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" -} }, Dc = ["title", "onClick"], Oc = { style: { - display: "flex", - "justify-content": "space-between", - "align-items": "center", - "font-size": "11px", - "font-weight": "600", - color: "#26A69A", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" -} }, kc = ["title"], Ac = { style: { - "font-size": "11px", - "font-weight": "700", - color: "#E91E63", - "text-transform": "uppercase", - "letter-spacing": "1px" -} }, jc = ["title"], Mc = ["title"], Nc = { style: { - display: "flex", - gap: "8px", - "flex-wrap": "wrap" -} }, Pc = /* @__PURE__ */ nt({ - __name: "SidebarGenerationSection", - props: { asset: {} }, - setup(e) { - let t = e, n = H(0), r = H(0), i = H(""), a = H(k("action.copy", "Copy")), o = H(k("action.generate", "Generate")), s = H(!1), c = H(d()), u = 0; - function d() { - return { - scoreText: "...", - scoreColor: "#888", - qualityText: k("status.loading", "Loading"), - qualityColor: "#888", - qualityBackground: "rgba(127,127,127,0.3)", - fillWidth: "0%", - fillColor: "#666", - aiStatusVisible: !1, - aiStatusText: k("sidebar.generation.aiDisabledEnv", "AI features are disabled (enable vector search env var).") - }; - } - function f(e, t) { - let n = String(e || "").trim().replace(/^#/, ""); - return /^[0-9a-fA-F]{6}$/.test(n) ? `rgba(${Number.parseInt(n.slice(0, 2), 16)}, ${Number.parseInt(n.slice(2, 4), 16)}, ${Number.parseInt(n.slice(4, 6), 16)}, ${t})` : `rgba(255,255,255,${t})`; - } - function p(e, { emphasis: t = !1, startAlpha: n = .16, endAlpha: r = .08 } = {}) { - return { - background: t ? `linear-gradient(135deg, ${f(e, n)} 0%, ${f(e, r)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))", - borderLeft: `3px solid ${e}`, - border: t ? `1px solid ${f(e, .45)}` : "1px solid var(--border-color, rgba(255,255,255,0.12))", - boxShadow: t ? `0 0 0 1px ${f(e, .15)} inset` : "none", - borderRadius: "6px", - padding: "12px" - }; - } - function m() { - return { - background: "linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(156, 39, 176, 0.15) 100%)", - border: "2px solid #E91E63", - borderRadius: "8px", - padding: "12px 16px", - display: "flex", - alignItems: "center", - justifyContent: "space-between", - gap: "12px" - }; - } - function h() { - return { - display: "inline-flex", - alignItems: "center", - borderRadius: "999px", - border: "1px solid rgba(0, 188, 212, 0.55)", - background: "rgba(0, 188, 212, 0.16)", - color: "#4DD0E1", - fontSize: "9px", - fontWeight: "700", - lineHeight: "1", - padding: "2px 6px", - letterSpacing: "0.2px", - textTransform: "uppercase", - whiteSpace: "nowrap" - }; - } - let g = F(() => Eo(t.asset)), _ = F(() => Wa()), v = F(() => g.value.kind === "full" || g.value.kind === "caption-only"), y = F(() => qa(i.value) || g.value.emptyCaptionText), b = F(() => _.value && g.value.isImageAsset && !!t.asset?.id), x = F(() => _.value && !!qa(y.value) && y.value !== g.value.emptyCaptionText), S = F(() => g.value.branchCards.filter((e) => e.modelFields.length || e.loras.length)), C = F(() => g.value.branchCards.filter((e) => e.samplingFields.length)); - F(() => g.value.branchCards.filter((e) => e.loras.length)); - let ee = F(() => { - let e = [], t = (e, t) => Pa(e)?.title || t; - return !S.value.length && g.value.modelFields.length && e.push({ - key: "model", - title: t("model", k("sidebar.generation.modelLora", "Model & LoRA")), - accent: "#9C27B0", - emphasis: !0, - fields: g.value.modelFields - }), !C.value.length && g.value.samplingFields.length && e.push({ - key: "sampling", - title: t("sampler", k("sidebar.generation.sampling", "Sampling")), - accent: "#FF9800", - emphasis: !0, - fields: g.value.samplingFields - }), (g.value.ttsFields.length || g.value.workflowType.toLowerCase() === "tts") && e.push({ - key: "tts", - title: "TTS", - accent: "#26A69A", - emphasis: !0, - fields: g.value.ttsFields - }), g.value.ttsEngineFields.length && e.push({ - key: "tts-engine", - title: "TTS Engine", - accent: "#00897B", - emphasis: !1, - fields: g.value.ttsEngineFields - }), g.value.ttsRuntimeFields.length && e.push({ - key: "tts-runtime", - title: "TTS Runtime", - accent: "#00796B", - emphasis: !1, - fields: g.value.ttsRuntimeFields - }), g.value.audioFields.length && e.push({ - key: "audio", - title: k("sidebar.generation.audio", "Audio"), - accent: "#00BCD4", - emphasis: !1, - fields: g.value.audioFields - }), g.value.imageFields.length && e.push({ - key: "image", - title: k("sidebar.generation.image", "Image"), - accent: "#2196F3", - emphasis: !1, - fields: g.value.imageFields - }), e; - }); - function te(e, t, n = 450) { - if (!e) return; - let r = e.style.background; - e.style.background = t, setTimeout(() => { - e.style.background = r || ""; - }, n); - } - function w(e, t = !0) { - return { - background: t ? `linear-gradient(135deg, ${f(e, .16)} 0%, ${f(e, .08)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))", - border: `1px solid ${f(e, .42)}`, - boxShadow: `0 0 0 1px ${f(e, .14)} inset`, - borderRadius: "8px", - padding: "12px", - display: "flex", - flexDirection: "column", - gap: "10px" - }; - } - function T(e) { - return "#CE6DE0"; - } - function ne(e) { - let t = String(e?.key || "").toLowerCase(); - return t.includes("high") ? "#FFC107" : t.includes("low") ? "#FFB300" : t.includes("base") ? "#FF9800" : t.includes("upscale") || t.includes("refine") ? "#FFCA28" : t.includes("pass") ? "#FDD835" : "#FF9800"; - } - function re(e) { - return e === "high_noise" ? "#FF7043" : e === "low_noise" ? "#29B6F6" : "#AB47BC"; - } - async function E(e, t = null, n = "rgba(76, 175, 80, 0.35)") { - let r = String(e ?? "").trim(); - if (r && r !== "-") try { - await navigator.clipboard.writeText(r), te(t, n); - } catch (e) { - console.debug?.(e); - } - } - function ie() { - c.value = { - scoreText: "AI OFF", - scoreColor: "#9E9E9E", - qualityText: k("status.disabled", "Disabled"), - qualityColor: "#BDBDBD", - qualityBackground: "rgba(158,158,158,0.25)", - fillWidth: "0%", - fillColor: "#777", - aiStatusVisible: !0, - aiStatusText: k("sidebar.generation.aiDisabledSettings", "AI features are disabled in settings.") - }; - } - function ae() { - c.value = d(); - } - async function D() { - u += 1; - let e = u; - if (!g.value.showAlignment || !t.asset?.id) ae(); - else if (!_.value) ie(); - else { - ae(); - try { - let n = await _e(t.asset.id); - if (e !== u) return; - if (!n?.ok && (String(n?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(n?.error || "")))) { - ie(); - return; - } - let r = n?.ok && n.data != null ? Number(n.data) : null; - if (!Number.isFinite(r)) { - c.value = { - scoreText: "N/A", - scoreColor: "#888", - qualityText: k("status.na", "N/A"), - qualityColor: "#888", - qualityBackground: "rgba(127,127,127,0.3)", - fillWidth: "0%", - fillColor: "#666", - aiStatusVisible: !1, - aiStatusText: "" - }; - return; - } - let i = Math.round(r * 100), a = Ga(r); - c.value = { - scoreText: `${i}%`, - scoreColor: a, - qualityText: Ka(r), - qualityColor: a, - qualityBackground: `${a}33`, - fillWidth: `${i}%`, - fillColor: a, - aiStatusVisible: !1, - aiStatusText: "" - }; - } catch (t) { - if (console.debug?.(t), e !== u) return; - c.value = { - scoreText: "-", - scoreColor: "#888", - qualityText: k("status.unavailable", "Unavailable"), - qualityColor: "#888", - qualityBackground: "rgba(127,127,127,0.3)", - fillWidth: "0%", - fillColor: "#666", - aiStatusVisible: !1, - aiStatusText: "" - }; - } - } - } - async function oe() { - if (b.value && !s.value) { - s.value = !0, o.value = k("status.generating", "Generating..."); - try { - let e = await l(t.asset.id); - e?.ok && (i.value = String(e?.data || "").trim()); - } catch (e) { - console.debug?.(e); - } finally { - s.value = !1, o.value = k("action.generate", "Generate"); - } - } - } - async function se() { - if (x.value) try { - await navigator.clipboard.writeText(y.value), a.value = k("viewer.copySuccessShort", "Copied!"), setTimeout(() => { - a.value = k("action.copy", "Copy"); - }, 900); - } catch (e) { - console.debug?.(e); - } - } - return tt(() => t.asset, () => { - n.value = 0, r.value = 0, i.value = String(t.asset?.enhanced_caption || "").trim(), a.value = k("action.copy", "Copy"), o.value = k("action.generate", "Generate"); - }, { immediate: !0 }), tt(() => [ - t.asset?.id, - g.value.kind, - g.value.showAlignment, - _.value - ], () => { - D(); - }, { immediate: !0 }), (e, t) => { - let r = $e("MButton"); - return g.value.kind === "empty" ? P("", !0) : (L(), B("div", Fo, [ - g.value.workflowType ? (L(), B("div", Io, [N("span", Lo, z(V(k)("viewer.workflow", "Workflow")), 1), N("div", Ro, [N("span", { - title: V(k)("sidebar.generation.workflowEngine", "Workflow engine: {value}", { value: g.value.workflowType }), - style: { - background: "#2196F3", - color: "white", - padding: "2px 8px", - "border-radius": "999px", - "font-weight": "bold", - "font-size": "10px", - "letter-spacing": "0.2px" - } - }, z(g.value.workflowLabel || g.value.workflowType), 9, zo), g.value.workflowBadge ? (L(), B("span", { - key: 0, - title: V(k)("sidebar.generation.apiProvider", "API provider: {value}", { value: g.value.workflowBadge }), - style: { - background: "rgba(255,255,255,0.08)", - color: "var(--fg-color, #eee)", - padding: "2px 8px", - "border-radius": "999px", - border: "1px solid rgba(255,255,255,0.14)", - "font-weight": "600", - "font-size": "10px", - "letter-spacing": "0.2px" - } - }, z(g.value.workflowBadge), 9, Bo)) : P("", !0)])])) : P("", !0), - g.value.isOverride ? (L(), B("div", { - key: 1, - style: R(p("#00BCD4", { - emphasis: !0, - startAlpha: .14, - endAlpha: .08 - })) - }, [N("div", Vo, [N("span", Ho, z(V(k)("sidebar.generation.override", "Override")), 1), N("span", Uo, z(g.value.overrideLabel), 1)])], 4)) : P("", !0), - g.value.isTruncated ? (L(), B("div", { - key: 2, - style: R(p("#FF9800", { - emphasis: !0, - startAlpha: .12, - endAlpha: .08 - })) - }, [N("div", Wo, z(V(k)("sidebar.generation.metadataTruncated", "Metadata Truncated")), 1), N("div", Go, z(V(k)("sidebar.generation.metadataTruncatedBody", "Generation data is incomplete because it exceeded the size limit.")), 1)], 4)) : P("", !0), - g.value.kind === "media-only" ? (L(), B("div", { - key: 3, - style: R(p("#9E9E9E", { - emphasis: !0, - startAlpha: .1, - endAlpha: .06 - })) - }, [N("div", Ko, z(V(k)("sidebar.generation.generationData", "Generation Data")), 1), N("div", qo, z(g.value.mediaOnlyMessage), 1)], 4)) : P("", !0), - g.value.kind === "full" ? (L(), B(M, { key: 4 }, [ - g.value.ltxDirector ? (L(), B("div", { - key: 0, - style: R(p("#26C6DA", { - emphasis: !0, - startAlpha: .15, - endAlpha: .08 - })) - }, [ - N("div", Jo, [N("div", Yo, z(g.value.ltxDirector.title || "LTX Director"), 1), t[8] ||= N("span", { style: { - "font-size": "10px", - "font-weight": "700", - color: "#26C6DA", - background: "rgba(38,198,218,0.14)", - border: "1px solid rgba(38,198,218,0.32)", - "border-radius": "999px", - padding: "2px 8px" - } }, " Director ", -1)]), - g.value.ltxDirector.fields.length ? (L(), B("div", Xo, [(L(!0), B(M, null, I(g.value.ltxDirector.fields, (e) => (L(), B("div", { - key: `ltx-field-${e.label}`, - style: { - border: "1px solid rgba(255,255,255,0.10)", - "border-radius": "6px", - background: "rgba(255,255,255,0.045)", - padding: "7px 8px", - "min-width": "0" - } - }, [N("div", Zo, z(e.label), 1), N("div", Qo, z(e.value), 1)]))), 128))])) : P("", !0), - g.value.ltxDirector.globalPrompt ? (L(), B("div", $o, [t[9] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "800", - color: "#66BB6A", - "text-transform": "uppercase", - "letter-spacing": "0.45px", - "margin-bottom": "6px" - } }, " Global Prompt ", -1), N("div", { - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - "font-size": "12px", - color: "var(--fg-color,#eee)", - "line-height": "1.45", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: t[0] ||= (e) => E(g.value.ltxDirector.globalPrompt, e.currentTarget) - }, z(g.value.ltxDirector.globalPrompt), 9, es)])) : P("", !0), - g.value.ltxDirector.segments.length ? (L(), B("div", ts, [(L(!0), B(M, null, I(g.value.ltxDirector.segments, (e) => (L(), B("div", { - key: e.key, - style: { - border: "1px solid rgba(38,198,218,0.30)", - "border-radius": "6px", - background: "rgba(38,198,218,0.075)", - padding: "10px" - } - }, [N("div", ns, [N("div", rs, z(e.label), 1), N("div", is, [e.inLabel ? (L(), B("span", as, " in " + z(e.inLabel), 1)) : P("", !0), e.outLabel ? (L(), B("span", os, " out " + z(e.outLabel), 1)) : P("", !0)])]), N("div", ss, [e.filename ? (L(), Qe(Po, { - key: 0, - "input-file": { - filename: e.filename, - filepath: e.filepath || e.filename, - role: e.type || "segment", - roleLabel: e.type || "segment", - isVideo: e.isVideo, - isAudio: e.isAudio, - previewCandidates: e.previewCandidates - } - }, null, 8, ["input-file"])) : P("", !0), N("div", cs, [e.prompt ? (L(), B("div", { - key: 0, - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - "font-size": "12px", - color: "var(--fg-color,#eee)", - "line-height": "1.45", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: (t) => E(e.prompt, t.currentTarget) - }, z(e.prompt), 9, ls)) : P("", !0), e.filename || e.type ? (L(), B("div", us, [e.type ? (L(), B("span", ds, z(e.type), 1)) : P("", !0), e.filename ? (L(), B("span", fs, z(e.filename), 1)) : P("", !0)])) : P("", !0)])])]))), 128))])) : P("", !0) - ], 4)) : P("", !0), - g.value.ideogram ? (L(), B("div", { - key: 1, - style: R(p("#FFB300", { - emphasis: !0, - startAlpha: .15, - endAlpha: .08 - })) - }, [ - N("div", ps, [N("div", ms, z(g.value.ideogram.title || "Ideogram 4"), 1), t[10] ||= N("span", { style: { - "font-size": "10px", - "font-weight": "700", - color: "#FFCA28", - background: "rgba(255,179,0,0.14)", - border: "1px solid rgba(255,179,0,0.32)", - "border-radius": "999px", - padding: "2px 8px" - } }, " Prompt JSON ", -1)]), - g.value.ideogram.fields.length ? (L(), B("div", hs, [(L(!0), B(M, null, I(g.value.ideogram.fields, (e) => (L(), B("div", { - key: `ideogram-field-${e.label}`, - style: { - border: "1px solid rgba(255,255,255,0.10)", - "border-radius": "6px", - background: "rgba(255,255,255,0.045)", - padding: "7px 8px", - "min-width": "0" - } - }, [N("div", gs, z(e.label), 1), N("div", _s, z(e.value), 1)]))), 128))])) : P("", !0), - g.value.ideogram.highLevelDescription ? (L(), B("div", vs, [t[11] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "800", - color: "#81C784", - "text-transform": "uppercase", - "letter-spacing": "0.45px", - "margin-bottom": "6px" - } }, " High Level Description ", -1), N("div", { - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - "font-size": "12px", - color: "var(--fg-color,#eee)", - "line-height": "1.45", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: t[1] ||= (e) => E(g.value.ideogram.highLevelDescription, e.currentTarget) - }, z(g.value.ideogram.highLevelDescription), 9, ys)])) : P("", !0), - g.value.ideogram.background ? (L(), B("div", bs, [t[12] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "800", - color: "#64B5F6", - "text-transform": "uppercase", - "letter-spacing": "0.45px", - "margin-bottom": "6px" - } }, " Background ", -1), N("div", { - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - "font-size": "12px", - color: "var(--fg-color,#eee)", - "line-height": "1.45", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: t[2] ||= (e) => E(g.value.ideogram.background, e.currentTarget) - }, z(g.value.ideogram.background), 9, xs)])) : P("", !0), - g.value.ideogram.elements.length ? (L(), B("div", Ss, [(L(!0), B(M, null, I(g.value.ideogram.elements, (e) => (L(), B("div", { - key: e.key, - style: { - border: "1px solid rgba(255,179,0,0.30)", - "border-radius": "6px", - background: "rgba(255,179,0,0.075)", - padding: "10px" - } - }, [ - N("div", Cs, [N("div", ws, z(e.label), 1), e.bbox ? (L(), B("span", Ts, " bbox " + z(e.bbox), 1)) : P("", !0)]), - e.description ? (L(), B("div", { - key: 0, - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - "font-size": "12px", - color: "var(--fg-color,#eee)", - "line-height": "1.45", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: (t) => E(e.description, t.currentTarget) - }, z(e.description), 9, Es)) : P("", !0), - e.palette.length ? (L(), B("div", Ds, [(L(!0), B(M, null, I(e.palette, (t) => (L(), B("span", { - key: `${e.key}-${t}`, - title: t, - style: R({ - width: "18px", - height: "18px", - borderRadius: "4px", - border: "1px solid rgba(255,255,255,0.28)", - background: t - }), - onClick: (e) => E(t, e.currentTarget) - }, null, 12, Os))), 128))])) : P("", !0) - ]))), 128))])) : P("", !0), - N("details", ks, [t[13] ||= N("summary", { style: { - cursor: "pointer", - padding: "8px 10px", - "font-size": "10px", - "font-weight": "800", - color: "#FFCA28", - "text-transform": "uppercase", - "letter-spacing": "0.45px" - } }, " JSON sent to text encoder ", -1), N("pre", { - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - margin: "0", - padding: "10px", - "max-height": "260px", - overflow: "auto", - "font-size": "11px", - "line-height": "1.35", - color: "rgba(255,255,255,0.9)", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: t[3] ||= (e) => E(g.value.ideogram.json, e.currentTarget) - }, z(g.value.ideogram.json), 9, As)]) - ], 4)) : P("", !0), - !g.value.ltxDirector && !g.value.ideogram && g.value.promptTabs.length ? (L(), B("div", { - key: 2, - style: R(p("#4CAF50", { - emphasis: !0, - startAlpha: .16, - endAlpha: .1 - })) - }, [ - N("div", js, z(V(k)("sidebar.generation.promptPipeline", "Prompt Pipeline ({count} variants)", { count: g.value.promptTabs.length })), 1), - N("div", Ms, [(L(!0), B(M, null, I(g.value.promptTabs, (e, t) => (L(), Qe(r, { - key: e.label, - type: "button", - severity: "secondary", - text: "", - rounded: "", - style: R({ - appearance: "none", - border: n.value === t ? "1px solid #4CAF50" : "1px solid var(--border-color, rgba(255,255,255,0.12))", - borderRadius: "999px", - background: n.value === t ? "#4CAF5033" : "rgba(127,127,127,0.12)", - color: n.value === t ? "#4CAF50" : "var(--fg-color, #ddd)", - fontSize: "11px", - padding: "4px 10px", - cursor: "pointer", - fontWeight: n.value === t ? "700" : "500", - boxShadow: n.value === t ? "0 0 0 1px #4CAF5055 inset" : "none" - }), - onClick: (e) => n.value = t - }, { - default: et(() => [Ze(z(e.label), 1)]), - _: 2 - }, 1032, ["style", "onClick"]))), 128))]), - (L(!0), B(M, null, I(g.value.promptTabs, (e, t) => at((L(), B("div", { - key: `${e.label}-panel`, - style: { - display: "flex", - "flex-direction": "column", - gap: "8px", - border: "1px solid rgba(76, 175, 80, 0.35)", - "border-radius": "6px", - background: "linear-gradient(135deg, rgba(76, 175, 80, 0.12) 0%, rgba(33, 150, 243, 0.08) 100%)", - "box-shadow": "0 0 0 1px rgba(76, 175, 80, 0.12) inset", - padding: "10px" - } - }, [ - N("div", Ns, z(V(k)("sidebar.generation.positive", "POSITIVE")), 1), - N("div", { - style: { - "font-size": "12px", - color: "var(--fg-color, #ddd)", - "white-space": "pre-wrap", - "line-height": "1.35", - cursor: "pointer" - }, - onClick: (t) => E(e.positive, t.currentTarget) - }, z(e.positive), 9, Ps), - e.negative ? (L(), B(M, { key: 0 }, [N("div", Fs, z(V(k)("sidebar.generation.negative", "NEGATIVE")), 1), N("div", { - style: { - "font-size": "12px", - color: "var(--fg-color, #ddd)", - "white-space": "pre-wrap", - "line-height": "1.35", - cursor: "pointer" - }, - onClick: (t) => E(e.negative, t.currentTarget) - }, z(e.negative), 9, Is)], 64)) : P("", !0) - ])), [[ct, n.value === t]])), 128)) - ], 4)) : !g.value.ltxDirector && !g.value.ideogram && g.value.positivePrompt ? (L(), B("div", { - key: 3, - style: R(p("#4CAF50", { - emphasis: !0, - startAlpha: .16, - endAlpha: .1 - })) - }, [N("div", Ls, [N("span", null, z(V(k)("sidebar.generation.positivePrompt", "Positive Prompt")), 1), g.value.positivePromptOverride ? (L(), B("span", { - key: 0, - style: R(h()), - title: V(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, z(V(k)("sidebar.generation.override", "override")), 13, Rs)) : P("", !0)]), N("div", { - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "line-height": "1.5", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: t[4] ||= (e) => E(g.value.positivePrompt, e.currentTarget) - }, z(g.value.positivePrompt), 9, zs)], 4)) : P("", !0), - !g.value.ltxDirector && !g.value.ideogram && !g.value.promptTabs.length && g.value.negativePrompt ? (L(), B("div", { - key: 4, - style: R(p("#F44336", { - emphasis: !0, - startAlpha: .16, - endAlpha: .1 - })) - }, [N("div", Bs, [N("span", null, z(V(k)("sidebar.generation.negativePrompt", "Negative Prompt")), 1), g.value.negativePromptOverride ? (L(), B("span", { - key: 0, - style: R(h()), - title: V(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, z(V(k)("sidebar.generation.override", "override")), 13, Vs)) : P("", !0)]), N("div", { - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "line-height": "1.5", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: t[5] ||= (e) => E(g.value.negativePrompt, e.currentTarget) - }, z(g.value.negativePrompt), 9, Hs)], 4)) : P("", !0) - ], 64)) : P("", !0), - v.value ? (L(), B("div", { - key: 5, - style: { - background: "linear-gradient(135deg, rgba(0, 188, 212, 0.14) 0%, rgba(33, 150, 243, 0.10) 100%)", - border: "1px solid rgba(0, 188, 212, 0.40)", - "border-radius": "6px", - padding: "12px", - display: "flex", - "flex-direction": "column", - gap: "10px" - }, - class: Et({ "mjr-ai-disabled-block": !_.value }) - }, [ - g.value.showAlignment ? (L(), B(M, { key: 0 }, [ - N("div", Us, [N("span", { title: V(k)("sidebar.generation.promptAlignmentTooltip", "How closely the generated image matches the prompt (SigLIP2 score)") }, z(V(k)("sidebar.generation.promptAlignment", "Prompt Alignment")), 9, Ws)]), - N("div", Gs, [ - N("div", Ks, [N("div", { style: R({ - height: "100%", - width: c.value.fillWidth, - background: c.value.fillColor, - borderRadius: "4px", - transition: "width 0.6s ease, background 0.4s ease" - }) }, null, 4)]), - N("span", { style: R({ - fontSize: "13px", - fontWeight: "700", - color: c.value.scoreColor, - minWidth: "60px", - textAlign: "right", - fontFamily: "'Consolas', 'Monaco', monospace" - }) }, z(c.value.scoreText), 5), - N("span", { style: R({ - fontSize: "9px", - fontWeight: "700", - padding: "2px 6px", - borderRadius: "3px", - background: c.value.qualityBackground, - color: c.value.qualityColor, - textTransform: "uppercase", - letterSpacing: "0.5px" - }) }, z(c.value.qualityText), 5) - ]), - c.value.aiStatusVisible ? (L(), B("div", qs, z(c.value.aiStatusText), 1)) : P("", !0) - ], 64)) : P("", !0), - N("div", Js, [N("span", { title: V(k)("sidebar.generation.aiCaptionTooltip", "AI caption generated by Florence-2") }, z(g.value.captionLabel), 9, Ys), N("div", Xs, [ht(r, { - type: "button", - class: "mjr-ai-control", - severity: "secondary", - text: "", - disabled: !b.value || s.value, - style: R([{ - border: "1px solid rgba(0,188,212,0.45)", - background: "rgba(0,188,212,0.12)", - color: "#00BCD4", - "border-radius": "4px", - "font-size": "10px", - "font-weight": "600", - padding: "2px 8px", - cursor: "pointer" - }, { - opacity: b.value ? "1" : "0.6", - cursor: b.value ? "pointer" : "default" - }]), - onClick: it(oe, ["stop"]) - }, { - default: et(() => [Ze(z(o.value), 1)]), - _: 1 - }, 8, ["disabled", "style"]), ht(r, { - type: "button", - class: "mjr-ai-control", - severity: "secondary", - text: "", - disabled: !x.value, - style: R([{ - border: "1px solid rgba(0,188,212,0.45)", - background: "rgba(0,188,212,0.12)", - color: "#00BCD4", - "border-radius": "4px", - "font-size": "10px", - "font-weight": "600", - padding: "2px 8px", - cursor: "pointer" - }, { - opacity: x.value ? "1" : "0.6", - cursor: x.value ? "pointer" : "default" - }]), - onClick: it(se, ["stop"]) - }, { - default: et(() => [Ze(z(a.value), 1)]), - _: 1 - }, 8, ["disabled", "style"])])]), - N("div", { - title: _.value ? V(k)("sidebar.generation.copyCaptionTooltip", "Click to copy caption") : V(k)("sidebar.generation.aiCaptionDisabled", "AI caption controls are disabled"), - style: R({ - marginTop: "4px", - padding: "8px", - borderRadius: "6px", - border: "1px solid rgba(0, 188, 212, 0.30)", - background: "rgba(0, 188, 212, 0.08)", - color: "rgba(230, 250, 255, 0.95)", - fontSize: "11px", - lineHeight: "1.45", - whiteSpace: "pre-wrap", - wordBreak: "break-word", - cursor: x.value ? "copy" : "default" - }), - onClick: se - }, z(y.value), 13, Zs) - ], 2)) : P("", !0), - S.value.length ? (L(), B("div", { - key: 6, - style: R(p("#9C27B0", { - emphasis: !0, - startAlpha: .18, - endAlpha: .1 - })) - }, [N("div", Qs, z(V(k)("sidebar.generation.models", "Models")), 1), N("div", $s, [(L(!0), B(M, null, I(S.value, (e) => (L(), B("div", { - key: `models-top-${e.key}`, - style: R(w(T(e), !0)) - }, [ - N("div", { style: R({ - fontSize: "10px", - fontWeight: "800", - color: T(e), - letterSpacing: "0.6px", - textTransform: "uppercase" - }) }, z(e.label), 5), - (L(!0), B(M, null, I(e.modelFields, (t) => (L(), B("div", { - key: `model-top-${e.key}-${t.label}`, - style: { - display: "flex", - "flex-direction": "column", - gap: "3px", - "min-width": "0" - } - }, [N("span", ec, z(t.label), 1), N("span", { - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.96))", - "line-height": "1.35", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: (e) => E(t.value, e.currentTarget) - }, z(t.value || "-"), 9, tc)]))), 128)), - e.loras.length ? (L(), B("div", nc, [t[14] ||= N("span", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.58)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "LoRA", -1), (L(!0), B(M, null, I(e.loras, (t, n) => (L(), B("span", { - key: `model-top-${e.key}-lora-${n}`, - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.92))", - "line-height": "1.35", - "word-break": "break-word", - padding: "6px 8px", - "border-radius": "6px", - background: "rgba(255,255,255,0.05)", - border: "1px solid rgba(255,255,255,0.08)", - cursor: "pointer" - }, - onClick: (e) => E(t, e.currentTarget) - }, z(t), 9, rc))), 128))])) : P("", !0) - ], 4))), 128))])], 4)) : P("", !0), - g.value.lyrics ? (L(), B("div", { - key: 7, - style: R(p("#00BCD4", { emphasis: !1 })) - }, [N("div", ic, [N("span", null, z(V(k)("sidebar.generation.lyrics", "Lyrics")), 1)]), N("div", ac, z(g.value.lyrics), 1)], 4)) : P("", !0), - g.value.branchCards.length ? (L(), B(M, { key: 8 }, [ - P("", !0), - C.value.length ? (L(), B("div", { - key: 1, - style: R(p("#FF9800", { - emphasis: !0, - startAlpha: .16, - endAlpha: .1 - })) - }, [N("div", oc, z(V(k)("sidebar.generation.sampling", "Sampling")), 1), N("div", sc, [(L(!0), B(M, null, I(C.value, (e) => (L(), B("div", { - key: `sampling-${e.key}`, - style: R(w(ne(e), !0)) - }, [N("div", { style: R({ - fontSize: "10px", - fontWeight: "800", - color: ne(e), - letterSpacing: "0.6px", - textTransform: "uppercase" - }) }, z(e.label), 5), (L(!0), B(M, null, I(e.samplingFields, (t) => (L(), B("div", { - key: `sampling-row-${e.key}-${t.label}`, - style: { - display: "grid", - "grid-template-columns": "minmax(48px,0.8fr) minmax(0,1fr)", - gap: "8px", - "font-size": "11px", - color: "rgba(255,255,255,0.72)", - "align-items": "start" - } - }, [N("span", null, z(t.label), 1), N("span", { - style: { - color: "var(--fg-color, #ddd)", - "word-break": "break-word", - "text-align": "right", - cursor: "pointer" - }, - onClick: (e) => E(t.value, e.currentTarget) - }, z(t.value), 9, cc)]))), 128))], 4))), 128))])], 4)) : P("", !0), - P("", !0) - ], 64)) : g.value.modelGroups.length ? (L(), B("div", { - key: 9, - style: R(p("#9C27B0", { - emphasis: !0, - startAlpha: .18, - endAlpha: .1 - })) - }, [N("div", lc, z(V(k)("sidebar.generation.models", "Models")), 1), N("div", uc, [(L(!0), B(M, null, I(g.value.modelGroups, (e) => (L(), B("div", { - key: `model-group-${e.key}`, - style: R(w(re(e.key), !0)) - }, [ - N("div", dc, [N("div", { style: R({ - fontSize: "10px", - fontWeight: "800", - color: re(e.key), - letterSpacing: "0.6px", - textTransform: "uppercase" - }) }, z(e.label), 5), N("span", { style: R({ - fontSize: "9px", - fontWeight: "700", - color: "#fff", - background: f(re(e.key), .22), - border: `1px solid ${f(re(e.key), .48)}`, - borderRadius: "999px", - padding: "2px 8px", - letterSpacing: "0.4px", - textTransform: "uppercase" - }) }, z(e.loras?.length || 0) + " LoRA ", 5)]), - N("div", fc, [t[15] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.58)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, " UNet ", -1), N("div", { - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.96))", - "line-height": "1.45", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: (t) => E(e.model, t.currentTarget) - }, z(e.model || "-"), 9, pc)]), - e.loras?.length ? (L(), B("div", mc, [N("div", hc, z(V(k)("sidebar.generation.loraStack", "LoRA Stack")), 1), N("div", gc, [(L(!0), B(M, null, I(e.loras, (t, n) => (L(), B("div", { - key: `${e.key}-lora-${n}`, - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.92))", - "line-height": "1.4", - "word-break": "break-word", - padding: "6px 8px", - "border-radius": "6px", - background: "rgba(255,255,255,0.05)", - border: "1px solid rgba(255,255,255,0.08)", - cursor: "pointer" - }, - onClick: (e) => E(t, e.currentTarget) - }, z(t), 9, _c))), 128))])])) : P("", !0) - ], 4))), 128))])], 4)) : P("", !0), - (L(!0), B(M, null, I(ee.value, (e) => (L(), B("div", { - key: e.key, - style: R(p(e.accent, { emphasis: e.emphasis })) - }, [N("div", { style: R({ - fontSize: "11px", - fontWeight: "600", - color: e.accent, - textTransform: "uppercase", - letterSpacing: "0.5px", - marginBottom: "10px" - }) }, z(e.title), 5), N("div", vc, [(L(!0), B(M, null, I(e.fields, (t) => (L(), B(M, { key: `${e.key}-${t.label}` }, [N("div", { - title: t.label, - style: { - "font-size": "11px", - color: "var(--mjr-muted, rgba(127,127,127,0.9))", - "font-weight": "500", - display: "flex", - "align-items": "center", - gap: "6px" - } - }, [N("span", null, z(t.label) + ":", 1), t.override ? (L(), B("span", { - key: 0, - style: R(h()), - title: V(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, z(V(k)("sidebar.generation.override", "override")), 13, bc)) : P("", !0)], 8, yc), N("div", { - title: `${t.label}: ${t.value}`, - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.95))", - "word-break": "break-word", - "white-space": "pre-wrap", - cursor: "pointer" - }, - onClick: (e) => E(t.value, e.currentTarget) - }, z(t.value), 9, xc)], 64))), 128))])], 4))), 128)), - g.value.notesFields.length ? (L(), B("div", { - key: 10, - style: R(p("#4CAF50", { emphasis: !1 })) - }, [N("div", Sc, z(V(k)("sidebar.generation.notes", "Notes")), 1), (L(!0), B(M, null, I(g.value.notesFields, (e) => (L(), B("div", { - key: e.label, - title: `${e.label}: ${e.value}`, - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "line-height": "1.5", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: (t) => E(e.value, t.currentTarget) - }, z(e.value), 9, Cc))), 128))], 4)) : P("", !0), - g.value.moduleBlocks.length ? (L(), B("div", { - key: 11, - style: R(p("#26C6DA", { - emphasis: !0, - startAlpha: .14, - endAlpha: .08 - })) - }, [N("div", wc, z(V(k)("sidebar.generation.modules", "Modules")), 1), N("div", Tc, [(L(!0), B(M, null, I(g.value.moduleBlocks, (e) => (L(), B("div", { - key: `module-${e.key}-${e.title}`, - style: R(w(e.accent, !1)) - }, [N("div", { style: R({ - fontSize: "10px", - fontWeight: "800", - color: e.accent, - letterSpacing: "0.6px", - textTransform: "uppercase" - }) }, z(e.title), 5), (L(!0), B(M, null, I(e.fields, (t) => (L(), B("div", { - key: `module-${e.key}-${t.label}`, - style: { - display: "flex", - "flex-direction": "column", - gap: "3px", - "min-width": "0" - } - }, [N("span", Ec, z(t.label), 1), N("span", { - title: `${t.label}: ${t.value}`, - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "line-height": "1.35", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: (e) => E(t.value, e.currentTarget) - }, z(t.value), 9, Dc)]))), 128))], 4))), 128))])], 4)) : P("", !0), - g.value.ttsInstruction ? (L(), B("div", { - key: 12, - style: R(p("#26A69A", { emphasis: !1 })) - }, [N("div", Oc, [N("span", null, z(V(k)("sidebar.generation.ttsInstruction", "TTS Instruction")), 1)]), N("div", { - title: V(k)("action.clickToCopy", "Click to copy"), - style: { - "font-size": "12px", - color: "var(--fg-color, rgba(255,255,255,0.9))", - "line-height": "1.5", - "white-space": "pre-wrap", - "word-break": "break-word", - cursor: "pointer" - }, - onClick: t[6] ||= (e) => E(g.value.ttsInstruction, e.currentTarget) - }, z(g.value.ttsInstruction), 9, kc)], 4)) : P("", !0), - g.value.seed !== null && g.value.seed !== void 0 && g.value.seed !== "" ? (L(), B("div", { - key: 13, - style: R(m()) - }, [N("div", Ac, z(V(k)("sidebar.generation.seed", "SEED")), 1), N("div", { - title: V(k)("sidebar.generation.copySeedTooltip", "Click to copy seed: {seed}", { seed: g.value.seed }), - style: { - "font-size": "18px", - "font-weight": "700", - color: "#fff", - "font-family": "'Consolas', 'Monaco', monospace", - "letter-spacing": "1px", - cursor: "pointer", - padding: "4px 8px", - "border-radius": "4px", - transition: "background 0.2s" - }, - onClick: t[7] ||= (e) => E(g.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)") - }, z(g.value.seed), 9, jc)], 4)) : P("", !0), - g.value.inputFiles.length ? (L(), B("div", { - key: 14, - style: R(p("#4CAF50", { - emphasis: !0, - startAlpha: .16, - endAlpha: .1 - })) - }, [N("div", { - title: V(k)("tooltip.generationInputs", "Input files used in generation"), - style: { - "font-size": "11px", - "font-weight": "600", - color: "#4CAF50", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" - } - }, z(V(k)("sidebar.generation.sourceFiles", "Source Files")), 9, Mc), N("div", Nc, [(L(!0), B(M, null, I(g.value.inputFiles, (e) => (L(), Qe(Po, { - key: e.id, - "input-file": e - }, null, 8, ["input-file"]))), 128))])], 4)) : P("", !0) - ])); - }; - } -}), Fc = { - key: 0, - class: "mjr-sidebar-section", - style: { - background: "var(--comfy-menu-bg, rgba(0,0,0,0.2))", - border: "1px solid var(--border-color, rgba(255,255,255,0.14))", - "border-radius": "8px", - padding: "12px", - "min-width": "300px" - } -}, Ic = { style: { "margin-bottom": "12px" } }, Lc = { style: { - "font-size": "16px", - "font-weight": "800", - color: "rgba(255,255,255,0.94)", - "line-height": "1.25", - overflow: "hidden", - "text-overflow": "ellipsis" -} }, Rc = ["title"], zc = { - key: 1, - style: { - display: "flex", - "flex-wrap": "wrap", - gap: "6px", - "margin-top": "8px", - "min-width": "0" - }, - "aria-label": "Workflow metadata badges" -}, Bc = ["title"], Vc = { style: { - overflow: "hidden", - "text-overflow": "ellipsis", - "white-space": "nowrap" -} }, Hc = { style: { - display: "flex", - "flex-wrap": "wrap", - gap: "8px", - "margin-bottom": "10px" -} }, Uc = { style: { - padding: "4px 9px", - "border-radius": "999px", - background: "rgba(33,150,243,0.14)", - border: "1px solid rgba(33,150,243,0.30)", - "font-size": "11px", - "font-weight": "700", - color: "#90CAF9", - "text-transform": "uppercase", - "letter-spacing": "0.4px" -} }, Wc = { - key: 0, - style: { - padding: "4px 9px", - "border-radius": "999px", - background: "rgba(255,255,255,0.06)", - border: "1px solid rgba(255,255,255,0.12)", - "font-size": "11px", - "font-weight": "600", - color: "rgba(255,255,255,0.82)" - } -}, Gc = { style: { - display: "grid", - "grid-template-columns": "repeat(2, minmax(0, 1fr))", - gap: "8px", - "margin-bottom": "12px" -} }, Kc = { - key: 0, - style: { - padding: "8px 10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.04)", - border: "1px solid rgba(255,255,255,0.10)" - } -}, qc = { style: { - "font-size": "13px", - "font-weight": "750", - color: "rgba(255,255,255,0.92)", - "margin-top": "3px" -} }, Jc = { - key: 1, - style: { - padding: "8px 10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.04)", - border: "1px solid rgba(255,255,255,0.10)" - } -}, Yc = { style: { - "font-size": "13px", - "font-weight": "750", - color: "rgba(255,255,255,0.92)", - "margin-top": "3px" -} }, Xc = { - key: 2, - style: { - padding: "8px 10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.04)", - border: "1px solid rgba(255,255,255,0.10)" - } -}, Zc = { style: { - "font-size": "13px", - "font-weight": "750", - color: "rgba(255,255,255,0.92)", - "margin-top": "3px" -} }, Qc = { - key: 3, - style: { - padding: "8px 10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.04)", - border: "1px solid rgba(255,255,255,0.10)" - } -}, $c = { style: { - "font-size": "12px", - "font-weight": "650", - color: "rgba(255,255,255,0.84)", - "margin-top": "3px" -} }, el = { - key: 0, - style: { - "font-size": "11px", - color: "rgba(255,255,255,0.54)", - "margin-top": "2px" - } -}, tl = { - key: 0, - style: { - "margin-bottom": "12px", - padding: "10px", - "border-radius": "10px", - background: "rgba(244,67,54,0.08)", - border: "1px solid rgba(244,67,54,0.25)" - } -}, nl = { - key: 1, - style: { - display: "flex", - "flex-wrap": "wrap", - gap: "5px" - } -}, rl = { - key: 1, - style: { - "margin-bottom": "12px", - padding: "10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.035)", - border: "1px solid rgba(255,255,255,0.10)" - } -}, il = { - key: 0, - style: { - "font-size": "12px", - "line-height": "1.45", - color: "rgba(255,255,255,0.82)", - "white-space": "pre-wrap" - } -}, al = { style: { - display: "grid", - "grid-template-columns": "repeat(3, minmax(0, 1fr))", - gap: "8px", - "margin-bottom": "12px" -} }, ol = { - key: 2, - style: { - "margin-bottom": "12px", - padding: "10px", - "border-radius": "10px", - background: "rgba(76,175,80,0.07)", - border: "1px solid rgba(76,175,80,0.22)" - } -}, sl = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "8px", - "margin-bottom": "7px" -} }, cl = { style: { - "font-size": "11px", - color: "rgba(255,255,255,0.62)" -} }, ll = { - key: 0, - style: { - display: "flex", - "flex-direction": "column", - gap: "6px" - } -}, ul = { - key: 0, - style: { - display: "flex", - "flex-wrap": "wrap", - gap: "5px" - } -}, dl = { - key: 1, - style: { - display: "flex", - "flex-wrap": "wrap", - gap: "5px" - } -}, fl = { - key: 1, - style: { - "font-size": "12px", - color: "rgba(255,255,255,0.78)" - } -}, pl = { - key: 2, - style: { - "margin-top": "7px", - "font-size": "11px", - color: "rgba(255,255,255,0.58)" - } -}, ml = { - key: 3, - style: { - "margin-top": "8px", - "font-size": "11px", - color: "rgba(255,255,255,0.62)" - } -}, hl = { key: 0 }, gl = { style: { - display: "grid", - "grid-template-columns": "repeat(3, minmax(0, 1fr))", - gap: "8px", - "margin-bottom": "12px" -} }, _l = { style: { - padding: "8px 10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.04)", - border: "1px solid rgba(255,255,255,0.10)" -} }, vl = { style: { - "font-size": "18px", - "font-weight": "700", - color: "rgba(255,255,255,0.94)", - "margin-top": "2px" -} }, yl = { style: { - padding: "8px 10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.04)", - border: "1px solid rgba(255,255,255,0.10)" -} }, bl = { style: { - "font-size": "18px", - "font-weight": "700", - color: "rgba(255,255,255,0.94)", - "margin-top": "2px" -} }, xl = { style: { - padding: "8px 10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.04)", - border: "1px solid rgba(255,255,255,0.10)" -} }, Sl = { style: { - "font-size": "18px", - "font-weight": "700", - color: "rgba(255,255,255,0.94)", - "margin-top": "2px" -} }, Cl = { - key: 3, - style: { - "margin-bottom": "12px", - padding: "10px", - "border-radius": "10px", - background: "rgba(255,255,255,0.03)", - border: "1px solid rgba(255,255,255,0.10)" - } -}, wl = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "10px", - "margin-bottom": "8px", - "min-width": "0" -} }, Tl = { style: { - "min-width": "0", - flex: "1 1 auto" -} }, El = ["title"], Dl = ["title"], Ol = { style: { - display: "flex", - gap: "8px", - "align-items": "center" -} }, kl = ["placeholder"], Al = { - key: 4, - class: "mjr-workflow-tree-wrap" -}, jl = { class: "mjr-workflow-tree-node" }, Ml = { class: "mjr-workflow-tree-node-name" }, Nl = { - key: 0, - class: "mjr-workflow-tree-node-type" -}, Pl = { class: "mjr-menu-item-hint" }, Fl = { - key: 0, - class: "mjr-section-hint" -}, Il = { style: { - display: "flex", - "align-items": "center", - "justify-content": "space-between", - gap: "10px", - "margin-top": "8px" -} }, Ll = { style: { - display: "flex", - "flex-wrap": "wrap", - gap: "6px", - "align-items": "center" -} }, Rl = { - key: 5, - style: { - display: "grid", - "grid-template-columns": "repeat(auto-fit, minmax(180px, 1fr))", - gap: "8px", - "align-items": "stretch", - "margin-top": "10px", - "margin-bottom": "10px" - } -}, zl = { style: { - display: "flex", - "flex-direction": "column", - gap: "2px", - "min-width": "0" -} }, Bl = { style: { - "font-size": "13px", - "font-weight": "600" -} }, Vl = { style: { - "font-size": "11px", - color: "rgba(255,255,255,0.58)" -} }, Hl = { style: { - display: "flex", - gap: "10px", - "align-items": "stretch", - "margin-top": "10px" -} }, Ul = { style: { - display: "flex", - "justify-content": "space-between", - "align-items": "center", - gap: "10px", - "margin-top": "8px", - "font-size": "11px", - color: "rgba(255,255,255,0.58)" -} }, Wl = ["open"], Gl = { style: { - background: "rgba(0,0,0,0.5)", - padding: "10px", - "border-radius": "6px", - "font-size": "11px", - overflow: "auto", - "max-height": "180px", - margin: "10px 0 0 0", - color: "#90CAF9", - "font-family": "'Consolas', 'Monaco', monospace" -} }, Kl = 1, ql = 8, Jl = 250, Yl = /* @__PURE__ */ nt({ - __name: "SidebarWorkflowSection", - props: { asset: {} }, - setup(e) { - let t = e, n = Object.freeze({ - nodeColors: !0, - showLinks: !0, - showGroups: !0, - renderBypassState: !0, - renderErrorState: !0, - showViewport: !0, - showNodeLabels: !1, - size: "comfortable" - }), r = Object.freeze({ - zoom: 1, - centerX: null, - centerY: null, - hoveredNodeId: null - }), i = Object.freeze([ - { - key: "compact", - label: "Compact", - height: 120 - }, - { - key: "comfortable", - label: "Comfort", - height: 160 - }, - { - key: "expanded", - label: "Expanded", - height: 220 - } - ]), a = H(null), o = H(""), s = H(!1), c = H(!1), l = H(null), d = H(!1), f = H(null), m = H([]), g = H(null), _ = H(!1), v = H(!1), y = H(le()), S = H({ ...r }), C = H("crosshair"), ee = H(""), te = null, w = null, T = null; - function ne(e, t, n) { - let r = Number(e); - return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; - } - function re(e) { - e && typeof e == "object" && (S.value = { - ...S.value, - zoom: ne(e.zoom ?? S.value.zoom, Kl, ql), - centerX: Number.isFinite(Number(e.centerX)) ? Number(e.centerX) : null, - centerY: Number.isFinite(Number(e.centerY)) ? Number(e.centerY) : null - }); - } - function E() { - S.value = { ...r }, ee.value = ""; - } - function ae(e) { - let t = e?.metadata_raw ?? null; - if (!t) return null; - if (typeof t == "object") return t; - if (typeof t == "string") { - let e = t.trim(); - if (!e) return null; - try { - let t = JSON.parse(e); - return t && typeof t == "object" ? t : null; - } catch { - return null; - } - } - return null; - } - function oe(e) { - try { - let t = Object.entries(e || {}); - if (!t.length) return !1; - let n = 0; - for (let [, e] of t.slice(0, 50)) if (e && typeof e == "object" && (e.inputs && typeof e.inputs == "object" && (n += 1), n >= 2)) return !0; - } catch { - return !1; - } - return !1; - } - function se(e) { - let t = ae(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; - if (!n) return null; - if (typeof n == "object") return n; - if (typeof n == "string") { - let e = n.trim(); - if (!e) return null; - try { - return JSON.parse(e); - } catch { - return null; - } - } - return null; - } - function ce(e) { - let t = ae(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; - if (!n) return null; - if (typeof n == "object") return oe(n) ? n : null; - if (typeof n == "string") { - let e = n.trim(); - if (!e) return null; - try { - let t = JSON.parse(e); - return oe(t) ? t : null; - } catch { - return null; - } - } - return null; - } - function le() { - try { - let e = Kt?.()?.workflowMinimap; - if (e && typeof e == "object") return { - ...n, - ...e - }; - } catch (e) { - console.debug?.(e); - } - try { - let e = localStorage?.getItem?.(ie); - if (!e) return { ...n }; - let t = JSON.parse(e); - if (!t || typeof t != "object") return { ...n }; - let r = { - ...n, - ...t - }; - try { - let e = Kt(); - e.workflowMinimap = { - ...e.workflowMinimap, - ...r - }, K(e), localStorage?.removeItem?.(ie); - } catch (e) { - console.debug?.(e); - } - return r; - } catch { - return { ...n }; - } - } - function ue(e) { - try { - let t = Kt(); - t.workflowMinimap = { - ...t.workflowMinimap, - ...e - }, K(t); - } catch (e) { - console.debug?.(e); - } - } - let O = F(() => { - let e = se(t.asset) || se(l.value), n = ce(t.asset) || ce(l.value); - return !e && !n ? null : e || pa(n); - }), de = F(() => String(t.asset?.filepath || t.asset?.path || t.asset?.file_info?.filepath || "").trim()), fe = F(() => { - if (de.value.toLowerCase().endsWith(".json")) return !0; - let e = String(t.asset?.kind || "").trim().toLowerCase(), n = String(t.asset?.source || "").trim().toLowerCase(); - return e === "workflow" || n === "workflow"; - }), pe = F(() => String(t.asset?.display_name || t.asset?.name || t.asset?.filename || t.asset?.title || "Workflow").trim()), me = F(() => String(t.asset?.task || t.asset?.workflow_task || "").trim()), ge = F(() => String(t.asset?.model_family || t.asset?.workflow_model_family || "").trim()), _e = F(() => String(t.asset?.provider || t.asset?.workflow_provider || "").trim()), ve = F(() => String(t.asset?.runs_on || t.asset?.runsOn || "").trim().toLowerCase()), ye = F(() => { - let e = ve.value, t = _e.value; - return e === "api" && t ? `API · ${t}` : e ? t && t.toLowerCase() !== e ? `${e} · ${t}` : e : t; - }), be = F(() => String(t.asset?.notes || "").trim()), xe = F(() => [ - t.asset?.detected_task ? `detected: ${t.asset.detected_task}` : "", - t.asset?.detected_model_family ? t.asset.detected_model_family : "", - t.asset?.detected_provider ? t.asset.detected_provider : "" - ].filter(Boolean).join(" · ")), Se = F(() => Re(t.asset?.missing_nodes || t.asset?.missingNodes)), we = F(() => Re(t.asset?.missing_models || t.asset?.missingModels)), Te = F(() => Re(t.asset?.tags || t.asset?.workflow_tags || t.asset?.tags_json)), Ee = F(() => Te.value.slice(0, 3)), De = F(() => Math.max(0, Te.value.length - Ee.value.length)), Oe = F(() => Re(f.value?.missing_nodes)), ke = F(() => Re(f.value?.missing_models)), Ae = F(() => Re(f.value?.warnings)), je = F(() => { - let e = f.value; - return e ? `${Number(e.node_count || 0)} nodes | ${Number(e.subgraph_count || 0)} subgraphs | ${Array.isArray(e.required_nodes) ? e.required_nodes.length : 0} node types` : ""; - }), Me = F(() => { - let e = m.value?.[0]; - return e ? String(e.filename || "").replace(/\.json$/i, "") : ""; - }), Ne = F(() => { - let e = g.value; - return e ? `${Number(e.changed?.length || 0)} changed | ${Number(e.added?.length || 0)} added | ${Number(e.removed?.length || 0)} removed` : ""; - }), Pe = F(() => { - let e = Number(t.asset?.usage_count || t.asset?.usageCount || 0); - return !Number.isFinite(e) || e <= 0 ? "" : `${Math.floor(e)} use${e === 1 ? "" : "s"}`; - }), Fe = F(() => j(t.asset?.last_loaded_at || t.asset?.lastLoadedAt)), Ie = F(() => j(t.asset?.mtime || t.asset?.modified_at || t.asset?.updated_at)), A = F(() => { - let e = []; - t.asset?.favorite && e.push({ - key: "favorite", - label: "Favorite", - icon: "pi pi-star-fill", - tone: "favorite" - }), Pe.value && e.push({ - key: "usage", - label: Pe.value, - icon: "pi pi-play-circle", - tone: "usage" - }), Fe.value && e.push({ - key: "last-loaded", - label: `Loaded ${Fe.value}`, - icon: "pi pi-clock", - tone: "loaded" - }); - for (let t of Ee.value) e.push({ - key: `tag-${t}`, - label: t, - icon: "pi pi-tag", - tone: "tag" - }); - return De.value && e.push({ - key: "tags-more", - label: `+${De.value} tags`, - icon: "pi pi-tags", - tone: "tag" - }), e; - }); - function Le(e) { - let t = "display:inline-flex;align-items:center;gap:5px;max-width:100%;padding:4px 8px;border-radius:999px;font-size:10px;font-weight:750;line-height:1.1;overflow:hidden"; - return e === "favorite" ? `${t};background:rgba(255,193,7,0.15);border:1px solid rgba(255,193,7,0.34);color:#ffe082` : e === "usage" ? `${t};background:rgba(33,150,243,0.14);border:1px solid rgba(33,150,243,0.30);color:#90caf9` : e === "loaded" ? `${t};background:rgba(76,175,80,0.13);border:1px solid rgba(76,175,80,0.28);color:#a5d6a7` : `${t};background:rgba(255,255,255,0.07);border:1px solid rgba(255,255,255,0.14);color:rgba(255,255,255,0.82)`; - } - function Re(e) { - if (Array.isArray(e)) return e.map((e) => String(e || "").trim()).filter(Boolean); - if (typeof e == "string") { - let t = e.trim(); - if (!t) return []; - try { - let e = JSON.parse(t); - if (Array.isArray(e)) return Re(e); - } catch { - return t.split(/[,\n]/).map((e) => e.trim()).filter(Boolean); - } - } - return []; - } - function j(e) { - let t = Number(e); - if (!Number.isFinite(t) || t <= 0) return ""; - let n = t > 1e10 ? t : t * 1e3; - try { - return new Date(n).toLocaleString(); - } catch { - return ""; - } - } - async function ze() { - if (O.value) return; - let e = de.value; - if (e && !c.value) { - c.value = !0; - try { - let t = await b(e, { timeoutMs: 25e3 }); - if (!t?.ok) return; - let n = t?.data?.workflow || t?.workflow || null, r = t?.data?.prompt || t?.prompt || null; - if (!n && !r) return; - l.value = { - workflow: n, - prompt: r - }; - } catch (e) { - console.debug?.(e); - } finally { - c.value = !1; - } - } - } - let Be = F(() => t.asset?.has_generation_data ? "Complete" : "Partial"), Ve = F(() => O.value ? JSON.stringify(O.value, null, 2) : ""), Ue = F(() => String(t.asset?.category || t.asset?.subfolder || t.asset?.folder || "").trim().replace(/^\/+|\/+$/g, "")), We = F(() => Ue.value ? Ue.value.split(/[\\/]+/).filter(Boolean) : []), Ge = F(() => We.value.at(-1) || Ue.value || "Root"), Ke = F(() => We.value.slice(-1)); - function qe(e, t) { - let n = e?.id ?? e?.key ?? t + 1; - return String(e?.title || e?._meta?.title || e?.type || e?.class_type || e?.name || `Node ${n}`); - } - function Je(e) { - return String(e?.type || e?.class_type || e?.name || "").trim(); - } - function Ye() { - o.value = Ue.value; - } - async function nt() { - if (!fe.value) return; - let e = String(t.asset?.filepath || t.asset?.path || t.asset?.file_info?.filepath || "").trim(); - if (!e) { - D(k("toast.workflowMissingPath", "Workflow file path is missing."), "error"); - return; - } - let n = String(o.value || "").trim(); - if (n !== Ue.value) { - s.value = !0; - try { - let t = await h({ - filepath: e, - category: n - }, { timeoutMs: 3e4 }); - if (!t?.ok) { - D(t?.error || k("toast.workflowMoveFailed", "Failed to move workflow."), "error"); - return; - } - o.value = String(t?.data?.workflow?.category || n || "").trim(), D(k("toast.workflowCategoryUpdated", "Workflow category updated"), "success", 1800); - } catch { - D(k("toast.workflowMoveFailed", "Failed to move workflow."), "error"); - } finally { - s.value = !1; - } - } - } - async function it() { - let e = de.value; - if (!e) { - D(k("toast.workflowMissingPath", "Workflow file path is missing."), "error"); - return; - } - let n = await Ce({ - filepath: e, - limit: 12 - }, { timeoutMs: 15e3 }); - if (!n?.ok) { - D(n?.error || k("toast.workflowLoadFailed", "Failed to load workflow."), "error"); - return; - } - let r = Array.isArray(n.data) ? n.data : []; - if (!r.length) { - D(k("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); - return; - } - let i = await ha({ - title: k("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), - workflow: t.asset, - items: r - }); - if (!i?.filepath) return; - let a = await p({ - filepath: e, - source_filepath: i.filepath - }, { timeoutMs: 3e4 }); - a?.ok ? (D(k("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-thumbnail-sidebar" } }))) : D(a?.error || k("toast.workflowSaveFailed", "Failed to save workflow."), "error"); - } - async function ot() { - if (await ze(), !O.value) D(k("toast.workflowLoadFailed", "Failed to load workflow."), "error"); - else try { - await Xe.openAssets({ - assets: [{ - ...t.asset, - workflow: O.value, - Workflow: O.value - }], - index: 0, - mode: "graph" - }); - } catch (e) { - console.debug?.(e), D(k("toast.workflowLoadFailed", "Failed to load workflow."), "error"); - } - } - async function st() { - let e = de.value; - if (!e) D(k("toast.workflowMissingPath", "Workflow file path is missing."), "error"); - else { - d.value = !0, f.value = null, m.value = [], g.value = null; - try { - let [t, n] = await Promise.all([u(e, { timeoutMs: 2e4 }), x(e, { timeoutMs: 15e3 })]); - if (!t?.ok) { - D(t?.error || k("toast.workflowLoadFailed", "Failed to load workflow."), "error"); - return; - } - f.value = t.data || {}, m.value = Array.isArray(n?.data?.versions) ? n.data.versions : []; - let r = m.value[0]; - if (r?.filepath) { - let t = await he(e, r.filepath, { timeoutMs: 15e3 }); - t?.ok && (g.value = t.data || null); - } - } catch (e) { - console.debug?.(e), D(k("toast.workflowLoadFailed", "Failed to load workflow."), "error"); - } finally { - d.value = !1; - } - } - } - let ct = F(() => (Array.isArray(O.value?.nodes) ? O.value.nodes : []).slice(0, Jl).map((e, t) => { - let n = e?.id ?? e?.key ?? t + 1, r = Je(e); - return { - key: String(n), - label: qe(e, t), - icon: "pi pi-circle-fill", - data: { - id: n, - type: r - } - }; - })), lt = F(() => Math.max(0, Number(ut.value.nodes || 0) - ct.value.length)), ut = F(() => { - let e = O.value; - return e ? { - nodes: Array.isArray(e?.nodes) ? e.nodes.length : 0, - links: Array.isArray(e?.links) && e.links.length || Array.isArray(e?.extra?.links) && e.extra.links.length || 0, - groups: Array.isArray(e?.groups) && e.groups.length || Array.isArray(e?.extra?.groups) && e.extra.groups.length || Array.isArray(e?.extra?.groupNodes) && e.extra.groupNodes.length || Array.isArray(e?.extra?.group_nodes) && e.extra.group_nodes.length || 0, - source: e?.extra?.synthetic ? "Synthetic" : "Embedded" - } : { - nodes: 0, - links: 0, - groups: 0, - source: "" - }; - }), dt = F(() => { - let e = String(y.value?.size || "comfortable"); - return i.find((t) => t.key === e) || i[1]; - }), ft = F(() => `${dt.value.height}px`), pt = F(() => [ - { - key: "showNodeLabels", - label: "Node Labels", - iconClass: "pi pi-tag" - }, - { - key: "nodeColors", - label: "Node Colors", - iconClass: "pi pi-palette" - }, - { - key: "showLinks", - label: "Show Links", - iconClass: "pi pi-share-alt" - }, - { - key: "showGroups", - label: "Show Frames/Groups", - iconClass: "pi pi-th-large" - }, - { - key: "renderBypassState", - label: "Render Bypass State", - iconClass: "pi pi-ban" - }, - { - key: "renderErrorState", - label: "Render Error State", - iconClass: "pi pi-exclamation-triangle" - }, - { - key: "showViewport", - label: "Show Viewport", - iconClass: "pi pi-window-maximize" - } - ]); - function mt() { - let e = a.value, t = O.value; - if (!e || !t) return; - let n = Math.max(1, e.clientWidth || 320), r = Math.max(1, e.clientHeight || 120), i = Math.max(1, Math.min(2, window.devicePixelRatio || 1)); - e.width = Math.floor(n * i), e.height = Math.floor(r * i); - let o = e.getContext("2d"); - o && o.setTransform(i, 0, 0, i, 0, 0), w = ra(e, t, { - ...y.value, - view: S.value - }) || null, re(w?.resolvedView); - } - function gt(e) { - He(e); - } - function _t(e) { - let t = a.value; - if (!t) return null; - let n = t.getBoundingClientRect?.(); - return n ? { - x: Number(e?.clientX) - n.left, - y: Number(e?.clientY) - n.top - } : null; - } - function vt(e) { - let t = _t(e); - return !t || !w?.canvasToWorld ? null : { - local: t, - world: w.canvasToWorld(t.x, t.y) - }; - } - function yt(e) { - let t = _t(e), n = t && w?.hitTestNode ? w.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = S.value.hoveredNodeId !== null && S.value.hoveredNodeId !== void 0 ? String(S.value.hoveredNodeId) : null; - ee.value = n?.label || "", r !== i && (S.value = { - ...S.value, - hoveredNodeId: r - }, mt()); - } - function bt(e) { - e && (gt(e), S.value = { - ...S.value, - centerX: Number(e.x), - centerY: Number(e.y) - }, mt()); - } - function xt(e) { - if (Number(e?.button ?? 0) !== 0) return; - let t = vt(e); - t && (T = e.pointerId ?? 1, C.value = "grabbing", a.value?.setPointerCapture?.(T), bt(t.world), yt(e), e.preventDefault?.(), e.stopPropagation?.()); - } - function St(e) { - if (T !== null && e.pointerId === T) { - let t = vt(e); - t && bt(t.world), e.preventDefault?.(), e.stopPropagation?.(); - } else yt(e); - } - function Ct(e) { - T !== null && e?.pointerId === T && (a.value?.releasePointerCapture?.(T), T = null, C.value = "crosshair"), e?.type === "pointerleave" && (ee.value = "", S.value.hoveredNodeId !== null && (S.value = { - ...S.value, - hoveredNodeId: null - }, mt())); - } - function wt(e) { - let t = vt(e), n = w?.resolvedView; - if (!t || !n) return; - let r = ne(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = ne((Number(S.value.zoom) || 1) * i, Kl, ql); - if (Math.abs(a - (Number(S.value.zoom) || 1)) < .001) { - e.preventDefault?.(), e.stopPropagation?.(); - return; - } - let o = Math.max(1, Number(w?.bounds?.width || 1) / a), s = Math.max(1, Number(w?.bounds?.height || 1) / a), c = ne((Number(t.world.x) - Number(n.viewMinX || 0)) / Math.max(1, Number(n.visibleW || 1)), 0, 1), l = ne((Number(t.world.y) - Number(n.viewMinY || 0)) / Math.max(1, Number(n.visibleH || 1)), 0, 1); - S.value = { - ...S.value, - zoom: a, - centerX: Number(t.world.x) + (.5 - c) * o, - centerY: Number(t.world.y) + (.5 - l) * s - }, mt(), yt(e), e.preventDefault?.(), e.stopPropagation?.(); - } - function Tt(e) { - let t = vt(e); - E(), t && gt(t.world), mt(), e.preventDefault?.(), e.stopPropagation?.(); - } - function kt(e) { - y.value = { - ...y.value, - [e]: !y.value?.[e] - }, ue(y.value); - } - function At(e) { - i.some((t) => t.key === e) && (y.value = { - ...y.value, - size: e - }, ue(y.value)); - } - return Ot(() => { - a.value && typeof ResizeObserver == "function" && (te = new ResizeObserver(() => mt()), te.observe(a.value)), Ye(), ze(), mt(); - }), tt(O, () => { - E(), mt(); - }, { flush: "post" }), tt(de, () => { - l.value = null, ze(); - }, { immediate: !0 }), tt(Ue, () => { - Ye(); - }), tt(y, () => { - mt(); - }, { - deep: !0, - flush: "post" - }), tt(_, () => { - mt(); - }, { flush: "post" }), rt(() => { - try { - te?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - te = null, T = null; - }), (e, t) => { - let n = $e("MButton"), r = $e("MTree"); - return O.value ? (L(), B("div", Fc, [ - t[18] ||= N("div", { style: { - "font-size": "13px", - "font-weight": "600", - color: "var(--fg-color, #eaeaea)", - "margin-bottom": "12px", - "text-transform": "uppercase", - "letter-spacing": "0.5px" - } }, " ComfyUI Workflow ", -1), - N("div", Ic, [ - N("div", Lc, z(pe.value), 1), - de.value ? (L(), B("div", { - key: 0, - style: { - "font-size": "11px", - color: "rgba(255,255,255,0.48)", - "margin-top": "4px", - overflow: "hidden", - "text-overflow": "ellipsis", - "white-space": "nowrap" - }, - title: de.value - }, z(de.value), 9, Rc)) : P("", !0), - A.value.length ? (L(), B("div", zc, [(L(!0), B(M, null, I(A.value, (e) => (L(), B("span", { - key: e.key, - style: R(Le(e.tone)), - title: e.label - }, [N("i", { - class: Et(e.icon), - style: { - "font-size": "10px", - flex: "0 0 auto" - } - }, null, 2), N("span", Vc, z(e.label), 1)], 12, Bc))), 128))])) : P("", !0) - ]), - N("div", Hc, [N("div", Uc, z(Be.value), 1), ut.value.source ? (L(), B("div", Wc, z(ut.value.source), 1)) : P("", !0)]), - N("div", Gc, [ - me.value ? (L(), B("div", Kc, [t[3] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Task", -1), N("div", qc, z(me.value), 1)])) : P("", !0), - ge.value ? (L(), B("div", Jc, [t[4] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Model", -1), N("div", Yc, z(ge.value), 1)])) : P("", !0), - ye.value ? (L(), B("div", Xc, [t[5] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Runs on", -1), N("div", Zc, z(ye.value), 1)])) : P("", !0), - Pe.value || Ie.value ? (L(), B("div", Qc, [ - t[6] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Library", -1), - N("div", $c, z(Pe.value || Ie.value), 1), - Pe.value && Ie.value ? (L(), B("div", el, z(Ie.value), 1)) : P("", !0) - ])) : P("", !0) - ]), - Se.value.length || we.value.length ? (L(), B("div", tl, [ - t[7] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "800", - color: "#ef9a9a", - "text-transform": "uppercase", - "letter-spacing": "0.4px", - "margin-bottom": "6px" - } }, "Missing dependencies", -1), - Se.value.length ? (L(), B("div", { - key: 0, - style: R({ - display: "flex", - flexWrap: "wrap", - gap: "5px", - marginBottom: we.value.length ? "7px" : "0" - }) - }, [(L(!0), B(M, null, I(Se.value, (e) => (L(), B("span", { - key: `node-${e}`, - style: { - padding: "3px 7px", - "border-radius": "999px", - background: "rgba(244,67,54,0.16)", - "font-size": "10px", - "font-weight": "700", - color: "#ffcdd2" - } - }, z(e), 1))), 128))], 4)) : P("", !0), - we.value.length ? (L(), B("div", nl, [(L(!0), B(M, null, I(we.value, (e) => (L(), B("span", { - key: `model-${e}`, - style: { - padding: "3px 7px", - "border-radius": "999px", - background: "rgba(255,152,0,0.16)", - "font-size": "10px", - "font-weight": "700", - color: "#ffe0b2" - } - }, z(e), 1))), 128))])) : P("", !0) - ])) : P("", !0), - be.value || xe.value ? (L(), B("div", rl, [be.value ? (L(), B("div", il, z(be.value), 1)) : P("", !0), xe.value ? (L(), B("div", { - key: 1, - style: R({ - fontSize: "11px", - color: "rgba(255,255,255,0.48)", - marginTop: be.value ? "7px" : "0" - }) - }, z(xe.value), 5)) : P("", !0)])) : P("", !0), - N("div", al, [ - ht(n, { - type: "button", - severity: "secondary", - text: "", - rounded: "", - style: { - height: "34px", - "border-radius": "9px", - border: "1px solid rgba(255,255,255,0.12)", - background: "rgba(33,150,243,0.14)", - color: "rgba(255,255,255,0.92)", - "font-size": "12px", - "font-weight": "750", - display: "inline-flex", - "align-items": "center", - "justify-content": "center", - gap: "7px" - }, - onClick: it - }, { - default: et(() => [t[8] ||= N("i", { class: "pi pi-image" }, null, -1), N("span", null, z(V(k)("ctx.setWorkflowThumbnail", "Set workflow thumbnail")), 1)]), - _: 1 - }), - ht(n, { - type: "button", - severity: "secondary", - text: "", - rounded: "", - style: { - height: "34px", - "border-radius": "9px", - border: "1px solid rgba(255,255,255,0.12)", - background: "rgba(255,255,255,0.06)", - color: "rgba(255,255,255,0.92)", - "font-size": "12px", - "font-weight": "750", - display: "inline-flex", - "align-items": "center", - "justify-content": "center", - gap: "7px" - }, - onClick: ot - }, { - default: et(() => [t[9] ||= N("i", { class: "pi pi-search" }, null, -1), N("span", null, z(V(k)("ctx.inspect", "Inspect")), 1)]), - _: 1 - }), - ht(n, { - type: "button", - severity: "secondary", - text: "", - rounded: "", - disabled: d.value, - style: { - height: "34px", - "border-radius": "9px", - border: "1px solid rgba(255,255,255,0.12)", - background: "rgba(76,175,80,0.12)", - color: "rgba(255,255,255,0.92)", - "font-size": "12px", - "font-weight": "750", - display: "inline-flex", - "align-items": "center", - "justify-content": "center", - gap: "7px" - }, - onClick: st - }, { - default: et(() => [N("i", { class: Et(d.value ? "pi pi-spin pi-spinner" : "pi pi-check-circle") }, null, 2), N("span", null, z(d.value ? "Checking" : "Validate"), 1)]), - _: 1 - }, 8, ["disabled"]) - ]), - f.value ? (L(), B("div", ol, [ - N("div", sl, [t[10] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "800", - color: "#a5d6a7", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Workflow diagnostics", -1), N("div", cl, z(je.value), 1)]), - Oe.value.length || ke.value.length ? (L(), B("div", ll, [Oe.value.length ? (L(), B("div", ul, [(L(!0), B(M, null, I(Oe.value, (e) => (L(), B("span", { - key: `diag-node-${e}`, - style: { - padding: "3px 7px", - "border-radius": "999px", - background: "rgba(244,67,54,0.16)", - "font-size": "10px", - "font-weight": "700", - color: "#ffcdd2" - } - }, " Missing node: " + z(e), 1))), 128))])) : P("", !0), ke.value.length ? (L(), B("div", dl, [(L(!0), B(M, null, I(ke.value, (e) => (L(), B("span", { - key: `diag-model-${e}`, - style: { - padding: "3px 7px", - "border-radius": "999px", - background: "rgba(255,152,0,0.16)", - "font-size": "10px", - "font-weight": "700", - color: "#ffe0b2" - } - }, " Missing model: " + z(e), 1))), 128))])) : P("", !0)])) : (L(), B("div", fl, " No missing dependencies detected by the current ComfyUI runtime. ")), - Ae.value.length ? (L(), B("div", pl, z(Ae.value.join(" | ")), 1)) : P("", !0), - Me.value || Ne.value ? (L(), B("div", ml, [Ze(" Latest version: " + z(Me.value || "none"), 1), Ne.value ? (L(), B("span", hl, " | Diff: " + z(Ne.value), 1)) : P("", !0)])) : P("", !0) - ])) : P("", !0), - N("div", gl, [ - N("div", _l, [t[11] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Nodes", -1), N("div", vl, z(ut.value.nodes), 1)]), - N("div", yl, [t[12] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Links", -1), N("div", bl, z(ut.value.links), 1)]), - N("div", xl, [t[13] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Groups", -1), N("div", Sl, z(ut.value.groups), 1)]) - ]), - fe.value ? (L(), B("div", Cl, [N("div", wl, [N("div", Tl, [t[14] ||= N("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Category", -1), N("div", { - title: Ue.value || "Root", - style: { - "font-size": "12px", - color: "rgba(255,255,255,0.8)", - "margin-top": "2px", - overflow: "hidden", - "text-overflow": "ellipsis", - "white-space": "nowrap", - "max-width": "100%" - } - }, z(Ge.value), 9, El)]), Ke.value.length ? (L(), B("div", { - key: 0, - title: Ue.value, - style: { - display: "flex", - "flex-wrap": "wrap", - gap: "4px", - "justify-content": "flex-end", - "min-width": "0", - "max-width": "45%" - } - }, [(L(!0), B(M, null, I(Ke.value, (e) => (L(), B("span", { - key: e, - style: { - padding: "3px 7px", - "border-radius": "999px", - background: "rgba(33,150,243,0.12)", - border: "1px solid rgba(33,150,243,0.22)", - "font-size": "10px", - "font-weight": "700", - color: "#90CAF9", - "text-transform": "uppercase", - "letter-spacing": "0.3px", - "max-width": "100%", - overflow: "hidden", - "text-overflow": "ellipsis", - "white-space": "nowrap" - } - }, z(e), 1))), 128))], 8, Dl)) : P("", !0)]), N("div", Ol, [at(N("input", { - "onUpdate:modelValue": t[0] ||= (e) => o.value = e, - type: "text", - placeholder: V(k)("dialog.workflowCategory", "Workflow category"), - style: { - flex: "1", - "min-width": "0", - padding: "9px 10px", - "border-radius": "8px", - border: "1px solid rgba(255,255,255,0.12)", - background: "rgba(0,0,0,0.22)", - color: "rgba(255,255,255,0.92)", - "font-size": "12px" - } - }, null, 8, kl), [[Dt, o.value]]), ht(n, { - type: "button", - severity: "secondary", - text: "", - rounded: "", - disabled: s.value, - style: R({ - padding: "8px 12px", - borderRadius: "8px", - border: "1px solid rgba(255,255,255,0.12)", - background: s.value ? "rgba(255,255,255,0.06)" : "rgba(33,150,243,0.16)", - color: "rgba(255,255,255,0.92)", - cursor: s.value ? "wait" : "pointer", - fontSize: "12px", - fontWeight: "700", - whiteSpace: "nowrap" - }), - onClick: nt - }, { - default: et(() => [Ze(z(s.value ? "Saving..." : "Move"), 1)]), - _: 1 - }, 8, ["disabled", "style"])])])) : P("", !0), - ct.value.length ? (L(), B("div", Al, [ - t[15] ||= N("div", { class: "mjr-section-title" }, " Workflow Nodes ", -1), - ht(r, { - value: ct.value, - class: "mjr-workflow-tree", - "scroll-height": "180px", - pt: { - wrapper: { class: "mjr-workflow-tree-scroll" }, - rootChildren: { class: "mjr-workflow-tree-list" }, - nodeContent: { class: "mjr-workflow-tree-node-content" }, - nodeToggleButton: { class: "mjr-workflow-tree-toggle" }, - nodeIcon: { class: "mjr-workflow-tree-icon" }, - nodeLabel: { class: "mjr-workflow-tree-label" } - } - }, { - default: et(({ node: e }) => [N("span", jl, [ - N("span", Ml, z(e.label), 1), - e.data?.type ? (L(), B("span", Nl, z(e.data.type), 1)) : P("", !0), - N("span", Pl, "#" + z(e.data?.id), 1) - ])]), - _: 1 - }, 8, ["value"]), - lt.value ? (L(), B("div", Fl, " +" + z(lt.value) + " more nodes ", 1)) : P("", !0) - ])) : P("", !0), - N("div", Il, [N("div", Ll, [(L(!0), B(M, null, I(V(i), (e) => (L(), Qe(n, { - key: e.key, - type: "button", - severity: "secondary", - text: "", - rounded: "", - title: `${e.label} minimap`, - style: R({ - appearance: "none", - border: y.value.size === e.key ? "1px solid rgba(33,150,243,0.55)" : "1px solid rgba(255,255,255,0.12)", - borderRadius: "999px", - padding: "4px 10px", - background: y.value.size === e.key ? "rgba(33,150,243,0.18)" : "rgba(255,255,255,0.04)", - color: y.value.size === e.key ? "#90CAF9" : "rgba(255,255,255,0.78)", - fontSize: "11px", - fontWeight: y.value.size === e.key ? "700" : "600", - cursor: "pointer" - }), - onClick: (t) => At(e.key) - }, { - default: et(() => [Ze(z(e.label), 1)]), - _: 2 - }, 1032, [ - "title", - "style", - "onClick" - ]))), 128))]), ht(n, { - type: "button", - class: "mjr-btn mjr-icon-btn", - severity: "secondary", - text: "", - rounded: "", - title: V(k)("tooltip.minimapSettings", "Minimap settings"), - style: { - width: "28px", - height: "28px", - "border-radius": "8px", - display: "inline-flex", - "align-items": "center", - "justify-content": "center", - border: "1px solid var(--mjr-border, rgba(255,255,255,0.12))", - background: "rgba(255,255,255,0.06)", - color: "rgba(255,255,255,0.9)", - cursor: "pointer" - }, - onClick: t[1] ||= (e) => _.value = !_.value - }, { - default: et(() => [...t[16] ||= [N("i", { class: "pi pi-sliders-h" }, null, -1)]]), - _: 1 - }, 8, ["title"])]), - _.value ? (L(), B("div", Rl, [(L(!0), B(M, null, I(pt.value, (e) => (L(), Qe(n, { - key: e.key, - type: "button", - severity: "secondary", - text: "", - style: R({ - display: "flex", - alignItems: "center", - gap: "10px", - padding: "9px 10px", - borderRadius: "10px", - border: y.value?.[e.key] ? "1px solid rgba(76,175,80,0.40)" : "1px solid rgba(255,255,255,0.12)", - background: y.value?.[e.key] ? "rgba(76,175,80,0.10)" : "rgba(255,255,255,0.04)", - cursor: "pointer", - color: "rgba(255,255,255,0.92)", - textAlign: "left" - }), - onClick: (t) => kt(e.key) - }, { - default: et(() => [ - N("span", { style: R({ - width: "22px", - height: "22px", - borderRadius: "6px", - display: "inline-flex", - alignItems: "center", - justifyContent: "center", - background: y.value?.[e.key] ? "rgba(76,175,80,0.95)" : "rgba(255,255,255,0.08)", - border: y.value?.[e.key] ? "1px solid rgba(76,175,80,0.35)" : "1px solid rgba(255,255,255,0.12)", - flex: "0 0 auto" - }) }, [N("i", { - class: "pi pi-check", - style: R({ - fontSize: "12px", - opacity: y.value?.[e.key] ? "1" : "0" - }) - }, null, 4)], 4), - N("i", { - class: Et(e.iconClass), - style: { - "font-size": "18px", - opacity: "0.9", - width: "18px" - } - }, null, 2), - N("div", zl, [N("div", Bl, z(e.label), 1), N("div", Vl, z(y.value?.[e.key] ? "On" : "Off"), 1)]) - ]), - _: 2 - }, 1032, ["style", "onClick"]))), 128))])) : P("", !0), - N("div", Hl, [N("canvas", { - ref_key: "canvasRef", - ref: a, - style: R({ - width: "100%", - height: ft.value, - cursor: C.value, - touchAction: "none", - borderRadius: "10px", - marginTop: "0", - background: "linear-gradient(180deg, rgba(7, 12, 18, 0.95) 0%, rgba(10, 16, 24, 0.92) 100%)", - border: "1px solid var(--mjr-border, rgba(255,255,255,0.12))", - boxShadow: "inset 0 0 0 1px rgba(255,255,255,0.03)" - }), - onPointerdown: xt, - onPointermove: St, - onPointerup: Ct, - onPointercancel: Ct, - onPointerleave: Ct, - onWheel: wt, - onDblclick: Tt - }, null, 36)]), - N("div", Ul, [N("span", null, z(ee.value || "Click/drag to navigate | wheel to zoom"), 1), N("span", null, z(Math.round((S.value.zoom || 1) * 100)) + "% | " + z(dt.value.label), 1)]), - N("details", { - open: v.value, - style: { "margin-top": "10px" }, - onToggle: t[2] ||= (e) => v.value = e.target.open - }, [t[17] ||= N("summary", { style: { - cursor: "pointer", - color: "var(--mjr-muted, rgba(255,255,255,0.65))", - "font-size": "12px", - "user-select": "none" - } }, " Show raw JSON ", -1), N("pre", Gl, z(Ve.value), 1)], 40, Wl) - ])) : P("", !0); - }; - } -}); -export { Kt as $, ui as A, wr as B, zi as C, Fi as D, Ii as E, Zr as F, Dr as G, Ar as H, Yr as I, Tr as J, kr as K, Ir as L, Ci as M, li as N, Ti as O, Si as P, q as Q, Pr as R, qi as S, Pi as T, X as U, Nr as V, Er as W, vr as X, yr as Y, cn as Z, Z as _, Ma as a, Ki as b, Aa as c, Ta as d, K as et, wa as f, ma as g, ha as h, za as i, di as j, Ei as k, ka as l, ga as m, Pc as n, Na as o, Ea as p, jr as q, Eo as r, Oa as s, Yl as t, ya as u, ra as v, Ri as w, Wi as x, pa as y, Fr as z }; diff --git a/dist/chunks/TagsEditor-2AmCKykg.js b/dist/chunks/TagsEditor-2AmCKykg.js deleted file mode 100644 index 1e2aa257..00000000 --- a/dist/chunks/TagsEditor-2AmCKykg.js +++ /dev/null @@ -1,291 +0,0 @@ -import { F as e, en as t, v as n } from "./viewerRuntimeHosts-n0pKLECw.js"; -import { St as r, m as i, n as a } from "./events-C65wdOHm.js"; -import { Y as o } from "./Viewer-W-G40j3K.js"; -import { A as s, C as c, E as l, G as u, J as d, K as f, L as ee, N as p, R as te, T as m, U as ne, V as h, Y as g, b as _, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; -// ui/vue/components/common/TagsEditor.vue?vue&type=script&setup=true&lang.ts -var T = ["aria-busy"], E = ["aria-label"], re = { - key: 0, - class: "mjr-tags-empty" -}, ie = { class: "mjr-tags-input-wrap" }, ae = ["aria-selected", "onMouseenter"], oe = 100, D = 200, O = /* @__PURE__ */ p({ - __name: "TagsEditor", - props: { - asset: {}, - modelValue: {}, - disabled: { type: Boolean } - }, - emits: ["update:modelValue", "tags-change"], - setup(p, { emit: O }) { - function se(e) { - try { - let t = String(e ?? "").trim(); - if (!t || t.length > oe) return null; - for (let e = 0; e < t.length; e += 1) { - let n = t.charCodeAt(e); - if (n <= 31 || n === 127) return null; - } - return /[;,]/.test(t) ? null : t; - } catch { - return null; - } - } - function k(e) { - try { - return String(e ?? "").replace(/[\x00-\x1f\x7f]/g, "").trim() || null; - } catch { - return null; - } - } - function A(e) { - let t = k(e); - return t ? t.toLowerCase() : ""; - } - function j(e) { - let t = [], n = /* @__PURE__ */ new Set(); - for (let r of Array.isArray(e) ? e : []) { - let e = k(r); - if (!e) continue; - let i = e.toLowerCase(); - if (!n.has(i) && (n.add(i), t.push(e), t.length >= D)) break; - } - return t; - } - function M(e) { - if (Array.isArray(e)) return j(e); - if (typeof e == "string") { - let t = e.trim(); - if (!t) return []; - try { - let e = JSON.parse(t); - if (Array.isArray(e)) return j(e); - } catch { - return j(t.split(",")); - } - } - return []; - } - function ce(e, t) { - if (!Array.isArray(e) || !Array.isArray(t) || e.length !== t.length) return !1; - for (let n = 0; n < e.length; n += 1) if (e[n] !== t[n]) return !1; - return !0; - } - let N = p, P = O, F = M(N.asset?.tags ?? N.modelValue ?? []), I = S([...F]), L = S(null), R = S(""), z = S(!1), B = S(-1), V = S(null), H = S([]), U = S(!1), W = (e) => e?.$el || e || null, G = !1, K = !1, q = null, J = [...F], le = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), ue = (e) => new Promise((t) => setTimeout(t, e)), de = () => setTimeout(() => z.value = !1, 200), Y = m(() => { - let e = R.value.toLowerCase().trim(); - if (!e) return []; - let t = new Set(I.value.map((e) => A(e)).filter(Boolean)); - return H.value.filter((n) => { - let r = A(n); - return n.toLowerCase().includes(e) && (!r || !t.has(r)); - }).slice(0, 10); - }), X = m(() => Y.value.length > 0); - function Z(e) { - if (G) return; - let t = M(e); - J = [...t], ce(t, I.value) || (I.value = [...t]); - } - function fe(e) { - let t = [...e], n = N.asset?.id == null ? "" : String(N.asset.id); - P("update:modelValue", t), P("tags-change", { - assetId: N.asset?.id, - tags: t - }), o(a, { - assetId: n, - tags: t - }); - } - async function Q() { - if (N.disabled) return; - if (G) { - K = !0; - try { - q?.abort?.(); - } catch (e) { - console.debug?.(e); - } - return; - } - G = !0, U.value = !0; - let n = 0; - for (; n < 10;) { - n > 0 && await ue(le(n)), n += 1; - let a = M(I.value), o = typeof AbortController < "u" ? new AbortController() : null; - q = o; - let s = null; - try { - s = await e(N.asset, a, o ? { signal: o.signal } : {}); - } catch (e) { - console.error("Failed to update tags:", e); - } - if (!s?.ok) { - if (s?.code === "ABORTED") { - if (K) { - K = !1; - continue; - } - break; - } - let e = [...J]; - I.value = e, P("update:modelValue", e), t(s?.error || i("toast.tagsUpdateFailed", "Failed to update tags"), "error"), G = !1, q = null, U.value = !1; - return; - } - try { - let e = s?.data?.asset_id ?? null; - e != null && !r(N.asset.id) && (N.asset.id = e); - } catch (e) { - console.debug?.(e); - } - let c = M(Array.isArray(s?.data?.tags) ? s.data.tags : a); - J = [...c]; - try { - N.asset.tags = [...c]; - } catch (e) { - console.debug?.(e); - } - if (K || (I.value = [...c]), fe(c), t(i("toast.tagsUpdated", "Tags updated"), "success", 1e3), !K) break; - K = !1; - } - if (n >= 10) { - let e = [...J]; - I.value = e; - try { - N.asset.tags = [...e]; - } catch (e) { - console.debug?.(e); - } - P("update:modelValue", e), t(i("toast.tagsUpdateFailed", "Failed to update tags"), "error"); - } - G = !1, q = null, U.value = !1; - } - w(async () => { - try { - await ee(), W(L.value)?.focus(); - } catch (e) { - console.debug?.(e); - } - try { - let e = await n(); - e?.ok && Array.isArray(e?.data) && (H.value = j(e.data)); - } catch (e) { - console.warn("Failed to load available tags:", e); - } - }), te(() => { - try { - q?.abort?.(); - } catch (e) { - console.debug?.(e); - } - }); - function $(e) { - if (N.disabled) return; - let n = se(e); - if (!n) return; - let r = A(n); - r && (I.value.some((e) => A(e) === r) || (I.value.length >= D ? t(i("toast.maxTagsReached", "Maximum number of tags reached"), "warning") : (I.value = [...I.value, n], Q()))); - } - function pe(e) { - if (N.disabled || e < 0 || e >= I.value.length) return; - let t = [...I.value]; - t.splice(e, 1), I.value = t, Q(); - } - function me(e) { - if (e.key === "Enter" || e.key === ",") { - e.preventDefault(); - let t = (z.value && X.value && B.value >= 0 ? Y.value[B.value] : null) || R.value.trim(); - t && ($(t), R.value = "", z.value = !1, B.value = -1, V.value = null); - } else if (e.key === "Escape") z.value = !1, B.value = -1, V.value = null; - else if (e.key === "ArrowDown") e.preventDefault(), X.value && (B.value = Math.min(B.value + 1, Y.value.length - 1)); - else if (e.key === "ArrowUp") e.preventDefault(), B.value = Math.max(B.value - 1, 0); - else if (e.key === "Tab" && X.value) { - e.preventDefault(); - let t = Y.value[B.value] || Y.value[0]; - t && (R.value = t); - } - } - function he(e) { - $(e), R.value = "", z.value = !1, B.value = -1, V.value = null, W(L.value)?.focus(); - } - function ge(e) { - let t = e?.value ?? V.value; - t && he(t); - } - return f(() => N.modelValue, (e) => { - Z(e); - }), f(() => N.asset?.tags, (e) => { - Z(e); - }), (e, t) => { - let n = u("MButton"), r = u("MInputText"), a = u("MListbox"); - return h(), b("div", { - class: C(["mjr-tags-editor", { "is-disabled": p.disabled }]), - "aria-busy": U.value - }, [l("div", { - class: "mjr-tags-display", - role: "list", - "aria-label": x(i)("tags.label", "Tags") - }, [I.value.length === 0 ? (h(), b("span", re, v(x(i)("msg.noTagsYet", "No tags yet...")), 1)) : (h(!0), b(c, { key: 1 }, ne(I.value, (e, r) => (h(), b("div", { - key: e, - class: "mjr-tag-chip", - role: "listitem" - }, [s(v(e) + " ", 1), y(n, { - type: "button", - class: "mjr-tag-chip-remove", - severity: "secondary", - text: "", - rounded: "", - "aria-label": x(i)("tags.remove", "Remove tag"), - disabled: p.disabled, - onClick: (e) => pe(r) - }, { - default: d(() => [...t[4] ||= [s(" x ", -1)]]), - _: 1 - }, 8, [ - "aria-label", - "disabled", - "onClick" - ])]))), 128))], 8, E), l("div", ie, [y(r, { - ref_key: "inputRef", - ref: L, - modelValue: R.value, - "onUpdate:modelValue": t[0] ||= (e) => R.value = e, - type: "text", - class: "mjr-tag-input", - placeholder: x(i)("sidebar.addTag", "Add tag..."), - disabled: p.disabled, - "aria-label": x(i)("tags.addLabel", "Add tag"), - "aria-autocomplete": X.value ? "list" : "none", - "aria-expanded": z.value, - "aria-haspopup": X.value ? "listbox" : void 0, - onFocus: t[1] ||= (e) => z.value = R.value.length > 0, - onInput: t[2] ||= (e) => z.value = R.value.length > 0, - onKeydown: me, - onBlur: de - }, null, 8, [ - "modelValue", - "placeholder", - "disabled", - "aria-label", - "aria-autocomplete", - "aria-expanded", - "aria-haspopup" - ]), g(y(a, { - modelValue: V.value, - "onUpdate:modelValue": t[3] ||= (e) => V.value = e, - options: Y.value, - class: "mjr-tags-dropdown", - "scroll-height": "150px", - "aria-label": x(i)("tags.suggestions", "Tag suggestions"), - onChange: ge - }, { - option: d(({ option: e, index: t }) => [l("div", { - class: C(["mjr-tag-suggestion", { "is-active": t === B.value }]), - "aria-selected": t === B.value, - onMouseenter: (e) => B.value = t - }, v(e), 43, ae)]), - _: 1 - }, 8, [ - "modelValue", - "options", - "aria-label" - ]), [[_, z.value && X.value]])])], 10, T); - }; - } -}); -export { O as t }; diff --git a/dist/chunks/TagsEditor-MUk741GH.js b/dist/chunks/TagsEditor-MUk741GH.js new file mode 100644 index 00000000..f76cbf88 --- /dev/null +++ b/dist/chunks/TagsEditor-MUk741GH.js @@ -0,0 +1,4970 @@ +import { D as e, E as t, It as n, Jn as r, Lt as i, T as a, Wt as o, b as s, dn as c, dr as l, fr as u, g as d, h as f, i as p, in as m, l as h, ln as g, p as _, st as v, ur as y, w as b, xn as x, y as ee } from "./config-C9a-wT5M.js"; +import { t as S } from "./floatingViewerManager-B_I-SRbd.js"; +import { A as te, N as ne, a as C, d as w, i as T, k as E, m as D, n as O, o as re, p as k, r as A, t as j, v as ie, y as M } from "./generationSectionState-DuXxSw-j.js"; +import { n as N, t as P } from "./events-1iwo5blr.js"; +import { $ as ae, B as oe, C as F, D as se, E as I, H as ce, J as le, K as L, M as R, O as z, P as B, Q as V, S as ue, T as H, V as de, W as U, X as W, b as fe, gt as G, ht as K, j as pe, k as q, mt as me, ot as he, pt as J, st as Y, y as ge } from "./mjr-primevue-C07IsEdU.js"; +import { n as _e, r as ve } from "./mjr-vue-vendor-CEDOnn2t.js"; +import { t as ye } from "./viewerOpenRequest-WOJE90Gn.js"; +// ui/features/status/AssetStatusDotTheme.ts +function X(e) { + return String(e || "").trim().toLowerCase(); +} +function be({ dot: e = null, asset: t = null, scope: n = "" } = {}) { + let r = X(n); + if (r) return r === "custom"; + let i = X(t?.type || t?.scope); + if (i) return i === "custom"; + try { + let t = X(e?.closest?.(".mjr-grid")?.dataset?.mjrScope); + if (t) return t === "custom"; + } catch (e) { + console.debug?.(e); + } + return !1; +} +function xe(e, t = {}) { + let n = X(e); + return be(t) ? n === "pending" || n === "info" ? "var(--mjr-browser-status-info, #4DB6AC)" : n === "success" ? "var(--mjr-browser-status-success, #2E7D32)" : n === "warning" ? "var(--mjr-browser-status-warning, #FFB74D)" : n === "error" ? "var(--mjr-browser-status-error, #EF5350)" : "var(--mjr-browser-status-neutral, #90A4AE)" : n === "pending" || n === "info" ? "var(--mjr-status-info, #64B5F6)" : n === "success" ? "var(--mjr-status-success, #4CAF50)" : n === "warning" ? "var(--mjr-status-warning, #FFA726)" : n === "error" ? "var(--mjr-status-error, #f44336)" : "var(--mjr-status-neutral, #666)"; +} +// ui/stores/useRuntimeStore.ts +var Se = _e("mjr-runtime", () => { + let e = Y(null), t = Y(null), n = Y(!1), r = Y(0), i = Y(null), a = Y(null), o = Y(null), s = Y(null), c = Y(null), l = Y([]), u = H(() => !!i.value), d = H(() => { + let e = s.value, t = c.value; + return !t || t <= 0 || e == null ? 0 : Math.round(e / t * 100); + }); + function f(t) { + e.value = t; + } + function p(e) { + t.value = e; + } + function m(e, t) { + n.value = !!e, r.value = Math.max(0, Number(t || 0) || 0); + } + function h() { + return { + active: n.value, + queueLength: r.value + }; + } + function g(e = {}) { + e.active_prompt_id !== void 0 && (i.value = e.active_prompt_id), e.queue_remaining !== void 0 && (a.value = e.queue_remaining), e.progress_node !== void 0 && (o.value = e.progress_node), e.progress_value !== void 0 && (s.value = e.progress_value), e.progress_max !== void 0 && (c.value = e.progress_max), e.cached_nodes !== void 0 && (l.value = e.cached_nodes ?? []); + } + function _() { + i.value = null, a.value = null, o.value = null, s.value = null, c.value = null, l.value = []; + } + return { + comfyApp: e, + comfyApi: t, + enrichmentActive: n, + enrichmentQueueLength: r, + activePromptId: i, + queueRemaining: a, + progressNode: o, + progressValue: s, + progressMax: c, + cachedNodes: l, + isExecuting: u, + progressPercent: d, + setComfyApp: f, + setComfyApi: p, + setEnrichmentState: m, + getEnrichmentState: h, + applyExecutionStatus: g, + resetExecution: _ + }; +}); +// ui/stores/getOptionalRuntimeStore.ts +function Ce() { + try { + return ve() ? Se() : null; + } catch { + return null; + } +} +// ui/stores/runtimeEnrichmentState.ts +var we = Symbol.for("majoor.assets_manager.runtime_state"); +function Te() { + return { + api: null, + assetsDeletedHandler: null, + enrichmentActive: !1, + enrichmentQueueLength: 0 + }; +} +function Ee() { + try { + let e = typeof globalThis < "u" ? globalThis : {}; + return e[we] && typeof e[we] == "object" || (e[we] = Te()), e[we]; + } catch { + return Te(); + } +} +function De(e, t) { + let n = Ce(); + if (n) { + n.setEnrichmentState(e, t); + return; + } + let r = Ee(); + r.enrichmentActive = !!e, r.enrichmentQueueLength = Math.max(0, Number(t || 0) || 0); +} +function Oe() { + let e = Ce(); + if (e) return e.getEnrichmentState(); + let t = Ee(); + return { + active: !!t.enrichmentActive, + queueLength: Math.max(0, Number(t.enrichmentQueueLength || 0) || 0) + }; +} +// ui/components/Badges.ts +function ke({ ext: e = "", filename: t = "", count: n = 0, paths: r = [] } = {}) { + let i = String(e || "").trim(), a = String(t || "").trim(), o = Math.max(0, Number(n) || 0), s = Array.isArray(r) ? r.map((e) => String(e || "").trim()).filter(Boolean) : []; + if (o < 2) return `${i} file`; + let c = [`${i}+ name collision in current view (${o})`]; + if (a && c.push(`Name: ${a}`), s.length) { + c.push("Paths:"); + for (let e of s.slice(0, 4)) c.push(`- ${e}`); + s.length > 4 && c.push(`- ... +${s.length - 4} more`); + } + return c.push("Click to select collisions in current view"), c.join("\n"); +} +function Ae(e, t, n = null) { + if (e) try { + let r = e.dataset?.mjrExt || "", i = e.dataset?.mjrBadgeBg || "var(--mjr-badge-image, #607D8B)"; + e.textContent = String(r || "") + (t ? "+" : ""), e.title = t ? ke({ + ext: r, + filename: n?.filename || "", + count: n?.count, + paths: n?.paths + }) : `${r} file`, e.style.background = t ? "var(--mjr-badge-duplicate-alert, #ff1744)" : i, e.style.cursor = t ? "pointer" : "default"; + } catch (e) { + console.debug?.(e); + } +} +function je(e) { + return e === !0 ? !0 : e === !1 ? !1 : e === 1 || e === "1" ? !0 : e === 0 || e === "0" ? !1 : null; +} +function Me(e, t = []) { + if (!e || typeof e != "object") return null; + for (let n of t) if (e[n] != null) return e[n]; + return null; +} +function Ne(e) { + return typeof e == "string" && e.trim().length > 0; +} +function Pe(e) { + if (Array.isArray(e)) return e.some((e) => String(e ?? "").trim().length > 0); + if (e && typeof e == "object") return Object.keys(e).length > 0; + if (typeof e != "string") return !1; + let t = e.trim(); + if (!t || t === "[]" || t === "[ ]" || /^(null|none)$/i.test(t)) return !1; + if (t.startsWith("[") && t.endsWith("]") || t.startsWith("{") && t.endsWith("}")) try { + let e = JSON.parse(t); + return Array.isArray(e) ? e.some((e) => String(e ?? "").trim().length > 0) : e && typeof e == "object" ? Object.keys(e).length > 0 : !!e; + } catch (e) { + console.debug?.(e); + } + return !0; +} +function Fe(e) { + let t = Me(e, [ + "auto_tags", + "autoTags", + "ai_auto_tags", + "aiAutoTags", + "suggested_tags", + "suggestedTags" + ]), n = Me(e, [ + "enhanced_caption", + "enhancedCaption", + "enhanced_prompt", + "enhancedPrompt", + "ai_enhanced_prompt", + "aiEnhancedPrompt" + ]), r = je(Me(e, [ + "has_ai_auto_tags", + "hasAiAutoTags", + "ai_has_auto_tags", + "aiHasAutoTags" + ])), i = je(Me(e, [ + "has_ai_enhanced_caption", + "hasAiEnhancedCaption", + "ai_has_enhanced_caption", + "aiHasEnhancedCaption" + ])), a = je(Me(e, [ + "has_ai_vector", + "hasAiVector", + "has_vector_embedding", + "hasVectorEmbedding", + "vector_indexed", + "vectorIndexed" + ])), o = je(Me(e, [ + "has_ai_info", + "hasAiInfo", + "ai_indexed", + "aiIndexed" + ])), s = r === !0 || r === null && Pe(t), c = i === !0 || i === null && Ne(n), l = a === !0 || o === !0; + return { + hasAiInfo: o === !0 || s || c || l, + hasAutoTags: s, + hasEnhancedPrompt: c, + hasVectorIndexed: l + }; +} +function Ie(e) { + let t = document.createElement("span"); + t.className = "mjr-workflow-dot mjr-asset-status-dot"; + let n = je(e?.has_workflow ?? e?.hasWorkflow), r = je(e?.has_generation_data ?? e?.hasGenerationData), i = Oe(), a = i.queueLength, o = i.active || a > 0, s = "Pending: parsing metadata...", c = n === !0 || r === !0, l = n === !1 || r === !1, u = n === null || r === null; + n === !0 && r === !0 ? s = "Complete: workflow + generation data detected" : c ? s = n === !0 ? "Partial: workflow only (generation data missing)" : "Partial: generation data only (workflow missing)" : l && !c && !u ? s = "None: no workflow or generation data found" : u && (s = "Pending: metadata not parsed yet"); + let d = u ? "pending" : n === !0 && r === !0 ? "success" : c ? "warning" : "error"; + o && d !== "success" && (d = "pending", s = a > 0 ? `Pending: database metadata enrichment in progress (${a} queued)` : "Pending: database metadata enrichment in progress"), Le(t, d, s, { asset: e }); + let f = Fe(e); + if (f.hasAiInfo) { + let e = []; + f.hasVectorIndexed && e.push("vector indexed"), f.hasAutoTags && e.push("AI tag suggestions"), f.hasEnhancedPrompt && e.push("enhanced prompt"), t.textContent = ""; + let n = document.createElement("i"); + n.className = "pi pi-sparkles", n.setAttribute("aria-hidden", "true"), n.style.fontSize = "11px", n.style.lineHeight = "1", t.appendChild(n); + try { + t.dataset.mjrAi = "1"; + } catch (e) { + console.debug?.(e); + } + t.title = `${s}\nAI: ${e.length ? e.join(", ") : "indexed"}\nClick to rescan this file`; + } else { + try { + t.dataset.mjrAi = "0"; + } catch (e) { + console.debug?.(e); + } + t.textContent = "●", t.title = `${s}\nClick to rescan this file`; + } + return t; +} +function Le(e, t, n = "", r = {}) { + if (!e) return; + let i = String(t || "").toLowerCase(), a = xe(i, { + dot: e, + ...r || {} + }); + try { + e.dataset.mjrStatus = i || "neutral"; + } catch (e) { + console.debug?.(e); + } + if (e.style.cssText = ` + color: ${a}; + margin-left: 4px; + font-size: 12px; + line-height: 1; + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: color 0.25s ease, opacity 0.25s ease; + `, n) try { + e.title = String(n); + } catch (e) { + console.debug?.(e); + } +} +function Re(e) { + let t = Math.max(0, Math.min(5, Number(e) || 0)); + if (t <= 0) return null; + let n = document.createElement("div"); + n.className = "mjr-rating-badge", n.title = `Rating: ${t} star${t > 1 ? "s" : ""}`, n.style.cssText = "\n position: absolute;\n top: 6px;\n right: 6px;\n background: rgba(0, 0, 0, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.12);\n padding: 2px 6px;\n border-radius: 6px;\n font-size: 13px;\n letter-spacing: 1px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n z-index: 10;\n text-shadow: 0 2px 6px rgba(0,0,0,0.6);\n box-shadow: 0 6px 18px rgba(0,0,0,0.25);\n "; + for (let e = 1; e <= t; e++) { + let r = document.createElement("span"); + r.textContent = "★", r.style.color = "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", r.style.marginRight = e < t ? "2px" : "0", n.appendChild(r); + } + return n; +} +function ze(e) { + if (Array.isArray(e)) return e.map((e) => String(e ?? "").trim()).filter(Boolean); + if (typeof e == "string") { + let t = e.trim(); + if (!t) return []; + try { + let e = JSON.parse(t); + if (Array.isArray(e)) return e.map((e) => String(e ?? "").trim()).filter(Boolean); + } catch {} + return t.split(",").map((e) => e.trim()).filter(Boolean); + } + return []; +} +function Be(e) { + let t = Number(e) / 1e3; + return t >= 60 ? "#FF9800" : t >= 30 ? "#FFC107" : t >= 10 ? "#8BC34A" : "#4CAF50"; +} +function Ve(e) { + let t = e / 1e3; + if (t >= 60) { + let e = (t / 60).toFixed(1); + return { + text: `${e}m`, + title: `Generation time: ${e} minutes (${t.toFixed(1)}s)` + }; + } + let n = t.toFixed(1); + return { + text: `${n}s`, + title: `Generation time: ${n} seconds` + }; +} +function He(e, { maxMs: t = 864e5 } = {}) { + let n; + if (e == null) return 0; + if (typeof e == "string") { + let t = e.trim().toLowerCase(); + if (!t) return 0; + let r = t.match(/^(-?\d+(?:[.,]\d+)?)\s*(s|sec|secs|second|seconds)$/i); + if (r) n = Number(r[1].replace(",", ".")) * 1e3; + else { + let e = t.match(/^(-?\d+(?:[.,]\d+)?)\s*(ms|msec|millisecond|milliseconds)$/i); + n = Number(e ? e[1].replace(",", ".") : t.replace(",", ".")); + } + } else n = Number(e); + return !Number.isFinite(n) || n <= 0 || n >= Number(t) ? 0 : n; +} +function Ue(e) { + let t = document.createElement("div"); + t.className = "mjr-tags-badge"; + let n = ze(e); + return n.length === 0 ? (t.style.display = "none", t) : (t.textContent = n.join(", "), t.title = `Tags: ${n.join(", ")}`, t.style.cssText = "\n position: absolute;\n bottom: 6px;\n left: 6px;\n padding: 3px 6px;\n border-radius: 4px;\n background: rgba(0,0,0,0.8);\n color: var(--mjr-tag-color, #90CAF9);\n font-size: 9px;\n max-width: 80%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n z-index: 10;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n ", t); +} +// ui/features/contextmenu/gridContextMenuState.ts +function We() { + return { + open: !1, + x: 0, + y: 0, + items: [], + title: "" + }; +} +var Z = he({ + portalOwnerId: "", + mountedPortalIds: [], + main: We(), + submenu: We(), + tags: { + open: !1, + x: 0, + y: 0, + asset: null, + onChanged: null + } +}), Ge = 1; +function Ke(e) { + e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = ""); +} +function qe(e = "") { + try { + window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } })); + } catch (e) { + console.debug?.(e); + } +} +function Je() { + let e = `mjr-grid-context-menu-portal-${Ge++}`; + return Z.mountedPortalIds.push(e), Z.portalOwnerId ||= e, e; +} +function Ye(e) { + let t = Z.mountedPortalIds.filter((t) => t !== e); + Z.mountedPortalIds.splice(0, Z.mountedPortalIds.length, ...t), Z.portalOwnerId === e && (Z.portalOwnerId = Z.mountedPortalIds[0] || ""); +} +function Xe(e) { + return String(Z.portalOwnerId || "") === String(e || ""); +} +function Ze({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { + qe("grid"), nt(), et(), Z.main.open = !0, Z.main.x = Number(e) || 0, Z.main.y = Number(t) || 0, Z.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Z.main.title = String(r || ""); +} +function Qe() { + Ke(Z.main), et(); +} +function $e({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { + Z.submenu.open = !0, Z.submenu.x = Number(e) || 0, Z.submenu.y = Number(t) || 0, Z.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], Z.submenu.title = String(r || ""); +} +function et() { + Ke(Z.submenu); +} +function tt({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { + Qe(), Z.tags.open = !!n, Z.tags.x = Number(e) || 0, Z.tags.y = Number(t) || 0, Z.tags.asset = n || null, Z.tags.onChanged = typeof r == "function" ? r : null; +} +function nt() { + Z.tags.open = !1, Z.tags.x = 0, Z.tags.y = 0, Z.tags.asset = null, Z.tags.onChanged = null; +} +function rt() { + Qe(), nt(); +} +// ui/features/dnd/utils/constants.ts +var it = "application/x-mjr-asset", at = "application/x-mjr-assets", ot = "application/x-comfy-asset-info", st = /* @__PURE__ */ new Set([ + ".png", + ".jpg", + ".jpeg", + ".webp", + ".gif", + ".bmp", + ".tif", + ".tiff", + ".avif", + ".jxl" +]), ct = /* @__PURE__ */ new Set([ + ".mp4", + ".mov", + ".mkv", + ".webm", + ".avi", + ".m4v" +]), lt = /* @__PURE__ */ new Set([ + ".wav", + ".mp3", + ".flac", + ".ogg", + ".m4a", + ".aac", + ".opus" +]), ut = /* @__PURE__ */ new Set([ + ".obj", + ".fbx", + ".glb", + ".gltf", + ".stl", + ".ply", + ".splat", + ".ksplat", + ".spz" +]), dt = (e) => { + if (!e) return !1; + let t = e.lastIndexOf("."); + return t !== -1 && st.has(e.slice(t).toLowerCase()); +}, ft = (e) => e ? String(e.kind || "").toLowerCase() === "image" || dt(e.filename) : !1, Q = (e) => { + if (!e) return !1; + let t = e.lastIndexOf("."); + return t !== -1 && ct.has(e.slice(t).toLowerCase()); +}, pt = (e) => e ? String(e.kind || "").toLowerCase() === "video" || Q(e.filename) : !1, mt = (e) => { + if (!e) return !1; + let t = e.lastIndexOf("."); + return t !== -1 && lt.has(e.slice(t).toLowerCase()); +}, ht = (e) => e ? String(e.kind || "").toLowerCase() === "audio" || mt(e.filename) : !1, gt = (e) => { + if (!e) return !1; + let t = e.lastIndexOf("."); + return t !== -1 && ut.has(e.slice(t).toLowerCase()); +}, _t = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" || gt(e.filename) : !1, vt = (e) => ft(e) || pt(e) || ht(e) || _t(e) || String(e?.kind || "").toLowerCase() === "workflow", yt = { + mp4: "video/mp4", + mov: "video/quicktime", + webm: "video/webm", + mkv: "video/x-matroska", + glb: "model/gltf-binary", + gltf: "model/gltf+json", + obj: "model/obj", + stl: "model/stl", + ply: "application/ply" +}, bt = (e) => yt[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", xt = (e, t) => { + if (typeof e != "string") return !1; + let n = e.trim().toLowerCase(); + if (!n) return !1; + let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); + return r ? t && r === String(t).toLowerCase() ? !0 : ct.has(`.${r}`) : !1; +}, St = (e, t, n) => { + if (!e || e.type !== "combo" || !e.options) return !1; + let r = Array.isArray(e.options.values) && e.options.values || e.options.values && Array.isArray(e.options.values.values) && e.options.values.values || null; + return Array.isArray(r) ? r.some((e) => n(typeof e == "string" ? e : e?.content ?? e?.value ?? e?.text, t)) : !1; +}, Ct = (e, t) => St(e, t, xt), wt = (e, t) => { + if (typeof e != "string") return !1; + let n = e.trim().toLowerCase(); + if (!n) return !1; + let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); + return r ? t && r === String(t).toLowerCase() ? !0 : st.has(`.${r}`) : !1; +}, Tt = (e, t) => St(e, t, wt), Et = (e, t) => { + if (typeof e != "string") return !1; + let n = e.trim().toLowerCase(); + if (!n) return !1; + let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); + return r ? t && r === String(t).toLowerCase() ? !0 : lt.has(`.${r}`) : !1; +}, Dt = (e, t) => St(e, t, Et), Ot = (e, t) => { + if (typeof e != "string") return !1; + let n = e.trim().toLowerCase(); + if (!n) return !1; + let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); + return r ? t && r === String(t).toLowerCase() ? !0 : ut.has(`.${r}`) : !1; +}, kt = (e, t) => St(e, t, Ot), At = /* @__PURE__ */ new WeakMap(), jt = (e) => { + if (!e || typeof e != "object") return { + node: null, + prev: null + }; + let t = At.get(e); + return t || (t = { + node: null, + prev: null + }, At.set(e, t)), t; +}, Mt = (e, t, n) => { + let r = e?.canvas?.canvas || document.querySelector("canvas"), i = e?.canvas?.graph, a = e?.canvas?.ds; + if (!r || !i || !a) return null; + let o = r.getBoundingClientRect(); + if (t < o.left || t > o.right || n < o.top || n > o.bottom) return null; + let s = Number(a.scale) || 1, c = a.offset || [0, 0], l = Array.isArray(c) ? Number(c[0]) || 0 : Number(c?.x) || 0, u = Array.isArray(c) ? Number(c[1]) || 0 : Number(c?.y) || 0, d = (t - o.left) / s - l, f = (n - o.top) / s - u; + if (typeof i.getNodeOnPos == "function") return i.getNodeOnPos(d, f); + let p = i._nodes || []; + for (let e = p.length - 1; e >= 0; e--) { + let t = p[e]; + if (!t?.pos || !t?.size) continue; + let n = t.size[0], r = t.size[1]; + if (t.flags && t.flags.collapsed && (r = 30), d >= t.pos[0] && f >= t.pos[1] && d <= t.pos[0] + n && f <= t.pos[1] + r) return t; + } + return null; +}, Nt = (e, t, n) => { + let r = jt(e); + t && r.node !== t && (Pt(e, n), r.node = t, r.prev = { + color: t.color, + bgcolor: t.bgcolor + }, t.bgcolor = "#3355ff", t.color = "#a9c4ff", n(e)); +}, Pt = (e, t) => { + let n = jt(e); + if (n.node) { + try { + n.prev && (n.node.color = n.prev.color, n.node.bgcolor = n.prev.bgcolor); + } catch (e) { + console.debug?.(e); + } + n.node = null, n.prev = null, t(e); + } +}, Ft = (e, t) => { + if (!e || e.type !== "combo" || !e.options) return; + let n = e.options.values, r = e.options; + if (typeof n != "function") { + if (!Array.isArray(n)) { + if (n && typeof n == "object" && Array.isArray(n.values)) r = n, n = n.values; + else return; + } + n.some((e) => typeof e == "string" ? e === t : (e?.content ?? e?.value ?? e?.text) === t) || (n.length === 0 || typeof n[0] == "string" ? n.unshift(t) : n.unshift({ + content: t, + text: t, + value: t + }), r.values = n); + } +}, It = /* @__PURE__ */ new Set([ + "number", + "int", + "float", + "boolean", + "toggle", + "checkbox", + "button", + "hidden" +]), Lt = [ + "output", + "save", + "export", + "folder", + "dir" +], Rt = ["file", "path"], zt = [ + "path", + "file", + "input", + "src", + "source" +], Bt = (e, t, n) => { + let r = e?.widgets; + if (!Array.isArray(r) || !r.length) return null; + let i = String(t || "").toLowerCase().replace(/^\./, ""), a = String(e?.type || "").toLowerCase(), o = n.knownNodeIncludes.some((e) => a.includes(e)), s = []; + for (let e of r) { + if (!e) continue; + let t = String(e?.type || "").toLowerCase(), r = e?.value; + if (It.has(t) || typeof r == "number" || typeof r == "boolean") continue; + let a = t === "text" || t === "string" || t === "combo", c = typeof e?.callback == "function" && typeof r == "string"; + if (!a && !c) continue; + let l = String(e?.name || e?.label || "").toLowerCase().trim(), u = 0; + n.exactNames.has(l) && (u += 100), l === "file" && o && t === "combo" && n.comboChecker(e, i) && (u += 100); + let d = n.mediaTerms.some((e) => l.includes(e)), f = zt.some((e) => l.includes(e)); + d && f && (u += 80), Rt.some((e) => l.includes(e)) && (u += 35); + for (let { terms: e, score: t } of n.extraTerms) e.some((e) => l.includes(e)) && (u += t); + Lt.some((e) => l.includes(e)) && (u -= 90), n.exactSingleNames.has(l) && (typeof r == "string" && r.trim() === "" || n.looksLikeFn(r, i) ? u += 25 : u -= 10), o && (u += 15); + let p = typeof r == "string" && r.trim() === ""; + p && (u += 3), t === "combo" && n.comboChecker(e, i) && (u += 12), s.push({ + w: e, + score: u, + emptyValue: p, + combo: t === "combo" + }); + } + if (!s.length) return null; + s.sort((e, t) => t.score === e.score ? t.emptyValue === e.emptyValue ? t.combo === e.combo ? 0 : t.combo ? 1 : -1 : t.emptyValue ? 1 : -1 : t.score - e.score); + let c = s[0]; + if (!c || c.score < 20) return null; + try { + c.w[n.scoreKey] = c.score; + } catch (e) { + console.debug?.(e); + } + return c.w; +}, Vt = { + exactNames: /* @__PURE__ */ new Set([ + "video_path", + "input_video", + "source_video", + "video", + "driven_video", + "footage", + "input_path", + "directory", + "folder_path", + "folder", + "path", + "video_directory" + ]), + knownNodeIncludes: [ + "loadvideo", + "vhs_loadvideo", + "videoloader", + "sadtalker", + "wav2lip", + "reactor", + "multiimageloader", + "ltxdirector", + "ltxsequencer", + "ltxkeyframer" + ], + mediaTerms: [ + "video", + "footage", + "clip", + "movie" + ], + extraTerms: [{ + terms: [ + "media", + "clip", + "footage", + "drive" + ], + score: 45 + }], + exactSingleNames: /* @__PURE__ */ new Set(["video"]), + looksLikeFn: xt, + comboChecker: Ct, + scoreKey: "__mjrVideoPickScore" +}, Ht = { + exactNames: /* @__PURE__ */ new Set([ + "image", + "image_path", + "input_image", + "source_image", + "ref_image", + "pose_image", + "hint_image", + "target_image", + "ipadapter_image", + "input_path", + "directory", + "folder_path", + "folder", + "path", + "image_directory" + ]), + knownNodeIncludes: [ + "loadimage", + "loadimagemask", + "imageloader", + "reactor", + "roop", + "ipadapter", + "controlnet", + "instantid", + "pulid", + "multiimageloader", + "ltxdirector", + "ltxsequencer", + "ltxkeyframer" + ], + mediaTerms: [ + "image", + "img", + "mask", + "frame", + "photo", + "picture", + "face", + "ipadapter" + ], + extraTerms: [{ + terms: [ + "media", + "source", + "first", + "last", + "target", + "reference" + ], + score: 35 + }], + exactSingleNames: /* @__PURE__ */ new Set(["image", "face"]), + looksLikeFn: wt, + comboChecker: Tt, + scoreKey: "__mjrImagePickScore" +}, Ut = { + exactNames: /* @__PURE__ */ new Set([ + "audio_path", + "input_audio", + "source_audio", + "audio", + "driven_audio", + "voice", + "bgm", + "soundtrack", + "input_path", + "directory", + "folder_path", + "folder", + "path", + "audio_directory" + ]), + knownNodeIncludes: [ + "loadaudio", + "vhs_loadaudioupload", + "vhs_loadaudio", + "audioloader", + "inputaudio", + "sadtalker", + "wav2lip", + "multiimageloader", + "ltxdirector", + "ltxsequencer", + "ltxkeyframer" + ], + mediaTerms: [ + "audio", + "sound", + "music", + "voice", + "speech", + "wav", + "mp3" + ], + extraTerms: [{ + terms: [ + "media", + "track", + "drive" + ], + score: 45 + }], + exactSingleNames: /* @__PURE__ */ new Set(["audio", "voice"]), + looksLikeFn: Et, + comboChecker: Dt, + scoreKey: "__mjrAudioPickScore" +}, Wt = { + exactNames: /* @__PURE__ */ new Set([ + "model_path", + "input_model", + "source_model", + "mesh_path", + "input_mesh", + "geometry_path", + "scene_path", + "point_cloud_path", + "splat_path", + "model", + "mesh", + "geometry", + "input_path", + "directory", + "folder_path", + "folder", + "path", + "model_directory" + ]), + knownNodeIncludes: [ + "load3d", + "loadmodel", + "loadmesh", + "loadobj", + "loadgltf", + "loadglb", + "loadstl", + "loadply", + "pointcloud", + "meshloader", + "modelloader", + "tripo3d", + "unique3d", + "multiimageloader", + "ltxdirector", + "ltxsequencer", + "ltxkeyframer" + ], + mediaTerms: [ + "model", + "mesh", + "geometry", + "scene", + "object", + "point", + "cloud", + "splat" + ], + extraTerms: [{ + terms: ["asset", "resource"], + score: 30 + }], + exactSingleNames: /* @__PURE__ */ new Set([ + "model", + "mesh", + "geometry" + ]), + looksLikeFn: Ot, + comboChecker: kt, + scoreKey: "__mjrModel3DPickScore" +}, Gt = (e, t, n) => { + let r = String(t?.kind || "").toLowerCase(); + return Bt(e, n, r === "model3d" ? Wt : r === "audio" ? Ut : r === "image" ? Ht : Vt); +}, Kt = (e, t, n, r) => { + if (!t || !t.inputs || !t.inputs.length) return null; + let i = e?.canvas?.canvas || document.querySelector("canvas"), a = e?.canvas?.ds; + if (!i || !a) return null; + let o = i.getBoundingClientRect(), s = Number(a.scale) || 1, c = a.offset || [0, 0], l = Array.isArray(c) ? Number(c[0]) || 0 : Number(c?.x) || 0, u = Array.isArray(c) ? Number(c[1]) || 0 : Number(c?.y) || 0, d = (n - o.left) / s - l, f = (r - o.top) / s - u, p = t.pos[0], m = t.pos[1], h = t.constructor.title_height || 30; + for (let e = 0; e < t.inputs.length; e++) { + let n = t.inputs[e], r = m + h + e * 20 + 10, i = d - p, a = f - r; + if (Math.abs(i) <= 18 && Math.abs(a) <= 12) return { + index: e, + input: n + }; + } + return null; +}, qt = (e) => { + let t = e?.canvas?.canvas || document.querySelector("canvas"); + return t ? t.getBoundingClientRect() : null; +}, Jt = (e, t) => { + let n = qt(e); + if (!n) return !1; + let r = t.clientX, i = t.clientY; + return r >= n.left && r <= n.right && i >= n.top && i <= n.bottom; +}, Yt = (e) => { + try { + e?.graph?.setDirtyCanvas?.(!0, !0); + } catch (e) { + console.debug?.(e); + } + try { + e?.canvas?.setDirty?.(!0, !0); + } catch (e) { + console.debug?.(e); + } +}, Xt = (e) => { + let t = String(e?.filename || ""), n = t.lastIndexOf("."); + return n >= 0 ? t.slice(n).toLowerCase() : ""; +}, Zt = (e) => { + let t = String(e?.kind || "").toLowerCase(), n = Xt(e); + return t === "image" || st.has(n) ? ["LoadImage"] : t === "video" || ct.has(n) ? [ + "LoadVideo", + "VHS_LoadVideo", + "VideoLoader" + ] : t === "audio" || lt.has(n) ? [ + "LoadAudio", + "VHS_LoadAudioUpload", + "VHS_LoadAudio", + "AudioLoader" + ] : t === "model3d" || ut.has(n) ? [ + "Load3D", + "LoadModel", + "LoadMesh", + "LoadGLB", + "LoadOBJ", + "LoadSTL", + "LoadPLY" + ] : []; +}, Qt = (e, t) => { + if (e) { + e.type === "combo" && Ft(e, t), e.value = t; + try { + e.callback?.(e.value); + } catch (e) { + console.debug?.(e); + } + try { + typeof e.onchange == "function" && e.onchange(t); + } catch (e) { + console.debug?.(e); + } + } +}, $t = (e) => { + let t = e?.canvas?.canvas || document.querySelector("canvas"), n = t?.getBoundingClientRect?.(), r = n ? Number(n.width || n.right - n.left) : 0, i = n ? Number(n.height || n.bottom - n.top) : 0, a = Number(r || t?.width || 800), o = Number(i || t?.height || 600); + if (!n) return [Math.max(0, a / 2), Math.max(0, o / 2)]; + let s = n && Number(n.left) || 0, c = n && Number(n.top) || 0; + return en(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2)); +}, en = (e, t, n) => { + let r = (e?.canvas?.canvas || document.querySelector("canvas"))?.getBoundingClientRect?.(), i = e?.canvas?.ds || {}, a = Number(i.scale) || 1, o = i.offset || [0, 0], s = Array.isArray(o) ? Number(o[0]) || 0 : Number(o?.x) || 0, c = Array.isArray(o) ? Number(o[1]) || 0 : Number(o?.y) || 0; + return !r || !Number.isFinite(Number(t)) || !Number.isFinite(Number(n)) ? $t(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c]; +}, tn = (e, t = null) => { + if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return en(e, t.clientX, t.clientY); + try { + let n = e?.canvas?.convertEventToCanvasOffset?.(t); + if (Array.isArray(n)) return [Number(n[0]) || 0, Number(n[1]) || 0]; + } catch (e) { + console.debug?.(e); + } + return en(e, t?.clientX, t?.clientY); +}, nn = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => { + let o = e?.graph ?? e?.canvas?.graph ?? null; + if (!o || typeof o.add != "function") return !1; + let s = null; + for (let n of Zt(t)) try { + if (s = c(n, e), s) break; + } catch (e) { + console.debug?.(e); + } + if (!s) return !1; + s.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : tn(e, r), o.add(s); + let l = Gt(s, t, i); + return l && Qt(l, n), Yt(e), !0; +}, rn = ({ app: e, items: t = [], event: n = null, gap: r = 90 }) => { + let i = Array.isArray(t) ? t.filter(Boolean) : []; + if (!i.length) return 0; + let a = tn(e, n), o = 0; + for (let t of i) nn({ + app: e, + payload: t.payload, + relativePath: t.relativePath, + event: n, + droppedExt: t.droppedExt, + position: [a[0] + o * Number(r || 90), a[1]] + }) && (o += 1); + return o; +}, an = Qt, on = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => { + let o = e?.graph ?? e?.canvas?.graph ?? null; + if (!o || typeof o.add != "function" || !r) return !1; + let s = null; + for (let n of Zt(t)) try { + if (s = c(n, e), s) break; + } catch (e) { + console.debug?.(e); + } + if (!s) return !1; + let l = Number(r.pos[0]) || 0, u = Number(r.pos[1]) || 0, d = Array.isArray(s.size) && Number(s.size[0]) || 220; + s.pos = [l - d - 60, u + Number(i) * 20], o.add(s); + let f = Xt(t), p = Gt(s, t, f); + p && Qt(p, n); + try { + s.connect(0, r, i); + } catch (e) { + console.debug?.(e); + } + return Yt(e), !0; +}, sn = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { + let a = { + index: !!r, + files: [{ + filename: n.filename, + subfolder: n.subfolder || "", + dest_subfolder: "", + type: n.type || "output", + root_id: l(n) || void 0 + }] + }; + return i && (a.purpose = i), e(t, a); +}, cn = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { + let a = await sn({ + post: e, + endpoint: t, + payload: n, + index: r, + purpose: i + }); + if (!a?.ok) return console.warn("Majoor: stage-to-input failed", a?.error || a), null; + let o = Array.isArray(a.data?.staged) ? a.data.staged[0] : null; + return o ? { + relativePath: (o?.subfolder ? `${o.subfolder}/${o.name}` : o?.name) || null, + absPath: o?.path || null, + name: o?.name || null, + subfolder: o?.subfolder || "" + } : null; +}, ln = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await cn({ + post: e, + endpoint: t, + payload: n, + index: r, + purpose: i +}))?.relativePath || null, $ = he({ + open: !1, + mode: "workflow", + title: "", + sourceAsset: null, + workflow: null, + items: [], + resolve: null +}); +function un({ title: e = "Select workflow", sourceAsset: t = null } = {}) { + return fn(null), $.open = !0, $.mode = "workflow", $.title = String(e || "Select workflow"), $.sourceAsset = t || null, $.workflow = null, $.items = [], new Promise((e) => { + $.resolve = e; + }); +} +function dn({ title: e = "Select asset", workflow: t = null, items: n = [] } = {}) { + return fn(null), $.open = !0, $.mode = "asset", $.title = String(e || "Select asset"), $.sourceAsset = null, $.workflow = t || null, $.items = Array.isArray(n) ? n.filter(Boolean) : [], new Promise((e) => { + $.resolve = e; + }); +} +function fn(e = null) { + let t = $.resolve; + if ($.open = !1, $.mode = "workflow", $.title = "", $.sourceAsset = null, $.workflow = null, $.items = [], $.resolve = null, typeof t == "function") try { + t(e || null); + } catch (e) { + console.debug?.(e); + } +} +// ui/utils/format.ts +function pn(e) { + if (!e) return null; + let t = Number(e); + if (!isNaN(t)) return /* @__PURE__ */ new Date(t * 1e3); + let n = new Date(e); + return isNaN(n.getTime()) ? null : n; +} +function mn(e) { + let t = pn(e); + return t ? `${t.getDate().toString().padStart(2, "0")}/${(t.getMonth() + 1).toString().padStart(2, "0")}` : ""; +} +function hn(e) { + let t = pn(e); + return t ? `${t.getHours().toString().padStart(2, "0")}:${t.getMinutes().toString().padStart(2, "0")}` : ""; +} +function gn(e) { + return e ? e < 60 ? `${Math.round(e)}s` : `${Math.floor(e / 60)}m ${Math.round(e % 60)}s` : ""; +} +var _n = { + version: 1, + parser_family_version: "geninfo-catalog-v1", + sections: [ + { + key: "file_info", + title: "File Info", + searchField: "file", + aliases: [ + "filename", + "path", + "size", + "resolution" + ] + }, + { + key: "prompt", + title: "Prompt", + searchField: "prompt", + aliases: [ + "positive", + "negative", + "text" + ] + }, + { + key: "model", + title: "Models", + searchField: "model", + aliases: [ + "checkpoint", + "ckpt", + "vae", + "clip" + ] + }, + { + key: "sampler", + title: "Sampling", + searchField: "sampler", + aliases: [ + "sampling", + "scheduler", + "steps", + "cfg", + "seed", + "denoise" + ] + }, + { + key: "lora", + title: "LoRAs", + searchField: "lora", + aliases: ["loras", "lycoris"] + }, + { + key: "control", + title: "Control", + searchField: "control", + aliases: [ + "controlnet", + "adapter", + "ipadapter" + ] + }, + { + key: "upscale", + title: "Upscaling", + searchField: "upscale", + aliases: [ + "upscaler", + "upscaling", + "scale" + ] + }, + { + key: "workflow_nodes", + title: "Workflow Nodes", + searchField: "node", + aliases: [ + "nodes", + "workflow_node", + "workflow_nodes" + ] + }, + { + key: "tags", + title: "Tags", + searchField: "tag", + aliases: ["tags", "rating"] + } + ] +}; +function vn() { + let e = {}; + for (let t of _n.sections) { + e[t.key] = t.searchField, e[t.searchField] = t.searchField; + for (let n of t.aliases || []) e[String(n).toLowerCase()] = t.searchField; + } + return e; +} +function yn(e) { + let t = String(e || "").trim().toLowerCase(); + return vn()[t] || ""; +} +function bn(e) { + let t = String(e || "").trim().toLowerCase(); + return t && _n.sections.find((e) => e.key === t) || null; +} +// ui/vue/components/panel/sidebar/SidebarFileInfoSection.vue?vue&type=script&setup=true&lang.ts +var xn = { + key: 0, + class: "mjr-sidebar-section", + style: { + background: "rgba(255, 255, 255, 0.03)", + border: "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))", + "border-radius": "8px", + padding: "10px" + } +}, Sn = { style: { + display: "flex", + "flex-direction": "column", + gap: "6px" +} }, Cn = ["title"], wn = ["title"], Tn = /* @__PURE__ */ B({ + __name: "SidebarFileInfoSection", + props: { asset: {} }, + setup(e) { + let t = e; + function n(e) { + let t = Number(e); + if (!Number.isFinite(t) || t < 0) return "N/A"; + if (t === 0) return "0 bytes"; + let n = [ + "B", + "KB", + "MB", + "GB" + ], r = 0, i = t; + for (; i >= 1024 && r < n.length - 1;) i /= 1024, r += 1; + return r === 0 ? `${Math.round(i)} bytes` : `${i.toFixed(1)} ${n[r]}`; + } + function r(e) { + let t = e?.metadata_raw; + if (t && typeof t == "object") return t; + if (typeof t != "string" || !t.trim()) return {}; + try { + let e = JSON.parse(t); + return e && typeof e == "object" ? e : {}; + } catch { + return {}; + } + } + function i(...e) { + return e.find((e) => e != null && e !== ""); + } + function a(e) { + if (e == null) return !1; + let t = String(e).trim(); + return t !== "" && t.toUpperCase() !== "N/A"; + } + function o(e, t) { + let n = i(e.bits_per_raw_sample, e.bits_per_sample, t.bits_per_channel, t.bitsperchannel, t.bit_depth), r = String(i(e.pix_fmt, t.pixel_format, t.pix_fmt) || ""), a = Number(r.match(/(?:p|gray|gbrp)(\d+)(?:le|be)?$/i)?.[1]), o = Number(n) || (a >= 8 ? a : 0), s = String(i(e.sample_fmt, t.sample_format) || "").toLowerCase(), c = s.includes("flt") || s.includes("dbl") || /(?:16|32)f\b/i.test(r); + return o > 0 ? `${o}-bit ${c ? "float" : "fixed"}` : r ? `8-bit ${c ? "float" : "fixed"}` : c ? "float" : "N/A"; + } + function s(e, t) { + let n = e?.[t] ?? e?.file_info?.[t]; + return n != null && n !== "" ? n : t === "workflow_id" ? e?.user_metadata?.workflow?.id ?? e?.metadata?.workflow_id ?? "" : ""; + } + let c = H(() => { + let e = t.asset || {}, c = r(e), l = c?.raw_ffprobe && typeof c.raw_ffprobe == "object" ? c.raw_ffprobe : {}, u = l?.video_stream && typeof l.video_stream == "object" ? l.video_stream : {}, d = l?.format && typeof l.format == "object" ? l.format : {}, f = []; + e.width && e.height && f.push({ + label: "Dimensions", + value: `${e.width} x ${e.height}`, + tooltip: "Image/video resolution in pixels" + }), e.duration && e.duration > 0 && f.push({ + label: "Duration", + value: gn(e.duration), + tooltip: "Video duration" + }); + let p = k(e); + p != null && f.push({ + label: "FPS", + value: w(p), + tooltip: "Native frame rate" + }); + let m = D(e, p); + f.push({ + label: "Frames", + value: m == null ? "N/A" : String(Math.max(0, Math.floor(m))), + tooltip: "Total frame count" + }), f.push({ + label: "Bits / Channel", + value: o(u, c), + tooltip: "Channel precision and numeric representation" + }), f.push({ + label: "Pixel Aspect", + value: String(i(u.sample_aspect_ratio, c.pixel_aspect_ratio) || "N/A"), + tooltip: "Pixel sample aspect ratio" + }), f.push({ + label: "Codec ID", + value: String(i(u.codec_tag_string, u.codec_tag, c.codec_id) || "N/A"), + tooltip: "Container codec identifier" + }), f.push({ + label: "Codec Name", + value: String(i(u.codec_long_name, u.codec_name, c.codec_name) || "N/A"), + tooltip: "Video codec name" + }), f.push({ + label: "Encoder", + value: String(i(u.tags?.encoder, d.tags?.encoder, c.encoder) || "N/A"), + tooltip: "Encoder recorded in file metadata" + }), f.push({ + label: "Pixel Format", + value: String(i(u.pix_fmt, c.pixel_format, c.pix_fmt) || "N/A"), + tooltip: "Stored pixel format" + }), f.push({ + label: "Color Space", + value: String(i(u.color_space, c.color_space, c.colorspace) || "N/A"), + tooltip: "Encoded color space" + }); + let h = He(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0); + h > 0 && f.push({ + label: "Generation Time", + value: `${(Number(h) / 1e3).toFixed(1)}s`, + tooltip: "Time taken to generate this asset (workflow execution time)", + valueStyle: `color: ${Be(h)}; font-weight: 600;` + }); + let g = e.generation_time || e.file_creation_time || e.mtime || e.created_at; + if (g) { + let e = mn(g), t = hn(g); + e && f.push({ + label: "Date", + value: e, + tooltip: "File creation/generation date" + }), t && f.push({ + label: "Time", + value: t, + tooltip: "File creation/generation time" + }); + } + f.push({ + label: "File Size", + value: n(i(e.size_bytes, e.size, e.file_info?.size_bytes, e.file_info?.size)), + tooltip: "File size on disk" + }), e.id != null && f.push({ + label: "Asset ID", + value: String(e.id), + tooltip: "Internal database asset identifier" + }); + let _ = String(s(e, "job_id") || "").trim(); + _ && f.push({ + label: "Job ID", + value: _, + tooltip: "Workflow execution job identifier (prompt_id)" + }); + let v = String(s(e, "source_node_id") || "").trim(); + v && f.push({ + label: "Source Node", + value: v, + tooltip: "ComfyUI node id that produced this file" + }); + let y = String(s(e, "source_node_type") || "").trim(); + y && f.push({ + label: "Node Type", + value: y, + tooltip: "ComfyUI node class that produced this file" + }); + let b = String(s(e, "workflow_id") || "").trim(); + return b && f.push({ + label: "Workflow ID", + value: b, + tooltip: "ComfyUI workflow identifier (from workflow.id in extra_data)" + }), f.filter((e) => a(e.value)); + }); + return (e, t) => c.value.length ? (U(), q("div", xn, [t[0] ||= I("div", { style: { + "font-size": "12px", + "font-weight": "700", + color: "#607d8b", + "margin-bottom": "8px", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, " File Info ", -1), I("div", Sn, [(U(!0), q(F, null, L(c.value, (e) => (U(), q("div", { + key: e.label, + style: { + display: "flex", + gap: "10px", + "align-items": "flex-start", + "justify-content": "space-between" + } + }, [I("div", { + title: e.tooltip || "", + style: { + "font-size": "12px", + opacity: "0.68", + "min-width": "92px" + } + }, G(e.label), 9, Cn), I("div", { + style: K(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), + title: String(e.value || "") + }, G(e.value), 13, wn)]))), 128))])])) : z("", !0); + } +}), En = ["title"], Dn = ["src"], On = { + key: 1, + style: { + width: "100%", + height: "100%", + display: "flex", + "flex-direction": "column", + "align-items": "center", + "justify-content": "center", + gap: "4px", + background: "linear-gradient(135deg, rgba(0,188,212,0.28), rgba(156,39,176,0.20))", + color: "white", + padding: "6px", + "text-align": "center" + } +}, kn = { style: { + "font-size": "8px", + "font-weight": "700", + "max-width": "54px", + "white-space": "nowrap", + overflow: "hidden", + "text-overflow": "ellipsis" +} }, An = ["src"], jn = { + key: 3, + style: { + position: "absolute", + bottom: "0", + left: "0", + right: "0", + background: "rgba(0,0,0,0.7)", + color: "white", + "font-size": "8px", + padding: "2px", + "text-align": "center", + "white-space": "nowrap", + overflow: "hidden", + "text-overflow": "ellipsis" + } +}, Mn = { + key: 4, + title: "Video file", + style: { + position: "absolute", + color: "white", + opacity: "0.7", + "font-size": "16px", + "pointer-events": "none" + } +}, Nn = /* @__PURE__ */ B({ + __name: "GenerationInputThumb", + props: { inputFile: {} }, + setup(e) { + let t = e, n = Y(0), i = Y(!1), a = null; + function c() { + return a ||= import("./floatingViewerManager-B_I-SRbd.js").then((e) => e.n), a; + } + function l() { + return (Array.isArray(t.inputFile?.previewCandidates) ? t.inputFile.previewCandidates : [])[n.value] || ""; + } + function u() { + let e = Array.isArray(t.inputFile?.previewCandidates) ? t.inputFile.previewCandidates : []; + n.value < e.length - 1 && (n.value += 1); + } + async function d(e) { + e?.stopPropagation?.(); + let n = String(t.inputFile?.filepath || t.inputFile?.filename || "").trim(); + if (n) try { + await navigator.clipboard.writeText(n), i.value = !0, setTimeout(() => { + i.value = !1; + }, 350); + } catch (e) { + console.debug?.(e); + } + } + function f(e) { + e?.stopPropagation?.(), b(); + } + function p() { + let e = t.inputFile || {}, n = String(e.filepath || "").trim(); + return { + filename: e.filename || "", + name: e.filename || "", + filepath: n, + path: n, + subfolder: e.subfolder || "", + type: e.type || "input", + source: e.type || "input", + kind: h(e), + root_id: e.root_id || "", + preview_url: l() + }; + } + function h(e = t.inputFile || {}) { + let n = String(e.kind || "").trim().toLowerCase(); + if (n === "image" || n === "video" || n === "audio" || n === "model3d") return n; + if (e.isVideo) return "video"; + if (e.isAudio) return "audio"; + let r = String(e.filename || "").toLowerCase(); + return /\.(mp4|mov|webm|mkv|avi|m4v)$/i.test(r) ? "video" : /\.(wav|mp3|flac|ogg|m4a|aac|opus)$/i.test(r) ? "audio" : /\.(glb|gltf|obj|stl|ply|fbx)$/i.test(r) ? "model3d" : "image"; + } + function g(e, t, n, { disabled: r = !1 } = {}) { + return { + id: `mjr-generation-source-${String(e).toLowerCase().replace(/[^a-z0-9]+/g, "-")}`, + type: "item", + label: e, + iconClass: t, + rightHint: "", + tone: String(e).toLowerCase().includes("floating") ? "floating-viewer" : "", + disabled: r, + action: n + }; + } + function _() { + return { + id: "mjr-generation-source-separator", + type: "separator" + }; + } + function y() { + return C(l()) || !!t.inputFile?.filename || !!t.inputFile?.filepath; + } + function b() { + let e = p(); + if (ye({ + asset: e, + index: 0 + })) return; + let t = l(); + if (C(t)) try { + window.open(t, "_blank", "noopener,noreferrer"); + } catch (e) { + console.debug?.(e); + } + } + async function ee() { + try { + let { floatingViewerManager: e } = await c(); + await e.openAssets({ + assets: [p()], + index: 0 + }); + } catch (e) { + console.debug?.(e), o(m("toast.viewerOpenFailed", "Failed to open viewer."), "error"); + } + } + async function S() { + let e = await v(p()); + e?.ok ? o(m("toast.openedInFolder", "Opened in folder"), "info", 1600) : o(e?.error || m("toast.openFolderFailed", "Failed to open folder."), "error"); + } + async function te() { + let e = p(), t = { + filename: e.filename, + subfolder: e.subfolder, + type: e.type || "input", + root_id: e.root_id || void 0, + kind: e.kind + }, n = await cn({ + post: s, + endpoint: r.STAGE_TO_INPUT, + payload: t, + index: !1 + }); + if (!n?.relativePath || !rn({ + app: x(), + items: [{ + payload: t, + relativePath: n.relativePath, + droppedExt: String(t.filename || "").split(".").pop() || "" + }], + event: null + })) { + o(m("toast.loadAssetFailed", "Failed to load asset."), "error"); + return; + } + let i = e.kind ? e.kind.charAt(0).toUpperCase() + e.kind.slice(1) : "Asset"; + o(m("toast.assetLoadedToCanvas", "{kind} loader added to canvas.", { kind: i }), "success", 1800); + } + function ne(e) { + e?.preventDefault?.(), e?.stopPropagation?.(); + let n = h(), r = n === "video" ? m("ctx.loadVideo", "Load video") : n === "audio" ? m("ctx.loadAudio", "Load audio") : n === "model3d" ? m("ctx.loadModel3d", "Load 3D model") : m("ctx.loadImage", "Load image"); + Ze({ + x: e?.clientX || 0, + y: e?.clientY || 0, + items: [ + g(m("ctx.openInViewer", "Open in viewer"), "pi pi-eye", b, { disabled: !y() }), + g(m("ctx.openInFloatingViewer", "Open in Floating Viewer"), "pi pi-window-maximize", ee, { disabled: !y() }), + g(m("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", S, { disabled: !t.inputFile?.filepath }), + _(), + g(r, "pi pi-plus-circle", te, { disabled: !t.inputFile?.filename }), + g(m("ctx.copyPath", "Copy path"), "pi pi-copy", d, { disabled: !(t.inputFile?.filepath || t.inputFile?.filename) }) + ] + }); + } + function w(e) { + e.target?.play?.().catch?.(() => {}); + } + function T(e) { + try { + e.target?.pause?.(); + } catch (e) { + console.debug?.(e); + } + } + function E() { + return !!t.inputFile?.isAudio; + } + return (t, n) => (U(), q("div", { + title: `${e.inputFile.filename} (click to copy, double-click to open in new tab)`, + style: K({ + width: "64px", + height: "64px", + background: "#222", + borderRadius: "4px", + overflow: "hidden", + position: "relative", + cursor: "pointer", + display: "flex", + alignItems: "center", + justifyContent: "center", + outline: i.value ? "2px solid rgba(76, 175, 80, 0.9)" : "", + outlineOffset: i.value ? "1px" : "" + }), + onClick: d, + onDblclick: f, + onContextmenu: ne + }, [e.inputFile.isVideo ? (U(), q("video", { + key: 0, + src: l(), + muted: "", + loop: "", + playsinline: "", + preload: "metadata", + style: { + width: "100%", + height: "100%", + "object-fit": "cover" + }, + onError: u, + onMouseover: w, + onMouseout: T + }, null, 40, Dn)) : E() ? (U(), q("div", On, [n[0] ||= I("div", { style: { + "font-size": "18px", + "line-height": "1" + } }, "♪", -1), I("div", kn, G(e.inputFile.filename), 1)])) : (U(), q("img", { + key: 2, + src: l(), + style: { + width: "100%", + height: "100%", + "object-fit": "cover" + }, + onError: u + }, null, 40, An)), e.inputFile.role && e.inputFile.role !== "secondary" ? (U(), q("div", jn, G(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (U(), q("div", Mn, " Play ")) : z("", !0)], 44, En)); + } +}), Pn = { + key: 0, + style: { + display: "flex", + "flex-direction": "column", + gap: "12px" + } +}, Fn = { + key: 0, + style: { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + padding: "10px 12px", + background: "linear-gradient(135deg, rgba(33, 150, 243, 0.18) 0%, rgba(0, 188, 212, 0.10) 100%)", + borderLeft: "3px solid #2196F3", + border: "1px solid rgba(33, 150, 243, 0.45)", + boxShadow: "0 0 0 1px rgba(33, 150, 243, 0.15) inset", + borderRadius: "6px", + fontSize: "11px", + color: "var(--fg-color, #ccc)" + } +}, In = { style: { opacity: "0.85" } }, Ln = { style: { + display: "flex", + "align-items": "center", + gap: "8px", + "flex-wrap": "wrap", + "justify-content": "flex-end" +} }, Rn = ["title"], zn = ["title"], Bn = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "10px" +} }, Vn = { style: { + "font-size": "11px", + "font-weight": "700", + color: "#00BCD4", + "text-transform": "uppercase", + "letter-spacing": "0.6px" +} }, Hn = { style: { + "font-size": "11px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "font-weight": "600" +} }, Un = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#FF9800", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, Wn = { style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "line-height": "1.5", + "white-space": "pre-wrap", + "word-break": "break-word" +} }, Gn = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#9E9E9E", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, Kn = { style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "line-height": "1.5", + "white-space": "pre-wrap", + "word-break": "break-word" +} }, qn = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "8px", + "margin-bottom": "10px" +} }, Jn = { style: { + "font-size": "11px", + "font-weight": "800", + color: "#26C6DA", + "text-transform": "uppercase", + "letter-spacing": "0.5px" +} }, Yn = { + key: 0, + style: { + display: "grid", + "grid-template-columns": "repeat(auto-fit,minmax(92px,1fr))", + gap: "8px", + "margin-bottom": "10px" + } +}, Xn = { style: { + "font-size": "9px", + "font-weight": "800", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, Zn = { style: { + "font-size": "12px", + color: "var(--fg-color,#eee)", + "font-weight": "650", + "word-break": "break-word" +} }, Qn = { + key: 1, + style: { + border: "1px solid rgba(76,175,80,0.36)", + "border-radius": "6px", + background: "rgba(76,175,80,0.10)", + padding: "10px", + "margin-bottom": "10px" + } +}, $n = ["title"], er = { + key: 2, + style: { + display: "flex", + "flex-direction": "column", + gap: "8px" + } +}, tr = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "8px", + "margin-bottom": "7px" +} }, nr = { style: { + "font-size": "10px", + "font-weight": "800", + color: "#26C6DA", + "text-transform": "uppercase", + "letter-spacing": "0.45px" +} }, rr = { style: { + display: "flex", + "align-items": "center", + gap: "5px", + "flex-wrap": "wrap", + "justify-content": "flex-end" +} }, ir = { + key: 0, + style: { + "font-size": "10px", + color: "#A7FFEB", + background: "rgba(0,150,136,0.16)", + border: "1px solid rgba(0,150,136,0.30)", + "border-radius": "4px", + padding: "2px 6px", + "font-weight": "700" + } +}, ar = { + key: 1, + style: { + "font-size": "10px", + color: "#FFE082", + background: "rgba(255,193,7,0.14)", + border: "1px solid rgba(255,193,7,0.30)", + "border-radius": "4px", + padding: "2px 6px", + "font-weight": "700" + } +}, or = { style: { + display: "flex", + gap: "10px", + "align-items": "flex-start", + "min-width": "0" +} }, sr = { style: { + "min-width": "0", + flex: "1" +} }, cr = ["title", "onClick"], lr = { + key: 1, + style: { + "font-size": "10px", + color: "rgba(255,255,255,0.58)", + "margin-top": "7px", + display: "flex", + gap: "6px", + "flex-wrap": "wrap" + } +}, ur = { key: 0 }, dr = { key: 1 }, fr = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "8px", + "margin-bottom": "10px" +} }, pr = { style: { + "font-size": "11px", + "font-weight": "800", + color: "#FFB300", + "text-transform": "uppercase", + "letter-spacing": "0.5px" +} }, mr = { + key: 0, + style: { + display: "grid", + "grid-template-columns": "repeat(auto-fit,minmax(100px,1fr))", + gap: "8px", + "margin-bottom": "10px" + } +}, hr = { style: { + "font-size": "9px", + "font-weight": "800", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, gr = { style: { + "font-size": "12px", + color: "var(--fg-color,#eee)", + "font-weight": "650", + "word-break": "break-word" +} }, _r = { + key: 1, + style: { + border: "1px solid rgba(76,175,80,0.34)", + "border-radius": "6px", + background: "rgba(76,175,80,0.09)", + padding: "10px", + "margin-bottom": "10px" + } +}, vr = ["title"], yr = { + key: 2, + style: { + border: "1px solid rgba(33,150,243,0.32)", + "border-radius": "6px", + background: "rgba(33,150,243,0.08)", + padding: "10px", + "margin-bottom": "10px" + } +}, br = ["title"], xr = { + key: 3, + style: { + display: "flex", + "flex-direction": "column", + gap: "8px", + "margin-bottom": "10px" + } +}, Sr = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "8px", + "margin-bottom": "7px" +} }, Cr = { style: { + "font-size": "10px", + "font-weight": "800", + color: "#FFCA28", + "text-transform": "uppercase", + "letter-spacing": "0.45px" +} }, wr = { + key: 0, + style: { + "font-size": "10px", + color: "#FFE082", + background: "rgba(255,193,7,0.14)", + border: "1px solid rgba(255,193,7,0.30)", + "border-radius": "4px", + padding: "2px 6px", + "font-weight": "700" + } +}, Tr = ["title", "onClick"], Er = { + key: 1, + style: { + display: "flex", + "flex-wrap": "wrap", + gap: "5px", + "margin-top": "8px" + } +}, Dr = ["title", "onClick"], Or = { style: { + border: "1px solid rgba(255,179,0,0.30)", + "border-radius": "6px", + background: "rgba(0,0,0,0.16)", + overflow: "hidden" +} }, kr = ["title"], Ar = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#4CAF50", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, jr = { style: { + display: "flex", + "flex-wrap": "wrap", + gap: "6px", + "margin-bottom": "10px" +} }, Mr = { style: { + "font-size": "10px", + "font-weight": "700", + color: "#4CAF50", + "letter-spacing": "0.4px" +} }, Nr = ["onClick"], Pr = { style: { + "font-size": "10px", + "font-weight": "700", + color: "#F44336", + "letter-spacing": "0.4px", + "margin-top": "4px" +} }, Fr = ["onClick"], Ir = { style: { + display: "flex", + "justify-content": "space-between", + "align-items": "center", + "font-size": "11px", + "font-weight": "600", + color: "#4CAF50", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, Lr = ["title"], Rr = ["title"], zr = { style: { + display: "flex", + "justify-content": "space-between", + "align-items": "center", + "font-size": "11px", + "font-weight": "600", + color: "#F44336", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, Br = ["title"], Vr = ["title"], Hr = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#00BCD4", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + display: "flex", + "align-items": "center", + "justify-content": "space-between" +} }, Ur = ["title"], Wr = { style: { + display: "flex", + "align-items": "center", + gap: "10px" +} }, Gr = { style: { + flex: "1", + height: "8px", + background: "rgba(255,255,255,0.1)", + "border-radius": "4px", + overflow: "hidden" +} }, Kr = { + key: 0, + style: { + "font-size": "10px", + color: "rgba(255,255,255,0.65)", + border: "1px dashed rgba(255,255,255,0.25)", + "border-radius": "4px", + padding: "6px 8px", + background: "rgba(255,255,255,0.04)" + } +}, qr = { style: { + "font-size": "10px", + "font-weight": "600", + color: "rgba(0, 188, 212, 0.75)", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-top": "8px", + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "8px" +} }, Jr = ["title"], Yr = { style: { + display: "flex", + "align-items": "center", + gap: "6px" +} }, Xr = ["title"], Zr = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#9C27B0", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, Qr = { style: { + display: "grid", + "grid-template-columns": "repeat(auto-fit, minmax(190px, 1fr))", + gap: "10px" +} }, $r = { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.58)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, ei = ["onClick"], ti = { + key: 0, + style: { + display: "flex", + "flex-direction": "column", + gap: "5px" + } +}, ni = ["onClick"], ri = { style: { + display: "flex", + "justify-content": "space-between", + "align-items": "center", + "font-size": "11px", + "font-weight": "600", + color: "#00BCD4", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, ii = { style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "line-height": "1.5", + "white-space": "pre-wrap", + "word-break": "break-word" +} }, ai = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#FF9800", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, oi = { style: { + display: "grid", + "grid-template-columns": "repeat(auto-fit, minmax(130px, 1fr))", + gap: "8px" +} }, si = ["onClick"], ci = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#9C27B0", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, li = { style: { + display: "grid", + "grid-template-columns": "repeat(auto-fit, minmax(220px, 1fr))", + gap: "10px" +} }, ui = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "10px" +} }, di = { style: { + display: "flex", + "flex-direction": "column", + gap: "4px" +} }, fi = ["onClick"], pi = { + key: 0, + style: { + display: "flex", + "flex-direction": "column", + gap: "6px" + } +}, mi = { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.58)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, hi = { style: { + display: "flex", + "flex-direction": "column", + gap: "5px" +} }, gi = ["onClick"], _i = { style: { + display: "grid", + "grid-template-columns": "auto 1fr", + gap: "8px 12px", + "align-items": "start" +} }, vi = ["title"], yi = ["title"], bi = ["title", "onClick"], xi = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#4CAF50", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, Si = ["title", "onClick"], Ci = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#26C6DA", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, wi = { style: { + display: "grid", + "grid-template-columns": "repeat(auto-fit, minmax(190px, 1fr))", + gap: "10px" +} }, Ti = { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.58)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, Ei = ["title", "onClick"], Di = { style: { + display: "flex", + "justify-content": "space-between", + "align-items": "center", + "font-size": "11px", + "font-weight": "600", + color: "#26A69A", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, Oi = ["title"], ki = { style: { + "font-size": "11px", + "font-weight": "700", + color: "#E91E63", + "text-transform": "uppercase", + "letter-spacing": "1px" +} }, Ai = ["title"], ji = ["title"], Mi = { style: { + display: "flex", + gap: "8px", + "flex-wrap": "wrap" +} }, Ni = /* @__PURE__ */ B({ + __name: "SidebarGenerationSection", + props: { asset: {} }, + setup(e) { + let t = e, r = Y(0), a = Y(0), o = Y(""), s = Y(m("action.copy", "Copy")), c = Y(m("action.generate", "Generate")), l = Y(!1), u = Y(f()), d = 0; + function f() { + return { + scoreText: "...", + scoreColor: "#888", + qualityText: m("status.loading", "Loading"), + qualityColor: "#888", + qualityBackground: "rgba(127,127,127,0.3)", + fillWidth: "0%", + fillColor: "#666", + aiStatusVisible: !1, + aiStatusText: m("sidebar.generation.aiDisabledEnv", "AI features are disabled (enable vector search env var).") + }; + } + function p(e, t) { + let n = String(e || "").trim().replace(/^#/, ""); + return /^[0-9a-fA-F]{6}$/.test(n) ? `rgba(${Number.parseInt(n.slice(0, 2), 16)}, ${Number.parseInt(n.slice(2, 4), 16)}, ${Number.parseInt(n.slice(4, 6), 16)}, ${t})` : `rgba(255,255,255,${t})`; + } + function h(e, { emphasis: t = !1, startAlpha: n = .16, endAlpha: r = .08 } = {}) { + return { + background: t ? `linear-gradient(135deg, ${p(e, n)} 0%, ${p(e, r)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))", + borderLeft: `3px solid ${e}`, + border: t ? `1px solid ${p(e, .45)}` : "1px solid var(--border-color, rgba(255,255,255,0.12))", + boxShadow: t ? `0 0 0 1px ${p(e, .15)} inset` : "none", + borderRadius: "6px", + padding: "12px" + }; + } + function g() { + return { + background: "linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(156, 39, 176, 0.15) 100%)", + border: "2px solid #E91E63", + borderRadius: "8px", + padding: "12px 16px", + display: "flex", + alignItems: "center", + justifyContent: "space-between", + gap: "12px" + }; + } + function _() { + return { + display: "inline-flex", + alignItems: "center", + borderRadius: "999px", + border: "1px solid rgba(0, 188, 212, 0.55)", + background: "rgba(0, 188, 212, 0.16)", + color: "#4DD0E1", + fontSize: "9px", + fontWeight: "700", + lineHeight: "1", + padding: "2px 6px", + letterSpacing: "0.2px", + textTransform: "uppercase", + whiteSpace: "nowrap" + }; + } + let v = H(() => j(t.asset)), y = H(() => T()), b = H(() => v.value.kind === "full" || v.value.kind === "caption-only"), x = H(() => re(o.value) || v.value.emptyCaptionText), ee = H(() => y.value && v.value.isImageAsset && !!t.asset?.id), S = H(() => y.value && !!re(x.value) && x.value !== v.value.emptyCaptionText), te = H(() => v.value.branchCards.filter((e) => e.modelFields.length || e.loras.length)), ne = H(() => v.value.branchCards.filter((e) => e.samplingFields.length)); + H(() => v.value.branchCards.filter((e) => e.loras.length)); + let C = H(() => { + let e = [], t = (e, t) => bn(e)?.title || t; + return !te.value.length && v.value.modelFields.length && e.push({ + key: "model", + title: t("model", m("sidebar.generation.modelLora", "Model & LoRA")), + accent: "#9C27B0", + emphasis: !0, + fields: v.value.modelFields + }), !ne.value.length && v.value.samplingFields.length && e.push({ + key: "sampling", + title: t("sampler", m("sidebar.generation.sampling", "Sampling")), + accent: "#FF9800", + emphasis: !0, + fields: v.value.samplingFields + }), (v.value.ttsFields.length || v.value.workflowType.toLowerCase() === "tts") && e.push({ + key: "tts", + title: "TTS", + accent: "#26A69A", + emphasis: !0, + fields: v.value.ttsFields + }), v.value.ttsEngineFields.length && e.push({ + key: "tts-engine", + title: "TTS Engine", + accent: "#00897B", + emphasis: !1, + fields: v.value.ttsEngineFields + }), v.value.ttsRuntimeFields.length && e.push({ + key: "tts-runtime", + title: "TTS Runtime", + accent: "#00796B", + emphasis: !1, + fields: v.value.ttsRuntimeFields + }), v.value.audioFields.length && e.push({ + key: "audio", + title: m("sidebar.generation.audio", "Audio"), + accent: "#00BCD4", + emphasis: !1, + fields: v.value.audioFields + }), v.value.imageFields.length && e.push({ + key: "image", + title: m("sidebar.generation.image", "Image"), + accent: "#2196F3", + emphasis: !1, + fields: v.value.imageFields + }), e; + }); + function w(e, t, n = 450) { + if (!e) return; + let r = e.style.background; + e.style.background = t, setTimeout(() => { + e.style.background = r || ""; + }, n); + } + function E(e, t = !0) { + return { + background: t ? `linear-gradient(135deg, ${p(e, .16)} 0%, ${p(e, .08)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))", + border: `1px solid ${p(e, .42)}`, + boxShadow: `0 0 0 1px ${p(e, .14)} inset`, + borderRadius: "8px", + padding: "12px", + display: "flex", + flexDirection: "column", + gap: "10px" + }; + } + function D(e) { + return "#CE6DE0"; + } + function k(e) { + let t = String(e?.key || "").toLowerCase(); + return t.includes("high") ? "#FFC107" : t.includes("low") ? "#FFB300" : t.includes("base") ? "#FF9800" : t.includes("upscale") || t.includes("refine") ? "#FFCA28" : t.includes("pass") ? "#FDD835" : "#FF9800"; + } + function ie(e) { + return e === "high_noise" ? "#FF7043" : e === "low_noise" ? "#29B6F6" : "#AB47BC"; + } + async function M(e, t = null, n = "rgba(76, 175, 80, 0.35)") { + let r = String(e ?? "").trim(); + if (r && r !== "-") try { + await navigator.clipboard.writeText(r), w(t, n); + } catch (e) { + console.debug?.(e); + } + } + function N() { + u.value = { + scoreText: "AI OFF", + scoreColor: "#9E9E9E", + qualityText: m("status.disabled", "Disabled"), + qualityColor: "#BDBDBD", + qualityBackground: "rgba(158,158,158,0.25)", + fillWidth: "0%", + fillColor: "#777", + aiStatusVisible: !0, + aiStatusText: m("sidebar.generation.aiDisabledSettings", "AI features are disabled in settings.") + }; + } + function P() { + u.value = f(); + } + async function oe() { + d += 1; + let e = d; + if (!v.value.showAlignment || !t.asset?.id) P(); + else if (!y.value) N(); + else { + P(); + try { + let n = await i(t.asset.id); + if (e !== d) return; + if (!n?.ok && (String(n?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(n?.error || "")))) { + N(); + return; + } + let r = n?.ok && n.data != null ? Number(n.data) : null; + if (!Number.isFinite(r)) { + u.value = { + scoreText: "N/A", + scoreColor: "#888", + qualityText: m("status.na", "N/A"), + qualityColor: "#888", + qualityBackground: "rgba(127,127,127,0.3)", + fillWidth: "0%", + fillColor: "#666", + aiStatusVisible: !1, + aiStatusText: "" + }; + return; + } + let a = Math.round(r * 100), o = O(r); + u.value = { + scoreText: `${a}%`, + scoreColor: o, + qualityText: A(r), + qualityColor: o, + qualityBackground: `${o}33`, + fillWidth: `${a}%`, + fillColor: o, + aiStatusVisible: !1, + aiStatusText: "" + }; + } catch (t) { + if (console.debug?.(t), e !== d) return; + u.value = { + scoreText: "-", + scoreColor: "#888", + qualityText: m("status.unavailable", "Unavailable"), + qualityColor: "#888", + qualityBackground: "rgba(127,127,127,0.3)", + fillWidth: "0%", + fillColor: "#666", + aiStatusVisible: !1, + aiStatusText: "" + }; + } + } + } + async function ce() { + if (ee.value && !l.value) { + l.value = !0, c.value = m("status.generating", "Generating..."); + try { + let e = await n(t.asset.id); + e?.ok && (o.value = String(e?.data || "").trim()); + } catch (e) { + console.debug?.(e); + } finally { + l.value = !1, c.value = m("action.generate", "Generate"); + } + } + } + async function B() { + if (S.value) try { + await navigator.clipboard.writeText(x.value), s.value = m("viewer.copySuccessShort", "Copied!"), setTimeout(() => { + s.value = m("action.copy", "Copy"); + }, 900); + } catch (e) { + console.debug?.(e); + } + } + return W(() => t.asset, () => { + r.value = 0, a.value = 0, o.value = String(t.asset?.enhanced_caption || "").trim(), s.value = m("action.copy", "Copy"), c.value = m("action.generate", "Generate"); + }, { immediate: !0 }), W(() => [ + t.asset?.id, + v.value.kind, + v.value.showAlignment, + y.value + ], () => { + oe(); + }, { immediate: !0 }), (e, t) => { + let n = le("MButton"); + return v.value.kind === "empty" ? z("", !0) : (U(), q("div", Pn, [ + v.value.workflowType ? (U(), q("div", Fn, [I("span", In, G(J(m)("viewer.workflow", "Workflow")), 1), I("div", Ln, [I("span", { + title: J(m)("sidebar.generation.workflowEngine", "Workflow engine: {value}", { value: v.value.workflowType }), + style: { + background: "#2196F3", + color: "white", + padding: "2px 8px", + "border-radius": "999px", + "font-weight": "bold", + "font-size": "10px", + "letter-spacing": "0.2px" + } + }, G(v.value.workflowLabel || v.value.workflowType), 9, Rn), v.value.workflowBadge ? (U(), q("span", { + key: 0, + title: J(m)("sidebar.generation.apiProvider", "API provider: {value}", { value: v.value.workflowBadge }), + style: { + background: "rgba(255,255,255,0.08)", + color: "var(--fg-color, #eee)", + padding: "2px 8px", + "border-radius": "999px", + border: "1px solid rgba(255,255,255,0.14)", + "font-weight": "600", + "font-size": "10px", + "letter-spacing": "0.2px" + } + }, G(v.value.workflowBadge), 9, zn)) : z("", !0)])])) : z("", !0), + v.value.isOverride ? (U(), q("div", { + key: 1, + style: K(h("#00BCD4", { + emphasis: !0, + startAlpha: .14, + endAlpha: .08 + })) + }, [I("div", Bn, [I("span", Vn, G(J(m)("sidebar.generation.override", "Override")), 1), I("span", Hn, G(v.value.overrideLabel), 1)])], 4)) : z("", !0), + v.value.isTruncated ? (U(), q("div", { + key: 2, + style: K(h("#FF9800", { + emphasis: !0, + startAlpha: .12, + endAlpha: .08 + })) + }, [I("div", Un, G(J(m)("sidebar.generation.metadataTruncated", "Metadata Truncated")), 1), I("div", Wn, G(J(m)("sidebar.generation.metadataTruncatedBody", "Generation data is incomplete because it exceeded the size limit.")), 1)], 4)) : z("", !0), + v.value.kind === "media-only" ? (U(), q("div", { + key: 3, + style: K(h("#9E9E9E", { + emphasis: !0, + startAlpha: .1, + endAlpha: .06 + })) + }, [I("div", Gn, G(J(m)("sidebar.generation.generationData", "Generation Data")), 1), I("div", Kn, G(v.value.mediaOnlyMessage), 1)], 4)) : z("", !0), + v.value.kind === "full" ? (U(), q(F, { key: 4 }, [ + v.value.ltxDirector ? (U(), q("div", { + key: 0, + style: K(h("#26C6DA", { + emphasis: !0, + startAlpha: .15, + endAlpha: .08 + })) + }, [ + I("div", qn, [I("div", Jn, G(v.value.ltxDirector.title || "LTX Director"), 1), t[8] ||= I("span", { style: { + "font-size": "10px", + "font-weight": "700", + color: "#26C6DA", + background: "rgba(38,198,218,0.14)", + border: "1px solid rgba(38,198,218,0.32)", + "border-radius": "999px", + padding: "2px 8px" + } }, " Director ", -1)]), + v.value.ltxDirector.fields.length ? (U(), q("div", Yn, [(U(!0), q(F, null, L(v.value.ltxDirector.fields, (e) => (U(), q("div", { + key: `ltx-field-${e.label}`, + style: { + border: "1px solid rgba(255,255,255,0.10)", + "border-radius": "6px", + background: "rgba(255,255,255,0.045)", + padding: "7px 8px", + "min-width": "0" + } + }, [I("div", Xn, G(e.label), 1), I("div", Zn, G(e.value), 1)]))), 128))])) : z("", !0), + v.value.ltxDirector.globalPrompt ? (U(), q("div", Qn, [t[9] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "800", + color: "#66BB6A", + "text-transform": "uppercase", + "letter-spacing": "0.45px", + "margin-bottom": "6px" + } }, " Global Prompt ", -1), I("div", { + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + "font-size": "12px", + color: "var(--fg-color,#eee)", + "line-height": "1.45", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: t[0] ||= (e) => M(v.value.ltxDirector.globalPrompt, e.currentTarget) + }, G(v.value.ltxDirector.globalPrompt), 9, $n)])) : z("", !0), + v.value.ltxDirector.segments.length ? (U(), q("div", er, [(U(!0), q(F, null, L(v.value.ltxDirector.segments, (e) => (U(), q("div", { + key: e.key, + style: { + border: "1px solid rgba(38,198,218,0.30)", + "border-radius": "6px", + background: "rgba(38,198,218,0.075)", + padding: "10px" + } + }, [I("div", tr, [I("div", nr, G(e.label), 1), I("div", rr, [e.inLabel ? (U(), q("span", ir, " in " + G(e.inLabel), 1)) : z("", !0), e.outLabel ? (U(), q("span", ar, " out " + G(e.outLabel), 1)) : z("", !0)])]), I("div", or, [e.filename ? (U(), se(Nn, { + key: 0, + "input-file": { + filename: e.filename, + filepath: e.filepath || e.filename, + role: e.type || "segment", + roleLabel: e.type || "segment", + isVideo: e.isVideo, + isAudio: e.isAudio, + previewCandidates: e.previewCandidates + } + }, null, 8, ["input-file"])) : z("", !0), I("div", sr, [e.prompt ? (U(), q("div", { + key: 0, + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + "font-size": "12px", + color: "var(--fg-color,#eee)", + "line-height": "1.45", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: (t) => M(e.prompt, t.currentTarget) + }, G(e.prompt), 9, cr)) : z("", !0), e.filename || e.type ? (U(), q("div", lr, [e.type ? (U(), q("span", ur, G(e.type), 1)) : z("", !0), e.filename ? (U(), q("span", dr, G(e.filename), 1)) : z("", !0)])) : z("", !0)])])]))), 128))])) : z("", !0) + ], 4)) : z("", !0), + v.value.ideogram ? (U(), q("div", { + key: 1, + style: K(h("#FFB300", { + emphasis: !0, + startAlpha: .15, + endAlpha: .08 + })) + }, [ + I("div", fr, [I("div", pr, G(v.value.ideogram.title || "Ideogram 4"), 1), t[10] ||= I("span", { style: { + "font-size": "10px", + "font-weight": "700", + color: "#FFCA28", + background: "rgba(255,179,0,0.14)", + border: "1px solid rgba(255,179,0,0.32)", + "border-radius": "999px", + padding: "2px 8px" + } }, " Prompt JSON ", -1)]), + v.value.ideogram.fields.length ? (U(), q("div", mr, [(U(!0), q(F, null, L(v.value.ideogram.fields, (e) => (U(), q("div", { + key: `ideogram-field-${e.label}`, + style: { + border: "1px solid rgba(255,255,255,0.10)", + "border-radius": "6px", + background: "rgba(255,255,255,0.045)", + padding: "7px 8px", + "min-width": "0" + } + }, [I("div", hr, G(e.label), 1), I("div", gr, G(e.value), 1)]))), 128))])) : z("", !0), + v.value.ideogram.highLevelDescription ? (U(), q("div", _r, [t[11] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "800", + color: "#81C784", + "text-transform": "uppercase", + "letter-spacing": "0.45px", + "margin-bottom": "6px" + } }, " High Level Description ", -1), I("div", { + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + "font-size": "12px", + color: "var(--fg-color,#eee)", + "line-height": "1.45", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: t[1] ||= (e) => M(v.value.ideogram.highLevelDescription, e.currentTarget) + }, G(v.value.ideogram.highLevelDescription), 9, vr)])) : z("", !0), + v.value.ideogram.background ? (U(), q("div", yr, [t[12] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "800", + color: "#64B5F6", + "text-transform": "uppercase", + "letter-spacing": "0.45px", + "margin-bottom": "6px" + } }, " Background ", -1), I("div", { + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + "font-size": "12px", + color: "var(--fg-color,#eee)", + "line-height": "1.45", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: t[2] ||= (e) => M(v.value.ideogram.background, e.currentTarget) + }, G(v.value.ideogram.background), 9, br)])) : z("", !0), + v.value.ideogram.elements.length ? (U(), q("div", xr, [(U(!0), q(F, null, L(v.value.ideogram.elements, (e) => (U(), q("div", { + key: e.key, + style: { + border: "1px solid rgba(255,179,0,0.30)", + "border-radius": "6px", + background: "rgba(255,179,0,0.075)", + padding: "10px" + } + }, [ + I("div", Sr, [I("div", Cr, G(e.label), 1), e.bbox ? (U(), q("span", wr, " bbox " + G(e.bbox), 1)) : z("", !0)]), + e.description ? (U(), q("div", { + key: 0, + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + "font-size": "12px", + color: "var(--fg-color,#eee)", + "line-height": "1.45", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: (t) => M(e.description, t.currentTarget) + }, G(e.description), 9, Tr)) : z("", !0), + e.palette.length ? (U(), q("div", Er, [(U(!0), q(F, null, L(e.palette, (t) => (U(), q("span", { + key: `${e.key}-${t}`, + title: t, + style: K({ + width: "18px", + height: "18px", + borderRadius: "4px", + border: "1px solid rgba(255,255,255,0.28)", + background: t + }), + onClick: (e) => M(t, e.currentTarget) + }, null, 12, Dr))), 128))])) : z("", !0) + ]))), 128))])) : z("", !0), + I("details", Or, [t[13] ||= I("summary", { style: { + cursor: "pointer", + padding: "8px 10px", + "font-size": "10px", + "font-weight": "800", + color: "#FFCA28", + "text-transform": "uppercase", + "letter-spacing": "0.45px" + } }, " JSON sent to text encoder ", -1), I("pre", { + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + margin: "0", + padding: "10px", + "max-height": "260px", + overflow: "auto", + "font-size": "11px", + "line-height": "1.35", + color: "rgba(255,255,255,0.9)", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: t[3] ||= (e) => M(v.value.ideogram.json, e.currentTarget) + }, G(v.value.ideogram.json), 9, kr)]) + ], 4)) : z("", !0), + !v.value.ltxDirector && !v.value.ideogram && v.value.promptTabs.length ? (U(), q("div", { + key: 2, + style: K(h("#4CAF50", { + emphasis: !0, + startAlpha: .16, + endAlpha: .1 + })) + }, [ + I("div", Ar, G(J(m)("sidebar.generation.promptPipeline", "Prompt Pipeline ({count} variants)", { count: v.value.promptTabs.length })), 1), + I("div", jr, [(U(!0), q(F, null, L(v.value.promptTabs, (e, t) => (U(), se(n, { + key: e.label, + type: "button", + severity: "secondary", + text: "", + rounded: "", + style: K({ + appearance: "none", + border: r.value === t ? "1px solid #4CAF50" : "1px solid var(--border-color, rgba(255,255,255,0.12))", + borderRadius: "999px", + background: r.value === t ? "#4CAF5033" : "rgba(127,127,127,0.12)", + color: r.value === t ? "#4CAF50" : "var(--fg-color, #ddd)", + fontSize: "11px", + padding: "4px 10px", + cursor: "pointer", + fontWeight: r.value === t ? "700" : "500", + boxShadow: r.value === t ? "0 0 0 1px #4CAF5055 inset" : "none" + }), + onClick: (e) => r.value = t + }, { + default: V(() => [pe(G(e.label), 1)]), + _: 2 + }, 1032, ["style", "onClick"]))), 128))]), + (U(!0), q(F, null, L(v.value.promptTabs, (e, t) => ae((U(), q("div", { + key: `${e.label}-panel`, + style: { + display: "flex", + "flex-direction": "column", + gap: "8px", + border: "1px solid rgba(76, 175, 80, 0.35)", + "border-radius": "6px", + background: "linear-gradient(135deg, rgba(76, 175, 80, 0.12) 0%, rgba(33, 150, 243, 0.08) 100%)", + "box-shadow": "0 0 0 1px rgba(76, 175, 80, 0.12) inset", + padding: "10px" + } + }, [ + I("div", Mr, G(J(m)("sidebar.generation.positive", "POSITIVE")), 1), + I("div", { + style: { + "font-size": "12px", + color: "var(--fg-color, #ddd)", + "white-space": "pre-wrap", + "line-height": "1.35", + cursor: "pointer" + }, + onClick: (t) => M(e.positive, t.currentTarget) + }, G(e.positive), 9, Nr), + e.negative ? (U(), q(F, { key: 0 }, [I("div", Pr, G(J(m)("sidebar.generation.negative", "NEGATIVE")), 1), I("div", { + style: { + "font-size": "12px", + color: "var(--fg-color, #ddd)", + "white-space": "pre-wrap", + "line-height": "1.35", + cursor: "pointer" + }, + onClick: (t) => M(e.negative, t.currentTarget) + }, G(e.negative), 9, Fr)], 64)) : z("", !0) + ])), [[fe, r.value === t]])), 128)) + ], 4)) : !v.value.ltxDirector && !v.value.ideogram && v.value.positivePrompt ? (U(), q("div", { + key: 3, + style: K(h("#4CAF50", { + emphasis: !0, + startAlpha: .16, + endAlpha: .1 + })) + }, [I("div", Ir, [I("span", null, G(J(m)("sidebar.generation.positivePrompt", "Positive Prompt")), 1), v.value.positivePromptOverride ? (U(), q("span", { + key: 0, + style: K(_()), + title: J(m)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") + }, G(J(m)("sidebar.generation.override", "override")), 13, Lr)) : z("", !0)]), I("div", { + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "line-height": "1.5", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: t[4] ||= (e) => M(v.value.positivePrompt, e.currentTarget) + }, G(v.value.positivePrompt), 9, Rr)], 4)) : z("", !0), + !v.value.ltxDirector && !v.value.ideogram && !v.value.promptTabs.length && v.value.negativePrompt ? (U(), q("div", { + key: 4, + style: K(h("#F44336", { + emphasis: !0, + startAlpha: .16, + endAlpha: .1 + })) + }, [I("div", zr, [I("span", null, G(J(m)("sidebar.generation.negativePrompt", "Negative Prompt")), 1), v.value.negativePromptOverride ? (U(), q("span", { + key: 0, + style: K(_()), + title: J(m)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") + }, G(J(m)("sidebar.generation.override", "override")), 13, Br)) : z("", !0)]), I("div", { + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "line-height": "1.5", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: t[5] ||= (e) => M(v.value.negativePrompt, e.currentTarget) + }, G(v.value.negativePrompt), 9, Vr)], 4)) : z("", !0) + ], 64)) : z("", !0), + b.value ? (U(), q("div", { + key: 5, + style: { + background: "linear-gradient(135deg, rgba(0, 188, 212, 0.14) 0%, rgba(33, 150, 243, 0.10) 100%)", + border: "1px solid rgba(0, 188, 212, 0.40)", + "border-radius": "6px", + padding: "12px", + display: "flex", + "flex-direction": "column", + gap: "10px" + }, + class: me({ "mjr-ai-disabled-block": !y.value }) + }, [ + v.value.showAlignment ? (U(), q(F, { key: 0 }, [ + I("div", Hr, [I("span", { title: J(m)("sidebar.generation.promptAlignmentTooltip", "How closely the generated image matches the prompt (SigLIP2 score)") }, G(J(m)("sidebar.generation.promptAlignment", "Prompt Alignment")), 9, Ur)]), + I("div", Wr, [ + I("div", Gr, [I("div", { style: K({ + height: "100%", + width: u.value.fillWidth, + background: u.value.fillColor, + borderRadius: "4px", + transition: "width 0.6s ease, background 0.4s ease" + }) }, null, 4)]), + I("span", { style: K({ + fontSize: "13px", + fontWeight: "700", + color: u.value.scoreColor, + minWidth: "60px", + textAlign: "right", + fontFamily: "'Consolas', 'Monaco', monospace" + }) }, G(u.value.scoreText), 5), + I("span", { style: K({ + fontSize: "9px", + fontWeight: "700", + padding: "2px 6px", + borderRadius: "3px", + background: u.value.qualityBackground, + color: u.value.qualityColor, + textTransform: "uppercase", + letterSpacing: "0.5px" + }) }, G(u.value.qualityText), 5) + ]), + u.value.aiStatusVisible ? (U(), q("div", Kr, G(u.value.aiStatusText), 1)) : z("", !0) + ], 64)) : z("", !0), + I("div", qr, [I("span", { title: J(m)("sidebar.generation.aiCaptionTooltip", "AI caption generated by Florence-2") }, G(v.value.captionLabel), 9, Jr), I("div", Yr, [R(n, { + type: "button", + class: "mjr-ai-control", + severity: "secondary", + text: "", + disabled: !ee.value || l.value, + style: K([{ + border: "1px solid rgba(0,188,212,0.45)", + background: "rgba(0,188,212,0.12)", + color: "#00BCD4", + "border-radius": "4px", + "font-size": "10px", + "font-weight": "600", + padding: "2px 8px", + cursor: "pointer" + }, { + opacity: ee.value ? "1" : "0.6", + cursor: ee.value ? "pointer" : "default" + }]), + onClick: ue(ce, ["stop"]) + }, { + default: V(() => [pe(G(c.value), 1)]), + _: 1 + }, 8, ["disabled", "style"]), R(n, { + type: "button", + class: "mjr-ai-control", + severity: "secondary", + text: "", + disabled: !S.value, + style: K([{ + border: "1px solid rgba(0,188,212,0.45)", + background: "rgba(0,188,212,0.12)", + color: "#00BCD4", + "border-radius": "4px", + "font-size": "10px", + "font-weight": "600", + padding: "2px 8px", + cursor: "pointer" + }, { + opacity: S.value ? "1" : "0.6", + cursor: S.value ? "pointer" : "default" + }]), + onClick: ue(B, ["stop"]) + }, { + default: V(() => [pe(G(s.value), 1)]), + _: 1 + }, 8, ["disabled", "style"])])]), + I("div", { + title: y.value ? J(m)("sidebar.generation.copyCaptionTooltip", "Click to copy caption") : J(m)("sidebar.generation.aiCaptionDisabled", "AI caption controls are disabled"), + style: K({ + marginTop: "4px", + padding: "8px", + borderRadius: "6px", + border: "1px solid rgba(0, 188, 212, 0.30)", + background: "rgba(0, 188, 212, 0.08)", + color: "rgba(230, 250, 255, 0.95)", + fontSize: "11px", + lineHeight: "1.45", + whiteSpace: "pre-wrap", + wordBreak: "break-word", + cursor: S.value ? "copy" : "default" + }), + onClick: B + }, G(x.value), 13, Xr) + ], 2)) : z("", !0), + te.value.length ? (U(), q("div", { + key: 6, + style: K(h("#9C27B0", { + emphasis: !0, + startAlpha: .18, + endAlpha: .1 + })) + }, [I("div", Zr, G(J(m)("sidebar.generation.models", "Models")), 1), I("div", Qr, [(U(!0), q(F, null, L(te.value, (e) => (U(), q("div", { + key: `models-top-${e.key}`, + style: K(E(D(e), !0)) + }, [ + I("div", { style: K({ + fontSize: "10px", + fontWeight: "800", + color: D(e), + letterSpacing: "0.6px", + textTransform: "uppercase" + }) }, G(e.label), 5), + (U(!0), q(F, null, L(e.modelFields, (t) => (U(), q("div", { + key: `model-top-${e.key}-${t.label}`, + style: { + display: "flex", + "flex-direction": "column", + gap: "3px", + "min-width": "0" + } + }, [I("span", $r, G(t.label), 1), I("span", { + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.96))", + "line-height": "1.35", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: (e) => M(t.value, e.currentTarget) + }, G(t.value || "-"), 9, ei)]))), 128)), + e.loras.length ? (U(), q("div", ti, [t[14] ||= I("span", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.58)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "LoRA", -1), (U(!0), q(F, null, L(e.loras, (t, n) => (U(), q("span", { + key: `model-top-${e.key}-lora-${n}`, + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.92))", + "line-height": "1.35", + "word-break": "break-word", + padding: "6px 8px", + "border-radius": "6px", + background: "rgba(255,255,255,0.05)", + border: "1px solid rgba(255,255,255,0.08)", + cursor: "pointer" + }, + onClick: (e) => M(t, e.currentTarget) + }, G(t), 9, ni))), 128))])) : z("", !0) + ], 4))), 128))])], 4)) : z("", !0), + v.value.lyrics ? (U(), q("div", { + key: 7, + style: K(h("#00BCD4", { emphasis: !1 })) + }, [I("div", ri, [I("span", null, G(J(m)("sidebar.generation.lyrics", "Lyrics")), 1)]), I("div", ii, G(v.value.lyrics), 1)], 4)) : z("", !0), + v.value.branchCards.length ? (U(), q(F, { key: 8 }, [ + z("", !0), + ne.value.length ? (U(), q("div", { + key: 1, + style: K(h("#FF9800", { + emphasis: !0, + startAlpha: .16, + endAlpha: .1 + })) + }, [I("div", ai, G(J(m)("sidebar.generation.sampling", "Sampling")), 1), I("div", oi, [(U(!0), q(F, null, L(ne.value, (e) => (U(), q("div", { + key: `sampling-${e.key}`, + style: K(E(k(e), !0)) + }, [I("div", { style: K({ + fontSize: "10px", + fontWeight: "800", + color: k(e), + letterSpacing: "0.6px", + textTransform: "uppercase" + }) }, G(e.label), 5), (U(!0), q(F, null, L(e.samplingFields, (t) => (U(), q("div", { + key: `sampling-row-${e.key}-${t.label}`, + style: { + display: "grid", + "grid-template-columns": "minmax(48px,0.8fr) minmax(0,1fr)", + gap: "8px", + "font-size": "11px", + color: "rgba(255,255,255,0.72)", + "align-items": "start" + } + }, [I("span", null, G(t.label), 1), I("span", { + style: { + color: "var(--fg-color, #ddd)", + "word-break": "break-word", + "text-align": "right", + cursor: "pointer" + }, + onClick: (e) => M(t.value, e.currentTarget) + }, G(t.value), 9, si)]))), 128))], 4))), 128))])], 4)) : z("", !0), + z("", !0) + ], 64)) : v.value.modelGroups.length ? (U(), q("div", { + key: 9, + style: K(h("#9C27B0", { + emphasis: !0, + startAlpha: .18, + endAlpha: .1 + })) + }, [I("div", ci, G(J(m)("sidebar.generation.models", "Models")), 1), I("div", li, [(U(!0), q(F, null, L(v.value.modelGroups, (e) => (U(), q("div", { + key: `model-group-${e.key}`, + style: K(E(ie(e.key), !0)) + }, [ + I("div", ui, [I("div", { style: K({ + fontSize: "10px", + fontWeight: "800", + color: ie(e.key), + letterSpacing: "0.6px", + textTransform: "uppercase" + }) }, G(e.label), 5), I("span", { style: K({ + fontSize: "9px", + fontWeight: "700", + color: "#fff", + background: p(ie(e.key), .22), + border: `1px solid ${p(ie(e.key), .48)}`, + borderRadius: "999px", + padding: "2px 8px", + letterSpacing: "0.4px", + textTransform: "uppercase" + }) }, G(e.loras?.length || 0) + " LoRA ", 5)]), + I("div", di, [t[15] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.58)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, " UNet ", -1), I("div", { + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.96))", + "line-height": "1.45", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: (t) => M(e.model, t.currentTarget) + }, G(e.model || "-"), 9, fi)]), + e.loras?.length ? (U(), q("div", pi, [I("div", mi, G(J(m)("sidebar.generation.loraStack", "LoRA Stack")), 1), I("div", hi, [(U(!0), q(F, null, L(e.loras, (t, n) => (U(), q("div", { + key: `${e.key}-lora-${n}`, + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.92))", + "line-height": "1.4", + "word-break": "break-word", + padding: "6px 8px", + "border-radius": "6px", + background: "rgba(255,255,255,0.05)", + border: "1px solid rgba(255,255,255,0.08)", + cursor: "pointer" + }, + onClick: (e) => M(t, e.currentTarget) + }, G(t), 9, gi))), 128))])])) : z("", !0) + ], 4))), 128))])], 4)) : z("", !0), + (U(!0), q(F, null, L(C.value, (e) => (U(), q("div", { + key: e.key, + style: K(h(e.accent, { emphasis: e.emphasis })) + }, [I("div", { style: K({ + fontSize: "11px", + fontWeight: "600", + color: e.accent, + textTransform: "uppercase", + letterSpacing: "0.5px", + marginBottom: "10px" + }) }, G(e.title), 5), I("div", _i, [(U(!0), q(F, null, L(e.fields, (t) => (U(), q(F, { key: `${e.key}-${t.label}` }, [I("div", { + title: t.label, + style: { + "font-size": "11px", + color: "var(--mjr-muted, rgba(127,127,127,0.9))", + "font-weight": "500", + display: "flex", + "align-items": "center", + gap: "6px" + } + }, [I("span", null, G(t.label) + ":", 1), t.override ? (U(), q("span", { + key: 0, + style: K(_()), + title: J(m)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") + }, G(J(m)("sidebar.generation.override", "override")), 13, yi)) : z("", !0)], 8, vi), I("div", { + title: `${t.label}: ${t.value}`, + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.95))", + "word-break": "break-word", + "white-space": "pre-wrap", + cursor: "pointer" + }, + onClick: (e) => M(t.value, e.currentTarget) + }, G(t.value), 9, bi)], 64))), 128))])], 4))), 128)), + v.value.notesFields.length ? (U(), q("div", { + key: 10, + style: K(h("#4CAF50", { emphasis: !1 })) + }, [I("div", xi, G(J(m)("sidebar.generation.notes", "Notes")), 1), (U(!0), q(F, null, L(v.value.notesFields, (e) => (U(), q("div", { + key: e.label, + title: `${e.label}: ${e.value}`, + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "line-height": "1.5", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: (t) => M(e.value, t.currentTarget) + }, G(e.value), 9, Si))), 128))], 4)) : z("", !0), + v.value.moduleBlocks.length ? (U(), q("div", { + key: 11, + style: K(h("#26C6DA", { + emphasis: !0, + startAlpha: .14, + endAlpha: .08 + })) + }, [I("div", Ci, G(J(m)("sidebar.generation.modules", "Modules")), 1), I("div", wi, [(U(!0), q(F, null, L(v.value.moduleBlocks, (e) => (U(), q("div", { + key: `module-${e.key}-${e.title}`, + style: K(E(e.accent, !1)) + }, [I("div", { style: K({ + fontSize: "10px", + fontWeight: "800", + color: e.accent, + letterSpacing: "0.6px", + textTransform: "uppercase" + }) }, G(e.title), 5), (U(!0), q(F, null, L(e.fields, (t) => (U(), q("div", { + key: `module-${e.key}-${t.label}`, + style: { + display: "flex", + "flex-direction": "column", + gap: "3px", + "min-width": "0" + } + }, [I("span", Ti, G(t.label), 1), I("span", { + title: `${t.label}: ${t.value}`, + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "line-height": "1.35", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: (e) => M(t.value, e.currentTarget) + }, G(t.value), 9, Ei)]))), 128))], 4))), 128))])], 4)) : z("", !0), + v.value.ttsInstruction ? (U(), q("div", { + key: 12, + style: K(h("#26A69A", { emphasis: !1 })) + }, [I("div", Di, [I("span", null, G(J(m)("sidebar.generation.ttsInstruction", "TTS Instruction")), 1)]), I("div", { + title: J(m)("action.clickToCopy", "Click to copy"), + style: { + "font-size": "12px", + color: "var(--fg-color, rgba(255,255,255,0.9))", + "line-height": "1.5", + "white-space": "pre-wrap", + "word-break": "break-word", + cursor: "pointer" + }, + onClick: t[6] ||= (e) => M(v.value.ttsInstruction, e.currentTarget) + }, G(v.value.ttsInstruction), 9, Oi)], 4)) : z("", !0), + v.value.seed !== null && v.value.seed !== void 0 && v.value.seed !== "" ? (U(), q("div", { + key: 13, + style: K(g()) + }, [I("div", ki, G(J(m)("sidebar.generation.seed", "SEED")), 1), I("div", { + title: J(m)("sidebar.generation.copySeedTooltip", "Click to copy seed: {seed}", { seed: v.value.seed }), + style: { + "font-size": "18px", + "font-weight": "700", + color: "#fff", + "font-family": "'Consolas', 'Monaco', monospace", + "letter-spacing": "1px", + cursor: "pointer", + padding: "4px 8px", + "border-radius": "4px", + transition: "background 0.2s" + }, + onClick: t[7] ||= (e) => M(v.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)") + }, G(v.value.seed), 9, Ai)], 4)) : z("", !0), + v.value.inputFiles.length ? (U(), q("div", { + key: 14, + style: K(h("#4CAF50", { + emphasis: !0, + startAlpha: .16, + endAlpha: .1 + })) + }, [I("div", { + title: J(m)("tooltip.generationInputs", "Input files used in generation"), + style: { + "font-size": "11px", + "font-weight": "600", + color: "#4CAF50", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" + } + }, G(J(m)("sidebar.generation.sourceFiles", "Source Files")), 9, ji), I("div", Mi, [(U(!0), q(F, null, L(v.value.inputFiles, (e) => (U(), se(Nn, { + key: e.id, + "input-file": e + }, null, 8, ["input-file"]))), 128))])], 4)) : z("", !0) + ])); + }; + } +}), Pi = { + key: 0, + class: "mjr-sidebar-section", + style: { + background: "var(--comfy-menu-bg, rgba(0,0,0,0.2))", + border: "1px solid var(--border-color, rgba(255,255,255,0.14))", + "border-radius": "8px", + padding: "12px", + "min-width": "300px" + } +}, Fi = { style: { "margin-bottom": "12px" } }, Ii = { style: { + "font-size": "16px", + "font-weight": "800", + color: "rgba(255,255,255,0.94)", + "line-height": "1.25", + overflow: "hidden", + "text-overflow": "ellipsis" +} }, Li = ["title"], Ri = { + key: 1, + style: { + display: "flex", + "flex-wrap": "wrap", + gap: "6px", + "margin-top": "8px", + "min-width": "0" + }, + "aria-label": "Workflow metadata badges" +}, zi = ["title"], Bi = { style: { + overflow: "hidden", + "text-overflow": "ellipsis", + "white-space": "nowrap" +} }, Vi = { style: { + display: "flex", + "flex-wrap": "wrap", + gap: "8px", + "margin-bottom": "10px" +} }, Hi = { style: { + padding: "4px 9px", + "border-radius": "999px", + background: "rgba(33,150,243,0.14)", + border: "1px solid rgba(33,150,243,0.30)", + "font-size": "11px", + "font-weight": "700", + color: "#90CAF9", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, Ui = { + key: 0, + style: { + padding: "4px 9px", + "border-radius": "999px", + background: "rgba(255,255,255,0.06)", + border: "1px solid rgba(255,255,255,0.12)", + "font-size": "11px", + "font-weight": "600", + color: "rgba(255,255,255,0.82)" + } +}, Wi = { style: { + display: "grid", + "grid-template-columns": "repeat(2, minmax(0, 1fr))", + gap: "8px", + "margin-bottom": "12px" +} }, Gi = { + key: 0, + style: { + padding: "8px 10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.04)", + border: "1px solid rgba(255,255,255,0.10)" + } +}, Ki = { style: { + "font-size": "13px", + "font-weight": "750", + color: "rgba(255,255,255,0.92)", + "margin-top": "3px" +} }, qi = { + key: 1, + style: { + padding: "8px 10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.04)", + border: "1px solid rgba(255,255,255,0.10)" + } +}, Ji = { style: { + "font-size": "13px", + "font-weight": "750", + color: "rgba(255,255,255,0.92)", + "margin-top": "3px" +} }, Yi = { + key: 2, + style: { + padding: "8px 10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.04)", + border: "1px solid rgba(255,255,255,0.10)" + } +}, Xi = { style: { + "font-size": "13px", + "font-weight": "750", + color: "rgba(255,255,255,0.92)", + "margin-top": "3px" +} }, Zi = { + key: 3, + style: { + padding: "8px 10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.04)", + border: "1px solid rgba(255,255,255,0.10)" + } +}, Qi = { style: { + "font-size": "12px", + "font-weight": "650", + color: "rgba(255,255,255,0.84)", + "margin-top": "3px" +} }, $i = { + key: 0, + style: { + "font-size": "11px", + color: "rgba(255,255,255,0.54)", + "margin-top": "2px" + } +}, ea = { + key: 0, + style: { + "margin-bottom": "12px", + padding: "10px", + "border-radius": "10px", + background: "rgba(244,67,54,0.08)", + border: "1px solid rgba(244,67,54,0.25)" + } +}, ta = { + key: 1, + style: { + display: "flex", + "flex-wrap": "wrap", + gap: "5px" + } +}, na = { + key: 1, + style: { + "margin-bottom": "12px", + padding: "10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.035)", + border: "1px solid rgba(255,255,255,0.10)" + } +}, ra = { + key: 0, + style: { + "font-size": "12px", + "line-height": "1.45", + color: "rgba(255,255,255,0.82)", + "white-space": "pre-wrap" + } +}, ia = { style: { + display: "grid", + "grid-template-columns": "repeat(3, minmax(0, 1fr))", + gap: "8px", + "margin-bottom": "12px" +} }, aa = { + key: 2, + style: { + "margin-bottom": "12px", + padding: "10px", + "border-radius": "10px", + background: "rgba(76,175,80,0.07)", + border: "1px solid rgba(76,175,80,0.22)" + } +}, oa = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "8px", + "margin-bottom": "7px" +} }, sa = { style: { + "font-size": "11px", + color: "rgba(255,255,255,0.62)" +} }, ca = { + key: 0, + style: { + display: "flex", + "flex-direction": "column", + gap: "6px" + } +}, la = { + key: 0, + style: { + display: "flex", + "flex-wrap": "wrap", + gap: "5px" + } +}, ua = { + key: 1, + style: { + display: "flex", + "flex-wrap": "wrap", + gap: "5px" + } +}, da = { + key: 1, + style: { + "font-size": "12px", + color: "rgba(255,255,255,0.78)" + } +}, fa = { + key: 2, + style: { + "margin-top": "7px", + "font-size": "11px", + color: "rgba(255,255,255,0.58)" + } +}, pa = { + key: 3, + style: { + "margin-top": "8px", + "font-size": "11px", + color: "rgba(255,255,255,0.62)" + } +}, ma = { key: 0 }, ha = { style: { + display: "grid", + "grid-template-columns": "repeat(3, minmax(0, 1fr))", + gap: "8px", + "margin-bottom": "12px" +} }, ga = { style: { + padding: "8px 10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.04)", + border: "1px solid rgba(255,255,255,0.10)" +} }, _a = { style: { + "font-size": "18px", + "font-weight": "700", + color: "rgba(255,255,255,0.94)", + "margin-top": "2px" +} }, va = { style: { + padding: "8px 10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.04)", + border: "1px solid rgba(255,255,255,0.10)" +} }, ya = { style: { + "font-size": "18px", + "font-weight": "700", + color: "rgba(255,255,255,0.94)", + "margin-top": "2px" +} }, ba = { style: { + padding: "8px 10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.04)", + border: "1px solid rgba(255,255,255,0.10)" +} }, xa = { style: { + "font-size": "18px", + "font-weight": "700", + color: "rgba(255,255,255,0.94)", + "margin-top": "2px" +} }, Sa = { + key: 3, + style: { + "margin-bottom": "12px", + padding: "10px", + "border-radius": "10px", + background: "rgba(255,255,255,0.03)", + border: "1px solid rgba(255,255,255,0.10)" + } +}, Ca = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "10px", + "margin-bottom": "8px", + "min-width": "0" +} }, wa = { style: { + "min-width": "0", + flex: "1 1 auto" +} }, Ta = ["title"], Ea = ["title"], Da = { style: { + display: "flex", + gap: "8px", + "align-items": "center" +} }, Oa = ["placeholder"], ka = { + key: 4, + class: "mjr-workflow-tree-wrap" +}, Aa = { class: "mjr-workflow-tree-node" }, ja = { class: "mjr-workflow-tree-node-name" }, Ma = { + key: 0, + class: "mjr-workflow-tree-node-type" +}, Na = { class: "mjr-menu-item-hint" }, Pa = { + key: 0, + class: "mjr-section-hint" +}, Fa = { style: { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + gap: "10px", + "margin-top": "8px" +} }, Ia = { style: { + display: "flex", + "flex-wrap": "wrap", + gap: "6px", + "align-items": "center" +} }, La = { + key: 5, + style: { + display: "grid", + "grid-template-columns": "repeat(auto-fit, minmax(180px, 1fr))", + gap: "8px", + "align-items": "stretch", + "margin-top": "10px", + "margin-bottom": "10px" + } +}, Ra = { style: { + display: "flex", + "flex-direction": "column", + gap: "2px", + "min-width": "0" +} }, za = { style: { + "font-size": "13px", + "font-weight": "600" +} }, Ba = { style: { + "font-size": "11px", + color: "rgba(255,255,255,0.58)" +} }, Va = { style: { + display: "flex", + gap: "10px", + "align-items": "stretch", + "margin-top": "10px" +} }, Ha = { style: { + display: "flex", + "justify-content": "space-between", + "align-items": "center", + gap: "10px", + "margin-top": "8px", + "font-size": "11px", + color: "rgba(255,255,255,0.58)" +} }, Ua = ["open"], Wa = { style: { + background: "rgba(0,0,0,0.5)", + padding: "10px", + "border-radius": "6px", + "font-size": "11px", + overflow: "auto", + "max-height": "180px", + margin: "10px 0 0 0", + color: "#90CAF9", + "font-family": "'Consolas', 'Monaco', monospace" +} }, Ga = 1, Ka = 8, qa = 250, Ja = /* @__PURE__ */ B({ + __name: "SidebarWorkflowSection", + props: { asset: {} }, + setup(t) { + let n = t, r = Object.freeze({ + nodeColors: !0, + showLinks: !0, + showGroups: !0, + renderBypassState: !0, + renderErrorState: !0, + showViewport: !0, + showNodeLabels: !1, + size: "comfortable" + }), i = Object.freeze({ + zoom: 1, + centerX: null, + centerY: null, + hoveredNodeId: null + }), a = Object.freeze([ + { + key: "compact", + label: "Compact", + height: 120 + }, + { + key: "comfortable", + label: "Comfort", + height: 160 + }, + { + key: "expanded", + label: "Expanded", + height: 220 + } + ]), s = Y(null), c = Y(""), l = Y(!1), h = Y(!1), v = Y(null), y = Y(!1), x = Y(null), ne = Y([]), C = Y(null), w = Y(!1), T = Y(!1), D = Y(ve()), O = Y({ ...i }), re = Y("crosshair"), k = Y(""), A = null, j = null, N = null; + function P(e, t, n) { + let r = Number(e); + return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; + } + function oe(e) { + e && typeof e == "object" && (O.value = { + ...O.value, + zoom: P(e.zoom ?? O.value.zoom, Ga, Ka), + centerX: Number.isFinite(Number(e.centerX)) ? Number(e.centerX) : null, + centerY: Number.isFinite(Number(e.centerY)) ? Number(e.centerY) : null + }); + } + function B() { + O.value = { ...i }, k.value = ""; + } + function ue(e) { + let t = e?.metadata_raw ?? null; + if (!t) return null; + if (typeof t == "object") return t; + if (typeof t == "string") { + let e = t.trim(); + if (!e) return null; + try { + let t = JSON.parse(e); + return t && typeof t == "object" ? t : null; + } catch { + return null; + } + } + return null; + } + function fe(e) { + try { + let t = Object.entries(e || {}); + if (!t.length) return !1; + let n = 0; + for (let [, e] of t.slice(0, 50)) if (e && typeof e == "object" && (e.inputs && typeof e.inputs == "object" && (n += 1), n >= 2)) return !0; + } catch { + return !1; + } + return !1; + } + function he(e) { + let t = ue(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; + if (!n) return null; + if (typeof n == "object") return n; + if (typeof n == "string") { + let e = n.trim(); + if (!e) return null; + try { + return JSON.parse(e); + } catch { + return null; + } + } + return null; + } + function _e(e) { + let t = ue(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; + if (!n) return null; + if (typeof n == "object") return fe(n) ? n : null; + if (typeof n == "string") { + let e = n.trim(); + if (!e) return null; + try { + let t = JSON.parse(e); + return fe(t) ? t : null; + } catch { + return null; + } + } + return null; + } + function ve() { + try { + let e = E?.()?.workflowMinimap; + if (e && typeof e == "object") return { + ...r, + ...e + }; + } catch (e) { + console.debug?.(e); + } + try { + let e = localStorage?.getItem?.(u); + if (!e) return { ...r }; + let t = JSON.parse(e); + if (!t || typeof t != "object") return { ...r }; + let n = { + ...r, + ...t + }; + try { + let e = E(); + e.workflowMinimap = { + ...e.workflowMinimap, + ...n + }, te(e), localStorage?.removeItem?.(u); + } catch (e) { + console.debug?.(e); + } + return n; + } catch { + return { ...r }; + } + } + function ye(e) { + try { + let t = E(); + t.workflowMinimap = { + ...t.workflowMinimap, + ...e + }, te(t); + } catch (e) { + console.debug?.(e); + } + } + let X = H(() => { + let e = he(n.asset) || he(v.value), t = _e(n.asset) || _e(v.value); + return !e && !t ? null : e || M(t); + }), be = H(() => String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim()), xe = H(() => { + if (be.value.toLowerCase().endsWith(".json")) return !0; + let e = String(n.asset?.kind || "").trim().toLowerCase(), t = String(n.asset?.source || "").trim().toLowerCase(); + return e === "workflow" || t === "workflow"; + }), Se = H(() => String(n.asset?.display_name || n.asset?.name || n.asset?.filename || n.asset?.title || "Workflow").trim()), Ce = H(() => String(n.asset?.task || n.asset?.workflow_task || "").trim()), we = H(() => String(n.asset?.model_family || n.asset?.workflow_model_family || "").trim()), Te = H(() => String(n.asset?.provider || n.asset?.workflow_provider || "").trim()), Ee = H(() => String(n.asset?.runs_on || n.asset?.runsOn || "").trim().toLowerCase()), De = H(() => { + let e = Ee.value, t = Te.value; + return e === "api" && t ? `API · ${t}` : e ? t && t.toLowerCase() !== e ? `${e} · ${t}` : e : t; + }), Oe = H(() => String(n.asset?.notes || "").trim()), ke = H(() => [ + n.asset?.detected_task ? `detected: ${n.asset.detected_task}` : "", + n.asset?.detected_model_family ? n.asset.detected_model_family : "", + n.asset?.detected_provider ? n.asset.detected_provider : "" + ].filter(Boolean).join(" · ")), Ae = H(() => Ge(n.asset?.missing_nodes || n.asset?.missingNodes)), je = H(() => Ge(n.asset?.missing_models || n.asset?.missingModels)), Me = H(() => Ge(n.asset?.tags || n.asset?.workflow_tags || n.asset?.tags_json)), Ne = H(() => Me.value.slice(0, 3)), Pe = H(() => Math.max(0, Me.value.length - Ne.value.length)), Fe = H(() => Ge(x.value?.missing_nodes)), Ie = H(() => Ge(x.value?.missing_models)), Le = H(() => Ge(x.value?.warnings)), Re = H(() => { + let e = x.value; + return e ? `${Number(e.node_count || 0)} nodes | ${Number(e.subgraph_count || 0)} subgraphs | ${Array.isArray(e.required_nodes) ? e.required_nodes.length : 0} node types` : ""; + }), ze = H(() => { + let e = ne.value?.[0]; + return e ? String(e.filename || "").replace(/\.json$/i, "") : ""; + }), Be = H(() => { + let e = C.value; + return e ? `${Number(e.changed?.length || 0)} changed | ${Number(e.added?.length || 0)} added | ${Number(e.removed?.length || 0)} removed` : ""; + }), Ve = H(() => { + let e = Number(n.asset?.usage_count || n.asset?.usageCount || 0); + return !Number.isFinite(e) || e <= 0 ? "" : `${Math.floor(e)} use${e === 1 ? "" : "s"}`; + }), He = H(() => Ke(n.asset?.last_loaded_at || n.asset?.lastLoadedAt)), Ue = H(() => Ke(n.asset?.mtime || n.asset?.modified_at || n.asset?.updated_at)), We = H(() => { + let e = []; + n.asset?.favorite && e.push({ + key: "favorite", + label: "Favorite", + icon: "pi pi-star-fill", + tone: "favorite" + }), Ve.value && e.push({ + key: "usage", + label: Ve.value, + icon: "pi pi-play-circle", + tone: "usage" + }), He.value && e.push({ + key: "last-loaded", + label: `Loaded ${He.value}`, + icon: "pi pi-clock", + tone: "loaded" + }); + for (let t of Ne.value) e.push({ + key: `tag-${t}`, + label: t, + icon: "pi pi-tag", + tone: "tag" + }); + return Pe.value && e.push({ + key: "tags-more", + label: `+${Pe.value} tags`, + icon: "pi pi-tags", + tone: "tag" + }), e; + }); + function Z(e) { + let t = "display:inline-flex;align-items:center;gap:5px;max-width:100%;padding:4px 8px;border-radius:999px;font-size:10px;font-weight:750;line-height:1.1;overflow:hidden"; + return e === "favorite" ? `${t};background:rgba(255,193,7,0.15);border:1px solid rgba(255,193,7,0.34);color:#ffe082` : e === "usage" ? `${t};background:rgba(33,150,243,0.14);border:1px solid rgba(33,150,243,0.30);color:#90caf9` : e === "loaded" ? `${t};background:rgba(76,175,80,0.13);border:1px solid rgba(76,175,80,0.28);color:#a5d6a7` : `${t};background:rgba(255,255,255,0.07);border:1px solid rgba(255,255,255,0.14);color:rgba(255,255,255,0.82)`; + } + function Ge(e) { + if (Array.isArray(e)) return e.map((e) => String(e || "").trim()).filter(Boolean); + if (typeof e == "string") { + let t = e.trim(); + if (!t) return []; + try { + let e = JSON.parse(t); + if (Array.isArray(e)) return Ge(e); + } catch { + return t.split(/[,\n]/).map((e) => e.trim()).filter(Boolean); + } + } + return []; + } + function Ke(e) { + let t = Number(e); + if (!Number.isFinite(t) || t <= 0) return ""; + let n = t > 1e10 ? t : t * 1e3; + try { + return new Date(n).toLocaleString(); + } catch { + return ""; + } + } + async function qe() { + if (X.value) return; + let e = be.value; + if (e && !h.value) { + h.value = !0; + try { + let t = await _(e, { timeoutMs: 25e3 }); + if (!t?.ok) return; + let n = t?.data?.workflow || t?.workflow || null, r = t?.data?.prompt || t?.prompt || null; + if (!n && !r) return; + v.value = { + workflow: n, + prompt: r + }; + } catch (e) { + console.debug?.(e); + } finally { + h.value = !1; + } + } + } + let Je = H(() => n.asset?.has_generation_data ? "Complete" : "Partial"), Ye = H(() => X.value ? JSON.stringify(X.value, null, 2) : ""), Xe = H(() => String(n.asset?.category || n.asset?.subfolder || n.asset?.folder || "").trim().replace(/^\/+|\/+$/g, "")), Ze = H(() => Xe.value ? Xe.value.split(/[\\/]+/).filter(Boolean) : []), Qe = H(() => Ze.value.at(-1) || Xe.value || "Root"), $e = H(() => Ze.value.slice(-1)); + function et(e, t) { + let n = e?.id ?? e?.key ?? t + 1; + return String(e?.title || e?._meta?.title || e?.type || e?.class_type || e?.name || `Node ${n}`); + } + function tt(e) { + return String(e?.type || e?.class_type || e?.name || "").trim(); + } + function nt() { + c.value = Xe.value; + } + async function rt() { + if (!xe.value) return; + let e = String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim(); + if (!e) { + o(m("toast.workflowMissingPath", "Workflow file path is missing."), "error"); + return; + } + let t = String(c.value || "").trim(); + if (t !== Xe.value) { + l.value = !0; + try { + let n = await ee({ + filepath: e, + category: t + }, { timeoutMs: 3e4 }); + if (!n?.ok) { + o(n?.error || m("toast.workflowMoveFailed", "Failed to move workflow."), "error"); + return; + } + c.value = String(n?.data?.workflow?.category || t || "").trim(), o(m("toast.workflowCategoryUpdated", "Workflow category updated"), "success", 1800); + } catch { + o(m("toast.workflowMoveFailed", "Failed to move workflow."), "error"); + } finally { + l.value = !1; + } + } + } + async function it() { + let e = be.value; + if (!e) { + o(m("toast.workflowMissingPath", "Workflow file path is missing."), "error"); + return; + } + let t = await f({ + filepath: e, + limit: 12 + }, { timeoutMs: 15e3 }); + if (!t?.ok) { + o(t?.error || m("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + return; + } + let r = Array.isArray(t.data) ? t.data : []; + if (!r.length) { + o(m("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); + return; + } + let i = await dn({ + title: m("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), + workflow: n.asset, + items: r + }); + if (!i?.filepath) return; + let a = await b({ + filepath: e, + source_filepath: i.filepath + }, { timeoutMs: 3e4 }); + a?.ok ? (o(m("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-thumbnail-sidebar" } }))) : o(a?.error || m("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + } + async function at() { + if (await qe(), !X.value) o(m("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + else try { + await S.openAssets({ + assets: [{ + ...n.asset, + workflow: X.value, + Workflow: X.value + }], + index: 0, + mode: "graph" + }); + } catch (e) { + console.debug?.(e), o(m("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + } + } + async function ot() { + let t = be.value; + if (!t) o(m("toast.workflowMissingPath", "Workflow file path is missing."), "error"); + else { + y.value = !0, x.value = null, ne.value = [], C.value = null; + try { + let [n, r] = await Promise.all([e(t, { timeoutMs: 2e4 }), d(t, { timeoutMs: 15e3 })]); + if (!n?.ok) { + o(n?.error || m("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + return; + } + x.value = n.data || {}, ne.value = Array.isArray(r?.data?.versions) ? r.data.versions : []; + let i = ne.value[0]; + if (i?.filepath) { + let e = await p(t, i.filepath, { timeoutMs: 15e3 }); + e?.ok && (C.value = e.data || null); + } + } catch (e) { + console.debug?.(e), o(m("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + } finally { + y.value = !1; + } + } + } + let st = H(() => (Array.isArray(X.value?.nodes) ? X.value.nodes : []).slice(0, qa).map((e, t) => { + let n = e?.id ?? e?.key ?? t + 1, r = tt(e); + return { + key: String(n), + label: et(e, t), + icon: "pi pi-circle-fill", + data: { + id: n, + type: r + } + }; + })), ct = H(() => Math.max(0, Number(lt.value.nodes || 0) - st.value.length)), lt = H(() => { + let e = X.value; + return e ? { + nodes: Array.isArray(e?.nodes) ? e.nodes.length : 0, + links: Array.isArray(e?.links) && e.links.length || Array.isArray(e?.extra?.links) && e.extra.links.length || 0, + groups: Array.isArray(e?.groups) && e.groups.length || Array.isArray(e?.extra?.groups) && e.extra.groups.length || Array.isArray(e?.extra?.groupNodes) && e.extra.groupNodes.length || Array.isArray(e?.extra?.group_nodes) && e.extra.group_nodes.length || 0, + source: e?.extra?.synthetic ? "Synthetic" : "Embedded" + } : { + nodes: 0, + links: 0, + groups: 0, + source: "" + }; + }), ut = H(() => { + let e = String(D.value?.size || "comfortable"); + return a.find((t) => t.key === e) || a[1]; + }), dt = H(() => `${ut.value.height}px`), ft = H(() => [ + { + key: "showNodeLabels", + label: "Node Labels", + iconClass: "pi pi-tag" + }, + { + key: "nodeColors", + label: "Node Colors", + iconClass: "pi pi-palette" + }, + { + key: "showLinks", + label: "Show Links", + iconClass: "pi pi-share-alt" + }, + { + key: "showGroups", + label: "Show Frames/Groups", + iconClass: "pi pi-th-large" + }, + { + key: "renderBypassState", + label: "Render Bypass State", + iconClass: "pi pi-ban" + }, + { + key: "renderErrorState", + label: "Render Error State", + iconClass: "pi pi-exclamation-triangle" + }, + { + key: "showViewport", + label: "Show Viewport", + iconClass: "pi pi-window-maximize" + } + ]); + function Q() { + let e = s.value, t = X.value; + if (!e || !t) return; + let n = Math.max(1, e.clientWidth || 320), r = Math.max(1, e.clientHeight || 120), i = Math.max(1, Math.min(2, window.devicePixelRatio || 1)); + e.width = Math.floor(n * i), e.height = Math.floor(r * i); + let a = e.getContext("2d"); + a && a.setTransform(i, 0, 0, i, 0, 0), j = ie(e, t, { + ...D.value, + view: O.value + }) || null, oe(j?.resolvedView); + } + function pt(e) { + g(e); + } + function mt(e) { + let t = s.value; + if (!t) return null; + let n = t.getBoundingClientRect?.(); + return n ? { + x: Number(e?.clientX) - n.left, + y: Number(e?.clientY) - n.top + } : null; + } + function ht(e) { + let t = mt(e); + return !t || !j?.canvasToWorld ? null : { + local: t, + world: j.canvasToWorld(t.x, t.y) + }; + } + function gt(e) { + let t = mt(e), n = t && j?.hitTestNode ? j.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = O.value.hoveredNodeId !== null && O.value.hoveredNodeId !== void 0 ? String(O.value.hoveredNodeId) : null; + k.value = n?.label || "", r !== i && (O.value = { + ...O.value, + hoveredNodeId: r + }, Q()); + } + function _t(e) { + e && (pt(e), O.value = { + ...O.value, + centerX: Number(e.x), + centerY: Number(e.y) + }, Q()); + } + function vt(e) { + if (Number(e?.button ?? 0) !== 0) return; + let t = ht(e); + t && (N = e.pointerId ?? 1, re.value = "grabbing", s.value?.setPointerCapture?.(N), _t(t.world), gt(e), e.preventDefault?.(), e.stopPropagation?.()); + } + function yt(e) { + if (N !== null && e.pointerId === N) { + let t = ht(e); + t && _t(t.world), e.preventDefault?.(), e.stopPropagation?.(); + } else gt(e); + } + function bt(e) { + N !== null && e?.pointerId === N && (s.value?.releasePointerCapture?.(N), N = null, re.value = "crosshair"), e?.type === "pointerleave" && (k.value = "", O.value.hoveredNodeId !== null && (O.value = { + ...O.value, + hoveredNodeId: null + }, Q())); + } + function xt(e) { + let t = ht(e), n = j?.resolvedView; + if (!t || !n) return; + let r = P(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = P((Number(O.value.zoom) || 1) * i, Ga, Ka); + if (Math.abs(a - (Number(O.value.zoom) || 1)) < .001) { + e.preventDefault?.(), e.stopPropagation?.(); + return; + } + let o = Math.max(1, Number(j?.bounds?.width || 1) / a), s = Math.max(1, Number(j?.bounds?.height || 1) / a), c = P((Number(t.world.x) - Number(n.viewMinX || 0)) / Math.max(1, Number(n.visibleW || 1)), 0, 1), l = P((Number(t.world.y) - Number(n.viewMinY || 0)) / Math.max(1, Number(n.visibleH || 1)), 0, 1); + O.value = { + ...O.value, + zoom: a, + centerX: Number(t.world.x) + (.5 - c) * o, + centerY: Number(t.world.y) + (.5 - l) * s + }, Q(), gt(e), e.preventDefault?.(), e.stopPropagation?.(); + } + function St(e) { + let t = ht(e); + B(), t && pt(t.world), Q(), e.preventDefault?.(), e.stopPropagation?.(); + } + function Ct(e) { + D.value = { + ...D.value, + [e]: !D.value?.[e] + }, ye(D.value); + } + function wt(e) { + a.some((t) => t.key === e) && (D.value = { + ...D.value, + size: e + }, ye(D.value)); + } + return ce(() => { + s.value && typeof ResizeObserver == "function" && (A = new ResizeObserver(() => Q()), A.observe(s.value)), nt(), qe(), Q(); + }), W(X, () => { + B(), Q(); + }, { flush: "post" }), W(be, () => { + v.value = null, qe(); + }, { immediate: !0 }), W(Xe, () => { + nt(); + }), W(D, () => { + Q(); + }, { + deep: !0, + flush: "post" + }), W(w, () => { + Q(); + }, { flush: "post" }), de(() => { + try { + A?.disconnect?.(); + } catch (e) { + console.debug?.(e); + } + A = null, N = null; + }), (e, t) => { + let n = le("MButton"), r = le("MTree"); + return X.value ? (U(), q("div", Pi, [ + t[18] ||= I("div", { style: { + "font-size": "13px", + "font-weight": "600", + color: "var(--fg-color, #eaeaea)", + "margin-bottom": "12px", + "text-transform": "uppercase", + "letter-spacing": "0.5px" + } }, " ComfyUI Workflow ", -1), + I("div", Fi, [ + I("div", Ii, G(Se.value), 1), + be.value ? (U(), q("div", { + key: 0, + style: { + "font-size": "11px", + color: "rgba(255,255,255,0.48)", + "margin-top": "4px", + overflow: "hidden", + "text-overflow": "ellipsis", + "white-space": "nowrap" + }, + title: be.value + }, G(be.value), 9, Li)) : z("", !0), + We.value.length ? (U(), q("div", Ri, [(U(!0), q(F, null, L(We.value, (e) => (U(), q("span", { + key: e.key, + style: K(Z(e.tone)), + title: e.label + }, [I("i", { + class: me(e.icon), + style: { + "font-size": "10px", + flex: "0 0 auto" + } + }, null, 2), I("span", Bi, G(e.label), 1)], 12, zi))), 128))])) : z("", !0) + ]), + I("div", Vi, [I("div", Hi, G(Je.value), 1), lt.value.source ? (U(), q("div", Ui, G(lt.value.source), 1)) : z("", !0)]), + I("div", Wi, [ + Ce.value ? (U(), q("div", Gi, [t[3] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Task", -1), I("div", Ki, G(Ce.value), 1)])) : z("", !0), + we.value ? (U(), q("div", qi, [t[4] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Model", -1), I("div", Ji, G(we.value), 1)])) : z("", !0), + De.value ? (U(), q("div", Yi, [t[5] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Runs on", -1), I("div", Xi, G(De.value), 1)])) : z("", !0), + Ve.value || Ue.value ? (U(), q("div", Zi, [ + t[6] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Library", -1), + I("div", Qi, G(Ve.value || Ue.value), 1), + Ve.value && Ue.value ? (U(), q("div", $i, G(Ue.value), 1)) : z("", !0) + ])) : z("", !0) + ]), + Ae.value.length || je.value.length ? (U(), q("div", ea, [ + t[7] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "800", + color: "#ef9a9a", + "text-transform": "uppercase", + "letter-spacing": "0.4px", + "margin-bottom": "6px" + } }, "Missing dependencies", -1), + Ae.value.length ? (U(), q("div", { + key: 0, + style: K({ + display: "flex", + flexWrap: "wrap", + gap: "5px", + marginBottom: je.value.length ? "7px" : "0" + }) + }, [(U(!0), q(F, null, L(Ae.value, (e) => (U(), q("span", { + key: `node-${e}`, + style: { + padding: "3px 7px", + "border-radius": "999px", + background: "rgba(244,67,54,0.16)", + "font-size": "10px", + "font-weight": "700", + color: "#ffcdd2" + } + }, G(e), 1))), 128))], 4)) : z("", !0), + je.value.length ? (U(), q("div", ta, [(U(!0), q(F, null, L(je.value, (e) => (U(), q("span", { + key: `model-${e}`, + style: { + padding: "3px 7px", + "border-radius": "999px", + background: "rgba(255,152,0,0.16)", + "font-size": "10px", + "font-weight": "700", + color: "#ffe0b2" + } + }, G(e), 1))), 128))])) : z("", !0) + ])) : z("", !0), + Oe.value || ke.value ? (U(), q("div", na, [Oe.value ? (U(), q("div", ra, G(Oe.value), 1)) : z("", !0), ke.value ? (U(), q("div", { + key: 1, + style: K({ + fontSize: "11px", + color: "rgba(255,255,255,0.48)", + marginTop: Oe.value ? "7px" : "0" + }) + }, G(ke.value), 5)) : z("", !0)])) : z("", !0), + I("div", ia, [ + R(n, { + type: "button", + severity: "secondary", + text: "", + rounded: "", + style: { + height: "34px", + "border-radius": "9px", + border: "1px solid rgba(255,255,255,0.12)", + background: "rgba(33,150,243,0.14)", + color: "rgba(255,255,255,0.92)", + "font-size": "12px", + "font-weight": "750", + display: "inline-flex", + "align-items": "center", + "justify-content": "center", + gap: "7px" + }, + onClick: it + }, { + default: V(() => [t[8] ||= I("i", { class: "pi pi-image" }, null, -1), I("span", null, G(J(m)("ctx.setWorkflowThumbnail", "Set workflow thumbnail")), 1)]), + _: 1 + }), + R(n, { + type: "button", + severity: "secondary", + text: "", + rounded: "", + style: { + height: "34px", + "border-radius": "9px", + border: "1px solid rgba(255,255,255,0.12)", + background: "rgba(255,255,255,0.06)", + color: "rgba(255,255,255,0.92)", + "font-size": "12px", + "font-weight": "750", + display: "inline-flex", + "align-items": "center", + "justify-content": "center", + gap: "7px" + }, + onClick: at + }, { + default: V(() => [t[9] ||= I("i", { class: "pi pi-search" }, null, -1), I("span", null, G(J(m)("ctx.inspect", "Inspect")), 1)]), + _: 1 + }), + R(n, { + type: "button", + severity: "secondary", + text: "", + rounded: "", + disabled: y.value, + style: { + height: "34px", + "border-radius": "9px", + border: "1px solid rgba(255,255,255,0.12)", + background: "rgba(76,175,80,0.12)", + color: "rgba(255,255,255,0.92)", + "font-size": "12px", + "font-weight": "750", + display: "inline-flex", + "align-items": "center", + "justify-content": "center", + gap: "7px" + }, + onClick: ot + }, { + default: V(() => [I("i", { class: me(y.value ? "pi pi-spin pi-spinner" : "pi pi-check-circle") }, null, 2), I("span", null, G(y.value ? "Checking" : "Validate"), 1)]), + _: 1 + }, 8, ["disabled"]) + ]), + x.value ? (U(), q("div", aa, [ + I("div", oa, [t[10] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "800", + color: "#a5d6a7", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Workflow diagnostics", -1), I("div", sa, G(Re.value), 1)]), + Fe.value.length || Ie.value.length ? (U(), q("div", ca, [Fe.value.length ? (U(), q("div", la, [(U(!0), q(F, null, L(Fe.value, (e) => (U(), q("span", { + key: `diag-node-${e}`, + style: { + padding: "3px 7px", + "border-radius": "999px", + background: "rgba(244,67,54,0.16)", + "font-size": "10px", + "font-weight": "700", + color: "#ffcdd2" + } + }, " Missing node: " + G(e), 1))), 128))])) : z("", !0), Ie.value.length ? (U(), q("div", ua, [(U(!0), q(F, null, L(Ie.value, (e) => (U(), q("span", { + key: `diag-model-${e}`, + style: { + padding: "3px 7px", + "border-radius": "999px", + background: "rgba(255,152,0,0.16)", + "font-size": "10px", + "font-weight": "700", + color: "#ffe0b2" + } + }, " Missing model: " + G(e), 1))), 128))])) : z("", !0)])) : (U(), q("div", da, " No missing dependencies detected by the current ComfyUI runtime. ")), + Le.value.length ? (U(), q("div", fa, G(Le.value.join(" | ")), 1)) : z("", !0), + ze.value || Be.value ? (U(), q("div", pa, [pe(" Latest version: " + G(ze.value || "none"), 1), Be.value ? (U(), q("span", ma, " | Diff: " + G(Be.value), 1)) : z("", !0)])) : z("", !0) + ])) : z("", !0), + I("div", ha, [ + I("div", ga, [t[11] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Nodes", -1), I("div", _a, G(lt.value.nodes), 1)]), + I("div", va, [t[12] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Links", -1), I("div", ya, G(lt.value.links), 1)]), + I("div", ba, [t[13] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Groups", -1), I("div", xa, G(lt.value.groups), 1)]) + ]), + xe.value ? (U(), q("div", Sa, [I("div", Ca, [I("div", wa, [t[14] ||= I("div", { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" + } }, "Category", -1), I("div", { + title: Xe.value || "Root", + style: { + "font-size": "12px", + color: "rgba(255,255,255,0.8)", + "margin-top": "2px", + overflow: "hidden", + "text-overflow": "ellipsis", + "white-space": "nowrap", + "max-width": "100%" + } + }, G(Qe.value), 9, Ta)]), $e.value.length ? (U(), q("div", { + key: 0, + title: Xe.value, + style: { + display: "flex", + "flex-wrap": "wrap", + gap: "4px", + "justify-content": "flex-end", + "min-width": "0", + "max-width": "45%" + } + }, [(U(!0), q(F, null, L($e.value, (e) => (U(), q("span", { + key: e, + style: { + padding: "3px 7px", + "border-radius": "999px", + background: "rgba(33,150,243,0.12)", + border: "1px solid rgba(33,150,243,0.22)", + "font-size": "10px", + "font-weight": "700", + color: "#90CAF9", + "text-transform": "uppercase", + "letter-spacing": "0.3px", + "max-width": "100%", + overflow: "hidden", + "text-overflow": "ellipsis", + "white-space": "nowrap" + } + }, G(e), 1))), 128))], 8, Ea)) : z("", !0)]), I("div", Da, [ae(I("input", { + "onUpdate:modelValue": t[0] ||= (e) => c.value = e, + type: "text", + placeholder: J(m)("dialog.workflowCategory", "Workflow category"), + style: { + flex: "1", + "min-width": "0", + padding: "9px 10px", + "border-radius": "8px", + border: "1px solid rgba(255,255,255,0.12)", + background: "rgba(0,0,0,0.22)", + color: "rgba(255,255,255,0.92)", + "font-size": "12px" + } + }, null, 8, Oa), [[ge, c.value]]), R(n, { + type: "button", + severity: "secondary", + text: "", + rounded: "", + disabled: l.value, + style: K({ + padding: "8px 12px", + borderRadius: "8px", + border: "1px solid rgba(255,255,255,0.12)", + background: l.value ? "rgba(255,255,255,0.06)" : "rgba(33,150,243,0.16)", + color: "rgba(255,255,255,0.92)", + cursor: l.value ? "wait" : "pointer", + fontSize: "12px", + fontWeight: "700", + whiteSpace: "nowrap" + }), + onClick: rt + }, { + default: V(() => [pe(G(l.value ? "Saving..." : "Move"), 1)]), + _: 1 + }, 8, ["disabled", "style"])])])) : z("", !0), + st.value.length ? (U(), q("div", ka, [ + t[15] ||= I("div", { class: "mjr-section-title" }, " Workflow Nodes ", -1), + R(r, { + value: st.value, + class: "mjr-workflow-tree", + "scroll-height": "180px", + pt: { + wrapper: { class: "mjr-workflow-tree-scroll" }, + rootChildren: { class: "mjr-workflow-tree-list" }, + nodeContent: { class: "mjr-workflow-tree-node-content" }, + nodeToggleButton: { class: "mjr-workflow-tree-toggle" }, + nodeIcon: { class: "mjr-workflow-tree-icon" }, + nodeLabel: { class: "mjr-workflow-tree-label" } + } + }, { + default: V(({ node: e }) => [I("span", Aa, [ + I("span", ja, G(e.label), 1), + e.data?.type ? (U(), q("span", Ma, G(e.data.type), 1)) : z("", !0), + I("span", Na, "#" + G(e.data?.id), 1) + ])]), + _: 1 + }, 8, ["value"]), + ct.value ? (U(), q("div", Pa, " +" + G(ct.value) + " more nodes ", 1)) : z("", !0) + ])) : z("", !0), + I("div", Fa, [I("div", Ia, [(U(!0), q(F, null, L(J(a), (e) => (U(), se(n, { + key: e.key, + type: "button", + severity: "secondary", + text: "", + rounded: "", + title: `${e.label} minimap`, + style: K({ + appearance: "none", + border: D.value.size === e.key ? "1px solid rgba(33,150,243,0.55)" : "1px solid rgba(255,255,255,0.12)", + borderRadius: "999px", + padding: "4px 10px", + background: D.value.size === e.key ? "rgba(33,150,243,0.18)" : "rgba(255,255,255,0.04)", + color: D.value.size === e.key ? "#90CAF9" : "rgba(255,255,255,0.78)", + fontSize: "11px", + fontWeight: D.value.size === e.key ? "700" : "600", + cursor: "pointer" + }), + onClick: (t) => wt(e.key) + }, { + default: V(() => [pe(G(e.label), 1)]), + _: 2 + }, 1032, [ + "title", + "style", + "onClick" + ]))), 128))]), R(n, { + type: "button", + class: "mjr-btn mjr-icon-btn", + severity: "secondary", + text: "", + rounded: "", + title: J(m)("tooltip.minimapSettings", "Minimap settings"), + style: { + width: "28px", + height: "28px", + "border-radius": "8px", + display: "inline-flex", + "align-items": "center", + "justify-content": "center", + border: "1px solid var(--mjr-border, rgba(255,255,255,0.12))", + background: "rgba(255,255,255,0.06)", + color: "rgba(255,255,255,0.9)", + cursor: "pointer" + }, + onClick: t[1] ||= (e) => w.value = !w.value + }, { + default: V(() => [...t[16] ||= [I("i", { class: "pi pi-sliders-h" }, null, -1)]]), + _: 1 + }, 8, ["title"])]), + w.value ? (U(), q("div", La, [(U(!0), q(F, null, L(ft.value, (e) => (U(), se(n, { + key: e.key, + type: "button", + severity: "secondary", + text: "", + style: K({ + display: "flex", + alignItems: "center", + gap: "10px", + padding: "9px 10px", + borderRadius: "10px", + border: D.value?.[e.key] ? "1px solid rgba(76,175,80,0.40)" : "1px solid rgba(255,255,255,0.12)", + background: D.value?.[e.key] ? "rgba(76,175,80,0.10)" : "rgba(255,255,255,0.04)", + cursor: "pointer", + color: "rgba(255,255,255,0.92)", + textAlign: "left" + }), + onClick: (t) => Ct(e.key) + }, { + default: V(() => [ + I("span", { style: K({ + width: "22px", + height: "22px", + borderRadius: "6px", + display: "inline-flex", + alignItems: "center", + justifyContent: "center", + background: D.value?.[e.key] ? "rgba(76,175,80,0.95)" : "rgba(255,255,255,0.08)", + border: D.value?.[e.key] ? "1px solid rgba(76,175,80,0.35)" : "1px solid rgba(255,255,255,0.12)", + flex: "0 0 auto" + }) }, [I("i", { + class: "pi pi-check", + style: K({ + fontSize: "12px", + opacity: D.value?.[e.key] ? "1" : "0" + }) + }, null, 4)], 4), + I("i", { + class: me(e.iconClass), + style: { + "font-size": "18px", + opacity: "0.9", + width: "18px" + } + }, null, 2), + I("div", Ra, [I("div", za, G(e.label), 1), I("div", Ba, G(D.value?.[e.key] ? "On" : "Off"), 1)]) + ]), + _: 2 + }, 1032, ["style", "onClick"]))), 128))])) : z("", !0), + I("div", Va, [I("canvas", { + ref_key: "canvasRef", + ref: s, + style: K({ + width: "100%", + height: dt.value, + cursor: re.value, + touchAction: "none", + borderRadius: "10px", + marginTop: "0", + background: "linear-gradient(180deg, rgba(7, 12, 18, 0.95) 0%, rgba(10, 16, 24, 0.92) 100%)", + border: "1px solid var(--mjr-border, rgba(255,255,255,0.12))", + boxShadow: "inset 0 0 0 1px rgba(255,255,255,0.03)" + }), + onPointerdown: vt, + onPointermove: yt, + onPointerup: bt, + onPointercancel: bt, + onPointerleave: bt, + onWheel: xt, + onDblclick: St + }, null, 36)]), + I("div", Ha, [I("span", null, G(k.value || "Click/drag to navigate | wheel to zoom"), 1), I("span", null, G(Math.round((O.value.zoom || 1) * 100)) + "% | " + G(ut.value.label), 1)]), + I("details", { + open: T.value, + style: { "margin-top": "10px" }, + onToggle: t[2] ||= (e) => T.value = e.target.open + }, [t[17] ||= I("summary", { style: { + cursor: "pointer", + color: "var(--mjr-muted, rgba(255,255,255,0.65))", + "font-size": "12px", + "user-select": "none" + } }, " Show raw JSON ", -1), I("pre", Wa, G(Ye.value), 1)], 40, Ua) + ])) : z("", !0); + }; + } +}), Ya = [ + "aria-busy", + "aria-disabled", + "aria-label", + "aria-valuenow", + "tabindex" +], Xa = /* @__PURE__ */ B({ + __name: "RatingEditor", + props: { + asset: {}, + modelValue: {}, + disabled: { type: Boolean }, + size: {} + }, + emits: ["update:modelValue", "rating-change"], + setup(e, { emit: t }) { + function n(e) { + return Math.max(0, Math.min(5, Number(e) || 0)); + } + let r = e, i = t, s = n(r.asset?.rating ?? r.modelValue), c = Y(s), l = Y(0), u = Y(!1), d = s, f = s, p = null, h = H(() => l.value > 0 ? l.value : c.value), g = (e) => e <= h.value ? "#FFD45A" : "#555", _ = (e) => e <= h.value ? "scale(1.1)" : "scale(1)", v = H(() => { + let e = r.size; + return typeof e == "number" ? `${Math.max(8, e)}px` : String(e || "").trim() || "16px"; + }), b = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), x = (e) => new Promise((t) => setTimeout(t, e)); + function ee(e) { + if (u.value) return; + let t = n(e); + d = t, f = t, t !== c.value && (c.value = t); + } + function S(e = null) { + c.value = d, f = d, i("update:modelValue", d), e && o(e, "error"); + } + async function te() { + if (u.value) return; + u.value = !0; + let e = Date.now(); + try { + let t = 0; + for (; t < 10;) { + if (Date.now() - e > 3e4) { + S(m("toast.ratingUpdateFailed", "Rating update failed")); + break; + } + t > 0 && await x(b(t)), t += 1; + let s = n(f), l = typeof AbortController < "u" ? new AbortController() : null; + p = l; + let u = null; + try { + u = await a(r.asset, s, l ? { signal: l.signal } : {}); + } catch (e) { + console.error("Failed to update rating:", e); + } + if (!u?.ok) { + if (u?.code === "ABORTED" && f !== s) continue; + S(u?.error || m("toast.ratingUpdateFailed", "Rating update failed")); + break; + } + try { + let e = u?.data?.asset_id ?? null; + e != null && !y(r.asset.id) && (r.asset.id = e); + } catch (e) { + console.debug?.(e); + } + d = s, c.value = s; + try { + r.asset.rating = s; + } catch (e) { + console.debug?.(e); + } + if (i("update:modelValue", s), i("rating-change", { + assetId: r.asset?.id, + rating: s + }), ne(P, { + assetId: r.asset?.id == null ? "" : String(r.asset.id), + rating: s + }), f === s) { + o(m("toast.ratingSetN", { n: s }), "success", 1e3); + break; + } + } + t >= 10 && S(m("toast.ratingUpdateFailed", "Rating update failed")); + } finally { + p = null, u.value = !1; + } + } + function C(e) { + if (r.disabled) return; + let t = n(e); + f = t, c.value = t, l.value = 0, i("update:modelValue", t); + try { + p?.abort?.(); + } catch (e) { + console.debug?.(e); + } + te(); + } + function w(e) { + C(e); + } + function T(e) { + r.disabled || (l.value = e); + } + function E() { + l.value = 0; + } + function D(e) { + if (r.disabled) return; + let t = null; + switch (e.key) { + case "ArrowRight": + case "ArrowUp": + e.preventDefault(), t = Math.min(5, c.value + 1); + break; + case "ArrowLeft": + case "ArrowDown": + e.preventDefault(), t = Math.max(0, c.value - 1); + break; + case "Home": + e.preventDefault(), t = 0; + break; + case "End": + e.preventDefault(), t = 5; + break; + default: e.key >= "0" && e.key <= "5" && (e.preventDefault(), t = parseInt(e.key, 10)); + } + t !== null && t !== c.value && C(t); + } + return de(() => { + try { + p?.abort?.(); + } catch (e) { + console.debug?.(e); + } + }), W(() => r.modelValue, (e) => { + ee(e); + }), W(() => r.asset?.rating, (e) => { + ee(e); + }), (t, n) => { + let r = le("MButton"); + return U(), q("div", { + class: "mjr-rating-editor", + style: K({ + display: "inline-flex", + gap: "2px", + pointerEvents: e.disabled ? "none" : "auto", + opacity: e.disabled ? .6 : 1 + }), + "aria-busy": u.value, + "aria-disabled": e.disabled, + role: "slider", + "aria-label": J(m)("rating.label", "Rating"), + "aria-valuemin": 0, + "aria-valuemax": 5, + "aria-valuenow": c.value, + tabindex: e.disabled ? -1 : 0, + onKeydown: D + }, [(U(), q(F, null, L(5, (t) => R(r, { + key: t, + type: "button", + class: "mjr-rating-star", + severity: "secondary", + text: "", + rounded: "", + style: K({ + color: g(t), + transform: _(t), + fontSize: v.value, + background: "none", + border: "none", + cursor: e.disabled ? "default" : "pointer", + padding: "0", + transition: "all 0.15s ease" + }), + "aria-label": J(m)("rating.setN", { n: t }), + "aria-pressed": t <= c.value, + disabled: e.disabled, + onClick: (e) => w(t), + onMouseenter: (e) => T(t), + onMouseleave: E + }, { + default: V(() => [...n[0] ||= [pe(" ★ ", -1)]]), + _: 1 + }, 8, [ + "style", + "aria-label", + "aria-pressed", + "disabled", + "onClick", + "onMouseenter" + ])), 64))], 44, Ya); + }; + } +}), Za = ["aria-busy"], Qa = ["aria-label"], $a = { + key: 0, + class: "mjr-tags-empty" +}, eo = { class: "mjr-tags-input-wrap" }, to = ["aria-selected", "onMouseenter"], no = 100, ro = 200, io = /* @__PURE__ */ B({ + __name: "TagsEditor", + props: { + asset: {}, + modelValue: { default: void 0 }, + disabled: { + type: Boolean, + default: !1 + }, + autofocus: { + type: Boolean, + default: !0 + } + }, + emits: ["update:modelValue", "tags-change"], + setup(e, { emit: n }) { + function r(e) { + try { + let t = String(e ?? "").trim(); + if (!t || t.length > no) return null; + for (let e = 0; e < t.length; e += 1) { + let n = t.charCodeAt(e); + if (n <= 31 || n === 127) return null; + } + return /[;,]/.test(t) ? null : t; + } catch { + return null; + } + } + function i(e) { + try { + return String(e ?? "").replace(/[\x00-\x1f\x7f]/g, "").trim() || null; + } catch { + return null; + } + } + function a(e) { + let t = i(e); + return t ? t.toLowerCase() : ""; + } + function s(e) { + let t = [], n = /* @__PURE__ */ new Set(); + for (let r of Array.isArray(e) ? e : []) { + let e = i(r); + if (!e) continue; + let a = e.toLowerCase(); + if (!n.has(a) && (n.add(a), t.push(e), t.length >= ro)) break; + } + return t; + } + function c(e) { + if (Array.isArray(e)) return s(e); + if (typeof e == "string") { + let t = e.trim(); + if (!t) return []; + try { + let e = JSON.parse(t); + if (Array.isArray(e)) return s(e); + } catch { + return s(t.split(",")); + } + } + return []; + } + function l(e, t) { + if (!Array.isArray(e) || !Array.isArray(t) || e.length !== t.length) return !1; + for (let n = 0; n < e.length; n += 1) if (e[n] !== t[n]) return !1; + return !0; + } + let u = e, d = n, f = c(u.asset?.tags ?? u.modelValue ?? []), p = Y([...f]), g = Y(null), _ = Y(""), v = Y(!1), b = Y(-1), x = Y(null), ee = Y([]), S = Y(!1), te = (e) => e?.$el || e || null, C = !1, w = !1, T = null, E = [...f], D = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), O = (e) => new Promise((t) => setTimeout(t, e)), re = () => setTimeout(() => v.value = !1, 200), k = H(() => { + let e = _.value.toLowerCase().trim(); + if (!e) return []; + let t = new Set(p.value.map((e) => a(e)).filter(Boolean)); + return ee.value.filter((n) => { + let r = a(n); + return n.toLowerCase().includes(e) && (!r || !t.has(r)); + }).slice(0, 10); + }), A = H(() => k.value.length > 0); + function j(e) { + if (C) return; + let t = c(e); + E = [...t], l(t, p.value) || (p.value = [...t]); + } + function ie(e) { + let t = [...e], n = u.asset?.id == null ? "" : String(u.asset.id); + d("update:modelValue", t), d("tags-change", { + assetId: u.asset?.id, + tags: t + }), ne(N, { + assetId: n, + tags: t + }); + } + async function M() { + if (u.disabled) return; + if (C) { + w = !0; + try { + T?.abort?.(); + } catch (e) { + console.debug?.(e); + } + return; + } + C = !0, S.value = !0; + let e = 0; + for (; e < 10;) { + e > 0 && await O(D(e)), e += 1; + let n = c(p.value), r = typeof AbortController < "u" ? new AbortController() : null; + T = r; + let i = null; + try { + i = await t(u.asset, n, r ? { signal: r.signal } : {}); + } catch (e) { + console.error("Failed to update tags:", e); + } + if (!i?.ok) { + if (i?.code === "ABORTED") { + if (w) { + w = !1; + continue; + } + break; + } + let e = [...E]; + p.value = e, d("update:modelValue", e), o(i?.error || m("toast.tagsUpdateFailed", "Failed to update tags"), "error"), C = !1, T = null, S.value = !1; + return; + } + try { + let e = i?.data?.asset_id ?? null; + e != null && !y(u.asset.id) && (u.asset.id = e); + } catch (e) { + console.debug?.(e); + } + let a = c(Array.isArray(i?.data?.tags) ? i.data.tags : n); + E = [...a]; + try { + u.asset.tags = [...a]; + } catch (e) { + console.debug?.(e); + } + if (w || (p.value = [...a]), ie(a), o(m("toast.tagsUpdated", "Tags updated"), "success", 1e3), !w) break; + w = !1; + } + if (e >= 10) { + let e = [...E]; + p.value = e; + try { + u.asset.tags = [...e]; + } catch (e) { + console.debug?.(e); + } + d("update:modelValue", e), o(m("toast.tagsUpdateFailed", "Failed to update tags"), "error"); + } + C = !1, T = null, S.value = !1; + } + ce(async () => { + try { + await oe(), u.autofocus && te(g.value)?.focus(); + } catch (e) { + console.debug?.(e); + } + try { + let e = await h(); + e?.ok && Array.isArray(e?.data) && (ee.value = s(e.data)); + } catch (e) { + console.warn("Failed to load available tags:", e); + } + }), de(() => { + try { + T?.abort?.(); + } catch (e) { + console.debug?.(e); + } + }); + function P(e) { + if (u.disabled) return; + let t = r(e); + if (!t) return; + let n = a(t); + n && (p.value.some((e) => a(e) === n) || (p.value.length >= ro ? o(m("toast.maxTagsReached", "Maximum number of tags reached"), "warning") : (p.value = [...p.value, t], M()))); + } + function se(e) { + if (u.disabled || e < 0 || e >= p.value.length) return; + let t = [...p.value]; + t.splice(e, 1), p.value = t, M(); + } + function z(e) { + if (e.key === "Enter" || e.key === ",") { + e.preventDefault(); + let t = (v.value && A.value && b.value >= 0 ? k.value[b.value] : null) || _.value.trim(); + t && (P(t), _.value = "", v.value = !1, b.value = -1, x.value = null); + } else if (e.key === "Escape") v.value = !1, b.value = -1, x.value = null; + else if (e.key === "ArrowDown") e.preventDefault(), A.value && (b.value = Math.min(b.value + 1, k.value.length - 1)); + else if (e.key === "ArrowUp") e.preventDefault(), b.value = Math.max(b.value - 1, 0); + else if (e.key === "Tab" && A.value) { + e.preventDefault(); + let t = k.value[b.value] || k.value[0]; + t && (_.value = t); + } + } + function B(e) { + P(e), _.value = "", v.value = !1, b.value = -1, x.value = null, te(g.value)?.focus(); + } + function ue(e) { + let t = e?.value ?? x.value; + t && B(t); + } + return W(() => u.modelValue, (e) => { + j(e); + }), W(() => u.asset?.tags, (e) => { + j(e); + }), (t, n) => { + let r = le("MButton"), i = le("MInputText"), a = le("MListbox"); + return U(), q("div", { + class: me(["mjr-tags-editor", { "is-disabled": e.disabled }]), + "aria-busy": S.value + }, [I("div", { + class: "mjr-tags-display", + role: "list", + "aria-label": J(m)("tags.label", "Tags") + }, [p.value.length === 0 ? (U(), q("span", $a, G(J(m)("msg.noTagsYet", "No tags yet...")), 1)) : (U(!0), q(F, { key: 1 }, L(p.value, (t, i) => (U(), q("div", { + key: t, + class: "mjr-tag-chip", + role: "listitem" + }, [pe(G(t) + " ", 1), R(r, { + type: "button", + class: "mjr-tag-chip-remove", + severity: "secondary", + text: "", + rounded: "", + "aria-label": J(m)("tags.remove", "Remove tag"), + disabled: e.disabled, + onClick: (e) => se(i) + }, { + default: V(() => [...n[4] ||= [pe(" x ", -1)]]), + _: 1 + }, 8, [ + "aria-label", + "disabled", + "onClick" + ])]))), 128))], 8, Qa), I("div", eo, [R(i, { + ref_key: "inputRef", + ref: g, + modelValue: _.value, + "onUpdate:modelValue": n[0] ||= (e) => _.value = e, + type: "text", + class: "mjr-tag-input", + placeholder: J(m)("sidebar.addTag", "Add tag..."), + disabled: e.disabled, + "aria-label": J(m)("tags.addLabel", "Add tag"), + "aria-autocomplete": A.value ? "list" : "none", + "aria-expanded": v.value, + "aria-haspopup": A.value ? "listbox" : void 0, + onFocus: n[1] ||= (e) => v.value = _.value.length > 0, + onInput: n[2] ||= (e) => v.value = _.value.length > 0, + onKeydown: z, + onBlur: re + }, null, 8, [ + "modelValue", + "placeholder", + "disabled", + "aria-label", + "aria-autocomplete", + "aria-expanded", + "aria-haspopup" + ]), ae(R(a, { + modelValue: x.value, + "onUpdate:modelValue": n[3] ||= (e) => x.value = e, + options: k.value, + class: "mjr-tags-dropdown", + "scroll-height": "150px", + "aria-label": J(m)("tags.suggestions", "Tag suggestions"), + onChange: ue + }, { + option: V(({ option: e, index: t }) => [I("div", { + class: me(["mjr-tag-suggestion", { "is-active": t === b.value }]), + "aria-selected": t === b.value, + onMouseenter: (e) => b.value = t + }, G(e), 43, to)]), + _: 1 + }, 8, [ + "modelValue", + "options", + "aria-label" + ]), [[fe, v.value && A.value]])])], 10, Za); + }; + } +}); +export { it as A, Ye as B, Pt as C, bt as D, Gt as E, Z as F, Ve as G, Re as H, Xe as I, Ae as J, Be as K, Ze as L, Je as M, rt as N, vt as O, et as P, $e as R, Nt as S, Mt as T, Ue as U, Le as V, Ie as W, De as X, Oe as Y, rn as _, Tn as a, Jt as b, mn as c, fn as d, dn as f, cn as g, ln as h, Ni as i, at as j, ot as k, gn as l, $ as m, Xa as n, vn as o, un as p, He as q, Ja as r, yn as s, io as t, hn as u, on as v, Kt as w, Yt as x, an as y, tt as z }; diff --git a/dist/chunks/Viewer-W-G40j3K.js b/dist/chunks/Viewer-W-G40j3K.js deleted file mode 100644 index aea41c02..00000000 --- a/dist/chunks/Viewer-W-G40j3K.js +++ /dev/null @@ -1,11411 +0,0 @@ -import { P as e, U as t, _ as n, _t as r, c as i, d as a, en as o, g as s, n as c, o as l, r as u, s as d, x as f, y as p, yt as m } from "./viewerRuntimeHosts-n0pKLECw.js"; -import { Ct as h, D as g, a as _, ct as v, h as y, i as b, j as x, k as S, m as C, n as w, o as T, pt as E, r as D, rt as O, t as k } from "./events-C65wdOHm.js"; -import { T as A, nt as j, rt as M } from "./mjr-primevue-BRqtdXzb.js"; -import { n as N, r as ee } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { n as P, r as te, t as F } from "./state-D0Gu1AgG.js"; -import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-BnFOXFbn.js"; -// ui/utils/events.ts -function ce(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { - let i = n || (typeof window < "u" ? window : null); - if (!i || typeof i.dispatchEvent != "function") return !1; - try { - return i.dispatchEvent(new CustomEvent(e, { detail: t })); - } catch (t) { - try { - console.warn(`${r} Failed to dispatch event: ${e}`, t); - } catch (e) { - console.debug?.(e); - } - return !1; - } -} -// ui/app/DialogTemplates.ts -var le = async (e, t = "Majoor", n = {}) => { - let r = de(); - if (r && typeof r.alert == "function") try { - await r.alert({ - title: String(t || "Majoor"), - message: String(e || "") - }); - return; - } catch (e) { - console.debug?.(e); - } - let i = R(); - if (i) try { - let n = String(e || ""); - typeof i.addAlert == "function" ? i.addAlert(n) : i.add({ - severity: "info", - summary: String(t || "Majoor"), - detail: n, - life: 5e3 - }); - return; - } catch (e) { - console.debug?.(e); - } - if (n?.native !== !1) { - let n = z(); - if (n) try { - n.show(fe(e, t)); - try { - n.element?.style?.setProperty?.("z-index", "1100"); - } catch (e) { - console.debug?.(e); - } - return; - } catch (e) { - console.debug?.(e); - } - } - let a = me(); - if (a) return new Promise((n) => { - let r = new a(); - W(r); - let i = U("div", { style: { - display: "flex", - flexDirection: "column", - gap: "18px", - padding: "18px 20px 18px 20px" - } }, [ - U("div", { style: { - display: "flex", - alignItems: "center", - justifyContent: "flex-start" - } }, [U("div", { - textContent: t, - style: { - fontWeight: "700", - fontSize: "30px", - color: "rgba(255,255,255,0.96)", - lineHeight: "1.2" - } - })]), - U("div", { - textContent: String(e || ""), - style: { - fontSize: "22px", - color: "rgba(255,255,255,0.86)", - whiteSpace: "pre-wrap", - lineHeight: "1.45" - } - }), - U("div", { style: { - display: "flex", - justifyContent: "flex-end", - gap: "10px" - } }, [U("button", { - textContent: C("dialog.confirm", "Confirm"), - onclick: () => { - try { - r.close(); - } catch (e) { - console.debug?.(e); - } - n(); - }, - style: { - padding: "10px 16px", - borderRadius: "10px", - border: "1px solid rgba(17,132,255,0.75)", - background: "#1184ff", - color: "rgba(255,255,255,0.98)", - fontWeight: "600", - cursor: "pointer" - } - })]) - ]); - try { - r.show(i), setTimeout(() => G(r), 0); - } catch { - try { - window.alert(e); - } catch (e) { - console.debug?.(e); - } - n(); - } - }); - try { - window.alert(e); - } catch (e) { - console.debug?.(e); - } -}, I = async (e, t = "Majoor") => { - let n = de(); - if (n) try { - let r = { - title: String(t || C("dialog.confirm", "Confirm")), - message: String(e || "") - }; - return !!(typeof n.confirm == "function" && await n.confirm(r)); - } catch (e) { - console.debug?.(e); - } - let r = me(); - if (!r) try { - return window.confirm(e); - } catch { - return !1; - } - return new Promise((n) => { - let i = new r(); - W(i); - let a = (e) => { - try { - i.close(); - } catch (e) { - console.debug?.(e); - } - n(!!e); - }, o = U("div", { style: { - display: "flex", - flexDirection: "column", - gap: "18px", - padding: "18px 20px 18px 20px" - } }, [ - U("div", { style: { - display: "flex", - alignItems: "center", - justifyContent: "flex-start" - } }, [U("div", { - textContent: t, - style: { - fontWeight: "700", - fontSize: "30px", - color: "rgba(255,255,255,0.96)", - lineHeight: "1.2" - } - })]), - U("div", { - textContent: String(e || ""), - style: { - fontSize: "22px", - color: "rgba(255,255,255,0.86)", - whiteSpace: "pre-wrap", - lineHeight: "1.45" - } - }), - U("div", { style: { - display: "flex", - justifyContent: "flex-end", - gap: "10px" - } }, [U("button", { - textContent: C("dialog.cancel", "Cancel"), - onclick: () => a(!1), - style: { - padding: "10px 16px", - borderRadius: "10px", - border: "1px solid rgba(255,255,255,0.18)", - background: "rgba(255,255,255,0.06)", - color: "rgba(255,255,255,0.85)", - fontWeight: "600", - cursor: "pointer" - } - }), U("button", { - textContent: C("dialog.confirm", "Confirm"), - onclick: () => a(!0), - style: { - padding: "10px 16px", - borderRadius: "10px", - border: "1px solid rgba(17,132,255,0.75)", - background: "#1184ff", - color: "rgba(255,255,255,0.98)", - fontWeight: "600", - cursor: "pointer" - } - })]) - ]); - try { - i.show(o), setTimeout(() => G(i), 0); - } catch { - try { - n(!!window.confirm(e)); - } catch { - n(!1); - } - } - }); -}, L = async (e, t = "", n = "Majoor") => { - let r = de(); - if (r) try { - let i = { - title: String(n || C("dialog.prompt", "Prompt")), - message: String(e || ""), - defaultValue: String(t ?? "") - }, a = typeof r.prompt == "function" ? await r.prompt(i) : null; - return a == null ? null : String(a); - } catch (e) { - console.debug?.(e); - } - let i = me(); - if (!i) try { - return window.prompt(e, t); - } catch { - return null; - } - return new Promise((r) => { - let a = new i(); - W(a); - let o = (e) => { - try { - a.close(); - } catch (e) { - console.debug?.(e); - } - r(e ?? null); - }, s = U("input", { - type: "text", - value: String(t ?? ""), - style: { - width: "100%", - padding: "10px 10px", - borderRadius: "10px", - border: "1px solid rgba(255,255,255,0.12)", - background: "rgba(0,0,0,0.25)", - color: "rgba(255,255,255,0.9)", - outline: "none", - boxSizing: "border-box" - }, - onkeydown: (e) => { - e.key === "Enter" && o(s.value), e.key === "Escape" && o(null), e.stopPropagation(); - } - }), c = U("div", { style: { - display: "flex", - flexDirection: "column", - gap: "12px", - padding: "16px" - } }, [ - U("div", { - textContent: n, - style: { - fontWeight: "600", - fontSize: "14px", - color: "rgba(255,255,255,0.95)" - } - }), - U("div", { - textContent: String(e || ""), - style: { - fontSize: "13px", - color: "rgba(255,255,255,0.80)", - whiteSpace: "pre-wrap", - lineHeight: "1.4" - } - }), - s, - U("div", { style: { - display: "flex", - justifyContent: "flex-end", - gap: "10px" - } }, [U("button", { - textContent: C("dialog.cancel", "Cancel"), - onclick: () => o(null), - style: { - padding: "8px 12px", - borderRadius: "8px", - border: "1px solid rgba(255,255,255,0.12)", - background: "rgba(0,0,0,0.25)", - color: "rgba(255,255,255,0.85)", - cursor: "pointer" - } - }), U("button", { - textContent: C("dialog.ok", "OK"), - onclick: () => o(s.value), - style: { - padding: "8px 12px", - borderRadius: "8px", - border: "1px solid rgba(95,179,255,0.45)", - background: "rgba(95,179,255,0.18)", - color: "rgba(255,255,255,0.95)", - cursor: "pointer" - } - })]) - ]); - try { - a.show(c), setTimeout(() => G(a), 0), setTimeout(() => { - try { - s.focus(), s.select(); - } catch (e) { - console.debug?.(e); - } - }, 0); - } catch { - try { - r(window.prompt(e, t)); - } catch { - r(null); - } - } - }); -}, ue = () => { - try { - return x()?.ui || null; - } catch { - return null; - } -}, de = () => { - let e = (e) => !!e && (typeof e.alert == "function" || typeof e.confirm == "function" || typeof e.prompt == "function"); - try { - let t = g(); - if (e(t)) return t; - } catch (e) { - console.debug?.(e); - } - return null; -}, R = () => { - try { - let e = S(); - if (e && typeof e.add == "function") return e; - } catch (e) { - console.debug?.(e); - } - return null; -}, z = () => { - try { - let e = ue(); - if (e?.dialog && typeof e.dialog.show == "function") return e.dialog; - } catch (e) { - console.debug?.(e); - } - return null; -}, fe = (e, t = "Majoor") => { - let n = String(e ?? ""), r = String(t ?? "").trim(); - return !r || r.toLowerCase() === "majoor" ? n : `${r}

${n}`; -}, B = /* @__PURE__ */ new Set(/* @__PURE__ */ "abort.blur.change.click.close.contextmenu.dblclick.dragend.dragenter.dragleave.dragover.dragstart.drop.error.focus.input.keydown.keypress.keyup.load.mousedown.mouseenter.mouseleave.mousemove.mouseout.mouseover.mouseup.reset.resize.scroll.select.submit.touchcancel.touchend.touchmove.touchstart.transitionend.unload.wheel".split(".")), V = /* @__PURE__ */ new Set([ - "__proto__", - "constructor", - "prototype", - "innerHTML", - "outerHTML", - "srcdoc", - "__defineGetter__", - "__defineSetter__", - "__lookupGetter__", - "__lookupSetter__" -]), H = /* @__PURE__ */ new Set([ - "id", - "name", - "value", - "type", - "checked", - "disabled", - "placeholder", - "title", - "textContent", - "htmlFor", - "role", - "tabIndex" -]), pe = (e, t = {}, n = []) => { - let r = document.createElement(e); - return Object.entries(t || {}).forEach(([e, t]) => { - let n = String(e || ""); - if (n && !V.has(n)) { - if (e === "style" && t && typeof t == "object") Object.assign(r.style, t); - else if (e === "className") r.className = String(t); - else if (n.startsWith("on")) { - if (typeof t == "function") { - let e = n.slice(2).toLowerCase(); - B.has(e) && r.addEventListener(e, t); - } - } else { - if (H.has(n)) try { - r[n] = t; - return; - } catch (e) { - console.debug?.(e); - } - try { - r.setAttribute(n, String(t)); - } catch (e) { - console.debug?.(e); - } - } - } - }), (Array.isArray(n) ? n : [n]).filter(Boolean).forEach((e) => { - try { - r.appendChild(e); - } catch { - r.appendChild(document.createTextNode(String(e))); - } - }), r; -}, U = (e, t, n) => { - let r = ue(); - if (r?.$el) try { - return r.$el(e, t, n); - } catch {} - return pe(e, t, n); -}, me = () => ue()?.ComfyDialog || null, he = 999999, ge = 560, _e = 12, W = (e) => { - try { - e.element.style.zIndex = String(he), e.element.style.width = `${ge}px`, e.element.style.padding = "0", e.element.style.backgroundColor = "var(--comfy-menu-bg, #131722)", e.element.style.border = "1px solid rgba(255,255,255,0.14)", e.element.style.borderRadius = `${_e}px`, e.element.style.boxSizing = "border-box", e.element.style.overflow = "hidden", e.element.style.boxShadow = "0 18px 48px rgba(0,0,0,0.48)"; - } catch (e) { - console.debug?.(e); - } -}, G = (e) => { - try { - let t = e?.element; - if (!t) return; - let n = t.querySelectorAll("button,[role='button']"); - for (let e of n) { - let t = String(e?.textContent || "").trim().toLowerCase(), n = String(e?.getAttribute?.("aria-label") || "").trim().toLowerCase(); - if (t === "close" || n === "close") try { - e.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } -}; -// ui/features/status/AssetStatusDotTheme.ts -function K(e) { - return String(e || "").trim().toLowerCase(); -} -function ve({ dot: e = null, asset: t = null, scope: n = "" } = {}) { - let r = K(n); - if (r) return r === "custom"; - let i = K(t?.type || t?.scope); - if (i) return i === "custom"; - try { - let t = K(e?.closest?.(".mjr-grid")?.dataset?.mjrScope); - if (t) return t === "custom"; - } catch (e) { - console.debug?.(e); - } - return !1; -} -function ye(e, t = {}) { - let n = K(e); - return ve(t) ? n === "pending" || n === "info" ? "var(--mjr-browser-status-info, #4DB6AC)" : n === "success" ? "var(--mjr-browser-status-success, #2E7D32)" : n === "warning" ? "var(--mjr-browser-status-warning, #FFB74D)" : n === "error" ? "var(--mjr-browser-status-error, #EF5350)" : "var(--mjr-browser-status-neutral, #90A4AE)" : n === "pending" || n === "info" ? "var(--mjr-status-info, #64B5F6)" : n === "success" ? "var(--mjr-status-success, #4CAF50)" : n === "warning" ? "var(--mjr-status-warning, #FFA726)" : n === "error" ? "var(--mjr-status-error, #f44336)" : "var(--mjr-status-neutral, #666)"; -} -// ui/stores/useRuntimeStore.ts -var q = N("mjr-runtime", () => { - let e = M(null), t = M(null), n = M(!1), r = M(0), i = M(null), a = M(null), o = M(null), s = M(null), c = M(null), l = M([]), u = A(() => !!i.value), d = A(() => { - let e = s.value, t = c.value; - return !t || t <= 0 || e == null ? 0 : Math.round(e / t * 100); - }); - function f(t) { - e.value = t; - } - function p(e) { - t.value = e; - } - function m(e, t) { - n.value = !!e, r.value = Math.max(0, Number(t || 0) || 0); - } - function h() { - return { - active: n.value, - queueLength: r.value - }; - } - function g(e = {}) { - e.active_prompt_id !== void 0 && (i.value = e.active_prompt_id), e.queue_remaining !== void 0 && (a.value = e.queue_remaining), e.progress_node !== void 0 && (o.value = e.progress_node), e.progress_value !== void 0 && (s.value = e.progress_value), e.progress_max !== void 0 && (c.value = e.progress_max), e.cached_nodes !== void 0 && (l.value = e.cached_nodes ?? []); - } - function _() { - i.value = null, a.value = null, o.value = null, s.value = null, c.value = null, l.value = []; - } - return { - comfyApp: e, - comfyApi: t, - enrichmentActive: n, - enrichmentQueueLength: r, - activePromptId: i, - queueRemaining: a, - progressNode: o, - progressValue: s, - progressMax: c, - cachedNodes: l, - isExecuting: u, - progressPercent: d, - setComfyApp: f, - setComfyApi: p, - setEnrichmentState: m, - getEnrichmentState: h, - applyExecutionStatus: g, - resetExecution: _ - }; -}); -// ui/stores/getOptionalRuntimeStore.ts -function be() { - try { - return ee() ? q() : null; - } catch { - return null; - } -} -// ui/stores/runtimeEnrichmentState.ts -var xe = Symbol.for("majoor.assets_manager.runtime_state"); -function Se() { - return { - api: null, - assetsDeletedHandler: null, - enrichmentActive: !1, - enrichmentQueueLength: 0 - }; -} -function Ce() { - try { - let e = typeof globalThis < "u" ? globalThis : {}; - return e[xe] && typeof e[xe] == "object" || (e[xe] = Se()), e[xe]; - } catch { - return Se(); - } -} -function we(e, t) { - let n = be(); - if (n) { - n.setEnrichmentState(e, t); - return; - } - let r = Ce(); - r.enrichmentActive = !!e, r.enrichmentQueueLength = Math.max(0, Number(t || 0) || 0); -} -function Te() { - let e = be(); - if (e) return e.getEnrichmentState(); - let t = Ce(); - return { - active: !!t.enrichmentActive, - queueLength: Math.max(0, Number(t.enrichmentQueueLength || 0) || 0) - }; -} -// ui/features/grid/AssetCardRenderer.ts -function Ee(e) { - try { - return String(e || "").trim().toLowerCase(); - } catch { - return ""; - } -} -function De(e) { - try { - return (String(e || "").split(".").pop() || "").toUpperCase(); - } catch { - return ""; - } -} -function Oe(e) { - try { - let t = String(e || ""), n = t.lastIndexOf("."), r = n > 0 ? t.slice(0, n) : t; - return String(r || "").trim().toLowerCase(); - } catch { - return ""; - } -} -function ke(e) { - try { - if (String(e?.kind || "").toLowerCase() !== "video") return !1; - let t = String(e?.filename || "").toLowerCase(); - return t.includes("-audio") || t.includes("_audio"); - } catch { - return !1; - } -} -function Ae(e) { - try { - let t = String(e?.kind || "").toLowerCase(), n = 0; - ke(e) ? n = 2 : t === "video" && (n = 1); - let r = +(Number(e?.has_generation_data || 0) > 0), i = Number(e?.size || 0), a = Number(e?.mtime || 0); - return [ - n, - a, - r, - i - ]; - } catch { - return [ - 0, - 0, - 0, - 0 - ]; - } -} -function je(e, t) { - for (let n = 0; n < Math.max(e.length, t.length); n++) { - let r = (e[n] || 0) - (t[n] || 0); - if (r !== 0) return r; - } - return 0; -} -function Me(e) { - if (!Array.isArray(e) || e.length === 0) return null; - if (e.length === 1) return e[0]; - let t = e[0], n = Ae(t); - for (let r = 1; r < e.length; r++) { - let i = e[r], a = Ae(i); - je(a, n) > 0 && (t = i, n = a); - } - return t; -} -function Ne(e, t) { - if (!e || !Array.isArray(t) || t.length === 0 || (Number(e?.generation_time_ms ?? e?.metadata?.generation_time_ms ?? 0) || 0) > 0) return e; - let n = t.find((e) => (Number(e?.generation_time_ms ?? e?.metadata?.generation_time_ms ?? 0) || 0) > 0); - if (!n) return e; - let r = Number(n?.generation_time_ms ?? n?.metadata?.generation_time_ms ?? 0) || 0; - return r <= 0 || (e.generation_time_ms = r, !e.has_generation_data && n?.has_generation_data && (e.has_generation_data = n.has_generation_data)), e; -} -function Pe(e, t) { - let n = String(e?.kind || "").toLowerCase(); - if (n) return n; - let r = /* @__PURE__ */ new Set([ - "PNG", - "JPG", - "JPEG", - "WEBP", - "GIF", - "BMP", - "TIF", - "TIFF" - ]), i = /* @__PURE__ */ new Set([ - "MP4", - "WEBM", - "MOV", - "AVI", - "MKV" - ]), a = /* @__PURE__ */ new Set([ - "MP3", - "WAV", - "OGG", - "FLAC" - ]), o = /* @__PURE__ */ new Set([ - "OBJ", - "FBX", - "GLB", - "GLTF", - "STL", - "PLY", - "SPLAT", - "KSPLAT", - "SPZ" - ]); - return r.has(t) ? "image" : i.has(t) ? "video" : a.has(t) ? "audio" : o.has(t) ? "model3d" : "unknown"; -} -function Fe(e) { - try { - return !!e()?.siblings?.hidePngSiblings; - } catch { - return !1; - } -} -function Ie(e) { - return `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}`; -} -function J(e) { - let t = Ee(e?.filename); - return t ? `${Ie(e)}|${t}` : ""; -} -function Le(e, t = De(e?.filename || "")) { - let n = Pe(e, t), r = String(e?.filename || "").trim(); - if (!r) return ""; - let i = Ie(e); - if (n === "model3d") return `${i}|model3d|${r.toLowerCase()}`; - let a = Oe(r); - return a ? `${i}|media|${a}` : ""; -} -function Re(e) { - let t = e.nonImageSiblingKeys || /* @__PURE__ */ new Set(); - e.nonImageSiblingKeys = t; - let n = e.stemMap || /* @__PURE__ */ new Map(); - e.stemMap = n; - let r = e.assetIdSet || /* @__PURE__ */ new Set(); - e.assetIdSet = r; - let i = e.seenKeys || /* @__PURE__ */ new Set(); - return e.seenKeys = i, e.hiddenPngSiblings ??= 0, { - nonImageSiblingKeys: t, - stemMap: n, - assetIdSet: r, - seenKeys: i - }; -} -function ze(e, t = [], { assetKey: n = null, preserveHiddenCount: r = !1 } = {}) { - let i = Number(e?.hiddenPngSiblings || 0) || 0; - e.seenKeys = /* @__PURE__ */ new Set(), e.assetIdSet = /* @__PURE__ */ new Set(), e.filenameCounts = /* @__PURE__ */ new Map(), e.nonImageSiblingKeys = /* @__PURE__ */ new Set(), e.stemMap = /* @__PURE__ */ new Map(), e.renderedFilenameMap = /* @__PURE__ */ new Map(), e.hiddenPngSiblings = r ? i : 0, typeof n == "function" && (e.assetKeyFn = n); - let a = Re(e); - for (let r of Array.isArray(t) ? t : []) if (r && typeof r == "object") { - try { - let e = r?.id == null ? "" : String(r.id); - e && a.assetIdSet.add(e); - } catch (e) { - console.debug?.(e); - } - try { - let t = typeof n == "function" ? n(r) : e?.assetKeyFn?.(r); - t && a.seenKeys.add(t); - } catch (e) { - console.debug?.(e); - } - try { - let t = J(r); - t && e.filenameCounts.set(t, (Number(e.filenameCounts.get(t) || 0) || 0) + 1); - } catch (e) { - console.debug?.(e); - } - try { - let e = De(r?.filename || ""), t = Le(r, e); - if (!t) continue; - let n = a.stemMap.get(t); - n || (n = [], a.stemMap.set(t, n)), n.push(r); - let i = Pe(r, e); - (i === "video" || i === "audio" || i === "model3d" || e === "WEBP") && a.nonImageSiblingKeys.add(t); - } catch (e) { - console.debug?.(e); - } - } -} -function Be(e, t, n) { - try { - t?.id != null && n.assetIdSet.delete(String(t.id)); - } catch (e) { - console.debug?.(e); - } - try { - let r = e?.assetKeyFn?.(t); - r && n.seenKeys.delete(r); - } catch (e) { - console.debug?.(e); - } -} -function Ve(e, t, n, r) { - let i = n.stemMap.get(t); - if (!i?.length) return []; - let a = []; - for (let e = i.length - 1; e >= 0; e--) r(i[e]) && (a.push(i[e]), i.splice(e, 1)); - return i.length || n.stemMap.delete(t), a; -} -function He(e, t, n) { - if (!Fe(n)) return { - hidden: !1, - hideEnabled: !1, - removed: [] - }; - let r = Re(t), i = String(e?.filename || ""), a = De(i), o = Pe(e, a), s = Le(e, a); - if (!s) return { - hidden: !1, - hideEnabled: !0, - removed: [] - }; - if (o === "video" || o === "audio" || o === "model3d" || a === "WEBP") return r.nonImageSiblingKeys.add(s), { - hidden: !1, - hideEnabled: !0, - removed: Ve(t, s, r, (e) => De(e?.filename || "") === "PNG") - }; - if (a === "PNG") { - let t = `${Ie(e)}|model3d|${Oe(i)}`; - if (r.nonImageSiblingKeys.has(s) || r.nonImageSiblingKeys.has(t)) return { - hidden: !0, - hideEnabled: !0, - removed: [] - }; - } - return { - hidden: !1, - hideEnabled: !0, - removed: [] - }; -} -function Ue(e, t, n, r) { - let i = Fe(r.loadMajoorSettings), a = n.filenameCounts || /* @__PURE__ */ new Map(); - n.filenameCounts = a, r.clearGridMessage(e); - let o = r.ensureVirtualGrid(e, n); - if (!o) return 0; - i || (n.hiddenPngSiblings = 0), n.assetKeyFn = r.assetKey; - let s = Re(n), c = /* @__PURE__ */ new Map(); - for (let e of n.assets || []) { - let t = J(e); - if (!t) continue; - let n = c.get(t); - n || (n = [], c.set(t, n)), n.push(e); - } - let l = 0, u = !1, d = [], f = /* @__PURE__ */ new Set(), p = () => { - try { - let t = new Set((Array.isArray(n.assets) ? n.assets : []).map((e) => String(e?.id || "")).filter(Boolean)); - for (let [i, o] of c.entries()) { - let s = (Array.isArray(o) ? o : []).filter((e) => { - let n = String(e?.id || ""); - return n ? t.has(n) : !1; - }), c = s.length; - if (a.set(i, c), c < 2) { - for (let e of s) e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack && (e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0); - let t = n.renderedFilenameMap?.get(i); - if (t) for (let n of t) { - let t = n.querySelector?.(".mjr-file-badge"); - r.setFileBadgeCollision(t, !1); - try { - r.ensureDupStackCard?.(e, n, n._mjrAsset); - } catch (e) { - console.debug?.(e); - } - } - continue; - } - let l = Ne(Me(s), s), u = s.filter((e) => e !== l); - for (let e of s) e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e !== l && (e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0); - let d = Array.isArray(l._mjrDupMembers) ? l._mjrDupMembers : [], f = new Set(d.map((e) => String(e?.id || ""))), p = [...d, ...s.filter((e) => !f.has(String(e?.id || "")))]; - l._mjrDupStack = !0, l._mjrDupMembers = p, l._mjrDupCount = p.length, l._mjrNameCollision = !1; - let m = new Set(u.map((e) => String(e?.id || ""))); - m.size > 0 && (n.assets = n.assets.filter((e) => !m.has(String(e?.id || "")))); - let h = n.renderedFilenameMap?.get(i); - if (h) for (let t of h) { - let n = t._mjrAsset, i = t.querySelector?.(".mjr-file-badge"); - if (n === l || String(n?.id || "") === String(l?.id || "")) { - r.setFileBadgeCollision(i, !1); - try { - r.ensureDupStackCard?.(e, t, l); - } catch (e) { - console.debug?.(e); - } - } - } - } - } catch (e) { - console.debug?.(e); - } - }; - for (let e of t || []) { - try { - if (e?.id == null || String(e.id).trim() === "") { - let t = String(e?.kind || "").toLowerCase(), n = String(e?.filepath || "").trim(), r = String(e?.subfolder || "").trim(), i = String(e?.filename || "").trim(); - e.id = `asset:${`${String(e?.type || "").trim().toLowerCase()}|${t}|${n}|${r}|${i}` || "unknown"}`; - } - } catch (e) { - console.debug?.(e); - } - let t = De(String(e?.filename || "")), i = He(e, n, r.loadMajoorSettings); - for (let e of i.removed || []) f.add(e); - if (i.hidden) { - n.hiddenPngSiblings += 1; - continue; - } - let a = J(e); - if (a) { - let t = c.get(a); - t || (t = [], c.set(a, t)), t.push(e); - } - let o = r.assetKey(e); - if (!o || s.seenKeys.has(o) || e.id != null && s.assetIdSet.has(String(e.id))) continue; - s.seenKeys.add(o), e.id != null && s.assetIdSet.add(String(e.id)), d.push(e); - let u = Le(e, t); - if (u) { - let t = s.stemMap.get(u); - t || (t = [], s.stemMap.set(u, t)), t.push(e); - } - l++; - } - if (f.size > 0) { - n.hiddenPngSiblings += f.size, n.assets = n.assets.filter((e) => !f.has(e)); - for (let e = d.length - 1; e >= 0; e--) f.has(d[e]) && (d.splice(e, 1), l = Math.max(0, l - 1)); - for (let e of f) Be(n, e, s); - try { - for (let e of f) { - let t = J(e); - if (!t) continue; - let n = c.get(t); - if (!n) continue; - let r = n.indexOf(e); - r > -1 && n.splice(r, 1), n.length || c.delete(t); - } - } catch (e) { - console.debug?.(e); - } - u = !0; - } - d.length > 0 && (n.assets.push(...d), u = !0), u && (p(), o.setItems(n.assets), n.sentinel && e.appendChild(n.sentinel)); - try { - e.dataset.mjrHidePngSiblingsEnabled = i ? "1" : "0", e.dataset.mjrHiddenPngSiblings = String(Number(n.hiddenPngSiblings || 0) || 0); - } catch (e) { - console.debug?.(e); - } - return l; -} -// ui/components/Badges.ts -function We({ ext: e = "", filename: t = "", count: n = 0, paths: r = [] } = {}) { - let i = String(e || "").trim(), a = String(t || "").trim(), o = Math.max(0, Number(n) || 0), s = Array.isArray(r) ? r.map((e) => String(e || "").trim()).filter(Boolean) : []; - if (o < 2) return `${i} file`; - let c = [`${i}+ name collision in current view (${o})`]; - if (a && c.push(`Name: ${a}`), s.length) { - c.push("Paths:"); - for (let e of s.slice(0, 4)) c.push(`- ${e}`); - s.length > 4 && c.push(`- ... +${s.length - 4} more`); - } - return c.push("Click to select collisions in current view"), c.join("\n"); -} -function Ge(e, t, n = !1, r = null) { - let i = document.createElement("div"); - i.className = "mjr-file-badge"; - let a = String(e || "").split(".").pop()?.toUpperCase?.() || ""; - try { - i.dataset.mjrExt = a; - } catch (e) { - console.debug?.(e); - } - let o = { - image: "--mjr-badge-image", - video: "--mjr-badge-video", - audio: "--mjr-badge-audio", - model3d: "--mjr-badge-model3d" - }[Pe({ kind: t }, a)], s = o ? `var(${o}, #607D8B)` : "#607D8B", c = n ? "var(--mjr-badge-duplicate-alert, #ff1744)" : s; - i.textContent = a + (n ? "+" : ""), i.title = n ? We({ - ext: a, - filename: e, - count: r?.count, - paths: r?.paths - }) : `${a} file`, i.style.cssText = ` - position: absolute; - top: 6px; - left: 6px; - padding: 3px 8px; - border-radius: 4px; - font-size: 10px; - font-weight: 700; - background: ${c}; - opacity: 0.85; - color: white; - text-transform: uppercase; - pointer-events: auto; - z-index: 10; - letter-spacing: 0.5px; - box-shadow: 0 2px 4px rgba(0,0,0,0.3); - cursor: ${n ? "pointer" : "default"}; - `; - try { - i.dataset.mjrBadgeBg = s; - } catch (e) { - console.debug?.(e); - } - return i; -} -function Ke(e, t, n = null) { - if (e) try { - let r = e.dataset?.mjrExt || "", i = e.dataset?.mjrBadgeBg || "var(--mjr-badge-image, #607D8B)"; - e.textContent = String(r || "") + (t ? "+" : ""), e.title = t ? We({ - ext: r, - filename: n?.filename || "", - count: n?.count, - paths: n?.paths - }) : `${r} file`, e.style.background = t ? "var(--mjr-badge-duplicate-alert, #ff1744)" : i, e.style.cursor = t ? "pointer" : "default"; - } catch (e) { - console.debug?.(e); - } -} -function qe(e) { - return e === !0 ? !0 : e === !1 ? !1 : e === 1 || e === "1" ? !0 : e === 0 || e === "0" ? !1 : null; -} -function Je(e, t = []) { - if (!e || typeof e != "object") return null; - for (let n of t) if (e[n] != null) return e[n]; - return null; -} -function Ye(e) { - return typeof e == "string" && e.trim().length > 0; -} -function Xe(e) { - if (Array.isArray(e)) return e.some((e) => String(e ?? "").trim().length > 0); - if (e && typeof e == "object") return Object.keys(e).length > 0; - if (typeof e != "string") return !1; - let t = e.trim(); - if (!t || t === "[]" || t === "[ ]" || /^(null|none)$/i.test(t)) return !1; - if (t.startsWith("[") && t.endsWith("]") || t.startsWith("{") && t.endsWith("}")) try { - let e = JSON.parse(t); - return Array.isArray(e) ? e.some((e) => String(e ?? "").trim().length > 0) : e && typeof e == "object" ? Object.keys(e).length > 0 : !!e; - } catch (e) { - console.debug?.(e); - } - return !0; -} -function Y(e) { - let t = Je(e, [ - "auto_tags", - "autoTags", - "ai_auto_tags", - "aiAutoTags", - "suggested_tags", - "suggestedTags" - ]), n = Je(e, [ - "enhanced_caption", - "enhancedCaption", - "enhanced_prompt", - "enhancedPrompt", - "ai_enhanced_prompt", - "aiEnhancedPrompt" - ]), r = qe(Je(e, [ - "has_ai_auto_tags", - "hasAiAutoTags", - "ai_has_auto_tags", - "aiHasAutoTags" - ])), i = qe(Je(e, [ - "has_ai_enhanced_caption", - "hasAiEnhancedCaption", - "ai_has_enhanced_caption", - "aiHasEnhancedCaption" - ])), a = qe(Je(e, [ - "has_ai_vector", - "hasAiVector", - "has_vector_embedding", - "hasVectorEmbedding", - "vector_indexed", - "vectorIndexed" - ])), o = qe(Je(e, [ - "has_ai_info", - "hasAiInfo", - "ai_indexed", - "aiIndexed" - ])), s = r === !0 || r === null && Xe(t), c = i === !0 || i === null && Ye(n), l = a === !0 || o === !0; - return { - hasAiInfo: o === !0 || s || c || l, - hasAutoTags: s, - hasEnhancedPrompt: c, - hasVectorIndexed: l - }; -} -function Ze(e) { - let t = document.createElement("span"); - t.className = "mjr-workflow-dot mjr-asset-status-dot"; - let n = qe(e?.has_workflow ?? e?.hasWorkflow), r = qe(e?.has_generation_data ?? e?.hasGenerationData), i = Te(), a = i.queueLength, o = i.active || a > 0, s = "Pending: parsing metadata...", c = n === !0 || r === !0, l = n === !1 || r === !1, u = n === null || r === null; - n === !0 && r === !0 ? s = "Complete: workflow + generation data detected" : c ? s = n === !0 ? "Partial: workflow only (generation data missing)" : "Partial: generation data only (workflow missing)" : l && !c && !u ? s = "None: no workflow or generation data found" : u && (s = "Pending: metadata not parsed yet"); - let d = u ? "pending" : n === !0 && r === !0 ? "success" : c ? "warning" : "error"; - o && d !== "success" && (d = "pending", s = a > 0 ? `Pending: database metadata enrichment in progress (${a} queued)` : "Pending: database metadata enrichment in progress"), Qe(t, d, s, { asset: e }); - let f = Y(e); - if (f.hasAiInfo) { - let e = []; - f.hasVectorIndexed && e.push("vector indexed"), f.hasAutoTags && e.push("AI tag suggestions"), f.hasEnhancedPrompt && e.push("enhanced prompt"), t.textContent = ""; - let n = document.createElement("i"); - n.className = "pi pi-sparkles", n.setAttribute("aria-hidden", "true"), n.style.fontSize = "11px", n.style.lineHeight = "1", t.appendChild(n); - try { - t.dataset.mjrAi = "1"; - } catch (e) { - console.debug?.(e); - } - t.title = `${s}\nAI: ${e.length ? e.join(", ") : "indexed"}\nClick to rescan this file`; - } else { - try { - t.dataset.mjrAi = "0"; - } catch (e) { - console.debug?.(e); - } - t.textContent = "●", t.title = `${s}\nClick to rescan this file`; - } - return t; -} -function Qe(e, t, n = "", r = {}) { - if (!e) return; - let i = String(t || "").toLowerCase(), a = ye(i, { - dot: e, - ...r || {} - }); - try { - e.dataset.mjrStatus = i || "neutral"; - } catch (e) { - console.debug?.(e); - } - if (e.style.cssText = ` - color: ${a}; - margin-left: 4px; - font-size: 12px; - line-height: 1; - display: inline-flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: color 0.25s ease, opacity 0.25s ease; - `, n) try { - e.title = String(n); - } catch (e) { - console.debug?.(e); - } -} -function $e(e) { - let t = Math.max(0, Math.min(5, Number(e) || 0)); - if (t <= 0) return null; - let n = document.createElement("div"); - n.className = "mjr-rating-badge", n.title = `Rating: ${t} star${t > 1 ? "s" : ""}`, n.style.cssText = "\n position: absolute;\n top: 6px;\n right: 6px;\n background: rgba(0, 0, 0, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.12);\n padding: 2px 6px;\n border-radius: 6px;\n font-size: 13px;\n letter-spacing: 1px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n z-index: 10;\n text-shadow: 0 2px 6px rgba(0,0,0,0.6);\n box-shadow: 0 6px 18px rgba(0,0,0,0.25);\n "; - for (let e = 1; e <= t; e++) { - let r = document.createElement("span"); - r.textContent = "★", r.style.color = "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", r.style.marginRight = e < t ? "2px" : "0", n.appendChild(r); - } - return n; -} -function et(e) { - if (Array.isArray(e)) return e.map((e) => String(e ?? "").trim()).filter(Boolean); - if (typeof e == "string") { - let t = e.trim(); - if (!t) return []; - try { - let e = JSON.parse(t); - if (Array.isArray(e)) return e.map((e) => String(e ?? "").trim()).filter(Boolean); - } catch {} - return t.split(",").map((e) => e.trim()).filter(Boolean); - } - return []; -} -function tt(e) { - let t = Number(e) / 1e3; - return t >= 60 ? "#FF9800" : t >= 30 ? "#FFC107" : t >= 10 ? "#8BC34A" : "#4CAF50"; -} -function nt(e) { - let t = e / 1e3; - if (t >= 60) { - let e = (t / 60).toFixed(1); - return { - text: `${e}m`, - title: `Generation time: ${e} minutes (${t.toFixed(1)}s)` - }; - } - let n = t.toFixed(1); - return { - text: `${n}s`, - title: `Generation time: ${n} seconds` - }; -} -function rt(e, { maxMs: t = 864e5 } = {}) { - let n; - if (e == null) return 0; - if (typeof e == "string") { - let t = e.trim().toLowerCase(); - if (!t) return 0; - let r = t.match(/^(-?\d+(?:[.,]\d+)?)\s*(s|sec|secs|second|seconds)$/i); - if (r) n = Number(r[1].replace(",", ".")) * 1e3; - else { - let e = t.match(/^(-?\d+(?:[.,]\d+)?)\s*(ms|msec|millisecond|milliseconds)$/i); - n = Number(e ? e[1].replace(",", ".") : t.replace(",", ".")); - } - } else n = Number(e); - return !Number.isFinite(n) || n <= 0 || n >= Number(t) ? 0 : n; -} -function it(e) { - let t = document.createElement("div"); - t.className = "mjr-tags-badge"; - let n = et(e); - return n.length === 0 ? (t.style.display = "none", t) : (t.textContent = n.join(", "), t.title = `Tags: ${n.join(", ")}`, t.style.cssText = "\n position: absolute;\n bottom: 6px;\n left: 6px;\n padding: 3px 6px;\n border-radius: 4px;\n background: rgba(0,0,0,0.8);\n color: var(--mjr-tag-color, #90CAF9);\n font-size: 9px;\n max-width: 80%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n z-index: 10;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n ", t); -} -// ui/utils/filenames.ts -var at = /* @__PURE__ */ new Set([ - "CON", - "PRN", - "AUX", - "NUL", - "COM1", - "COM2", - "COM3", - "COM4", - "COM5", - "COM6", - "COM7", - "COM8", - "COM9", - "LPT1", - "LPT2", - "LPT3", - "LPT4", - "LPT5", - "LPT6", - "LPT7", - "LPT8", - "LPT9" -]), ot = 255; -function st(e) { - try { - let t = String(e ?? "").trim(); - if (!t) return { - valid: !1, - reason: "Filename cannot be empty" - }; - if (t.length > ot) return { - valid: !1, - reason: `Filename is too long (max ${ot} characters)` - }; - if (t.includes("/") || t.includes("\\")) return { - valid: !1, - reason: "Filename cannot contain path separators" - }; - if (t.includes("\0")) return { - valid: !1, - reason: "Filename cannot contain null bytes" - }; - for (let e of t) if (e.charCodeAt(0) < 32) return { - valid: !1, - reason: "Filename cannot contain control characters" - }; - if (t.startsWith(".") || t.startsWith(" ")) return { - valid: !1, - reason: "Filename cannot start with a dot or space" - }; - if (t.endsWith(".") || t.endsWith(" ")) return { - valid: !1, - reason: "Filename cannot end with a dot or space" - }; - let n = t.split(".")[0].toUpperCase(); - return at.has(n) ? { - valid: !1, - reason: "Filename uses a reserved Windows name" - } : { - valid: !0, - reason: "" - }; - } catch (e) { - return { - valid: !1, - reason: String(e || "Invalid filename") - }; - } -} -function ct(e) { - try { - return String(e ?? "").trim(); - } catch { - return ""; - } -} -function lt(e) { - let t = ct(e); - if (!t) return { - stem: "", - ext: "" - }; - let n = t.lastIndexOf("."); - return n <= 0 || n === t.length - 1 ? { - stem: t, - ext: "" - } : { - stem: t.slice(0, n), - ext: t.slice(n) - }; -} -function ut(e, t) { - let n = ct(e); - if (!n) return ""; - let r = lt(t); - return !lt(n).ext && r.ext ? `${n}${r.ext}` : n; -} -// ui/utils/dom.ts -function dt(e, t) { - if (!t) return null; - try { - if (!e) return null; - if (e instanceof Element && typeof e.closest == "function") return e.closest(t); - let n = e?.parentElement; - if (n && typeof n.closest == "function") return n.closest(t); - } catch (e) { - console.debug?.(e); - } - return null; -} -function ft(e) { - let t = String(e ?? ""); - try { - if (typeof CSS?.escape == "function") return CSS.escape(t); - } catch (e) { - console.debug?.(e); - } - return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); -} -async function pt(e) { - try { - return navigator?.clipboard?.writeText ? (await navigator.clipboard.writeText(String(e ?? "")), !0) : !1; - } catch { - return !1; - } -} -// ui/utils/deleteGuard.ts -async function mt(e, t) { - return !T.DELETE_CONFIRMATION || !!await I(e > 1 ? C("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : C("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || C("label.thisFile", "this file")) }), C("dialog.confirmDeleteTitle", "Majoor: Confirm delete")); -} -// ui/features/collections/contextmenu/addToCollectionMenuState.ts -var ht = j({ - open: !1, - x: 0, - y: 0, - assets: [] -}); -function gt() { - try { - window.dispatchEvent(new CustomEvent("mjr-close-all-menus")); - } catch (e) { - console.debug?.(e); - } -} -function _t({ x: e = 0, y: t = 0, assets: n = [] } = {}) { - gt(), ht.open = Array.isArray(n) && n.length > 0, ht.x = Number(e) || 0, ht.y = Number(t) || 0, ht.assets = Array.isArray(n) ? [...n] : []; -} -function vt() { - ht.open = !1, ht.x = 0, ht.y = 0, ht.assets = []; -} -// ui/features/collections/contextmenu/addToCollectionMenu.ts -function yt(e) { - if (!e || typeof e != "object") return null; - let t = e.filepath || e.path || e?.file_info?.filepath || ""; - return t ? { - filepath: t, - filename: e.filename || "", - subfolder: e.subfolder || "", - type: (e.type || "output").toLowerCase(), - root_id: h(e), - kind: e.kind || "" - } : null; -} -async function bt({ x: e, y: t, assets: n }) { - let r = Array.isArray(n) ? n.map(yt).filter(Boolean) : []; - r.length ? _t({ - x: Number(e) || 0, - y: Number(t) || 0, - assets: r - }) : o(C("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); -} -// ui/features/contextmenu/ratingUpdater.ts -var xt = 350, St = /* @__PURE__ */ new Map(); -function Ct(e) { - let t = St.get(e); - if (t) { - try { - clearTimeout(t.timer); - } catch (e) { - console.debug?.(e); - } - try { - t.controller?.abort?.(); - } catch (e) { - console.debug?.(e); - } - St.delete(e); - } -} -function wt(e) { - e && Ct(String(e)); -} -function Tt() { - for (let e of Array.from(St.keys())) wt(e); -} -function Et(t, n, { onSuccess: r, onFailure: i, successMessage: s = null, errorMessage: c = null, warnPrefix: l = "[RatingUpdater]" } = {}) { - if (!t) return; - wt(t); - let u = new AbortController(), d = setTimeout(async () => { - St.delete(String(t)); - try { - let a = await e(t, n, { signal: u.signal }); - if (!a?.ok) { - o(a?.error || c || "Failed to update rating", "error"), i?.(a); - return; - } - s && o(s, "success", 1500), r?.(a); - } catch (e) { - a(e, l, { showToast: !0 }), i?.(e); - } - }, xt); - St.set(String(t), { - timer: d, - controller: u - }); -} -// ui/utils/tooltipShortcuts.ts -function Dt(e, t) { - let n = String(e || "").trim(), r = String(t || "").trim(); - if (!r) return n; - if (!n) return r; - if (r.length === 1) { - let e = r.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - if (RegExp(`\\(${e}\\)|\\b${e}\\b`, "i").test(n)) return n; - } else if (n.toLowerCase().includes(r.toLowerCase())) return n; - return `${n} (${r})`; -} -function Ot(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) { - if (!e) return ""; - let a = Dt(t, n); - if (e.title = a, r) { - let r = i ?? t; - e.setAttribute("aria-label", Dt(r, n)); - } - return a; -} -// ui/utils/safeCall.ts -var kt = () => {}; -function At(e) { - try { - return !!T?.[e]; - } catch { - return !1; - } -} -function jt(e, t) { - try { - console.warn(`[Majoor] ${e}`, t); - } catch (e) { - console.debug?.(e); - } -} -function X(e, t = "safeCall") { - try { - return e?.(); - } catch (e) { - At("DEBUG_SAFE_CALL") && jt(t, e); - return; - } -} -function Z(e, t, n, r, i = "safeAddListener") { - try { - return e?.addEventListener?.(t, n, r), () => { - try { - e?.removeEventListener?.(t, n, r); - } catch (e) { - At("DEBUG_SAFE_LISTENERS") && jt(`${i}:remove:${String(t || "")}`, e); - } - }; - } catch (e) { - return At("DEBUG_SAFE_LISTENERS") && jt(`${i}:add:${String(t || "")}`, e), kt; - } -} -// ui/utils/mediaFps.ts -function Mt(e) { - try { - let t = Number(e); - if (Number.isFinite(t) && t > 0) return t; - let n = String(e || "").trim(); - if (!n) return null; - if (n.includes("/")) { - let [e, t] = n.split("/"), r = Number(e), i = Number(t); - if (Number.isFinite(r) && Number.isFinite(i) && i !== 0) { - let e = r / i; - return Number.isFinite(e) && e > 0 ? e : null; - } - } - let r = Number.parseFloat(n); - return Number.isFinite(r) && r > 0 ? r : null; - } catch { - return null; - } -} -function Nt(e) { - try { - let t = e, n = t.metadata_raw || {}, r = (n.raw_ffprobe || {}).video_stream || {}; - return Mt(r.avg_frame_rate) ?? Mt(r.r_frame_rate) ?? Mt(n.fps_raw) ?? Mt(n.fps) ?? Mt(n.frame_rate) ?? Mt(t.fps); - } catch { - return null; - } -} -function Pt(e, t) { - try { - let n = e, r = n.metadata_raw || {}, i = (r.raw_ffprobe || {}).video_stream || {}, a = Number(n.frame_count) || Number(r.frame_count) || Number(r.frames) || Number(i.nb_frames) || Number(i.nb_read_frames) || 0; - if (Number.isFinite(a) && a > 0) return Math.floor(a); - let o = Number(n.duration ?? r.duration ?? i.duration); - if (Number.isFinite(o) && o > 0 && t != null && Number.isFinite(t) && t > 0) return Math.max(1, Math.round(o * t)); - } catch (e) { - console.debug?.(e); - } - return null; -} -function Ft(e) { - let t = Number(e); - return !Number.isFinite(t) || t <= 0 ? "" : Math.abs(t - Math.round(t)) < .001 ? `${Math.round(t)} fps` : `${t.toFixed(3).replace(/\.?0+$/, "")} fps`; -} -function It(e, t = 30) { - let n = Mt(e); - if (n != null) return Math.max(1, Math.round(n * 1e3) / 1e3); - let r = Mt(t); - return r == null ? 30 : Math.max(1, Math.round(r * 1e3) / 1e3); -} -// ui/components/VideoControls.ts -var Lt = 400, Rt = 1e3, zt = 220, Bt = .001; -function Vt(e, t) { - let n = Number(e), r = Math.max(1, Number(t) || 1); - if (!Number.isFinite(n) || n <= 0) return 1; - let i = n / r, a = 10 ** Math.floor(Math.log10(Math.max(i, .001))), o = i / a; - return Math.max(.001, (o <= 1 ? 1 : o <= 2 ? 2 : o <= 5 ? 5 : 10) * a); -} -function Ht(e, t, n) { - try { - if (e?.aborted) return kt; - let r = setTimeout(() => { - try { - if (e?.aborted) return; - n?.(); - } catch (e) { - console.debug?.(e); - } - }, Math.max(0, Math.floor(Number(t) || 0))), i = () => { - try { - clearTimeout(r); - } catch (e) { - console.debug?.(e); - } - }; - try { - e?.addEventListener?.("abort", i, { once: !0 }); - } catch (e) { - console.debug?.(e); - } - return () => { - try { - clearTimeout(r); - } catch (e) { - console.debug?.(e); - } - try { - e?.removeEventListener?.("abort", i); - } catch (e) { - console.debug?.(e); - } - }; - } catch { - return kt; - } -} -function Ut(e) { - let t = Math.floor(Number(e) || 0); - return t < 10 ? `0${t}` : String(t); -} -function Wt(e) { - let t = Number(e); - if (!Number.isFinite(t) || t < 0) return "0:00"; - let n = Math.floor(t), r = Math.floor(n / 3600), i = Math.floor(n % 3600 / 60), a = n % 60; - return r > 0 ? `${r}:${Ut(i)}:${Ut(a)}` : `${i}:${Ut(a)}`; -} -function Gt(e, t, n) { - let r = document.createElement("button"); - r.type = "button", r.className = `mjr-video-btn ${e || ""}`.trim(), n && (r.title = n); - try { - r.setAttribute("aria-label", n || t || "Button"); - } catch (e) { - console.debug?.(e); - } - return r.textContent = t, r; -} -function Kt(e, t, n, r) { - let i = document.createElement("button"); - i.type = "button", i.className = `mjr-video-btn ${e || ""}`.trim(), n && (i.title = n); - try { - i.setAttribute("aria-label", r || n || "Button"); - } catch (e) { - console.debug?.(e); - } - let a = document.createElement("span"); - return a.className = `pi ${t || ""}`.trim(), a.setAttribute("aria-hidden", "true"), i.appendChild(a), { - btn: i, - icon: a - }; -} -function qt(e, { min: t, max: n, step: r, value: i, title: a, ariaLabel: o, widthPx: s } = {}) { - let c = document.createElement("input"); - return c.type = "number", c.className = `mjr-video-num ${e || ""}`.trim(), a && (c.title = a), o && c.setAttribute("aria-label", o), t != null && (c.min = String(t)), n != null && (c.max = String(n)), r != null && (c.step = String(r)), i != null && (c.value = String(i)), s != null && (c.style.width = `${s}px`), c; -} -function Jt(e) { - try { - return e?.variant === "preview" ? "preview" : e?.variant === "viewerbar" ? "viewerbar" : "viewer"; - } catch { - return "viewer"; - } -} -function Yt(e) { - try { - let t = Number(e?.initialFps); - return Number.isFinite(t) && t > 0 ? t : null; - } catch { - return null; - } -} -function Xt(e, t) { - let n = Number(e), r = Number(t); - return Number.isFinite(n) && Number.isFinite(r) && Math.abs(n - r) <= Bt; -} -function Zt(e, t) { - let n = []; - try { - e.controls = !1, e.loop = !0, e.muted = !0, e.playsInline = !0, e.autoplay = !0; - } catch (e) { - console.debug?.(e); - } - let r = document.createElement("div"); - r.className = "mjr-video-controls mjr-video-controls--preview"; - try { - r.setAttribute("role", "group"), r.setAttribute("aria-label", C("video.previewControls", "Video preview controls")); - } catch (e) { - console.debug?.(e); - } - let i = document.createElement("button"); - i.type = "button", i.className = "mjr-video-preview-btn", i.title = C("video.playPause", "Play/Pause"); - try { - i.setAttribute("aria-label", C("video.playPause", "Play/Pause")); - } catch (e) { - console.debug?.(e); - } - let a = document.createElement("span"); - a.className = "pi pi-play"; - try { - a.setAttribute("aria-hidden", "true"); - } catch (e) { - console.debug?.(e); - } - i.appendChild(a), r.appendChild(i); - let o = () => { - try { - let t = !!e?.paused; - a.className = `pi ${t ? "pi-play" : "pi-pause"}`; - } catch (e) { - console.debug?.(e); - } - }, s = () => { - try { - let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}); - } catch (e) { - console.debug?.(e); - } - }, c = (t) => { - try { - t?.stopPropagation?.(); - } catch (e) { - console.debug?.(e); - } - try { - e.paused ? s() : e.pause?.(); - } catch (e) { - console.debug?.(e); - } - o(); - }; - try { - t.appendChild(r); - } catch (e) { - console.debug?.(e); - } - try { - s(); - } catch (e) { - console.debug?.(e); - } - n.push(Z(e, "loadedmetadata", () => s(), { passive: !0 })), n.push(Z(e, "canplay", () => s(), { passive: !0 })), n.push(Z(i, "click", c)), n.push(Z(e, "play", o, { passive: !0 })), n.push(Z(e, "pause", o, { passive: !0 })), n.push(Z(e, "ended", () => s(), { passive: !0 })); - try { - o(); - } catch (e) { - console.debug?.(e); - } - return { - controlsEl: r, - destroy: () => { - try { - for (let e of n) X(() => e?.()); - } catch (e) { - console.debug?.(e); - } - try { - r.remove?.(); - } catch (e) { - console.debug?.(e); - } - } - }; -} -function Qt(e, t = {}) { - try { - let n = Jt(t), r = String(t?.mediaKind || "video").toLowerCase() === "audio", i = n === "viewerbar", a = n !== "preview", o = a, s = Yt(t), c = t?.hostEl || e?.parentElement; - if (!e || !c) return { - controlsEl: null, - destroy: kt - }; - if (n === "preview") return Zt(e, c); - try { - e.loop = !1; - } catch (e) { - console.debug?.(e); - } - X(() => c.classList?.add("mjr-video-host")), X(() => e.classList?.add("mjr-video-el")), X(() => { - window.getComputedStyle?.(c)?.position === "static" && (c.style.position = "relative"); - }); - let l = document.createElement("div"); - l.className = `mjr-video-controls mjr-video-controls--${n}`, i && l.classList.add("mjr-video-controls--modern"), r && l.classList.add("mjr-video-controls--audio"), l.dataset.mjrLayout = "regular", l.setAttribute("role", "group"), l.setAttribute("aria-label", r ? C("video.audioControls", "Audio controls") : C("video.controls", "Video controls")); - let u = document.createElement("div"); - u.className = "mjr-video-row mjr-video-row--top"; - let d = document.createElement("div"); - d.className = "mjr-video-row mjr-video-row--bottom", l.appendChild(u), l.appendChild(d); - let f = document.createElement("div"); - f.className = "mjr-video-seek-wrap"; - let p = document.createElement("input"); - p.className = "mjr-video-range mjr-video-range--seek", p.type = "range", p.min = "0", p.max = String(Rt), p.step = "1", p.value = "0", p.setAttribute("aria-label", C("video.seek", "Seek")), p.title = r ? C("video.seekThroughAudio", "Seek through audio") : C("video.seekThrough", "Seek through video"); - let m = document.createElement("div"); - m.className = "mjr-video-seek-overlay"; - let h = null, g = null, _ = null, v = null; - o && (h = document.createElement("div"), h.className = "mjr-video-seek-zones", g = document.createElement("div"), g.className = "mjr-video-seek-zone mjr-video-seek-zone--leftTrim", _ = document.createElement("div"), _.className = "mjr-video-seek-zone mjr-video-seek-zone--selected", v = document.createElement("div"), v.className = "mjr-video-seek-zone mjr-video-seek-zone--rightTrim", h.appendChild(g), h.appendChild(_), h.appendChild(v)); - let y = document.createElement("div"); - y.className = "mjr-video-seek-ticks"; - let b = document.createElement("div"); - b.className = "mjr-video-seek-labels"; - let x = document.createElement("div"); - x.className = "mjr-video-seek-mark mjr-video-seek-mark--in"; - let S = document.createElement("div"); - S.className = "mjr-video-seek-mark mjr-video-seek-mark--out"; - let w = document.createElement("div"); - w.className = "mjr-video-seek-playhead"; - let T = document.createElement("div"); - T.className = "mjr-video-seek-playhead-label", m.appendChild(y), m.appendChild(b), m.appendChild(w), m.appendChild(T); - let E = document.createElement("div"); - E.className = "mjr-video-seek-handle mjr-video-seek-handle--in", E.title = C("video.dragSetIn", "Drag to set In"), E.setAttribute("aria-label", C("video.dragSetIn", "Drag to set In")); - let D = document.createElement("div"); - D.className = "mjr-video-seek-handle mjr-video-seek-handle--out", D.title = C("video.dragSetOut", "Drag to set Out"), D.setAttribute("aria-label", C("video.dragSetOut", "Drag to set Out")), f.appendChild(p), h && f.appendChild(h), f.appendChild(m), o && (f.appendChild(x), f.appendChild(S), f.appendChild(E), f.appendChild(D)); - let O = document.createElement("span"); - O.className = "mjr-video-time", O.textContent = "0:00 / 0:00", O.title = C("video.currentTimeTotal", "Current time / Total duration"); - let k = document.createElement("span"); - k.className = "mjr-video-range-count", k.textContent = ""; - try { - k.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - let A = document.createElement("div"); - A.className = "mjr-video-timegroup", A.appendChild(O), o && A.appendChild(k); - let j = document.createElement("span"); - j.className = "mjr-video-frame", j.textContent = "F: 0", j.title = C("video.currentFrame", "Current frame number"); - let M = Gt("mjr-video-btn--play", C("btn.play", "Play"), C("video.playPauseSpace", "Play/Pause (Space)")), N = Gt("mjr-video-btn--step", "<", C("video.stepBack", "Step back")), ee = Gt("mjr-video-btn--step", ">", C("video.stepForward", "Step forward")), te = Gt("mjr-video-btn--jump mjr-video-btn--in", "|<", C("video.goToIn", "Go to In")), ne = Gt("mjr-video-btn--jump mjr-video-btn--out", ">|", C("video.goToOut", "Go to Out")), re = Gt("mjr-video-btn--mark mjr-video-btn--in", "I", C("video.setInFromCurrent", "Set In from current frame")), ie = Gt("mjr-video-btn--mark mjr-video-btn--out", "O", C("video.setOutFromCurrent", "Set Out from current frame")), ae = Kt("mjr-video-btn--toggle", "pi-refresh", C("video.loopPlaybackInRange", "Loop playback in range"), C("video.loop", "Loop")), oe = ae.btn, se = qt("mjr-video-num--in", { - min: 0, - step: 1, - value: 0, - title: C("video.inFrame", "In frame"), - ariaLabel: C("video.inFrame", "In frame"), - widthPx: 72 - }), ce = qt("mjr-video-num--out", { - min: 0, - step: 1, - value: 0, - title: C("video.outFrame", "Out frame"), - ariaLabel: C("video.outFrame", "Out frame"), - widthPx: 72 - }), le = qt("mjr-video-num--step", { - min: 1, - step: 1, - value: 1, - title: C("video.frameIncrement", "Frame increment"), - ariaLabel: C("video.frameIncrement", "Frame increment"), - widthPx: 56 - }), I = qt("mjr-video-num--fps", { - min: 1, - step: .001, - value: It(s || 30), - title: C("video.fpsStepping", "FPS (used for frame stepping)"), - ariaLabel: C("video.fps", "FPS"), - widthPx: 56 - }), L = document.createElement("select"); - L.className = "mjr-video-num mjr-video-num--speed", L.title = C("video.playbackSpeed", "Playback speed"), L.setAttribute("aria-label", C("video.playbackSpeed", "Playback speed")), L.style.width = "74px"; - for (let e of [ - .25, - .5, - .75, - 1, - 1.25, - 1.5, - 2, - 3, - 5, - 10 - ]) { - let t = document.createElement("option"); - t.value = String(e), t.textContent = `${e}x`, L.appendChild(t); - } - let ue = Kt("mjr-video-btn--mute", "pi-volume-up", C("video.mute", "Mute"), C("video.mute", "Mute")), de = ue.btn, R = document.createElement("div"); - R.className = "mjr-video-volume-wrap", R.style.cssText = "display:none; align-items:center; position:relative;"; - let z = null; - z = document.createElement("input"), z.className = "mjr-video-range mjr-video-range--volume", z.type = "range", z.min = "0", z.max = "1", z.step = "0.02", z.value = String(P(Number(e.volume) || 0)), z.setAttribute("aria-label", C("video.volume", "Volume")), z.title = C("video.volume", "Volume"); - try { - z.style.width = "120px"; - } catch (e) { - console.debug?.(e); - } - R.appendChild(z); - let fe = document.createElement("div"); - fe.className = "mjr-video-group mjr-video-group--in"; - let B = document.createElement("span"); - B.textContent = "In", B.title = C("video.resetInToStart", "Reset In to start"), B.style.cssText = "cursor:pointer; user-select:none;", o && (fe.appendChild(B), fe.appendChild(se)); - let V = document.createElement("div"); - V.className = "mjr-video-group mjr-video-group--out"; - let H = document.createElement("span"); - H.textContent = "Out", H.title = C("video.resetOutToEnd", "Reset Out to end"), H.style.cssText = "cursor:pointer; user-select:none;", o && (V.appendChild(H), V.appendChild(ce)); - let pe = document.createElement("div"); - pe.className = "mjr-video-group mjr-video-group--adjust-left", o && (pe.appendChild(re), r || (pe.appendChild(document.createTextNode(C("video.step", "Step"))), pe.appendChild(le), pe.appendChild(document.createTextNode(C("video.fps", "FPS"))), pe.appendChild(I)), pe.appendChild(j)); - let U = document.createElement("div"); - U.className = "mjr-video-group mjr-video-group--adjust-right", o && (U.appendChild(A), U.appendChild(oe)); - let me = document.createElement("div"); - me.className = "mjr-video-group mjr-video-group--speed", me.appendChild(document.createTextNode(C("video.speed", "Speed"))), me.appendChild(L); - let he = document.createElement("div"); - he.className = "mjr-video-bottom mjr-video-bottom--left"; - let ge = document.createElement("div"); - ge.className = "mjr-video-transport"; - let _e = document.createElement("div"); - if (_e.className = "mjr-video-bottom mjr-video-bottom--right", ge.appendChild(te), r || ge.appendChild(N), ge.appendChild(M), r || ge.appendChild(ee), ge.appendChild(ne), o && he.appendChild(pe), o && _e.appendChild(U), _e.appendChild(me), _e.appendChild(de), o && _e.appendChild(ie), z && _e.appendChild(R), i) { - let e = document.createElement("div"); - e.className = "mjr-video-bar-timeline", o && e.appendChild(fe), e.appendChild(f), o && e.appendChild(V); - let t = document.createElement("div"); - t.className = "mjr-video-bar-actions"; - let n = document.createElement("div"); - n.className = "mjr-video-bar-side mjr-video-bar-side--left", o && n.appendChild(pe); - let r = document.createElement("div"); - r.className = "mjr-video-bar-center", r.appendChild(ge); - let i = document.createElement("div"); - i.className = "mjr-video-bar-side mjr-video-bar-side--right", o && i.appendChild(U), i.appendChild(me), i.appendChild(de), o && i.appendChild(ie), z && i.appendChild(R), t.appendChild(n), t.appendChild(r), t.appendChild(i), l.replaceChildren(e, t); - } else o && u.appendChild(j), o && u.appendChild(fe), u.appendChild(f), o && u.appendChild(V), u.appendChild(A), d.appendChild(he), d.appendChild(ge), d.appendChild(_e); - let W = (e) => { - try { - e.stopPropagation?.(); - } catch (e) { - console.debug?.(e); - } - }, G = (e) => { - try { - e.preventDefault?.(); - } catch (e) { - console.debug?.(e); - } - W(e); - }, K = [], ve = (() => { - try { - return new AbortController(); - } catch { - return { - signal: { - aborted: !1, - addEventListener: kt, - removeEventListener: kt - }, - abort: kt - }; - } - })(); - K.push(() => { - try { - ve.abort(); - } catch (e) { - console.debug?.(e); - } - }); - let ye = () => { - try { - let e = Number(c?.clientWidth) || Number(l?.clientWidth) || 0, t = "regular"; - e > 0 && e < 560 ? t = "stacked" : e > 0 && e < 860 && (t = "compact"), l.dataset.mjrLayout = t; - } catch (e) { - console.debug?.(e); - } - }; - ye(); - try { - if (typeof ResizeObserver == "function" && c) { - let e = typeof requestAnimationFrame == "function" ? requestAnimationFrame : null, t = typeof cancelAnimationFrame == "function" ? cancelAnimationFrame : null, n = 0, r = new ResizeObserver(e ? () => { - n ||= e(() => { - n = 0, ye(); - }); - } : () => ye()); - r.observe(c), K.push(() => { - try { - n && t && t(n), r.disconnect(); - } catch (e) { - console.debug?.(e); - } - }); - } - } catch (e) { - console.debug?.(e); - } - K.push(Z(l, "pointerdown", W)), K.push(Z(l, "dblclick", G, { capture: !0 })), K.push(Z(l, "wheel", G, { - capture: !0, - passive: !1 - })), K.push(Z(window, "dblclick", (e) => { - try { - l.contains?.(e?.target) && G(e); - } catch (e) { - console.debug?.(e); - } - }, { capture: !0 })), K.push(Z(window, "wheel", (e) => { - try { - l.contains?.(e?.target) && G(e); - } catch (e) { - console.debug?.(e); - } - }, { - capture: !0, - passive: !1 - })); - let q = { - outFrame: null, - frameCount: null, - loop: o, - pingpong: !1, - once: !1, - playbackRate: Math.max(.25, Math.min(10, Number(t?.initialPlaybackRate) || 1)), - _seeking: !1, - _ppReverse: !1, - _ppRafId: null, - _userInteracted: !1 - }; - q.nativeFps = s ? It(s, 30) : null, q.fps = q.nativeFps || It(I.value, 30); - let be = () => { - let e = Number(q.nativeFps), t = Number(q.fps); - return Number.isFinite(e) && e > 0 && !Xt(t, e); - }, xe = (e = !1) => { - try { - if (!I || r) return; - let t = Number(q.nativeFps), n = be(), i = C("video.fpsStepping", "FPS (used for frame stepping)"); - I.classList.toggle("is-overridden", n), Number.isFinite(t) && t > 0 ? (I.dataset.defaultFps = String(t), I.title = `${i} - Source FPS: ${t}`, n && (I.title += " - Modified")) : (delete I.dataset.defaultFps, I.title = i), e && !I.matches?.(":focus") && (I.value = String(It(q.fps, q.nativeFps || 30))); - } catch (e) { - console.debug?.(e); - } - }; - xe(!0); - let Se = () => { - if (!q._userInteracted) { - q._userInteracted = !0; - try { - e.muted && (e.muted = !1, Ge?.()); - } catch (e) { - console.debug?.(e); - } - } - }, Ce = null, we = () => { - if (o) try { - j.classList.add("is-step"); - try { - Ce?.(); - } catch (e) { - console.debug?.(e); - } - Ce = Ht(ve.signal, zt, () => { - try { - j.classList.remove("is-step"); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - }; - K.push(() => { - try { - Ce?.(); - } catch (e) { - console.debug?.(e); - } - Ce = null; - try { - j?.classList?.remove?.("is-step"); - } catch (e) { - console.debug?.(e); - } - }); - let Te = (e, t) => { - try { - if (!e) return; - t ? e.classList.add("is-on") : e.classList.remove("is-on"); - } catch (e) { - console.debug?.(e); - } - }, Ee = (t) => { - try { - let n = Number(t); - if (!Number.isFinite(n) || n <= 0) return q.playbackRate; - let r = Math.max(.25, Math.min(10, Math.round(n * 100) / 100)); - q.playbackRate = r; - try { - e.playbackRate = r; - } catch (e) { - console.debug?.(e); - } - try { - L.matches?.(":focus") || (L.value = String(r)); - } catch (e) { - console.debug?.(e); - } - return r; - } catch { - return q.playbackRate; - } - }, De = () => { - try { - Te(oe, !!(q.loop || q.pingpong)); - try { - ae?.icon && (q.pingpong ? (ae.icon.className = "pi pi-sort-alt", oe.title = C("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (ae.icon.className = "pi pi-refresh", oe.title = C("video.loopPlaybackInRange", "Loop playback in range"))); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, Oe = () => { - try { - let t = Number(q.frameCount); - if (Number.isFinite(t) && t > 0) return Math.max(1, Math.floor(t)); - let n = Number(e?.duration), r = It(q.fps, 30); - return !Number.isFinite(n) || n <= 0 ? 0 : Math.max(0, Math.floor(n * r)); - } catch { - return 0; - } - }, ke = (t = null) => { - try { - let n = t ?? e?.currentTime, r = Number(n), i = It(q.fps, 30); - return !Number.isFinite(r) || r < 0 ? 0 : Math.max(0, Math.floor(r * i + 1e-6)); - } catch { - return 0; - } - }, Ae = (e) => { - let t = It(q.fps, 30); - return Math.max(0, Number(e) || 0) / t; - }, je = () => { - try { - let e = Oe(); - if (e <= 0) return; - let t = q.inFrame == null ? 0 : F(q.inFrame, 0, e), n = q.outFrame == null ? e : F(q.outFrame, 0, e); - n < t ? (q.inFrame = n, q.outFrame = t) : (q.inFrame = t, q.outFrame = n); - } catch (e) { - console.debug?.(e); - } - }, Me = () => { - try { - let e = Oe(); - return { - inF: q.inFrame == null ? 0 : F(q.inFrame, 0, e), - outF: q.outFrame == null ? e : F(q.outFrame, 0, e), - maxF: e - }; - } catch { - return { - inF: 0, - outF: 0, - maxF: 0 - }; - } - }, Ne = () => { - try { - if (!o || r) return Rt; - let e = Oe(); - if (Number.isFinite(e) && e > Rt) return Math.max(Rt, Math.floor(e)); - } catch (e) { - console.debug?.(e); - } - return Rt; - }, Pe = () => { - try { - p.max = String(Ne()); - } catch (e) { - console.debug?.(e); - } - }, Fe = () => { - try { - let t = !e?.paused || q._ppReverse; - M.textContent = t ? C("video.pause", "Pause") : C("video.play", "Play"); - } catch (e) { - console.debug?.(e); - } - }, Ie = () => { - try { - let t = !!e?.muted || (Number(e?.volume) || 0) <= .001; - try { - ue.icon.className = `pi ${t ? "pi-volume-off" : "pi-volume-up"}`; - } catch (e) { - console.debug?.(e); - } - let n = t ? C("video.unmute", "Unmute") : C("video.mute", "Mute"); - de.title = n, de.setAttribute("aria-label", n); - } catch (e) { - console.debug?.(e); - } - }, J = (t = null) => { - try { - let n = Number(e?.duration), i = t ?? e?.currentTime, s = Number(i), c = Number.isFinite(n) && n > 0; - if (O.textContent = `${Wt(s)} / ${c ? Wt(n) : "0:00"}`, p.disabled = !c, c) { - let e = P((s || 0) / n); - Pe(); - let t = Math.round(e * Ne()); - Number.isNaN(t) || q._seeking || p.matches?.(":active") || (p.value = String(t)); - try { - w.style.left = `${e * 100}%`; - } catch (e) { - console.debug?.(e); - } - } else { - p.value = "0"; - try { - w.style.left = "0%"; - } catch (e) { - console.debug?.(e); - } - } - let l = o ? Oe() : 0, u = o ? ke(s) : 0; - if (a) { - o && (j.textContent = r ? `T: ${Wt(s)} / ${Wt(n)}` : `F: ${u} / ${l}`); - try { - if (Number.isFinite(n) && n > 0) { - let e = P((s || 0) / n); - T.style.left = `${e * 100}%`, T.textContent = r ? Wt(s) : String(u), T.style.display = ""; - } else T.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - } - if (o) { - se.matches?.(":focus") || (se.value = String(q.inFrame ?? 0)), ce.matches?.(":focus") || (ce.value = String(q.outFrame ?? l)); - try { - let { inF: e, outF: t, maxF: n } = Me(), i = e <= 0 && t >= n, a = Math.max(0, Math.floor(t) - Math.floor(e) + 1); - !i && n > 0 ? (k.textContent = r ? `R: ${Wt(a / It(q.fps, 30))}` : `R: ${a}f`, k.style.display = "") : k.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - }, Le = () => { - if (a && r) try { - let t = Number(e?.duration); - if (!Number.isFinite(t) || t <= 0) { - y.style.backgroundImage = "", b.replaceChildren(); - try { - b.dataset.mjrLabelKey = ""; - } catch (e) { - console.debug?.(e); - } - return; - } - let n = Vt(t, 80), r = Vt(t, 8), i = n / t * 100, a = r / t * 100; - if (Number.isFinite(i) && i > .02) { - let e = `repeating-linear-gradient(to right, rgba(255,255,255,0.16) 0, rgba(255,255,255,0.16) 1px, transparent 1px, transparent ${i}%)`, t = `repeating-linear-gradient(to right, rgba(255,255,255,0.3) 0, rgba(255,255,255,0.3) 1px, transparent 1px, transparent ${a}%)`; - y.style.backgroundImage = `${t}, ${e}`; - } else y.style.backgroundImage = ""; - let o = `audio|${Math.round(t * 1e3)}|${Math.round(r * 1e3)}`; - if (b?.dataset?.mjrLabelKey === o) return; - b.dataset.mjrLabelKey = o, b.replaceChildren(); - let s = (e) => { - let n = document.createElement("span"); - n.className = "mjr-video-seek-label"; - let r = Math.max(0, Math.min(t, Number(e) || 0)); - return n.style.left = `${P(r / t) * 100}%`, n.textContent = Wt(r), n; - }; - b.appendChild(s(0)); - for (let e = r; e < t; e += r) b.appendChild(s(e)); - b.appendChild(s(t)); - } catch (e) { - console.debug?.(e); - } - }, Re = () => { - if (!o) Le(); - else try { - let { inF: e, outF: t, maxF: n } = Me(); - if (!Number.isFinite(n) || n <= 0) return; - let i = P(e / n) * 100, a = P(t / n) * 100, o = e <= 0 && t >= n; - try { - p.style.background = ""; - } catch (e) { - console.debug?.(e); - } - try { - let e = P(i / 100) * 100, t = P(a / 100) * 100, n = Math.min(e, t), r = Math.max(e, t); - if (h && g && _ && v) { - g.style.left = "0%", g.style.width = `${n}%`, _.style.left = `${n}%`, _.style.width = `${Math.max(0, r - n)}%`, v.style.left = `${r}%`, v.style.width = `${Math.max(0, 100 - r)}%`; - try { - h.classList.toggle("is-trimmed", !o), h.classList.toggle("is-fullrange", o); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - try { - x.style.left = `${i}%`, S.style.left = `${a}%`; - } catch (e) { - console.debug?.(e); - } - try { - E.style.left = `${i}%`, D.style.left = `${a}%`; - } catch (e) { - console.debug?.(e); - } - if (r) { - Le(); - return; - } - try { - let e = Math.max(1, Math.floor(n / Lt)), t = Math.max(e, Math.floor(Number(q.step) || 1)), r = t / n * 100, i = r * 10; - if (Number.isFinite(r) && r > .02) { - let e = `repeating-linear-gradient(to right, rgba(255,255,255,0.16) 0, rgba(255,255,255,0.16) 1px, transparent 1px, transparent ${r}%)`, t = `repeating-linear-gradient(to right, rgba(255,255,255,0.28) 0, rgba(255,255,255,0.28) 1px, transparent 1px, transparent ${i}%)`; - y.style.backgroundImage = `${t}, ${e}`; - } else y.style.backgroundImage = ""; - (() => { - try { - let e = `${n}|${t}`; - if (b?.dataset?.mjrLabelKey === e) return; - b.dataset.mjrLabelKey = e; - } catch (e) { - console.debug?.(e); - } - try { - b.replaceChildren(); - } catch (e) { - console.debug?.(e); - } - let e = Math.max(1, t * 10); - try { - for (; e > 0 && Math.ceil(n / e) > 22;) e *= 2; - } catch (e) { - console.debug?.(e); - } - let r = (e) => { - let t = document.createElement("span"); - t.className = "mjr-video-seek-label"; - let r = P(e / n) * 100; - return t.style.left = `${r}%`, t.textContent = String(Math.floor(e)), t; - }; - try { - b.appendChild(r(0)); - } catch (e) { - console.debug?.(e); - } - for (let t = e; t < n; t += e) try { - b.appendChild(r(t)); - } catch (e) { - console.debug?.(e); - } - try { - b.appendChild(r(n)); - } catch (e) { - console.debug?.(e); - } - })(); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, ze = ({ prefer: e = null } = {}) => { - if (o) try { - je(); - let { inF: t, outF: n } = Me(), r = ke(); - e === "in" ? Ke(t) : e === "out" ? r > n && Ke(n) : r < t ? Ke(t) : r > n && Ke(n); - } catch (e) { - console.debug?.(e); - } - }, Be = () => { - try { - q.inFrame = 0, je(), J(), Re(), ze({ prefer: "in" }); - } catch (e) { - console.debug?.(e); - } - }, Ve = () => { - try { - let { maxF: e } = Me(); - q.outFrame = Math.max(0, Number(e) || 0), je(), J(), Re(), ze({ prefer: "out" }); - } catch (e) { - console.debug?.(e); - } - }, He = () => { - try { - q._ppRafId != null && (cancelAnimationFrame(q._ppRafId), q._ppRafId = null); - } catch (e) { - console.debug?.(e); - } - }; - K.push(He); - let Ue = () => { - try { - He(), q._ppReverse = !0, e.pause?.(), Fe(); - let t = 1e3 / (It(q.fps, 30) * Math.max(.25, Number(q.playbackRate) || 1)), n = performance.now(), r = (i) => { - try { - if (!q._ppReverse || !q.pingpong) { - q._ppReverse = !1, Fe(); - return; - } - let a = i - n; - if (a >= t) { - n = i - a % t; - let { inF: r } = Me(), o = ke(); - if (o <= r) { - q._ppReverse = !1, Ke(r); - let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}), Fe(), J(); - return; - } - let s = Math.max(1, Math.floor(Number(q.step) || 1)); - Ke(o - s), J(); - } - q._ppRafId = requestAnimationFrame(r); - } catch (e) { - console.debug?.(e), q._ppReverse = !1, Fe(); - } - }; - q._ppRafId = requestAnimationFrame(r); - } catch (e) { - console.debug?.(e), q._ppReverse = !1; - } - }, We = () => { - try { - let e = Oe(); - q.inFrame = 0, q.outFrame = e > 0 ? e : null, q.step = 1, q.loop = !!o, q.pingpong = !1, q._ppReverse = !1, He(), q.once = !1, Ee(1); - try { - le.value = "1"; - } catch (e) { - console.debug?.(e); - } - try { - L.matches?.(":focus") || (L.value = "1"); - } catch (e) { - console.debug?.(e); - } - je(), De(), J(), Re(), ze({ prefer: "in" }); - } catch (e) { - console.debug?.(e); - } - }, Ge = () => { - try { - let t = P(Number(e?.volume) || 0); - try { - z && !z.matches?.(":active") && (z.value = String(t)); - } catch (e) { - console.debug?.(e); - } - Ie(); - } catch (e) { - console.debug?.(e); - } - }, Ke = (t) => { - try { - let { maxF: n } = Me(), r = F(t, 0, n > 0 ? n : Infinity); - e.currentTime = Ae(r); - } catch (e) { - console.debug?.(e); - } - J(); - }, qe = (t) => { - Se(); - try { - let n = Math.max(1, Math.floor(Number(q.step) || 1)), { inF: r, outF: i } = Me(), a = ke() + t * n; - q.loop ? (a < r && (a = i), a > i && (a = r)) : a = F(a, r, i); - try { - e.pause?.(); - } catch (e) { - console.debug?.(e); - } - Ke(a), we(); - } catch (e) { - console.debug?.(e); - } - }, Je = () => { - if (o) try { - je(); - let { inF: e, outF: t } = Me(), n = ke(); - (n < e || n > t) && Ke(e); - } catch (e) { - console.debug?.(e); - } - }, Ye = () => { - Se(); - try { - if (q._ppReverse) { - q._ppReverse = !1, He(), Fe(); - return; - } - if (e.paused) { - Je(); - let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}); - } else e.pause?.(); - } catch (e) { - console.debug?.(e); - } - Fe(); - }; - K.push(Z(e, "click", (t) => { - try { - if (t?.target !== e) return; - } catch (e) { - console.debug?.(e); - } - Ye(); - })), K.push(Z(M, "click", (e) => { - W(e), Ye(); - })), K.push(Z(N, "click", (e) => { - W(e), qe(-1); - })), K.push(Z(ee, "click", (e) => { - W(e), qe(1); - })), K.push(Z(te, "click", (e) => { - W(e); - let { inF: t } = Me(); - Ke(t), we(); - })), K.push(Z(ne, "click", (e) => { - W(e); - let { outF: t } = Me(); - Ke(t), we(); - })); - let Xe = (t) => { - try { - let n = Number(e?.duration); - if (!Number.isFinite(n) || n <= 0) return !1; - let r = f.getBoundingClientRect?.(), i = Number(r?.width) || 0; - if (!(i > 0)) return !1; - let a = F((Number(t) || 0) - Number(r.left || 0), 0, i), o = P(a / i), s = o * n; - return e.currentTime = s, Pe(), p.value = String(Math.round(o * Ne())), J(s), !0; - } catch (e) { - return console.debug?.(e), !1; - } - }, Y = { - active: !1, - pointerId: null, - ac: null - }, Ze = (e = null) => { - if (Y.active) { - e && G(e), Y.active = !1, q._seeking = !1; - try { - f.releasePointerCapture?.(Y.pointerId); - } catch (e) { - console.debug?.(e); - } - Y.pointerId = null; - try { - Y.ac?.abort?.(); - } catch (e) { - console.debug?.(e); - } - Y.ac = null, J(); - } - }, Qe = (e) => { - Y.active && (G(e), Xe(e.clientX)); - }; - if (K.push(() => Ze()), K.push(Z(f, "pointerdown", (e) => { - try { - if (e?.button != null && e.button !== 0 || e?.target?.closest?.(".mjr-video-seek-handle, .mjr-video-seek-mark")) return; - } catch (e) { - console.debug?.(e); - } - G(e), Se(), q._seeking = !0, Y.active = !0, Y.pointerId = e?.pointerId ?? null, Xe(e?.clientX); - try { - f.setPointerCapture?.(Y.pointerId); - } catch (e) { - console.debug?.(e); - } - try { - Y.ac?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - let e = new AbortController(); - Y.ac = e, window.addEventListener("pointermove", Qe, { - passive: !1, - capture: !0, - signal: e.signal - }), window.addEventListener("pointerup", Ze, { - passive: !1, - capture: !0, - signal: e.signal - }), window.addEventListener("pointercancel", Ze, { - passive: !1, - capture: !0, - signal: e.signal - }), window.addEventListener("blur", Ze, { signal: e.signal }); - } catch (e) { - console.debug?.(e); - } - }, { passive: !1 })), K.push(Z(p, "pointerdown", () => { - q._seeking = !0; - })), K.push(Z(p, "pointerup", () => { - Y.active || (q._seeking = !1); - })), K.push(Z(p, "pointercancel", () => { - Y.active || (q._seeking = !1); - })), K.push(Z(p, "input", (t) => { - W(t), Se(); - try { - let t = Number(e?.duration); - if (!Number.isFinite(t) || t <= 0) return; - let n = Number(p.value); - e.currentTime = P((Number.isFinite(n) ? n : 0) / Ne()) * t; - } catch (e) { - console.debug?.(e); - } - J(); - })), o) { - K.push(Z(re, "click", (e) => { - W(e), q.inFrame = ke(), je(), J(), Re(), ze({ prefer: "in" }); - })), K.push(Z(ie, "click", (e) => { - W(e), q.outFrame = ke(), je(), J(), Re(), ze({ prefer: "out" }); - })), K.push(Z(se, "change", (e) => { - W(e); - try { - let e = Number(se.value); - q.inFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, je(); - } catch (e) { - console.debug?.(e); - } - J(), Re(), ze({ prefer: "in" }); - })), K.push(Z(ce, "change", (e) => { - W(e); - try { - let e = Number(ce.value); - q.outFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, je(); - } catch (e) { - console.debug?.(e); - } - J(), Re(), ze({ prefer: "out" }); - })), K.push(Z(le, "change", (e) => { - W(e); - try { - q.step = Math.max(1, Math.floor(Number(le.value) || 1)), le.value = String(q.step); - } catch (e) { - console.debug?.(e); - } - })), K.push(Z(I, "change", (e) => { - W(e); - try { - q.fps = It(I.value, 30), I.value = String(q.fps), xe(!1), je(); - } catch (e) { - console.debug?.(e); - } - J(), Re(); - })), K.push(Z(oe, "click", (e) => { - W(e), !q.loop && !q.pingpong ? (q.loop = !0, q.pingpong = !1) : q.loop && !q.pingpong ? (q.loop = !1, q.pingpong = !0) : (q.loop = !1, q.pingpong = !1), (q.loop || q.pingpong) && (q.once = !1), q.pingpong || (q._ppReverse = !1, He()), De(); - })), K.push(Z(B, "click", (e) => { - W(e), Be(); - })), K.push(Z(H, "click", (e) => { - W(e), Ve(); - })), K.push(Z(k, "click", (e) => { - W(e), We(); - })); - try { - k.title = C("video.resetPlayerControls", "Reset player controls"), k.style.cursor = "pointer", k.style.userSelect = "none"; - } catch (e) { - console.debug?.(e); - } - } - K.push(Z(de, "click", (t) => { - W(t); - try { - e.muted = !e.muted, R && (R.style.display = e.muted ? "none" : "inline-flex"); - } catch (e) { - console.debug?.(e); - } - Ge(); - })), K.push(Z(de, "contextmenu", (e) => { - G(e); - try { - if (!R) return; - let e = R.style.display !== "none"; - R.style.display = e ? "none" : "inline-flex"; - } catch (e) { - console.debug?.(e); - } - Ge(); - })), K.push(Z(window, "pointerdown", (e) => { - try { - if (!R || R.style.display === "none" || de.contains?.(e?.target) || R.contains?.(e?.target)) return; - R.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - }, { capture: !0 })), z && K.push(Z(z, "input", (t) => { - W(t); - try { - let t = P(Number(z.value) || 0); - e.volume = t, t > .001 && (e.muted = !1); - } catch (e) { - console.debug?.(e); - } - Ge(); - })), K.push(Z(L, "change", (e) => { - W(e); - try { - Ee(Number(L.value) || 1); - } catch (e) { - console.debug?.(e); - } - try { - L.blur?.(); - } catch (e) { - console.debug?.(e); - } - })), K.push(Z(e, "ratechange", () => { - try { - Ee(Number(e.playbackRate) || q.playbackRate || 1); - } catch (e) { - console.debug?.(e); - } - })); - let $e = () => { - if (o) try { - if (q._seeking || e?.paused) return; - let { inF: t, outF: n, maxF: r } = Me(); - if (r <= 0 || t <= 0 && n >= r && !q.loop && !q.pingpong && !q.once || q._ppReverse) return; - let i = ke(); - if (i >= n - Math.max(1, Math.floor(Number(q.step) || 1))) { - if (q.pingpong) { - Ue(); - return; - } - if (q.loop) { - Ke(t); - try { - let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}); - } catch (e) { - console.debug?.(e); - } - } else if (q.once) { - try { - e.pause?.(); - } catch (e) { - console.debug?.(e); - } - Ke(n); - } else { - try { - e.pause?.(); - } catch (e) { - console.debug?.(e); - } - Ke(n); - } - } else i < t && Ke(t); - } catch (e) { - console.debug?.(e); - } - }, et = { - rafId: null, - rvfcId: null - }, tt = () => { - try { - et.rvfcId != null && typeof e?.cancelVideoFrameCallback == "function" && e.cancelVideoFrameCallback(et.rvfcId); - } catch (e) { - console.debug?.(e); - } - et.rvfcId = null; - try { - et.rafId != null && typeof cancelAnimationFrame == "function" && cancelAnimationFrame(et.rafId); - } catch (e) { - console.debug?.(e); - } - et.rafId = null; - }, nt = (t = 0, n = null) => { - et.rafId = null, et.rvfcId = null; - try { - X(J, n?.mediaTime), X($e); - } catch (e) { - console.debug?.(e); - } - if (!(!q._ppReverse && e?.paused || ve.signal?.aborted)) { - try { - if (typeof e?.requestVideoFrameCallback == "function" && !q._ppReverse) { - et.rvfcId = e.requestVideoFrameCallback(nt); - return; - } - } catch (e) { - console.debug?.(e); - } - try { - typeof requestAnimationFrame == "function" && (et.rafId = requestAnimationFrame((t) => { - nt(t, { mediaTime: Number(e?.currentTime) || 0 }); - })); - } catch (e) { - console.debug?.(e); - } - } - }, rt = () => { - tt(), !(!q._ppReverse && e?.paused || ve.signal?.aborted) && nt(0, { mediaTime: Number(e?.currentTime) || 0 }); - }; - K.push(tt), K.push(Z(e, "play", () => { - X(Fe), rt(); - })); - for (let t of ["pause", "ended"]) K.push(Z(e, t, () => { - tt(), X(Fe), X(J); - })); - for (let t of [ - "timeupdate", - "loadedmetadata", - "durationchange", - "seeked" - ]) K.push(Z(e, t, () => X(J))); - K.push(Z(e, "timeupdate", $e)), K.push(Z(e, "ended", () => { - if (o) try { - let { inF: t, outF: n, maxF: r } = Me(), i = t <= 0 && n >= r; - if (q.pingpong && !q._ppReverse) { - Ue(); - return; - } - if (!q.loop && !i) return; - Ke(t); - try { - let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, { passive: !0 })), a && (K.push(Z(e, "loadedmetadata", () => { - if (!o) Re(); - else { - try { - let e = Oe(); - e > 0 && q.inFrame == null && q.outFrame == null && (q.inFrame = 0, q.outFrame = e, je()); - } catch (e) { - console.debug?.(e); - } - Re(); - } - })), K.push(Z(e, "durationchange", () => X(Re)))), o && K.push(Z(e, "mjr:frameStep", () => { - X(we); - })); - for (let t of ["volumechange"]) K.push(Z(e, t, () => X(Ge))); - try { - q.fps = It(I.value, q.nativeFps || 30), xe(!0), q.step = Math.max(1, Math.floor(Number(le.value) || 1)), je(), De(), Ee(q.playbackRate); - } catch (e) { - console.debug?.(e); - } - X(Fe), X(J), X(Re), X(Ge); - try { - (!e?.paused || q._ppReverse) && rt(); - } catch (e) { - console.debug?.(e); - } - let it = (e = {}) => { - let t = 0, n = !1; - try { - t = Math.max(0, Oe()), n = t > 0 && q.outFrame != null && q.outFrame >= t - 1; - } catch (e) { - console.debug?.(e); - } - try { - let t = Number(e?.fps); - if (Number.isFinite(t) && t > 0) { - if (String(e?.fpsSource || e?.source || "") === "rvfc" && Number(q.nativeFps) > 0) return; - let n = be(); - q.nativeFps = It(t, q.nativeFps || 30), n || (q.fps = q.nativeFps); - try { - xe(!0); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - try { - let t = Number(e?.frameCount); - q.frameCount = Number.isFinite(t) && t > 0 ? Math.floor(t) : null; - } catch { - q.frameCount = null; - } - try { - let e = Math.max(0, Oe()); - n && e > t + .5 && (q.outFrame = null), je(), De(), J(), Re(); - } catch (e) { - console.debug?.(e); - } - }; - try { - if (o) { - let e = Number(t?.initialFps), n = Number(t?.initialFrameCount); - (Number.isFinite(e) || Number.isFinite(n)) && it({ - fps: e, - frameCount: n - }); - } - } catch (e) { - console.debug?.(e); - } - if (o) { - let e = { - active: !1, - which: null, - pointerId: null, - ac: null, - captureEl: null - }, t = (e) => { - try { - let t = f.getBoundingClientRect(), n = F((Number(e) || 0) - t.left, 0, t.width || 1), r = t.width > 0 ? n / t.width : 0, { maxF: i } = Me(); - return F(Math.round(r * i), 0, i); - } catch { - return 0; - } - }, n = (n, a) => { - G(n); - try { - e.ac?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e.ac = null, e.active = !0, e.which = a, e.pointerId = n.pointerId; - try { - e.captureEl = n.currentTarget || null; - } catch { - e.captureEl = null; - } - try { - e.captureEl?.setPointerCapture?.(n.pointerId); - } catch (e) { - console.debug?.(e); - } - try { - f.setPointerCapture?.(n.pointerId); - } catch (e) { - console.debug?.(e); - } - try { - let t = new AbortController(); - e.ac = t, window.addEventListener("pointermove", r, { - passive: !1, - capture: !0, - signal: t.signal - }), window.addEventListener("pointerup", i, { - passive: !1, - capture: !0, - signal: t.signal - }), window.addEventListener("pointercancel", i, { - passive: !1, - capture: !0, - signal: t.signal - }); - } catch (e) { - console.debug?.(e); - } - let o = t(n.clientX); - a === "in" ? q.inFrame = o : q.outFrame = o, je(), J(), Re(), ze({ prefer: a }); - }, r = (n) => { - if (!e.active) return; - G(n); - let r = t(n.clientX); - e.which === "in" ? q.inFrame = r : q.outFrame = r, je(), J(), Re(); - }, i = (t) => { - if (e.active) { - G(t), e.active = !1; - try { - f.releasePointerCapture?.(e.pointerId); - } catch (e) { - console.debug?.(e); - } - try { - e.captureEl?.releasePointerCapture?.(e.pointerId); - } catch (e) { - console.debug?.(e); - } - e.captureEl = null, e.pointerId = null; - try { - ze({ prefer: e.which }); - } catch (e) { - console.debug?.(e); - } - try { - e.ac?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e.ac = null; - } - }; - K.push(Z(E, "pointerdown", (e) => n(e, "in"), { passive: !1 })), K.push(Z(D, "pointerdown", (e) => n(e, "out"), { passive: !1 })), K.push(Z(x, "pointerdown", (e) => n(e, "in"), { passive: !1 })), K.push(Z(S, "pointerdown", (e) => n(e, "out"), { passive: !1 })), K.push(Z(f, "pointermove", r, { passive: !1 })), K.push(Z(f, "pointerup", i, { passive: !1 })), K.push(Z(f, "pointercancel", i, { passive: !1 })); - } - return X(() => c.appendChild(l)), { - controlsEl: l, - setMediaInfo: it, - setPlaybackRate: (e) => { - try { - return Ee(e); - } catch { - return q.playbackRate || 1; - } - }, - getPlaybackRate: () => { - try { - return Number(q.playbackRate) || 1; - } catch { - return 1; - } - }, - adjustPlaybackRate: (e) => { - try { - let t = Number(e); - return Number.isFinite(t) ? Ee((Number(q.playbackRate) || 1) + t) : q.playbackRate || 1; - } catch { - return q.playbackRate || 1; - } - }, - togglePlay: () => { - try { - return Ye(), !0; - } catch { - return !1; - } - }, - stepFrames: (e) => { - try { - return qe(e), !0; - } catch { - return !1; - } - }, - setInPoint: () => { - if (!o) return !1; - try { - return q.inFrame = ke(), je(), J(), Re(), ze({ prefer: "in" }), !0; - } catch { - return !1; - } - }, - setOutPoint: () => { - if (!o) return !1; - try { - return q.outFrame = ke(), je(), J(), Re(), ze({ prefer: "out" }), !0; - } catch { - return !1; - } - }, - goToIn: () => { - if (!o) return !1; - try { - let { inF: e } = Me(); - return Ke(e), we(), !0; - } catch { - return !1; - } - }, - goToOut: () => { - if (!o) return !1; - try { - let { outF: e } = Me(); - return Ke(e), we(), !0; - } catch { - return !1; - } - }, - destroy: () => { - for (let e of K) X(e); - X(() => l.remove()); - } - }; - } catch { - return { - controlsEl: null, - destroy: kt - }; - } -} -// ui/features/contextmenu/viewerContextMenuState.ts -function $t() { - return { - open: !1, - x: 0, - y: 0, - items: [], - title: "" - }; -} -var Q = j({ - portalOwnerId: "", - mountedPortalIds: [], - main: $t(), - submenu: $t(), - tags: { - open: !1, - x: 0, - y: 0, - asset: null, - onChanged: null - } -}), en = 1; -function tn(e) { - e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = ""); -} -function nn(e = "") { - try { - window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } })); - } catch (e) { - console.debug?.(e); - } -} -function rn() { - let e = `mjr-viewer-context-menu-portal-${en++}`; - return Q.mountedPortalIds.push(e), Q.portalOwnerId ||= e, e; -} -function an(e) { - let t = Q.mountedPortalIds.filter((t) => t !== e); - Q.mountedPortalIds.splice(0, Q.mountedPortalIds.length, ...t), Q.portalOwnerId === e && (Q.portalOwnerId = Q.mountedPortalIds[0] || ""); -} -function on(e) { - return String(Q.portalOwnerId || "") === String(e || ""); -} -function sn({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - nn("viewer"), fn(), un(), Q.main.open = !0, Q.main.x = Number(e) || 0, Q.main.y = Number(t) || 0, Q.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Q.main.title = String(r || ""); -} -function cn() { - tn(Q.main), un(); -} -function ln({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - Q.submenu.open = !0, Q.submenu.x = Number(e) || 0, Q.submenu.y = Number(t) || 0, Q.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], Q.submenu.title = String(r || ""); -} -function un() { - tn(Q.submenu); -} -function dn({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { - cn(), Q.tags.open = !!n, Q.tags.x = Number(e) || 0, Q.tags.y = Number(t) || 0, Q.tags.asset = n || null, Q.tags.onChanged = typeof r == "function" ? r : null; -} -function fn() { - Q.tags.open = !1, Q.tags.x = 0, Q.tags.y = 0, Q.tags.asset = null, Q.tags.onChanged = null; -} -function pn() { - cn(), fn(); -} -// ui/features/viewer/ViewerContextMenu.ts -var mn = { - COPY_PATH: "Ctrl+Shift+C", - DOWNLOAD: "S", - OPEN_IN_FOLDER: "Ctrl+Shift+E", - ADD_TO_COLLECTION: "B", - EDIT_TAGS: "T", - RATING_SUBMENU: "1-5", - RENAME: "F2", - DELETE: "Del" -}, hn = [ - "B", - "KB", - "MB", - "GB", - "TB" -], gn = /* @__PURE__ */ new WeakMap(), _n = 1; -function vn(e = "viewer-menu-item") { - return `${e}-${_n++}`; -} -function yn(e, t, n, r, i = {}) { - return { - id: vn(), - type: "item", - label: String(e || ""), - iconClass: t ? String(t) : "", - rightHint: n ? String(n) : "", - action: typeof r == "function" ? r : null, - disabled: !!i.disabled, - closeOnSelect: i.closeOnSelect !== !1, - submenu: Array.isArray(i.submenu) ? i.submenu.filter(Boolean) : null - }; -} -function bn() { - return { - id: vn("viewer-menu-separator"), - type: "separator" - }; -} -function xn(e) { - let t = String(e || "").trim(); - if (!t) return !1; - if (t.startsWith("/")) return !0; - try { - let e = new URL(t); - return e.protocol === "http:" || e.protocol === "https:"; - } catch { - return !1; - } -} -function Sn(t, n, r) { - let i = t?.id; - try { - t.rating = n; - } catch (e) { - console.debug?.(e); - } - try { - r?.(); - } catch (e) { - console.debug?.(e); - } - i ? Et(String(i), n, { - successMessage: n > 0 ? `Rating set to ${n} stars` : "Rating cleared", - errorMessage: "Failed to update rating", - warnPrefix: "[ViewerContextMenu]", - onSuccess: () => { - ce(k, { - assetId: String(i), - rating: n - }, { warnPrefix: "[ViewerContextMenu]" }); - }, - onFailure: (e) => { - a(e, "[ViewerContextMenu] Rating update", { showToast: !0 }); - } - }) : e(t, n).catch((e) => { - a(e, "[ViewerContextMenu] Rating update", { showToast: !0 }); - }); -} -function Cn(e) { - let t = Number(e); - if (!Number.isFinite(t) || t < 0) return ""; - let n = 0; - for (; t >= 1024 && n < hn.length - 1;) t /= 1024, n += 1; - return `${n === 0 ? `${Math.round(t)}` : t.toFixed(2)} ${hn[n]}`; -} -function wn(e, t, n) { - let r = [ - 5, - 4, - 3, - 2, - 1 - ].map((r) => yn(`${r} Stars`, "pi pi-star", null, async () => { - Sn(e, r, t); - }, { disabled: !n })); - return r.push(bn()), r.push(yn(C("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { - Sn(e, 0, t); - }, { disabled: !n })), r; -} -function Tn({ asset: e, event: n, getCurrentViewUrl: i, onAssetChanged: s }) { - let c = typeof i == "function" ? i(e) : O(e), l = !!(e?.id || e?.filepath); - return [ - yn(C("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { - xn(c) && window.open(c, "_blank", "noopener,noreferrer"); - }), - yn(C("ctx.copyPath", "Copy path"), "pi pi-copy", mn.COPY_PATH, async () => { - let t = e?.filepath ? String(e.filepath) : ""; - if (!t) o(C("toast.noFilePath"), "error"); - else try { - await navigator.clipboard.writeText(t), o(C("toast.pathCopied"), "success", 2e3); - } catch (e) { - console.error("[ViewerContextMenu] Copy failed:", e), o(C("toast.pathCopyFailed"), "error"); - } - }), - yn(C("ctx.downloadOriginal", "Download Original"), "pi pi-download", mn.DOWNLOAD, async () => { - if (!e || !e.filepath) return; - let t = v(e.filepath), n = document.createElement("a"); - n.href = t, n.download = e.filename, document.body.appendChild(n), n.click(), document.body.removeChild(n), o(C("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3); - }, { disabled: !e?.filepath }), - yn(C("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", mn.OPEN_IN_FOLDER, async () => { - let t = await r(e); - t?.ok ? o(C("toast.openedInFolder"), "info", 2e3) : o(t?.error || C("toast.openFolderFailed"), "error"); - }, { disabled: !(e?.id || e?.filepath) }), - yn(C("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", mn.ADD_TO_COLLECTION, async () => { - try { - await bt({ - x: n?.clientX, - y: n?.clientY, - assets: [e] - }); - } catch (e) { - console.error("[ViewerContextMenu] Add to collection failed:", e); - } - }), - bn(), - yn(C("ctx.editTags", "Edit tags"), "pi pi-tags", mn.EDIT_TAGS, async () => { - dn({ - x: (Number(n?.clientX) || 0) + 6, - y: (Number(n?.clientY) || 0) + 6, - asset: e, - onChanged: ((...t) => { - let n = t[0]; - e.tags = n, ce(w, { - assetId: String(e.id), - tags: n - }, { warnPrefix: "[ViewerContextMenu]" }); - try { - s?.(); - } catch (e) { - console.debug?.(e); - } - }) - }); - }, { closeOnSelect: !1 }), - bn(), - yn(C("ctx.setRating", "Set rating"), "pi pi-star", `${mn.RATING_SUBMENU} >`, null, { - disabled: !l, - closeOnSelect: !1, - submenu: wn(e, s, l) - }), - yn(C("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { - if (e?.id) try { - let t = await f(e.id, { refresh: !0 }); - if (!t?.ok || !t?.data) { - o(t?.error || C("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error"); - return; - } - let n = t.data; - try { - ce(_, { - assetId: String(e.id), - info: n - }, { warnPrefix: "[ViewerContextMenu]" }); - } catch (e) { - console.debug?.(e); - } - let r = [], i = Cn(n?.size_bytes); - i && r.push(i), n?.mime && r.push(n.mime); - let a = r.length ? ` (${r.join(", ")})` : ""; - o(C("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: a }), "success", 3e3); - } catch (e) { - a(e, "[ViewerContextMenu] Metadata refresh", { showToast: !0 }); - } - }, { disabled: !e?.id }), - bn(), - yn(C("ctx.rename", "Rename"), "pi pi-pencil", mn.RENAME, async () => { - if (!(e?.id || e?.filepath)) return; - let t = e.filename || "", n = ut(await L(C("dialog.rename.title", "Rename file"), t), t); - if (!n || n === t) return; - let r = st(n); - if (!r.valid) o(r.reason, "error"); - else try { - let t = await m(e, n); - if (t?.ok) { - let r = t?.data?.asset; - r && typeof r == "object" ? Object.assign(e, r) : (e.filename = n, e.filepath = e.filepath.replace(/[^\\/]+$/, n), e.path &&= String(e.path).replace(/[^\\/]+$/, n), e.file_info && typeof e.file_info == "object" && (e.file_info.filename = n, e.file_info.filepath && (e.file_info.filepath = String(e.file_info.filepath).replace(/[^\\/]+$/, n)), e.file_info.path && (e.file_info.path = String(e.file_info.path).replace(/[^\\/]+$/, n)))), o(C("toast.fileRenamedSuccess"), "success"); - try { - window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "viewer-rename" } })); - } catch (e) { - console.debug?.(e); - } - s?.(); - } else o(t?.error || C("toast.fileRenameFailed"), "error"); - } catch (e) { - o(C("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); - } - }, { disabled: !(e?.id || e?.filepath) }), - yn(C("ctx.delete", "Delete"), "pi pi-trash", mn.DELETE, async () => { - if ((e?.id || e?.filepath) && await mt(1, e?.filename)) try { - let n = await t(e); - n?.ok ? (o(C("toast.fileDeletedSuccess"), "success"), s?.()) : o(n?.error || C("toast.fileDeleteFailed"), "error"); - } catch (e) { - o(C("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); - } - }, { disabled: !(e?.id || e?.filepath) }) - ]; -} -function En({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetChanged: r } = {}) { - if (!e || typeof t != "function") return; - let i = gn.get(e); - if (typeof i?.unbind == "function") return i.unbind; - let a = async (i) => { - if (!e.contains(i.target)) return; - i.preventDefault(), i.stopPropagation(); - let a = t(); - a && sn({ - x: i.clientX, - y: i.clientY, - items: Tn({ - asset: a, - event: i, - getCurrentViewUrl: n, - onAssetChanged: r - }) - }); - }; - try { - e.addEventListener("contextmenu", a); - } catch (e) { - console.error("[ViewerContextMenu] Failed to bind:", e); - } - let o = () => { - try { - e.removeEventListener("contextmenu", a); - } catch (e) { - console.debug?.(e); - } - try { - Tt(); - let e = globalThis?._ratingDebounceTimers; - e && typeof e.clear == "function" && e.clear(); - } catch (e) { - console.debug?.(e); - } - try { - pn(); - } catch (e) { - console.debug?.(e); - } - gn.delete(e); - }; - return gn.set(e, { unbind: o }), o; -} -function Dn(e) { - let t = e ? gn.get(e) : null; - try { - t?.unbind?.(); - } catch (e) { - console.debug?.(e); - } -} -// ui/features/viewer/mediaPlayer.ts -function On(e) { - let t = String(e || "").toLowerCase(); - return t === "video" || t === "audio"; -} -function kn({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i } = {}) { - try { - let a = n; - return e === t?.AB_COMPARE ? a = r : e === t?.SIDE_BY_SIDE && (a = i), a ? Array.from(a.querySelectorAll?.(".mjr-viewer-video-src, .mjr-viewer-audio-src") || []) : []; - } catch { - return []; - } -} -function An(e) { - try { - let t = Array.isArray(e) ? e : []; - return t.find((e) => String(e?.dataset?.mjrCompareRole || "") === "A") || t[0] || null; - } catch { - return null; - } -} -function jn(e, t = {}) { - try { - if (!e) return null; - let n = String(t?.mediaKind || "").toLowerCase(); - return Qt(e, { - ...t, - mediaKind: n - }); - } catch { - return null; - } -} -// ui/features/viewer/ViewerState.ts -var Mn = "mjr_viewer_prefs_v1"; -function Nn() { - try { - let e = y.get(Mn); - if (!e) return {}; - let t = JSON.parse(e); - return t && typeof t == "object" ? t : {}; - } catch { - return {}; - } -} -function Pn(e) { - try { - if (!e) return; - let t = { - analysisMode: String(e.analysisMode || "none"), - loupeEnabled: !!e.loupeEnabled, - probeEnabled: !!e.probeEnabled, - hudEnabled: !!e.hudEnabled, - genInfoOpen: !!e.genInfoOpen, - audioVisualizerMode: String(e.audioVisualizerMode || "artistic"), - abWipePercent: Number.isFinite(Number(e._abWipePercent)) ? Number(e._abWipePercent) : 50 - }; - y.set(Mn, JSON.stringify(t)); - } catch (e) { - console.debug?.(e); - } -} -// ui/features/viewer/lifecycle.ts -function Fn(e) { - if (e) { - try { - e._mjrSyncAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - e._mjrSyncAbort = null; - } catch (e) { - console.debug?.(e); - } - try { - let t = e.querySelectorAll?.("video, audio"); - if (t && t.length) for (let e of t) { - try { - e.pause?.(); - } catch (e) { - console.debug?.(e); - } - try { - e?._mjrAudioViz?.destroy?.(); - } catch (e) { - console.debug?.(e); - } - try { - e._mjrAudioViz = null; - } catch (e) { - console.debug?.(e); - } - try { - e.currentTime = 0; - } catch (e) { - console.debug?.(e); - } - try { - e.removeAttribute?.("src"); - } catch (e) { - console.debug?.(e); - } - try { - e.load?.(); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - try { - let t = e.querySelectorAll?.(".mjr-viewer-media, .mjr-viewer-audio-viz"); - if (t && t.length) for (let e of t) { - try { - e?._mjrProc?.destroy?.(); - } catch (e) { - console.debug?.(e); - } - try { - e._mjrProc = null; - } catch (e) { - console.debug?.(e); - } - try { - e.width = 0, e.height = 0; - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - } -} -function In(e) { - let t = []; - try { - e._mjrViewerUnsubs = t; - } catch (e) { - console.debug?.(e); - } - let n = { - unsubs: t, - safeAddListener: Z, - safeCall: X, - destroyMediaProcessorsIn: Fn, - _observer: null, - disposeAll: () => { - try { - n._observer?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - try { - for (let e of t) X(e); - } catch (e) { - console.debug?.(e); - } - try { - t.length = 0; - } catch (e) { - console.debug?.(e); - } - } - }; - try { - if (e && typeof MutationObserver < "u") { - let t = new MutationObserver(() => { - try { - if (!document.contains(e)) { - try { - t.disconnect(); - } catch (e) { - console.debug?.(e); - } - X(() => n.disposeAll?.(), "lifecycle:autoDispose"); - } - } catch (e) { - console.debug?.(e); - } - }), r = e?.parentElement; - r ? t.observe(r, { childList: !0 }) : t.observe(document.body, { childList: !0 }), n._observer = t; - } - } catch (e) { - console.debug?.(e); - } - try { - e._mjrViewerLifecycle = n; - } catch (e) { - console.debug?.(e); - } - return n; -} -// ui/components/buttons.ts -function Ln(e, t) { - let n = document.createElement("button"); - n.textContent = e, n.title = t || ""; - try { - n.setAttribute("aria-label", t || e || "Button"); - } catch (e) { - console.debug?.(e); - } - return n.style.cssText = "\n padding: 6px 12px;\n background: transparent;\n border: 1px solid rgba(255, 255, 255, 0.3);\n color: white;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n ", n.onmouseenter = () => { - n.disabled || (n.style.background = "rgba(255, 255, 255, 0.1)"); - }, n.onmouseleave = () => { - n.disabled || (n.style.background = "transparent"); - }, n; -} -function Rn(e, t) { - let n = document.createElement("button"); - n.textContent = e, n.dataset.mode = t; - try { - n.setAttribute("aria-label", e), n.setAttribute("aria-pressed", "false"); - } catch (e) { - console.debug?.(e); - } - return n.style.cssText = "\n padding: 4px 12px;\n background: linear-gradient(180deg, rgba(206, 211, 218, 0.1), rgba(206, 211, 218, 0.03));\n border: 0.8px solid rgba(196, 202, 210, 0.3);\n color: rgba(230, 233, 238, 0.95);\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n transition: all 0.16s;\n ", n; -} -// ui/features/viewer/toolbarControls.ts -function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged: r, onExportFrame: i, onCopyFrame: a, onAudioVizModeChanged: o, getCanAB: s } = {}) { - let c = { - channel: "rgb", - exposureEV: 0, - gamma: 1, - analysisMode: "none", - scopesMode: "off", - gridMode: 0, - overlayMaskEnabled: !1, - overlayMaskOpacity: .65, - overlayFormat: "image", - probeEnabled: !1, - loupeEnabled: !1, - hudEnabled: !0, - distractionFree: !1, - genInfoOpen: !0, - abCompareMode: "wipe", - audioVisualizerMode: "artistic" - }, l = document.createElement("div"); - l.className = "mjr-viewer-tools", l.style.cssText = "\n display: block;\n padding: 8px 8px 6px;\n border-top: 0.8px solid rgba(196, 202, 210, 0.16);\n background: rgba(12, 14, 19, 0.22);\n "; - let u = document.createElement("div"); - u.className = "mjr-viewer-tools-deck", u.style.cssText = "display:flex; flex-wrap:nowrap; gap:8px; align-items:center; min-width:0; overflow-x:auto; overflow-y:hidden;"; - let d = ({ key: e, eyebrow: t, title: n } = {}) => { - let r = document.createElement("section"); - r.className = "mjr-viewer-tools-panel", e && (r.dataset.panel = String(e)), r.style.cssText = "display:flex; flex-direction:column; gap:4px; min-width:0; padding:5px 6px; border-radius:10px; border:1px solid rgba(255,255,255,0.08); background:linear-gradient(180deg, rgba(255,255,255,0.045), rgba(255,255,255,0.02)); box-shadow:inset 0 1px 0 rgba(255,255,255,0.04); flex:0 0 auto;"; - let i = document.createElement("div"); - i.className = "mjr-viewer-tools-panel-head", i.style.cssText = "display:none; align-items:flex-start; justify-content:space-between; gap:6px; min-width:0;"; - let a = document.createElement("div"); - a.className = "mjr-viewer-tools-panel-heading", a.style.cssText = "display:flex; flex-direction:column; gap:1px; min-width:0;"; - let o = document.createElement("span"); - o.className = "mjr-viewer-tools-panel-eyebrow", o.textContent = t || ""; - let s = document.createElement("span"); - s.className = "mjr-viewer-tools-panel-title", s.textContent = n || ""; - let c = document.createElement("div"); - return c.className = "mjr-viewer-tools-panel-body", c.style.cssText = "display:flex; align-items:center; flex-wrap:nowrap; gap:6px; min-width:0;", a.appendChild(o), a.appendChild(s), i.appendChild(a), r.appendChild(i), r.appendChild(c), { - panel: r, - body: c, - head: i, - heading: a, - eyebrowEl: o, - titleEl: s - }; - }, f = d({ - key: "grade", - eyebrow: "Image", - title: "Adjustments" - }), p = d({ - key: "overlay", - eyebrow: "Viewer", - title: "Guides & Compare" - }), m = d({ - key: "inspect", - eyebrow: "Inspect", - title: "Probe" - }), h = d({ - key: "actions", - eyebrow: "Actions", - title: "Reset & Export" - }), g = d({ - key: "info", - eyebrow: "Infos", - title: "Help" - }), _ = document.createElement("div"); - _.className = "mjr-viewer-tools-actions", _.style.cssText = "display:flex; align-items:center; justify-content:flex-start; gap:6px; flex-wrap:wrap; min-width:0;"; - let v = document.createElement("div"); - v.className = "mjr-viewer-tools-meta", v.style.cssText = "display:flex; align-items:center; justify-content:flex-start; gap:6px; flex-wrap:nowrap; min-width:0;"; - let y = ({ key: e, label: t, accentRgb: n } = {}) => { - let r = document.createElement("div"); - if (r.className = "mjr-viewer-tools-group", e && (r.dataset.group = String(e)), n && r.style.setProperty("--mjr-group-accent", String(n)), r.style.cssText = "display:flex; align-items:center; gap:6px; padding:2px 6px; border-radius:8px; border:1px solid rgba(196,202,210,0.14); background:rgba(10,12,16,0.22);", t) { - let e = document.createElement("span"); - e.className = "mjr-viewer-tools-group-label", e.textContent = t, e.style.cssText = "font-size: 10px; color: rgba(255,255,255,0.7);", r.appendChild(e); - } - return r; - }, b = (e, t) => { - let n = document.createElement("select"); - n.title = e || "", n.className = "mjr-viewer-tools-select", n.style.cssText = "\n height: 24px;\n padding: 0 6px;\n border-radius: 6px;\n border: 0.8px solid rgba(196, 202, 210, 0.24);\n background: linear-gradient(180deg, rgba(210, 214, 220, 0.06), rgba(210, 214, 220, 0.02));\n color: rgba(230,233,238,0.92);\n font-size: 11px;\n outline: none;\n "; - for (let e of t || []) { - let t = document.createElement("option"); - t.value = String(e.value), t.textContent = String(e.label), n.appendChild(t); - } - return n; - }, x = (e, { min: t, max: n, step: r, value: i }) => { - let a = document.createElement("div"); - a.className = "mjr-viewer-tools-range", a.style.cssText = "display:flex; align-items:center; gap:6px;"; - let o = document.createElement("input"); - o.type = "range", o.className = "mjr-viewer-tools-range-input", o.min = String(t), o.max = String(n), o.step = String(r), o.value = String(i), o.title = e || "", o.style.cssText = "\n width: 92px;\n accent-color: rgba(255,255,255,0.85);\n "; - let s = document.createElement("span"); - return s.style.cssText = "font-size: 11px; color: rgba(255,255,255,0.9); min-width: 38px; text-align: right;", s.textContent = String(i), a.appendChild(o), a.appendChild(s), { - wrap: a, - input: o, - out: s - }; - }, S = (e, t, { iconClass: n = null, accentRgb: r = null } = {}) => { - let i = document.createElement("button"); - if (i.type = "button", i.className = "mjr-viewer-tool-btn", i.setAttribute("aria-label", t || e || "Toggle"), i.setAttribute("aria-pressed", "false"), r) try { - i.dataset.accentRgb = String(r); - } catch (e) { - console.debug?.(e); - } - if (n) { - let t = document.createElement("span"); - t.className = `pi ${n}`.trim(), t.setAttribute("aria-hidden", "true"), t.style.fontSize = "14px", i.appendChild(t); - let r = document.createElement("span"); - r.textContent = e || "", r.style.cssText = "position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0;", i.appendChild(r); - } else i.textContent = e; - i.title = t || "", i.style.cssText = "\n height: 24px;\n padding: 0 8px;\n border-radius: 6px;\n border: 0.8px solid rgba(196, 202, 210, 0.24);\n background: linear-gradient(180deg, rgba(210,214,220,0.06), rgba(210,214,220,0.02));\n color: rgba(230,233,238,0.92);\n cursor: pointer;\n font-size: 11px;\n user-select: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n position: relative;\n ", i.dataset.active = "0"; - let a = (e) => { - let t = !!e; - i.dataset.active = t ? "1" : "0"; - try { - i.setAttribute("aria-pressed", t ? "true" : "false"); - } catch (e) { - console.debug?.(e); - } - let n = String(i.dataset?.accentRgb || "").trim(); - t && n ? (i.style.background = `rgba(${n}, 0.12)`, i.style.borderColor = `rgba(${n}, 0.38)`, i.style.boxShadow = `0 0 0 0.8px rgba(${n}, 0.12) inset`) : (i.style.background = t ? "rgba(214,218,224,0.12)" : "rgba(210,214,220,0.06)", i.style.borderColor = t ? "rgba(214,218,224,0.38)" : "rgba(196,202,210,0.24)", i.style.boxShadow = ""); - }; - return a(!1), { - b: i, - setActive: a - }; - }, w = b("Channel View", [ - { - value: "rgb", - label: "RGB" - }, - { - value: "r", - label: "R" - }, - { - value: "g", - label: "G" - }, - { - value: "b", - label: "B" - }, - { - value: "a", - label: "Alpha" - }, - { - value: "l", - label: "Luma" - } - ]); - w.title = C("tooltip.colorChannels", "View color channels or luminance"); - let T = x("Exposure (EV)", { - min: -10, - max: 10, - step: .1, - value: 0 - }), E = x("Gamma", { - min: .1, - max: 3, - step: .01, - value: 1 - }), D = Object.freeze({ - channel: "120, 180, 255", - exposure: "255, 200, 70", - gamma: "190, 150, 255", - analysis: "255, 140, 80", - zebra: "255, 90, 90", - overlay: "110, 240, 190", - probe: "120, 255, 170", - loupe: "180, 140, 255", - compare: "90, 220, 220", - geninfo: "200, 170, 255", - audioviz: "255, 150, 80" - }), O = Object.freeze({ - borderColor: "rgba(255,255,255,0.14)", - background: "rgba(255,255,255,0.08)", - boxShadow: "" - }), k = (e, { accentRgb: t, active: n, title: r } = {}) => { - try { - if (!e) return; - if (r && (e.title = String(r)), !n) { - e.style.borderColor = O.borderColor, e.style.background = O.background, e.style.boxShadow = O.boxShadow; - return; - } - let i = String(t || "").trim(); - if (!i) return; - e.style.borderColor = `rgba(${i},0.55)`, e.style.background = `rgba(${i},0.14)`, e.style.boxShadow = `0 0 0 1px rgba(${i},0.14) inset`; - } catch (e) { - console.debug?.(e); - } - }, A = (e) => { - try { - let t = String(e || "rgb"); - if (w.style.boxShadow = "", t === "r") { - w.style.borderColor = "rgba(255,90,90,0.60)", w.style.background = "rgba(255,90,90,0.14)", w.style.boxShadow = "0 0 0 1px rgba(255,90,90,0.14) inset"; - return; - } - if (t === "g") { - w.style.borderColor = "rgba(90,255,140,0.55)", w.style.background = "rgba(90,255,140,0.12)", w.style.boxShadow = "0 0 0 1px rgba(90,255,140,0.12) inset"; - return; - } - if (t === "b") { - w.style.borderColor = "rgba(90,160,255,0.60)", w.style.background = "rgba(90,160,255,0.12)", w.style.boxShadow = "0 0 0 1px rgba(90,160,255,0.12) inset"; - return; - } - if (t === "l") { - w.style.borderColor = "rgba(255,210,90,0.60)", w.style.background = "rgba(255,210,90,0.12)", w.style.boxShadow = "0 0 0 1px rgba(255,210,90,0.12) inset"; - return; - } - if (t === "a") { - w.style.borderColor = "rgba(220,220,220,0.35)", w.style.background = "rgba(255,255,255,0.10)", w.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.08) inset"; - return; - } - if (t === "rgb") { - w.style.borderColor = "rgba(255,255,255,0.22)", w.style.background = "linear-gradient(90deg, rgba(255,90,90,0.16), rgba(90,255,140,0.14), rgba(90,160,255,0.16))", w.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.10) inset"; - return; - } - w.style.borderColor = "rgba(255,255,255,0.14)", w.style.background = "rgba(255,255,255,0.08)"; - } catch (e) { - console.debug?.(e); - } - }, j = (e, { accentRgb: t, active: n } = {}) => { - try { - if (!e) return; - if (!n) { - e.style.color = "rgba(255,255,255,0.9)"; - return; - } - let r = String(t || "").trim(); - if (!r) return; - e.style.color = `rgb(${r})`; - } catch (e) { - console.debug?.(e); - } - }, M = (e, { accentRgb: t, active: n } = {}) => { - try { - if (!e) return; - if (!n) { - e.style.background = "", e.style.borderColor = "transparent", e.style.boxShadow = ""; - return; - } - let r = String(t || "").trim(); - if (!r) return; - e.style.background = `rgba(${r},0.10)`, e.style.borderColor = `rgba(${r},0.38)`, e.style.boxShadow = `0 0 0 1px rgba(${r},0.12) inset`; - } catch (e) { - console.debug?.(e); - } - }, N = S("Zebra", "Zebra Highlights (Z)", { - iconClass: "pi-bars", - accentRgb: D.zebra - }), ee = S("Scopes", "Scopes overlay", { - iconClass: "pi-chart-bar", - accentRgb: D.analysis - }), P = b("Scopes", [ - { - value: "off", - label: "Off" - }, - { - value: "hist", - label: "Histogram" - }, - { - value: "wave", - label: "Waveform" - }, - { - value: "both", - label: "Both" - } - ]); - P.title = C("tooltip.scopesHistogram", "Show histogram/waveform scopes"); - let te = S("Grid", "Grid (G)", { - iconClass: "pi-th-large", - accentRgb: D.overlay - }), F = b("Grid Overlay", [ - { - value: 0, - label: "Off" - }, - { - value: 1, - label: "Thirds" - }, - { - value: 2, - label: "Center" - }, - { - value: 3, - label: "Safe" - }, - { - value: 4, - label: "Golden" - } - ]); - F.title = Dt(C("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); - let ne = S("Mask", "Format mask (dim outside)", { - iconClass: "pi-stop", - accentRgb: D.overlay - }), re = b("Format", [ - { - value: "image", - label: "Image" - }, - { - value: "16:9", - label: "16:9" - }, - { - value: "1:1", - label: "1:1" - }, - { - value: "4:3", - label: "4:3" - }, - { - value: "2.39", - label: "2.39" - }, - { - value: "9:16", - label: "9:16" - } - ]); - re.title = C("tooltip.aspectRatioMask", "Aspect ratio overlay mask"); - let ie = x("Mask Opacity", { - min: 0, - max: .9, - step: .05, - value: .65 - }), ae = S("Probe", "Pixel Probe (I)", { - iconClass: "pi-eye", - accentRgb: D.probe - }), oe = S("Loupe", "Loupe (L)", { - iconClass: "pi-search-plus", - accentRgb: D.loupe - }), se = S("HUD", "Viewer HUD", { - iconClass: "pi-info-circle", - accentRgb: D.overlay - }), ce = S("Focus", "Distraction-free mode (X)", { - iconClass: "pi-window-maximize", - accentRgb: D.overlay - }), le = S("Gen", Dt("Generation info (prompt/model)", "D"), { - iconClass: "pi-book", - accentRgb: D.geninfo - }), I = b("A/B Compare Mode", [ - { - value: "wipe", - label: "Wipe (H)" - }, - { - value: "wipeV", - label: "Wipe (V)" - }, - { - value: "difference", - label: "Difference" - }, - { - value: "absdiff", - label: "AbsDiff" - }, - { - value: "add", - label: "Add" - }, - { - value: "subtract", - label: "Subtract" - }, - { - value: "multiply", - label: "Multiply" - }, - { - value: "screen", - label: "Screen" - } - ]); - I.title = C("tooltip.compareBlendMode", "Compare blend mode"); - let L = b("Audio Visualizer", [{ - value: "simple", - label: "Simple" - }, { - value: "artistic", - label: "Artistic" - }]); - L.title = C("tooltip.audioVisualizer", "Audio visualizer mode"); - let ue = Ln("Reset", C("tooltip.resetPlayerControls", "Reset all viewer controls")); - ue.style.height = "26px", ue.style.fontSize = "11px", ue.style.padding = "0 8px", ue.classList?.add?.("mjr-viewer-tool-btn", "mjr-viewer-tool-btn--reset"), ue.classList?.add?.("mjr-viewer-tools-action", "mjr-viewer-tools-action--primary"), ue.style.marginLeft = "auto"; - let de = document.createElement("button"); - de.type = "button", de.title = C("tooltip.exportFrame", "Save current frame as PNG"), de.setAttribute("aria-label", C("tooltip.exportFrame", "Save frame as PNG")), de.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", de.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; - let R = document.createElement("span"); - R.className = "pi pi-download", R.setAttribute("aria-hidden", "true"), R.style.fontSize = "14px", de.appendChild(R), de.classList?.add?.("mjr-viewer-tools-action"); - try { - de.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - let z = document.createElement("button"); - z.type = "button", z.title = C("tooltip.copyFrame", "Copy current frame to clipboard"), z.setAttribute("aria-label", C("tooltip.copyFrame", "Copy frame to clipboard")), z.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", z.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; - let fe = document.createElement("span"); - fe.className = "pi pi-copy", fe.setAttribute("aria-hidden", "true"), fe.style.fontSize = "14px", z.appendChild(fe), z.classList?.add?.("mjr-viewer-tools-action"); - try { - z.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - let B = y({ - key: "channel", - label: "Channel", - accentRgb: D.channel - }); - B.appendChild(w), f.body.appendChild(B); - let V = y({ - key: "exposure", - label: "EV", - accentRgb: D.exposure - }); - V.appendChild(T.wrap), f.body.appendChild(V); - let H = y({ - key: "gamma", - label: "Gamma", - accentRgb: D.gamma - }); - H.appendChild(E.wrap), f.body.appendChild(H); - let pe = () => { - try { - t.exposureEV = 0; - } catch (e) { - console.debug?.(e); - } - try { - T.input.value = "0", T.out.textContent = "0.0EV"; - } catch (e) { - console.debug?.(e); - } - X(n); - }, U = () => { - try { - t.gamma = 1; - } catch (e) { - console.debug?.(e); - } - try { - E.input.value = "1", E.out.textContent = "1.00"; - } catch (e) { - console.debug?.(e); - } - X(n); - }, me = () => { - try { - Object.assign(t, c); - } catch (e) { - console.debug?.(e); - } - X(r), X(o), X(n); - }; - try { - let e = V.querySelector?.(".mjr-viewer-tools-group-label"); - e && (e.title = C("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none"); - } catch (e) { - console.debug?.(e); - } - try { - T.out.title = C("tooltip.resetExposure", "Reset EV to 0"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none"; - } catch (e) { - console.debug?.(e); - } - try { - let e = H.querySelector?.(".mjr-viewer-tools-group-label"); - e && (e.title = C("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none"); - } catch (e) { - console.debug?.(e); - } - try { - E.out.title = C("tooltip.resetGamma", "Reset Gamma to 1.00"), E.out.style.cursor = "pointer", E.out.style.userSelect = "none"; - } catch (e) { - console.debug?.(e); - } - let he = y({ - key: "analysis", - label: "Analysis", - accentRgb: D.analysis - }); - he.appendChild(N.b), he.appendChild(ee.b), he.appendChild(P), f.body.appendChild(he); - let ge = y({ - key: "overlay-guides", - label: "Guides", - accentRgb: D.overlay - }); - ge.appendChild(te.b), ge.appendChild(F), ge.appendChild(ne.b), ge.appendChild(re), ge.appendChild(ie.wrap), p.body.appendChild(ge); - let _e = y({ - key: "overlay-inspect", - label: "Inspect", - accentRgb: D.overlay - }); - [ - ae.b, - oe.b, - se.b, - ce.b, - le.b - ].forEach((e, t) => { - t > 0 && (e.style.marginLeft = "4px"), _e.appendChild(e); - }), m.body.appendChild(_e); - let W = y({ - key: "compare", - label: "Compare", - accentRgb: D.compare - }); - W.style.borderRadius = "8px", W.style.padding = "4px 6px", W.style.border = "1px solid transparent", W.style.transition = "background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease", W.appendChild(I), p.body.appendChild(W); - let G = y({ - key: "audio-viz", - label: "Audio Viz", - accentRgb: D.audioviz - }); - G.appendChild(L), p.body.appendChild(G), _.appendChild(ue), _.appendChild(de), _.appendChild(z); - let K = document.createElement("div"); - K.className = "mjr-viewer-tools-group mjr-viewer-tools-group--3d", K.textContent = "LMB rotate | RMB pan | Scroll zoom", K.style.cssText = "display:none;align-items:center;padding:2px 8px;border-radius:999px;border:1px solid rgba(255,255,255,0.12);background:rgba(255,255,255,0.06);color:rgba(255,255,255,0.55);font-size:10px;font-weight:400;letter-spacing:0.01em", v.appendChild(K); - let ve = document.createElement("div"); - ve.style.cssText = "position: relative; display:inline-flex; align-items:center;", ve.className = "mjr-viewer-tools-action", ve.style.marginLeft = "4px"; - let ye = document.createElement("button"); - ye.type = "button", ye.title = C("tooltip.viewerShortcuts", "Viewer shortcuts"), ye.setAttribute("aria-label", C("tooltip.viewerShortcuts", "Viewer shortcuts")), ye.style.cssText = "\n height: 24px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n color: rgba(255,255,255,0.92);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n "; - let q = document.createElement("span"); - q.className = "pi pi-question-circle", q.setAttribute("aria-hidden", "true"), q.style.fontSize = "14px", ye.appendChild(q); - let be = document.createElement("div"); - be.className = "mjr-viewer-help", be.style.cssText = "\n position: absolute;\n right: 0;\n top: 32px;\n min-width: 260px;\n max-width: 360px;\n padding: 10px 12px;\n border-radius: 8px;\n background: rgba(0,0,0,0.88);\n border: 1px solid rgba(255,255,255,0.16);\n color: rgba(255,255,255,0.92);\n font-size: 12px;\n line-height: 1.4;\n box-shadow: 0 8px 24px rgba(0,0,0,0.35);\n display: none;\n z-index: 10002;\n "; - try { - let e = document.createElement("div"); - e.textContent = "Shortcuts", e.style.cssText = "font-weight:600; margin-bottom:6px;"; - let t = document.createElement("div"); - t.style.cssText = "display:grid; grid-template-columns: 1fr 1fr; gap: 4px 10px;"; - let n = (e, n) => { - let r = document.createElement("div"), i = document.createElement("span"); - i.style.cssText = "opacity:.75;", i.textContent = String(e || ""), r.appendChild(i), r.appendChild(document.createTextNode(` ${String(n || "")}`)), t.appendChild(r); - }; - n("Esc", "Close"), n("Space", "Play/Pause"), n("+", "Zoom In"), n("-", "Zoom Out"), n("Alt+1", "1:1 Zoom"), n("G", "Grid"), n("D", "Gen Info"), n("Z", "Zebra"), n("I", "Probe"), n("L", "Loupe"), n("X", "Focus Mode"), n("C", "Copy Color"), n("[ / ]", "Speed -/+"), n("\\", "Speed 1x"), n("< / >", "Prev/Next"), n("0-5", "Rating"), be.appendChild(e), be.appendChild(t); - } catch (e) { - console.debug?.(e); - } - return ve.appendChild(ye), ve.appendChild(be), v.appendChild(ve), h.body.appendChild(_), g.body.appendChild(v), u.appendChild(f.panel), u.appendChild(p.panel), u.appendChild(m.panel), u.appendChild(h.panel), u.appendChild(g.panel), l.appendChild(u), { - toolsRow: l, - gradePanel: f, - overlayPanel: p, - inspectPanel: m, - actionPanel: h, - infoPanel: g, - toolsActions: _, - toolsMeta: v, - chGroup: B, - expGroup: V, - gamGroup: H, - anaGroup: he, - ovGuidesGroup: ge, - ovInspectGroup: _e, - cmpGroup: W, - audGroup: G, - model3dHint: K, - helpWrap: ve, - helpBtn: ye, - helpPop: be, - channelsSelect: w, - exposureCtl: T, - gammaCtl: E, - zebraToggle: N, - scopesToggle: ee, - scopesSelect: P, - gridToggle: te, - gridModeSelect: F, - maskToggle: ne, - formatSelect: re, - maskOpacityCtl: ie, - probeToggle: ae, - loupeToggle: oe, - hudToggle: se, - focusToggle: ce, - genInfoToggle: le, - compareModeSelect: I, - audioVizModeSelect: L, - resetGradeBtn: ue, - exportBtn: de, - copyBtn: z, - resetExposure: pe, - resetGamma: U, - resetViewerTools: me, - ACCENT: D, - setSelectHighlighted: k, - setChannelSelectStyle: A, - setValueHighlighted: j, - setGroupHighlighted: M, - DEFAULT_TOOL_STATE: c - }; -} -// ui/features/viewer/toolbarActions.ts -function Bn({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToolsChanged: a, onCompareModeChanged: o, onAudioVizModeChanged: s, onExportFrame: c, onCopyFrame: l, singleBtn: u, abBtn: d, sideBtn: f, closeBtn: p, channelsSelect: m, compareModeSelect: h, audioVizModeSelect: g, exposureCtl: _, gammaCtl: v, zebraToggle: y, scopesToggle: b, scopesSelect: x, gridToggle: S, gridModeSelect: C, maskToggle: w, formatSelect: T, maskOpacityCtl: E, probeToggle: D, loupeToggle: O, hudToggle: k, focusToggle: A, genInfoToggle: j, resetGradeBtn: M, exportBtn: N, copyBtn: ee, resetExposure: P, resetGamma: te, resetViewerTools: F, expGroup: ne, gamGroup: re }) { - e.push(Z(u, "click", () => r?.(n.SINGLE))), e.push(Z(d, "click", () => r?.(n.AB_COMPARE))), e.push(Z(f, "click", () => r?.(n.SIDE_BY_SIDE))), e.push(Z(p, "click", () => i?.())), e.push(Z(m, "change", () => { - try { - t.channel = String(m.value || "rgb"); - } catch (e) { - console.debug?.(e); - } - X(a); - })), e.push(Z(h, "change", () => { - try { - t.abCompareMode = String(h.value || "wipe"); - } catch (e) { - console.debug?.(e); - } - X(o), X(a); - })), e.push(Z(g, "change", () => { - try { - t.audioVisualizerMode = String(g.value || "artistic"); - } catch (e) { - console.debug?.(e); - } - X(s), X(a); - })), e.push(Z(_.input, "input", () => { - let e = Math.max(-10, Math.min(10, Number(_.input.value) || 0)); - t.exposureEV = Math.round(e * 10) / 10; - try { - _.out.textContent = `${t.exposureEV.toFixed(1)}EV`; - } catch (e) { - console.debug?.(e); - } - X(a); - })), e.push(Z(_.input, "dblclick", P)), e.push(Z(_.out, "click", P)), e.push(Z(ne.querySelector?.(".mjr-viewer-tools-group-label"), "click", P)), e.push(Z(v.input, "input", () => { - let e = Math.max(.1, Math.min(3, Number(v.input.value) || 1)); - t.gamma = Math.round(e * 100) / 100; - try { - v.out.textContent = t.gamma.toFixed(2); - } catch (e) { - console.debug?.(e); - } - X(a); - })), e.push(Z(v.input, "dblclick", te)), e.push(Z(v.out, "click", te)), e.push(Z(re.querySelector?.(".mjr-viewer-tools-group-label"), "click", te)), e.push(Z(y.b, "click", () => { - t.analysisMode = t.analysisMode === "zebra" ? "none" : "zebra", X(a); - })), e.push(Z(b.b, "click", () => { - try { - let e = String(t.scopesMode || "off") === "off" ? "both" : "off"; - t.scopesMode = e; - try { - x.value = String(e); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - X(a); - })), e.push(Z(x, "change", () => { - try { - t.scopesMode = String(x.value || "off"); - } catch { - try { - t.scopesMode = "off"; - } catch (e) { - console.debug?.(e); - } - } - X(a); - })), e.push(Z(S.b, "click", () => { - t.gridMode = +!Number(t.gridMode), X(a); - })), e.push(Z(C, "change", () => { - try { - let e = Number(C.value); - t.gridMode = Number.isFinite(e) ? e : 0; - } catch { - try { - t.gridMode = 0; - } catch (e) { - console.debug?.(e); - } - } - X(a); - })), e.push(Z(w.b, "click", () => { - try { - t.overlayMaskEnabled = !t.overlayMaskEnabled; - } catch (e) { - console.debug?.(e); - } - X(a); - })), e.push(Z(T, "change", () => { - try { - t.overlayFormat = String(T.value || "image"); - } catch { - try { - t.overlayFormat = "image"; - } catch (e) { - console.debug?.(e); - } - } - X(a); - })), e.push(Z(E.input, "input", () => { - try { - let e = Number(E.input.value); - t.overlayMaskOpacity = Math.round(Math.max(0, Math.min(.9, Number.isFinite(e) ? e : .65)) * 100) / 100, E.out.textContent = t.overlayMaskOpacity.toFixed(2); - } catch (e) { - console.debug?.(e); - } - X(a); - })), e.push(Z(D.b, "click", () => { - t.probeEnabled = !t.probeEnabled, X(a); - })), e.push(Z(O.b, "click", () => { - t.loupeEnabled = !t.loupeEnabled, X(a); - })), e.push(Z(k.b, "click", () => { - t.hudEnabled = !t.hudEnabled, X(a); - })), e.push(Z(A.b, "click", () => { - t.distractionFree = !t.distractionFree, X(a); - })), e.push(Z(j.b, "click", () => { - try { - t.genInfoOpen = !t.genInfoOpen; - } catch (e) { - console.debug?.(e); - } - X(a); - })), e.push(Z(M, "click", () => { - F(); - })), e.push(Z(N, "click", () => { - try { - c?.(); - } catch (e) { - console.debug?.(e); - } - })), e.push(Z(ee, "click", () => { - try { - l?.(); - } catch (e) { - console.debug?.(e); - } - })); -} -function Vn({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, chGroup: a, expGroup: o, gamGroup: s, anaGroup: c, gradePanel: l, overlayPanel: u, inspectPanel: d, infoPanel: f, actionPanel: p, ovGuidesGroup: m, ovInspectGroup: h, model3dHint: g, helpWrap: _, channelsSelect: v, compareModeSelect: y, audioVizModeSelect: b, exposureCtl: x, gammaCtl: S, zebraToggle: C, scopesToggle: w, scopesSelect: T, gridToggle: E, gridModeSelect: D, maskToggle: O, formatSelect: k, maskOpacityCtl: A, probeToggle: j, loupeToggle: M, hudToggle: N, focusToggle: ee, genInfoToggle: P, exportBtn: te, copyBtn: F, resetGradeBtn: ne, cmpGroup: re, audGroup: ie, ACCENT: ae, setSelectHighlighted: oe, setChannelSelectStyle: se, setValueHighlighted: ce, setGroupHighlighted: le }) { - let I = e?.assets?.[e?.currentIndex] || null, L = String(I?.kind || "").toLowerCase() === "model3d"; - try { - let e = L ? "none" : ""; - a.style.display = e, o.style.display = e, s.style.display = e, c.style.display = e, ne.style.display = e, g.style.display = L ? "inline-flex" : "none", l.panel.style.display = L ? "none" : "", u.panel.style.display = L ? "none" : "", f.panel.style.display = "", p.panel.style.display = ""; - let t = h.querySelector?.(".mjr-viewer-tools-group-label"); - if (L) { - m.style.display = "none", h.style.display = "", t && (t.style.display = "none"), _.style.display = "none", r.style.padding = "10px 16px", r.style.gap = "6px", i.style.padding = "6px 8px 6px"; - for (let e of [ - E.b, - D, - O.b, - k, - A.wrap, - j.b, - M.b, - N.b - ]) try { - e.style.display = "none"; - } catch {} - } else { - m.style.display = "", h.style.display = "", t && (t.style.display = ""), _.style.display = "", l.panel.style.display = "", u.panel.style.display = "", f.panel.style.display = "", p.panel.style.display = "", r.style.padding = "8px 16px", r.style.gap = "6px", i.style.padding = "8px 8px 6px"; - for (let e of [ - E.b, - D, - O.b, - k, - A.wrap, - j.b, - M.b, - N.b - ]) try { - e.style.display = ""; - } catch {} - } - } catch (e) { - console.debug?.(e); - } - try { - v.value = String(e.channel || "rgb"); - } catch (e) { - console.debug?.(e); - } - try { - y.value = String(e.abCompareMode || "wipe"); - let r = typeof n == "function" && !!n(), i = e.mode === t.AB_COMPARE && r, a = e.mode === t.SIDE_BY_SIDE, o = i || a; - y.disabled = !i; - try { - re.dataset.active = o ? "1" : "0", re.style.display = o ? "" : "none", le(re, { - accentRgb: ae.compare, - active: o - }), re.title = o ? "Compare tools (active)" : "Compare tools"; - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - try { - let t = String(I?.kind || "") === "audio"; - ie.style.display = t ? "" : "none", b.disabled = !t, b.value = String(e.audioVisualizerMode || "artistic"); - } catch (e) { - console.debug?.(e); - } - try { - let t = Math.round((Number(e.exposureEV) || 0) * 10) / 10; - x.input.value = String(t), x.out.textContent = `${t.toFixed(1)}EV`; - } catch (e) { - console.debug?.(e); - } - try { - let t = Math.max(.1, Math.min(3, Number(e.gamma) || 1)); - S.input.value = String(t), S.out.textContent = t.toFixed(2); - } catch (e) { - console.debug?.(e); - } - try { - C.setActive(e.analysisMode === "zebra"); - } catch (e) { - console.debug?.(e); - } - try { - let t = String(e.scopesMode || "off"); - w.setActive(t !== "off"), T.value = t; - } catch (e) { - console.debug?.(e); - } - try { - let e = String(I?.kind || ""), t = e === "video" || e === "model3d"; - te.style.display = t ? "" : "none", F.style.display = t ? "" : "none"; - let n = !!(globalThis?.ClipboardItem && navigator?.clipboard?.write); - F.style.display = t && n ? "" : "none"; - } catch (e) { - console.debug?.(e); - } - try { - E.setActive((Number(e.gridMode) || 0) !== 0); - } catch (e) { - console.debug?.(e); - } - try { - D.value = String(Number(e.gridMode) || 0); - } catch (e) { - console.debug?.(e); - } - try { - O.setActive(!!e.overlayMaskEnabled), k.value = String(e.overlayFormat || "image"), A.input.value = String(Number(e.overlayMaskOpacity ?? .65)), A.out.textContent = Number(e.overlayMaskOpacity ?? .65).toFixed(2); - } catch (e) { - console.debug?.(e); - } - try { - j.setActive(!!e.probeEnabled), M.setActive(!!e.loupeEnabled); - } catch (e) { - console.debug?.(e); - } - try { - N.setActive(!!e.hudEnabled); - } catch (e) { - console.debug?.(e); - } - try { - ee.setActive(!!e.distractionFree); - } catch (e) { - console.debug?.(e); - } - try { - P.setActive(!!e.genInfoOpen); - } catch (e) { - console.debug?.(e); - } - try { - se(String(e.channel || "rgb")); - } catch (e) { - console.debug?.(e); - } - try { - let t = Math.round((Number(e.exposureEV) || 0) * 10) / 10; - ce(x.out, { - accentRgb: ae.exposure, - active: Math.abs(t) > 1e-4 - }); - } catch (e) { - console.debug?.(e); - } - try { - let t = Math.round((Number(e.gamma) || 1) * 100) / 100; - ce(S.out, { - accentRgb: ae.gamma, - active: Math.abs(t - 1) > 1e-4 - }); - } catch (e) { - console.debug?.(e); - } - try { - let t = String(e.scopesMode || "off"); - oe(T, { - accentRgb: ae.analysis, - active: t !== "off", - title: t === "off" ? "Scopes" : "Scopes (active)" - }); - } catch (e) { - console.debug?.(e); - } - try { - let t = Number(e.gridMode) || 0; - oe(D, { - accentRgb: ae.overlay, - active: t !== 0, - title: t === 0 ? "Grid Overlay" : "Grid Overlay (active)" - }); - } catch (e) { - console.debug?.(e); - } - try { - let t = String(e.overlayFormat || "image"); - oe(k, { - accentRgb: ae.overlay, - active: t !== "image", - title: t === "image" ? "Format" : "Format (active)" - }); - } catch (e) { - console.debug?.(e); - } - try { - let r = typeof n == "function" && !!n(), i = e.mode === t.AB_COMPARE && r, a = String(e.abCompareMode || "wipe"); - oe(y, { - accentRgb: ae.compare, - active: i && a !== "wipe", - title: i && a !== "wipe" ? "Compare Mode (modified)" : "A/B Compare Mode" - }); - } catch (e) { - console.debug?.(e); - } - try { - let t = String(I?.kind || "") === "audio", n = String(e.audioVisualizerMode || "artistic"); - oe(b, { - accentRgb: ae.audioviz, - active: t && n !== "simple", - title: "Audio visualizer mode" - }); - } catch (e) { - console.debug?.(e); - } - try { - let t = !!e.genInfoOpen, n = P?.b; - n && t && (n.style.borderColor = `rgba(${ae.geninfo},0.55)`, n.style.background = `rgba(${ae.geninfo},0.14)`); - } catch (e) { - console.debug?.(e); - } -} -function Hn({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, canAB: a, canSide: o }) { - try { - let s = !!a?.(), c = !!o?.(); - r.disabled = !s, i.disabled = !c, r.style.opacity = r.disabled ? "0.35" : e.mode === t.AB_COMPARE ? "1" : "0.6", i.style.opacity = i.disabled ? "0.35" : e.mode === t.SIDE_BY_SIDE ? "1" : "0.6", n.style.opacity = e.mode === t.SINGLE ? "1" : "0.6", n.style.fontWeight = e.mode === t.SINGLE ? "600" : "400"; - try { - n.setAttribute("aria-pressed", e.mode === t.SINGLE ? "true" : "false"), r.setAttribute("aria-pressed", e.mode === t.AB_COMPARE ? "true" : "false"), i.setAttribute("aria-pressed", e.mode === t.SIDE_BY_SIDE ? "true" : "false"); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } -} -// ui/features/viewer/toolbar.ts -function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, _onZoomOut: a, _onZoomReset: o, _onZoomOneToOne: s, onMode: c, onToolsChanged: l, onCompareModeChanged: u, onExportFrame: d, onCopyFrame: f, onAudioVizModeChanged: p, onToggleFullscreen: m, getCanAB: h } = {}) { - let g = n?.unsubs || [], _ = document.createElement("div"); - _.className = "mjr-viewer-header", _.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px 16px;\n background: linear-gradient(170deg, rgba(24, 27, 33, 0.96), rgba(17, 19, 25, 0.97));\n border-bottom: 0.8px solid rgba(196, 202, 210, 0.2);\n color: white;\n box-sizing: border-box;\n "; - let v = document.createElement("div"); - v.className = "mjr-viewer-header-top", v.style.cssText = "\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n position: relative;\n padding-right: 84px;\n padding-left: 12px;\n min-width: 0;\n box-sizing: border-box;\n "; - let y = document.createElement("div"); - y.className = "mjr-viewer-header-meta mjr-viewer-header-meta--left", y.style.cssText = "display:flex; align-items:center; gap:10px; min-width:0; overflow:hidden;"; - let b = document.createElement("div"); - b.className = "mjr-viewer-title-line", b.style.cssText = "display:flex; align-items:center; justify-content:center; gap:8px; min-width:0; flex-wrap:nowrap; overflow:hidden;"; - let x = document.createElement("div"); - x.className = "mjr-viewer-title-wrap", x.style.cssText = "display:flex; align-items:center; justify-content:center; gap:12px; min-width:0; max-width:min(100%, calc(100vw - 220px)); text-align:center;"; - let S = document.createElement("span"); - S.className = "mjr-viewer-filename", S.style.cssText = "font-size: 13px; font-weight: 600; min-width:0; max-width:min(60vw, 820px); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:center;"; - let w = document.createElement("div"); - w.className = "mjr-viewer-badges", w.style.cssText = "display:flex; gap:6px; align-items:center; flex-wrap:nowrap; min-width:0;"; - let T = document.createElement("div"); - T.className = "mjr-viewer-header-meta mjr-viewer-header-meta--right", T.style.cssText = "display:none; align-items:center; gap:10px; min-width:0; justify-content:flex-end; overflow:hidden;"; - let E = document.createElement("span"); - E.className = "mjr-viewer-filename mjr-viewer-filename--right", E.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:right;"; - let D = document.createElement("div"); - D.className = "mjr-viewer-badges mjr-viewer-badges--right", D.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap; justify-content:flex-end;", b.appendChild(S), b.appendChild(w), x.appendChild(b), T.appendChild(D), T.appendChild(E); - let O = document.createElement("div"); - O.className = "mjr-viewer-mode-buttons", O.style.cssText = "display: flex; gap: 4px;"; - let k = Rn("Single", e.SINGLE); - k.title = C("tooltip.singleViewMode", "Single view mode (one image)"); - let A = Rn("A/B", e.AB_COMPARE); - A.title = C("tooltip.compareOverlayMode", "A/B compare mode (overlay)"); - let j = Rn("Side", e.SIDE_BY_SIDE); - j.title = C("tooltip.compareSideBySide", "Side-by-side comparison mode"), O.appendChild(k), O.appendChild(A), O.appendChild(j); - let M = Ln("X", "Close (Esc)"); - M.style.fontSize = "18px"; - try { - M.classList.add("mjr-viewer-close"), M.textContent = ""; - let e = document.createElement("span"); - e.className = "pi pi-times", e.setAttribute("aria-hidden", "true"), M.appendChild(e); - } catch (e) { - console.debug?.(e); - } - let N = Ln("[ ]", "Toggle Fullscreen (F)"); - try { - N.classList.add("mjr-viewer-fs"); - } catch (e) { - console.debug?.(e); - } - N.style.fontSize = "16px"; - try { - N.style.position = "absolute", N.style.top = "8px", N.style.left = "", N.style.right = "48px", N.style.zIndex = "10002", N.style.width = "34px", N.style.height = "34px", N.style.padding = "0", N.style.display = "inline-flex", N.style.alignItems = "center", N.style.justifyContent = "center", N.style.borderRadius = "8px"; - let e = document.createElement("span"); - e.className = "pi pi-window-maximize", e.setAttribute("aria-hidden", "true"), N.textContent = "", N.appendChild(e); - let t = () => { - try { - let t = document.fullscreenElement != null; - e.className = t ? "pi pi-window-minimize" : "pi pi-window-maximize", N.title = t ? "Exit Fullscreen (F)" : "Enter Fullscreen (F)"; - } catch (e) { - console.debug?.(e); - } - }; - if (N.onclick = (e) => { - e.stopPropagation(), m?.(); - }, n?.safeAddListener) n.safeAddListener(document, "fullscreenchange", t); - else try { - document.addEventListener("fullscreenchange", t); - let e = () => { - try { - document.removeEventListener("fullscreenchange", t); - } catch (e) { - console.debug?.(e); - } - }; - _._mjrCleanup ? _._mjrCleanup.push(e) : _._mjrCleanup = [e]; - } catch (e) { - console.debug?.(e); - } - t(); - } catch (e) { - console.debug?.(e); - } - let ee = document.createElement("div"); - ee.className = "mjr-viewer-header-area mjr-viewer-header-area--left", ee.style.cssText = "display:none; align-items:center; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", ee.appendChild(y); - let P = document.createElement("div"); - P.className = "mjr-viewer-header-area mjr-viewer-header-area--center", P.style.cssText = "display:flex; align-items:center; justify-content:center; gap:12px; flex:1 1 auto; min-width:0;", x.appendChild(O), P.appendChild(x); - let te = document.createElement("div"); - te.className = "mjr-viewer-header-area mjr-viewer-header-area--right", te.style.cssText = "display:none; align-items:center; justify-content:flex-end; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", te.appendChild(T), v.appendChild(ee), v.appendChild(P), v.appendChild(te); - try { - M.style.position = "absolute", M.style.top = "8px", M.style.left = "", M.style.right = "8px", M.style.transform = "", M.style.zIndex = "10002", M.style.width = "34px", M.style.height = "34px", M.style.padding = "0", M.style.display = "inline-flex", M.style.alignItems = "center", M.style.justifyContent = "center", M.style.borderRadius = "8px"; - } catch (e) { - console.debug?.(e); - } - _.appendChild(v), _.appendChild(N), _.appendChild(M); - let { toolsRow: F, gradePanel: ne, overlayPanel: re, inspectPanel: ie, actionPanel: ae, infoPanel: oe, toolsActions: se, toolsMeta: ce, chGroup: le, expGroup: I, gamGroup: L, anaGroup: ue, ovGuidesGroup: de, ovInspectGroup: R, cmpGroup: z, audGroup: fe, model3dHint: B, helpWrap: V, helpBtn: H, helpPop: pe, channelsSelect: U, exposureCtl: me, gammaCtl: he, zebraToggle: ge, scopesToggle: _e, scopesSelect: W, gridToggle: G, gridModeSelect: K, maskToggle: ve, formatSelect: ye, maskOpacityCtl: q, probeToggle: be, loupeToggle: xe, hudToggle: Se, focusToggle: Ce, genInfoToggle: we, compareModeSelect: Te, audioVizModeSelect: Ee, resetGradeBtn: De, exportBtn: Oe, copyBtn: ke, resetExposure: Ae, resetGamma: je, resetViewerTools: Me, ACCENT: Ne, setSelectHighlighted: Pe, setChannelSelectStyle: Fe, setValueHighlighted: Ie, setGroupHighlighted: J } = zn({ - VIEWER_MODES: e, - state: t, - onToolsChanged: l, - onCompareModeChanged: u, - onExportFrame: d, - onCopyFrame: f, - onAudioVizModeChanged: p, - getCanAB: h - }); - _.appendChild(F), Bn({ - unsubs: g, - state: t, - VIEWER_MODES: e, - onMode: c, - onClose: r, - onToolsChanged: l, - onCompareModeChanged: u, - onAudioVizModeChanged: p, - onExportFrame: d, - onCopyFrame: f, - singleBtn: k, - abBtn: A, - sideBtn: j, - closeBtn: M, - channelsSelect: U, - compareModeSelect: Te, - audioVizModeSelect: Ee, - exposureCtl: me, - gammaCtl: he, - zebraToggle: ge, - scopesToggle: _e, - scopesSelect: W, - gridToggle: G, - gridModeSelect: K, - maskToggle: ve, - formatSelect: ye, - maskOpacityCtl: q, - probeToggle: be, - loupeToggle: xe, - hudToggle: Se, - focusToggle: Ce, - genInfoToggle: we, - resetGradeBtn: De, - exportBtn: Oe, - copyBtn: ke, - resetExposure: Ae, - resetGamma: je, - resetViewerTools: Me, - expGroup: I, - gamGroup: L - }); - let Le = () => Vn({ - state: t, - VIEWER_MODES: e, - getCanAB: h, - header: _, - toolsRow: F, - chGroup: le, - expGroup: I, - gamGroup: L, - anaGroup: ue, - gradePanel: ne, - overlayPanel: re, - inspectPanel: ie, - infoPanel: oe, - actionPanel: ae, - ovGuidesGroup: de, - ovInspectGroup: R, - model3dHint: B, - helpWrap: V, - channelsSelect: U, - compareModeSelect: Te, - audioVizModeSelect: Ee, - exposureCtl: me, - gammaCtl: he, - zebraToggle: ge, - scopesToggle: _e, - scopesSelect: W, - gridToggle: G, - gridModeSelect: K, - maskToggle: ve, - formatSelect: ye, - maskOpacityCtl: q, - probeToggle: be, - loupeToggle: xe, - hudToggle: Se, - focusToggle: Ce, - genInfoToggle: we, - exportBtn: Oe, - copyBtn: ke, - resetGradeBtn: De, - cmpGroup: z, - audGroup: fe, - ACCENT: Ne, - setSelectHighlighted: Pe, - setChannelSelectStyle: Fe, - setValueHighlighted: Ie, - setGroupHighlighted: J - }), Re = ({ canAB: n, canSide: r } = {}) => Hn({ - state: t, - VIEWER_MODES: e, - singleBtn: k, - abBtn: A, - sideBtn: j, - canAB: n, - canSide: r - }); - try { - let e = null, t = () => { - try { - e?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e = null; - try { - pe.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - }, n = () => { - t(), e = new AbortController(); - try { - pe.style.display = ""; - } catch (e) { - console.debug?.(e); - } - try { - document.addEventListener("mousedown", (e) => { - V.contains(e.target) || t(); - }, { - capture: !0, - signal: e.signal - }), document.addEventListener("keydown", (e) => { - e.key === "Escape" && t(); - }, { - capture: !0, - signal: e.signal - }), document.addEventListener("scroll", t, { - capture: !0, - passive: !0, - signal: e.signal - }); - } catch (e) { - console.debug?.(e); - } - }; - g.push(() => t()), g.push(Z(H, "click", () => { - pe.style.display === "none" ? n() : t(); - })); - } catch (e) { - console.debug?.(e); - } - return { - headerEl: _, - headerTopEl: v, - filenameEl: S, - badgesBarEl: w, - filenameRightEl: E, - badgesBarRightEl: D, - leftAreaEl: ee, - leftMetaEl: y, - centerAreaEl: P, - rightMetaEl: T, - rightAreaEl: te, - titleLineEl: b, - titleWrapEl: x, - modeButtonsEl: O, - syncToolsUIFromState: Le, - syncModeButtons: Re - }; -} -// ui/features/viewer/keyboard.ts -function Wn(e) { - if (!e) return null; - try { - if (typeof e.prompt == "string" && e.prompt.trim()) return e.prompt.trim(); - if (e.geninfo) { - let t = e.geninfo; - if (typeof t.prompt == "string" && t.prompt.trim()) return t.prompt.trim(); - if (typeof t.positive_prompt == "string" && t.positive_prompt.trim()) { - let e = t.positive_prompt.trim(); - return typeof t.negative_prompt == "string" && t.negative_prompt.trim() && (e += "\n\nNegative prompt: " + t.negative_prompt.trim()), e; - } - } - let t = e.metadata_raw; - if (t && typeof t == "object") { - if (typeof t.prompt == "string" && t.prompt.trim()) return t.prompt.trim(); - let e = t.geninfo || t.GenInfo || t.generation; - if (e && typeof e == "object") { - if (typeof e.prompt == "string" && e.prompt.trim()) return e.prompt.trim(); - if (typeof e.positive_prompt == "string" && e.positive_prompt.trim()) { - let t = e.positive_prompt.trim(); - return typeof e.negative_prompt == "string" && e.negative_prompt.trim() && (t += "\n\nNegative prompt: " + e.negative_prompt.trim()), t; - } - } - } - if (typeof t == "string" && t.includes("Negative prompt:")) return t.trim(); - } catch (e) { - console.debug?.(e); - } - return null; -} -function Gn({ overlay: e, _content: t, singleView: n, state: r, VIEWER_MODES: i, computeOneToOneZoom: a, setZoom: s, scheduleOverlayRedraw: c, scheduleApplyGrade: l, syncToolsUIFromState: u, applyDistractionFreeUI: f, navigateViewerAssets: p, closeViewer: m, renderBadges: h, updateAssetRating: g, safeDispatchCustomEvent: _, ASSET_RATING_CHANGED_EVENT: v, probeTooltip: y, loupeWrap: b, getVideoControls: x, lifecycle: S, renderGenInfoPanel: T } = {}) { - let E = S?.unsubs || [], D = null, O = null, k = () => { - try { - D && clearTimeout(D); - } catch (e) { - console.debug?.(e); - } - D = null, O = null; - }, A = (e, t) => { - k(), O = { - assetId: e, - rating: t - }, D = setTimeout(async () => { - let e = O; - if (D = null, O = null, e?.assetId) try { - let t = await g?.(e.assetId, e.rating); - if (!t?.ok) { - o(t?.error || C("toast.ratingUpdateFailed"), "error"); - return; - } - o(C("toast.ratingSetN", { n: e.rating }), "success", 1500), _?.(v, { - assetId: String(e.assetId), - rating: e.rating - }, { warnPrefix: "[Viewer]" }); - } catch { - o(C("toast.ratingUpdateError"), "error"); - } - }, 300); - }, j = () => { - try { - document.fullscreenElement ? document?.exitFullscreen?.() : e?.requestFullscreen?.(); - } catch (e) { - console.debug?.(e); - } - }, M = (t) => { - let g = () => { - try { - t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.(); - } catch (e) { - console.debug?.(e); - } - }, v = r?.mode === i?.SINGLE, S = r?.assets?.[r?.currentIndex], E = () => { - try { - return !!t?.target?.closest?.(".mjr-viewer-playerbar"); - } catch { - return !1; - } - }, D = () => { - let e = String(t?.key || ""); - return e === " " || e === "Spacebar" || e === "ArrowLeft" || e === "ArrowRight" || e === "Home" || e === "End" || e === "[" || e === "{" || e === "]" || e === "}" || e === "\\" || e === "|" || e === "i" || e === "I" || e === "o" || e === "O"; - }; - if (d()) return; - try { - if (e?.style?.display === "none") return; - } catch (e) { - console.debug?.(e); - } - try { - let e = t?.target; - if (e && (e.tagName === "INPUT" || e.tagName === "TEXTAREA" || e.isContentEditable) && !(v && S?.kind === "video" && E() && D())) { - if (t.key === "f" || t.key === "F") { - g(), j(); - return; - } - t.key === "Escape" && (g(), Q.tags.open ? fn() : X(m)); - return; - } - } catch (e) { - console.debug?.(e); - } - let O = async (e) => { - if (!v || !S?.id || e !== "0" && e !== "1" && e !== "2" && e !== "3" && e !== "4" && e !== "5") return !1; - let t = e === "0" ? 0 : Number(e); - if (!Number.isFinite(t)) return !1; - try { - return S.rating = t, X(h), A(S.id, t), !0; - } catch { - return !0; - } - }, k = () => { - try { - return x?.() || null; - } catch { - return null; - } - }, M = async (e) => { - if (!v || S?.kind !== "video") return !1; - try { - let t = k(); - if (t?.stepFrames) return t.stepFrames(e), !0; - } catch (e) { - console.debug?.(e); - } - let t = n?.querySelector?.("video"); - if (!t) return !1; - try { - t.pause?.(); - } catch (e) { - console.debug?.(e); - } - let r = 1 / 30 * e; - try { - let n = Number(t.duration), i = Math.max(0, Math.min(Number.isFinite(n) ? n : Infinity, (t.currentTime || 0) + r)); - t.currentTime = i; - try { - t.dispatchEvent?.(new CustomEvent("mjr:frameStep", { detail: { - direction: e, - time: i - } })); - } catch (e) { - console.debug?.(e); - } - return !0; - } catch { - return !0; - } - }, N = (e, { absolute: t = !1 } = {}) => { - try { - let n = k(); - if (!n) return !1; - if (t) { - let t = n.setPlaybackRate?.(e); - return Number.isFinite(Number(t)) ? (r.playbackRate = Number(t), o(C("toast.playbackRate", "Playback {rate}x", { rate: Number(t).toFixed(2) }), "info", 1200), !0) : !1; - } - let i = n.adjustPlaybackRate?.(e); - return Number.isFinite(Number(i)) ? (r.playbackRate = Number(i), o(C("toast.playbackRate", "Playback {rate}x", { rate: Number(i).toFixed(2) }), "info", 1200), !0) : !1; - } catch { - return !1; - } - }; - if ((t.ctrlKey || t.metaKey) && (t.key === "c" || t.key === "C")) try { - let e = Wn(S); - if (e) { - g(), navigator.clipboard?.writeText?.(e).then(() => o(C("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => o(C("toast.copyFailed", "Copy failed"), "error", 1500)); - return; - } - } catch (e) { - console.debug?.(e); - } - if (v && !t.altKey && !t.ctrlKey && !t.metaKey && (t.key === "0" || t.key === "1" || t.key === "2" || t.key === "3" || t.key === "4" || t.key === "5")) g(), O(t.key); - else switch (t.key) { - case "1": { - if (!t.altKey) break; - let e = X(a); - if (e == null) break; - g(); - try { - let t = Math.abs((Number(r?.zoom) || 1) - e) < .01; - s?.(t ? 1 : e, { - clientX: r?._lastPointerX, - clientY: r?._lastPointerY - }); - } catch (e) { - console.debug?.(e); - } - break; - } - case "g": - case "G": - g(); - try { - r.gridMode = ((Number(r.gridMode) || 0) + 1) % 5; - } catch (e) { - console.debug?.(e); - } - X(c), X(u); - break; - case "f": - case "F": - g(), j(); - break; - case "d": - case "D": - g(); - try { - r.genInfoOpen = !r.genInfoOpen; - } catch (e) { - console.debug?.(e); - } - X(u), X(T); - break; - case "t": - case "T": - if (!S?.id) break; - g(), dn({ - x: Number(r?._lastPointerX) || Math.round((e?.clientWidth || 0) / 2), - y: Number(r?._lastPointerY) || Math.round((e?.clientHeight || 0) / 2), - asset: S, - onChanged: ((...e) => { - let t = e[0]; - S.tags = t, _(w, { - assetId: String(S.id), - tags: t - }, { warnPrefix: "[ViewerKeyboard]" }), X(h); - }) - }); - break; - case "z": - case "Z": - g(); - try { - r.analysisMode = r.analysisMode === "zebra" ? "none" : "zebra"; - } catch (e) { - console.debug?.(e); - } - X(u), X(l); - break; - case "i": - case "I": - if (v && S?.kind === "video" && k()?.setInPoint?.()) { - g(), o(C("toast.inPointSet", "In point set"), "info", 1200); - break; - } - g(); - try { - r.probeEnabled = !r.probeEnabled; - } catch (e) { - console.debug?.(e); - } - try { - r.probeEnabled || (y.style.display = "none"); - } catch (e) { - console.debug?.(e); - } - X(u); - break; - case "o": - case "O": - if (v && S?.kind === "video" && k()?.setOutPoint?.()) { - g(), o(C("toast.outPointSet", "Out point set"), "info", 1200); - break; - } - break; - case "Home": - if (v && S?.kind === "video" && k()?.goToIn?.()) { - g(); - break; - } - break; - case "End": - if (v && S?.kind === "video" && k()?.goToOut?.()) { - g(); - break; - } - break; - case "l": - case "L": - g(); - try { - r.loupeEnabled = !r.loupeEnabled; - } catch (e) { - console.debug?.(e); - } - try { - r.loupeEnabled || (b.style.display = "none"); - } catch (e) { - console.debug?.(e); - } - X(u); - break; - case "x": - case "X": - g(); - try { - r.distractionFree = !r.distractionFree; - } catch (e) { - console.debug?.(e); - } - X(u), X(f), X(T); - break; - case "c": - case "C": { - let e = r?._probe; - if (!e || e.r == null || e.g == null || e.b == null) break; - let t = `#${[ - e.r, - e.g, - e.b - ].map((e) => Math.max(0, Math.min(255, Number(e) || 0)).toString(16).padStart(2, "0")).join("")}`; - try { - let e = navigator?.clipboard; - e?.writeText && (g(), e.writeText(t).catch(() => {})); - } catch (e) { - console.debug?.(e); - } - break; - } - case " ": - case "Spacebar": - if (v && S?.kind === "video") { - let e = n?.querySelector?.("video"); - if (e) { - g(); - try { - let e = k(); - if (e?.togglePlay) { - e.togglePlay(); - break; - } - } catch (e) { - console.debug?.(e); - } - try { - if (e.paused) { - let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}); - } else e.pause?.(); - } catch (e) { - console.debug?.(e); - } - break; - } - } - break; - case "Tab": - g(); - try { - e?.contains?.(document.activeElement) || e?.focus?.(); - } catch (e) { - console.debug?.(e); - } - break; - case "Escape": - g(), Q.tags.open ? fn() : X(m); - break; - case "ArrowLeft": - if (v && t.target?.closest?.(".mjr-viewer-playerbar")) { - g(), M(-1); - break; - } - g(), X(() => p?.(-1)); - break; - case "ArrowRight": - if (v && t.target?.closest?.(".mjr-viewer-playerbar")) { - g(), M(1); - break; - } - g(), X(() => p?.(1)); - break; - case "[": - case "{": - g(), N(-.25) || o(C("toast.playbackVideoOnly"), "warning", 1400); - break; - case "]": - case "}": - g(), N(.25) || o(C("toast.playbackVideoOnly"), "warning", 1400); - break; - case "\\": - case "|": - g(), N(1, { absolute: !0 }) || o(C("toast.playbackVideoOnly"), "warning", 1400); - break; - case "+": - case "=": - g(); - try { - s?.((Number(r?.zoom) || 1) + .25, { - clientX: r?._lastPointerX, - clientY: r?._lastPointerY - }); - } catch (e) { - console.debug?.(e); - } - break; - case "-": - case "_": - g(); - try { - s?.((Number(r?.zoom) || 1) - .25, { - clientX: r?._lastPointerX, - clientY: r?._lastPointerY - }); - } catch (e) { - console.debug?.(e); - } - } - }, N = null, ee = () => { - try { - if (N) return; - N = Z(window, "keydown", M, !0); - } catch (e) { - console.debug?.(e); - } - }, P = () => { - try { - X(N); - } catch (e) { - console.debug?.(e); - } - N = null; - }; - return E.push(() => k()), E.push(() => P()), { - bind: ee, - unbind: P, - dispose: () => { - k(), P(); - } - }; -} -// ui/features/viewer/videoSync.ts -var Kn = () => { - try { - return !!T?.DEBUG_VIEWER; - } catch { - return !1; - } -}; -function qn(e, t, { threshold: n = .15, correctionCooldownMs: r = 250 } = {}) { - let i = new AbortController(); - try { - if (!e) return i; - let a = Array.isArray(t) ? t.filter((t) => t && t !== e) : []; - if (!a.length) return i; - let o = [e, ...a].filter(Boolean), s = !1, c = /* @__PURE__ */ new WeakSet(), l = { - source: null, - rafId: null, - rvfcId: null - }, u = 0, d = () => { - try { - let e = l.source; - l.rvfcId != null && typeof e?.cancelVideoFrameCallback == "function" && e.cancelVideoFrameCallback(l.rvfcId); - } catch (e) { - console.debug?.(e); - } - l.rvfcId = null; - try { - l.rafId != null && typeof cancelAnimationFrame == "function" && cancelAnimationFrame(l.rafId); - } catch (e) { - console.debug?.(e); - } - l.rafId = null, l.source = null; - }, f = (e) => { - try { - if (e && e.paused === !1) return; - try { - c.add(e); - } catch (e) { - console.debug?.(e); - } - let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}); - } catch (e) { - console.debug?.(e); - } - }, p = () => { - try { - return typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(); - } catch { - return Date.now(); - } - }, m = (e, { force: t = !1 } = {}) => { - if (!s) try { - let i = Number(e?.currentTime) || 0, a = e?.paused === !1, c = p(), l = Math.max(0, Number(r) || 0), d = t || !a || !u || c - u >= l, f = !1; - for (let t of o) if (t && t !== e) try { - Math.abs((Number(t.currentTime) || 0) - i) > n && d && (s = !0, t.currentTime = i, s = !1, f = !0); - } catch { - s = !1; - } - a && f && (u = c); - } catch { - s = !1; - } - }, h = () => { - let t = l.source || e; - if (l.rafId = null, l.rvfcId = null, !(!t || i.signal.aborted || t.paused)) { - m(t); - try { - if (typeof t?.requestVideoFrameCallback == "function") { - l.rvfcId = t.requestVideoFrameCallback(h); - return; - } - } catch (e) { - console.debug?.(e); - } - try { - typeof requestAnimationFrame == "function" && (l.rafId = requestAnimationFrame(h)); - } catch (e) { - console.debug?.(e); - } - } - }, g = (t = e) => { - d(), l.source = t || e, !(!l.source || l.source.paused || i.signal.aborted) && h(); - }; - try { - i.signal.addEventListener("abort", d, { once: !0 }); - } catch (e) { - console.debug?.(e); - } - let _ = (t = {}) => m(e, t), v = (t, n = e) => { - if (!s) { - for (let e of o) if (e && e !== n) try { - if (t) f(e); - else { - try { - c.add(e); - } catch (e) { - console.debug?.(e); - } - e.pause?.(); - } - } catch (e) { - console.debug?.(e); - } - } - }, y = (t = e) => { - if (!s) { - for (let e of o) if (e && e !== t) try { - e.muted = !!t.muted, e.volume = Number(t.volume) || 0; - } catch (e) { - console.debug?.(e); - } - } - }, b = (t = e) => { - if (!s) { - for (let e of o) if (e && e !== t) try { - e.playbackRate = Number(t.playbackRate) || 1; - } catch (e) { - console.debug?.(e); - } - } - }; - try { - for (let e of a) { - try { - e.muted = !0; - } catch (e) { - console.debug?.(e); - } - try { - e.loop = !1; - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - try { - y(), b(), _(), e.paused || (v(!0), g(e)); - } catch (e) { - console.debug?.(e); - } - e.addEventListener("play", () => v(!0), { - signal: i.signal, - passive: !0 - }), e.addEventListener("play", () => g(e), { - signal: i.signal, - passive: !0 - }), e.addEventListener("pause", () => { - d(), v(!1); - }, { - signal: i.signal, - passive: !0 - }), e.addEventListener("timeupdate", () => _(), { - signal: i.signal, - passive: !0 - }), e.addEventListener("seeking", () => _({ force: !0 }), { - signal: i.signal, - passive: !0 - }), e.addEventListener("seeked", () => _({ force: !0 }), { - signal: i.signal, - passive: !0 - }), e.addEventListener("ended", () => _({ force: !0 }), { - signal: i.signal, - passive: !0 - }), e.addEventListener("volumechange", y, { - signal: i.signal, - passive: !0 - }), e.addEventListener("ratechange", b, { - signal: i.signal, - passive: !0 - }); - for (let t of a) try { - t.addEventListener("play", () => { - c.has(t) ? (c.delete(t), g(e)) : (m(t, { force: !0 }), b(t), v(!0, t), g(t)); - }, { - signal: i.signal, - passive: !0 - }), t.addEventListener("pause", () => { - c.has(t) ? c.delete(t) : t?.ended || (d(), v(!1, t)); - }, { - signal: i.signal, - passive: !0 - }), t.addEventListener("seeking", () => m(t, { force: !0 }), { - signal: i.signal, - passive: !0 - }), t.addEventListener("seeked", () => m(t, { force: !0 }), { - signal: i.signal, - passive: !0 - }), t.addEventListener("ratechange", () => b(t), { - signal: i.signal, - passive: !0 - }); - } catch (e) { - console.debug?.(e); - } - try { - for (let t of a) try { - t.addEventListener("ended", () => { - if (!s) { - try { - s = !0, t.currentTime = Number(e.currentTime) || 0; - } catch (e) { - console.debug?.(e); - } finally { - s = !1; - } - try { - e.paused || f(t); - } catch (e) { - console.debug?.(e); - } - } - }, { - signal: i.signal, - passive: !0 - }); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - try { - for (let e of a) try { - e.addEventListener("loadedmetadata", () => _({ force: !0 }), { - signal: i.signal, - passive: !0, - once: !0 - }); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - } catch (e) { - if (Kn()) try { - console.warn("[Viewer] follower video sync setup failed", e); - } catch (e) { - console.debug?.(e); - } - } - return i; -} -// ui/features/viewer/grid.ts -function Jn({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getViewportRect: a, clearCanvas: o } = {}) { - let s = () => { - try { - let e = n?.mode; - return e === r?.AB_COMPARE ? t?.querySelector?.(".mjr-viewer-ab") || t || null : e === r?.SIDE_BY_SIDE ? t?.querySelector?.(".mjr-viewer-sidebyside") || t || null : t?.querySelector?.(".mjr-viewer-single") || t || null; - } catch { - return t || null; - } - }, c = (e, i) => { - try { - if (!e) return i || null; - let a = n?.mode; - if (a === r?.SIDE_BY_SIDE || a === r?.AB_COMPARE) { - let t = e; - for (; t && t !== i && t.parentElement;) { - if (t.parentElement === i) return t; - t = t.parentElement; - } - return i || null; - } - return i || t || null; - } catch { - return i || t || null; - } - }, l = (e) => { - try { - let t = e?.dataset?.mjrAssetId; - if (t == null || t === "") return n?.assets?.[n?.currentIndex] || null; - let r = Array.isArray(n?.assets) ? n.assets : []; - for (let e of r) try { - if (e?.id != null && String(e.id) === String(t)) return e; - } catch (e) { - console.debug?.(e); - } - return n?.assets?.[n?.currentIndex] || null; - } catch { - return n?.assets?.[n?.currentIndex] || null; - } - }, u = (e, t = null) => { - try { - if (!e) return { - w: 0, - h: 0 - }; - if (e instanceof HTMLCanvasElement) { - let t = Number(e._mjrNaturalW) || Number(e.width) || 0, n = Number(e._mjrNaturalH) || Number(e.height) || 0; - if (t > 0 && n > 0) return { - w: t, - h: n - }; - } - let r = Number(e.videoWidth) || Number(e.naturalWidth) || 0, i = Number(e.videoHeight) || Number(e.naturalHeight) || 0; - if (r > 0 && i > 0) return { - w: r, - h: i - }; - try { - let e = Number(t?.width) || 0, n = Number(t?.height) || 0; - if (e > 0 && n > 0) return { - w: e, - h: n - }; - } catch (e) { - console.debug?.(e); - } - try { - let e = Number(n?._mediaW) || 0, t = Number(n?._mediaH) || 0; - if (e > 0 && t > 0) return { - w: e, - h: t - }; - } catch (e) { - console.debug?.(e); - } - try { - let e = n?.assets?.[n?.currentIndex] || null, t = Number(e?.width) || 0, r = Number(e?.height) || 0; - if (t > 0 && r > 0) return { - w: t, - h: r - }; - } catch (e) { - console.debug?.(e); - } - return { - w: 0, - h: 0 - }; - } catch { - return { - w: 0, - h: 0 - }; - } - }, d = (e, t, n, r) => { - try { - let i = Number(e) || 0, a = Number(t) || 0, o = Number(n) || 0, s = Number(r) || 0; - if (!(i > 0 && a > 0 && o > 0 && s > 0)) return { - x: 0, - y: 0, - w: i, - h: a - }; - let c = o / s; - if (!Number.isFinite(c) || c <= 0) return { - x: 0, - y: 0, - w: i, - h: a - }; - let l = a, u = a * c; - return { - x: (i - u) / 2, - y: 0, - w: u, - h: l - }; - } catch { - return { - x: 0, - y: 0, - w: Number(e) || 0, - h: Number(t) || 0 - }; - } - }, f = (e, t, n, r, i) => { - try { - let a = Math.max(.1, Math.min(16, Number(n) || 1)), o = Number(t?.x) || 0, s = Number(t?.y) || 0, c = Number(e?.x) || 0, l = Number(e?.y) || 0, u = Number(e?.w) || 0, d = Number(e?.h) || 0, f = Number(r) || 0, p = Number(i) || 0; - return { - x: o + (c - o) * a + f, - y: s + (l - s) * a + p, - w: u * a, - h: d * a - }; - } catch { - return { - x: 0, - y: 0, - w: 0, - h: 0 - }; - } - }, p = (e, t, n, r) => { - try { - let i = t || {}, a = Number(i.x) || 0, o = Number(i.y) || 0, s = Number(i.w) || 0, c = Number(i.h) || 0; - if (!(s > 8 && c > 8)) return; - let l = String(n || ""); - if (!l) return; - let u = Math.max(6, Math.round(6 * r)), d = Math.max(3, Math.round(3 * r)), f = Math.max(11, Math.round(11 * r)); - e.save(), e.font = `${f}px var(--comfy-font, ui-sans-serif, system-ui)`, e.textAlign = "left", e.textBaseline = "top"; - let p = Math.ceil(e.measureText(l).width) + u * 2, m = f + d * 2, h = a + Math.max(2, Math.round(8 * r)), g = o + Math.max(2, Math.round(8 * r)); - e.fillStyle = "rgba(0,0,0,0.55)", e.strokeStyle = "rgba(255,255,255,0.18)", e.lineWidth = Math.max(1, Math.round(1 * r)), e.beginPath(); - let _ = Math.max(6, Math.round(8 * r)); - e.moveTo(h + _, g), e.arcTo(h + p, g, h + p, g + m, _), e.arcTo(h + p, g + m, h, g + m, _), e.arcTo(h, g + m, h, g, _), e.arcTo(h, g, h + p, g, _), e.closePath(), e.fill(), e.stroke(), e.fillStyle = "rgba(255,255,255,0.92)", e.fillText(l, h + u, g + d), e.restore(); - } catch { - try { - e.restore(); - } catch (e) { - console.debug?.(e); - } - } - }, m = () => { - try { - let t = a?.(); - if (!t) return { - w: 0, - h: 0, - dpr: 1 - }; - let n = Math.max(1, Math.min(3, Number(window.devicePixelRatio) || 1)), r = Math.max(1, Math.floor(t.width * n)), i = Math.max(1, Math.floor(t.height * n)); - try { - e?.width !== r && (e.width = r), e?.height !== i && (e.height = i); - } catch (e) { - console.debug?.(e); - } - return { - w: r, - h: i, - dpr: n - }; - } catch { - return { - w: 0, - h: 0, - dpr: 1 - }; - } - }, h = (e, t, n) => { - try { - let r = String(e || "image"); - if (r === "image") { - let e = u(t), r = (Number(e.w) || 0) / (Number(e.h) || 1); - if (Number.isFinite(r) && r > 0) return r; - let i = (Number(n?.width) || 0) / (Number(n?.height) || 1); - return Number.isFinite(i) && i > 0 ? i : 1; - } - return r === "16:9" ? 16 / 9 : r === "9:16" ? 9 / 16 : r === "1:1" ? 1 : r === "4:3" ? 4 / 3 : r === "2.39" ? 2.39 : 1; - } catch { - return 1; - } - }, g = (e, t, n) => { - try { - let r = Number(e) || 0, i = Number(t) || 0, a = Number(n) || 1; - if (!(r > 0 && i > 0 && a > 0)) return { - x: 0, - y: 0, - w: r, - h: i - }; - let o = r / i, s = r, c = i; - return a >= o ? (s = r, c = r / a) : (c = i, s = i * a), { - x: (r - s) / 2, - y: (i - c) / 2, - w: s, - h: c - }; - } catch { - return { - x: 0, - y: 0, - w: Number(e) || 0, - h: Number(t) || 0 - }; - } - }, _ = (t, n, r) => { - try { - let i = Math.max(0, Math.min(.92, Number(r))); - if (!(i > 0)) return; - t.save(), t.globalCompositeOperation = "source-over", t.fillStyle = `rgba(0,0,0,${i})`, t.fillRect(0, 0, e.width, e.height), t.globalCompositeOperation = "destination-out", t.fillStyle = "rgba(0,0,0,1)"; - let a = Array.isArray(n) ? n : [n]; - for (let e of a) { - if (!e) continue; - let n = Number(e.x) || 0, r = Number(e.y) || 0, i = Number(e.w) || 0, a = Number(e.h) || 0; - i > 1 && a > 1 && t.fillRect(n, r, i, a); - } - t.restore(); - } catch { - try { - t.restore(); - } catch (e) { - console.debug?.(e); - } - } - }, v = (e, t, n) => { - try { - e.save(); - try { - e.setLineDash?.([Math.max(2, 4 * n), Math.max(2, 3 * n)]); - } catch (e) { - console.debug?.(e); - } - e.strokeStyle = "rgba(255,255,255,0.22)", e.lineWidth = Math.max(1, Math.floor(1 * n)), e.strokeRect(t.x + .5, t.y + .5, t.w - 1, t.h - 1), e.restore(); - } catch { - try { - e.restore(); - } catch (e) { - console.debug?.(e); - } - } - }; - return { - ensureCanvasSize: m, - redrawGrid: ({ w: t, h: m, dpr: y } = {}) => { - try { - let b = e?.getContext?.("2d"); - if (!b) return; - try { - o?.(b, t, m); - } catch (e) { - console.debug?.(e); - } - let x = a?.(); - if (!x) return; - let S = Number(x.width) || 0, C = Number(x.height) || 0; - if (!(S > 1 && C > 1)) return; - let w = s(), T = n?.mode, E = (() => { - try { - if (T === r?.SINGLE) return [i?.()].filter(Boolean); - let e = w?.querySelectorAll?.(".mjr-viewer-media") || []; - return Array.from(e || []).filter(Boolean); - } catch { - return [i?.()].filter(Boolean); - } - })(); - if (!E.length) return; - let D = [], O = []; - for (let e of E) try { - let t = c(e, w)?.getBoundingClientRect?.() || null; - if (!t) continue; - let r = Number(t.width) || 0, i = Number(t.height) || 0; - if (!(r > 1 && i > 1)) continue; - let a = l(e), o = u(e, a), s = d(r, i, o.w, o.h), p = h(n?.overlayFormat, e, { - width: s.w, - height: s.h - }), m = g(s.w, s.h, p), _ = (Number(t.left) || 0) - (Number(x.left) || 0), v = (Number(t.top) || 0) - (Number(x.top) || 0), b = { - x: _ + (s.x || 0), - y: v + (s.y || 0), - w: s.w || r, - h: s.h || i - }, S = { - x: b.x + (m.x || 0), - y: b.y + (m.y || 0), - w: m.w || b.w, - h: m.h || b.h - }, C = { - x: _ + r / 2, - y: v + i / 2 - }, T = Number(n?.zoom) || 1, E = (Number(n?.panX) || 0) / T, k = (Number(n?.panY) || 0) / T, A = f(b, C, T, E, k), j = f(S, C, T, E, k), M = { - x: A.x * y, - y: A.y * y, - w: A.w * y, - h: A.h * y, - _sizeLabel: (() => { - try { - let e = Number(a?.width) || Number(o.w) || 0, t = Number(a?.height) || Number(o.h) || 0; - if (e > 0 && t > 0) return `${e}x${t}`; - } catch (e) { - console.debug?.(e); - } - return ""; - })() - }, N = { - x: j.x * y, - y: j.y * y, - w: j.w * y, - h: j.h * y - }; - M.w > 1 && M.h > 1 && O.push(M), N.w > 1 && N.h > 1 && D.push(N); - } catch (e) { - console.debug?.(e); - } - if (!D.length && !O.length) return; - let k = D.length ? D : O, A = k[0] || null; - try { - if (n?.overlayMaskEnabled) { - _(b, k, n?.overlayMaskOpacity ?? .65); - for (let e of k) try { - v(b, e, y); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - try { - if (n?.hudEnabled && n?.mode === r?.SINGLE) for (let e of O) { - try { - b.save(), b.strokeStyle = "rgba(255,255,255,0.22)", b.lineWidth = Math.max(1, Math.floor(1 * y)), b.strokeRect(e.x + .5, e.y + .5, e.w - 1, e.h - 1), b.restore(); - } catch { - try { - b.restore(); - } catch (e) { - console.debug?.(e); - } - } - try { - p(b, e, e._sizeLabel || "", y); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - if (n?.mode !== r?.SINGLE || (n?.gridMode || 0) === 0 || !A) return; - try { - b.save(), b.translate(A.x, A.y), b.strokeStyle = "rgba(255, 255, 255, 0.22)", b.lineWidth = Math.max(2, Math.round(1.25 * y)); - let e = (e, t, n, r) => { - try { - b.beginPath(), b.moveTo(Math.round(e) + .5, Math.round(t) + .5), b.lineTo(Math.round(n) + .5, Math.round(r) + .5), b.stroke(); - } catch (e) { - console.debug?.(e); - } - }; - if (n.gridMode === 1) e(A.w / 3, 0, A.w / 3, A.h), e(2 * A.w / 3, 0, 2 * A.w / 3, A.h), e(0, A.h / 3, A.w, A.h / 3), e(0, 2 * A.h / 3, A.w, 2 * A.h / 3); - else if (n.gridMode === 2) e(A.w / 2, 0, A.w / 2, A.h), e(0, A.h / 2, A.w, A.h / 2); - else if (n.gridMode === 3) { - let e = (e, t) => { - try { - b.save(), b.strokeStyle = `rgba(255,255,255,${t})`; - let n = Math.round(A.w * e), r = Math.round(A.h * e), i = Math.round(A.w * (1 - e * 2)), a = Math.round(A.h * (1 - e * 2)); - b.strokeRect(n + .5, r + .5, i, a); - } catch (e) { - console.debug?.(e); - } finally { - try { - b.restore(); - } catch (e) { - console.debug?.(e); - } - } - }; - e(.05, .24), e(.1, .18); - } else if (n.gridMode === 4) { - let t = .382, n = .618; - e(A.w * t, 0, A.w * t, A.h), e(A.w * n, 0, A.w * n, A.h), e(0, A.h * t, A.w, A.h * t), e(0, A.h * n, A.w, A.h * n); - } - } catch (e) { - console.debug?.(e); - } finally { - try { - b.restore(); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - } - }; -} -// ui/features/viewer/probe.ts -function Yn({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getMediaNaturalSize: a, _getViewportRect: o, positionOverlayBox: s, probeTooltip: c, loupeWrap: l, onLoupeRedraw: u, lifecycle: d } = {}) { - let f = d?.unsubs || [], p = document.createElement("canvas"); - p.width = 1, p.height = 1; - let m = null; - try { - m = p.getContext("2d", { willReadFrequently: !0 }); - } catch (e) { - console.debug?.(e); - } - let h = null, g = null, _ = null, v = () => { - try { - c.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - try { - l.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - try { - n._probe = null; - } catch (e) { - console.debug?.(e); - } - }, y = (e) => { - try { - let t = e?.x, n = e?.y, r = e?.r, i = e?.g, a = e?.b, o = e?.a, s = Array.isArray(e?.raw) ? e.raw : null, c = Array.isArray(e?.lin) ? e.lin : null, l = Number(e?.scale), u = (e) => { - let t = Number(e); - return Number.isFinite(t) ? t.toFixed(3) : "?"; - }, d = r != null && i != null && a != null ? `#${[ - r, - i, - a - ].map((e) => Math.max(0, Math.min(255, Number(e) || 0)).toString(16).padStart(2, "0")).join("")}` : "", f = Number.isFinite(l) && l > 0 && l < .999 ? ` (proc ${(l * 100).toFixed(0)}%)` : "", p = []; - return p.push(`X: ${t ?? "?"} Y: ${n ?? "?"}${f}`), p.push(`RGBA8: ${r ?? "?"} ${i ?? "?"} ${a ?? "?"} ${o ?? "?"}`), s && s.length >= 3 && p.push(`RGB: ${u(s[0])} ${u(s[1])} ${u(s[2])}`), c && c.length >= 3 && p.push(`HDR: ${u(c[0])} ${u(c[1])} ${u(c[2])}`), d && p.push(d), p.join("\n"); - } catch { - return ""; - } - }, b = (e, t, n) => { - if (!m) return null; - try { - m.clearRect(0, 0, 1, 1); - } catch (e) { - console.debug?.(e); - } - try { - let r = Number(t) || 0, i = Number(n) || 0; - if (e?.tagName === "CANVAS") { - let t = Number(e._mjrPixelScale) || 1; - r = Math.floor(r * t), i = Math.floor(i * t); - } - m.drawImage(e, r, i, 1, 1, 0, 0, 1, 1); - let a = m.getImageData(0, 0, 1, 1)?.data; - return !a || a.length < 4 ? null : { - r: a[0], - g: a[1], - b: a[2], - a: a[3] - }; - } catch { - return null; - } - }, x = (t, o) => { - try { - if (e?.style?.display === "none" || n?.mode !== r?.SINGLE || !n?.probeEnabled && !n?.loupeEnabled) return v(); - let d = i?.(); - if (!d) return v(); - let f = d.getBoundingClientRect(); - if (!f || !(f.width > 2 && f.height > 2)) return v(); - let p = (Number(t) || 0) - f.left, m = (Number(o) || 0) - f.top; - if (p < 0 || m < 0 || p > f.width || m > f.height) return v(); - let { w: h, h: g } = a?.(d) || { - w: 0, - h: 0 - }; - if (!(h > 0 && g > 0)) return v(); - let _ = p / f.width, x = m / f.height, S = Math.max(0, Math.min(h - 1, Math.floor(_ * h))), C = Math.max(0, Math.min(g - 1, Math.floor(x * g))), w = null; - if (n?.probeEnabled) { - try { - let e = d?._mjrProc; - if (e?.sampleAtOriginal) { - let t = e.sampleAtOriginal(S, C); - t && (w = { - x: S, - y: C, - ...t - }); - } - } catch (e) { - console.debug?.(e); - } - if (!w) { - let e = b(d, S, C); - e && (w = { - x: S, - y: C, - ...e - }); - } - } - w ||= { - x: S, - y: C - }; - try { - n._probe = w; - } catch (e) { - console.debug?.(e); - } - if (n?.probeEnabled) { - try { - c.textContent = y(w), c.style.display = ""; - } catch (e) { - console.debug?.(e); - } - X(() => s?.(c, t, o, { - offsetX: 18, - offsetY: 18 - })); - } else try { - c.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - if (n?.loupeEnabled) X(() => u?.(d, S, C, t, o)); - else try { - l.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, S = (e, t) => { - g = e, _ = t; - try { - if (h != null) return; - h = requestAnimationFrame(() => { - h = null, x(g, _); - }); - } catch (e) { - console.debug?.(e); - } - }; - try { - t && !t._mjrProbeBound && (f.push(Z(t, "mousemove", (e) => { - try { - S(e.clientX, e.clientY); - } catch (e) { - console.debug?.(e); - } - }, { - passive: !0, - capture: !0 - })), f.push(Z(t, "mouseleave", () => { - v(); - }, { - passive: !0, - capture: !0 - })), t._mjrProbeBound = !0); - } catch (e) { - console.debug?.(e); - } - return { - hide: v, - dispose: () => { - try { - h != null && cancelAnimationFrame(h); - } catch (e) { - console.debug?.(e); - } - h = null, v(); - } - }; -} -// ui/features/viewer/loupe.ts -function Xn({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, positionOverlayBox: i } = {}) { - let a = null; - try { - a = t?.getContext?.("2d", { willReadFrequently: !0 }); - } catch (e) { - console.debug?.(e); - } - return { - redraw: (o, s, c, l, u) => { - try { - if (!e?.loupeEnabled || !a || !o) return; - let { w: d, h: f } = r?.(o) || { - w: 0, - h: 0 - }; - if (!(d > 0 && f > 0)) return; - let p = Math.max(48, Math.min(240, Number(e.loupeSize) || 120)), m = Math.max(2, Math.min(20, Number(e.loupeMagnification) || 8)); - try { - t.width !== p && (t.width = p), t.height !== p && (t.height = p); - } catch (e) { - console.debug?.(e); - } - let h = Math.max(3, Math.floor(p / m)), g = o?.tagName === "CANVAS" && Number(o._mjrPixelScale) || 1, _ = o?.tagName === "CANVAS" ? Number(o.width) || 0 : d, v = o?.tagName === "CANVAS" ? Number(o.height) || 0 : f; - if (!(_ > 0 && v > 0)) return; - let y = Math.max(1, Math.floor(h * g)), b = Math.floor(y / 2), x = Math.floor((Number(s) || 0) * g), S = Math.floor((Number(c) || 0) * g), C = Math.max(0, Math.min(_ - y, x - b)), w = Math.max(0, Math.min(v - y, S - b)); - a.imageSmoothingEnabled = !1, a.clearRect(0, 0, p, p), a.drawImage(o, C, w, y, y, 0, 0, p, p), a.strokeStyle = "rgba(255,255,255,0.75)", a.lineWidth = 1, a.beginPath(), a.moveTo(p / 2 + .5, 0), a.lineTo(p / 2 + .5, p), a.moveTo(0, p / 2 + .5), a.lineTo(p, p / 2 + .5), a.stroke(); - try { - n.style.display = "", n.style.width = `${p}px`, n.style.height = `${p}px`; - } catch (e) { - console.debug?.(e); - } - try { - i?.(n, l, u, { - offsetX: 18, - offsetY: -p - 18 - }); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, - hide: () => { - try { - n.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - } - }; -} -// ui/features/viewer/metadata.ts -function Zn({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, getAssetsBatch: i } = {}) { - let a = /* @__PURE__ */ new Map(), o = n?.VIEWER_META_TTL_MS ?? 3e4, s = n?.VIEWER_META_MAX_ENTRIES ?? 500, c = 0, l = null, u = () => { - if (a.size <= s) return; - let e = Date.now(); - try { - for (let [t, n] of a.entries()) n && e - (n.at || 0) > o && a.delete(t); - } catch (e) { - console.debug?.(e); - } - if (!(a.size <= s)) try { - let e = Array.from(a.entries()).sort((e, t) => (e?.[1]?.at || 0) - (t?.[1]?.at || 0)), t = a.size - s; - for (let n = 0; n < t; n++) { - let t = e[n]?.[0]; - t != null && a.delete(t); - } - } catch (e) { - console.debug?.(e); - } - }, d = (e, t) => { - if (e && t && typeof t == "object") { - try { - t.rating !== void 0 && (e.rating = t.rating); - } catch (e) { - console.debug?.(e); - } - try { - t.tags !== void 0 && (e.tags = t.tags); - } catch (e) { - console.debug?.(e); - } - } - }, f = async (e, { signal: t } = {}) => { - let n = Array.isArray(e) ? e : [], r = Date.now(), s = []; - for (let e of n) { - let t = e?.id; - if (t == null) continue; - let n = String(t), i = a.get(n); - i && r - (i.at || 0) < o ? d(e, i.data) : s.push(t); - } - if (s.length) try { - let e = await i?.(s, t ? { signal: t } : {}), o = Array.isArray(e?.data) ? e.data : []; - for (let e of o) { - let t = e?.id; - if (t == null) continue; - let n = String(t); - a.set(n, { - at: r, - data: e - }); - } - u(); - for (let e of n) { - let t = e?.id; - if (t == null) continue; - let n = a.get(String(t)); - n && n.data && d(e, n.data); - } - } catch (e) { - console.debug?.(e); - } - }; - return { - hydrateVisibleMetadata: async () => { - let n = e?.assets?.[e?.currentIndex], r = e?.compareAsset, i = e?.mode; - ++c; - try { - l?.abort?.(); - } catch (e) { - console.debug?.(e); - } - l = new AbortController(); - let a = l.signal; - try { - if (i === t?.SINGLE) { - n && await f([n], { signal: a }); - return; - } - let o = (Array.isArray(e?.assets) ? e.assets.slice(0, 4) : []).slice(); - r && o.push(r), await f(o, { signal: a }); - } catch (e) { - console.debug?.(e); - } - }, - hydrateAssetMetadata: async (e, { signal: t } = {}) => { - let n = e?.id; - if (n == null) return; - let i = String(n), s = Date.now(), c = a.get(i); - if (c && s - (c.at || 0) < o) d(e, c.data); - else try { - let o = await r?.(n, t ? { signal: t } : {}); - o?.ok && o.data && (a.set(i, { - at: s, - data: o.data - }), u(), d(e, o.data)); - } catch (e) { - console.debug?.(e); - } - }, - hydrateAssetsMetadataBatch: f, - getCached: (e) => { - try { - return a.get(String(e)); - } catch { - return null; - } - }, - setCached: (e, t) => { - try { - a.set(String(e), { - at: Date.now(), - data: t - }), u(); - } catch (e) { - console.debug?.(e); - } - }, - deleteCached: (e) => { - try { - a.delete(String(e)); - } catch (e) { - console.debug?.(e); - } - }, - abort: () => { - X(() => l?.abort?.()), l = null; - }, - dispose: () => { - X(() => l?.abort?.()), l = null, X(() => a.clear()); - }, - cleanupCache: () => { - X(u); - }, - _noop: kt - }; -} -// ui/features/viewer/constants.ts -var Qn = Object.freeze({ - MIN: .1, - MAX: 16 -}); -// ui/features/viewer/panzoom.ts -function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, state: a, VIEWER_MODES: o, scheduleOverlayRedraw: s, lifecycle: c } = {}) { - let l = c?.safeCall || X, u = c?.safeAddListener || Z, d = c?.unsubs || [], f = () => { - try { - return a?.mode === o?.SINGLE && n?.querySelector?.(".mjr-viewer-media") || null; - } catch { - return null; - } - }, p = (e) => { - try { - if (!e) return { - w: 0, - h: 0 - }; - let t = Number(e?._mjrNaturalW) || 0, n = Number(e?._mjrNaturalH) || 0; - if (t > 0 && n > 0) return { - w: t, - h: n - }; - if (e.tagName === "IMG") return { - w: Number(e.naturalWidth) || 0, - h: Number(e.naturalHeight) || 0 - }; - if (e.tagName === "VIDEO") return { - w: Number(e.videoWidth) || 0, - h: Number(e.videoHeight) || 0 - }; - if (e.tagName === "CANVAS") return { - w: Number(e._mjrNaturalW) || Number(e.width) || 0, - h: Number(e._mjrNaturalH) || Number(e.height) || 0 - }; - } catch (e) { - console.debug?.(e); - } - return { - w: 0, - h: 0 - }; - }, m = () => { - try { - let e = t?.getBoundingClientRect?.(); - return e && e.width > 0 && e.height > 0 ? e : null; - } catch { - return null; - } - }, h = () => { - try { - let e = n; - a?.mode === o?.AB_COMPARE ? e = r : a?.mode === o?.SIDE_BY_SIDE && (e = i); - let t = e?.querySelector?.(".mjr-viewer-media"); - if (!t) return; - let { w: s, h: c } = p(t); - s > 0 && c > 0 && (a._mediaW = s, a._mediaH = c); - } catch (e) { - console.debug?.(e); - } - }, g = (e, { clampPanToBounds: t, applyTransform: n } = {}) => { - if (!e || e._mjrMediaSizeBound) return; - e._mjrMediaSizeBound = !0; - let r = () => { - h(); - try { - t?.(); - } catch (e) { - console.debug?.(e); - } - try { - n?.(); - } catch (e) { - console.debug?.(e); - } - }; - try { - e.tagName === "IMG" ? e.addEventListener("load", () => requestAnimationFrame(r), { once: !0 }) : e.tagName === "VIDEO" && e.addEventListener("loadedmetadata", () => requestAnimationFrame(r), { once: !0 }); - } catch (e) { - console.debug?.(e); - } - }, _ = () => { - try { - if (!e || e.style.display === "none") return; - let s = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(a?.zoom) || 1)), c = a?.assets?.[a?.currentIndex], l = Number(c?.width) || 0, u = Number(c?.height) || 0; - if (l > 0 && u > 0 || (h(), l = Number(a?._mediaW) || 0, u = Number(a?._mediaH) || 0), !(l > 0 && u > 0)) return; - let d = l / u; - if (!Number.isFinite(d) || d <= 0) return; - let { w: f, h: p } = (() => { - let s = Date.now(); - try { - let e = a?._viewportCache; - if (e && e.mode === a?.mode && s - (e.at || 0) < 250) { - let t = Number(e.w) || 0, n = Number(e.h) || 0; - if (t > 0 && n > 0) return { - w: t, - h: n - }; - } - } catch (e) { - console.debug?.(e); - } - let c = Math.max(Number(t?.clientWidth) || 0, Number(e?.clientWidth) || 0), l = Math.max(Number(t?.clientHeight) || 0, Number(e?.clientHeight) || 0), u = (e, t) => ({ - w: Math.max(Number(e) || 0, c), - h: Math.max(Number(t) || 0, l) - }), d = null; - if (a?.mode === o?.SINGLE) d = u(n?.clientWidth, n?.clientHeight); - else if (a?.mode === o?.AB_COMPARE) d = u(r?.clientWidth, r?.clientHeight); - else { - let e = Array.from(i?.children || []).filter((e) => e && e.nodeType === 1); - if (e.length) { - let t = Infinity, n = Infinity; - for (let r of e) { - let e = Number(r.clientWidth) || 0, i = Number(r.clientHeight) || 0; - e > 0 && (t = Math.min(t, e)), i > 0 && (n = Math.min(n, i)); - } - Number.isFinite(t) && Number.isFinite(n) && (d = u(t, n)); - } - d ||= u(i?.clientWidth, i?.clientHeight); - } - try { - a._viewportCache = { - mode: a?.mode, - w: d.w, - h: d.h, - at: s - }; - } catch (e) { - console.debug?.(e); - } - return d; - })(); - if (!(f > 0 && p > 0)) { - e?.style?.display !== "none" && requestAnimationFrame(_); - return; - } - let m = f / p, g = 0, v = 0; - d > m ? (g = f, v = f / d) : (v = p, g = p * d); - let y = g * s, b = v * s, x = y > f + 1 || b > p + 1; - if (!(s > 1.001) && !x) { - a.panX = 0, a.panY = 0; - return; - } - let S = Math.max(0, y - f), C = Math.max(0, b - p), w = S / 2 * s, T = C / 2 * s; - a.panX = Math.max(-w, Math.min(w, Number(a?.panX) || 0)), a.panY = Math.max(-T, Math.min(T, Number(a?.panY) || 0)); - } catch (e) { - console.debug?.(e); - } - }, v = () => { - let e = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(a?.zoom) || 1)), t = Number(a?.panX) || 0, n = Number(a?.panY) || 0; - return `translate3d(${t / e}px, ${n / e}px, 0) scale(${e})`; - }, y = () => { - try { - if (!t) return; - if (!e || e.style.display === "none") { - t.style.cursor = ""; - return; - } - let n = Number(a?.zoom) || 1, r = f(), { w: i, h: o } = p(r) || { - w: 0, - h: 0 - }, s = m(), c = s && i > 0 && o > 0 ? E(i, o, s.width, s.height, n) : !1; - if (!(n > 1.01 || c)) { - t.style.cursor = ""; - return; - } - t.style.cursor = "grab"; - } catch (e) { - console.debug?.(e); - } - }, b = ({ skipFit: t = !1 } = {}) => { - try { - _(); - let n = v(), r = C(), i = e?.querySelectorAll?.(".mjr-viewer-media") || []; - for (let e of i) try { - if (e?._mjrDisableViewerTransform) continue; - if (!t) { - let t = w(e, r)?.getBoundingClientRect?.() || null; - if (t) { - let n = Number(t.width) || 0, r = Number(t.height) || 0; - if (n > 1 && r > 1) { - let { w: t, h: i } = p(e) || { - w: 0, - h: 0 - }; - if (t > 0 && i > 0) { - let a = S(t, i, n, r); - a.w > 1 && a.h > 1 && (e.style.width = `${Math.round(a.w)}px`, e.style.height = `${Math.round(a.h)}px`); - } - } - } - } - e.style.transform = n; - } catch (e) { - console.debug?.(e); - } - try { - s?.(); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, x = (e, { clientX: n = null, clientY: r = null } = {}) => { - try { - let i = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(a?.zoom) || 1)), o = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(e) || i)); - try { - a._userInteracted = !0; - } catch (e) { - console.debug?.(e); - } - let s = Number(a?.panX) || 0, c = Number(a?.panY) || 0; - if (n != null && r != null && Number.isFinite(Number(n)) && Number.isFinite(Number(r))) try { - let e = t?.getBoundingClientRect?.(); - if (e && e.width > 0 && e.height > 0) { - let t = e.left + e.width / 2, l = e.top + e.height / 2, u = (Number(n) || 0) - t, d = (Number(r) || 0) - l, f = o / i; - s = Math.round(((Number(a?.panX) || 0) * f + (1 - f) * u) * 10) / 10, c = Math.round(((Number(a?.panY) || 0) * f + (1 - f) * d) * 10) / 10; - } - } catch (e) { - console.debug?.(e); - } - else if (o !== i) { - let e = o / i; - s = Math.round((Number(a?.panX) || 0) * e * 10) / 10, c = Math.round((Number(a?.panY) || 0) * e * 10) / 10; - } - a.zoom = o, a.panX = s, a.panY = c, Math.abs(a.zoom - 1) < .001 && (a.zoom = 1, a.panX = 0, a.panY = 0), a.targetZoom = a.zoom, b({ skipFit: !0 }), y(); - } catch (e) { - console.debug?.(e); - } - }, S = (e, t, n, r) => { - try { - let i = Number(e) || 0, a = Number(t) || 0, o = Number(n) || 0, s = Number(r) || 0; - if (!(i > 0 && a > 0 && o > 0 && s > 0)) return { - w: 0, - h: 0 - }; - let c = i / a; - return !Number.isFinite(c) || c <= 0 ? { - w: 0, - h: 0 - } : { - w: s * c, - h: s - }; - } catch { - return { - w: 0, - h: 0 - }; - } - }, C = () => { - try { - let e = a?.mode; - return e === o?.AB_COMPARE ? r || t || null : e === o?.SIDE_BY_SIDE ? i || t || null : n || t || null; - } catch { - return t || null; - } - }, w = (e, n) => { - try { - if (!e) return n || null; - let r = a?.mode; - if (r === o?.SIDE_BY_SIDE || r === o?.AB_COMPARE) { - let t = e; - for (; t && t !== n && t.parentElement;) { - if (t.parentElement === n) return t; - t = t.parentElement; - } - return n || null; - } - return n || t || null; - } catch { - return n || t || null; - } - }, E = (e, t, n, r, i) => { - try { - let a = S(e, t, n, r); - if (!(a.w > 0 && a.h > 0)) return !1; - let o = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(i) || 1)), s = a.w * o, c = a.h * o; - return s > (Number(n) || 0) + 1 || c > (Number(r) || 0) + 1; - } catch { - return !1; - } - }, D = () => { - try { - let e = f(); - if (!e) return null; - let { w: t, h: n } = p(e); - if (!(t > 0 && n > 0)) return null; - let r = m(); - if (!r) return null; - let i = S(t, n, r.width, r.height); - if (!(i.w > 0 && i.h > 0)) return null; - let a = t / i.w; - return !Number.isFinite(a) || a <= 0 ? null : Math.max(Qn.MIN, Math.min(Qn.MAX, a)); - } catch { - return null; - } - }, O = { - active: !1, - pointerId: null, - startX: 0, - startY: 0, - startPanX: 0, - startPanY: 0, - raf: 0 - }, k = () => { - O.raf ||= requestAnimationFrame(() => { - O.raf = 0, b({ skipFit: !0 }), y(); - }); - }, A = (n) => { - if (!e || e.style.display === "none" || ne(n?.target)) return; - let r = Number(a?.zoom) || 1, i = (() => { - try { - return !!T?.VIEWER_ALLOW_PAN_AT_ZOOM_1; - } catch { - return !1; - } - })(); - if (!(() => { - try { - if (i) return !0; - let e = f(), { w: t, h: n } = p(e) || { - w: 0, - h: 0 - }, a = m(); - return !a || !(t > 0 && n > 0) ? r > 1.01 : r > 1.01 || E(t, n, a.width, a.height, r); - } catch { - return r > 1.01; - } - })()) { - try { - a._panHintAt = Date.now(), a._panHintX = n?.clientX ?? null, a._panHintY = n?.clientY ?? null; - } catch (e) { - console.debug?.(e); - } - try { - a._panHintTimer && clearTimeout(a._panHintTimer); - } catch (e) { - console.debug?.(e); - } - try { - a._panHintTimer = setTimeout(() => { - try { - a._panHintAt = 0; - } catch (e) { - console.debug?.(e); - } - l(s); - }, 950); - } catch (e) { - console.debug?.(e); - } - l(s); - return; - } - let o = n.button === 0, c = n.button === 1; - if (o || c) { - try { - let e = n.target; - if (e && (e.tagName === "INPUT" || e.tagName === "TEXTAREA" || e.tagName === "SELECT" || e.isContentEditable)) return; - } catch (e) { - console.debug?.(e); - } - try { - if (n?.target?.closest?.(".mjr-video-controls") || n?.target?.closest?.(".mjr-context-menu") || n?.target?.closest?.(".mjr-ab-slider") || ne(n?.target)) return; - } catch (e) { - console.debug?.(e); - } - try { - if (!t?.contains?.(n.target)) return; - } catch { - return; - } - O.active = !0; - try { - a._userInteracted = !0; - } catch (e) { - console.debug?.(e); - } - O.pointerId = n.pointerId; - try { - a._lastPointerX = n.clientX, a._lastPointerY = n.clientY; - } catch (e) { - console.debug?.(e); - } - O.startX = n.clientX, O.startY = n.clientY, O.startPanX = Number(a?.panX) || 0, O.startPanY = Number(a?.panY) || 0; - try { - n.preventDefault(), n.stopPropagation(), n.stopImmediatePropagation?.(); - } catch (e) { - console.debug?.(e); - } - try { - t?.setPointerCapture?.(n.pointerId); - } catch (e) { - console.debug?.(e); - } - try { - t && (t.style.cursor = "grabbing"); - } catch (e) { - console.debug?.(e); - } - } - }, j = (e) => { - if (!O.active) return; - try { - if (e?.target?.closest?.(".mjr-video-controls")) return; - } catch (e) { - console.debug?.(e); - } - try { - e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.(); - } catch (e) { - console.debug?.(e); - } - let t = (Number(e.clientX) || 0) - O.startX, n = (Number(e.clientY) || 0) - O.startY, r = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(a?.zoom) || 1)), i = Math.max(1, r); - a.panX = O.startPanX + t * i, a.panY = O.startPanY + n * i; - try { - a._lastPointerX = e.clientX, a._lastPointerY = e.clientY; - } catch (e) { - console.debug?.(e); - } - k(); - }, M = (e) => { - if (O.active) { - O.active = !1, O.pointerId = null; - try { - O.raf && cancelAnimationFrame(O.raf); - } catch (e) { - console.debug?.(e); - } - O.raf = 0, b({ skipFit: !1 }); - try { - t?.releasePointerCapture?.(e.pointerId); - } catch (e) { - console.debug?.(e); - } - y(); - } - }, N = (n) => { - if (e && e.style.display !== "none") { - try { - if (!t?.contains?.(n.target)) return; - } catch (e) { - console.debug?.(e); - } - try { - if (ne(n?.target)) return; - } catch (e) { - console.debug?.(e); - } - try { - n.preventDefault(), n.stopPropagation(), n.stopImmediatePropagation?.(); - } catch (e) { - console.debug?.(e); - } - Math.abs((Number(a?.targetZoom) || 1) - 1) < .01 ? x(Math.min(8, (Number(a?.targetZoom) || 1) * 4), { - clientX: n.clientX, - clientY: n.clientY - }) : x(1, { - clientX: n.clientX, - clientY: n.clientY - }); - } - }; - try { - t && !t._mjrPanBound && (d.push(u(t, "pointerdown", A, { - passive: !1, - capture: !0 - })), d.push(u(t, "pointermove", j, { - passive: !1, - capture: !0 - })), d.push(u(t, "pointerup", M, { - passive: !0, - capture: !0 - })), d.push(u(t, "pointercancel", M, { - passive: !0, - capture: !0 - })), t._mjrPanBound = !0); - } catch (e) { - console.debug?.(e); - } - try { - t && !t._mjrDblClickResetBound && (d.push(u(t, "dblclick", N, { - passive: !1, - capture: !0 - })), t._mjrDblClickResetBound = !0); - } catch (e) { - console.debug?.(e); - } - return { - getPrimaryMedia: f, - getMediaNaturalSize: p, - getViewportRect: m, - updateMediaNaturalSize: h, - attachMediaLoadHandlers: g, - clampPanToBounds: _, - mediaTransform: v, - applyTransform: b, - setZoom: x, - computeOneToOneZoom: D, - updatePanCursor: y, - dispose: () => { - l(() => { - O.active = !1, O.pointerId = null, O.raf && cancelAnimationFrame(O.raf), O.raf = 0; - }); - } - }; -} -// ui/features/viewer/videoProcessorWebGL.ts -var er = "\nattribute vec2 a_position;\nvarying vec2 v_uv;\nvoid main() {\n // Quad covers -1..1\n gl_Position = vec4(a_position, 0, 1);\n // Map -1..1 to 0..1\n v_uv = a_position * 0.5 + 0.5;\n // In WebGL, textures are usually flipped relative to Image/Video elements if not handled.\n // We'll flip Y in fragment shader or here.\n v_uv.y = 1.0 - v_uv.y;\n}\n", tr = "\nprecision mediump float;\nvarying vec2 v_uv;\nuniform sampler2D u_image;\nuniform float u_exposure_scale;\nuniform float u_gamma_inv;\nuniform int u_channel; // 0=RGB, 1=R, 2=G, 3=B\nuniform int u_analysis; // 0=None, 1=Zebra\nuniform float u_zebra_threshold;\nuniform vec2 u_resolution;\n\nfloat getLuma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }\n\nvoid main() {\n vec4 texColor = texture2D(u_image, v_uv);\n vec3 color = texColor.rgb;\n\n // Exposure\n color *= u_exposure_scale;\n\n // Analysis (Zebra) or Gamma\n bool isZebra = false;\n if (u_analysis == 1) {\n float luma = getLuma(color);\n if (luma >= u_zebra_threshold) {\n isZebra = true;\n // Stripe pattern: (x + y) % 16 < 8\n // gl_FragCoord is in window pixels\n float stripe = mod(gl_FragCoord.x + gl_FragCoord.y, 32.0);\n if (stripe < 16.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); // Black\n } else {\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); // White\n }\n }\n }\n\n if (!isZebra) {\n // Gamma\n // fast pow?\n color = pow(clamp(color, 0.0, 1.0), vec3(u_gamma_inv));\n\n // Channel Selector\n if (u_channel == 1) color = vec3(color.r);\n else if (u_channel == 2) color = vec3(color.g);\n else if (u_channel == 3) color = vec3(color.b);\n\n gl_FragColor = vec4(color, texColor.a);\n }\n}\n"; -function nr(e, t, n) { - let r = e.createShader(t); - return e.shaderSource(r, n), e.compileShader(r), e.getShaderParameter(r, e.COMPILE_STATUS) ? r : (console.warn("WebGL Shader Error:", e.getShaderInfoLog(r)), e.deleteShader(r), null); -} -function rr(e, t, n) { - let r = e.createProgram(); - if (e.attachShader(r, t), e.attachShader(r, n), e.linkProgram(r), !e.getProgramParameter(r, e.LINK_STATUS)) { - console.warn("WebGL Program Error:", e.getProgramInfoLog(r)); - try { - e.deleteProgram(r); - } catch (e) { - console.debug?.(e); - } - return null; - } - return r; -} -function ir() { - try { - let e = document.createElement("canvas"); - return !!(window.WebGLRenderingContext && (e.getContext("webgl") || e.getContext("experimental-webgl"))); - } catch { - return !1; - } -} -function ar(e) { - let { canvas: t, videoEl: n, getGradeParams: r } = e, i = null, a = null, o = 4096, s = !1, c = { - type: "webgl", - ready: !1, - naturalW: 0, - naturalH: 0, - scale: 1, - _destroyed: !1 - }; - function l() { - let e = null; - try { - e = t.getContext("webgl", { - alpha: !1, - preserveDrawingBuffer: !0 - }); - } catch (e) { - console.debug?.(e); - } - if (!e) try { - e = t.getContext("experimental-webgl", { - alpha: !1, - preserveDrawingBuffer: !0 - }); - } catch (e) { - console.debug?.(e); - } - return e && (o = e.getParameter(e.MAX_TEXTURE_SIZE) || 4096), e; - } - if (i = l(), !i) return null; - let u = (e = "") => { - if (!i) return; - let t = i.getError(); - t !== i.NO_ERROR && console.error(`WebGL Error [${e}]: ${t}`); - }, d = () => { - if (!i || !a) return; - let { positionBuffer: e, texture: t, program: n } = a; - try { - i.bindTexture(i.TEXTURE_2D, null); - } catch (e) { - console.debug?.(e); - } - try { - i.bindBuffer(i.ARRAY_BUFFER, null); - } catch (e) { - console.debug?.(e); - } - try { - i.useProgram(null); - } catch (e) { - console.debug?.(e); - } - try { - i.deleteTexture(t); - } catch (e) { - console.debug?.(e); - } - try { - i.deleteBuffer(e); - } catch (e) { - console.debug?.(e); - } - try { - i.deleteProgram(n); - } catch (e) { - console.debug?.(e); - } - a = null; - }, f = () => { - if (!i) return null; - d(); - let e = nr(i, i.VERTEX_SHADER, er), t = nr(i, i.FRAGMENT_SHADER, tr); - if (!e || !t) return e && i.deleteShader(e), t && i.deleteShader(t), null; - let n = rr(i, e, t); - if (i.deleteShader(e), i.deleteShader(t), !n) return null; - u("setupResources:createProgram"); - let r = { - position: i.getAttribLocation(n, "a_position"), - u_image: i.getUniformLocation(n, "u_image"), - u_exposure: i.getUniformLocation(n, "u_exposure_scale"), - u_gamma: i.getUniformLocation(n, "u_gamma_inv"), - u_channel: i.getUniformLocation(n, "u_channel"), - u_analysis: i.getUniformLocation(n, "u_analysis"), - u_thresh: i.getUniformLocation(n, "u_zebra_threshold"), - u_res: i.getUniformLocation(n, "u_resolution") - }, a = i.createBuffer(); - i.bindBuffer(i.ARRAY_BUFFER, a), i.bufferData(i.ARRAY_BUFFER, new Float32Array([ - -1, - -1, - 1, - -1, - -1, - 1, - -1, - 1, - 1, - -1, - 1, - 1 - ]), i.STATIC_DRAW), u("setupResources:bufferData"); - let o = i.createTexture(); - return i.bindTexture(i.TEXTURE_2D, o), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_S, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_T, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MIN_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MAG_FILTER, i.LINEAR), u("setupResources:texSetup"), { - program: n, - loc: r, - positionBuffer: a, - texture: o - }; - }, p = () => s || c._destroyed || (i ||= l(), !i) ? !1 : (a ||= f(), !!a), m = () => { - if (!s && i && n?.videoWidth) { - let e = n.videoWidth, r = n.videoHeight, a = o || i.getParameter(i.MAX_TEXTURE_SIZE) || 4096; - if (e > a || r > a) { - let t = Math.min(a / e, a / r); - e = Math.floor(e * t), r = Math.floor(r * t); - } - return (t.width !== e || t.height !== r) && (t.width = e, t.height = r, i.viewport(0, 0, e, r)), !0; - } - return !1; - }, h = (e) => { - if (!s && p() && m()) { - let { program: o, loc: s, positionBuffer: c, texture: l } = a; - i.useProgram(o), i.activeTexture(i.TEXTURE0), i.bindTexture(i.TEXTURE_2D, l); - try { - i.texImage2D(i.TEXTURE_2D, 0, i.RGBA, i.RGBA, i.UNSIGNED_BYTE, n); - } catch (e) { - console.warn("WebGL texImage2D failed", e), u("texImage2D"); - return; - } - u("texImage2D"), i.uniform1i(s.u_image, 0); - let d = e || (r ? r() : {}), f = Number(d.exposureEV) || 0, p = Math.max(.1, Math.min(3, Number(d.gamma) || 1)), m = +(d.analysisMode === "zebra"), h = 0; - d.channel === "r" && (h = 1), d.channel === "g" && (h = 2), d.channel === "b" && (h = 3), i.uniform1f(s.u_exposure, 2 ** f), i.uniform1f(s.u_gamma, 1 / p), i.uniform1i(s.u_channel, h), i.uniform1i(s.u_analysis, m), i.uniform1f(s.u_thresh, d.zebraThreshold ?? .95), i.uniform2f(s.u_res, t.width, t.height), i.enableVertexAttribArray(s.position), i.bindBuffer(i.ARRAY_BUFFER, c), i.vertexAttribPointer(s.position, 2, i.FLOAT, !1, 0, 0), i.drawArrays(i.TRIANGLES, 0, 6), u("drawArrays"); - } - }, g = (e) => { - e.preventDefault(), s = !0, d(); - }, _ = () => { - i = l(), s = !1, a = null, p(); - }; - return t.addEventListener("webglcontextlost", g), t.addEventListener("webglcontextrestored", _), { - update: h, - destroy: () => { - if (c._destroyed = !0, c.ready = !1, d(), i) try { - i.getExtension("WEBGL_lose_context")?.loseContext?.(); - } catch (e) { - console.debug?.(e); - } - t.removeEventListener("webglcontextlost", g), t.removeEventListener("webglcontextrestored", _); - } - }; -} -// ui/features/viewer/videoProcessor.ts -function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = null, getGradeParams: i, isDefaultGrade: a, _tonemap: o, maxProcPixelsVideo: s, throttleFps: c, safeAddListener: l, safeCall: u, onReady: d } = {}) { - let f = r == null ? !!T?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null; - if (!n && ir()) try { - p = ar({ - canvas: e, - videoEl: t, - getGradeParams: i, - isDefaultGrade: a, - maxProcPixelsVideo: s - }); - } catch (e) { - console.warn("WebGL Init failed, falling back to 2D", e), p = null; - } - let m = p ? null : (() => { - try { - return e.getContext("2d", { - willReadFrequently: !0, - alpha: !0 - }); - } catch { - return null; - } - })(), h = document.createElement("canvas"), g = (() => { - try { - return h.getContext("2d", { - willReadFrequently: !0, - alpha: !1 - }); - } catch { - return null; - } - })(), _ = document.createElement("canvas"); - _.width = 1, _.height = 1; - let v = (() => { - try { - return _.getContext("2d", { - willReadFrequently: !0, - alpha: !1 - }); - } catch { - return null; - } - })(), y = { - ready: !1, - _rendering: !1, - _destroyed: !1, - _rvfc: null, - _rafIdLoop: null, - _rafIdSchedule: null, - _seekRaf: null, - _lastHeavyRenderAt: 0, - _throttleTimer: null, - _connectRAF: null, - _connectTries: 0, - _buffer: null, - _lut: null, - _lutKey: "", - _lastFrameTime: -1, - _lastHeavySig: "", - _runtimePaused: !1 - }, b = [], x = (e, t) => re(s, e, t), S = () => { - try { - let n = Number(t?.videoWidth) || 0, r = Number(t?.videoHeight) || 0; - if (!(n > 0 && r > 0)) return !1; - y.naturalW = n, y.naturalH = r, y.scale = x(n, r); - let i = Math.max(1, Math.round(n * y.scale)), a = Math.max(1, Math.round(r * y.scale)); - return h.width !== i && (h.width = i), h.height !== a && (h.height = a), p || (e.width !== i && (e.width = i), e.height !== a && (e.height = a)), e._mjrNaturalW = n, e._mjrNaturalH = r, e._mjrPixelScale = y.scale, y.ready = !0, !0; - } catch { - return !1; - } - }, C = () => { - if (!g || !y.ready) return !1; - try { - return g.drawImage(t, 0, 0, h.width, h.height), !0; - } catch { - return !1; - } - }, w = () => { - if (!y.ready) return; - let n = y.lastParams || i?.() || {}; - if (p) { - p.update(n); - return; - } - if (!m || !g) return; - if (a?.(n)) { - try { - m.clearRect(0, 0, e.width, e.height), m.drawImage(t, 0, 0, e.width, e.height); - } catch (e) { - console.debug?.(e); - } - return; - } - if (!C()) return; - let r; - try { - r = g.getImageData(0, 0, h.width, h.height); - } catch { - try { - m.clearRect(0, 0, e.width, e.height), m.drawImage(t, 0, 0, e.width, e.height); - } catch (e) { - console.debug?.(e); - } - return; - } - let o = h.width, s = h.height, c = y._buffer; - if (!c || c.width !== o || c.height !== s) try { - c = m.createImageData(o, s), y._buffer = c; - } catch { - try { - c = new ImageData(o, s), y._buffer = c; - } catch { - return; - } - } - if (!c) return; - let l = Number(n.exposureEV) || 0, u = 1 / Math.max(.1, Math.min(3, Number(n.gamma) || 1)), d = String(n.channel || "rgb"), f = String(n.analysisMode || "none"), _ = P(n.zebraThreshold ?? .95), v = 2 ** l, b = r.data, x = c.data, S = f !== "zebra" && d === "rgb", w = null; - if (S) { - let e = `${v.toFixed(6)}|${u.toFixed(6)}`; - if (!y._lut || y._lutKey !== e) { - let t = /* @__PURE__ */ new Uint8ClampedArray(256); - for (let e = 0; e < 256; e += 1) { - let n = e / 255; - t[e] = Math.round(P(n * v) ** +u * 255); - } - y._lut = t, y._lutKey = e; - } - w = y._lut; - } - if (w) for (let e = 0; e < x.length; e += 4) x[e] = w[b[e] ?? 0], x[e + 1] = w[b[e + 1] ?? 0], x[e + 2] = w[b[e + 2] ?? 0], x[e + 3] = 255; - else for (let e = 0; e < x.length; e += 4) { - let t = (b[e] ?? 0) / 255, n = (b[e + 1] ?? 0) / 255, r = (b[e + 2] ?? 0) / 255, i = (b[e + 3] ?? 255) / 255, a = t * v, s = n * v, c = r * v, l = .2126 * a + .7152 * s + .0722 * c; - if (f === "zebra") { - if (P(l) >= _) { - let t = (Math.floor(e / 4) % o + Math.floor(e / 4 / o) & 7) < 3; - a = +!!t, s = +!!t, c = +!!t; - } else a = P(a) ** +u, s = P(s) ** +u, c = P(c) ** +u; - } else a = P(a) ** +u, s = P(s) ** +u, c = P(c) ** +u; - if (d === "r") s = a, c = a; - else if (d === "g") a = s, c = s; - else if (d === "b") a = c, s = c; - else if (d === "a") a = i, s = i, c = i; - else if (d === "l") { - let e = P(l) ** +u; - a = e, s = e, c = e; - } - x[e] = Math.round(P(a) * 255), x[e + 1] = Math.round(P(s) * 255), x[e + 2] = Math.round(P(c) * 255), x[e + 3] = 255; - } - try { - m.putImageData(c, 0, 0); - } catch (e) { - console.debug?.(e); - } - }, E = () => { - if (!y._destroyed && e?.isConnected && (y.ready || S(), y.ready)) { - try { - let e = y.lastParams || i?.() || {}; - if (!a?.(e)) { - let n = Number(t?.currentTime) || 0, r = `${Number(e.exposureEV) || 0}|${Number(e.gamma) || 1}|${String(e.channel || "rgb")}|${String(e.analysisMode || "none")}|${Number(e.zebraThreshold ?? .95)}`; - if (Math.abs(n - (Number(y._lastFrameTime) || 0)) < 1e-6 && r === String(y._lastHeavySig || "")) return; - y._lastFrameTime = n, y._lastHeavySig = r; - } - } catch (e) { - console.debug?.(e); - } - w(); - } - }, O = () => { - if (!y._destroyed) { - try { - if (e?.isConnected) { - y._connectRAF = null, y._connectTries = 0, A(); - return; - } - } catch (e) { - console.debug?.(e); - } - if (y._connectRAF == null) { - if (y._connectTries = (Number(y._connectTries) || 0) + 1, y._connectTries > 20) y._connectRAF = null, y._connectTries = 0; - else try { - y._connectRAF = requestAnimationFrame(() => { - y._connectRAF = null, O(); - }); - } catch { - y._connectRAF = null; - } - } - } - }, k = () => { - try { - let e = Number(c); - return !Number.isFinite(e) || e <= 0 ? 0 : Math.max(0, Math.floor(1e3 / Math.max(1, e))); - } catch { - return 0; - } - }, A = () => { - if (y._destroyed || y._runtimePaused || y._rendering) return; - if (!e?.isConnected) { - O(); - return; - } - let n = y.lastParams || i?.() || {}, r = !a?.(n), o = r && !t?.paused ? k() : 0; - if (o > 0) { - let e = Date.now(), t = (Number(y._lastHeavyRenderAt) || 0) + o; - if (e < t) { - try { - y._throttleTimer && clearTimeout(y._throttleTimer); - } catch (e) { - console.debug?.(e); - } - try { - y._throttleTimer = setTimeout(() => { - try { - y._throttleTimer = null; - } catch (e) { - console.debug?.(e); - } - A(); - }, Math.min(250, Math.max(0, t - e))); - } catch (e) { - console.debug?.(e); - } - return; - } - } - y._rendering = !0; - try { - y._rafIdSchedule = requestAnimationFrame(() => { - y._rafIdSchedule = null, y._rendering = !1, E(); - try { - r && (y._lastHeavyRenderAt = Date.now()); - } catch (e) { - console.debug?.(e); - } - }); - } catch { - y._rendering = !1; - } - }, j = () => { - if (y._destroyed || y._runtimePaused) return; - try { - y._rvfc != null && typeof t?.cancelVideoFrameCallback == "function" && (t.cancelVideoFrameCallback(y._rvfc), y._rvfc = null); - } catch (e) { - console.debug?.(e); - } - try { - y._rafIdLoop != null && (cancelAnimationFrame(y._rafIdLoop), y._rafIdLoop = null); - } catch (e) { - console.debug?.(e); - } - try { - if (typeof t?.requestVideoFrameCallback == "function") { - let n = () => { - if (!y._destroyed && e?.isConnected && (A(), !t.paused)) try { - y._rvfc = t.requestVideoFrameCallback(n); - } catch (e) { - console.debug?.(e); - } - }; - try { - y._rvfc = t.requestVideoFrameCallback(n); - } catch (e) { - console.debug?.(e); - } - return; - } - } catch (e) { - console.debug?.(e); - } - let n = () => { - if (!y._destroyed && e?.isConnected && (A(), !t.paused)) try { - y._rafIdLoop = requestAnimationFrame(n); - } catch (e) { - console.debug?.(e); - } - }; - try { - y._rafIdLoop = requestAnimationFrame(n); - } catch (e) { - console.debug?.(e); - } - }, M = (e) => { - y.lastParams = e || y.lastParams || i?.(), A(); - }, N = () => { - y._runtimePaused = !0; - try { - y._throttleTimer && clearTimeout(y._throttleTimer); - } catch (e) { - console.debug?.(e); - } - y._throttleTimer = null; - try { - y._rvfc != null && typeof t?.cancelVideoFrameCallback == "function" && t.cancelVideoFrameCallback(y._rvfc); - } catch (e) { - console.debug?.(e); - } - y._rvfc = null; - try { - y._rafIdLoop != null && cancelAnimationFrame(y._rafIdLoop); - } catch (e) { - console.debug?.(e); - } - y._rafIdLoop = null; - try { - y._rafIdSchedule != null && cancelAnimationFrame(y._rafIdSchedule); - } catch (e) { - console.debug?.(e); - } - y._rafIdSchedule = null; - try { - y._seekRaf != null && cancelAnimationFrame(y._seekRaf); - } catch (e) { - console.debug?.(e); - } - y._seekRaf = null, y._rendering = !1; - }, ee = () => { - y._runtimePaused = !1, t?.paused || j(), A(); - }, te = (e, t) => { - try { - if (y.ready || S(), !y.ready) return null; - C(); - let n = y.scale || 1, r = Math.max(0, Math.min(h.width - 1, Math.floor((Number(e) || 0) * n))), i = Math.max(0, Math.min(h.height - 1, Math.floor((Number(t) || 0) * n))); - if (!v) return null; - v.clearRect(0, 0, 1, 1), v.drawImage(h, r, i, 1, 1, 0, 0, 1, 1); - let a = v.getImageData(0, 0, 1, 1)?.data; - if (!a || a.length < 4) return null; - let o = a[0] ?? 0, s = a[1] ?? 0, c = a[2] ?? 0, l = a[3] ?? 255, u = [ - o / 255, - s / 255, - c / 255, - l / 255 - ], d = 2 ** (Number(y.lastParams?.exposureEV) || 0); - return { - r: o, - g: s, - b: c, - a: l, - raw: u, - lin: [ - u[0] * d, - u[1] * d, - u[2] * d, - u[3] - ], - scale: y.scale - }; - } catch { - return null; - } - }, F = () => { - S(), A(); - try { - d?.({ - naturalW: y.naturalW, - naturalH: y.naturalH, - pixelScale: y.scale - }); - } catch (e) { - console.debug?.(e); - } - }, ne = (e) => { - f && (String(e?.detail?.active_prompt_id || "").trim() ? N() : ee()); - }; - try { - let n = () => { - y._runtimePaused || j(); - }, r = () => { - try { - y._seekRaf != null && cancelAnimationFrame(y._seekRaf); - } catch (e) { - console.debug?.(e); - } - y._seekRaf = null; - }; - b.push(l?.(t, "loadedmetadata", F, { once: !0 }) || (() => {})), b.push(l?.(t, "seeking", () => { - if (y._destroyed || y._runtimePaused) return; - try { - if (!t?.paused) { - A(); - return; - } - } catch (e) { - console.debug?.(e); - } - if (y._seekRaf != null) return; - let n = () => { - if (y._seekRaf = null, y._destroyed || !e?.isConnected) return; - A(); - let r = !1; - try { - r = !!t?.seeking; - } catch (e) { - console.debug?.(e); - } - if (r) try { - y._seekRaf = requestAnimationFrame(n); - } catch (e) { - console.debug?.(e); - } - }; - try { - y._seekRaf = requestAnimationFrame(n); - } catch (e) { - console.debug?.(e); - } - }, { passive: !0 }) || (() => {})), b.push(l?.(t, "seeked", () => { - r(), A(); - }, { passive: !0 }) || (() => {})), b.push(l?.(t, "pause", A, { passive: !0 }) || (() => {})), b.push(l?.(t, "play", n, { passive: !0 }) || (() => {})), b.push(l?.(t, "timeupdate", () => { - try { - if (!t?.paused && typeof t?.requestVideoFrameCallback == "function") return; - } catch (e) { - console.debug?.(e); - } - A(); - }, { passive: !0 }) || (() => {})), b.push(l?.(t, "error", () => { - y.ready = !1; - try { - let n = t?.error?.code, r = t?.error?.message || "", i, a; - n === 2 ? (i = "Failed to load video (network / path error)", a = "Check file permissions / path, or try re-indexing.") : n === 3 ? (i = "Failed to load video (decode error - unsupported codec?)", a = "Browser may not support this codec (e.g. H.265/HEVC). Try converting to H.264/MP4.") : n === 4 ? (i = "Failed to load video (unsupported format or codec)", a = "Browser cannot decode this file (e.g. H.265/HEVC). Try converting to H.264/MP4.") : (i = "Failed to load video", a = r || "Check file permissions / path, or try re-indexing."), console.warn("[MJR] Video load error", { - code: n, - message: r, - src: t?.src - }), se(e, i, a); - } catch (e) { - console.debug?.(e); - } - }, { passive: !0 }) || (() => {})), f && (window.addEventListener(D.RUNTIME_STATUS, ne), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && N()); - } catch (e) { - console.debug?.(e); - } - return { - setParams: M, - sampleAtOriginal: te, - getInfo: () => ({ - ...y, - renderer: p ? "webgl" : "2d" - }), - pause: N, - resume: ee, - destroy: () => { - p && p.destroy(), y._destroyed = !0; - try { - window.removeEventListener(D.RUNTIME_STATUS, ne); - } catch (e) { - console.debug?.(e); - } - try { - y._throttleTimer && clearTimeout(y._throttleTimer); - } catch (e) { - console.debug?.(e); - } - y._throttleTimer = null; - try { - y._connectRAF != null && cancelAnimationFrame(y._connectRAF); - } catch (e) { - console.debug?.(e); - } - y._connectRAF = null, y._connectTries = 0; - try { - y._rvfc != null && typeof t?.cancelVideoFrameCallback == "function" && t.cancelVideoFrameCallback(y._rvfc); - } catch (e) { - console.debug?.(e); - } - try { - y._rafIdLoop != null && cancelAnimationFrame(y._rafIdLoop); - } catch (e) { - console.debug?.(e); - } - try { - y._rafIdSchedule != null && cancelAnimationFrame(y._rafIdSchedule); - } catch (e) { - console.debug?.(e); - } - try { - y._seekRaf != null && cancelAnimationFrame(y._seekRaf); - } catch (e) { - console.debug?.(e); - } - try { - for (let e of b) u?.(e); - } catch (e) { - console.debug?.(e); - } - try { - h.width = 0, h.height = 0; - } catch (e) { - console.debug?.(e); - } - try { - e.width = 0, e.height = 0; - } catch (e) { - console.debug?.(e); - } - y._buffer = null; - } - }; -} -// ui/features/viewer/audioVisualizer.ts -function sr(e, t, n) { - let r = Number(e); - return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; -} -function cr(e) { - try { - let t = String(e || "").toLowerCase(); - if (t === "simple" || t === "artistic") return t; - if (t === "webgl" || t === "webgl3d") return "simple"; - } catch (e) { - console.debug?.(e); - } - try { - let e = String(T?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase(); - if (e === "artistic") return "artistic"; - if (e === "webgl3d" || e === "webgl") return "simple"; - } catch (e) { - console.debug?.(e); - } - return "simple"; -} -function lr(e) { - let t = e.getContext("2d"); - if (!t) return null; - let n = (e, t) => { - try { - let n = Math.max(0, Math.min(e.length - 1, Math.floor(t * (e.length - 1)))); - return (Number(e[n]) || 0) / 255; - } catch { - return 0; - } - }, r = (e, t) => { - let r = n(e, .18 + t * .18), i = n(e, .28 + t * .16), a = n(e, .4 + t * .06), o = n(e, .46 + t * .03); - return r * .28 + i * .36 + a * .24 + o * .12; - }, i = (e, t) => { - let r = n(e, .01 + t * .06), i = n(e, .04 + t * .07), a = n(e, .09 + t * .04); - return r * .45 + i * .35 + a * .2; - }, a = (e, t) => { - let r = n(e, .64 + t * .18), i = n(e, .78 + t * .12), a = n(e, .92 + t * .06); - return r * .34 + i * .38 + a * .28; - }; - return { - draw(n, o, s = 0) { - try { - let o = e.width || 0, c = e.height || 0; - if (!(o > 1 && c > 1)) return; - let l = Number(s) * .001 * .12 % 1; - t.clearRect(0, 0, o, c); - let u = o * .5, d = c * .52, f = Math.max(36, Math.min(140, Math.floor(o / 12))), p = Math.min(o * .56, f * 8), m = p / Math.max(1, f - 1), h = u - p * .5, g = d - c * .08; - t.fillStyle = "rgba(255,255,255,0.95)"; - for (let e = 0; e < f; e++) { - let i = h + e * m, a = (e / Math.max(1, f - 1) + l) % 1, o = r(n, a), s = g - o * c * .11, u = 1.2 + o * 1.2; - t.beginPath(), t.arc(i, s, u, 0, Math.PI * 2), t.fill(); - } - t.fillStyle = "rgba(255,255,255,0.9)"; - for (let e = 0; e < f; e++) { - let n = h + e * m; - t.beginPath(), t.arc(n, d, 1.6, 0, Math.PI * 2), t.fill(); - } - let _ = Math.max(1.5, m * .45); - for (let e = 0; e < f; e++) { - let r = h + e * m, o = e / Math.max(1, f - 1), s = (o + l) % 1, u = i(n, s), p = a(n, s), g = 1 - Math.abs(o * 2 - 1), v = ((u * .62 + p * .38) * .84 + g * .16) ** 1.1 * c * .32; - t.fillStyle = "rgba(255,255,255,0.96)", t.fillRect(r - _ * .5, d + 1, _, v); - } - } catch (e) { - console.debug?.(e); - } - }, - destroy() {} - }; -} -function ur(e, { pseudo3d: t = !1 } = {}) { - let n = null; - try { - n = e.getContext("webgl", { - antialias: !0, - alpha: !0, - preserveDrawingBuffer: !0 - }); - } catch { - n = null; - } - if (!n) return null; - let r = (e, t) => { - let r = n.createShader(e); - return r ? (n.shaderSource(r, t), n.compileShader(r), n.getShaderParameter(r, n.COMPILE_STATUS) ? r : (n.deleteShader(r), null)) : null; - }, i = r(n.VERTEX_SHADER, "\nattribute vec2 aPos;\nvoid main() {\n gl_Position = vec4(aPos, 0.0, 1.0);\n}\n"), a = r(n.FRAGMENT_SHADER, "\nprecision mediump float;\nuniform vec4 uColor;\nvoid main() {\n gl_FragColor = uColor;\n}\n"); - if (!i || !a) return null; - let o = n.createProgram(); - if (!o || (n.attachShader(o, i), n.attachShader(o, a), n.linkProgram(o), !n.getProgramParameter(o, n.LINK_STATUS))) return null; - n.useProgram(o); - let s = n.getAttribLocation(o, "aPos"), c = n.getUniformLocation(o, "uColor"), l = n.createBuffer(); - if (!l || s < 0 || !c) return null; - let u = (e, t) => { - n.bindBuffer(n.ARRAY_BUFFER, l), n.bufferData(n.ARRAY_BUFFER, e, n.DYNAMIC_DRAW), n.enableVertexAttribArray(s), n.vertexAttribPointer(s, 2, n.FLOAT, !1, 0, 0), n.uniform4f(c, t[0], t[1], t[2], t[3]), n.drawArrays(n.LINE_STRIP, 0, Math.floor(e.length / 2)); - }, d = (e, t) => { - try { - let n = Math.max(0, Math.min(e.length - 1, Math.floor(t * (e.length - 1)))); - return (Number(e[n]) || 0) / 255; - } catch { - return 0; - } - }, f = (e, t) => { - let n = d(e, .18 + t * .18), r = d(e, .28 + t * .16), i = d(e, .4 + t * .06), a = d(e, .46 + t * .03); - return n * .28 + r * .36 + i * .24 + a * .12; - }, p = (e, t) => { - let n = d(e, .01 + t * .06), r = d(e, .04 + t * .07), i = d(e, .09 + t * .04); - return n * .45 + r * .35 + i * .2; - }, m = (e, t) => { - let n = d(e, .64 + t * .18), r = d(e, .78 + t * .12), i = d(e, .92 + t * .06); - return n * .34 + r * .38 + i * .28; - }; - return { - draw(r, i, a = 0) { - try { - n.viewport(0, 0, e.width || 1, e.height || 1), n.clearColor(0, 0, 0, 0), n.clear(n.COLOR_BUFFER_BIT); - let i = Math.max(48, Math.min(180, Math.floor((e.width || 640) / 7))), o = Number(a) * .001, s = new Float32Array(i * 2); - for (let e = 0; e < i; e++) { - let n = e / Math.max(1, i - 1), a = n * 2 - 1, c = f(r, n), l = t ? Math.sin(n * Math.PI * 4 + o * 1.1) * .18 : 0, u = t ? 1 / (1 + Math.max(-.7, l) * .8) : 1, d = sr((.18 + c * .32) * u, -.95, .95); - s[e * 2] = a, s[e * 2 + 1] = d; - } - u(s, [ - 1, - 1, - 1, - .95 - ]); - let c = new Float32Array(i * 2); - for (let e = 0; e < i; e++) { - let n = e / Math.max(1, i - 1), a = n * 2 - 1, s = p(r, n), l = m(r, n), u = s * .62 + l * .38, d = t ? Math.sin(n * Math.PI * 3 + o * 1) * .14 : 0, f = t ? 1 / (1 + Math.max(-.7, d) * .8) : 1, h = sr(-u * .62 * f, -.95, 0); - c[e * 2] = a, c[e * 2 + 1] = h; - } - u(c, [ - 1, - 1, - 1, - .9 - ]); - } catch (e) { - console.debug?.(e); - } - }, - destroy() { - try { - n.deleteBuffer(l); - } catch (e) { - console.debug?.(e); - } - try { - n.deleteProgram(o); - } catch (e) { - console.debug?.(e); - } - try { - n.deleteShader(i); - } catch (e) { - console.debug?.(e); - } - try { - n.deleteShader(a); - } catch (e) { - console.debug?.(e); - } - } - }; -} -function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) { - if (!e || !t) return { destroy() {} }; - let i = r == null ? !!T?.VIEWER_PAUSE_DURING_EXECUTION : !!r, a = null, o = !1, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = !1, h = 1e3 / sr(T?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = cr(n), _ = () => { - try { - let t = sr(window.devicePixelRatio || 1, 1, 2), n = Math.max(32, Math.floor((e.clientWidth || 640) * t)), r = Math.max(24, Math.floor((e.clientHeight || 140) * t)); - e.width !== n && (e.width = n), e.height !== r && (e.height = r); - } catch (e) { - console.debug?.(e); - } - }, v = (t = g) => { - g = cr(t); - try { - f?.destroy?.(); - } catch (e) { - console.debug?.(e); - } - f = null; - try { - _(); - } catch (e) { - console.debug?.(e); - } - try { - g === "artistic" && !T?.VIEWER_DISABLE_WEBGL_AUDIO && (f = ur(e, { pseudo3d: !0 })); - } catch (e) { - console.debug?.(e); - } - if (!f) try { - f = lr(e); - } catch (e) { - console.debug?.(e), f = null; - } - return p = 0, g; - }, y = () => { - if (!(o || l)) try { - let e = window.AudioContext || window.webkitAudioContext; - if (!e) return; - s = new e(), c = s.createMediaElementSource(t), l = s.createAnalyser(), l.fftSize = 1024, l.smoothingTimeConstant = .8, c.connect(l), l.connect(s.destination), u = new Uint8Array(l.frequencyBinCount), d = new Uint8Array(l.fftSize), f || v(g); - } catch { - l = null; - } - }, b = (e) => { - if (!o) { - try { - a = requestAnimationFrame(b); - } catch { - a = null; - return; - } - if (!m && l && f && !(e - p < h)) { - p = e; - try { - _(), l.getByteFrequencyData(u), l.getByteTimeDomainData(d), f.draw(u, d, e); - } catch (e) { - console.debug?.(e); - } - } - } - }, x = async () => { - try { - if (m || (y(), !s)) return; - if (s.state === "suspended") try { - await s.resume(); - } catch (e) { - console.debug?.(e); - } - a ??= requestAnimationFrame(b); - } catch (e) { - console.debug?.(e); - } - }, S = () => { - try { - a != null && cancelAnimationFrame(a); - } catch (e) { - console.debug?.(e); - } - a = null; - }, C = () => { - x(); - }, w = () => S(), E = () => S(), O = () => _(), k = (e) => { - i && (m = !!String(e?.detail?.active_prompt_id || "").trim(), m ? S() : t?.paused || x()); - }; - try { - _(), v(g); - } catch (e) { - console.debug?.(e); - } - try { - t.addEventListener("play", C, { passive: !0 }), t.addEventListener("pause", w, { passive: !0 }), t.addEventListener("ended", E, { passive: !0 }), window.addEventListener("resize", O, { passive: !0 }), i && (window.addEventListener(D.RUNTIME_STATUS, k), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (m = !0)); - } catch (e) { - console.debug?.(e); - } - return { - setMode(e) { - return o ? g : v(e); - }, - destroy() { - if (!o) { - o = !0, S(); - try { - t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("ended", E), window.removeEventListener("resize", O), window.removeEventListener(D.RUNTIME_STATUS, k); - } catch (e) { - console.debug?.(e); - } - try { - f?.destroy?.(); - } catch (e) { - console.debug?.(e); - } - try { - c?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - try { - l?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - try { - s?.close?.(); - } catch (e) { - console.debug?.(e); - } - c = null, l = null, s = null, f = null; - } - } - }; -} -// ui/features/viewer/mediaFactory.ts -function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r, clampPanToBounds: i, applyTransform: a, scheduleOverlayRedraw: o, getGradeParams: s, isDefaultGrade: c, tonemap: l, maxProcPixels: u, maxProcPixelsVideo: d, disableWebGL: f, videoGradeThrottleFps: p, safeAddListener: m, safeCall: h } = {}) { - let g = h || X, _ = m || Z, v = (e) => { - try { - let t = String(e?.ext || "").trim().toLowerCase(); - if (t) return t.startsWith(".") ? t : `.${t}`; - } catch (e) { - console.debug?.(e); - } - try { - let t = String(e?.filename || e?.filepath || "").trim(), n = t.lastIndexOf("."); - if (n >= 0) return t.slice(n).toLowerCase(); - } catch (e) { - console.debug?.(e); - } - return ""; - }, y = (e) => { - let t = v(e); - return t === ".gif" || t === ".webp"; - }, b = (e, s) => { - let c = document.createElement("img"); - c.className = "mjr-viewer-media"; - try { - e?.id != null && c?.dataset && (c.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - c.alt = String(e?.filename || "") || "image"; - try { - c.decoding = "async"; - } catch (e) { - console.debug?.(e); - } - try { - c.loading = "eager"; - } catch (e) { - console.debug?.(e); - } - try { - c.draggable = !1; - } catch (e) { - console.debug?.(e); - } - c.src = s, c.style.cssText = ` - max-width: 100%; - max-height: 100%; - display: block; - transform: ${n?.() || ""}; - transform-origin: center center; - `; - let l = () => { - try { - requestAnimationFrame(() => { - try { - t?._userInteracted || (r?.(), i?.(), a?.()); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - try { - o?.(); - } catch (e) { - console.debug?.(e); - } - }, u = () => { - try { - let t = document.createElement("canvas"); - t.className = "mjr-viewer-media"; - try { - e?.id != null && t?.dataset && (t.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - x(t, e), t.style.cssText = ` - max-width: 100%; - max-height: 100%; - display: block; - transform: ${n?.() || ""}; - transform-origin: center center; - `, se(t, "Failed to load image"), c.replaceWith(t); - } catch (e) { - console.debug?.(e); - } - }; - try { - c.addEventListener("load", l, { once: !0 }); - } catch (e) { - console.debug?.(e); - } - try { - c.addEventListener("error", u, { once: !0 }); - } catch (e) { - console.debug?.(e); - } - return c; - }, x = (e, t) => { - try { - if (!e || !(e instanceof HTMLCanvasElement)) return; - let n = Number(t?.width) || 0, r = Number(t?.height) || 0; - if (!(n > 0 && r > 0)) return; - !Number(e._mjrNaturalW) && !Number(e._mjrNaturalH) && (e._mjrNaturalW = n, e._mjrNaturalH = r); - } catch (e) { - console.debug?.(e); - } - }, S = (e) => { - try { - return Nt(e); - } catch { - return null; - } - }, C = (e, t, n, r = "metadata") => { - try { - let i = Number(n); - if (!Number.isFinite(i) || i <= 0) return; - let a = Math.round(i * 1e3) / 1e3, o = String(e?._mjrDetectedFpsSource || ""); - if (r === "rvfc" && o && o !== "rvfc") return; - let s = Number(e?._mjrDetectedFps || 0) || 0; - if (s > 0 && Math.abs(s - a) < .01) return; - e._mjrDetectedFps = a, e._mjrDetectedFpsSource = String(r || "metadata"), window.dispatchEvent(new CustomEvent("mjr:viewer-fps-detected", { detail: { - fps: a, - source: String(r || "metadata"), - assetId: t?.id == null ? "" : String(t.id) - } })); - } catch (e) { - console.debug?.(e); - } - }, w = (e, t) => { - let n = !1; - try { - let r = S(t); - r && (n = !0, C(e, t, r, "asset-metadata")); - } catch (e) { - console.debug?.(e); - } - try { - e.addEventListener("loadedmetadata", () => { - try { - let r = S(t); - r && (n = !0, C(e, t, r, "loadedmetadata")); - } catch (e) { - console.debug?.(e); - } - }, { once: !0 }); - } catch (e) { - console.debug?.(e); - } - try { - if (n || typeof e?.requestVideoFrameCallback != "function") return; - let r = null, i = 0, a = 0, o = !1, s = (c, l) => { - try { - if (n || o) return; - let c = Number(l?.mediaTime); - if (Number.isFinite(c) && c >= 0) { - if (r != null) { - let e = c - r; - e > 0 && e < 1 && (a += e, i += 1); - } - r = c; - } - if (i >= 10) { - let n = a / Math.max(1, i), r = n > 0 ? 1 / n : 0; - Number.isFinite(r) && r > 1 && (o = !0, C(e, t, r, "rvfc")); - } - i < 10 && !o && e.requestVideoFrameCallback(s); - } catch (e) { - console.debug?.(e); - } - }; - e.requestVideoFrameCallback(s); - } catch (e) { - console.debug?.(e); - } - }, E = (e, n, { compare: r = !1 } = {}) => { - let i = document.createElement("div"); - if (i.className = "mjr-viewer-audio-shell", !r) { - let t = document.createElement("div"); - t.className = "mjr-viewer-audio-header"; - let n = document.createElement("span"); - n.className = "mjr-viewer-audio-icon", n.innerHTML = ""; - let r = document.createElement("div"); - r.className = "mjr-viewer-audio-title-wrap"; - let a = document.createElement("div"); - a.className = "mjr-viewer-audio-title", a.textContent = String(e?.display_name || e?.displayName || e?.filename || "Audio"); - let o = document.createElement("div"); - o.className = "mjr-viewer-audio-meta"; - let s = String(e?.filename || "").split(".").pop() || "audio"; - o.textContent = String(s || "audio").toUpperCase(), r.appendChild(a), r.appendChild(o), t.appendChild(n), t.appendChild(r), i.appendChild(t); - } - let a = document.createElement("canvas"); - a.className = "mjr-viewer-audio-viz"; - let o = document.createElement("audio"); - o.className = "mjr-viewer-audio-src", o.src = n, o.controls = !1, o.autoplay = !0, o.preload = "metadata"; - try { - let e = dr({ - canvas: a, - audioEl: o, - mode: t?.audioVisualizerMode, - pauseDuringExecution: !0 - }); - o._mjrAudioViz = e, a._mjrProc = e; - } catch { - o._mjrAudioViz = null, a._mjrProc = null; - } - return i.appendChild(a), i.appendChild(o), i; - }; - function D(e, m) { - let h = document.createElement("div"); - h.className = "mjr-video-host", h.style.cssText = "\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n "; - let v = String(e?.kind || "").toLowerCase(); - if (ie(e) || v === "model3d") return oe(e, m, { - hostClassName: "mjr-model3d-host mjr-viewer-model3d-host", - canvasClassName: "mjr-viewer-media mjr-model3d-render-canvas", - pauseDuringExecution: !0, - scheduleOverlayRedraw: o, - onReady: () => { - try { - requestAnimationFrame(() => { - try { - t?._userInteracted || (r?.(), i?.(), a?.()); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - try { - o?.(); - } catch (e) { - console.debug?.(e); - } - } - }); - if (v && v !== "image" && v !== "video" && v !== "audio") { - let t = document.createElement("canvas"); - t.className = "mjr-viewer-media"; - try { - e?.id != null && t?.dataset && (t.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - x(t, e), t.style.cssText = ` - max-width: 100%; - max-height: 100%; - display: block; - transform: ${n?.() || ""}; - transform-origin: center center; - `; - try { - se(t, `Unsupported file type: ${v}`); - } catch (e) { - console.debug?.(e); - } - return t; - } - if (v === "audio") return E(e, m, { compare: !1 }); - if (v === "video") { - let u = document.createElement("canvas"); - u.className = "mjr-viewer-media"; - try { - e?.id != null && u?.dataset && (u.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - x(u, e), u.style.cssText = ` - max-width: 100%; - max-height: 100%; - object-fit: contain; - display: block; - transform: ${n?.() || ""}; - transform-origin: center center; - `; - let v = document.createElement("video"); - v.className = "mjr-viewer-video-src", v.src = m, v.controls = !1, v.loop = !0, v.playsInline = !0, v.muted = !0, v.autoplay = !0, v.preload = "auto"; - try { - "decode" in HTMLVideoElement.prototype && (v.decoding = "async"); - } catch {} - v.style.cssText = "position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;", w(v, e); - try { - u._mjrProc = or({ - canvas: u, - videoEl: v, - disableWebGL: f || !!T.VIEWER_DISABLE_WEBGL_VIDEO, - pauseDuringExecution: T.VIEWER_PAUSE_DURING_EXECUTION, - getGradeParams: s, - isDefaultGrade: c, - tonemap: l, - maxProcPixelsVideo: d, - throttleFps: p, - safeAddListener: _, - safeCall: g, - onReady: () => { - try { - requestAnimationFrame(() => { - try { - t?._userInteracted || (r?.(), i?.(), a?.()); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - try { - o?.(); - } catch (e) { - console.debug?.(e); - } - } - }), u._mjrProc?.setParams?.(s?.()); - } catch (e) { - console.debug?.(e); - } - try { - v.addEventListener("canplay", () => { - try { - let e = v.play?.(); - e && typeof e.catch == "function" && e.catch(() => { - try { - se(u, "Autoplay blocked (press Space / Play)"); - } catch (e) { - console.debug?.(e); - } - }); - } catch { - try { - se(u, "Autoplay blocked (press Space / Play)"); - } catch (e) { - console.debug?.(e); - } - } - }, { once: !0 }); - } catch (e) { - console.debug?.(e); - } - return h.appendChild(u), h.appendChild(v), h; - } - if (y(e)) return b(e, m); - let S = document.createElement("canvas"); - S.className = "mjr-viewer-media"; - try { - e?.id != null && S?.dataset && (S.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - x(S, e), S.style.cssText = ` - max-width: 100%; - max-height: 100%; - object-fit: contain; - display: block; - transform: ${n?.() || ""}; - transform-origin: center center; - `; - try { - S._mjrProc = ae({ - canvas: S, - url: m, - getGradeParams: s, - isDefaultGrade: c, - tonemap: l, - maxProcPixels: u, - onReady: () => { - try { - requestAnimationFrame(() => { - try { - t?._userInteracted || (r?.(), i?.(), a?.()); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - try { - o?.(); - } catch (e) { - console.debug?.(e); - } - } - }), S._mjrProc?.setParams?.(s?.()); - } catch (e) { - console.debug?.(e); - } - return S; - } - function O(e, f) { - let m = String(e?.kind || "").toLowerCase(); - if (ie(e) || m === "model3d") return oe(e, f, { - hostClassName: "mjr-model3d-host mjr-viewer-model3d-host", - canvasClassName: "mjr-viewer-media mjr-model3d-render-canvas", - pauseDuringExecution: !0, - scheduleOverlayRedraw: o, - onReady: () => { - try { - requestAnimationFrame(() => { - try { - t?._userInteracted || (r?.(), i?.(), a?.()); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - try { - o?.(); - } catch (e) { - console.debug?.(e); - } - } - }); - if (m && m !== "image" && m !== "video" && m !== "audio") { - let t = document.createElement("canvas"); - t.className = "mjr-viewer-media"; - try { - e?.id != null && t?.dataset && (t.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - x(t, e), t.style.cssText = ` - max-width: 100%; - max-height: 100%; - display: block; - transform: ${n?.() || ""}; - transform-origin: center center; - `; - try { - se(t, `Unsupported file type: ${m}`); - } catch (e) { - console.debug?.(e); - } - return t; - } - if (m === "audio") return E(e, f, { compare: !0 }); - if (m === "video") { - let u = document.createElement("div"); - u.style.cssText = "width:100%; height:100%; position:relative; display:flex; align-items:center; justify-content:center;"; - let m = document.createElement("canvas"); - m.className = "mjr-viewer-media"; - try { - e?.id != null && m?.dataset && (m.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - x(m, e), m.style.cssText = ` - max-width: 100%; - max-height: 100%; - object-fit: contain; - display: block; - transform: ${n?.() || ""}; - transform-origin: center center; - `; - let h = document.createElement("video"); - h.className = "mjr-viewer-video-src", h.src = f, h.controls = !1, h.loop = !0, h.muted = !0, h.playsInline = !0, h.autoplay = !0, h.preload = "auto"; - try { - "decode" in HTMLVideoElement.prototype && (h.decoding = "async"); - } catch {} - h.style.cssText = "position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;", w(h, e); - try { - m._mjrProc = or({ - canvas: m, - videoEl: h, - pauseDuringExecution: T.VIEWER_PAUSE_DURING_EXECUTION, - getGradeParams: s, - isDefaultGrade: c, - tonemap: l, - maxProcPixelsVideo: d, - throttleFps: p, - safeAddListener: _, - safeCall: g, - onReady: () => { - try { - requestAnimationFrame(() => { - try { - t?._userInteracted || (r?.(), i?.(), a?.()); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - try { - o?.(); - } catch (e) { - console.debug?.(e); - } - } - }), m._mjrProc?.setParams?.(s?.()); - } catch (e) { - console.debug?.(e); - } - return u.appendChild(m), u.appendChild(h), u; - } - if (y(e)) return b(e, f); - let h = document.createElement("canvas"); - h.className = "mjr-viewer-media"; - try { - e?.id != null && h?.dataset && (h.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - x(h, e), h.style.cssText = ` - max-width: 100%; - max-height: 100%; - display: block; - transform: ${n?.() || ""}; - transform-origin: center center; - `; - try { - h._mjrProc = ae({ - canvas: h, - url: f, - getGradeParams: s, - isDefaultGrade: c, - tonemap: l, - maxProcPixels: u, - onReady: () => { - try { - requestAnimationFrame(() => { - try { - t?._userInteracted || (r?.(), i?.(), a?.()); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - try { - o?.(); - } catch (e) { - console.debug?.(e); - } - } - }), h._mjrProc?.setParams?.(s?.()); - } catch (e) { - console.debug?.(e); - } - return h; - } - return { - createMediaElement: D, - createCompareMediaElement: O, - applyTransformToVisibleMedia: () => { - try { - let t = n?.() || "", r = e?.querySelectorAll?.(".mjr-viewer-media") || []; - for (let e of r) try { - if (e?._mjrDisableViewerTransform) continue; - e.style.transform = t; - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - } - }; -} -// ui/features/viewer/imagePreloader.ts -function pr({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) { - function r(e) { - if (!e) return null; - if (e.id != null) return `id:${e.id}`; - let t = e.filepath || e.path || e.filename; - return t ? `path:${t}` : null; - } - function i(e) { - if (!e) return !1; - let n = String(e.kind || "").toLowerCase(); - if (n === "image" || n.startsWith("image/")) return !0; - let r = String(e.filepath || e.path || e.filename || "").split(".").pop()?.toLowerCase() || ""; - return t.has(r); - } - function a(e) { - if (e) try { - n._preloadRefs = n._preloadRefs || /* @__PURE__ */ new Set(), n._preloadRefs.add(e); - let t = () => { - try { - n._preloadRefs?.delete?.(e); - } catch (e) { - console.debug?.(e); - } - }; - e.addEventListener("load", t, { - once: !0, - passive: !0 - }), e.addEventListener("error", t, { - once: !0, - passive: !0 - }); - } catch (e) { - console.debug?.(e); - } - } - function o(e, t) { - if (!e || !t || !i(e)) return; - let o = r(e) || t; - if (o) { - if (n._preloadedAssetKeys = n._preloadedAssetKeys || /* @__PURE__ */ new Set(), n._preloadedAssetKeys.has(o)) return; - if (n._preloadedAssetKeys.add(o), n._preloadedAssetKeys.size > 250) try { - n._preloadedAssetKeys.clear(); - } catch (e) { - console.debug?.(e); - } - } - try { - let e = new Image(); - e.decoding = "async"; - try { - e.loading = "lazy"; - } catch (e) { - console.debug?.(e); - } - e.alt = "", e.src = t, a(e); - } catch (e) { - console.debug?.(e); - } - } - function s(t, n) { - let r = Array.isArray(t) ? t : []; - if (!r.length) return; - let i = [ - n - 1, - n + 1, - n - 2, - n + 2, - n - 3, - n + 3 - ]; - for (let t of i) { - if (t < 0 || t >= r.length) continue; - let n = r[t]; - n && o(n, e(n)); - } - } - return { - preloadAdjacentAssets: s, - preloadImageForAsset: o, - trackPreloadRef: a - }; -} -// ui/features/metadata/genInfoCompare.ts -function mr(e, t) { - for (let n of t) { - let t = n.split("."), r = e; - for (let e of t) { - if (r == null) break; - r = r?.[e]; - } - if (r != null && String(r).trim?.() !== "") return r; - } - return ""; -} -function hr(e) { - if (e == null) return ""; - if (typeof e == "string") return e.trim(); - if (typeof e == "number" || typeof e == "boolean") return String(e); - try { - return JSON.stringify(e); - } catch { - return String(e); - } -} -var gr = [ - { - key: "positive", - label: "Positive Prompt", - paths: [ - "geninfo.positive.value", - "positive_prompt", - "prompt" - ] - }, - { - key: "negative", - label: "Negative Prompt", - paths: ["geninfo.negative.value", "negative_prompt"] - }, - { - key: "model", - label: "Model", - paths: [ - "geninfo.checkpoint.name", - "model", - "checkpoint" - ] - }, - { - key: "lora", - label: "LoRA", - paths: [ - "geninfo.loras", - "loras", - "lora" - ] - }, - { - key: "sampler", - label: "Sampler", - paths: ["geninfo.sampler.name", "sampler"] - }, - { - key: "scheduler", - label: "Scheduler", - paths: ["geninfo.scheduler.name", "scheduler"] - }, - { - key: "steps", - label: "Steps", - paths: ["geninfo.steps.value", "steps"] - }, - { - key: "cfg", - label: "CFG", - paths: ["geninfo.cfg.value", "cfg"] - }, - { - key: "denoise", - label: "Denoise", - paths: ["geninfo.denoise.value", "denoise"] - }, - { - key: "seed", - label: "Seed", - paths: ["geninfo.seed.value", "seed"] - }, - { - key: "workflow_nodes", - label: "Workflow Nodes", - paths: ["geninfo.workflow_nodes", "workflow.nodes"] - } -]; -function _r(e, t) { - return gr.map((n) => { - let r = hr(mr(e, n.paths)), i = hr(mr(t, n.paths)); - return { - key: n.key, - label: n.label, - left: r, - right: i, - changed: r !== i - }; - }).filter((e) => e.left || e.right); -} -// ui/features/viewer/metadataCompare.ts -function vr(e) { - return String(e ?? "").trim() || "-"; -} -function yr(e, t) { - let n = document.createElement("div"); - return n.textContent = vr(e), n.style.cssText = [ - "min-width:0", - "white-space:pre-wrap", - "overflow-wrap:anywhere", - "font-size:11px", - "line-height:1.35", - "color:rgba(255,255,255,0.84)", - t ? "background:rgba(255,193,7,0.10)" : "background:rgba(255,255,255,0.035)", - "border:1px solid rgba(255,255,255,0.08)", - "border-radius:6px", - "padding:6px 7px" - ].join(";"), n; -} -function br(e, t) { - let n = _r(e, t).filter((e) => vr(e?.left) !== "-" || vr(e?.right) !== "-"); - if (!n.length) return null; - let r = document.createElement("div"); - r.style.cssText = "display:flex;flex-direction:column;gap:8px;margin:0 0 14px 0;padding:10px;border:1px solid rgba(144,220,220,0.22);border-radius:10px;background:rgba(90,220,220,0.06);"; - let i = document.createElement("div"); - i.textContent = C("viewer.metadataCompare", "Metadata compare"), i.style.cssText = "font-size:12px;font-weight:700;color:rgba(255,255,255,0.9);letter-spacing:0.02em", r.appendChild(i); - for (let e of n.slice(0, 24)) { - let t = document.createElement("div"); - t.style.cssText = "display:grid;grid-template-columns:minmax(74px,0.42fr) 1fr 1fr;gap:6px;align-items:start"; - let n = document.createElement("div"); - n.textContent = String(e?.label || e?.key || "").trim(), n.style.cssText = "font-size:11px;font-weight:650;color:rgba(255,255,255,0.70);padding-top:6px;overflow-wrap:anywhere", t.appendChild(n); - let i = !!e?.changed; - t.appendChild(yr(e?.left, i)), t.appendChild(yr(e?.right, i)), r.appendChild(t); - } - return r; -} -// ui/features/viewer/viewerInstanceManager.ts -function xr(e) { - let t = u(); - if (t.length) { - let e = t[t.length - 1]; - for (let n of t) if (n !== e) { - try { - n?._mjrViewerAPI?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - try { - n.remove?.(); - } catch (e) { - console.debug?.(e); - } - } - if (e && e._mjrViewerAPI) return e._mjrViewerAPI; - try { - e?.remove?.(); - } catch (e) { - console.debug?.(e); - } - } - let n = e(); - return c(n), n._mjrViewerAPI; -} -// ui/features/viewer/playerBarManager.ts -function Sr({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, playerBarHost: a, singleView: o, abView: s, sideView: c, metadataHydrator: l, isPlayableViewerKind: u, collectPlayableMediaElements: d, pickPrimaryPlayableMedia: f, mountUnifiedMediaControls: p, installFollowerVideoSync: m, getViewerInfo: h, scheduleOverlayRedraw: g, viewerInfoCacheGet: _, viewerInfoCacheSet: v }) { - function y() { - try { - e._videoControlsDestroy && e._videoControlsDestroy(); - } catch (e) { - console.debug?.(e); - } - e._videoControlsDestroy = null, e._videoControlsMounted = null, e._activeVideoEl = null, e._activeVideoAssetId = null, e.nativeFps = null; - try { - e._videoSyncAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e._videoSyncAbort = null; - try { - e._videoRateAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e._videoRateAbort = null; - try { - e._videoMetaAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e._videoMetaAbort = null; - try { - e._videoFpsEventAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e._videoFpsEventAbort = null; - try { - e._scopesVideoAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e._scopesVideoAbort = null; - try { - a.innerHTML = ""; - } catch (e) { - console.debug?.(e); - } - try { - a.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - try { - i.style.display = ""; - } catch (e) { - console.debug?.(e); - } - } - async function b() { - try { - let b = e.assets[e.currentIndex], x = b?.id ?? null; - if (!u(b?.kind)) { - y(); - return; - } - let S = null, C = []; - try { - C = d({ - mode: e.mode, - VIEWER_MODES: n, - singleView: o, - abView: s, - sideView: c - }); - } catch { - C = []; - } - try { - S = f(C); - } catch { - S = C[0] || null; - } - if (!S) { - y(); - return; - } - if (e._activeVideoEl && e._activeVideoEl === S && e._activeVideoAssetId === x && e._videoControlsDestroy) { - try { - i.style.display = "none", a.style.display = ""; - } catch (e) { - console.debug?.(e); - } - return; - } - y(); - try { - i.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - try { - a.style.display = ""; - } catch (e) { - console.debug?.(e); - } - let w, T; - try { - let e = (e) => { - try { - let t = Nt(e); - return { - fps: t, - frameCount: Pt(e, t) - }; - } catch { - return { - fps: null, - frameCount: null - }; - } - }, t = e(b); - if (t.fps != null && (w = t.fps), t.frameCount != null && (T = t.frameCount), w == null || T == null) { - let t = l?.getCached?.(b?.id), n = t?.data ? e(t.data) : { - fps: null, - frameCount: null - }; - w == null && n.fps != null && (w = n.fps), T == null && n.frameCount != null && (T = n.frameCount); - } - } catch (e) { - console.debug?.(e); - } - try { - if (w == null) { - let e = Number(S?._mjrDetectedFps); - Number.isFinite(e) && e > 0 && (w = e); - } - } catch (e) { - console.debug?.(e); - } - let E = String(b?.kind || "").toLowerCase() === "audio" ? "audio" : "video", D = p(S, { - variant: "viewerbar", - hostEl: a, - fullscreenEl: r, - initialFps: w, - initialFrameCount: T, - initialPlaybackRate: Number(e?.playbackRate) || 1, - mediaKind: E - }); - e._videoControlsMounted = D || null, e._videoControlsDestroy = D?.destroy || null, e._activeVideoEl = S, e._activeVideoAssetId = x; - try { - e._videoRateAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - let t = new AbortController(); - e._videoRateAbort = t, S.addEventListener("ratechange", () => { - try { - let t = Number(S.playbackRate); - Number.isFinite(t) && t > 0 && (e.playbackRate = t); - } catch (e) { - console.debug?.(e); - } - }, { - signal: t.signal, - passive: !0 - }); - } catch (e) { - console.debug?.(e); - } - try { - e.nativeFps = Number(w) > 0 ? Number(w) : null; - } catch (e) { - console.debug?.(e); - } - try { - if (E === "audio") { - let e = S.play?.(); - e && typeof e.catch == "function" && e.catch(() => {}); - } - } catch (e) { - console.debug?.(e); - } - try { - if (E === "video" && e.mode === n?.SINGLE) { - S.muted = !1; - let e = S.play?.(); - e && typeof e.catch == "function" && e.catch(() => {}); - } - } catch (e) { - console.debug?.(e); - } - try { - e._scopesVideoAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - if (E === "video") try { - let n = new AbortController(); - e._scopesVideoAbort = n; - let i = () => { - try { - if (String(e?.scopesMode || "off") === "off") return; - } catch (e) { - console.debug?.(e); - } - g(); - }; - S.addEventListener("seeked", i, { - signal: n.signal, - passive: !0 - }), S.addEventListener("loadeddata", i, { - signal: n.signal, - passive: !0 - }), S.addEventListener("play", i, { - signal: n.signal, - passive: !0 - }), S.addEventListener("pause", i, { - signal: n.signal, - passive: !0 - }); - let a = 1e3 / Math.max(1, Math.min(30, Math.floor(Number(t.VIEWER_SCOPES_FPS) || 10))), o = () => { - if (!n.signal.aborted) { - try { - if (document?.hidden) return; - } catch (e) { - console.debug?.(e); - } - try { - if (r.style.display === "none") return; - } catch (e) { - console.debug?.(e); - } - try { - if (String(e?.scopesMode || "off") !== "off" && !S.paused) { - let t = performance.now(); - t - (Number(e?._scopesLastAt) || 0) >= a && (e._scopesLastAt = t, g()); - } - } catch (e) { - console.debug?.(e); - } - try { - requestAnimationFrame(o); - } catch (e) { - console.debug?.(e); - } - } - }; - try { - requestAnimationFrame(o); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - else e._scopesVideoAbort = null; - try { - e._videoSyncAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - if (e._videoSyncAbort = null, E === "video" && C.length > 1) { - let t = C.filter((e) => e && e !== S); - e._videoSyncAbort = m(S, t); - } - } catch (e) { - console.debug?.(e); - } - if (E === "video") { - try { - let t = (e) => Mt(e), n = (e) => { - let t = Number(e); - return !Number.isFinite(t) || t <= 0 ? null : Math.floor(t); - }, r = (r) => { - try { - if (!r || typeof r != "object") return; - let i = t(r?.fps_raw ?? r?.fps ?? r?.frame_rate), a = n(r?.frame_count); - i != null && (e.nativeFps = i), (i != null || a != null) && D?.setMediaInfo?.({ - fps: i, - frameCount: a - }); - } catch (e) { - console.debug?.(e); - } - }; - try { - let e = _(b?.id); - e && r(e); - } catch (e) { - console.debug?.(e); - } - try { - e._videoMetaAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - let i = new AbortController(); - e._videoMetaAbort = i, (async () => { - try { - let t = await h(b?.id, { signal: i.signal }); - if (!t?.ok || !t.data || e._activeVideoEl !== S) return; - try { - v(b?.id, t.data); - } catch (e) { - console.debug?.(e); - } - r(t.data); - } catch (e) { - console.debug?.(e); - } - })(); - } catch (e) { - console.debug?.(e); - } - try { - e._videoFpsEventAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - let t = new AbortController(); - e._videoFpsEventAbort = t, window.addEventListener("mjr:viewer-fps-detected", (t) => { - try { - let n = t?.detail || {}, r = String(n?.assetId || ""), i = String(b?.id ?? ""); - if (!r || !i || r !== i || e._activeVideoEl !== S) return; - let a = Number(n?.fps); - if (!Number.isFinite(a) || a <= 0) return; - let o = String(n?.source || ""); - o === "rvfc" && Number(e.nativeFps) > 0 || (e.nativeFps = a), D?.setMediaInfo?.({ - fps: a, - fpsSource: o - }); - } catch (e) { - console.debug?.(e); - } - }, { - signal: t.signal, - passive: !0 - }); - } catch (e) { - console.debug?.(e); - } - } else { - try { - e._videoMetaAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e._videoMetaAbort = null; - try { - e._videoFpsEventAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - e._videoFpsEventAbort = null; - } - } catch { - y(); - } - } - return { - destroyPlayerBar: y, - syncPlayerBar: b - }; -} -// ui/features/viewer/viewerThemeStyles.ts -var Cr = "min(400px, 42vw)", wr = `calc(${Cr} + 24px)`, Tr = "mjr-viewer-modern-theme"; -function Er() { - try { - if (document.getElementById(Tr)) return; - let e = document.createElement("style"); - e.id = Tr, e.textContent = ` - .mjr-viewer-overlay { - --mjr-viewer-surface: rgba(14, 18, 24, 0.78); - --mjr-viewer-surface-strong: rgba(10, 13, 18, 0.9); - --mjr-viewer-surface-soft: rgba(255, 255, 255, 0.045); - --mjr-viewer-border: rgba(255, 255, 255, 0.11); - --mjr-viewer-border-strong: rgba(255, 255, 255, 0.18); - --mjr-viewer-shadow: 0 24px 80px rgba(0, 0, 0, 0.42); - --mjr-viewer-shadow-soft: 0 14px 40px rgba(0, 0, 0, 0.22); - --mjr-viewer-radius: 22px; - isolation: isolate; - } - - .mjr-viewer-overlay::before { - content: ""; - position: absolute; - inset: 0; - pointer-events: none; - background: - radial-gradient(circle at top left, rgba(87, 153, 255, 0.14), transparent 34%), - radial-gradient(circle at top right, rgba(78, 224, 196, 0.12), transparent 28%), - radial-gradient(circle at bottom center, rgba(255, 184, 107, 0.08), transparent 28%); - opacity: 0.95; - z-index: 0; - } - - .mjr-viewer-overlay > * { - position: relative; - z-index: 1; - } - - .mjr-viewer-header, - .mjr-viewer-content-row, - .mjr-filmstrip, - .mjr-viewer-footer, - .mjr-viewer-geninfo { - box-shadow: var(--mjr-viewer-shadow-soft); - } - - .mjr-viewer-header { - margin: 18px 18px 0; - border-radius: calc(var(--mjr-viewer-radius) - 2px); - border: 1px solid var(--mjr-viewer-border) !important; - backdrop-filter: blur(20px) saturate(140%); - } - - .mjr-viewer-header-top { - min-height: 42px; - } - - .mjr-viewer-header-area--center { - padding-inline: 8px; - } - - .mjr-viewer-mode-buttons { - padding: 4px; - border-radius: 999px; - background: rgba(255, 255, 255, 0.045); - border: 1px solid rgba(255, 255, 255, 0.08); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); - } - - .mjr-viewer-close, - .mjr-viewer-fs, - .mjr-viewer-nav-btn { - border-color: rgba(255, 255, 255, 0.14) !important; - background: rgba(255, 255, 255, 0.05) !important; - backdrop-filter: blur(16px) saturate(140%); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06); - transition: transform 0.18s ease, background 0.18s ease, border-color 0.18s ease; - } - - .mjr-viewer-close:hover, - .mjr-viewer-fs:hover, - .mjr-viewer-nav-btn:hover { - transform: translateY(-1px); - background: rgba(255, 255, 255, 0.085) !important; - border-color: rgba(255, 255, 255, 0.22) !important; - } - - .mjr-viewer-content-row { - margin: 14px 18px 0; - border-radius: calc(var(--mjr-viewer-radius) + 2px); - border: 1px solid var(--mjr-viewer-border); - background: - linear-gradient(180deg, rgba(19, 24, 31, 0.78), rgba(10, 14, 20, 0.88)), - radial-gradient(circle at top, rgba(255, 255, 255, 0.04), transparent 42%); - overflow: hidden; - box-shadow: var(--mjr-viewer-shadow); - } - - .mjr-viewer-content { - background: - radial-gradient(circle at center, rgba(255, 255, 255, 0.035), transparent 55%), - linear-gradient(180deg, rgba(7, 10, 14, 0.28), rgba(7, 10, 14, 0.62)); - } - - .mjr-viewer-probe, - .mjr-viewer-loupe { - backdrop-filter: blur(14px) saturate(125%); - } - - .mjr-viewer-geninfo { - width: ${Cr} !important; - top: 16px !important; - bottom: 16px !important; - border-radius: 20px; - border: 1px solid var(--mjr-viewer-border-strong); - background: linear-gradient(180deg, rgba(15, 19, 24, 0.92), rgba(9, 12, 16, 0.94)) !important; - backdrop-filter: blur(22px) saturate(140%); - } - - .mjr-viewer-geninfo--right { - right: 16px !important; - } - - .mjr-viewer-geninfo--left { - left: 16px !important; - } - - .mjr-viewer-footer { - margin: 12px 18px 18px; - border-radius: 18px; - border: 1px solid var(--mjr-viewer-border) !important; - backdrop-filter: blur(18px) saturate(135%); - justify-content: space-between !important; - flex-wrap: wrap; - align-content: center; - } - - .mjr-viewer-nav { - padding: 6px; - border-radius: 999px; - background: rgba(255, 255, 255, 0.04); - border: 1px solid rgba(255, 255, 255, 0.08); - } - - .mjr-viewer-nav-btn { - width: 42px; - height: 42px; - padding: 0 !important; - border-radius: 999px !important; - font-size: 22px !important; - line-height: 1; - } - - .mjr-viewer-index { - min-height: 36px; - padding: 0 14px; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 999px; - background: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(255, 255, 255, 0.08); - letter-spacing: 0.02em; - } - - .mjr-viewer-playerbar { - flex: 1 1 320px; - min-width: 260px; - } - - @media (max-width: 960px) { - .mjr-viewer-header, - .mjr-viewer-content-row, - .mjr-filmstrip, - .mjr-viewer-footer { - margin-left: 10px; - margin-right: 10px; - } - - .mjr-viewer-header { - margin-top: 10px; - } - - .mjr-viewer-footer { - margin-bottom: 10px; - justify-content: center !important; - } - - .mjr-viewer-playerbar { - min-width: 100%; - } - - .mjr-viewer-geninfo { - width: min(100vw - 24px, 420px) !important; - left: 12px !important; - right: 12px !important; - } - - .mjr-viewer-geninfo--left { - left: 12px !important; - } - } - `, document.head.appendChild(e); - } catch (e) { - console.debug?.(e); - } -} -// ui/features/viewer/filmstrip.ts -var Dr = 84, Or = 56, kr = 74, Ar = .45, jr = "0px 240px 0px 240px", Mr = 3500; -function Nr(e) { - let t = 2166136261, n = String(e || ""); - for (let e = 0; e < n.length; e += 1) t ^= n.charCodeAt(e), t = Math.imul(t, 16777619); - return t >>> 0; -} -function Pr(e, t, n = 18) { - let r = document.createElement("div"); - r.className = "mjr-filmstrip-audio-waveform"; - let i = Nr(t) || 1; - for (let e = 0; e < n; e += 1) { - i = Math.imul(i ^ i >>> 15, 2246822519) >>> 0; - let t = i % 1e3 / 1e3, a = Math.sin(e / Math.max(1, n - 1) * Math.PI), o = document.createElement("span"); - o.style.height = `${Math.max(16, Math.min(92, Math.round(20 + a * 52 + t * 22)))}%`, o.style.opacity = String(.45 + t * .45), r.appendChild(o); - } - e.appendChild(r); -} -function Fr(e) { - try { - e?._mjrFilmstripReleaseTimer && (clearTimeout(e._mjrFilmstripReleaseTimer), e._mjrFilmstripReleaseTimer = null); - } catch (e) { - console.debug?.(e); - } -} -function Ir(e) { - if (!e) return; - let t = String(e.dataset.lazySrc || "").trim(); - if (t) try { - String(e.getAttribute("src") || "").trim() || (e.src = t, e.load()); - } catch (e) { - console.debug?.(e); - } -} -function Lr(e) { - if (e) try { - let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}); - } catch (e) { - console.debug?.(e); - } -} -function Rr(e) { - if (e) try { - e.pause?.(); - } catch (e) { - console.debug?.(e); - } -} -function zr(e, { releaseSrc: t = !0 } = {}) { - if (e) { - Fr(e), Rr(e); - try { - e._mjrFilmstripInView = !1; - } catch (e) { - console.debug?.(e); - } - if (t) try { - e.getAttribute("src") && (e.removeAttribute("src"), e.load()); - } catch (e) { - console.debug?.(e); - } - } -} -function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { - let i = document.createElement("div"); - i.className = "mjr-filmstrip", i.style.cssText = ` - width: 100%; - height: ${kr}px; - overflow-x: auto; - overflow-y: hidden; - background: linear-gradient(180deg, rgba(16, 20, 27, 0.82), rgba(10, 13, 18, 0.92)); - border: 1px solid rgba(255, 255, 255, 0.08); - border-radius: 18px; - flex-shrink: 0; - scrollbar-width: thin; - scrollbar-color: rgba(255,255,255,0.14) transparent; - box-sizing: border-box; - display: none; - box-shadow: 0 16px 36px rgba(0, 0, 0, 0.22); - `; - let a = document.createElement("div"); - a.className = "mjr-filmstrip-track", a.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 9px 12px;\n min-height: 100%;\n box-sizing: border-box;\n ", i.appendChild(a); - let o = [], s = null, c = /* @__PURE__ */ new Set(), l = -1, u = -1, d = () => { - try { - return new IntersectionObserver((e) => { - let t = i.style.display !== "none", n = !document.hidden; - for (let r of e) { - let e = r.target; - if (!(e instanceof HTMLVideoElement)) continue; - let i = r.isIntersecting || r.intersectionRatio > 0; - try { - e._mjrFilmstripInView = i; - } catch (e) { - console.debug?.(e); - } - if (i && (Fr(e), Ir(e)), i && r.intersectionRatio >= Ar && t && n ? Lr(e) : Rr(e), !i) { - Fr(e); - try { - e._mjrFilmstripReleaseTimer = setTimeout(() => { - try { - if (!e.isConnected) { - zr(e, { releaseSrc: !0 }); - return; - } - e._mjrFilmstripInView || zr(e, { releaseSrc: !0 }); - } catch (e) { - console.debug?.(e); - } - }, Mr); - } catch (e) { - console.debug?.(e); - } - } - } - }, { - root: i, - rootMargin: jr, - threshold: [0, Ar] - }); - } catch { - return null; - } - }, f = (e) => { - if (e) { - try { - e._mjrFilmstripInView = !1; - } catch (e) { - console.debug?.(e); - } - c.add(e); - try { - s ||= d(), s?.observe?.(e); - } catch (e) { - console.debug?.(e); - } - } - }, p = ({ releaseSrc: e = !1 } = {}) => { - for (let t of Array.from(c)) zr(t, { releaseSrc: e }); - }, m = () => { - for (let e of Array.from(c)) try { - if (!e?._mjrFilmstripInView || !e?.isConnected) continue; - Ir(e), Lr(e); - } catch (e) { - console.debug?.(e); - } - }, h = ({ releaseSrc: e = !0 } = {}) => { - try { - s?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - s = null, p({ releaseSrc: e }), c.clear(); - }, g = () => { - try { - return !!window?.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches; - } catch { - return !1; - } - }, _ = (e, t = 1.08) => { - if (e && !g()) { - try { - e._mjrFilmstripBounce?.cancel?.(); - } catch (e) { - console.debug?.(e); - } - try { - if (typeof e.animate != "function") return; - let n = Math.min(1.18, t + .07), r = Math.max(1, t - .03), i = e.animate([ - { transform: `scale(${t})` }, - { transform: `scale(${n})` }, - { transform: `scale(${r})` }, - { transform: `scale(${t})` } - ], { - duration: 420, - easing: "cubic-bezier(0.22, 0.9, 0.32, 1.15)" - }); - e._mjrFilmstripBounce = i, i.onfinish = () => { - try { - e._mjrFilmstripBounce === i && (e._mjrFilmstripBounce = null); - } catch (e) { - console.debug?.(e); - } - }; - } catch (e) { - console.debug?.(e); - } - } - }, v = (e, n) => { - let r = document.createElement("div"); - r.className = "mjr-filmstrip-item", r.dataset.fidx = String(n), r._mjrAsset = e, r.style.cssText = ` - position: relative; - width: ${Dr}px; - height: ${Or}px; - border-radius: 14px; - overflow: hidden; - cursor: pointer; - flex-shrink: 0; - border: 2px solid transparent; - box-sizing: border-box; - background: rgba(255,255,255,0.06); - opacity: 0.58; - transform: scale(1); - transition: border-color 0.16s ease, opacity 0.16s ease, transform 0.18s ease, box-shadow 0.18s ease, filter 0.18s ease; - `; - let a = String(e?.kind || "").toLowerCase(), o = t(e); - if (o && a === "video") { - let e = document.createElement("video"); - e.className = "mjr-filmstrip-thumb", e.muted = !0, e.loop = !0, e.autoplay = !0, e.controls = !1, e.playsInline = !0, e.preload = "none", e.dataset.lazySrc = o, e.style.cssText = "\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n pointer-events: none;\n "; - try { - e.disablePictureInPicture = !0; - } catch (e) { - console.debug?.(e); - } - return e.addEventListener("loadeddata", () => { - try { - e._mjrFilmstripInView && i.style.display !== "none" && !document.hidden && Lr(e); - } catch (e) { - console.debug?.(e); - } - }, { passive: !0 }), e.addEventListener("error", () => { - try { - e.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - zr(e, { releaseSrc: !0 }), y(r); - }, { once: !0 }), r.appendChild(e), S(r), f(e), r; - } - if (a === "audio") { - let t = String(e?.thumbnail_url || e?.thumb_url || "").trim(); - if (t) { - let n = document.createElement("img"); - n.className = "mjr-filmstrip-thumb", n.loading = "lazy", n.decoding = "async", n.src = t, n.alt = String(e?.filename || "Audio"), n.draggable = !1, n.style.cssText = "\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n pointer-events: none;\n ", n.addEventListener("error", () => { - try { - n.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - b(r); - }, { once: !0 }), r.appendChild(n); - } else b(r); - return T(r), r; - } - if (a === "model3d") { - let n = (() => { - try { - let n = String(e?.filename || "").trim(); - if (!n) return ""; - let r = n + ".png", i = String(e?.subfolder || "").trim(), a = String(e?.type || "output").trim(); - return e?.root_id ? t({ - ...e, - filename: r, - kind: "image" - }) : E(r, i || null, a); - } catch { - return ""; - } - })(); - if (n) { - let t = document.createElement("img"); - t.className = "mjr-filmstrip-thumb", t.loading = "lazy", t.decoding = "async", t.src = n, t.alt = String(e?.filename || "3D Model"), t.draggable = !1, t.style.cssText = "\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n pointer-events: none;\n ", t.addEventListener("error", () => { - try { - t.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - C(r); - }, { once: !0 }), r.appendChild(t); - } else C(r); - return w(r), r; - } - if (o) { - let e = document.createElement("img"); - return e.className = "mjr-filmstrip-thumb", e.loading = "lazy", e.decoding = "async", e.src = o, e.style.cssText = "\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n pointer-events: none;\n ", e.addEventListener("error", () => { - try { - e.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - }, { once: !0 }), r.appendChild(e), r; - } - return x(r), r; - }; - function y(e) { - let t = document.createElement("div"); - t.style.cssText = "\n position: absolute; inset: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 10px; font-weight: 700;\n color: rgba(255,255,255,0.55);\n pointer-events: none;\n letter-spacing: 0.04em;\n ", t.textContent = "VIDEO"; - try { - e.appendChild(t); - } catch (e) { - console.debug?.(e); - } - } - function b(e) { - let t = document.createElement("div"); - t.className = "mjr-filmstrip-audio-thumb"; - let n = document.createElement("span"); - n.className = "mjr-filmstrip-audio-label", n.textContent = "AUDIO", Pr(t, e?._mjrAsset?.filename || e?.dataset?.mjrId || "audio"), t.appendChild(n); - try { - e.appendChild(t); - } catch (e) { - console.debug?.(e); - } - } - function x(e) { - let t = document.createElement("div"); - t.style.cssText = "\n position: absolute; inset: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 18px; color: rgba(255,255,255,0.25);\n pointer-events: none;\n ", t.textContent = "?"; - try { - e.appendChild(t); - } catch (e) { - console.debug?.(e); - } - } - function S(e) { - let t = document.createElement("div"); - t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(255,255,255,0.85);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n ", t.textContent = "VID", e.appendChild(t); - } - function C(e) { - let t = document.createElement("div"); - t.style.cssText = "\n position: absolute; inset: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 10px; font-weight: 700;\n color: rgba(76, 175, 80, 0.7);\n pointer-events: none;\n letter-spacing: 0.04em;\n ", t.textContent = "3D"; - try { - e.appendChild(t); - } catch (e) { - console.debug?.(e); - } - } - function w(e) { - let t = document.createElement("div"); - t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(76, 175, 80, 0.95);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n font-weight: 700;\n ", t.textContent = "3D", e.appendChild(t); - } - function T(e) { - let t = document.createElement("div"); - t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(255,255,255,0.85);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n ", t.textContent = "AUD", e.appendChild(t); - } - let D = () => { - h({ releaseSrc: !0 }), a.innerHTML = "", o = []; - let t = Array.isArray(e.assets) ? e.assets : []; - if (t.length < 2) i.style.display = "none"; - else { - i.style.display = ""; - for (let e = 0; e < t.length; e++) { - let n = v(t[e], e); - a.appendChild(n), o.push(n); - } - k(!1); - } - }, O = (t = {}) => { - let n = t.isSingle !== !1, a = r != null && e.compareAsset != null, o = Array.isArray(e.assets) ? e.assets : []; - !n && !a || o.length < 2 ? (i.style.display = "none", p({ releaseSrc: !1 })) : (i.style.display = "", m(), k(!0)); - }; - function k(t) { - let n = Number(e.currentIndex) || 0, a = -1; - r && e.compareAsset != null && (a = (Array.isArray(e.assets) ? e.assets : []).indexOf(e.compareAsset)); - for (let e = 0; e < o.length; e++) e === n ? (o[e].style.borderColor = "rgba(255, 255, 255, 0.98)", o[e].style.opacity = "1", o[e].style.transform = "scale(1.08)", o[e].style.filter = "saturate(1.12) brightness(1.08)", o[e].style.boxShadow = "0 0 0 1px rgba(255,255,255,0.45), 0 0 18px rgba(160,220,255,0.38), 0 8px 16px rgba(0,0,0,0.38)") : e === a ? (o[e].style.borderColor = "rgba(120, 186, 255, 0.98)", o[e].style.opacity = "0.96", o[e].style.transform = "scale(1.04)", o[e].style.filter = "saturate(1.07) brightness(1.03)", o[e].style.boxShadow = "0 0 0 1px rgba(120,186,255,0.38), 0 0 14px rgba(120,186,255,0.32), 0 6px 14px rgba(0,0,0,0.32)") : (o[e].style.borderColor = "transparent", o[e].style.opacity = "0.5", o[e].style.transform = "scale(1)", o[e].style.filter = "none", o[e].style.boxShadow = "none"); - n !== l && o[n] && _(o[n], 1.08), a >= 0 && a !== u && o[a] && _(o[a], 1.04), l = n, u = a; - let s = o[n]; - if (s) try { - s.scrollIntoView({ - behavior: t ? "smooth" : "instant", - block: "nearest", - inline: "center" - }); - } catch { - try { - let e = s.offsetLeft - i.clientWidth / 2 + s.offsetWidth / 2; - i.scrollTo({ - left: Math.max(0, e), - behavior: t ? "smooth" : "instant" - }); - } catch (e) { - console.debug?.(e); - } - } - } - return i.addEventListener("click", (t) => { - try { - t.stopPropagation(); - let i = t.target.closest("[data-fidx]"); - if (!i) return; - let a = Number(i.dataset.fidx); - if (!Number.isFinite(a) || a < 0 || a >= (Array.isArray(e.assets) ? e.assets : []).length) return; - r && (t.ctrlKey || t.metaKey) ? r(a) : n(a); - } catch (e) { - console.debug?.(e); - } - }, !0), i.addEventListener("wheel", (e) => { - try { - e.stopPropagation(); - } catch (e) { - console.debug?.(e); - } - }, { - passive: !0, - capture: !0 - }), { - el: i, - rebuild: D, - sync: O - }; -} -// ui/features/viewer/viewerShell.ts -function Vr() { - let e = document.createElement("div"); - return e.className = "mjr-viewer-overlay mjr-assets-manager", e.style.cssText = "\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(180deg, rgba(6, 8, 12, 0.94), rgba(5, 7, 10, 0.985));\n z-index: 10000;\n pointer-events: auto;\n display: none;\n flex-direction: column;\n box-sizing: border-box;\n overflow: hidden;\n ", e.tabIndex = -1, e.setAttribute("role", "dialog"), e; -} -function Hr({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { - let i = document.createElement("div"); - i.className = "mjr-viewer-content-row", i.style.cssText = "\n flex: 1;\n display: flex;\n min-height: 0;\n overflow: hidden;\n min-width: 0;\n "; - let a = document.createElement("div"); - a.className = "mjr-viewer-content", a.style.cssText = "\n flex: 1;\n min-width: 0;\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n isolation: isolate;\n "; - let o = document.createElement("div"); - o.className = "mjr-viewer-single", o.style.cssText = "\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n "; - let s = document.createElement("div"); - s.className = "mjr-viewer-ab", s.style.cssText = "\n width: 100%;\n height: 100%;\n display: none;\n position: relative;\n "; - let c = document.createElement("div"); - c.className = "mjr-viewer-sidebyside", c.style.cssText = "\n width: 100%;\n height: 100%;\n display: none;\n flex-direction: row;\n gap: 2px;\n ", a.appendChild(o), a.appendChild(s), a.appendChild(c); - let l = document.createElement("div"); - l.className = "mjr-viewer-overlay-layer", l.style.cssText = "\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 50;\n "; - let u = document.createElement("canvas"); - u.className = "mjr-viewer-grid-canvas", u.style.cssText = "\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n display: none;\n "; - let d = document.createElement("div"); - d.className = "mjr-viewer-probe", d.style.cssText = "\n position: absolute;\n display: none;\n padding: 7px 10px;\n border-radius: 10px;\n background: rgba(11, 14, 19, 0.78);\n border: 1px solid rgba(255, 255, 255, 0.12);\n color: rgba(255, 255, 255, 0.92);\n font-size: 11px;\n line-height: 1.2;\n white-space: pre;\n max-width: 280px;\n transform: translate3d(0,0,0);\n box-shadow: 0 18px 34px rgba(0,0,0,0.28);\n "; - let f = document.createElement("div"); - f.className = "mjr-viewer-loupe", f.style.cssText = "\n position: absolute;\n display: none;\n width: 120px;\n height: 120px;\n border-radius: 14px;\n overflow: hidden;\n border: 1px solid rgba(255,255,255,0.14);\n box-shadow: 0 18px 34px rgba(0,0,0,0.34);\n background: rgba(9,12,16,0.72);\n transform: translate3d(0,0,0);\n "; - let p = document.createElement("canvas"); - p.width = 120, p.height = 120, p.style.cssText = "width:100%; height:100%; display:block; image-rendering: pixelated;", f.appendChild(p), l.appendChild(u), l.appendChild(d), l.appendChild(f), a.appendChild(l); - let m = document.createElement("div"); - m.className = "mjr-viewer-geninfo mjr-viewer-geninfo--right", m.style.cssText = ` - position: absolute; - top: 16px; - right: 16px; - bottom: 16px; - width: ${Cr}; - display: none; - flex-direction: column; - overflow: hidden; - background: rgba(12, 15, 20, 0.9); - border-left: 1px solid rgba(255,255,255,0.12); - pointer-events: auto; - backdrop-filter: blur(10px); - z-index: 10001; - `; - let h = document.createElement("div"); - h.style.cssText = "\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 10px 12px;\n border-bottom: 1px solid rgba(255,255,255,0.10);\n color: rgba(255,255,255,0.92);\n "; - let g = document.createElement("div"); - g.textContent = "Generation Info", g.style.cssText = "font-size: 13px; font-weight: 600;", h.appendChild(g); - let _ = document.createElement("div"); - _.style.cssText = "\n flex: 1;\n overflow: auto;\n padding: 14px;\n color: rgba(255,255,255,0.92);\n ", m.appendChild(h), m.appendChild(_); - let v = document.createElement("div"); - v.className = "mjr-viewer-geninfo mjr-viewer-geninfo--left", v.style.cssText = ` - position: absolute; - top: 16px; - left: 16px; - bottom: 16px; - width: ${Cr}; - display: none; - flex-direction: column; - overflow: hidden; - background: rgba(12, 15, 20, 0.9); - border-right: 1px solid rgba(255,255,255,0.12); - pointer-events: auto; - backdrop-filter: blur(10px); - z-index: 10001; - `; - let y = h.cloneNode(!0); - y.replaceChildren(); - let b = document.createElement("div"); - b.textContent = "Generation Info (A)", b.style.cssText = "font-size: 13px; font-weight: 600;", y.appendChild(b); - let x = document.createElement("div"); - x.style.cssText = "\n flex: 1;\n overflow: auto;\n padding: 14px;\n color: rgba(255,255,255,0.92);\n ", v.appendChild(y), v.appendChild(x), i.appendChild(a); - let S = document.createElement("div"); - S.className = "mjr-viewer-footer", S.style.cssText = "\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: rgba(13, 16, 22, 0.78);\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n color: white;\n gap: 14px 20px;\n flex-wrap: wrap;\n "; - let C = Ln("<", "Previous (Left Arrow)"); - C.classList.add("mjr-viewer-nav-btn", "mjr-viewer-nav-btn--prev"), C.style.fontSize = "24px"; - let w = document.createElement("span"); - w.className = "mjr-viewer-index", w.style.cssText = "font-size: 14px; font-weight: 500;"; - let T = Ln(">", "Next (Right Arrow)"); - T.classList.add("mjr-viewer-nav-btn", "mjr-viewer-nav-btn--next"), T.style.fontSize = "24px"; - let E = document.createElement("div"); - E.className = "mjr-viewer-nav", E.style.cssText = "display:flex; align-items:center; gap:20px;", E.appendChild(C), E.appendChild(w), E.appendChild(T); - let D = document.createElement("div"); - return D.className = "mjr-viewer-playerbar", D.style.cssText = "display:none; width: 100%;", S.appendChild(E), S.appendChild(D), { - contentRow: i, - content: a, - singleView: o, - abView: s, - sideView: c, - overlayLayer: l, - gridCanvas: u, - probeTooltip: d, - loupeWrap: f, - loupeCanvas: p, - genInfoOverlay: m, - genInfoTitle: g, - genInfoBody: _, - genInfoOverlayLeft: v, - genInfoTitleLeft: b, - genInfoBodyLeft: x, - footer: S, - prevBtn: C, - indexInfo: w, - nextBtn: T, - navBar: E, - playerBarHost: D, - filmstrip: Br({ - state: e, - buildAssetViewURL: t, - onNavigate: n, - onCompare: r - }) - }; -} -// ui/features/viewer/viewerOverlayDismiss.ts -function Ur({ overlay: e, requestClose: t }) { - try { - let n = null; - e.addEventListener("pointerdown", (e) => { - e.isPrimary !== !1 && (n = { - x: e.clientX, - y: e.clientY, - t: Date.now() - }); - }, { - capture: !0, - passive: !0 - }), e.addEventListener("click", (e) => { - try { - if (e.defaultPrevented || e.button !== 0) return; - if (n) { - let t = e.clientX - n.x, r = e.clientY - n.y; - if (Math.hypot(t, r) > 6 || Date.now() - n.t > 600) return; - } - let r = e.target; - if (dt(r, ".mjr-viewer-header") || dt(r, ".mjr-viewer-footer") || dt(r, ".mjr-viewer-geninfo") || dt(r, ".mjr-video-controls") || dt(r, ".mjr-context-menu") || dt(r, ".mjr-ab-slider") || dt(r, ".mjr-viewer-loupe") || dt(r, ".mjr-viewer-probe") || dt(r, ".mjr-viewer-media") || r && (r.tagName === "IMG" || r.tagName === "VIDEO" || r.tagName === "CANVAS")) return; - t?.(); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } -} -// ui/components/ViewerRuntime.ts -var Wr = null, Gr = null, Kr = null, qr = null, Jr = null, Yr = null; -function Xr() { - Wr || import("./abCompare-BUrGm4-x.js").then((e) => { - Wr = e; - }), Gr || import("./sideBySide-Dahw1GfU.js").then((e) => { - Gr = e; - }), Kr || import("./model3dRenderer-BnFOXFbn.js").then((e) => e.t).then((e) => { - Kr = e; - }), qr || import("./scopes-bvTRS68K.js").then((e) => { - qr = e; - }), Jr || import("./genInfo-DD23-sz2.js").then((e) => e.n).then((e) => { - Jr = e; - }), Yr || import("./frameExport-CnNO7oN6.js").then((e) => { - Yr = e; - }); -} -var $ = { - SINGLE: "single", - AB_COMPARE: "ab", - SIDE_BY_SIDE: "sidebyside" -}; -function Zr() { - Xr(), Er(); - let t = Vr(), r = In(t), a = r.unsubs || [], o = te(); - o.mode = $.SINGLE; - try { - let e = Nn(); - e && typeof e == "object" && (typeof e.analysisMode == "string" && (o.analysisMode = e.analysisMode || "none"), typeof e.loupeEnabled == "boolean" && (o.loupeEnabled = e.loupeEnabled), typeof e.probeEnabled == "boolean" && (o.probeEnabled = e.probeEnabled), typeof e.hudEnabled == "boolean" && (o.hudEnabled = e.hudEnabled), typeof e.genInfoOpen == "boolean" && (o.genInfoOpen = e.genInfoOpen), typeof e.audioVisualizerMode == "string" && (o.audioVisualizerMode = e.audioVisualizerMode || "artistic"), typeof e.abWipePercent == "number" && Number.isFinite(e.abWipePercent) && e.abWipePercent >= 0 && e.abWipePercent <= 100 && (o._abWipePercent = e.abWipePercent)); - } catch (e) { - console.debug?.(e); - } - let c = /* @__PURE__ */ new Set([ - "png", - "jpg", - "jpeg", - "webp", - "gif", - "bmp", - "tiff", - "avif", - "jxl", - "heic", - "hdr", - "svg", - "apng" - ]), u = null, d = null; - function m() { - try { - return u?.mediaTransform?.() || ""; - } catch { - return ""; - } - } - function h() { - try { - u?.clampPanToBounds?.(); - } catch (e) { - console.debug?.(e); - } - } - function g() { - try { - u?.applyTransform?.(); - } catch (e) { - console.debug?.(e); - } - } - function _(e, t) { - try { - u?.setZoom?.(e, t); - } catch (e) { - console.debug?.(e); - } - } - function v() { - try { - u?.updatePanCursor?.(); - } catch (e) { - console.debug?.(e); - } - } - function y() { - try { - return u?.getPrimaryMedia?.() || null; - } catch { - return null; - } - } - function x(e) { - try { - return u?.getMediaNaturalSize?.(e) || { - w: 0, - h: 0 - }; - } catch { - return { - w: 0, - h: 0 - }; - } - } - function S() { - try { - return u?.getViewportRect?.() || null; - } catch { - return null; - } - } - function E() { - try { - return u?.computeOneToOneZoom?.() ?? null; - } catch { - return null; - } - } - function D() { - try { - u?.updateMediaNaturalSize?.(); - } catch (e) { - console.debug?.(e); - } - } - function A(e, t) { - try { - return d?.createMediaElement?.(e, t) || document.createElement("div"); - } catch { - return document.createElement("div"); - } - } - function j(e, t) { - try { - return d?.createCompareMediaElement?.(e, t) || document.createElement("div"); - } catch { - return document.createElement("div"); - } - } - function M() { - let e = !1; - try { - let t = o.mode === $.AB_COMPARE ? V : o.mode === $.SIDE_BY_SIDE ? H : B, n = Array.from(t?.querySelectorAll?.(".mjr-viewer-audio-viz") || []); - for (let t of n) try { - let n = t?._mjrProc || null; - if (!n?.setMode) continue; - n.setMode(o.audioVisualizerMode), e = !0; - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - return e; - } - let N = null, ee = () => Tt(), P = document.createElement("div"); - P.className = "mjr-viewer-header", P.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 20px;\n background: var(--mjr-surface-0, rgba(0, 0, 0, 0.8));\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n color: white;\n box-sizing: border-box;\n "; - let F = document.createElement("span"); - F.className = "mjr-viewer-filename", F.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;"; - let ne = document.createElement("div"); - ne.className = "mjr-viewer-badges", ne.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap;"; - let re = null, ie = null, ae = null, oe = null, se = null, le = null, I = null, L = null, ue = null, de = null, R = null; - try { - P.appendChild(F), P.appendChild(ne); - } catch (e) { - console.debug?.(e); - } - try { - N = Un({ - VIEWER_MODES: $, - state: o, - lifecycle: r, - getCanAB: () => Xe(), - onToggleFullscreen: () => { - try { - if (document.fullscreenElement) try { - document.exitFullscreen(); - } catch (e) { - console.debug?.(e); - } - else try { - t.requestFullscreen(); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, - onClose: () => ee?.(), - onMode: (e) => { - try { - if (e === $.AB_COMPARE && !Xe() || e === $.SIDE_BY_SIDE && !Y()) return; - o.mode = e, Qe(); - try { - N?.syncToolsUIFromState?.(); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, - onZoomIn: () => { - try { - _((Number(o.zoom) || 1) + .25, { - clientX: o._lastPointerX, - clientY: o._lastPointerY - }); - } catch (e) { - console.debug?.(e); - } - }, - onZoomOut: () => { - try { - _((Number(o.zoom) || 1) - .25, { - clientX: o._lastPointerX, - clientY: o._lastPointerY - }); - } catch (e) { - console.debug?.(e); - } - }, - onZoomReset: () => { - try { - _(1); - } catch (e) { - console.debug?.(e); - } - }, - onZoomOneToOne: () => { - try { - let e = () => { - let e = E(); - return e != null && (_(Math.abs((Number(o.zoom) || 1) - e) < .01 ? 1 : e, { - clientX: o._lastPointerX, - clientY: o._lastPointerY - }), !0); - }; - if (e()) return; - try { - requestAnimationFrame(() => { - try { - D(); - } catch (e) { - console.debug?.(e); - } - try { - e(); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, - onCompareModeChanged: () => { - try { - o.mode === $.AB_COMPARE && (et(), st()); - } catch (e) { - console.debug?.(e); - } - }, - onExportFrame: () => { - try { - Je({ toClipboard: !1 }); - } catch (e) { - console.debug?.(e); - } - }, - onCopyFrame: () => { - try { - Je({ toClipboard: !0 }); - } catch (e) { - console.debug?.(e); - } - }, - onAudioVizModeChanged: () => { - try { - let e = o.assets[o.currentIndex]; - if (String(e?.kind || "") !== "audio") return; - M() || (et(), st()); - } catch (e) { - console.debug?.(e); - } - }, - onToolsChanged: () => { - try { - N?.syncToolsUIFromState?.(); - } catch (e) { - console.debug?.(e); - } - try { - Pn(o); - } catch (e) { - console.debug?.(e); - } - try { - Ze(); - } catch (e) { - console.debug?.(e); - } - try { - if (o.mode === $.AB_COMPARE) { - let e = String(o.abCompareMode || "wipe"); - e !== "wipe" && e !== "wipeV" && V?._mjrDiffRequest?.(); - } - } catch (e) { - console.debug?.(e); - } - try { - o.probeEnabled || (me.style.display = "none"); - } catch (e) { - console.debug?.(e); - } - try { - o.loupeEnabled || (he.style.display = "none"); - } catch (e) { - console.debug?.(e); - } - try { - J(); - } catch (e) { - console.debug?.(e); - } - try { - ht?.(); - } catch (e) { - console.debug?.(e); - } - try { - Ke(); - } catch (e) { - console.debug?.(e); - } - } - }), N?.headerEl && (P = N.headerEl), N?.headerTopEl && (R = N.headerTopEl), N?.filenameEl && (F = N.filenameEl), N?.badgesBarEl && (ne = N.badgesBarEl), N?.filenameRightEl && (re = N.filenameRightEl), N?.badgesBarRightEl && (ie = N.badgesBarRightEl), N?.leftAreaEl && (se = N.leftAreaEl), N?.leftMetaEl && (le = N.leftMetaEl), N?.centerAreaEl && (I = N.centerAreaEl), N?.rightMetaEl && (ae = N.rightMetaEl), N?.rightAreaEl && (oe = N.rightAreaEl), N?.titleLineEl && (L = N.titleLineEl), N?.titleWrapEl && (ue = N.titleWrapEl), N?.modeButtonsEl && (de = N.modeButtonsEl); - } catch (e) { - console.debug?.(e); - } - let { contentRow: z, content: fe, singleView: B, abView: V, sideView: H, overlayLayer: pe, gridCanvas: U, probeTooltip: me, loupeWrap: he, loupeCanvas: ge, genInfoOverlay: _e, genInfoTitle: W, genInfoBody: G, genInfoOverlayLeft: K, genInfoTitleLeft: ve, genInfoBodyLeft: ye, footer: q, prevBtn: be, indexInfo: xe, nextBtn: Se, navBar: Ce, playerBarHost: we, filmstrip: Te } = Hr({ - state: o, - buildAssetViewURL: O, - onNavigate: (e) => { - try { - o.compareAsset != null && (o.compareAsset = null, o.mode = $.SINGLE), o.currentIndex = e, Qe(); - } catch (e) { - console.debug?.(e); - } - }, - onCompare: (e) => { - try { - let t = Array.isArray(o.assets) ? o.assets : [], n = t[e]; - if (!n || n === t[o.currentIndex]) return; - if (n === o.compareAsset) { - o.compareAsset = null, o.mode = $.SINGLE, Qe(); - return; - } - t.length === 2 ? (o.compareAsset = t[1 - o.currentIndex], o.mode = De() ? $.SIDE_BY_SIDE : $.AB_COMPARE) : (o.compareAsset = n, o.mode = Y() ? $.SIDE_BY_SIDE : $.AB_COMPARE), Qe(); - } catch (e) { - console.debug?.(e); - } - } - }); - t.appendChild(P), t.appendChild(z); - function Ee() { - try { - if (o.compareAsset) return o.compareAsset; - let e = Array.isArray(o.assets) ? o.assets : []; - if (e.length === 2) return e[1 - (o.currentIndex || 0)] || null; - } catch (e) { - console.debug?.(e); - } - return null; - } - function De() { - try { - let e = o.assets?.[o.currentIndex] || null; - return (Kr?.isModel3DAsset?.(e) ?? !1) || (Kr?.isModel3DAsset?.(Ee()) ?? !1); - } catch (e) { - console.debug?.(e); - } - return !1; - } - t.appendChild(Te.el), t.appendChild(q), t.appendChild(_e), t.appendChild(K), Ur({ - overlay: t, - requestClose: () => ee() - }); - let Oe = Zn({ - state: o, - VIEWER_MODES: $, - APP_CONFIG: T, - getAssetMetadata: s, - getAssetsBatch: n - }), ke = 3e5, Ae = /* @__PURE__ */ new Map(), je = () => { - try { - let e = Date.now(); - for (let [t, n] of Ae.entries()) { - let r = Number(n?.at) || 0; - (!r || e - r > ke) && Ae.delete(t); - } - if (Ae.size <= 256) return; - let t = Array.from(Ae.entries()).sort((e, t) => (Number(e?.[1]?.at) || 0) - (Number(t?.[1]?.at) || 0)), n = Ae.size - 256; - for (let e = 0; e < n; e += 1) { - let n = t?.[e]?.[0]; - n != null && Ae.delete(n); - } - } catch (e) { - console.debug?.(e); - } - }, Me = (e) => { - try { - let t = String(e ?? ""); - if (!t) return null; - let n = Ae.get(t); - if (!n || typeof n != "object") return null; - let r = Number(n?.at) || 0; - return !r || Date.now() - r > ke ? (Ae.delete(t), null) : n?.data || null; - } catch { - return null; - } - }, Ne = (e, t) => { - try { - let n = String(e ?? ""); - if (!n || !t) return; - Ae.set(n, { - data: t, - at: Date.now() - }), je(); - } catch (e) { - console.debug?.(e); - } - }, Pe = async () => { - try { - await Oe?.hydrateVisibleMetadata?.(); - } catch (e) { - console.debug?.(e); - } - }; - try { - u = $n({ - overlay: t, - content: fe, - singleView: B, - abView: V, - sideView: H, - state: o, - VIEWER_MODES: $, - scheduleOverlayRedraw: J, - lifecycle: r - }); - } catch { - u = null; - } - let Fe = (e, t, n) => { - try { - e.clearRect(0, 0, t, n); - } catch (e) { - console.debug?.(e); - } - }, Ie = null; - function J(e) { - try { - if (t.style.display === "none") return; - if (e === !0) { - Ie != null && (cancelAnimationFrame(Ie), Ie = null); - try { - Re(); - } catch (e) { - console.debug?.(e); - } - return; - } - if (Ie != null) return; - Ie = requestAnimationFrame(() => { - Ie = null; - try { - Re(); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - } - let Le = Jn({ - gridCanvas: U, - content: fe, - state: o, - VIEWER_MODES: $, - getPrimaryMedia: () => { - try { - if (o?.mode === $.SINGLE) return B?.querySelector?.(".mjr-viewer-media") || null; - if (o?.mode === $.AB_COMPARE) return V?.querySelector?.(".mjr-viewer-media") || null; - if (o?.mode === $.SIDE_BY_SIDE) return H?.querySelector?.(".mjr-viewer-media") || null; - } catch (e) { - console.debug?.(e); - } - return null; - }, - getViewportRect: S, - clearCanvas: Fe - }), Re = () => { - let e = (() => { - try { - let e = Number(o?._panHintAt) || 0; - return e > 0 && Date.now() - e < 900; - } catch { - return !1; - } - })(); - try { - let t = o?.mode === $.SINGLE && !!o?.hudEnabled, n = String(o?.scopesMode || "off") !== "off", r = !!o?.overlayMaskEnabled; - U.style.display = o.gridMode === 0 && !r && !e && !t && !n ? "none" : ""; - } catch (e) { - console.debug?.(e); - } - let n = Le.ensureCanvasSize(); - if (n.w > 0 && n.h > 0) { - if ((() => { - let e = o?.mode === $.SINGLE && !!o?.hudEnabled; - return (Number(o.gridMode) || 0) !== 0 || !!o?.overlayMaskEnabled || e; - })()) Le.redrawGrid(n); - else try { - let e = U.getContext("2d"); - e && Fe(e, n.w, n.h); - } catch (e) { - console.debug?.(e); - } - if (e) try { - let e = U.getContext("2d"); - if (e) { - let t = fe?.getBoundingClientRect?.(), r = Number(o?._panHintX), i = Number(o?._panHintY), a = t && Number.isFinite(r) ? r - t.left : n.w / 2, s = t && Number.isFinite(i) ? i - t.top : n.h * .78, c = Math.max(10, Math.min(n.w - 10, a)), l = Math.max(10, Math.min(n.h - 10, s)); - e.save(), e.font = "12px var(--comfy-font, ui-sans-serif, system-ui)", e.textAlign = "center", e.textBaseline = "middle"; - let u = "Zoom in to pan", d = e.measureText(u), f = Math.min(n.w - 20, Math.max(140, d.width + 26)); - e.fillStyle = "rgba(0,0,0,0.65)", e.strokeStyle = "rgba(255,255,255,0.18)", e.lineWidth = 1, e.beginPath(); - let p = c - f / 2, m = l - 13; - e.moveTo(p + 10, m), e.arcTo(p + f, m, p + f, m + 26, 10), e.arcTo(p + f, m + 26, p, m + 26, 10), e.arcTo(p, m + 26, p, m, 10), e.arcTo(p, m, p + f, m, 10), e.closePath(), e.fill(), e.stroke(), e.fillStyle = "rgba(255,255,255,0.92)", e.fillText(u, c, l), e.restore(); - } - } catch (e) { - console.debug?.(e); - } - try { - let e = String(o?.scopesMode || "off"); - if (e !== "off") { - let r = U.getContext("2d"); - if (r) { - let i = B; - o?.mode === $.AB_COMPARE ? i = V : o?.mode === $.SIDE_BY_SIDE && (i = H); - let a = i?.querySelector?.("canvas.mjr-viewer-media") || t?.querySelector?.("canvas.mjr-viewer-media"); - a && a instanceof HTMLCanvasElement && qr?.drawScopesLight?.(r, { - w: n.w, - h: n.h - }, a, { - mode: e, - channel: o?.channel - }); - } - } - } catch (e) { - console.debug?.(e); - } - if (o.mode !== $.SINGLE) { - try { - me.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - try { - he.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - } - } - }, ze = (e) => { - if (e) { - try { - for (let t of Array.from(e.childNodes || [])) try { - t?._mjrDispose?.(); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - try { - e.replaceChildren(); - } catch (e) { - console.debug?.(e); - } - } - }, Be = () => { - try { - o._genInfoAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - o._genInfoAbort = null; - try { - o._genInfoReqId = (Number(o._genInfoReqId) || 0) + 1; - } catch (e) { - console.debug?.(e); - } - }, Ve = async (e, { signal: t } = {}) => { - try { - return await Jr?.ensureViewerMetadataAsset?.(e, { - getAssetMetadata: s, - getFileMetadataScoped: p, - metadataCache: Oe, - signal: t - }); - } catch { - return e; - } - }, He = (e) => { - try { - if (!e || typeof e != "object" || e?.geninfo || e?.prompt || e?.workflow || e?.metadata) return !1; - if (String(e?.mime || e?.mimetype || e?.type || "").toLowerCase().startsWith("video/")) return !0; - let t = String(e?.filepath || e?.path || e?.filename || e?.name || "").toLowerCase().split(".").pop() || ""; - return [ - "mp4", - "webm", - "mov", - "mkv", - "avi", - "m4v", - "gif" - ].includes(t), !0; - } catch { - return !1; - } - }, Ue = (e) => { - try { - if (!e || typeof e != "object") return ""; - if (e.id != null) return `id:${e.id}`; - let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - if (t) return `fp:${t}`; - let n = String(e.source || e.type || "output").trim().toLowerCase(), r = String(e.subfolder || e?.file_info?.subfolder || "").trim(), i = String(e.filename || e.name || e?.file_info?.filename || "").trim(); - return i ? `file:${n}:${r}:${i}` : ""; - } catch { - return ""; - } - }, We = () => { - try { - return !!(G?.childNodes?.length || ye?.childNodes?.length); - } catch { - return !1; - } - }, Ke = async () => { - let e = Xe(), n = Y(), r = o.mode, i = !!o?.genInfoOpen && !o?.distractionFree, a = o?.assets?.[o?.currentIndex] || null, s = i && (r === $.AB_COMPARE && e || r === $.SIDE_BY_SIDE && n), c = s && r === $.SIDE_BY_SIDE && !o?.compareAsset && (o?.assets?.length ?? 0) > 2; - try { - if (_e.style.display = i ? "flex" : "none", K.style.display = s ? "flex" : "none", t.style.paddingRight = i ? wr : "0px", t.style.paddingLeft = s ? wr : "0px", !i) { - Be(); - try { - o._genInfoRenderSignature = ""; - } catch (e) { - console.debug?.(e); - } - try { - ze(G); - } catch (e) { - console.debug?.(e); - } - try { - ze(ye); - } catch (e) { - console.debug?.(e); - } - return; - } - } catch { - return; - } - let l = ""; - try { - let e = Array.isArray(o?.assets) ? o.assets : [], t = o?.compareAsset ? Ue(o.compareAsset) : "", n = e.slice(0, 4).map(Ue).join("|"); - l = [ - "open", - r, - Number(o?.currentIndex) || 0, - Ue(a), - t, - n, - s ? "dual" : "single", - c ? "grid" : "" - ].join("::"); - let i = o?._genInfoAbort?.signal; - if (l && o?._genInfoRenderSignature === l && i && !i.aborted && We()) return; - o._genInfoRenderSignature = l; - } catch (e) { - console.debug?.(e); - } - Be(); - let u = (Number(o?._genInfoReqId) || 0) + 1; - try { - o._genInfoReqId = u; - } catch (e) { - console.debug?.(e); - } - let d = new AbortController(); - o._genInfoAbort = d; - let f = ({ left: e = null, leftExtra: t = null, right: n = null, rightExtra: r = null, single: i = null } = {}) => { - try { - if (o._genInfoReqId !== u) return; - ze(G); - } catch (e) { - console.debug?.(e); - } - try { - if (o._genInfoReqId !== u) return; - ze(ye); - } catch (e) { - console.debug?.(e); - } - if (o._genInfoReqId !== u) return; - let a = () => { - try { - o?.genInfoOpen || (o.genInfoOpen = !0), o._genInfoRenderSignature = "", Ke(); - } catch (e) { - console.debug?.(e); - } - }, l = (e, t, n, r) => { - if (e) try { - try { - let i = Jr?.buildViewerMetadataBlocks?.({ - title: t, - asset: n, - ui: { - loading: !!r, - onRetry: a - } - }); - if (i) { - e.appendChild(i); - return; - } - } catch (e) { - console.debug?.(e); - } - let i = document.createElement("div"); - if (i.style.cssText = "display:flex; flex-direction:column; gap:10px; margin-bottom: 14px;", t) { - let e = document.createElement("div"); - e.textContent = t, e.style.cssText = "font-size: 12px; font-weight: 600; letter-spacing: 0.02em; color: rgba(255,255,255,0.86);", i.appendChild(e); - } - let o = document.createElement("div"); - o.style.cssText = "padding: 10px 12px; border-radius: 10px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.72);", o.textContent = C("viewer.noGenerationDataFile", "No generation data found for this file."), i.appendChild(o); - try { - let e = n?.metadata_raw; - if (e != null) { - let t = document.createElement("details"); - t.style.cssText = "border: 1px solid rgba(255,255,255,0.10); border-radius: 10px; background: rgba(255,255,255,0.04); overflow: hidden;"; - let n = document.createElement("summary"); - n.textContent = C("msg.rawMetadata", "Raw metadata"), n.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; - let r = document.createElement("pre"); - r.style.cssText = "margin:0; padding: 10px 12px; max-height: 280px; overflow:auto; font-size: 11px; line-height: 1.35; color: rgba(255,255,255,0.86);"; - let a = ""; - try { - a = typeof e == "string" ? e : JSON.stringify(e, null, 2); - } catch { - a = String(e); - } - a.length > 4e4 && (a = `${a.slice(0, 4e4)}\n...(truncated)...`), r.textContent = a, t.appendChild(n), t.appendChild(r), i.appendChild(t); - } - } catch (e) { - console.debug?.(e); - } - e.appendChild(i); - } catch (e) { - console.debug?.(e); - } - }; - if (s) { - if (e && (ve.textContent = e.title || "Asset A", l(ye, t ? "Asset A" : "", e.asset, e.loading)), t && l(ye, "Asset C", t.asset, t.loading), n && (W.textContent = n.title || "Asset B", l(G, r ? "Asset B" : "", n.asset, n.loading)), r && l(G, "Asset D", r.asset, r.loading), !c && e?.asset && n?.asset && !e.loading && !n.loading) try { - let t = br(e.asset, n.asset); - t && G.insertBefore(t, G.firstChild || null); - } catch (e) { - console.debug?.(e); - } - } else i && (W.textContent = i.title || "Generation Info", l(G, "", i.asset, i.loading)); - }; - try { - if (!a) { - f({}); - return; - } - let e = null, t = null, n = null, i = null, l = null; - s ? r === $.SIDE_BY_SIDE ? o?.compareAsset ? (e = a, t = o.compareAsset) : (e = o.assets[0] || null, t = o.assets[1] || null, c && (n = o.assets[2] || null, i = o.assets[3] || null)) : (e = a, t = o?.compareAsset || (o.assets.length === 2 ? o.assets[1 - o.currentIndex] : null)) : l = a; - let p = (e) => e ? Oe?.getCached?.(e.id)?.data || e : null; - if (f({ - left: s ? { - title: c ? "Assets A & C" : "Asset A", - asset: p(e), - loading: He(p(e)) - } : null, - leftExtra: c && n ? { - asset: p(n), - loading: He(p(n)) - } : null, - right: s ? { - title: c ? "Assets B & D" : "Asset B", - asset: p(t), - loading: He(p(t)) - } : null, - rightExtra: c && i ? { - asset: p(i), - loading: He(p(i)) - } : null, - single: s ? null : { - title: "Generation Info", - asset: p(l), - loading: He(p(l)) - } - }), o._genInfoReqId !== u) return; - if (s) { - let r = e ? await Ve(e, { signal: d.signal }) : null, a = t ? await Ve(t, { signal: d.signal }) : null, s = n ? await Ve(n, { signal: d.signal }) : null, l = i ? await Ve(i, { signal: d.signal }) : null; - if (o._genInfoReqId !== u) return; - f({ - left: { - title: c ? "Assets A & C" : "Asset A", - asset: r, - loading: !1 - }, - leftExtra: c && s ? { - asset: s, - loading: !1 - } : null, - right: { - title: c ? "Assets B & D" : "Asset B", - asset: a, - loading: !1 - }, - rightExtra: c && l ? { - asset: l, - loading: !1 - } : null - }); - } else { - let e = l ? await Ve(l, { signal: d.signal }) : null; - if (o._genInfoReqId !== u) return; - f({ single: { - title: "Generation Info", - asset: e, - loading: !1 - } }); - } - } catch (e) { - console.debug?.(e); - } - }, qe = null; - function Je(e) { - try { - return !qe && Yr && (qe = Yr.createFrameExporter({ - state: o, - VIEWER_MODES: $, - singleView: B, - abView: V, - sideView: H - })), qe?.exportCurrentFrame?.(e); - } catch (e) { - console.debug?.(e); - } - } - let Ye = () => { - let e = (e) => { - try { - e && e.replaceChildren(); - } catch (e) { - console.debug?.(e); - } - }; - e(ne), e(ie); - let t = (e, { showName: t } = {}) => { - if (!e) return null; - let n = document.createElement("div"); - n.className = "mjr-viewer-asset-pill", n.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n font-size: 12px;\n max-width: 360px;\n overflow: hidden;\n "; - let r = document.createElement("span"); - r.textContent = String(e.filename || ""), r.style.cssText = "max-width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; opacity:0.95;"; - let i = Ge(e.filename, e.kind, !!e?._mjrNameCollision); - try { - i.style.position = "static", i.style.top = "", i.style.left = "", i.style.padding = "2px 6px", i.style.fontSize = "10px", i.style.borderRadius = "6px", i.style.pointerEvents = "none"; - } catch (e) { - console.debug?.(e); - } - let a = $e(e.rating || 0); - if (a) try { - a.style.position = "static", a.style.top = "", a.style.right = "", a.style.padding = "2px 6px", a.style.fontSize = "12px"; - } catch (e) { - console.debug?.(e); - } - let o = it(Array.isArray(e.tags) ? e.tags : []); - if (o) try { - o.style.position = "static", o.style.bottom = "", o.style.left = "", o.style.maxWidth = "220px", o.style.pointerEvents = "none"; - } catch (e) { - console.debug?.(e); - } - n.appendChild(i), t && n.appendChild(r), a && n.appendChild(a), o && o.style.display !== "none" && n.appendChild(o); - try { - e.filepath && (n.title = String(e.filepath)); - } catch (e) { - console.debug?.(e); - } - return n; - }, n = o.mode === $.SINGLE, r = o.mode === $.AB_COMPARE && Xe(), i = o.mode === $.SIDE_BY_SIDE && Y(); - if ((r || i) && ie) { - let e = o.assets?.[o.currentIndex] || null, n = i && o.compareAsset != null, a = r ? o.compareAsset == null ? o.assets?.[0] || null : e : n ? e : o.assets?.[0] || null, s = r ? o.compareAsset == null ? o.assets?.[1] || null : o.compareAsset : n ? o.compareAsset : o.assets?.[Math.max(0, (o.assets?.length || 1) - 1)] || null, c = t(a, { showName: !1 }), l = t(s, { showName: !1 }); - try { - c && ne.appendChild(c); - } catch (e) { - console.debug?.(e); - } - try { - l && ie.appendChild(l); - } catch (e) { - console.debug?.(e); - } - return; - } - let a = n ? [o.assets[o.currentIndex]].filter(Boolean) : Array.isArray(o.assets) ? o.assets.slice(0, 4) : []; - for (let e of a) { - let r = t(e, { showName: !n }); - if (r) try { - ne.appendChild(r); - } catch (e) { - console.debug?.(e); - } - } - }; - function Xe() { - return (o.assets.length === 2 || o.compareAsset != null) && !De(); - } - function Y() { - let e = o.assets.length; - return e >= 2 && e <= 4 || e >= 1 && o.compareAsset != null; - } - function Ze() { - let e = !!o?.distractionFree; - try { - P.style.display = e ? "none" : ""; - } catch (e) { - console.debug?.(e); - } - try { - q.style.display = e ? "none" : ""; - } catch (e) { - console.debug?.(e); - } - try { - t.classList.toggle("mjr-viewer-focus", e); - } catch (e) { - console.debug?.(e); - } - try { - e && (t.style.paddingRight = "0px", t.style.paddingLeft = "0px", _e.style.display = "none", K.style.display = "none"); - } catch (e) { - console.debug?.(e); - } - } - function Qe() { - o.zoom = 1, o.panX = 0, o.panY = 0, o.targetZoom = 1; - try { - o.mode !== $.AB_COMPARE && o.mode !== $.SIDE_BY_SIDE && o.compareAsset != null && (o.compareAsset = null); - } catch (e) { - console.debug?.(e); - } - let e = o.assets[o.currentIndex], t = o.mode === $.AB_COMPARE && Xe(), n = o.mode === $.SIDE_BY_SIDE && Y(), r = t && o.compareAsset != null, i = n && o.compareAsset != null, a = t ? (r ? e : o.assets?.[0]) || null : n ? (i ? e : o.assets?.[0]) || null : e || null, s = t ? (r ? o.compareAsset : o.assets?.[1]) || null : n ? i ? o.compareAsset : Array.isArray(o.assets) && o.assets.length >= 2 ? o.assets[o.assets.length - 1] : null : null; - try { - F.textContent = a?.filename || ""; - } catch (e) { - console.debug?.(e); - } - try { - ae && re && s && s !== a ? (ae.style.display = "flex", oe && (oe.style.display = "flex"), re.textContent = s?.filename || "", se && le && L && (se.style.display = "flex", le.appendChild(L), L.style.justifyContent = "flex-start"), R && (R.style.justifyContent = "center", R.style.paddingLeft = "84px"), I && (I.style.flex = "0 0 auto"), ue && (ue.style.flex = "0 0 auto"), F && (F.style.textAlign = "left")) : ae && re && (ae.style.display = "none", oe && (oe.style.display = "none"), re.textContent = "", se && (se.style.display = "none"), ue && L && de && (ue.insertBefore(L, de), L.style.justifyContent = "center"), R && (R.style.justifyContent = "center", R.style.paddingLeft = "12px"), I && (I.style.flex = "1 1 auto"), ue && (ue.style.flex = ""), F && (F.style.textAlign = "center")); - } catch (e) { - console.debug?.(e); - } - o.mode === $.AB_COMPARE && Xe() ? xe.textContent = "2 selected" : o.mode === $.SIDE_BY_SIDE && Y() ? xe.textContent = o.compareAsset == null ? `${o.assets.length} selected` : "2 selected" : xe.textContent = `${o.currentIndex + 1} / ${o.assets.length}`, o.mode === $.AB_COMPARE && !Xe() && (o.mode = Y() ? $.SIDE_BY_SIDE : $.SINGLE), o.mode === $.SIDE_BY_SIDE && !Y() && (o.mode = $.SINGLE); - try { - N?.syncModeButtons?.({ - canAB: Xe, - canSide: Y - }); - } catch (e) { - console.debug?.(e); - } - B.style.display = o.mode === $.SINGLE ? "flex" : "none", V.style.display = o.mode === $.AB_COMPARE ? "block" : "none", H.style.display = o.mode === $.SIDE_BY_SIDE ? "flex" : "none"; - try { - o.mode !== $.SINGLE && (Fn(B), B.replaceChildren()); - } catch (e) { - console.debug?.(e); - } - try { - o.mode !== $.AB_COMPARE && (Fn(V), V.replaceChildren()); - } catch (e) { - console.debug?.(e); - } - try { - o.mode !== $.SIDE_BY_SIDE && (Fn(H), H.replaceChildren()); - } catch (e) { - console.debug?.(e); - } - Ye(); - let c = o.mode === $.AB_COMPARE && Xe() || o.mode === $.SIDE_BY_SIDE && Y(); - try { - be.style.display = c ? "none" : "", Se.style.display = c ? "none" : ""; - } catch (e) { - console.debug?.(e); - } - et(), tt(o.assets, o.currentIndex), st(); - try { - N?.syncToolsUIFromState?.(); - } catch (e) { - console.debug?.(e); - } - try { - Ze(); - } catch (e) { - console.debug?.(e); - } - try { - ht?.(); - } catch (e) { - console.debug?.(e); - } - J(); - try { - Ke(); - } catch (e) { - console.debug?.(e); - } - try { - Pe().then(() => { - try { - Ye(); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - try { - let e = o.mode === $.SINGLE; - Te.sync({ isSingle: e }); - } catch (e) { - console.debug?.(e); - } - } - function et() { - let e = o.assets[o.currentIndex]; - if (!e) return; - let t = O(e); - if (t) { - if (o.mode === $.SINGLE) { - try { - Fn(B); - } catch (e) { - console.debug?.(e); - } - B.innerHTML = "", o._mediaW = 0, o._mediaH = 0; - let n = A(e, t); - B.appendChild(n); - } else o.mode === $.AB_COMPARE ? Xe() && Wr?.renderABCompareView?.({ - abView: V, - state: o, - currentAsset: e, - viewUrl: t, - buildAssetViewURL: O, - createCompareMediaElement: j, - destroyMediaProcessorsIn: Fn - }) : o.mode === $.SIDE_BY_SIDE && Y() && Gr?.renderSideBySideView?.({ - sideView: H, - state: o, - currentAsset: e, - viewUrl: t, - buildAssetViewURL: O, - createMediaElement: A, - destroyMediaProcessorsIn: Fn - }); - g(), v(); - } else { - try { - Fn(B); - } catch (e) { - console.debug?.(e); - } - try { - B.replaceChildren(); - let e = document.createElement("div"); - e.className = "mjr-viewer-media", e.style.cssText = "color:#ff9a9a; font-size:13px; padding:16px; text-align:center;", e.textContent = "Cannot open asset: missing or invalid filename/path.", B.appendChild(e); - } catch (e) { - console.debug?.(e); - } - } - } - let { preloadAdjacentAssets: tt, preloadImageForAsset: nt, trackPreloadRef: rt } = pr({ - buildAssetViewURL: O, - IMAGE_PRELOAD_EXTENSIONS: c, - state: o - }), { destroyPlayerBar: at, syncPlayerBar: ot } = Sr({ - state: o, - APP_CONFIG: T, - VIEWER_MODES: $, - overlay: t, - navBar: Ce, - playerBarHost: we, - singleView: B, - abView: V, - sideView: H, - metadataHydrator: Oe, - isPlayableViewerKind: On, - collectPlayableMediaElements: kn, - pickPrimaryPlayableMedia: An, - mountUnifiedMediaControls: jn, - installFollowerVideoSync: qn, - getViewerInfo: f, - scheduleOverlayRedraw: J, - viewerInfoCacheGet: Me, - viewerInfoCacheSet: Ne - }), st = () => ot(), ct = T.VIEWER_MAX_PROC_PIXELS ?? 12e6, lt = () => ({ - exposureEV: Number(o.exposureEV) || 0, - gamma: Math.max(.1, Math.min(3, Number(o.gamma) || 1)), - channel: o.channel || "rgb", - analysisMode: o.analysisMode || "none", - zebraThreshold: Math.max(0, Math.min(1, Number(o.zebraThreshold) || .95)) - }), ut = () => { - let e = lt(); - try { - let n = t.querySelectorAll(".mjr-viewer-media"); - for (let t of n) try { - let n = t?._mjrProc; - n?.setParams && n.setParams(e); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - try { - o?.mode === $.AB_COMPARE && V?._mjrDiffRequest?.(); - } catch (e) { - console.debug?.(e); - } - }, dt = (e) => { - try { - if (!e) return !0; - let t = Number(e.exposureEV) || 0, n = Number(e.gamma) || 1, r = String(e.channel || "rgb"), i = String(e.analysisMode || "none"); - return Math.abs(t) < 1e-4 && Math.abs(n - 1) < 1e-4 && r === "rgb" && i === "none"; - } catch { - return !0; - } - }, ft = T.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, pt = T.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15; - try { - d = fr({ - overlay: t, - state: o, - mediaTransform: m, - updateMediaNaturalSize: D, - clampPanToBounds: h, - applyTransform: g, - scheduleOverlayRedraw: J, - getGradeParams: lt, - isDefaultGrade: dt, - tonemap: null, - maxProcPixels: ct, - maxProcPixelsVideo: ft, - disableWebGL: !!T.VIEWER_DISABLE_WEBGL_VIDEO, - videoGradeThrottleFps: pt, - safeAddListener: Z, - safeCall: X - }); - } catch { - d = null; - } - a.push(Z(be, "click", () => { - o.currentIndex > 0 && (o.currentIndex--, Qe()); - })), a.push(Z(Se, "click", () => { - o.currentIndex < o.assets.length - 1 && (o.currentIndex++, Qe()); - })); - let mt = null, ht = () => { - try { - if (mt != null) return; - mt = requestAnimationFrame(() => { - mt = null; - try { - ut(); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - }, gt = () => { - try { - N?.syncToolsUIFromState?.(); - } catch (e) { - console.debug?.(e); - } - }, _t = (e) => { - if (!Array.isArray(o.assets) || o.assets.length === 0) return !1; - let t = o.currentIndex + e; - return t < 0 || t >= o.assets.length ? !1 : (o.currentIndex = t, Qe(), !0); - }, vt = (e) => { - if (t.style.display === "none") return; - try { - let t = e.target; - if (t && (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.tagName === "SELECT" || t.isContentEditable)) return; - } catch (e) { - console.debug?.(e); - } - try { - if (!fe.contains(e.target)) return; - } catch (e) { - console.debug?.(e); - } - try { - if (Kr?.isModel3DInteractionTarget?.(e?.target)) return; - } catch (e) { - console.debug?.(e); - } - try { - e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.(); - } catch (e) { - console.debug?.(e); - } - let n = Number(e.deltaX) || 0, r = Number(e.deltaY) || 0; - if (e.shiftKey && r && _t(r > 0 ? 1 : -1) || Math.abs(n) > Math.abs(r) && Math.abs(n) > 30 && _t(n > 0 ? 1 : -1) || !r) return; - let i = Math.exp(-r * .0015); - _((Number(o.zoom) || 1) * i, { - clientX: e.clientX, - clientY: e.clientY - }); - }, yt = (e, t, n, { offsetX: r = 16, offsetY: i = 16 } = {}) => { - try { - let a = S(); - if (!a) return; - let o = fe.getBoundingClientRect(), s = (Number(t) || 0) - o.left, c = (Number(n) || 0) - o.top, l = Number(e.offsetWidth) || 0, u = Number(e.offsetHeight) || 0, d = s + r, f = c + i; - d = Math.max(10, Math.min(d, a.width - l - 10)), f = Math.max(10, Math.min(f, a.height - u - 10)), e.style.left = `${Math.round(d)}px`, e.style.top = `${Math.round(f)}px`; - } catch (e) { - console.debug?.(e); - } - }, bt = Yn({ - overlay: t, - content: fe, - state: o, - VIEWER_MODES: $, - getPrimaryMedia: y, - getMediaNaturalSize: x, - getViewportRect: S, - positionOverlayBox: yt, - probeTooltip: me, - loupeWrap: he, - onLoupeRedraw: Xn({ - state: o, - loupeCanvas: ge, - loupeWrap: he, - getMediaNaturalSize: x, - positionOverlayBox: yt - }).redraw, - lifecycle: r - }); - try { - if (!fe._mjrOverlayResizeBound && "ResizeObserver" in window) { - try { - t._mjrResizeObserver?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - let e = new ResizeObserver(() => { - try { - o._viewportCache = null; - } catch (e) { - console.debug?.(e); - } - J(); - }); - try { - e.observe(fe); - } catch (e) { - console.debug?.(e); - } - t._mjrResizeObserver = e, a.push(() => { - try { - e.disconnect(); - } catch (e) { - console.debug?.(e); - } - }), fe._mjrOverlayResizeBound = !0; - } - } catch (e) { - console.debug?.(e); - } - let xt = Gn({ - overlay: t, - content: fe, - singleView: B, - state: o, - VIEWER_MODES: $, - computeOneToOneZoom: E, - setZoom: _, - scheduleOverlayRedraw: J, - scheduleApplyGrade: ht, - syncToolsUIFromState: gt, - applyDistractionFreeUI: Ze, - navigateViewerAssets: _t, - closeViewer: Tt, - renderBadges: Ye, - updateAssetRating: e, - safeDispatchCustomEvent: ce, - ASSET_RATING_CHANGED_EVENT: k, - probeTooltip: me, - loupeWrap: he, - renderGenInfoPanel: Ke, - getVideoControls: () => { - try { - return o?._videoControlsMounted || null; - } catch { - return null; - } - }, - lifecycle: r - }), St = [], Ct = () => { - try { - for (let e of St) X(e); - } catch (e) { - console.debug?.(e); - } - St = []; - try { - xt?.unbind?.(); - } catch (e) { - console.debug?.(e); - } - }, wt = () => { - Ct(); - try { - St.push(Z(t, "click", (e) => { - try { - if (e.target !== t) return; - } catch (e) { - console.debug?.(e); - } - Tt(); - })); - } catch (e) { - console.debug?.(e); - } - try { - St.push(Z(fe, "wheel", vt, { - passive: !1, - capture: !0 - })); - } catch (e) { - console.debug?.(e); - } - try { - let e = null; - St.push(Z(fe, "touchstart", (t) => { - try { - if (t.touches?.length !== 1) return; - let n = t.touches[0]; - e = { - x: n.clientX, - y: n.clientY, - t: Date.now() - }; - } catch (e) { - console.debug?.(e); - } - }, { passive: !0 })), St.push(Z(fe, "touchend", (t) => { - try { - if (!e) return; - if (t.changedTouches?.length !== 1) { - e = null; - return; - } - let n = t.changedTouches[0], r = n.clientX - e.x, i = n.clientY - e.y, a = Date.now() - e.t; - if (e = null, a > 600 || Math.abs(i) > 80) return; - Math.abs(r) >= 60 && _t(r < 0 ? 1 : -1); - } catch (e) { - console.debug?.(e); - } - }, { passive: !0 })), St.push(Z(fe, "touchcancel", () => { - e = null; - }, { passive: !0 })); - } catch (e) { - console.debug?.(e); - } - try { - St.push(Z(fe, "mousemove", (e) => { - try { - o._lastPointerX = e.clientX, o._lastPointerY = e.clientY; - } catch (e) { - console.debug?.(e); - } - }, { - passive: !0, - capture: !0 - })); - } catch (e) { - console.debug?.(e); - } - try { - xt?.bind?.(); - } catch (e) { - console.debug?.(e); - } - }; - try { - t._mjrBadgeSyncBound ||= (a.push(Z(window, k, (e) => { - try { - let t = e?.detail?.assetId, n = e?.detail?.rating; - if (t == null) return; - for (let e of o.assets || []) e?.id != null && String(e.id) === String(t) && (e.rating = n); - try { - Oe?.deleteCached?.(t); - } catch (e) { - console.debug?.(e); - } - Ye(); - } catch (e) { - console.debug?.(e); - } - }, { passive: !0 })), a.push(Z(window, w, (e) => { - try { - let t = e?.detail?.assetId, n = e?.detail?.tags; - if (t == null) return; - for (let e of o.assets || []) e?.id != null && String(e.id) === String(t) && (e.tags = n); - try { - Oe?.deleteCached?.(t); - } catch (e) { - console.debug?.(e); - } - Ye(); - } catch (e) { - console.debug?.(e); - } - }, { passive: !0 })), !0); - } catch (e) { - console.debug?.(e); - } - function Tt() { - try { - let e = o.assets?.[o.currentIndex]; - e?.id && ce(b, { assetId: String(e.id) }, { warnPrefix: "[ViewerRuntime]" }); - } catch (e) { - console.debug?.(e); - } - try { - o.distractionFree = !1, Ze(); - } catch (e) { - console.debug?.(e); - } - try { - Oe?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - at(); - } catch (e) { - console.debug?.(e); - } - try { - o._scopesVideoAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - o._scopesVideoAbort = null; - try { - o._panHintTimer && clearTimeout(o._panHintTimer); - } catch (e) { - console.debug?.(e); - } - o._panHintTimer = null; - try { - o._panHintAt = 0; - } catch (e) { - console.debug?.(e); - } - try { - V?._mjrSyncAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - V?._mjrDiffAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - V._mjrSyncAbort = null; - } catch (e) { - console.debug?.(e); - } - try { - V._mjrDiffAbort = null; - } catch (e) { - console.debug?.(e); - } - try { - H?._mjrSyncAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - H._mjrSyncAbort = null; - } catch (e) { - console.debug?.(e); - } - try { - V?._mjrSliderAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - V._mjrSliderAbort = null; - } catch (e) { - console.debug?.(e); - } - try { - let e = t.querySelectorAll?.("video, audio"); - if (e && e.length) for (let t of e) { - try { - t.muted = !0; - } catch (e) { - console.debug?.(e); - } - try { - t.pause?.(); - } catch (e) { - console.debug?.(e); - } - try { - t.currentTime = 0; - } catch (e) { - console.debug?.(e); - } - try { - let e = t.querySelectorAll?.("source"); - if (e && e.length) for (let t of e) try { - t.remove(); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - try { - t.removeAttribute?.("src"); - } catch (e) { - console.debug?.(e); - } - try { - t.load?.(); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - try { - Fn(B), B.replaceChildren(); - } catch (e) { - console.debug?.(e); - } - try { - Fn(V), V.replaceChildren(); - } catch (e) { - console.debug?.(e); - } - try { - Fn(H), H.replaceChildren(); - } catch (e) { - console.debug?.(e); - } - try { - o.genInfoOpen = !1; - } catch (e) { - console.debug?.(e); - } - try { - Be(); - } catch (e) { - console.debug?.(e); - } - try { - _e.style.display = "none", ze(G); - } catch (e) { - console.debug?.(e); - } - try { - K.style.display = "none", ze(ye); - } catch (e) { - console.debug?.(e); - } - t.style.display = "none", t.style.pointerEvents = "none", Ct(); - try { - document.body.style.overflow = o._prevBodyOverflow ?? ""; - } catch { - document.body.style.overflow = ""; - } - try { - o._prevFocusedElement && typeof o._prevFocusedElement.focus == "function" && o._prevFocusedElement.focus(), o._prevFocusedElement = null; - } catch (e) { - console.debug?.(e); - } - let e = o?._prevHotkeyScope; - i(e || "panel"), o._prevHotkeyScope = null; - } - let Et = { - open(e, n = 0, r = null) { - wt(), o.assets = Array.isArray(e) ? e : [e], o.currentIndex = Math.max(0, Math.min(n, o.assets.length - 1)), o.distractionFree = !1; - try { - Te.rebuild(); - } catch (e) { - console.debug?.(e); - } - o.zoom = 1, o.panX = 0, o.panY = 0, o.targetZoom = 1, o._userInteracted = !1, o._panHintAt = 0; - try { - o._panHintTimer && clearTimeout(o._panHintTimer); - } catch (e) { - console.debug?.(e); - } - o._panHintTimer = null, o._lastPointerX = null, o._lastPointerY = null, o._mediaW = 0, o._mediaH = 0, o.compareAsset = r, o.gridMode = 0, Be(), o._probe = null; - try { - me.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - try { - he.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - t.style.display = "flex", t.style.pointerEvents = "auto"; - try { - o._prevFocusedElement = document.activeElement; - } catch { - o._prevFocusedElement = null; - } - t.focus(); - try { - o._prevBodyOverflow = document.body.style.overflow; - } catch { - o._prevBodyOverflow = ""; - } - document.body.style.overflow = "hidden", o._prevHotkeyScope = l().scope || null, i("viewer"), Qe(); - try { - gt(); - } catch (e) { - console.debug?.(e); - } - try { - ht(); - } catch (e) { - console.debug?.(e); - } - J(); - }, - close() { - Tt(); - }, - setMode(e) { - Object.values($).includes(e) && (o.mode = e, Qe()); - }, - setCompareAsset(e) { - o.compareAsset = e, Qe(); - }, - dispose() { - try { - Tt(); - } catch (e) { - console.debug?.(e); - } - try { - Ae.clear(); - } catch (e) { - console.debug?.(e); - } - try { - Fn(B); - } catch (e) { - console.debug?.(e); - } - try { - Fn(V); - } catch (e) { - console.debug?.(e); - } - try { - Fn(H); - } catch (e) { - console.debug?.(e); - } - try { - Ie != null && cancelAnimationFrame(Ie); - } catch (e) { - console.debug?.(e); - } - try { - mt != null && cancelAnimationFrame(mt); - } catch (e) { - console.debug?.(e); - } - try { - bt?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - try { - xt?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - try { - t._mjrResizeObserver?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - try { - t._mjrResizeObserver = null; - } catch (e) { - console.debug?.(e); - } - try { - Oe?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - try { - Dn(t); - } catch (e) { - console.debug?.(e); - } - try { - for (let e of t._mjrViewerUnsubs || []) X(e); - } catch (e) { - console.debug?.(e); - } - try { - t._mjrViewerUnsubs = []; - } catch (e) { - console.debug?.(e); - } - try { - o._preloadRefs?.clear?.(); - } catch (e) { - console.debug?.(e); - } - try { - o._preloadedAssetKeys?.clear?.(); - } catch (e) { - console.debug?.(e); - } - try { - t.remove?.(); - } catch (e) { - console.debug?.(e); - } - } - }; - try { - ee = () => Et.close(); - } catch (e) { - console.debug?.(e); - } - t._mjrViewerAPI = Et; - try { - En({ - overlayEl: t, - getCurrentAsset: () => o.assets[o.currentIndex], - getCurrentViewUrl: (e) => O(e), - onAssetChanged: () => { - try { - Ye(); - } catch (e) { - console.debug?.(e); - } - } - }); - } catch (e) { - console.debug?.(e); - } - return t; -} -function Qr() { - return xr(Zr); -} -export { $e as A, ze as B, mt as C, ut as D, ft as E, rt as F, we as G, He as H, Ke as I, L as J, le as K, Ue as L, Ze as M, nt as N, st as O, tt as P, Ee as R, vt as S, dt as T, Be as U, Me as V, Te as W, ce as Y, Ot as _, pn as a, bt as b, ln as c, Qt as d, Ft as f, Dt as g, X as h, rn as i, it as j, Qe as k, an as l, Pt as m, qn as n, un as o, Nt as p, I as q, jn as r, on as s, Qr as t, Q as u, Tt as v, pt as w, ht as x, Et as y, Ne as z }; diff --git a/dist/chunks/ViewerPortal-Sv96pbcb.js b/dist/chunks/ViewerPortal-Sv96pbcb.js new file mode 100644 index 00000000..96bddca8 --- /dev/null +++ b/dist/chunks/ViewerPortal-Sv96pbcb.js @@ -0,0 +1,1955 @@ +import { T as e, Wt as t, Yn as n, f as r, in as i, ir as a, s as o, u as s } from "./config-C9a-wT5M.js"; +import { a as c, i as l, r as u } from "./floatingViewerManager-B_I-SRbd.js"; +import { i as d, r as f, t as p } from "./events-1iwo5blr.js"; +import { a as ee, i as m, n as h, r as g, t as _ } from "./TagsEditor-MUk741GH.js"; +import { $ as te, A as v, B as ne, C as y, D as b, E as x, H as S, J as re, K as C, M as w, O as T, P as E, Q as D, S as O, T as k, U as A, V as ie, W as j, X as M, Y as N, b as ae, gt as P, ht as F, j as I, k as L, lt as oe, mt as R, ot as se, pt as z, q as B, rt as ce, st as V, w as le, z as H } from "./mjr-primevue-C07IsEdU.js"; +import { C as U, _ as W, a as ue, b as de, c as G, d as fe, f as pe, g as me, h as he, i as ge, l as _e, m as ve, n as ye, o as K, p as be, r as xe, s as q, t as Se, u as Ce, v as we, x as Te, y as Ee } from "./genInfo-Dk8cerKp.js"; +// ui/vue/components/viewer/FloatingViewerHost.vue +var De = /* @__PURE__ */ E({ + __name: "FloatingViewerHost", + setup(e) { + let t = V(null), n = null; + return S(() => { + n = c(t.value); + }), A(() => { + n?.(), n = null; + }), (e, n) => (j(), L("div", { + ref_key: "hostRef", + ref: t, + class: "mjr-viewer-runtime-host mjr-viewer-runtime-host--floating", + style: { + position: "fixed", + inset: "0", + "pointer-events": "none", + overflow: "visible" + } + }, null, 512)); + } +}), Oe = null, J = null; +function Y(e, t, n) { + let r = e || document.createElement("canvas"); + return r.width !== t && (r.width = t), r.height !== n && (r.height = n), { + c: r, + ctx: r.getContext("2d", { willReadFrequently: !0 }) + }; +} +function X(e) { + return e ? e instanceof HTMLVideoElement ? { + w: e.videoWidth || 0, + h: e.videoHeight || 0 + } : e instanceof HTMLImageElement ? { + w: e.naturalWidth || 0, + h: e.naturalHeight || 0 + } : { + w: e.width || 0, + h: e.height || 0 + } : { + w: 0, + h: 0 + }; +} +function Z(e) { + return e ? e instanceof HTMLVideoElement ? e.readyState >= 2 && e.videoWidth > 0 : e instanceof HTMLImageElement ? e.complete && e.naturalWidth > 0 : e.width > 0 : !1; +} +function ke(e, t = 256) { + if (!Z(e)) return null; + let { w: n, h: r } = X(e), i = Te(n, r, t); + if (!i.w || !i.h) return null; + try { + let { c: t, ctx: n } = Y(Oe, i.w, i.h); + return Oe = t, n ? (n.clearRect(0, 0, i.w, i.h), n.drawImage(e, 0, 0, i.w, i.h), { + data: n.getImageData(0, 0, i.w, i.h).data, + width: i.w, + height: i.h + }) : null; + } catch { + return null; + } +} +function Ae(e, t, n) { + if (!Z(e)) return null; + let { w: r, h: i } = X(e), a = Math.floor(t), o = Math.floor(n); + if (a < 0 || o < 0 || a >= r || o >= i) return null; + try { + let { c: t, ctx: n } = Y(J, 1, 1); + if (J = t, !n) return null; + n.clearRect(0, 0, 1, 1), n.drawImage(e, a, o, 1, 1, 0, 0, 1, 1); + let r = n.getImageData(0, 0, 1, 1).data; + return [ + r[0], + r[1], + r[2], + r[3] + ]; + } catch { + return null; + } +} +function je(e, t, n, r, i) { + if (!Z(t)) return !1; + let a = e.getContext("2d"); + if (!a) return !1; + let o = e.width / Math.max(1, i); + try { + return a.imageSmoothingEnabled = !1, a.fillStyle = "#111", a.fillRect(0, 0, e.width, e.height), a.drawImage(t, Math.floor(n - o / 2), Math.floor(r - o / 2), Math.ceil(o), Math.ceil(o), 0, 0, e.width, e.height), !0; + } catch { + return !1; + } +} +async function Me(e) { + if (!Z(e)) return null; + let { w: t, h: n } = X(e), r = document.createElement("canvas"); + r.width = t, r.height = n; + try { + return r.getContext("2d")?.drawImage(e, 0, 0), await new Promise((e) => r.toBlob(e, "image/png")); + } catch { + return null; + } +} +// ui/features/viewer/studio/studioViewerState.ts +var Q = se({ + open: !1, + assets: [], + index: 0, + session: 0, + compare: "" +}); +function Ne(e = "") { + let t = String(e || "").trim().toLowerCase(); + return t === "ab" ? "wipe" : t === "sidebyside" ? "side" : ""; +} +function Pe(e, t = 0, n = "") { + let r = (Array.isArray(e) ? e : []).filter(Boolean); + return r.length ? (Q.assets = r, Q.index = Math.max(0, Math.min(Number(t) || 0, r.length - 1)), Q.compare = r.length > 1 ? Ne(n) : "", Q.session += 1, Q.open = !0, !0) : !1; +} +function Fe() { + Q.open = !1; +} +function Ie(e) { + let t = Q.assets.length; + t && (Q.index = (Math.floor(e) % t + t) % t); +} +function Le(e) { + Ie(Q.index + e); +} +// ui/vue/components/viewer/studio/StudioFxDefs.vue?vue&type=script&setup=true&lang.ts +var Re = { + class: "mjr-studio-fx-defs", + width: "0", + height: "0", + "aria-hidden": "true", + focusable: "false" +}, ze = ["id"], Be = ["href"], Ve = ["in"], He = ["slope"], Ue = ["slope"], We = ["slope"], Ge = { + in: "mjrExposed", + result: "mjrGamma" +}, Ke = ["exponent"], qe = ["exponent"], Je = ["exponent"], Ye = ["values"], Xe = /* @__PURE__ */ E({ + __name: "StudioFxDefs", + props: { + filterId: {}, + channel: {}, + exposure: {}, + gamma: {}, + subtractSrc: {} + }, + setup(e) { + let t = e, n = k(() => _e(t.channel)), r = k(() => he(t.exposure)), i = k(() => W(t.gamma)); + return (t, a) => (j(), L("svg", Re, [x("defs", null, [x("filter", { + id: e.filterId, + x: "0", + y: "0", + width: "1", + height: "1", + filterUnits: "objectBoundingBox", + primitiveUnits: "objectBoundingBox", + "color-interpolation-filters": "sRGB" + }, [ + e.subtractSrc ? (j(), L(y, { key: 0 }, [x("feImage", { + href: e.subtractSrc, + x: "0", + y: "0", + width: "1", + height: "1", + preserveAspectRatio: "none", + result: "mjrB" + }, null, 8, Be), a[0] ||= v("", 2)], 64)) : T("", !0), + x("feComponentTransfer", { + in: e.subtractSrc ? "mjrBase" : "SourceGraphic", + result: "mjrExposed" + }, [ + x("feFuncR", { + type: "linear", + slope: r.value + }, null, 8, He), + x("feFuncG", { + type: "linear", + slope: r.value + }, null, 8, Ue), + x("feFuncB", { + type: "linear", + slope: r.value + }, null, 8, We) + ], 8, Ve), + x("feComponentTransfer", Ge, [ + x("feFuncR", { + type: "gamma", + amplitude: "1", + exponent: i.value, + offset: "0" + }, null, 8, Ke), + x("feFuncG", { + type: "gamma", + amplitude: "1", + exponent: i.value, + offset: "0" + }, null, 8, qe), + x("feFuncB", { + type: "gamma", + amplitude: "1", + exponent: i.value, + offset: "0" + }, null, 8, Je) + ]), + n.value ? (j(), L("feColorMatrix", { + key: 1, + in: "mjrGamma", + type: "matrix", + values: n.value + }, null, 8, Ye)) : T("", !0) + ], 8, ze)])])); + } +}), Ze = ["viewBox"], Qe = ["d", "fill"], $e = [ + "x", + "y", + "width", + "height" +], et = [ + "x1", + "y1", + "x2", + "y2" +], tt = [ + "x", + "y", + "width", + "height" +], nt = /* @__PURE__ */ E({ + __name: "StudioGuides", + props: { + width: {}, + height: {}, + grid: {}, + aspect: {}, + maskOpacity: {} + }, + setup(e) { + let t = e, n = k(() => we(t.width, t.height, t.grid)), r = k(() => G(t.width, t.height, t.aspect)), i = k(() => { + let e = r.value; + if (!e) return ""; + let { width: n, height: i } = t; + return `M0 0H${n}V${i}H0Z M${e.x} ${e.y}V${e.y + e.h}H${e.x + e.w}V${e.y}Z`; + }), a = k(() => t.width > 0 && t.height > 0 && (t.grid !== "off" || !!r.value)); + return (t, o) => a.value ? (j(), L("svg", { + key: 0, + class: "mjr-studio-guides", + viewBox: `0 0 ${e.width} ${e.height}`, + preserveAspectRatio: "none", + "aria-hidden": "true" + }, [ + i.value ? (j(), L("path", { + key: 0, + d: i.value, + "fill-rule": "evenodd", + fill: `rgba(0,0,0,${e.maskOpacity})` + }, null, 8, Qe)) : T("", !0), + r.value ? (j(), L("rect", { + key: 1, + x: r.value.x, + y: r.value.y, + width: r.value.w, + height: r.value.h, + fill: "none", + class: "mjr-studio-guides__mask-edge", + "vector-effect": "non-scaling-stroke" + }, null, 8, $e)) : T("", !0), + (j(!0), L(y, null, C(n.value.lines, (e, t) => (j(), L("line", { + key: `l${t}`, + x1: e.x1, + y1: e.y1, + x2: e.x2, + y2: e.y2, + class: "mjr-studio-guides__line", + "vector-effect": "non-scaling-stroke" + }, null, 8, et))), 128)), + (j(!0), L(y, null, C(n.value.rects, (e, t) => (j(), L("rect", { + key: `r${t}`, + x: e.x, + y: e.y, + width: e.w, + height: e.h, + fill: "none", + class: "mjr-studio-guides__safe", + "vector-effect": "non-scaling-stroke" + }, null, 8, tt))), 128)) + ], 8, Ze)) : T("", !0); + } +}), rt = ["src", "alt"], it = ["src"], at = ["src"], ot = { + key: 0, + class: "mjr-studio-stage__ab" +}, st = { class: "is-sep" }, ct = { + key: 1, + class: "mjr-studio-stage__error" +}, lt = .05, ut = 32, dt = 16, ft = /* @__PURE__ */ E({ + __name: "StudioImageStage", + props: { + src: {}, + alt: { default: "" }, + checker: { + type: Boolean, + default: !1 + }, + mediaFilter: { default: "" }, + compareSrc: { default: null }, + compare: { default: "off" }, + wipe: { default: 50 } + }, + emits: [ + "zoom", + "loaded", + "update:wipe", + "dismiss" + ], + setup(e, { expose: t, emit: n }) { + let r = e, i = n, a = V(null), o = V(null), s = V(null), c = V({ + w: 0, + h: 0 + }), l = V(1), u = V({ + x: 0, + y: 0 + }), d = V(!0), f = V(!1), p = V(!1), ee = V(!1), m = null, h = null, g = k(() => !!r.compareSrc && r.compare !== "off"), _ = k(() => g.value && r.compare === "side"), v = k(() => g.value && (r.compare === "wipe" || r.compare === "wipeV")), ne = k(() => g.value ? Ce(r.compare) : null), y = k(() => g.value && r.compare !== "subtract"); + function b() { + return _.value ? c.value.w * 2 + dt : c.value.w; + } + function re() { + let e = a.value?.getBoundingClientRect(); + return { + w: e?.width || 0, + h: e?.height || 0 + }; + } + function C() { + let { w: e, h: t } = re(); + return !c.value.w || !c.value.h || !e || !t ? 1 : Math.min(e / b(), t / c.value.h); + } + function w() { + d.value = !0, l.value = C(), u.value = { + x: _.value ? -((c.value.w + dt) / 2) * l.value : 0, + y: 0 + }, i("zoom", l.value); + } + function E(e, t) { + let n = Math.max(lt, Math.min(ut, e)), { w: r, h: a } = re(), o = t ? t.x - r / 2 : 0, s = t ? t.y - a / 2 : 0, c = n / l.value; + u.value = { + x: o - (o - u.value.x) * c, + y: s - (s - u.value.y) * c + }, l.value = n, d.value = !1, i("zoom", l.value); + } + function D(e) { + E(l.value * e); + } + function A() { + E(1), u.value = { + x: 0, + y: 0 + }; + } + function N() { + d.value ? A() : w(); + } + function I(e) { + e.preventDefault(); + let t = a.value?.getBoundingClientRect(), n = Math.exp(-e.deltaY * .0015); + E(l.value * n, t ? { + x: e.clientX - t.left, + y: e.clientY - t.top + } : void 0); + } + function oe(e) { + e.button === 0 && (m = { + x: e.clientX, + y: e.clientY, + ox: u.value.x, + oy: u.value.y, + id: e.pointerId, + t: Date.now() + }, p.value = !0, e.currentTarget?.setPointerCapture?.(e.pointerId)); + } + function se(e) { + m && (u.value = { + x: m.ox + e.clientX - m.x, + y: m.oy + e.clientY - m.y + }, Math.abs(e.clientX - m.x) + Math.abs(e.clientY - m.y) > 2 && (d.value = !1)); + } + function z(e) { + let t = m; + t && e.currentTarget?.releasePointerCapture?.(t.id), m = null, p.value = !1, t && e.type === "pointerup" && e.button === 0 && Math.hypot(e.clientX - t.x, e.clientY - t.y) <= 6 && Date.now() - t.t <= 600 && document.elementFromPoint(e.clientX, e.clientY) === a.value && i("dismiss"); + } + function ce(e) { + let t = o.value?.getBoundingClientRect(); + if (!t || t.width <= 0 || t.height <= 0) return; + let n = r.compare === "wipeV" ? (e.clientY - t.top) / t.height : (e.clientX - t.left) / t.width; + i("update:wipe", Math.round(Math.max(0, Math.min(1, n)) * 1e3) / 10); + } + function le(e) { + ee.value = !0, e.currentTarget?.setPointerCapture?.(e.pointerId), ce(e); + } + function H(e) { + ee.value && ce(e); + } + function U() { + ee.value = !1; + } + function W(e) { + let t = e.target; + c.value = { + w: t.naturalWidth, + h: t.naturalHeight + }, f.value = !1, i("loaded", { + width: t.naturalWidth, + height: t.naturalHeight + }), w(); + } + let ue = k(() => ({ + width: `${c.value.w}px`, + height: `${c.value.h}px`, + transform: `translate(-50%, -50%) translate(${u.value.x}px, ${u.value.y}px) scale(${l.value})`, + imageRendering: l.value >= 2 ? "pixelated" : "auto", + "--mjr-inv-scale": String(1 / (l.value || 1)) + })), de = k(() => r.mediaFilter ? { filter: r.mediaFilter } : {}), G = k(() => { + if (ne.value) return { mixBlendMode: ne.value }; + if (v.value) { + let e = Math.max(0, Math.min(100, r.wipe)); + return { clipPath: r.compare === "wipeV" ? `inset(${e}% 0 0 0)` : `inset(0 0 0 ${e}%)` }; + } + return {}; + }), fe = k(() => r.compare === "wipeV" ? { top: `${r.wipe}%` } : { left: `${r.wipe}%` }); + return M(() => r.src, () => { + c.value = { + w: 0, + h: 0 + }, f.value = !1; + }), M(_, () => { + d.value && w(); + }), S(() => { + try { + h = new ResizeObserver(() => { + d.value && w(); + }), a.value && h.observe(a.value); + } catch (e) { + console.debug?.(e); + } + }), ie(() => h?.disconnect()), t({ + zoomBy: D, + fit: w, + actualSize: A, + toggleFitActual: N, + getSource: () => s.value && !f.value ? s.value : null, + getBox: () => o.value, + naturalSize: () => ({ ...c.value }) + }), (t, n) => (j(), L("div", { + ref_key: "stage", + ref: a, + class: R(["mjr-studio-stage", { + "is-checker": e.checker, + "is-dragging": p.value + }]), + onWheel: I, + onPointerdown: oe, + onPointermove: se, + onPointerup: z, + onPointercancel: z, + onDblclick: N + }, [ + te(x("div", { + class: "mjr-studio-stage__box", + style: F(ue.value) + }, [ + x("div", { + ref_key: "box", + ref: o, + class: "mjr-studio-stage__layers", + style: F(de.value) + }, [(j(), L("img", { + ref_key: "img", + ref: s, + key: e.src, + class: "mjr-studio-stage__img", + src: e.src, + alt: e.alt, + draggable: "false", + onLoad: W, + onError: n[0] ||= (e) => f.value = !0 + }, null, 40, rt)), y.value && !_.value ? (j(), L("img", { + key: `b:${e.compareSrc}`, + class: "mjr-studio-stage__img is-b", + src: e.compareSrc || "", + alt: "", + draggable: "false", + style: F(G.value) + }, null, 12, it)) : T("", !0)], 4), + B(t.$slots, "overlay", { + width: c.value.w, + height: c.value.h + }), + v.value ? (j(), L("div", { + key: 0, + class: R(["mjr-studio-stage__divider", { + "is-vertical": e.compare === "wipeV", + "is-active": ee.value + }]), + style: F(fe.value), + onPointerdown: O(le, ["stop"]), + onPointermove: H, + onPointerup: U, + onPointercancel: U, + onDblclick: n[1] ||= O((e) => i("update:wipe", 50), ["stop"]) + }, [...n[2] ||= [x("span", { class: "mjr-studio-stage__divider-grip" }, null, -1)]], 38)) : T("", !0), + y.value && _.value ? (j(), L("div", { + key: 1, + class: "mjr-studio-stage__side", + style: F({ + left: `calc(100% + ${dt}px)`, + filter: e.mediaFilter || void 0 + }) + }, [(j(), L("img", { + key: `side:${e.compareSrc}`, + class: "mjr-studio-stage__img", + src: e.compareSrc || "", + alt: "", + draggable: "false" + }, null, 8, at))], 4)) : T("", !0) + ], 4), [[ae, !f.value]]), + g.value ? (j(), L("div", ot, [ + n[3] ||= x("span", null, "A", -1), + x("span", st, P(e.compare === "wipeV" ? "/" : "|"), 1), + n[4] ||= x("span", null, "B", -1) + ])) : T("", !0), + f.value ? (j(), L("div", ct, [n[5] ||= x("i", { + class: "pi pi-image", + "aria-hidden": "true" + }, null, -1), x("span", null, P(e.alt), 1)])) : T("", !0) + ], 34)); + } +}), pt = /* @__PURE__ */ E({ + __name: "StudioModel3D", + props: { + asset: {}, + src: {} + }, + setup(e) { + let t = e, n = V(null), r = null; + function i() { + try { + r?.querySelectorAll?.("canvas").forEach((e) => { + e?._mjrProc?.destroy?.(), e._mjrProc = null; + }); + } catch (e) { + console.debug?.(e); + } + r?.remove(), r = null; + } + return S(() => { + if (n.value && t.src) try { + r = U(t.asset, t.src, { + hostClassName: "mjr-model3d-host mjr-studio-model3d__host", + canvasClassName: "mjr-model3d-render-canvas mjr-studio-model3d__canvas", + hintText: "Rotate: left drag Pan: right drag Zoom: wheel or middle drag", + disableViewerTransform: !0 + }), r && n.value.appendChild(r); + } catch (e) { + console.debug?.(e); + } + }), ie(i), (e, t) => (j(), L("div", { + ref_key: "host", + ref: n, + class: "mjr-studio-model3d", + onWheel: t[0] ||= O(() => {}, ["stop"]), + onPointerdown: t[1] ||= O(() => {}, ["stop"]), + onContextmenu: t[2] ||= O(() => {}, ["prevent"]) + }, null, 544)); + } +}), mt = { + key: 0, + class: "mjr-studio-probe", + "aria-hidden": "true" +}, ht = ["width", "height"], gt = { class: "is-dim" }, _t = { class: "is-dim" }, vt = /* @__PURE__ */ E({ + __name: "StudioProbe", + props: { + getSource: { type: Function }, + getBox: { type: Function }, + probe: { type: Boolean }, + loupe: { type: Boolean }, + loupeSize: {}, + loupeZoom: {}, + mediaFilter: {} + }, + setup(e) { + let t = e, n = V(null), r = V(null), i = oe(null), a = 0, o = null; + function s() { + a = 0; + let e = o; + o = null; + let s = t.getBox(), c = t.getSource(); + if (!e || !s || !c) return; + let l = s.getBoundingClientRect(); + if (!(e.clientX >= l.left && e.clientX <= l.right && e.clientY >= l.top && e.clientY <= l.bottom) || l.width <= 0 || l.height <= 0) { + r.value = null, i.value = null; + return; + } + let { w: u, h: d } = X(c), f = (e.clientX - l.left) / l.width * u, p = (e.clientY - l.top) / l.height * d; + if (r.value = { + x: e.clientX, + y: e.clientY + }, t.loupe && n.value && je(n.value, c, f, p, t.loupeZoom), t.probe) { + let e = Ae(c, f, p); + i.value = e ? { + x: Math.floor(f), + y: Math.floor(p), + ...me(e[0], e[1], e[2], e[3]) + } : null; + } + } + function c(e) { + o = e, a ||= requestAnimationFrame(s); + } + return S(() => window.addEventListener("pointermove", c, { passive: !0 })), ie(() => { + window.removeEventListener("pointermove", c), a && cancelAnimationFrame(a); + }), (t, a) => r.value ? (j(), L("div", mt, [e.loupe ? (j(), L("div", { + key: 0, + class: "mjr-studio-probe__loupe", + style: F({ + left: `${r.value.x + 18}px`, + top: `${r.value.y + 18}px`, + width: `${e.loupeSize}px`, + height: `${e.loupeSize}px` + }) + }, [x("canvas", { + ref_key: "loupeCanvas", + ref: n, + width: e.loupeSize, + height: e.loupeSize, + style: F(e.mediaFilter ? { filter: e.mediaFilter } : void 0) + }, null, 12, ht), a[0] ||= x("span", { class: "mjr-studio-probe__cross" }, null, -1)], 4)) : T("", !0), e.probe && i.value ? (j(), L("div", { + key: 1, + class: "mjr-studio-probe__chip", + style: F({ + left: `${r.value.x + 18}px`, + top: `${r.value.y + (e.loupe ? e.loupeSize + 26 : 18)}px` + }) + }, [ + x("span", { + class: "mjr-studio-probe__swatch", + style: F({ background: i.value.hex }) + }, null, 4), + x("span", null, P(i.value.hex), 1), + x("span", gt, P(i.value.rgb), 1), + x("span", _t, "L " + P(i.value.luma) + " · " + P(i.value.x) + "," + P(i.value.y), 1) + ], 4)) : T("", !0)])) : T("", !0); + } +}), yt = { + class: "mjr-studio-scopes", + "aria-label": "Scopes" +}, bt = { + key: 0, + class: "mjr-studio-scopes__panel" +}, xt = { class: "mjr-studio-scopes__label" }, St = { + key: 1, + class: "mjr-studio-scopes__panel" +}, Ct = { class: "mjr-studio-scopes__label" }, wt = /* @__PURE__ */ E({ + __name: "StudioScopes", + props: { + getSource: { type: Function }, + mode: {}, + tick: {} + }, + setup(e) { + let t = e, n = V(null), r = V(null); + function a(e) { + let t = n.value, r = t?.getContext("2d"); + if (!t || !r) return; + let i = fe(e); + r.clearRect(0, 0, t.width, t.height), r.globalCompositeOperation = "lighter"; + let a = (e, n) => { + r.fillStyle = n; + for (let n = 0; n < 256; n++) { + let a = Math.min(1, e[n] / i.max) * t.height; + r.fillRect(n / 256 * t.width, t.height - a, t.width / 256 + .5, a); + } + }; + a(i.r, "rgba(255,70,70,0.75)"), a(i.g, "rgba(70,255,90,0.75)"), a(i.b, "rgba(80,140,255,0.75)"), r.globalCompositeOperation = "source-over", r.strokeStyle = "rgba(255,255,255,0.85)", r.beginPath(); + for (let e = 0; e < 256; e++) { + let n = t.height - Math.min(1, i.l[e] / i.max) * t.height; + e === 0 ? r.moveTo(0, n) : r.lineTo(e / 255 * t.width, n); + } + r.stroke(); + } + function o(e, t, n) { + let i = r.value, a = i?.getContext("2d"); + if (!i || !a) return; + let o = pe(e, t, n, 256), s = a.createImageData(o.columns, 256); + for (let e = 0; e < o.columns; e++) for (let t = 0; t < 256; t++) { + let n = o.bins[e * 256 + t]; + if (!n) continue; + let r = Math.min(255, 40 + n / o.max * 1200), i = ((255 - t) * o.columns + e) * 4; + s.data[i] = 120, s.data[i + 1] = 255, s.data[i + 2] = 150, s.data[i + 3] = r; + } + i.width = o.columns, i.height = 256, a.putImageData(s, 0, 0); + } + function s() { + if (t.mode === "off") return; + let e = ke(t.getSource(), 256); + e && ((t.mode === "hist" || t.mode === "both") && a(e.data), (t.mode === "wave" || t.mode === "both") && o(e.data, e.width, e.height)); + } + return M(() => [t.tick, t.mode], () => requestAnimationFrame(s)), S(s), (t, a) => (j(), L("div", yt, [e.mode === "hist" || e.mode === "both" ? (j(), L("div", bt, [x("span", xt, P(z(i)("viewer.studio.histogram", "Histogram")), 1), x("canvas", { + ref_key: "hist", + ref: n, + width: "256", + height: "110" + }, null, 512)])) : T("", !0), e.mode === "wave" || e.mode === "both" ? (j(), L("div", St, [x("span", Ct, P(z(i)("viewer.studio.waveform", "Waveform")), 1), x("canvas", { + ref_key: "wave", + ref: r, + width: "256", + height: "256", + class: "is-wave" + }, null, 512)])) : T("", !0)])); + } +}), Tt = ["title"], Et = { class: "mjr-studio-slider__head" }, Dt = { class: "mjr-studio-slider__value" }, Ot = [ + "aria-label", + "aria-valuemin", + "aria-valuemax", + "aria-valuenow" +], $ = /* @__PURE__ */ E({ + __name: "StudioSlider", + props: /*@__PURE__*/ H({ + label: {}, + min: {}, + max: {}, + step: { default: .01 }, + defaultValue: { default: void 0 }, + format: { + type: Function, + default: void 0 + } + }, { + modelValue: { required: !0 }, + modelModifiers: {} + }), + emits: ["update:modelValue"], + setup(e) { + let t = e, n = N(e, "modelValue"), r = V(null), i = V(!1), a = k(() => (n.value - t.min) / (t.max - t.min) * 100), o = k(() => t.format ? t.format(n.value) : String(n.value)); + function s(e) { + let n = Math.round((e - t.min) / t.step) * t.step + t.min; + return Number(Math.max(t.min, Math.min(t.max, n)).toFixed(4)); + } + function c(e) { + let i = r.value?.getBoundingClientRect(); + if (!i || i.width <= 0) return; + let a = Math.max(0, Math.min(1, (e.clientX - i.left) / i.width)); + n.value = s(t.min + a * (t.max - t.min)); + } + function l(e) { + i.value = !0, e.currentTarget?.setPointerCapture?.(e.pointerId), c(e); + } + function u(e) { + i.value && c(e); + } + function d() { + i.value = !1; + } + function f(e) { + let r = e.shiftKey ? 10 : 1; + if (e.key === "ArrowLeft" || e.key === "ArrowDown") n.value = s(n.value - t.step * r); + else if (e.key === "ArrowRight" || e.key === "ArrowUp") n.value = s(n.value + t.step * r); + else return; + e.preventDefault(), e.stopPropagation(); + } + function p() { + t.defaultValue != null && (n.value = t.defaultValue); + } + return (t, i) => (j(), L("div", { + class: "mjr-studio-slider", + title: e.defaultValue == null ? void 0 : "Double-click to reset", + onDblclick: p + }, [x("div", Et, [x("span", null, P(e.label), 1), x("span", Dt, P(o.value), 1)]), x("div", { + ref_key: "track", + ref: r, + class: "mjr-studio-slider__track", + role: "slider", + tabindex: "0", + "aria-label": e.label, + "aria-valuemin": e.min, + "aria-valuemax": e.max, + "aria-valuenow": n.value, + onPointerdown: l, + onPointermove: u, + onPointerup: d, + onPointercancel: d, + onKeydown: f + }, [x("div", { + class: "mjr-studio-slider__fill", + style: F({ width: `${a.value}%` }) + }, null, 4), x("div", { + class: "mjr-studio-slider__knob", + style: F({ left: `${a.value}%` }) + }, null, 4)], 40, Ot)], 40, Tt)); + } +}), kt = ["aria-label"], At = { + key: 0, + class: "mjr-studio-rail__tag" +}, jt = { class: "mjr-studio-rail__title" }, Mt = { class: "mjr-studio-seg" }, Nt = { class: "mjr-studio-rail__title" }, Pt = { class: "mjr-studio-rail__title" }, Ft = { class: "mjr-studio-seg" }, It = { class: "mjr-studio-rail__title" }, Lt = { class: "mjr-studio-seg is-wrap" }, Rt = { class: "mjr-studio-rail__title" }, zt = { class: "mjr-studio-seg is-wrap" }, Bt = { class: "mjr-studio-rail__title" }, Vt = { class: "mjr-studio-seg is-wrap" }, Ht = { class: "mjr-studio-rail__title" }, Ut = { class: "mjr-studio-rail__title" }, Wt = { class: "mjr-studio-seg is-wrap" }, Gt = { class: "mjr-studio-rail__b" }, Kt = ["title"], qt = { class: "mjr-studio-seg" }, Jt = /* @__PURE__ */ E({ + __name: "StudioToolRail", + props: /*@__PURE__*/ H({ + isVideo: { type: Boolean }, + canAnalyse: { type: Boolean }, + canCompare: { type: Boolean }, + compareName: {} + }, { + tools: { required: !0 }, + toolsModifiers: {} + }), + emits: /*@__PURE__*/ H([ + "cycle-b", + "pin-b", + "swap", + "copy" + ], ["update:tools"]), + setup(e, { expose: t, emit: n }) { + let r = N(e, "tools"), a = e, o = n, s = V(null), c = V(0), l = V(null), u = [ + { + value: "rgb", + label: "RGB" + }, + { + value: "r", + label: "R" + }, + { + value: "g", + label: "G" + }, + { + value: "b", + label: "B" + }, + { + value: "a", + label: "A" + }, + { + value: "l", + label: "Luma" + } + ], d = [ + { + value: "off", + label: "Off" + }, + { + value: "hist", + label: "Histogram" + }, + { + value: "wave", + label: "Waveform" + }, + { + value: "both", + label: "Both" + } + ], f = [ + { + value: "off", + label: "Off" + }, + { + value: "thirds", + label: "Thirds" + }, + { + value: "golden", + label: "Golden" + }, + { + value: "center", + label: "Center" + }, + { + value: "safe", + label: "Safe areas" + } + ], p = [ + { + value: "off", + label: "Off" + }, + { + value: "16:9", + label: "16:9" + }, + { + value: "9:16", + label: "9:16" + }, + { + value: "1:1", + label: "1:1" + }, + { + value: "4:3", + label: "4:3" + }, + { + value: "2.39", + label: "2.39" + } + ], ee = k(() => q.filter((e) => !(a.isVideo && e.imageOnly))), m = k(() => Math.abs(r.value.exposure) > .001 || Math.abs(r.value.gamma - 1) > .001); + function h(e, t) { + if (s.value === e) { + s.value = null; + return; + } + let n = t.currentTarget, r = l.value?.getBoundingClientRect().top ?? 0; + c.value = Math.max(0, (n?.getBoundingClientRect().top ?? r) - r), s.value = e; + } + function g() { + let e = ve(); + r.value.exposure = e.exposure, r.value.gamma = e.gamma; + } + function _() { + let e = ve(); + Object.assign(r.value, { + ...e, + loupeSize: r.value.loupeSize, + loupeZoom: r.value.loupeZoom + }), s.value = null; + } + function te(e) { + r.value.compare = r.value.compare === e ? "off" : e; + } + function v(e) { + s.value && (l.value?.contains(e.target) || (s.value = null)); + } + S(() => { + document.addEventListener("pointerdown", v, !0); + }), ie(() => { + document.removeEventListener("pointerdown", v, !0); + }); + let ne = (e) => `${e > 0 ? "+" : ""}${e.toFixed(2)} EV`, E = (e) => e.toFixed(2), A = (e) => `${Math.round(e * 100)}%`, M = (e) => `${e}×`, ae = (e) => `${e}px`; + function oe() { + return s.value ? (s.value = null, !0) : !1; + } + return t({ closePanel: oe }), (t, n) => { + let a = re("MButton"); + return j(), L("div", { + ref_key: "rail", + ref: l, + class: "mjr-studio-rail", + onPointerdown: n[24] ||= O(() => {}, ["stop"]), + onWheel: n[25] ||= O(() => {}, ["stop"]), + onDblclick: n[26] ||= O(() => {}, ["stop"]) + }, [x("div", { + class: "mjr-studio-rail__bar", + role: "toolbar", + "aria-label": z(i)("viewer.studio.tools", "Review tools") + }, [ + e.canAnalyse ? (j(), L(y, { key: 0 }, [ + w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { + "is-on": r.value.channel !== "rgb", + "is-open": s.value === "channels" + }]), + title: z(i)("viewer.studio.channels", "Channels"), + onClick: n[0] ||= (e) => h("channels", e) + }, { + default: D(() => [n[27] ||= x("i", { + class: "pi pi-palette", + "aria-hidden": "true" + }, null, -1), r.value.channel === "rgb" ? T("", !0) : (j(), L("span", At, P(r.value.channel.toUpperCase()), 1))]), + _: 1 + }, 8, ["class", "title"]), + w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { + "is-on": m.value, + "is-open": s.value === "exposure" + }]), + title: z(i)("viewer.studio.exposure", "Exposure / gamma"), + onClick: n[1] ||= (e) => h("exposure", e) + }, { + default: D(() => [...n[28] ||= [x("i", { + class: "pi pi-bolt", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]), + w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { + "is-on": r.value.zebra, + "is-open": s.value === "zebra" + }]), + title: z(i)("viewer.studio.zebra", "Zebra highlights (Z)"), + onClick: n[2] ||= (e) => h("zebra", e) + }, { + default: D(() => [...n[29] ||= [x("i", { + class: "pi pi-exclamation-triangle", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]), + w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { + "is-on": r.value.scopes !== "off", + "is-open": s.value === "scopes" + }]), + title: z(i)("viewer.studio.scopes", "Scopes (S)"), + onClick: n[3] ||= (e) => h("scopes", e) + }, { + default: D(() => [...n[30] ||= [x("i", { + class: "pi pi-chart-bar", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]), + n[31] ||= x("span", { class: "mjr-studio-rail__sep" }, null, -1) + ], 64)) : T("", !0), + w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { + "is-on": r.value.grid !== "off", + "is-open": s.value === "grid" + }]), + title: z(i)("viewer.studio.grid", "Guides (G)"), + onClick: n[4] ||= (e) => h("grid", e) + }, { + default: D(() => [...n[32] ||= [x("i", { + class: "pi pi-th-large", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]), + w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { + "is-on": r.value.aspect !== "off", + "is-open": s.value === "aspect" + }]), + title: z(i)("viewer.studio.aspect", "Aspect ratio mask"), + onClick: n[5] ||= (e) => h("aspect", e) + }, { + default: D(() => [...n[33] ||= [x("i", { + class: "pi pi-stop", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]), + e.canAnalyse ? (j(), L(y, { key: 1 }, [ + n[36] ||= x("span", { class: "mjr-studio-rail__sep" }, null, -1), + w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { "is-on": r.value.probe }]), + title: z(i)("viewer.studio.probe", "Pixel probe (P)"), + onClick: n[6] ||= (e) => r.value.probe = !r.value.probe + }, { + default: D(() => [...n[34] ||= [x("i", { + class: "pi pi-map-marker", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]), + w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { + "is-on": r.value.loupe, + "is-open": s.value === "loupe" + }]), + title: z(i)("viewer.studio.loupe", "Loupe (L) - right-click for settings"), + onClick: n[7] ||= (e) => r.value.loupe = !r.value.loupe, + onContextmenu: n[8] ||= O((e) => h("loupe", e), ["prevent"]) + }, { + default: D(() => [...n[35] ||= [x("i", { + class: "pi pi-search-plus", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]) + ], 64)) : T("", !0), + e.canCompare ? (j(), L(y, { key: 2 }, [n[38] ||= x("span", { class: "mjr-studio-rail__sep" }, null, -1), w(a, { + type: "button", + class: R(["mjr-studio-rail__btn", { + "is-on": r.value.compare !== "off", + "is-open": s.value === "compare" + }]), + title: z(i)("viewer.studio.compareTool", "Compare A/B (C)"), + onClick: n[9] ||= (e) => h("compare", e) + }, { + default: D(() => [...n[37] ||= [x("i", { + class: "pi pi-clone", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"])], 64)) : T("", !0), + n[41] ||= x("span", { class: "mjr-studio-rail__sep" }, null, -1), + e.canAnalyse ? (j(), b(a, { + key: 3, + type: "button", + class: "mjr-studio-rail__btn", + title: z(i)("viewer.studio.copy", "Copy image / frame to clipboard"), + onClick: n[10] ||= (e) => o("copy") + }, { + default: D(() => [...n[39] ||= [x("i", { + class: "pi pi-copy", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"])) : T("", !0), + w(a, { + type: "button", + class: "mjr-studio-rail__btn", + title: z(i)("viewer.studio.resetTools", "Reset all tools (R)"), + onClick: _ + }, { + default: D(() => [...n[40] ||= [x("i", { + class: "pi pi-refresh", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"]) + ], 8, kt), s.value ? (j(), L("div", { + key: 0, + class: "mjr-studio-rail__panel", + style: F({ top: `${c.value}px` }), + role: "dialog" + }, [s.value === "channels" ? (j(), L(y, { key: 0 }, [x("div", jt, P(z(i)("viewer.studio.channels", "Channels")), 1), x("div", Mt, [(j(), L(y, null, C(u, (e) => w(a, { + key: e.value, + type: "button", + class: R({ "is-on": r.value.channel === e.value }), + onClick: (t) => r.value.channel = e.value + }, { + default: D(() => [I(P(e.label), 1)]), + _: 2 + }, 1032, ["class", "onClick"])), 64))])], 64)) : s.value === "exposure" ? (j(), L(y, { key: 1 }, [ + x("div", Nt, P(z(i)("viewer.studio.exposure", "Exposure / gamma")), 1), + w($, { + modelValue: r.value.exposure, + "onUpdate:modelValue": n[11] ||= (e) => r.value.exposure = e, + label: z(i)("viewer.studio.ev", "Exposure"), + min: -5, + max: 5, + step: .05, + "default-value": 0, + format: ne + }, null, 8, ["modelValue", "label"]), + w($, { + modelValue: r.value.gamma, + "onUpdate:modelValue": n[12] ||= (e) => r.value.gamma = e, + label: z(i)("viewer.studio.gamma", "Gamma"), + min: .1, + max: 3, + step: .01, + "default-value": 1, + format: E + }, null, 8, ["modelValue", "label"]), + w(a, { + type: "button", + class: "mjr-studio-btn is-text", + onClick: g + }, { + default: D(() => [I(P(z(i)("viewer.studio.reset", "Reset")), 1)]), + _: 1 + }) + ], 64)) : s.value === "zebra" ? (j(), L(y, { key: 2 }, [ + x("div", Pt, P(z(i)("viewer.studio.zebra", "Zebra highlights (Z)")), 1), + x("div", Ft, [w(a, { + type: "button", + class: R({ "is-on": !r.value.zebra }), + onClick: n[13] ||= (e) => r.value.zebra = !1 + }, { + default: D(() => [...n[42] ||= [I("Off", -1)]]), + _: 1 + }, 8, ["class"]), w(a, { + type: "button", + class: R({ "is-on": r.value.zebra }), + onClick: n[14] ||= (e) => r.value.zebra = !0 + }, { + default: D(() => [...n[43] ||= [I("On", -1)]]), + _: 1 + }, 8, ["class"])]), + w($, { + modelValue: r.value.zebraThreshold, + "onUpdate:modelValue": n[15] ||= (e) => r.value.zebraThreshold = e, + label: z(i)("viewer.studio.threshold", "Threshold"), + min: .5, + max: 1, + step: .01, + "default-value": .95, + format: A + }, null, 8, ["modelValue", "label"]) + ], 64)) : s.value === "scopes" ? (j(), L(y, { key: 3 }, [x("div", It, P(z(i)("viewer.studio.scopes", "Scopes (S)")), 1), x("div", Lt, [(j(), L(y, null, C(d, (e) => w(a, { + key: e.value, + type: "button", + class: R({ "is-on": r.value.scopes === e.value }), + onClick: (t) => r.value.scopes = e.value + }, { + default: D(() => [I(P(e.label), 1)]), + _: 2 + }, 1032, ["class", "onClick"])), 64))])], 64)) : s.value === "grid" ? (j(), L(y, { key: 4 }, [x("div", Rt, P(z(i)("viewer.studio.grid", "Guides (G)")), 1), x("div", zt, [(j(), L(y, null, C(f, (e) => w(a, { + key: e.value, + type: "button", + class: R({ "is-on": r.value.grid === e.value }), + onClick: (t) => r.value.grid = e.value + }, { + default: D(() => [I(P(e.label), 1)]), + _: 2 + }, 1032, ["class", "onClick"])), 64))])], 64)) : s.value === "aspect" ? (j(), L(y, { key: 5 }, [ + x("div", Bt, P(z(i)("viewer.studio.aspect", "Aspect ratio mask")), 1), + x("div", Vt, [(j(), L(y, null, C(p, (e) => w(a, { + key: e.value, + type: "button", + class: R({ "is-on": r.value.aspect === e.value }), + onClick: (t) => r.value.aspect = e.value + }, { + default: D(() => [I(P(e.label), 1)]), + _: 2 + }, 1032, ["class", "onClick"])), 64))]), + w($, { + modelValue: r.value.maskOpacity, + "onUpdate:modelValue": n[16] ||= (e) => r.value.maskOpacity = e, + label: z(i)("viewer.studio.opacity", "Opacity"), + min: 0, + max: 1, + step: .05, + "default-value": .65, + format: A + }, null, 8, ["modelValue", "label"]) + ], 64)) : s.value === "loupe" ? (j(), L(y, { key: 6 }, [ + x("div", Ht, P(z(i)("viewer.studio.loupeTitle", "Loupe")), 1), + w($, { + modelValue: r.value.loupeZoom, + "onUpdate:modelValue": n[17] ||= (e) => r.value.loupeZoom = e, + label: z(i)("viewer.studio.magnification", "Magnification"), + min: 2, + max: 32, + step: 1, + "default-value": 8, + format: M + }, null, 8, ["modelValue", "label"]), + w($, { + modelValue: r.value.loupeSize, + "onUpdate:modelValue": n[18] ||= (e) => r.value.loupeSize = e, + label: z(i)("viewer.studio.size", "Size"), + min: 80, + max: 320, + step: 10, + "default-value": 140, + format: ae + }, null, 8, ["modelValue", "label"]) + ], 64)) : s.value === "compare" ? (j(), L(y, { key: 7 }, [ + x("div", Ut, P(z(i)("viewer.studio.compareTool", "Compare A/B (C)")), 1), + x("div", Wt, [(j(!0), L(y, null, C(ee.value, (e) => (j(), b(a, { + key: e.value, + type: "button", + class: R({ "is-on": r.value.compare === e.value }), + onClick: (t) => te(e.value) + }, { + default: D(() => [I(P(e.label), 1)]), + _: 2 + }, 1032, ["class", "onClick"]))), 128))]), + x("div", Gt, [ + n[46] ||= x("span", { class: "mjr-studio-rail__b-label" }, "B", -1), + w(a, { + type: "button", + class: "mjr-studio-btn", + title: z(i)("viewer.studio.prevB", "Previous B"), + onClick: n[19] ||= (e) => o("cycle-b", -1) + }, { + default: D(() => [...n[44] ||= [x("i", { + class: "pi pi-chevron-left", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"]), + x("span", { + class: "mjr-studio-rail__b-name", + title: e.compareName + }, P(e.compareName || "—"), 9, Kt), + w(a, { + type: "button", + class: "mjr-studio-btn", + title: z(i)("viewer.studio.nextB", "Next B"), + onClick: n[20] ||= (e) => o("cycle-b", 1) + }, { + default: D(() => [...n[45] ||= [x("i", { + class: "pi pi-chevron-right", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"]) + ]), + x("div", qt, [w(a, { + type: "button", + title: z(i)("viewer.studio.pinB", "Use the current asset as B (B)"), + onClick: n[21] ||= (e) => o("pin-b") + }, { + default: D(() => [n[47] ||= x("i", { + class: "pi pi-bookmark", + "aria-hidden": "true" + }, null, -1), I(" " + P(z(i)("viewer.studio.pinBShort", "Set B")), 1)]), + _: 1 + }, 8, ["title"]), w(a, { + type: "button", + title: z(i)("viewer.studio.swap", "Swap A and B (X)"), + onClick: n[22] ||= (e) => o("swap") + }, { + default: D(() => [n[48] ||= x("i", { + class: "pi pi-arrow-right-arrow-left", + "aria-hidden": "true" + }, null, -1), I(" " + P(z(i)("viewer.studio.swapShort", "Swap")), 1)]), + _: 1 + }, 8, ["title"])]), + r.value.compare === "wipe" || r.value.compare === "wipeV" ? (j(), b($, { + key: 0, + modelValue: r.value.wipe, + "onUpdate:modelValue": n[23] ||= (e) => r.value.wipe = e, + label: z(i)("viewer.studio.wipe", "Wipe"), + min: 0, + max: 100, + step: 1, + "default-value": 50, + format: (e) => `${e}%` + }, null, 8, [ + "modelValue", + "label", + "format" + ])) : T("", !0) + ], 64)) : T("", !0)], 4)) : T("", !0)], 544); + }; + } +}), Yt = /* @__PURE__ */ E({ + __name: "StudioZebra", + props: { + getSource: { type: Function }, + threshold: {}, + tick: {} + }, + setup(e) { + let t = e, n = V(null), r = 0; + function i() { + let e = n.value, i = ke(t.getSource(), 480); + if (!e || !i) return; + e.width = i.width, e.height = i.height, r = (r + 1) % 8; + let a = be(i.data, i.width, i.height, t.threshold, r); + e.getContext("2d")?.putImageData(new ImageData(a, i.width, i.height), 0, 0); + } + return M(() => [t.tick, t.threshold], i), S(i), (e, t) => (j(), L("canvas", { + ref_key: "canvas", + ref: n, + class: "mjr-studio-zebra", + "aria-hidden": "true" + }, null, 512)); + } +}), Xt = ["aria-label"], Zt = { class: "mjr-studio__header" }, Qt = { class: "mjr-studio__nav" }, $t = { class: "mjr-studio__counter" }, en = { class: "mjr-studio__title" }, tn = ["title"], nn = { class: "mjr-studio__summary" }, rn = { class: "mjr-studio__actions" }, an = ["title"], on = { class: "mjr-studio__body" }, sn = { + key: 4, + class: "mjr-studio__unsupported" +}, cn = { class: "mjr-studio__review" }, ln = { class: "mjr-studio__review-row" }, un = { class: "mjr-studio__label" }, dn = { + class: "mjr-studio__tabs", + role: "tablist" +}, fn = { class: "mjr-studio__tab-body" }, pn = ["aria-label"], mn = ["src"], hn = { + key: 1, + class: "pi pi-file", + "aria-hidden": "true" +}, gn = { + key: 2, + class: "pi pi-play mjr-studio__thumb-badge", + "aria-hidden": "true" +}, _n = /* @__PURE__ */ E({ + __name: "StudioViewer", + setup(c) { + let l = V(null), u = V(null), f = V(null), te = V(null), v = V(!0), S = V("generation"), E = V(!1), A = V(1), N = oe(null), ae = oe(null), F = null, B = k(() => Q.assets[Q.index] ?? null), H = k(() => N.value ?? B.value), U = k(() => K(B.value)), W = k(() => B.value ? n(B.value) : ""), G = k(() => Q.assets.length), fe = k(() => xe(H.value)), pe = k(() => ue(H.value, ae.value)), me = k(() => Number(ae.value?.frame_count) || null), he = k(() => Number(H.value?.rating) || 0), _e = k(() => Array.isArray(H.value?.tags) ? H.value.tags : []), be = k(() => { + let { start: e, end: t } = ge(G.value, Q.index); + return Q.assets.slice(e, t).map((t, n) => ({ + asset: t, + index: e + n + })); + }), q = se(ve()), Ce = `mjr-studio-fx-${Math.random().toString(36).slice(2, 9)}`, we = V(null), Te = V(0), De = null, Oe = -1, J = k(() => U.value === "image" || U.value === "video"), Y = k(() => { + if (!J.value) return null; + let e = we.value, t = Q.assets, n = Q.index; + return e != null && e !== n && t[e] && K(t[e]) === U.value ? e : de(t, n, 1, (e) => K(e) === U.value); + }), X = k(() => Y.value != null), Z = k(() => Y.value == null ? null : Q.assets[Y.value]), ke = k(() => q.compare !== "off" && !!Z.value), Ae = k(() => ke.value && Z.value ? n(Z.value) : null), je = k(() => ke.value && q.compare === "subtract" && U.value === "image" ? Ae.value : null), Ne = k(() => J.value && (Ee(q) || je.value) ? `url(#${Ce})` : ""), Pe = k(() => J.value && (q.zebra || q.scopes !== "off")); + function Re() { + return U.value === "image" ? u.value?.getSource?.() ?? null : U.value === "video" ? f.value?.getSource?.() ?? null : null; + } + function ze() { + return U.value === "image" ? u.value?.getBox?.() ?? null : U.value === "video" ? f.value?.getBox?.() ?? null : null; + } + function Be() { + Te.value += 1; + } + function Ve() { + De && clearInterval(De), De = null; + } + M([ + Pe, + U, + () => Q.open + ], ([e, t, n]) => { + Ve(), e && n && t === "video" && (Oe = -1, De = setInterval(() => { + let e = Re()?.currentTime ?? -1; + e !== Oe && (Oe = e, Be()); + }, 120)); + }, { immediate: !0 }), M(Pe, (e) => { + e && ne(Be); + }); + function He(e) { + let t = Y.value ?? Q.index, n = de(Q.assets, t, e, (e, t) => t !== Q.index && K(e) === U.value); + n != null && (we.value = n); + } + function Ue() { + we.value = Q.index; + let e = de(Q.assets, Q.index, 1, (e) => K(e) === U.value); + e != null && Ie(e), q.compare === "off" && (q.compare = "wipe"); + } + function We() { + let e = Y.value; + e != null && (we.value = Q.index, Ie(e)); + } + function Ge() { + X.value && (q.compare = q.compare === "off" ? "wipe" : "off"); + } + async function Ke() { + let e = await Me(Re()), n = window.ClipboardItem; + if (!e || !n || !navigator.clipboard?.write) t(i("viewer.studio.copyFailed", "Could not copy this image"), "error"); + else try { + await navigator.clipboard.write([new n({ "image/png": e })]), t(i("viewer.studio.copied", "Copied to clipboard"), "success"); + } catch (e) { + console.debug?.(e), t(i("viewer.studio.copyFailed", "Could not copy this image"), "error"); + } + } + let qe = [ + "off", + "hist", + "wave", + "both" + ], Je = [ + "off", + "thirds", + "golden", + "center", + "safe" + ]; + function Ye(e, t) { + return e[(e.indexOf(t) + 1) % e.length]; + } + M(() => Q.session, () => { + we.value = null, q.compare = Q.compare || "off", ne(() => { + let e = document.activeElement; + e && l.value?.contains(e) && rt(e) && e.blur(), l.value?.focus?.({ preventScroll: !0 }); + }); + }, { immediate: !0 }); + async function Ze(e) { + if (F?.abort(), N.value = null, ae.value = null, !e) return; + let t = typeof AbortController < "u" ? new AbortController() : null; + F = t; + try { + let n = await Se(e, { + getAssetMetadata: o, + getFileMetadataScoped: s, + signal: t?.signal + }); + F === t && B.value === e && (N.value = n && typeof n == "object" ? n : e); + } catch (e) { + console.debug?.(e); + } + let n = K(e); + if ((n === "video" || n === "audio") && e?.id != null) try { + let n = await r(e.id, t ? { signal: t.signal } : {}); + F === t && n?.ok && (ae.value = n.data || null); + } catch (e) { + console.debug?.(e); + } + } + M(B, (e) => void Ze(e), { immediate: !0 }), M(() => Q.open, async (e) => { + e ? (await ne(), l.value?.focus?.(), window.addEventListener("keydown", it, !0)) : (window.removeEventListener("keydown", it, !0), Ve(), f.value?.release?.(), F?.abort(), document.fullscreenElement && l.value?.contains(document.fullscreenElement) && document.exitFullscreen?.()); + }, { immediate: !0 }), ie(() => { + window.removeEventListener("keydown", it, !0), Ve(), F?.abort(); + }); + function Qe() { + let e = B.value; + Fe(), e?.id != null && window.dispatchEvent(new CustomEvent(d, { detail: { assetId: String(e.id) } })); + } + function $e() { + document.fullscreenElement ? document.exitFullscreen?.() : l.value?.requestFullscreen?.(); + } + function et() { + if (!W.value) return; + let e = document.createElement("a"); + e.href = W.value, e.download = String(B.value?.filename || ""), e.click(); + } + async function tt(n) { + let r = B.value; + if (!r) return; + let a = Math.max(0, Math.min(5, n)), o = await e(r, a); + o?.ok ? (r.rating = a, N.value = N.value ? { + ...N.value, + rating: a + } : r, window.dispatchEvent(new CustomEvent(p, { detail: { + assetId: r.id == null ? "" : String(r.id), + rating: a + } }))) : t(o?.error || i("toast.ratingUpdateFailed", "Rating update failed"), "error"); + } + function rt(e) { + return !!e?.closest?.("input, textarea, select, [contenteditable='true']"); + } + function it(e) { + if (!Q.open) return; + if (rt(e.target)) { + e.key === "Escape" && e.target?.blur?.(); + return; + } + let t = U.value === "video" || U.value === "audio", n = e.key, r = n.length === 1 ? n.toLowerCase() : n, i = !e.ctrlKey && !e.metaKey && !e.altKey, a = J.value && i, o = !0; + n === "Escape" && te.value?.closePanel?.() || (n === "Escape" ? Qe() : r === "c" && (e.ctrlKey || e.metaKey) && J.value ? Ke() : n === "ArrowLeft" && !e.shiftKey ? Le(-1) : n === "ArrowRight" && !e.shiftKey ? Le(1) : n === "ArrowLeft" && e.shiftKey && t ? f.value?.seekBy?.(-5) : n === "ArrowRight" && e.shiftKey && t ? f.value?.seekBy?.(5) : n === "Home" ? Ie(0) : n === "End" ? Ie(G.value - 1) : n === " " && t ? f.value?.togglePlay?.() : n === "," && t ? f.value?.stepFrame?.(-1) : n === "." && t ? f.value?.stepFrame?.(1) : (n === "i" || n === "I") && t ? f.value?.setLoopA?.() : (n === "o" || n === "O") && t ? f.value?.setLoopB?.() : (n === "u" || n === "U") && t ? f.value?.clearLoop?.() : (n === "m" || n === "M") && t ? f.value?.toggleMute?.() : n === "]" && t ? f.value?.cycleRate?.(1) : n === "[" && t ? f.value?.cycleRate?.(-1) : n === "Tab" ? v.value = !v.value : n === "f" || n === "F" ? $e() : (n === "+" || n === "=") && U.value === "image" ? u.value?.zoomBy?.(1.25) : n === "-" && U.value === "image" ? u.value?.zoomBy?.(.8) : n === "0" && U.value === "image" && e.altKey ? u.value?.fit?.() : /^[0-5]$/.test(n) && !e.ctrlKey && !e.metaKey && !e.altKey ? tt(Number(n)) : r === "c" && i && X.value ? Ge() : r === "b" && i && X.value ? Ue() : r === "x" && i && ke.value ? We() : r === "z" && a ? q.zebra = !q.zebra : r === "s" && a ? q.scopes = Ye(qe, q.scopes) : r === "g" && i && J.value ? q.grid = Ye(Je, q.grid) : r === "p" && a ? q.probe = !q.probe : r === "l" && a ? q.loupe = !q.loupe : r === "r" && a ? Object.assign(q, ve(), { + loupeSize: q.loupeSize, + loupeZoom: q.loupeZoom + }) : o = !1), o && (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.()); + } + function at(e) { + return a(e, 192) || ""; + } + return (e, t) => { + let n = re("MButton"); + return j(), b(le, { to: "body" }, [z(Q).open ? (j(), L("div", { + key: 0, + ref_key: "overlay", + ref: l, + class: R(["mjr-assets-manager mjr-studio", { "is-inspector-closed": !v.value }]), + role: "dialog", + "aria-modal": "true", + "aria-label": z(i)("viewer.studio.title", "Viewer"), + tabindex: "-1" + }, [ + x("header", Zt, [ + x("div", Qt, [ + w(n, { + type: "button", + class: "mjr-studio-btn", + title: z(i)("viewer.studio.prev", "Previous (←)"), + disabled: G.value < 2, + onClick: t[0] ||= (e) => z(Le)(-1) + }, { + default: D(() => [...t[14] ||= [x("i", { + class: "pi pi-chevron-left", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title", "disabled"]), + x("span", $t, P(z(Q).index + 1) + " / " + P(G.value), 1), + w(n, { + type: "button", + class: "mjr-studio-btn", + title: z(i)("viewer.studio.next", "Next (→)"), + disabled: G.value < 2, + onClick: t[1] ||= (e) => z(Le)(1) + }, { + default: D(() => [...t[15] ||= [x("i", { + class: "pi pi-chevron-right", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title", "disabled"]) + ]), + x("div", en, [x("span", { + class: "mjr-studio__filename", + title: H.value?.filepath || H.value?.filename + }, P(H.value?.filename), 9, tn), x("span", nn, P(fe.value), 1)]), + x("div", rn, [ + U.value === "image" ? (j(), L(y, { key: 0 }, [ + x("span", { + class: "mjr-studio-chip", + title: z(i)("viewer.studio.zoomHint", "Wheel to zoom, double-click for fit / 100 %") + }, P(Math.round(A.value * 100)) + "%", 9, an), + w(n, { + type: "button", + class: "mjr-studio-btn", + title: z(i)("viewer.studio.fit", "Fit"), + onClick: t[2] ||= (e) => u.value?.fit() + }, { + default: D(() => [...t[16] ||= [x("i", { + class: "pi pi-arrows-alt", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"]), + w(n, { + type: "button", + class: "mjr-studio-btn is-text", + title: z(i)("viewer.studio.actualSize", "Actual size"), + onClick: t[3] ||= (e) => u.value?.actualSize() + }, { + default: D(() => [...t[17] ||= [I("1:1", -1)]]), + _: 1 + }, 8, ["title"]), + w(n, { + type: "button", + class: R(["mjr-studio-btn", { "is-on": E.value }]), + title: z(i)("viewer.studio.checker", "Transparency checkerboard"), + onClick: t[4] ||= (e) => E.value = !E.value + }, { + default: D(() => [...t[18] ||= [x("i", { + class: "pi pi-th-large", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]) + ], 64)) : T("", !0), + X.value ? (j(), b(n, { + key: 1, + type: "button", + class: R(["mjr-studio-btn", { "is-on": ke.value }]), + title: z(i)("viewer.studio.compare", "Compare A/B (C)"), + onClick: Ge + }, { + default: D(() => [...t[19] ||= [x("i", { + class: "pi pi-clone", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"])) : T("", !0), + w(n, { + type: "button", + class: "mjr-studio-btn", + title: z(i)("viewer.studio.download", "Download"), + onClick: et + }, { + default: D(() => [...t[20] ||= [x("i", { + class: "pi pi-download", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"]), + w(n, { + type: "button", + class: R(["mjr-studio-btn", { "is-on": v.value }]), + title: z(i)("viewer.studio.inspector", "Generation info (Tab)"), + onClick: t[5] ||= (e) => v.value = !v.value + }, { + default: D(() => [...t[21] ||= [x("i", { + class: "pi pi-info-circle", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]), + w(n, { + type: "button", + class: "mjr-studio-btn", + title: z(i)("viewer.studio.fullscreen", "Fullscreen (F)"), + onClick: $e + }, { + default: D(() => [...t[22] ||= [x("i", { + class: "pi pi-window-maximize", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"]), + w(n, { + type: "button", + class: "mjr-studio-btn is-close", + title: z(i)("viewer.studio.close", "Close (Esc)"), + onClick: Qe + }, { + default: D(() => [...t[23] ||= [x("i", { + class: "pi pi-times", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"]) + ]) + ]), + x("main", on, [x("section", { class: R(["mjr-studio__stage", { "has-rail": J.value }]) }, [ + Ne.value ? (j(), b(Xe, { + key: 0, + "filter-id": Ce, + channel: z(q).channel, + exposure: z(q).exposure, + gamma: z(q).gamma, + "subtract-src": je.value + }, null, 8, [ + "channel", + "exposure", + "gamma", + "subtract-src" + ])) : T("", !0), + U.value === "image" ? (j(), b(ft, { + ref_key: "imageStage", + ref: u, + key: `img:${W.value}`, + wipe: z(q).wipe, + "onUpdate:wipe": t[6] ||= (e) => z(q).wipe = e, + src: W.value, + alt: B.value?.filename, + checker: E.value, + "media-filter": Ne.value, + "compare-src": Ae.value, + compare: z(q).compare, + class: R({ "is-probing": z(q).probe || z(q).loupe }), + onZoom: t[7] ||= (e) => A.value = e, + onLoaded: Be, + onDismiss: Qe + }, { + overlay: D(({ width: e, height: t }) => [z(q).zebra ? (j(), b(Yt, { + key: 0, + "get-source": Re, + threshold: z(q).zebraThreshold, + tick: Te.value + }, null, 8, ["threshold", "tick"])) : T("", !0), w(nt, { + width: e, + height: t, + grid: z(q).grid, + aspect: z(q).aspect, + "mask-opacity": z(q).maskOpacity + }, null, 8, [ + "width", + "height", + "grid", + "aspect", + "mask-opacity" + ])]), + _: 1 + }, 8, [ + "wipe", + "src", + "alt", + "checker", + "media-filter", + "compare-src", + "compare", + "class" + ])) : U.value === "video" || U.value === "audio" ? (j(), b(ye, { + ref_key: "player", + ref: f, + key: `media:${W.value}`, + wipe: z(q).wipe, + "onUpdate:wipe": t[8] ||= (e) => z(q).wipe = e, + src: W.value, + kind: U.value, + fps: pe.value, + "frame-count": me.value, + filename: B.value?.filename, + "media-filter": Ne.value, + "compare-src": Ae.value, + compare: z(q).compare, + class: R({ "is-probing": z(q).probe || z(q).loupe }), + "light-dismiss": "", + onDismiss: Qe + }, { + overlay: D(({ width: e, height: t }) => [z(q).zebra ? (j(), b(Yt, { + key: 0, + "get-source": Re, + threshold: z(q).zebraThreshold, + tick: Te.value + }, null, 8, ["threshold", "tick"])) : T("", !0), w(nt, { + width: e, + height: t, + grid: z(q).grid, + aspect: z(q).aspect, + "mask-opacity": z(q).maskOpacity + }, null, 8, [ + "width", + "height", + "grid", + "aspect", + "mask-opacity" + ])]), + _: 1 + }, 8, [ + "wipe", + "src", + "kind", + "fps", + "frame-count", + "filename", + "media-filter", + "compare-src", + "compare", + "class" + ])) : U.value === "model3d" ? (j(), b(pt, { + key: `3d:${W.value}`, + asset: B.value, + src: W.value + }, null, 8, ["asset", "src"])) : (j(), L("div", sn, [t[24] ||= x("i", { + class: "pi pi-file", + "aria-hidden": "true" + }, null, -1), x("span", null, P(z(i)("viewer.studio.unsupported", "No preview for this file type.")), 1)])), + J.value ? (j(), b(Jt, { + key: 5, + ref_key: "toolRail", + ref: te, + tools: z(q), + "onUpdate:tools": t[9] ||= (e) => ce(q) ? q.value = e : q = e, + "is-video": U.value === "video", + "can-analyse": J.value, + "can-compare": X.value, + "compare-name": Z.value?.filename, + onCycleB: He, + onPinB: Ue, + onSwap: We, + onCopy: Ke + }, null, 8, [ + "tools", + "is-video", + "can-analyse", + "can-compare", + "compare-name" + ])) : T("", !0), + J.value && z(q).scopes !== "off" ? (j(), b(wt, { + key: 6, + "get-source": Re, + mode: z(q).scopes, + tick: Te.value + }, null, 8, ["mode", "tick"])) : T("", !0), + J.value && (z(q).probe || z(q).loupe) ? (j(), b(vt, { + key: 7, + "get-source": Re, + "get-box": ze, + probe: z(q).probe, + loupe: z(q).loupe, + "loupe-size": z(q).loupeSize, + "loupe-zoom": z(q).loupeZoom, + "media-filter": je.value ? "" : Ne.value + }, null, 8, [ + "probe", + "loupe", + "loupe-size", + "loupe-zoom", + "media-filter" + ])) : T("", !0) + ], 2), v.value && H.value ? (j(), L("aside", { + key: 0, + class: "mjr-studio__inspector", + onKeydown: t[13] ||= O(() => {}, ["stop"]) + }, [ + x("div", cn, [x("div", ln, [x("span", un, P(z(i)("sidebar.rating", "Rating")), 1), (j(), b(h, { + key: `r:${H.value.id}`, + asset: H.value, + "model-value": he.value, + size: 40 + }, null, 8, ["asset", "model-value"]))]), (j(), b(_, { + key: `t:${H.value.id}`, + asset: H.value, + "model-value": _e.value, + autofocus: !1 + }, null, 8, ["asset", "model-value"]))]), + x("nav", dn, [ + w(n, { + type: "button", + role: "tab", + class: R({ "is-active": S.value === "generation" }), + onClick: t[10] ||= (e) => S.value = "generation" + }, { + default: D(() => [I(P(z(i)("viewer.studio.tabGeneration", "Generation")), 1)]), + _: 1 + }, 8, ["class"]), + w(n, { + type: "button", + role: "tab", + class: R({ "is-active": S.value === "workflow" }), + onClick: t[11] ||= (e) => S.value = "workflow" + }, { + default: D(() => [I(P(z(i)("viewer.studio.tabWorkflow", "Workflow")), 1)]), + _: 1 + }, 8, ["class"]), + w(n, { + type: "button", + role: "tab", + class: R({ "is-active": S.value === "file" }), + onClick: t[12] ||= (e) => S.value = "file" + }, { + default: D(() => [I(P(z(i)("viewer.studio.tabFile", "File")), 1)]), + _: 1 + }, 8, ["class"]) + ]), + x("div", fn, [S.value === "generation" ? (j(), b(m, { + key: `g:${H.value.id}`, + asset: H.value + }, null, 8, ["asset"])) : S.value === "workflow" ? (j(), b(g, { + key: `w:${H.value.id}`, + asset: H.value + }, null, 8, ["asset"])) : (j(), b(ee, { + key: `f:${H.value.id}`, + asset: H.value + }, null, 8, ["asset"]))]) + ], 32)) : T("", !0)]), + G.value > 1 ? (j(), L("footer", { + key: 0, + class: "mjr-studio__filmstrip", + role: "listbox", + "aria-label": z(i)("viewer.studio.filmstrip", "Filmstrip") + }, [(j(!0), L(y, null, C(be.value, (e) => (j(), b(n, { + key: `${e.index}:${e.asset?.id ?? e.asset?.filename}`, + type: "button", + role: "option", + class: R(["mjr-studio__thumb", { "is-current": e.index === z(Q).index }]), + "aria-selected": e.index === z(Q).index, + title: e.asset?.filename, + onClick: (t) => z(Ie)(e.index) + }, { + default: D(() => [at(e.asset) ? (j(), L("img", { + key: 0, + src: at(e.asset), + alt: "", + loading: "lazy", + draggable: "false" + }, null, 8, mn)) : (j(), L("i", hn)), z(K)(e.asset) === "video" ? (j(), L("i", gn)) : T("", !0)]), + _: 2 + }, 1032, [ + "class", + "aria-selected", + "title", + "onClick" + ]))), 128))], 8, pn)) : T("", !0) + ], 10, Xt)) : T("", !0)]); + }; + } +}), vn = /* @__PURE__ */ E({ + __name: "ViewerPortal", + setup(e) { + function t(e) { + let t = e?.detail || {}, n = Array.isArray(t?.assets) ? t.assets.filter(Boolean) : t?.asset ? [t.asset] : []; + n.length && Pe(n, Math.max(0, Math.min(Number(t?.index) || 0, n.length - 1)), String(t?.mode || "").trim().toLowerCase()) && (t.handled = !0); + } + return S(() => { + try { + u(); + } catch (e) { + console.debug?.(e); + } + try { + window.addEventListener(f.OPEN_VIEWER, t); + } catch (e) { + console.debug?.(e); + } + }), A(() => { + try { + window.removeEventListener(f.OPEN_VIEWER, t); + } catch (e) { + console.debug?.(e); + } + try { + l(); + } catch (e) { + console.debug?.(e); + } + }), (e, t) => (j(), L(y, null, [w(_n), w(De)], 64)); + } +}); +export { vn as default }; diff --git a/dist/chunks/ViewerPortal-gWBXDS-v.js b/dist/chunks/ViewerPortal-gWBXDS-v.js deleted file mode 100644 index 3e7610a2..00000000 --- a/dist/chunks/ViewerPortal-gWBXDS-v.js +++ /dev/null @@ -1,342 +0,0 @@ -import { a as e, i as t } from "./viewerRuntimeHosts-n0pKLECw.js"; -import { r as n } from "./events-C65wdOHm.js"; -import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-W-G40j3K.js"; -import { i as d, r as f } from "./floatingViewerManager-BzaQii21.js"; -import { B as p, C as m, D as h, E as g, G as _, J as v, K as y, L as b, N as x, O as S, T as C, U as w, V as T, dt as E, ft as D, j as O, k, lt as A, rt as j, ut as M, w as N, z as P } from "./mjr-primevue-BRqtdXzb.js"; -import { t as F } from "./TagsEditor-2AmCKykg.js"; -// ui/vue/components/viewer/FloatingViewerHost.vue -var I = /* @__PURE__ */ x({ - __name: "FloatingViewerHost", - setup(e) { - let n = j(null), r = null; - return P(() => { - r = t(n.value); - }), p(() => { - r?.(), r = null; - }), (e, t) => (T(), k("div", { - ref_key: "hostRef", - ref: n, - class: "mjr-viewer-runtime-host mjr-viewer-runtime-host--floating", - style: { - position: "fixed", - inset: "0", - "pointer-events": "none", - overflow: "visible" - } - }, null, 512)); - } -}), L = /* @__PURE__ */ x({ - __name: "ViewerOverlayHost", - setup(t) { - let n = j(null), r = null; - return P(() => { - r = e(n.value); - }), p(() => { - r?.(), r = null; - }), (e, t) => (T(), k("div", { - ref_key: "hostRef", - ref: n, - class: "mjr-viewer-runtime-host mjr-viewer-runtime-host--main", - style: { - position: "fixed", - inset: "0", - "pointer-events": "none", - overflow: "visible" - } - }, null, 512)); - } -}), R = { - key: 0, - class: "mjr-context-menu-separator" -}, ee = { class: "mjr-context-menu-item-left" }, te = { class: "mjr-context-menu-item-right" }, z = { - key: 0, - class: "mjr-context-menu-hint" -}, B = { - key: 1, - class: "mjr-context-menu-submenu-arrow" -}, V = { - key: 0, - class: "mjr-context-menu-separator" -}, H = { class: "mjr-context-menu-item-left" }, U = { - key: 0, - class: "mjr-context-menu-hint" -}, W = /* @__PURE__ */ x({ - __name: "ViewerContextMenu", - setup(e) { - let t = j(null), n = j(null), a = j(null), o = null, c = null, l = C(() => x(u.main, 10041)), d = C(() => x(u.submenu, 10042)), f = C(() => x(u.tags, 10043)); - function x(e, t) { - return { - position: "fixed", - left: `${Math.round(Number(e?.x) || 0)}px`, - top: `${Math.round(Number(e?.y) || 0)}px`, - display: "block", - zIndex: String(t) - }; - } - function I() { - o &&= (clearTimeout(o), null); - } - function L() { - I(), o = setTimeout(() => { - s(); - }, 180); - } - function W(e, t) { - if (!e?.open || !t) return; - let n = t.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(e.x) || 0, o = Number(e.y) || 0; - a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), e.x = a, e.y = o; - } - async function G(e, t) { - await b(), W(e, t?.value || null); - } - function K(e) { - try { - e?.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); - } catch (e) { - console.debug?.(e); - } - } - function q(e, t) { - if (!Array.isArray(e?.submenu) || !e.submenu.length) { - s(); - return; - } - I(); - let n = (t?.currentTarget)?.getBoundingClientRect?.(); - i({ - x: Math.round((n?.right || u.main.x || 0) + 6), - y: Math.round((n?.top || u.main.y || 0) - 4), - items: e.submenu, - title: e.label || "" - }); - } - async function J(e, t, n = "main") { - if (e && e.type === "item" && !e.disabled) { - if (Array.isArray(e.submenu) && e.submenu.length) q(e, t); - else try { - await e.action?.(); - } catch (e) { - console.error("[ViewerContextMenu.vue] Action failed:", e); - } finally { - e.closeOnSelect === !1 ? n === "submenu" && s() : r(); - } - } - } - function Y(e, t) { - Array.isArray(e?.submenu) && e.submenu.length ? q(e, t) : s(); - } - function X(e) { - Array.isArray(e?.submenu) && e.submenu.length && L(); - } - function Z() { - I(); - } - function ne() { - L(); - } - function re(e) { - let i = e?.target; - t.value?.contains?.(i) || n.value?.contains?.(i) || a.value?.contains?.(i) || r(); - } - function Q(e) { - e?.key === "Escape" && r(); - } - function $() { - r(); - } - function ie(e) { - let t = e?.detail; - String(t?.source || "") !== "viewer" && r(); - } - function ae(e) { - let t = u.tags.asset; - t && (t.tags = Array.isArray(e) ? [...e] : []); - } - function oe(e) { - let t = Array.isArray(e?.tags) ? e.tags : []; - try { - u.tags.onChanged?.(t); - } catch (e) { - console.debug?.(e); - } - } - return y(() => u.main.open, async (e) => { - e && (await G(u.main, t), K(t)); - }), y(() => u.submenu.open, async (e) => { - e && (await G(u.submenu, n), K(n)); - }), y(() => u.tags.open, async (e) => { - e && await G(u.tags, a); - }), P(() => { - c = new AbortController(); - let e = { - capture: !0, - passive: !0, - signal: c.signal - }; - window.addEventListener("pointerdown", re, e), window.addEventListener("keydown", Q, { - capture: !0, - signal: c.signal - }), window.addEventListener("scroll", $, e), window.addEventListener("wheel", $, e), window.addEventListener("resize", $, { - passive: !0, - signal: c.signal - }), window.addEventListener("mjr-close-all-menus", ie, { signal: c.signal }); - }), p(() => { - I(); - try { - c?.abort(); - } catch (e) { - console.debug?.(e); - } - c = null, r(); - }), (e, r) => { - let i = _("MButton"); - return T(), h(N, { to: "body" }, [ - A(u).main.open ? (T(), k("div", { - key: 0, - ref_key: "mainMenuRef", - ref: t, - class: "mjr-viewer-context-menu mjr-context-menu", - style: E(l.value), - role: "menu", - "aria-label": "Viewer context menu" - }, [(T(!0), k(m, null, w(A(u).main.items, (e) => (T(), k(m, { key: e.id }, [e.type === "separator" ? (T(), k("div", R)) : (T(), h(i, { - key: 1, - type: "button", - class: M(["mjr-context-menu-item", { - "is-disabled": e.disabled, - "has-submenu": Array.isArray(e.submenu) && e.submenu.length - }]), - severity: "secondary", - text: "", - role: "menuitem", - "aria-disabled": e.disabled ? "true" : "false", - tabindex: e.disabled ? -1 : 0, - onClick: (t) => J(e, t), - onMouseenter: (t) => Y(e, t), - onMouseleave: (t) => X(e) - }, { - default: v(() => [g("span", ee, [e.iconClass ? (T(), k("i", { - key: 0, - class: M(e.iconClass) - }, null, 2)) : S("", !0), g("span", null, D(e.label), 1)]), g("span", te, [e.rightHint ? (T(), k("span", z, D(e.rightHint), 1)) : S("", !0), Array.isArray(e.submenu) && e.submenu.length ? (T(), k("span", B, " > ")) : S("", !0)])]), - _: 2 - }, 1032, [ - "class", - "aria-disabled", - "tabindex", - "onClick", - "onMouseenter", - "onMouseleave" - ]))], 64))), 128))], 4)) : S("", !0), - A(u).submenu.open ? (T(), k("div", { - key: 1, - ref_key: "submenuRef", - ref: n, - class: "mjr-viewer-rating-submenu mjr-context-menu", - style: E(d.value), - role: "menu", - "aria-label": "Viewer context submenu", - onMouseenter: Z, - onMouseleave: ne - }, [(T(!0), k(m, null, w(A(u).submenu.items, (e) => (T(), k(m, { key: e.id }, [e.type === "separator" ? (T(), k("div", V)) : (T(), h(i, { - key: 1, - type: "button", - class: M(["mjr-context-menu-item", { "is-disabled": e.disabled }]), - severity: "secondary", - text: "", - role: "menuitem", - "aria-disabled": e.disabled ? "true" : "false", - tabindex: e.disabled ? -1 : 0, - onClick: (t) => J(e, t, "submenu") - }, { - default: v(() => [g("span", H, [e.iconClass ? (T(), k("i", { - key: 0, - class: M(e.iconClass) - }, null, 2)) : S("", !0), g("span", null, D(e.label), 1)]), e.rightHint ? (T(), k("span", U, D(e.rightHint), 1)) : S("", !0)]), - _: 2 - }, 1032, [ - "class", - "aria-disabled", - "tabindex", - "onClick" - ]))], 64))), 128))], 36)) : S("", !0), - A(u).tags.open && A(u).tags.asset ? (T(), k("div", { - key: 2, - ref_key: "tagsPopoverRef", - ref: a, - class: "mjr-viewer-popover", - style: E(f.value) - }, [O(F, { - asset: A(u).tags.asset, - "model-value": A(u).tags.asset?.tags || [], - "onUpdate:modelValue": ae, - onTagsChange: oe - }, null, 8, ["asset", "model-value"])], 4)) : S("", !0) - ]); - }; - } -}), G = /* @__PURE__ */ x({ - __name: "ViewerContextMenuPortal", - setup(e) { - let t = j(""), n = C(() => c(t.value)); - return P(() => { - t.value = a(); - }), p(() => { - o(t.value), t.value = ""; - }), (e, t) => n.value ? (T(), h(W, { key: 0 })) : S("", !0); - } -}), K = /* @__PURE__ */ x({ - __name: "ViewerPortal", - setup(e) { - let t = null; - function r(e) { - let n = e?.detail || {}, r = Array.isArray(n?.assets) ? n.assets.filter(Boolean) : n?.asset ? [n.asset] : []; - if (!r.length) return; - let i = Math.max(0, Math.min(Number(n?.index) || 0, r.length - 1)), a = String(n?.mode || "").trim().toLowerCase(); - try { - t ||= l(), t.open?.(r, i), (a === "ab" || a === "sidebyside") && t.setMode?.(a), n.handled = !0; - } catch (e) { - console.debug?.(e); - } - } - return P(() => { - try { - f(); - } catch (e) { - console.debug?.(e); - } - try { - t = l(); - } catch (e) { - console.debug?.(e); - } - try { - window.addEventListener(n.OPEN_VIEWER, r); - } catch (e) { - console.debug?.(e); - } - }), p(() => { - try { - window.removeEventListener(n.OPEN_VIEWER, r); - } catch (e) { - console.debug?.(e); - } - try { - d(); - } catch (e) { - console.debug?.(e); - } - try { - t?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - t = null; - }), (e, t) => (T(), k(m, null, [ - O(L), - O(I), - O(G) - ], 64)); - } -}); -export { K as default }; diff --git a/dist/chunks/abCompare-BUrGm4-x.js b/dist/chunks/abCompare-BUrGm4-x.js deleted file mode 100644 index f94a7ecb..00000000 --- a/dist/chunks/abCompare-BUrGm4-x.js +++ /dev/null @@ -1,451 +0,0 @@ -// ui/features/viewer/abCompare.ts -function e({ abView: e, state: t, currentAsset: n, viewUrl: r, buildAssetViewURL: i, createCompareMediaElement: a, destroyMediaProcessorsIn: o } = {}) { - try { - o?.(e); - } catch (e) { - console.debug?.(e); - } - try { - e && (e.innerHTML = ""); - } catch (e) { - console.debug?.(e); - } - try { - e?._mjrSyncAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - e?._mjrDiffAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - e?._mjrSliderAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - e._mjrDiffRequest = null; - } catch (e) { - console.debug?.(e); - } - try { - e._mjrSliderAbort = null; - } catch (e) { - console.debug?.(e); - } - if (!e || !t || !n) return; - let s = (e, t) => { - try { - let n = e?.querySelector?.(".mjr-viewer-audio-src") || e?.querySelector?.("audio"); - if (!n) return; - let r = String(t || "").toUpperCase() === "A"; - if (n.muted = !r, !r) try { - n.pause?.(); - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } - }, c = (() => { - try { - let e = String(t.abCompareMode || "wipe"); - return e === "wipeH" ? "wipe" : e; - } catch { - return "wipe"; - } - })(), l = c === "wipe" || c === "wipeV", u = c === "wipeV" ? "y" : "x", d = t.compareAsset || (Array.isArray(t.assets) && t.assets.length === 2 ? t.assets[1 - (t.currentIndex || 0)] : null) || n, f = (() => { - try { - return i?.(d); - } catch { - return ""; - } - })(), p = document.createElement("div"); - p.style.cssText = "\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n "; - let m = a?.(d, f); - m && p.appendChild(m); - try { - let e = m?.querySelector?.(".mjr-viewer-video-src") || m?.querySelector?.("video"); - e?.dataset && (e.dataset.mjrCompareRole = "B"); - let t = m?.querySelector?.(".mjr-viewer-audio-src") || m?.querySelector?.("audio"); - t?.dataset && (t.dataset.mjrCompareRole = "B"); - } catch (e) { - console.debug?.(e); - } - s(m, "B"); - try { - let e = m?.querySelector?.("canvas.mjr-viewer-media") || (m instanceof HTMLCanvasElement ? m : null); - e?.dataset && (e.dataset.mjrCompareRole = "B"); - } catch (e) { - console.debug?.(e); - } - let h = document.createElement("div"); - h.style.cssText = "\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n "; - let g = (() => { - try { - return !!window.CSS?.supports?.("clip-path: inset(0 50% 0 0)"); - } catch { - return !1; - } - })(), _ = (t) => { - try { - let n = Math.max(0, Math.min(100, Number(t) || 0)); - if (g) { - let e = u === "y" ? `inset(0 0 ${100 - n}% 0)` : `inset(0 ${100 - n}% 0 0)`; - h.style.clipPath = e, h.style.webkitClipPath = e; - return; - } - let r = e.getBoundingClientRect(), i = r.width || 1, a = r.height || 1; - if (u === "y") { - let e = Math.round(a * n / 100); - h.style.clip = `rect(0px, ${i}px, ${e}px, 0px)`; - } else { - let e = Math.round(i * n / 100); - h.style.clip = `rect(0px, ${e}px, ${a}px, 0px)`; - } - } catch (e) { - console.debug?.(e); - } - }, v = (() => { - if (!l) return 100; - try { - let e = Number(t._abWipePercent); - if (Number.isFinite(e) && e >= 0 && e <= 100) return e; - } catch (e) { - console.debug?.(e); - } - return 50; - })(); - _(v); - try { - l && (t._abWipePercent = v); - } catch (e) { - console.debug?.(e); - } - let y = a?.(n, r); - y && h.appendChild(y); - try { - let e = y?.querySelector?.(".mjr-viewer-video-src") || y?.querySelector?.("video"); - e?.dataset && (e.dataset.mjrCompareRole = "A"); - let t = y?.querySelector?.(".mjr-viewer-audio-src") || y?.querySelector?.("audio"); - t?.dataset && (t.dataset.mjrCompareRole = "A"); - } catch (e) { - console.debug?.(e); - } - s(y, "A"); - try { - let e = y?.querySelector?.("canvas.mjr-viewer-media") || (y instanceof HTMLCanvasElement ? y : null); - e?.dataset && (e.dataset.mjrCompareRole = "A"); - } catch (e) { - console.debug?.(e); - } - let b = document.createElement("div"); - b.className = "mjr-ab-slider", b.style.cssText = "\n position: absolute;\n z-index: 10;\n touch-action: none;\n user-select: none;\n "; - let x = document.createElement("div"); - x.style.cssText = "\n position: absolute;\n background: white;\n pointer-events: none;\n box-shadow: 0 0 4px rgba(0,0,0,0.5);\n ", b.appendChild(x); - let S = (e) => e === "multiply" || e === "screen" || e === "add"; - try { - if (l) { - b.style.display = ""; - try { - let e = y?.querySelector?.(".mjr-viewer-media") || y; - e && (e.style.mixBlendMode = ""); - } catch (e) { - console.debug?.(e); - } - } else { - _(100), b.style.display = "none"; - try { - h.style.opacity = "0", p.style.opacity = "0", h.style.pointerEvents = "none", p.style.pointerEvents = "none"; - } catch (e) { - console.debug?.(e); - } - let t = document.createElement("div"); - t.style.cssText = "\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n "; - let n = document.createElement("canvas"); - n.className = "mjr-viewer-media"; - try { - n.dataset.mjrCompareRole = "D"; - } catch (e) { - console.debug?.(e); - } - n.style.cssText = "\n max-width: 100%;\n max-height: 100%;\n display: block;\n ", t.appendChild(n); - let r = (e) => { - try { - return e ? e instanceof HTMLCanvasElement ? e : e.querySelector?.("canvas.mjr-viewer-media") || e.querySelector?.("canvas") || null : null; - } catch { - return null; - } - }, i = r(y), a = r(m), o = (() => { - try { - return n.getContext("2d", { willReadFrequently: !0 }); - } catch { - return null; - } - })(), s = () => { - try { - let e = i?.width || 0, t = i?.height || 0, r = a?.width || 0, o = a?.height || 0, s = Math.max(1, Math.min(e || r, r || e)), c = Math.max(1, Math.min(t || o, o || t)); - return n.width !== s && (n.width = s), n.height !== c && (n.height = c), { - w: s, - h: c - }; - } catch { - return { - w: 0, - h: 0 - }; - } - }, l = () => { - if (!o) return !1; - let { w: e, h: t } = s(); - if (!(e > 1 && t > 1)) return !1; - let n = !1; - try { - o.save(), n = !0; - } catch (e) { - console.debug?.(e); - } - try { - try { - o.clearRect(0, 0, e, t); - } catch (e) { - console.debug?.(e); - } - let n = e * t, r = !!(y?.querySelector?.("video") || m?.querySelector?.("video")), s = (n) => { - try { - return o.globalCompositeOperation = "copy", o.drawImage(a, 0, 0, e, t), o.globalCompositeOperation = n, o.drawImage(i, 0, 0, e, t), o.globalCompositeOperation = "source-over", !0; - } catch { - return !1; - } - }, l = () => { - if (r || !(n > 0 && n <= 75e4)) return s("difference"); - try { - o.globalCompositeOperation = "copy", o.drawImage(i, 0, 0, e, t); - let n = o.getImageData(0, 0, e, t); - o.clearRect(0, 0, e, t), o.globalCompositeOperation = "copy", o.drawImage(a, 0, 0, e, t); - let r = o.getImageData(0, 0, e, t), s = n.data, c = r.data; - for (let e = 0; e < c.length; e += 4) c[e] = Math.max(0, (c[e] || 0) - (s[e] || 0)), c[e + 1] = Math.max(0, (c[e + 1] || 0) - (s[e + 1] || 0)), c[e + 2] = Math.max(0, (c[e + 2] || 0) - (s[e + 2] || 0)), c[e + 3] = 255; - return o.putImageData(r, 0, 0), o.globalCompositeOperation = "source-over", !0; - } catch { - return s("difference"); - } - }; - if (S(c)) return s(c === "add" ? "lighter" : c); - if (c === "subtract") return l(); - let u = () => { - if (r || !(n > 0 && n <= 1e6)) return s("difference"); - try { - o.globalCompositeOperation = "copy", o.drawImage(i, 0, 0, e, t); - let n = o.getImageData(0, 0, e, t); - o.clearRect(0, 0, e, t), o.drawImage(a, 0, 0, e, t); - let r = o.getImageData(0, 0, e, t), s = n.data, c = r.data, l = 0; - for (let e = 0; e < s.length; e += 4) c[e] = Math.abs((s[e] || 0) - (c[e] || 0)), c[e + 1] = Math.abs((s[e + 1] || 0) - (c[e + 1] || 0)), c[e + 2] = Math.abs((s[e + 2] || 0) - (c[e + 2] || 0)), c[e + 3] = 255, c[e] > l && (l = c[e]), c[e + 1] > l && (l = c[e + 1]), c[e + 2] > l && (l = c[e + 2]); - if (l > 0 && l < 255) { - let e = 255 / l; - for (let t = 0; t < c.length; t += 4) c[t] = Math.min(255, Math.round(c[t] * e)), c[t + 1] = Math.min(255, Math.round(c[t + 1] * e)), c[t + 2] = Math.min(255, Math.round(c[t + 2] * e)); - } - return o.putImageData(r, 0, 0), o.globalCompositeOperation = "source-over", !0; - } catch { - return s("difference"); - } - }; - if (c === "absdiff") return u(); - if (!s("difference")) return !1; - if (c === "difference") try { - if (n > 0 && n <= 1e6) { - let n = o.getImageData(0, 0, e, t), r = n.data; - for (let e = 0; e < r.length; e += 4) r[e] = Math.min(255, (r[e] || 0) * 4), r[e + 1] = Math.min(255, (r[e + 1] || 0) * 4), r[e + 2] = Math.min(255, (r[e + 2] || 0) * 4), r[e + 3] = 255; - o.putImageData(n, 0, 0); - } - } catch (e) { - console.debug?.(e); - } - return !0; - } finally { - if (n) try { - o.restore(); - } catch (e) { - console.debug?.(e); - } - } - }; - try { - e.appendChild(t); - } catch (e) { - console.debug?.(e); - } - try { - let t = new AbortController(); - e._mjrDiffAbort = t; - let n = 0, r = () => { - let e = performance.now(); - return e - n < 83.33333333333333 ? !1 : (n = e, !0); - }, o = () => { - if (!t.signal.aborted) try { - requestAnimationFrame(() => { - if (!t.signal.aborted) try { - i && a && r() && l(); - } catch (e) { - console.debug?.(e); - } - }); - } catch (e) { - console.debug?.(e); - } - }; - if (e._mjrDiffRequest = o, y?.querySelector?.("video") || m?.querySelector?.("video")) { - let e = null, n = y?.querySelector?.("video") || null, s = m?.querySelector?.("video") || null, c = () => { - try { - let e = n ? !n.paused : !1, t = s ? !s.paused : !1; - return e || t; - } catch { - return !0; - } - }, u = () => { - if (!t.signal.aborted) { - try { - i && a && r() && l(); - } catch (e) { - console.debug?.(e); - } - if (!c()) e = null; - else try { - e = requestAnimationFrame(u); - } catch { - e = null; - } - } - }, d = () => { - if (!t.signal.aborted && e == null) try { - e = requestAnimationFrame(u); - } catch { - e = null; - } - }; - try { - n && (n.addEventListener("play", d, { - signal: t.signal, - passive: !0 - }), n.addEventListener("seeking", o, { - signal: t.signal, - passive: !0 - }), n.addEventListener("seeked", o, { - signal: t.signal, - passive: !0 - }), n.addEventListener("timeupdate", o, { - signal: t.signal, - passive: !0 - })); - } catch (e) { - console.debug?.(e); - } - try { - s && (s.addEventListener("play", d, { - signal: t.signal, - passive: !0 - }), s.addEventListener("seeking", o, { - signal: t.signal, - passive: !0 - }), s.addEventListener("seeked", o, { - signal: t.signal, - passive: !0 - }), s.addEventListener("timeupdate", o, { - signal: t.signal, - passive: !0 - })); - } catch (e) { - console.debug?.(e); - } - d(), t.signal.addEventListener("abort", () => { - try { - e != null && cancelAnimationFrame(e); - } catch (e) { - console.debug?.(e); - } - }, { once: !0 }); - } else o(); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - let C = !1, w = null, T = (e) => { - try { - let n = Math.max(0, Math.min(100, e)); - _(n); - try { - t._abWipePercent = n; - } catch (e) { - console.debug?.(e); - } - u === "y" ? b.style.top = `${n}%` : b.style.left = `${n}%`; - } catch (e) { - console.debug?.(e); - } - }, E = (t) => { - if (C) try { - t.preventDefault(), t.stopPropagation(), w ||= e.getBoundingClientRect(); - let n = 50; - n = u === "y" ? ((Number(t.clientY) || 0) - w.top) / w.height * 100 : ((Number(t.clientX) || 0) - w.left) / w.width * 100, T(n); - } catch (e) { - console.debug?.(e); - } - }, D = (e) => { - if (C) { - C = !1, w = null; - try { - b.releasePointerCapture(e.pointerId), b.style.cursor = u === "y" ? "ns-resize" : "ew-resize"; - } catch (e) { - console.debug?.(e); - } - } - }; - try { - let t = new AbortController(); - e._mjrSliderAbort = t, b.addEventListener("pointerdown", (t) => { - if (t.button === 0) { - C = !0, t.preventDefault(), t.stopPropagation(); - try { - w = e.getBoundingClientRect(); - } catch (e) { - console.debug?.(e); - } - try { - b.setPointerCapture(t.pointerId), b.style.cursor = "grabbing"; - } catch (e) { - console.debug?.(e); - } - E(t); - } - }, { - signal: t.signal, - passive: !1 - }), window.addEventListener("pointermove", E, { - signal: t.signal, - passive: !1 - }), window.addEventListener("pointerup", D, { - signal: t.signal, - passive: !0 - }), window.addEventListener("pointercancel", D, { - signal: t.signal, - passive: !0 - }); - } catch (e) { - console.debug?.(e); - } - try { - u === "y" ? (b.style.width = "100%", b.style.height = "40px", b.style.left = "0", b.style.top = `${v}%`, b.style.transform = "translate(0, -50%)", b.style.cursor = "ns-resize", x.style.width = "100%", x.style.height = "1px", x.style.top = "50%", x.style.transform = "translate(0, -50%)") : (b.style.height = "100%", b.style.width = "40px", b.style.top = "0", b.style.left = `${v}%`, b.style.transform = "translate(-50%, 0)", b.style.cursor = "ew-resize", x.style.height = "100%", x.style.width = "1px", x.style.left = "50%", x.style.transform = "translate(-50%, 0)"); - } catch (e) { - console.debug?.(e); - } - try { - e.appendChild(p), e.appendChild(h), e.appendChild(b); - } catch (e) { - console.debug?.(e); - } -} -export { e as renderABCompareView }; diff --git a/dist/chunks/events-C65wdOHm.js b/dist/chunks/config-C9a-wT5M.js similarity index 61% rename from dist/chunks/events-C65wdOHm.js rename to dist/chunks/config-C9a-wT5M.js index 05c59dad..9c41daa7 100644 --- a/dist/chunks/events-C65wdOHm.js +++ b/dist/chunks/config-C9a-wT5M.js @@ -1,14 +1,16 @@ import { a as e, n as t, s as n } from "./graphTraversal-DTdQWkn5.js"; +// ui/app/settingsStore.ts +var r = "mjrSettings", i = "mjrMinimapSettings"; // ui/utils/ids.ts -function r(e) { +function a(e) { try { return String(e ?? "").trim(); } catch { return ""; } } -var i = 0; -function a(e) { +var o = 0; +function s(e) { let t = Math.max(4, Number(e) || 0); try { let e = globalThis.crypto; @@ -19,17 +21,17 @@ function a(e) { return ""; } } -function o(e = "", t = 16) { - let n = a(t); +function c(e = "", t = 16) { + let n = s(t); if (!n) throw Error("Secure token generation requires crypto.getRandomValues()."); return `${String(e || "")}${n}`; } -function s(e = "", t = 8) { - let n = a(t); - return n ? `${String(e || "")}${n}` : (i += 1, `${String(e || "")}${Date.now().toString(36)}_${i.toString(36)}`); +function l(e = "", t = 8) { + let n = s(t); + return n ? `${String(e || "")}${n}` : (o += 1, `${String(e || "")}${Date.now().toString(36)}_${o.toString(36)}`); } -function c(e) { - let t = r(e); +function u(e) { + let t = a(e); if (!t || !/^\d+$/.test(t)) return ""; try { let e = Number(t); @@ -38,24 +40,24 @@ function c(e) { return ""; } } -function l(e) { - return c(e); +function d(e) { + return u(e); } -function u(e) { +function f(e) { try { if (!e) return ""; let t = e, n = t.file_info; - return r(t.root_id ?? t.rootId ?? t.custom_root_id ?? t.customRootId ?? t.customRoot ?? n?.root_id ?? n?.rootId ?? ""); + return a(t.root_id ?? t.rootId ?? t.custom_root_id ?? t.customRootId ?? t.customRoot ?? n?.root_id ?? n?.rootId ?? ""); } catch { return ""; } } // ui/utils/path.ts -function d(e) { +function p(e) { return String(e || "").replace(/\\/g, "/"); } -function f(e) { - let t = d(e).trim(); +function m(e) { + let t = p(e).trim(); if (!t) return { filename: "", subfolder: "" @@ -69,11 +71,11 @@ function f(e) { subfolder: t.slice(0, n) }; } -function p(e) { +function h(e) { return /^[a-zA-Z]:\//.test(String(e || "")); } // ui/api/endpoints.ts -var m = 200, h = 0, g = { +var g = 200, _ = 0, v = { HEALTH: "/mjr/am/health", HEALTH_COUNTERS: "/mjr/am/health/counters", HEALTH_DB: "/mjr/am/health/db", @@ -130,7 +132,6 @@ var m = 200, h = 0, g = { DATE_HISTOGRAM: "/mjr/am/date-histogram", ASSET_DELETE: "/mjr/am/asset/delete", ASSET_RENAME: "/mjr/am/asset/rename", - ASSETS_TAGS: "/mjr/am/assets/tags", WATCHER_STATUS: "/mjr/am/watcher/status", WATCHER_TOGGLE: "/mjr/am/watcher/toggle", WATCHER_SCOPE: "/mjr/am/watcher/scope", @@ -176,35 +177,35 @@ var m = 200, h = 0, g = { WORKFLOWS_THUMBNAIL_SET: "/mjr/am/workflows/thumbnail/set", WORKFLOWS_OPEN_ROOT: "/mjr/am/workflows/open-root" }; -function _(e, t = {}) { +function y(e, t = {}) { let n = String(e || ""), r = () => n.includes("?") ? "&" : "?", i = (e) => { n += r() + e; }, { subfolder: a = null, kind: o = null, hasWorkflow: s = null, minRating: c = null, minSizeMB: l = null, maxSizeMB: u = null, minWidth: d = null, minHeight: f = null, maxWidth: p = null, maxHeight: m = null, workflowType: h = null, workflowId: g = null, workflowModel: _ = null, runsOn: v = null, dateRange: y = null, dateExact: b = null } = t || {}; return a && i(`subfolder=${encodeURIComponent(String(a))}`), o && i(`kind=${encodeURIComponent(o)}`), s != null && i(`has_workflow=${encodeURIComponent(s ? "true" : "false")}`), c != null && Number(c) > 0 && i(`min_rating=${encodeURIComponent(String(c))}`), l != null && Number(l) > 0 && i(`min_size_mb=${encodeURIComponent(String(l))}`), u != null && Number(u) > 0 && i(`max_size_mb=${encodeURIComponent(String(u))}`), d != null && Number(d) > 0 && i(`min_width=${encodeURIComponent(String(d))}`), f != null && Number(f) > 0 && i(`min_height=${encodeURIComponent(String(f))}`), p != null && Number(p) > 0 && i(`max_width=${encodeURIComponent(String(p))}`), m != null && Number(m) > 0 && i(`max_height=${encodeURIComponent(String(m))}`), h && i(`workflow_type=${encodeURIComponent(String(h))}`), g && i(`workflow_id=${encodeURIComponent(String(g))}`), _ && i(`workflow_model=${encodeURIComponent(String(_))}`), v && i(`runs_on=${encodeURIComponent(String(v))}`), y && i(`date_range=${encodeURIComponent(String(y))}`), b && i(`date_exact=${encodeURIComponent(String(b))}`), n; } -function v(e, t = null, n = "output") { +function b(e, t = null, n = "output") { let r = String(e || "").trim(); if (!r) return ""; - let i = `${g.VIEW}?filename=${encodeURIComponent(r)}`; + let i = `${v.VIEW}?filename=${encodeURIComponent(r)}`; return t && (i += `&subfolder=${encodeURIComponent(t)}`), i += `&type=${encodeURIComponent(n)}`, i; } -function y(e, t = 384) { +function x(e, t = 384) { let n = String(e?.filepath || e?.path || e?.file_path || "").trim(); if (!n) return ""; let r = Math.max(64, Math.min(1024, Math.floor(Number(t) || 384))); - return `${g.THUMBNAIL}?filepath=${encodeURIComponent(n)}&size=${encodeURIComponent(String(r))}`; + return `${v.THUMBNAIL}?filepath=${encodeURIComponent(n)}&size=${encodeURIComponent(String(r))}`; } -function b(e = {}) { - let { q: t = "*", limit: n = m, offset: r = h, scope: i = "output", subfolder: a = "", customRootId: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, resolutionCompare: f = null, minWidth: p = null, minHeight: v = null, maxWidth: y = null, maxHeight: b = null, workflowType: x = null, workflowId: ee = null, workflowModel: te = null, runsOn: ne = null, dateRange: re = null, dateExact: ie = null, sort: ae = null, cursor: oe = null, includeTotal: se = !0, groupStacks: ce = !1, metadataMode: S = null } = e, C = `${g.LIST}?q=${encodeURIComponent(t)}&limit=${n}&offset=${r}&scope=${encodeURIComponent(i)}`; - return a && (C += `&subfolder=${encodeURIComponent(a)}`), o ? C += `&custom_root_id=${encodeURIComponent(o)}` : String(i || "").toLowerCase() === "custom" && (C += "&browser_mode=1"), C = _(C, { +function ee(e = {}) { + let { q: t = "*", limit: n = g, offset: r = _, scope: i = "output", subfolder: a = "", customRootId: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, resolutionCompare: f = null, minWidth: p = null, minHeight: m = null, maxWidth: h = null, maxHeight: b = null, workflowType: x = null, workflowId: ee = null, workflowModel: te = null, runsOn: ne = null, dateRange: re = null, dateExact: ie = null, sort: ae = null, cursor: oe = null, includeTotal: se = !0, groupStacks: ce = !1, metadataMode: le = null } = e, S = `${v.LIST}?q=${encodeURIComponent(t)}&limit=${n}&offset=${r}&scope=${encodeURIComponent(i)}`; + return a && (S += `&subfolder=${encodeURIComponent(a)}`), o ? S += `&custom_root_id=${encodeURIComponent(o)}` : String(i || "").toLowerCase() === "custom" && (S += "&browser_mode=1"), S = y(S, { kind: s, hasWorkflow: c, minRating: l, minSizeMB: u, maxSizeMB: d, minWidth: p, - minHeight: v, - maxWidth: y, + minHeight: m, + maxWidth: h, maxHeight: b, workflowType: x, workflowId: ee, @@ -212,50 +213,50 @@ function b(e = {}) { runsOn: ne, dateRange: re, dateExact: ie - }), f && (C += `&resolution_compare=${encodeURIComponent(String(f))}`), ae && (C += `&sort=${encodeURIComponent(String(ae))}`), oe && (C += `&cursor=${encodeURIComponent(String(oe))}`), se === !1 && (C += "&include_total=0"), ce && (C += "&group_stacks=1"), S && (C += `&metadata_mode=${encodeURIComponent(String(S).toUpperCase())}`), C; + }), f && (S += `&resolution_compare=${encodeURIComponent(String(f))}`), ae && (S += `&sort=${encodeURIComponent(String(ae))}`), oe && (S += `&cursor=${encodeURIComponent(String(oe))}`), se === !1 && (S += "&include_total=0"), ce && (S += "&group_stacks=1"), le && (S += `&metadata_mode=${encodeURIComponent(String(le).toUpperCase())}`), S; } -function x(e, t = "", n = "") { +function te(e, t = "", n = "") { let r = String(e || "").trim(), i = String(n || "").trim(); if (!r || !i) return ""; - let a = `${g.CUSTOM_VIEW}?root_id=${encodeURIComponent(i)}&filename=${encodeURIComponent(r)}`; + let a = `${v.CUSTOM_VIEW}?root_id=${encodeURIComponent(i)}&filename=${encodeURIComponent(r)}`; return t && (a += `&subfolder=${encodeURIComponent(t)}`), a; } -function ee(e) { - return `${g.BATCH_ZIP_CREATE}/${encodeURIComponent(String(e || ""))}`; +function ne(e) { + return `${v.BATCH_ZIP_CREATE}/${encodeURIComponent(String(e || ""))}`; } -function te(e) { - return `${g.STACKS}/${encodeURIComponent(String(e || ""))}`; +function re(e) { + return `${v.STACKS}/${encodeURIComponent(String(e || ""))}`; } -function ne(e, t = {}) { - let n = `${te(e)}/members`, r = Number(t?.limit || 0); +function ie(e, t = {}) { + let n = `${re(e)}/members`, r = Number(t?.limit || 0); return Number.isFinite(r) && r > 0 && (n += `?limit=${encodeURIComponent(String(Math.floor(r)))}`), n; } -function re(e, t = {}) { - let n = String(e || "").trim(), r = `${g.STACKS}/by-node/${encodeURIComponent(n)}/members`, i = [], a = String(t?.jobId || t?.job_id || "").trim(); +function ae(e, t = {}) { + let n = String(e || "").trim(), r = `${v.STACKS}/by-node/${encodeURIComponent(n)}/members`, i = [], a = String(t?.jobId || t?.job_id || "").trim(); a && i.push(`job_id=${encodeURIComponent(a)}`), t?.latest === !1 && i.push("latest=0"); let o = Number(t?.limit || 0); return Number.isFinite(o) && o > 0 && i.push(`limit=${encodeURIComponent(String(Math.trunc(o)))}`), i.length && (r += `?${i.join("&")}`), r; } -function ie(e, t = "") { +function oe(e, t = "") { let n = e && typeof e == "object" ? e : {}, r = String(t || "").trim(); if (!r) return ""; - let i = l(n?.asset_id ?? n?.id ?? null), a = `${g.VIEWER_RESOURCE}?relpath=${encodeURIComponent(r)}`; + let i = d(n?.asset_id ?? n?.id ?? null), a = `${v.VIEWER_RESOURCE}?relpath=${encodeURIComponent(r)}`; if (i) return `${a}&asset_id=${encodeURIComponent(i)}`; - let o = d(String(n?.filepath || n?.path || n?.fullpath || n?.full_path || n?.file_info?.filepath || n?.file_info?.path || "").trim()); + let o = p(String(n?.filepath || n?.path || n?.fullpath || n?.full_path || n?.file_info?.filepath || n?.file_info?.path || "").trim()); if (o) return `${a}&filepath=${encodeURIComponent(o)}`; let s = String(n?.filename || n?.name || n?.file_info?.filename || "").trim(); if (!s) return ""; a += `&filename=${encodeURIComponent(s)}`; let c = String(n?.subfolder || n?.file_info?.subfolder || "").trim(); c && (a += `&subfolder=${encodeURIComponent(c)}`); - let f = String(n?.type || n?.file_info?.type || "").trim().toLowerCase(); - f && f !== "custom" && (a += `&type=${encodeURIComponent(f)}`); - let p = String(u(n) || n?.root_id || n?.custom_root_id || "").trim(); - return p && (a += `&root_id=${encodeURIComponent(p)}`), a; + let l = String(n?.type || n?.file_info?.type || "").trim().toLowerCase(); + l && l !== "custom" && (a += `&type=${encodeURIComponent(l)}`); + let u = String(f(n) || n?.root_id || n?.custom_root_id || "").trim(); + return u && (a += `&root_id=${encodeURIComponent(u)}`), a; } -function ae(e = {}) { - let { scope: t = "output", customRootId: n = null, month: r = "", kind: i = null, hasWorkflow: a = null, minRating: o = null } = e, s = `${g.DATE_HISTOGRAM}?scope=${encodeURIComponent(t)}&month=${encodeURIComponent(String(r || ""))}`; - return n && (s += `&custom_root_id=${encodeURIComponent(n)}`), _(s, { +function se(e = {}) { + let { scope: t = "output", customRootId: n = null, month: r = "", kind: i = null, hasWorkflow: a = null, minRating: o = null } = e, s = `${v.DATE_HISTOGRAM}?scope=${encodeURIComponent(t)}&month=${encodeURIComponent(String(r || ""))}`; + return n && (s += `&custom_root_id=${encodeURIComponent(n)}`), y(s, { subfolder: e.subfolder ?? null, kind: i, hasWorkflow: a, @@ -274,21 +275,21 @@ function ae(e = {}) { dateExact: e.dateExact ?? null }); } -function oe(e) { - let t = e?.mtime, n = (e) => !e || !t ? e : `${e}${e.includes("?") ? "&" : "?"}v=${encodeURIComponent(t)}`, r = d(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "").trim()), i = String(e?.type || e?.file_info?.type || "").toLowerCase().trim(), a = Number(e?.id ?? e?.asset_id); +function ce(e) { + let t = e?.mtime, n = (e) => !e || !t ? e : `${e}${e.includes("?") ? "&" : "?"}v=${encodeURIComponent(t)}`, r = p(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "").trim()), i = String(e?.type || e?.file_info?.type || "").toLowerCase().trim(), a = Number(e?.id ?? e?.asset_id); if (!(i === "temp" || r.toLowerCase().includes("/temp/")) && Number.isSafeInteger(a) && a > 0) return n(`/mjr/am/viewer/asset/${encodeURIComponent(String(a))}`); let o = String(e?.filename || e?.name || e?.file_info?.filename || "").trim(), s = String(e?.subfolder || e?.file_info?.subfolder || "").trim(), c = ((e) => { let t = { type: "", subfolder: "", filename: "" - }, n = d(e); + }, n = p(e); if (!n) return t; let r = n.toLowerCase(), i = r.indexOf("/output/"), a = r.indexOf("/input/"), o = r.indexOf("/temp/"), s = -1; if (i >= 0 ? (t.type = "output", s = i + 8) : r.startsWith("output/") ? (t.type = "output", s = 7) : a >= 0 ? (t.type = "input", s = a + 7) : r.startsWith("input/") ? (t.type = "input", s = 6) : o >= 0 ? (t.type = "temp", s = o + 6) : r.startsWith("temp/") && (t.type = "temp", s = 5), s >= 0) { let e = n.slice(s), r = e.lastIndexOf("/"); r >= 0 ? (t.subfolder = e.slice(0, r), t.filename = e.slice(r + 1)) : t.filename = e; - } else t.filename = f(n).filename; + } else t.filename = m(n).filename; return t; })(r); if (c.filename && c.type && (o = c.filename, s = c.subfolder), !s && o.includes("/")) { @@ -298,49 +299,450 @@ function oe(e) { if (!o && c.filename && (o = c.filename), !s && c.subfolder && (s = c.subfolder), !o) return ""; let l = String(e?.type || e?.file_info?.type || "").toLowerCase().trim(); l !== "input" && l !== "output" && l !== "temp" && l !== "custom" && (l = ""), !l && c.type && (l = c.type), !l && r && (r.includes("/input/") || r.startsWith("input/") ? l = "input" : r.includes("/output/") || r.startsWith("output/") ? l = "output" : (r.includes("/temp/") || r.startsWith("temp/")) && (l = "temp")), l ||= "output"; - let m = r.includes("/output/") || r.includes("/input/") || r.includes("/temp/") || r.startsWith("output/") || r.startsWith("input/") || r.startsWith("temp/"), h = p(s) || s.startsWith("/"); - if (r && l !== "custom" && (h || !m)) return n(se(r, { inline: !0 })); + let u = r.includes("/output/") || r.includes("/input/") || r.includes("/temp/") || r.startsWith("output/") || r.startsWith("input/") || r.startsWith("temp/"), d = h(s) || s.startsWith("/"); + if (r && l !== "custom" && (d || !u)) return n(le(r, { inline: !0 })); if (l === "custom") { - let t = String(u(e) || "").trim(); - if (t) return n(x(o, s, t)); - if (r) return n(`${g.CUSTOM_VIEW}?filepath=${encodeURIComponent(r)}&browser_mode=1`); + let t = String(f(e) || "").trim(); + if (t) return n(te(o, s, t)); + if (r) return n(`${v.CUSTOM_VIEW}?filepath=${encodeURIComponent(r)}&browser_mode=1`); let i = c.type || "output"; - return n(v(o, s, i)); + return n(b(o, s, i)); } - return (r.includes("/output/") || r.startsWith("output/")) && (l = "output"), (r.includes("/input/") || r.startsWith("input/")) && (l = "input"), (r.includes("/temp/") || r.startsWith("temp/")) && (l = "temp"), n(v(o, s, l)); + return (r.includes("/output/") || r.startsWith("output/")) && (l = "output"), (r.includes("/input/") || r.startsWith("input/")) && (l = "input"), (r.includes("/temp/") || r.startsWith("temp/")) && (l = "temp"), n(b(o, s, l)); } -function se(e, t = {}) { +function le(e, t = {}) { if (!e) return ""; - let n = !!t?.inline, r = `${g.DOWNLOAD}?filepath=${encodeURIComponent(e)}`; + let n = !!t?.inline, r = `${v.DOWNLOAD}?filepath=${encodeURIComponent(e)}`; return n && (r += "&preview=1"), r; } -function ce(e) { - let t = String(e || "").trim(); - return t ? `${g.WORKFLOWS_CONTENT}?filepath=${encodeURIComponent(t)}` : ""; -} function S(e) { let t = String(e || "").trim(); - return t ? `${g.WORKFLOWS_VALIDATE}?filepath=${encodeURIComponent(t)}` : ""; -} -function C(e) { - let t = String(e || "").trim(); - return t ? `${g.WORKFLOWS_VERSIONS}?filepath=${encodeURIComponent(t)}` : ""; -} -function le(e, t = "") { - let n = String(e || "").trim(); - if (!n) return ""; - let r = `${g.WORKFLOWS_DIFF}?filepath=${encodeURIComponent(n)}`, i = String(t || "").trim(); - return i && (r += `&version_filepath=${encodeURIComponent(i)}`), r; + return t ? `${v.WORKFLOWS_CONTENT}?filepath=${encodeURIComponent(t)}` : ""; } function ue(e) { - return e ? `${g.DOWNLOAD_CLEAN}?filepath=${encodeURIComponent(e)}` : ""; + let t = String(e || "").trim(); + return t ? `${v.WORKFLOWS_VALIDATE}?filepath=${encodeURIComponent(t)}` : ""; +} +function de(e) { + let t = String(e || "").trim(); + return t ? `${v.WORKFLOWS_VERSIONS}?filepath=${encodeURIComponent(t)}` : ""; +} +function fe(e, t = "") { + let n = String(e || "").trim(); + if (!n) return ""; + let r = `${v.WORKFLOWS_DIFF}?filepath=${encodeURIComponent(n)}`, i = String(t || "").trim(); + return i && (r += `&version_filepath=${encodeURIComponent(i)}`), r; +} +function pe(e) { + return e ? `${v.DOWNLOAD_CLEAN}?filepath=${encodeURIComponent(e)}` : ""; +} +// ui/api/fetchUtils.ts +var me = /* @__PURE__ */ new Set([ + "POST", + "PUT", + "DELETE", + "PATCH" +]), he = 2e4, ge = 3e5, _e = 3, ve = 400, ye = 1e4, be = "/mjr/am/settings/security/bootstrap-token", xe = "/mjr/am/", Se = /* @__PURE__ */ new Map(); +function Ce(e) { + return new Promise((t) => setTimeout(t, e)); +} +function C(e) { + return me.has(String(e || "").trim().toUpperCase()); +} +function we(e) { + try { + let t = String(e || "").trim(); + if (!t) return ""; + if (t.startsWith("http://") || t.startsWith("https://")) { + let e = typeof globalThis < "u" && globalThis?.location?.origin ? String(globalThis.location.origin) : "http://localhost"; + return new URL(t, e).pathname || ""; + } + return t.split("?")[0] || ""; + } catch { + return ""; + } +} +function Te(e) { + return we(e).startsWith(xe); +} +function Ee(e) { + return we(e) === be; +} +function De(e) { + try { + if (!e) return !1; + let t = String(e.name || ""); + if (t === "AbortError") return !1; + let n = String(e.message || "").toLowerCase(); + return t === "TypeError" ? n.includes("failed to fetch") || n.includes("networkerror") || n.includes("load failed") || n.includes("fetch") || n.includes("network") : n.includes("fetch") || n.includes("network") || n.includes("failed"); + } catch { + return !1; + } +} +function Oe(e) { + try { + let t = String(e?.headers?.get?.("x-request-id") || "").trim(), n = String(e?.headers?.get?.("retry-after") || "").trim(), r = null; + if (n) { + let e = Number(n); + if (Number.isFinite(e) && e >= 0) r = e; + else { + let e = Date.parse(n); + Number.isFinite(e) && (r = Math.max(0, (e - Date.now()) / 1e3)); + } + } + return { + requestId: t, + retryAfterSeconds: r + }; + } catch { + return { + requestId: "", + retryAfterSeconds: null + }; + } +} +function ke(e, t) { + if (!e || typeof e != "object") return e; + let { requestId: n, retryAfterSeconds: r } = Oe(t); + return n && !("request_id" in e) && (e.request_id = n), r !== null && !("retry_after" in e) && (e.retry_after = r), e; +} +function Ae(e = {}) { + try { + let t = Number(e?.timeoutMs); + return Number.isFinite(t) ? Math.max(1e3, Math.min(ge, Math.floor(t))) : he; + } catch { + return he; + } +} +function je(e = {}) { + let t = e?.signal || null; + if (typeof AbortController > "u") return { + signal: t || void 0, + timeoutMs: Ae(e), + cleanup: () => {} + }; + let n = Ae(e), r = new AbortController(), i = null, a = () => { + try { + i &&= (clearTimeout(i), null); + } catch (e) { + console.debug?.(e); + } + try { + r.abort(); + } catch (e) { + console.debug?.(e); + } + }; + try { + i = setTimeout(() => { + try { + r.abort(); + } catch (e) { + console.debug?.(e); + } + }, n); + } catch (e) { + console.debug?.(e); + } + try { + t && (t.aborted ? a() : t.addEventListener("abort", a, { once: !0 })); + } catch (e) { + console.debug?.(e); + } + return { + signal: r.signal, + timeoutMs: n, + cleanup: () => { + try { + i && clearTimeout(i); + } catch (e) { + console.debug?.(e); + } + try { + t && t.removeEventListener("abort", a); + } catch (e) { + console.debug?.(e); + } + } + }; +} +function Me(e, t, n = {}) { + let r = String(e || "GET").trim().toUpperCase(), i = String(t || "").trim(); + return !r || !i ? "" : `${r}:${i}:timeout=${Ae(n)}`; +} +function Ne(e, t) { + let n = String(e || "").trim(); + if (!n) return t(); + if (Se.has(n)) return Se.get(n); + let r = Promise.resolve().then(() => t()).finally(() => { + try { + Se.delete(n); + } catch (e) { + console.debug?.(e); + } + }); + return Se.set(n, r), r; +} +function Pe(e, t, n) { + if (C(t)) try { + e instanceof Headers ? e.has("X-Requested-With") || e.set("X-Requested-With", "XMLHttpRequest") : e["X-Requested-With"] ||= "XMLHttpRequest"; + } catch (e) { + console.debug?.(e); + } + try { + e instanceof Headers ? e.has("X-MJR-OBS") || e.set("X-MJR-OBS", n ? "on" : "off") : "X-MJR-OBS" in e || (e["X-MJR-OBS"] = n ? "on" : "off"); + } catch (e) { + console.debug?.(e); + } +} +function Fe(e, t) { + if (t) try { + e instanceof Headers ? (e.has("X-MJR-Token") || e.set("X-MJR-Token", t), e.has("Authorization") || e.set("Authorization", `Bearer ${t}`)) : ("X-MJR-Token" in e || (e["X-MJR-Token"] = t), "Authorization" in e || (e.Authorization = `Bearer ${t}`)); + } catch (e) { + console.debug?.(e); + } +} +async function Ie(e, t, n, r, { ensureWriteAuthToken: i, normalizeWriteAuthFailure: a, fetchAPI: o, options: s, retryCount: c }) { + let l = e.headers.get("content-type") || ""; + if (!l.includes("application/json")) return !r && C(n) && Te(t) && !Ee(t) && Number(e.status || 0) === 401 && await i({ + force: !0, + allowCookieRefresh: !0 + }) ? await o(t, { + ...s, + _authRetryDone: !0 + }, c) : ke({ + ok: !1, + error: `Server returned non-JSON response (${e.status})`, + code: "INVALID_RESPONSE", + status: e.status, + content_type: l, + data: null + }, e); + let u = await e.json().catch((e) => (console.debug?.("[MJR API] JSON parse error:", e), null)); + if (typeof u != "object" || !u || Array.isArray(u) || typeof u.ok != "boolean") return ke({ + ok: !1, + error: "Invalid response structure", + code: "INVALID_RESPONSE", + status: e.status, + data: null + }, e); + if (u.ok === !0 && Number(e.status || 0) >= 400 && (u = { + ...u, + ok: !1, + error: u.error || `Server reported success with an HTTP error status (${e.status})`, + code: "INVALID_RESPONSE" + }), !("status" in u)) try { + u.status = e.status; + } catch (e) { + console.debug?.(e); + } + ke(u, e); + let d = Number(u?.status || e.status || 0), f = d === 429 || d === 503 || d === 504; + if (!u?.ok && f && n === "GET" && c < _e && !s?.signal?.aborted) { + let e = Number(u?.retry_after); + return await Ce(Number.isFinite(e) ? Math.min(ye, Math.max(0, e * 1e3)) : ve * (c + 1)), await o(t, s, c + 1); + } + return !r && C(n) && !Ee(t) && !u?.ok && (String(u?.code || "").toUpperCase() === "AUTH_REQUIRED" || Number(u?.status || 0) === 401) && await i({ + force: !0, + allowCookieRefresh: !0 + }) ? await o(t, { + ...s, + _authRetryDone: !0 + }, c) : (C(n) && Te(t) && !Ee(t) && (u = a(u)), u); +} +function Le({ readObsEnabled: e = () => !1, readAuthToken: t = () => "", ensureWriteAuthToken: n = async () => "", normalizeWriteAuthFailure: r = (e) => e, trackApiCall: i = null } = {}) { + async function a(o, s = {}, c = 0) { + let l = typeof performance < "u" ? performance.now() : Date.now(), u = je(s), d = null; + try { + let i = (s.method || "GET").toUpperCase(), l = !!s?._authRetryDone, f = typeof Headers < "u" ? new Headers(s.headers || {}) : { ...s.headers }; + Pe(f, i, !!e()); + let p = t(); + if (!p && C(i) && Te(o) && !Ee(o)) { + try { + await n(); + } catch (e) { + console.debug?.(e); + } + p = t(); + } + Fe(f, p); + let m = { + ...s, + headers: f, + signal: u.signal + }; + try { + delete m._authRetryDone, delete m.timeoutMs; + } catch (e) { + console.debug?.(e); + } + return d = await Ie(await fetch(o, m), o, i, l, { + ensureWriteAuthToken: n, + normalizeWriteAuthFailure: r, + fetchAPI: a, + options: s, + retryCount: c + }), d; + } catch (e) { + try { + if (String(e?.name || "") === "AbortError") return s?.signal && s.signal.aborted ? { + ok: !1, + error: "Aborted", + code: "ABORTED", + data: null + } : { + ok: !1, + error: `Request timed out after ${u.timeoutMs}ms`, + code: "TIMEOUT", + data: null, + timeout_ms: u.timeoutMs + }; + } catch (e) { + console.debug?.(e); + } + let t = String(s?.method || "GET").toUpperCase(); + if ((t === "GET" || t === "HEAD") && c < _e && De(e)) { + try { + await Ce(ve * (c + 1)); + } catch (e) { + console.debug?.(e); + } + return await a(o, s, c + 1); + } + return { + ok: !1, + error: e?.message || String(e || "Network error"), + code: "NETWORK_ERROR", + data: null, + retries: c + }; + } finally { + try { + let e = (typeof performance < "u" ? performance.now() : Date.now()) - l; + typeof i == "function" ? i(e, !d?.ok) : typeof window < "u" && window.MajoorMetrics && window.MajoorMetrics.trackApiCall(e, !d?.ok); + } catch (e) { + console.debug?.(e); + } + try { + u.cleanup?.(); + } catch (e) { + console.debug?.(e); + } + } + } + async function o(e, t = {}) { + return Ne(t?.dedupe === !1 || t?.signal ? "" : String(t?.dedupeKey || "").trim() || Me("GET", e, t), () => a(e, { + ...t, + method: "GET" + })); + } + async function s(e, t, n = {}) { + return a(e, { + ...n, + method: "POST", + headers: { + "Content-Type": "application/json", + ...n.headers + }, + body: JSON.stringify(t) + }); + } + return { + fetchAPI: a, + get: o, + post: s + }; +} +// ui/utils/ttlCache.ts +function Re({ ttlMs: e = 0, maxSize: t = 100, now: n = () => Date.now() } = {}) { + let r = /* @__PURE__ */ new Map(); + function i() { + try { + let e = Number(n()); + return Number.isFinite(e) ? e : Date.now(); + } catch { + return Date.now(); + } + } + function a() { + try { + let t = Number(typeof e == "function" ? e() : e); + return Number.isFinite(t) ? Math.max(0, Math.floor(t)) : 0; + } catch { + return 0; + } + } + function o() { + try { + let e = Number(t); + return Number.isFinite(e) ? Math.max(1, Math.floor(e)) : 1; + } catch { + return 1; + } + } + function s(e, t, n) { + return !e || n > 0 && t - Number(e.at || 0) > n; + } + function c(e = i(), t = a()) { + if (t > 0) for (let [n, i] of r.entries()) s(i, e, t) && r.delete(n); + } + function l() { + let e = o(); + for (; r.size > e;) { + let e = r.keys().next().value; + if (e === void 0) break; + r.delete(e); + } + } + function u(e, t) { + r.delete(e), r.set(e, t); + } + return { + get(e) { + let t = i(), n = a(); + c(t, n); + let o = r.get(e); + if (o) { + if (s(o, t, n)) r.delete(e); + else return o.value; + } + }, + has(e) { + return this.get(e) !== void 0; + }, + set(e, t, n = {}) { + let o = Number(n?.at), s = { + value: t, + at: Number.isFinite(o) ? o : i() + }; + return r.has(e) ? u(e, s) : r.set(e, s), c(i(), a()), l(), t; + }, + delete(e) { + return r.delete(e); + }, + clear() { + r.clear(); + }, + prune() { + return c(i(), a()), l(), r.size; + }, + keys() { + return this.prune(), Array.from(r.keys()); + }, + entries() { + return this.prune(), Array.from(r.entries()).map(([e, t]) => [e, t.value]); + }, + get size() { + return this.prune(), r.size; + } + }; } // ui/app/comfyApiBridge.ts -var w = null, T = null, de = 50; -function E(e) { +var ze = null, Be = null, Ve = 50; +function w(e) { return !!e && typeof e == "object"; } -function D(e, t) { +function He(e, t) { try { if (!e || typeof e != "object" && typeof e != "function") return null; let n = Object.getOwnPropertyDescriptor(e, t); @@ -349,65 +751,65 @@ function D(e, t) { return null; } } -function O(e) { - return E(e) ? typeof e.fetchApi == "function" || typeof e.apiURL == "function" || E(e.settings) : !1; +function T(e) { + return w(e) ? typeof e.fetchApi == "function" || typeof e.apiURL == "function" || w(e.settings) : !1; } -function k(e) { - return E(e) ? E(e.ui) || E(e.canvas) || E(e.graph) || typeof e.loadGraphData == "function" || O(e.api) : !1; +function Ue(e) { + return w(e) ? w(e.ui) || w(e.canvas) || w(e.graph) || typeof e.loadGraphData == "function" || T(e.api) : !1; } -function fe(e) { - return k(e) && (w = e), w; +function We(e) { + return Ue(e) && (ze = e), ze; } -function pe(e) { - return O(e) && (T = e), T; +function Ge(e) { + return T(e) && (Be = e), Be; } -function A(e) { - if (O(T)) return T; - let t = E(e) ? e : j(), n = t?.api || t?.ui?.api || t?.ui?.app?.api || null; - if (O(n)) return n; +function E(e) { + if (T(Be)) return Be; + let t = w(e) ? e : D(), n = t?.api || t?.ui?.api || t?.ui?.app?.api || null; + if (T(n)) return n; try { - let e = typeof window < "u" ? D(window, "api") : null; - if (O(e)) return e; + let e = typeof window < "u" ? He(window, "api") : null; + if (T(e)) return e; } catch (e) { console.debug?.(e); } try { - let e = typeof globalThis < "u" ? D(globalThis, "api") : null; - if (O(e)) return e; + let e = typeof globalThis < "u" ? He(globalThis, "api") : null; + if (T(e)) return e; } catch (e) { console.debug?.(e); } return null; } -async function me(e, t = null, n) { - let r = A(n); +async function Ke(e, t = null, n) { + let r = E(n); return r && typeof r.fetchApi == "function" ? r.fetchApi(e, t || void 0) : fetch(e, { credentials: "include", ...t || {} }); } -function j() { - if (k(w)) return w; +function D() { + if (Ue(ze)) return ze; try { - let e = typeof globalThis < "u" ? D(globalThis, "app") : null; - if (k(e)) return e; + let e = typeof globalThis < "u" ? He(globalThis, "app") : null; + if (Ue(e)) return e; } catch (e) { console.debug?.(e); } try { - let e = typeof window < "u" ? D(window, "app") : null; - if (k(e)) return e; + let e = typeof window < "u" ? He(window, "app") : null; + if (Ue(e)) return e; } catch (e) { console.debug?.(e); } return null; } -function he(e) { - let t = E(e) ? e : j(); +function qe(e) { + let t = w(e) ? e : D(); return !t || typeof t != "object" ? null : t?.extensionManager?.setting || t?.ui?.settings || t?.settings || t?.ui?.api?.settings || t?.api?.settings || null; } -function ge(e, t) { - let n = he(e); +function Je(e, t) { + let n = qe(e); if (!n) return null; for (let e of [ "getSettingValue", @@ -428,8 +830,8 @@ function ge(e, t) { } return null; } -function _e(e, t, n) { - let r = he(e); +function Ye(e, t, n) { + let r = qe(e); if (!r) return !1; for (let e of [ "setSettingValue", @@ -453,27 +855,27 @@ function _e(e, t, n) { } return !1; } -function M(e) { - let t = E(e) ? e : j(); +function O(e) { + let t = w(e) ? e : D(); return t?.extensionManager || t?.ui?.extensionManager || null; } -function ve(e) { - let t = E(e) ? e : j(), n = M(e); +function Xe(e) { + let t = w(e) ? e : D(), n = O(e); return n?.sidebarTabStore || n?.sidebarTab || n?.workspaceStore?.sidebarTab || t?.workspaceStore?.sidebarTab || t?.ui?.workspaceStore?.sidebarTab || t?.ui?.app?.workspaceStore?.sidebarTab || t?.workspace?.sidebarTab || t?.ui?.workspace?.sidebarTab || null; } -function ye(e) { - return E(e) && (e?.bottomPanel || e?.bottomPanelStore) || null; +function Ze(e) { + return w(e) && (e?.bottomPanel || e?.bottomPanelStore) || null; } -function be(e) { - let t = M(e)?.toast || null; - return t && typeof t.add == "function" ? t : null; +function Qe(e) { + let t = O(e)?.toast || null; + return t && (typeof t.add == "function" || typeof t.success == "function" || typeof t.info == "function") ? t : null; } -function xe(e) { - let t = M(e)?.dialog || null; +function $e(e) { + let t = O(e)?.dialog || null; return t && (typeof t.alert == "function" || typeof t.confirm == "function" || typeof t.prompt == "function") ? t : null; } -function Se(e, t) { - let n = E(e) ? e : j(), r = M(n), i = ve(n), a = String(t || "").trim(); +function et(e, t) { + let n = w(e) ? e : D(), r = O(n), i = Xe(n), a = String(t || "").trim(); if (!a) return !1; let o = [ "activateSidebarTab", @@ -495,8 +897,8 @@ function Se(e, t) { } return !1; } -function Ce(e, t) { - let n = M(e), r = t && typeof t == "object" ? { ...t } : null; +function tt(e, t) { + let n = O(e), r = t && typeof t == "object" ? { ...t } : null; if (!n || !r) return !1; for (let e of ["registerCommand", "addCommand"]) try { if (typeof n?.[e] == "function") return n[e](r), !0; @@ -505,8 +907,8 @@ function Ce(e, t) { } return !1; } -function we(e, t) { - let n = M(e), r = t && typeof t == "object" ? { ...t } : null; +function nt(e, t) { + let n = O(e), r = t && typeof t == "object" ? { ...t } : null; if (!n || !r) return !1; for (let e of ["registerKeybinding", "addKeybinding"]) try { if (typeof n?.[e] == "function") return n[e](r), !0; @@ -515,9 +917,9 @@ function we(e, t) { } return !1; } -function Te(e, t) { +function rt(e, t) { try { - let n = E(e) ? e : j(), r = n?.extensionManager || n?.ui?.extensionManager || null, i = ve(n), a = n?.workspaceStore || n?.ui?.workspaceStore || n?.ui?.app?.workspaceStore || null; + let n = w(e) ? e : D(), r = n?.extensionManager || n?.ui?.extensionManager || null, i = Xe(n), a = n?.workspaceStore || n?.ui?.workspaceStore || n?.ui?.app?.workspaceStore || null; for (let e of [r, i]) if (e && typeof e.registerSidebarTab == "function") return e.registerSidebarTab(t), !0; if (a && typeof a.registerSidebarTab == "function") return a.registerSidebarTab(t), !0; } catch (e) { @@ -525,9 +927,9 @@ function Te(e, t) { } return !1; } -function Ee(e, t) { +function it(e, t) { try { - let n = M(E(e) ? e : j()), r = ye(n), i = String(t || "").trim(); + let n = O(w(e) ? e : D()), r = Ze(n), i = String(t || "").trim(); if (!i) return !1; let a = [ "activateBottomPanelTab", @@ -546,51 +948,51 @@ function Ee(e, t) { } return !1; } -function De(e) { +function at(e) { return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0))); } -function Oe(e, t) { +function ot(e, t) { try { console.warn(`[Majoor] ${e} timed out after ${Math.max(0, Number(t) || 0)}ms`); } catch (e) { console.debug?.(e); } } -async function ke({ timeoutMs: e = 4e3, intervalMs: t = de, warnOnTimeout: n = !0, rejectOnTimeout: r = !1 } = {}) { +async function st({ timeoutMs: e = 4e3, intervalMs: t = Ve, warnOnTimeout: n = !0, rejectOnTimeout: r = !1 } = {}) { let i = Date.now(), a = Math.max(0, Number(e) || 0); for (; Date.now() - i < a;) { - let e = j(); + let e = D(); if (e && typeof e == "object") return e; - await De(t); + await at(t); } - let o = j(); + let o = D(); if (o && typeof o == "object") return o; - if (n && Oe("waitForComfyApp", a), r) throw Error(`waitForComfyApp timeout after ${a}ms`); + if (n && ot("waitForComfyApp", a), r) throw Error(`waitForComfyApp timeout after ${a}ms`); return null; } -async function Ae({ app: e = null, timeoutMs: t = 4e3, intervalMs: n = de, warnOnTimeout: r = !0, rejectOnTimeout: i = !1 } = {}) { +async function ct({ app: e = null, timeoutMs: t = 4e3, intervalMs: n = Ve, warnOnTimeout: r = !0, rejectOnTimeout: i = !1 } = {}) { let a = Date.now(), o = Math.max(0, Number(t) || 0); for (; Date.now() - a < o;) { - let t = A(e || j()); + let t = E(e || D()); if (t) return t; - await De(n); + await at(n); } - let s = A(e || j()); + let s = E(e || D()); if (s) return s; - if (r && Oe("waitForComfyApi", o), i) throw Error(`waitForComfyApi timeout after ${o}ms`); + if (r && ot("waitForComfyApi", o), i) throw Error(`waitForComfyApi timeout after ${o}ms`); return null; } // ui/app/hostAdapter.ts -var N = null, P = Symbol.for("mjr.host.queuePromptBinding"), je = [ +var k = null, lt = [ "selectionchange", "selection-change", "node-selected", "node-deselected", "node-selection-change" ]; -function Me(e) { +function ut(e) { try { - let t = be(N || j()); + let t = Qe(k || D()); t && t.add({ severity: e?.severity ?? "info", summary: e?.summary ?? "", @@ -599,89 +1001,112 @@ function Me(e) { }); } catch {} } -function Ne(e = null) { +function dt(e = null) { try { - return be(e || N || j()) || null; + return Qe(e || k || D()) || null; } catch { return null; } } -function Pe(e = null) { +function ft(e = null) { try { - return xe(e || N || j()) || null; + return $e(e || k || D()) || null; } catch { return null; } } -function Fe(e, t, n = null) { +function pt(e, t, n = null) { try { - return ge(e || N || j(), t) ?? n; + return Je(e || k || D(), t) ?? n; } catch { return n; } } -function Ie(e, t, n) { +function mt(e, t, n) { try { - return _e(e || N || j(), t, n); + return Ye(e || k || D(), t, n); } catch { return !1; } } -function Le(e, t) { +function ht(e) { try { - return Te(e || N || j(), t); + return rt(k || D(), e); } catch { return !1; } } -function Re(e, t) { +function gt(e = null) { try { - return Se(e || N || j(), t); + let t = O(e || k || D()), n = typeof t?.getSidebarTabs == "function" ? t.getSidebarTabs() : []; + return Array.isArray(n) ? n.filter(Boolean) : []; + } catch { + return []; + } +} +function _t(e, t = null) { + try { + let n = O(t || k || D()); + return !e || typeof n?.unregisterSidebarTab != "function" ? !1 : (n.unregisterSidebarTab(e), !0); } catch { return !1; } } -function ze(e, t) { +function vt(e, t) { try { - return Ee(e || N || j(), t); + return rt(e || k || D(), t); } catch { return !1; } } -function Be(e, t) { +function yt(e, t) { try { - return Ce(e || N || j(), t); + return et(e || k || D(), t); } catch { return !1; } } -function Ve(e, t) { +function bt(e, t) { try { - return we(e || N || j(), t); + return it(e || k || D(), t); } catch { return !1; } } -function He() { - return N || j() || null; -} -function F(e = null) { +function xt(e, t) { try { - return A(e || N || j()) || null; + return tt(e || k || D(), t); + } catch { + return !1; + } +} +function St(e, t) { + try { + return nt(e || k || D(), t); + } catch { + return !1; + } +} +function Ct() { + return k || D() || null; +} +function wt(e = null) { + try { + return E(e || k || D()) || null; } catch { return null; } } -async function Ue(e = {}) { +async function Tt(e = {}) { try { - return await Ae(e); + return await ct(e); } catch { return null; } } -async function We(e, t = null, n = null) { +async function Et(e, t = null, n = null) { try { - return await me(e, t, n || N || j()); + return await Ke(e, t, n || k || D()); } catch { return fetch(e, { credentials: "include", @@ -689,7 +1114,7 @@ async function We(e, t = null, n = null) { }); } } -function Ge(e, t, n) { +function Dt(e, t, n) { if (!e || typeof e.addEventListener != "function") return null; try { e.addEventListener(t, n); @@ -704,9 +1129,9 @@ function Ge(e, t, n) { } }; } -function Ke(e, t = {}) { +function Ot(e, t = {}) { if (typeof e != "function") return null; - let n = t.app || N || j(), r = n?.canvas; + let n = t.app || k || D(), r = n?.canvas; if (!r) return null; let i = [], a = !1, o = [ r, @@ -719,8 +1144,8 @@ function Ke(e, t = {}) { console.debug?.(e); } }; - for (let e of o) for (let t of je) { - let n = Ge(e, t, s); + for (let e of o) for (let t of lt) { + let n = Dt(e, t, s); n && (i.push(n), a = !0); } if (!a) { @@ -740,7 +1165,7 @@ function Ke(e, t = {}) { }); } if (t.includePointerFallback !== !1 && r.canvas?.addEventListener) { - let e = Ge(r.canvas, "pointerup", s); + let e = Dt(r.canvas, "pointerup", s); e && i.push(e); } let c = !1; @@ -751,34 +1176,8 @@ function Ke(e, t = {}) { } }; } -function qe(e = {}) { - let t = e.api || F(e.app || N || j()), n = e.owner || null, r = typeof e.createWrapper == "function" ? e.createWrapper : null; - if (!t || typeof t.queuePrompt != "function" || !r) return null; - let i = t.queuePrompt?.[P] || null; - if (i?.owner === n) return i; - if (i?.owner && i.owner !== n) return null; - let a = t.queuePrompt, o = r(a, t); - if (typeof o != "function") return null; - let s = { - api: t, - owner: n, - originalQueuePrompt: a, - wrappedQueuePrompt: o, - restore: () => { - try { - return (t.queuePrompt?.[P] || null)?.owner === n && (t.queuePrompt = a, !0); - } catch (e) { - return console.debug?.(e), !1; - } - } - }; - return Object.defineProperty(o, P, { - configurable: !0, - value: s - }), t.queuePrompt = o, s; -} -async function Je(e = null) { - let t = e || N || j(), n = (t?.api && typeof t.api.interrupt == "function" ? t.api : null) || F(t); +async function kt(e = null) { + let t = e || k || D(), n = (t?.api && typeof t.api.interrupt == "function" ? t.api : null) || wt(t); if (n && typeof n.interrupt == "function") return await n.interrupt(), !0; if (n && typeof n.fetchApi == "function") { let e = await n.fetchApi("/interrupt", { method: "POST" }); @@ -792,20 +1191,20 @@ async function Je(e = null) { if (!r.ok) throw Error(`POST /interrupt failed (${r.status})`); return !1; } -function I(e = null) { - return (e || N || j())?.canvas || null; +function At(e = null) { + return (e || k || D())?.canvas || null; } -function Ye(e = null) { - return I(e); +function jt(e = null) { + return At(e); } -function L(e = null) { - let t = e || N || j(); +function A(e = null) { + let t = e || k || D(); return t?.graph || t?.canvas?.graph || null; } -function Xe(e = null) { - return L(e); +function Mt(e = null) { + return A(e); } -function Ze(e) { +function Nt(e) { if (typeof e != "object" || !e) return e; try { return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); @@ -813,23 +1212,23 @@ function Ze(e) { return e; } } -function R(e, t) { +function j(e, t) { n(e, ({ node: e }) => t(e)); } -function Qe(e) { +function Pt(e) { let t = []; - return R(e, (e) => { + return j(e, (e) => { for (let n of e?.widgets ?? []) t.push({ widget: n, - value: Ze(n?.value) + value: Nt(n?.value) }); }), t; } -function $e(e, t) { +function Ft(e, t) { for (let e of Array.isArray(t) ? t : []) { let t = e?.widget; if (!t || typeof t != "object") continue; - let n = Ze(e?.value); + let n = Nt(e?.value); try { t.value = n; } catch (e) { @@ -842,9 +1241,9 @@ function $e(e, t) { console.debug?.(e); } } - z(e, { change: !1 }); + M(e, { change: !1 }); } -function et(e, t) { +function It(e, t) { let n = [ e?.clientId, e?.clientID, @@ -859,85 +1258,132 @@ function et(e, t) { } return ""; } -function tt(e = null) { - let t = I(e); +function Lt(e = null) { + let t = At(e); return t?.selected_nodes ?? t?.selectedNodes ?? null; } -function nt(e = null) { - let t = tt(e); +function Rt(e = null) { + let t = Lt(e); return t ? Array.isArray(t) ? t.filter(Boolean) : t instanceof Map ? Array.from(t.values()).filter(Boolean) : typeof t == "object" ? Object.values(t).filter(Boolean) : [] : []; } -function rt(e = null) { - return nt(e).map((e) => String(e?.id ?? "").trim()).filter(Boolean); +function zt(e = null) { + return Rt(e).map((e) => String(e?.id ?? "").trim()).filter(Boolean); } -function it(e = null) { - return nt(e)[0] || null; +function Bt(e = null) { + return Rt(e)[0] || null; } -function z(e = null, t = {}) { +function M(e = null, t = {}) { try { - let n = e || N || j(), r = I(n), i = L(n); + let n = e || k || D(), r = At(n), i = A(n); return r?.setDirty?.(!0, !0), t.draw !== !1 && r?.draw?.(!0, !0), i?.setDirtyCanvas?.(!0, !0), t.change !== !1 && i?.change?.(), !!(r || i); } catch (e) { return console.debug?.(e), !1; } } -function at(e, t = null, n = {}) { +function Vt(e, t = null, n = {}) { try { - let r = t || N || j(), i = L(r), a = e?.graph ?? null; - return a && a !== i && (a.setDirtyCanvas?.(!0, !0), n.change !== !1 && a.change?.()), z(r, n); + let r = t || k || D(), i = A(r), a = e?.graph ?? null; + return a && a !== i && (a.setDirtyCanvas?.(!0, !0), n.change !== !1 && a.change?.()), M(r, n); } catch (e) { return console.debug?.(e), !1; } } -function ot(e, t = null) { +function Ht(e, t = null) { if (!e) return !1; try { - let n = t || N || j(), r = L(n); - return !r || typeof r.add != "function" ? !1 : (r.add(e), at(e, n), !0); + let n = t || k || D(), r = A(n); + return !r || typeof r.add != "function" ? !1 : (r.add(e), Vt(e, n), !0); } catch (e) { return console.debug?.(e), !1; } } -function st(e = null) { +function Ut(e = null) { try { - let t = e || N || j(), n = globalThis; + let t = e || k || D(), n = globalThis; return t?.LiteGraph || t?.ui?.LiteGraph || t?.canvas?.LiteGraph || n?.LiteGraph || n?.window?.LiteGraph || null; } catch (e) { return console.debug?.(e), null; } } -function ct(e, t = null) { +function Wt(e, t = null) { let n = String(e || "").trim(); if (!n) return null; try { - let e = st(t); + let e = Ut(t); return !e || typeof e.createNode != "function" ? null : e.createNode(n) || null; } catch (e) { return console.debug?.(e), null; } } -function lt(e, t = null) { - let n = t || N || j(); - if (!e || typeof e != "object") return !1; +function Gt(e) { + if (!e || typeof e != "object" || Array.isArray(e) || Array.isArray(e.nodes)) return !1; + let t = Object.values(e).slice(0, 8); + return t.length ? t.every((e) => e && typeof e == "object" && typeof e.class_type == "string" && e.inputs && typeof e.inputs == "object") : !1; +} +function Kt(e) { + if (!e || typeof e != "object") return { + format: "", + data: null + }; + if (Array.isArray(e.nodes)) return { + format: "ui", + data: e + }; + if (e.workflow && typeof e.workflow == "object" && Array.isArray(e.workflow.nodes)) return { + format: "ui", + data: e.workflow + }; + let t = e.prompt; + if (typeof t == "string") try { + t = JSON.parse(t); + } catch { + t = null; + } + return Gt(t) ? { + format: "api", + data: t + } : Gt(e) ? { + format: "api", + data: e + } : { + format: "", + data: null + }; +} +function qt(e, t = null, n = {}) { + let r = t || k || D(), i = Kt(e); + if (i.format === "api") { + if (typeof r?.loadApiJson != "function") return !1; + try { + let e = r.loadApiJson(i.data, String(n.filename || "workflow.json")); + return e && typeof e.then == "function" && e.then(void 0, (e) => console.debug?.(e)), !0; + } catch (e) { + return console.debug?.(e), !1; + } + } + if (i.format === "ui" && (e = i.data), !e || typeof e != "object") return !1; try { let t = [ - n?.importWorkflow, - n?.loadWorkflow, - n?.workflowManager?.importWorkflow, - n?.workflowManager?.loadWorkflow, - n?.extensionManager?.workflow?.importWorkflow + r?.importWorkflow, + r?.loadWorkflow, + r?.workflowManager?.importWorkflow, + r?.workflowManager?.loadWorkflow, + r?.extensionManager?.workflow?.importWorkflow ]; - for (let r of t) if (typeof r == "function") try { - return r.call(n?.workflowManager || n?.extensionManager?.workflow || n, e), z(n, { + for (let n of t) if (typeof n == "function") try { + return n.call(r?.workflowManager || r?.extensionManager?.workflow || r, e), M(r, { draw: !1, change: !1 }), !0; } catch (e) { console.debug?.(e); } - if (typeof n?.loadGraphData == "function") return n.loadGraphData(e), !0; - let r = L(n); - if (typeof r?.configure == "function") return r.configure(e), z(n, { + if (typeof r?.loadGraphData == "function") { + let t = r.loadGraphData(e); + return t && typeof t.then == "function" && t.then(void 0, (e) => console.debug?.(e)), !0; + } + let n = A(r); + if (typeof n?.configure == "function") return n.configure(e), M(r, { draw: !1, change: !1 }), !0; @@ -946,14 +1392,14 @@ function lt(e, t = null) { } return !1; } -function ut(e, t = null) { - let n = t || N || j(); +function Jt(e, t = null) { + let n = t || k || D(); if (!e || typeof e != "object") return { ok: !1, mode: "none" }; try { - if (lt(e, n)) return { + if (qt(e, n)) return { ok: !0, mode: "replace" }; @@ -965,33 +1411,35 @@ function ut(e, t = null) { mode: "none" }; } -function dt(e = null) { +function Yt(t = null) { try { - let t = e || N || j(); - if (typeof t?.graphToPrompt == "function") { - let e = t.graphToPrompt(); - if (e?.workflow && typeof e.workflow == "object") return e.workflow; - } - let n = L(t); - if (typeof n?.serialize == "function") { - let e = n.serialize(); - if (e && typeof e == "object") return e; - } - let r = t?.rootGraph || t?.graph?.rootGraph || null; + let n = t || k || D(), r = e(n); if (typeof r?.serialize == "function") { let e = r.serialize(); if (e && typeof e == "object") return e; } + let i = A(n); + if (i !== r && typeof i?.serialize == "function") { + let e = i.serialize(); + if (e && typeof e == "object") return e; + } + if (typeof n?.graphToPrompt == "function") { + let e = n.graphToPrompt(); + if (e && typeof e.then == "function") return e.then(void 0, (e) => console.debug?.(e)), null; + if (e?.workflow && typeof e.workflow == "object") return e.workflow; + } } catch (e) { console.debug?.(e); } return null; } -function ft(e = null) { +function Xt(e = null) { try { - let t = e || N || j(); + let t = e || k || D(); if (!t) return null; - let n = [ + let n = t?.extensionManager?.workflow?.activeWorkflow; + if (typeof n?.isModified == "boolean") return n.isModified; + let r = [ t?.isDirty, t?.dirty, t?.graph?.isDirty, @@ -1001,7 +1449,7 @@ function ft(e = null) { t?.graph?.has_changed, t?.graph?.changed ]; - for (let e of n) { + for (let e of r) { if (typeof e == "boolean") return e; if (typeof e == "number") return e !== 0; if (typeof e == "function") try { @@ -1017,29 +1465,29 @@ function ft(e = null) { } return null; } -async function pt(t = {}) { - let n = t.app || N || j(); +async function Zt(t = {}) { + let n = t.app || k || D(); if (!n) throw Error("ComfyUI app not available"); - let r = F(n), i = !!(r && typeof r.queuePrompt == "function" || r && typeof r.fetchApi == "function"); + let r = wt(n), i = !!(r && typeof r.queuePrompt == "function" || r && typeof r.fetchApi == "function"); if ((t.forceNativeQueue || !i) && typeof n.queuePrompt == "function") return await n.queuePrompt(0), !0; let a = e(n), o = null; try { - o = Qe(a), R(a, (e) => { + o = Pt(a), j(a, (e) => { for (let t of e?.widgets ?? []) t.beforeQueued?.({ isPartialExecution: !1 }); }); let e = await (typeof t.resolvePromptData == "function" ? t.resolvePromptData : (e) => e?.graphToPrompt?.())(n); if (!e?.output) throw Error("graphToPrompt returned empty output"); let i = typeof t.enrichPromptData == "function" ? t.enrichPromptData(e) : e; - if (r && typeof r.queuePrompt == "function") return await r.queuePrompt(0, i), R(a, (e) => { + if (r && typeof r.queuePrompt == "function") return await r.queuePrompt(0, i), j(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !0; + }), M(n, { change: !1 }), !0; let s = (typeof t.buildPromptRequestBody == "function" ? t.buildPromptRequestBody : (e, t) => { let n = { prompt: e?.output, extra_data: e?.extra_data || {} }; return t.clientId && (n.client_id = t.clientId), n; - })(e, { clientId: et(r, n) }); + })(e, { clientId: It(r, n) }); if (r && typeof r.fetchApi == "function") { let e = await r.fetchApi("/prompt", { method: "POST", @@ -1047,9 +1495,9 @@ async function pt(t = {}) { body: JSON.stringify(s) }); if (!e?.ok) throw Error(`POST /prompt failed (${e?.status})`); - return R(a, (e) => { + return j(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !0; + }), M(n, { change: !1 }), !0; } let c = await fetch("/prompt", { method: "POST", @@ -1058,17 +1506,17 @@ async function pt(t = {}) { body: JSON.stringify(s) }); if (!c.ok) throw Error(`POST /prompt failed (${c.status})`); - return R(a, (e) => { + return j(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !1; + }), M(n, { change: !1 }), !1; } catch (e) { - throw $e(n, o), e; + throw Ft(n, o), e; } } -function mt(e, t = {}) { +function Qt(e, t = {}) { if (!e) return !1; try { - let n = I(t.app || N || j()); + let n = At(t.app || k || D()); if (!n) return !1; if (t.select !== !1 && n.selectNode?.(e, !1), typeof n.centerOnNode == "function") n.centerOnNode(e); else if (e.pos && n.ds) { @@ -1080,12 +1528,12 @@ function mt(e, t = {}) { return console.debug?.(e), !1; } } -function ht(n, r = null) { +function $t(n, r = null) { let i = String(n || "").trim(); if (!i) return !1; try { - let n = r || N || j(), a = t(e(n), i); - return a ? mt(a, { + let n = r || k || D(), a = t(e(n), i); + return a ? Qt(a, { app: n, select: !1, focusCanvas: !1 @@ -1094,8 +1542,8 @@ function ht(n, r = null) { return console.debug?.(e), !1; } } -function gt() { - let e = N || j() || null, t = e?.canvas || null, n = t?.ds || null, r = t?.canvas || t?.el || null; +function en() { + let e = k || D() || null, t = e?.canvas || null, n = t?.ds || null, r = t?.canvas || t?.el || null; if (!t || !n || !r) return null; let i = Number(n?.scale), a = Number(r?.width || r?.clientWidth || 0), o = Number(r?.height || r?.clientHeight || 0); return !Number.isFinite(i) || i <= 0 || !(a > 0) || !(o > 0) ? null : { @@ -1107,10 +1555,10 @@ function gt() { height: o }; } -function _t(e, t, n) { +function tn(e, t, n) { return Array.isArray(e?.offset) ? (e.offset[0] = t, e.offset[1] = n, !0) : e?.offset && typeof e.offset == "object" ? (e.offset.x = t, e.offset.y = n, !0) : !1; } -function vt(e, t) { +function nn(e, t) { try { t?.setDirty?.(!0, !0); } catch (e) { @@ -1122,21 +1570,21 @@ function vt(e, t) { console.debug?.(e); } } -function yt(e) { +function rn(e) { try { - let t = gt(); + let t = en(); if (!t || !e) return !1; let n = Number(e.x), r = Number(e.y); if (!Number.isFinite(n) || !Number.isFinite(r)) return !1; let i = Math.max(1, Number(globalThis?.devicePixelRatio ?? globalThis?.window?.devicePixelRatio) || 1), a = -n + t.width * .5 / (t.scale * i), o = -r + t.height * .5 / (t.scale * i); - return !Number.isFinite(a) || !Number.isFinite(o) || !_t(t.ds, a, o) ? !1 : (vt(t.app, t.graphCanvas), !0); + return !Number.isFinite(a) || !Number.isFinite(o) || !tn(t.ds, a, o) ? !1 : (nn(t.app, t.graphCanvas), !0); } catch (e) { return console.debug?.(e), !1; } } -function bt() { +function an() { try { - let e = gt(); + let e = en(); if (!e) return null; let t = e.ds?.offset, n = Number(Array.isArray(t) ? t[0] : t?.x), r = Number(Array.isArray(t) ? t[1] : t?.y); return !Number.isFinite(n) || !Number.isFinite(r) ? null : { @@ -1150,35 +1598,35 @@ function bt() { } } // ui/app/settings/SettingsStore.ts -var B = /* @__PURE__ */ new Map(), V = !1, H = null; -function U() { +var N = /* @__PURE__ */ new Map(), on = !1, P = null; +function sn() { try { return typeof window > "u" ? null : window.localStorage || null; } catch { return null; } } -function W(e, t, n) { - let r = B.get(String(e || "")); +function cn(e, t, n) { + let r = N.get(String(e || "")); if (r && r.size) for (let i of Array.from(r)) try { i(t, n, e); } catch (e) { console.debug?.(e); } } -function xt() { - if (!V) try { - H = (e) => { +function ln() { + if (!on) try { + P = (e) => { let t = String(e?.key || ""); - t && W(t, e?.newValue ?? null, e?.oldValue ?? null); - }, window.addEventListener("storage", H), V = !0; + t && cn(t, e?.newValue ?? null, e?.oldValue ?? null); + }, window.addEventListener("storage", P), on = !0; } catch (e) { console.debug?.(e); } } -var G = { +var F = { get(e) { - let t = U(); + let t = sn(); if (!t) return null; try { return t.getItem(String(e || "")); @@ -1189,13 +1637,13 @@ var G = { set(e, t) { let n = String(e || ""); if (!n) return !1; - let r = U(); + let r = sn(); if (!r) return !1; - let i = G.get(n); + let i = F.get(n); try { - if (t == null) return r.removeItem(n), W(n, null, i), !0; + if (t == null) return r.removeItem(n), cn(n, null, i), !0; let e = String(t); - return r.setItem(n, e), W(n, e, i), !0; + return r.setItem(n, e), cn(n, e, i), !0; } catch { return !1; } @@ -1203,19 +1651,19 @@ var G = { subscribe(e, t) { let n = String(e || ""); if (!n || typeof t != "function") return () => {}; - xt(); - let r = B.get(n); - return r || (r = /* @__PURE__ */ new Set(), B.set(n, r)), r.add(t), () => { + ln(); + let r = N.get(n); + return r || (r = /* @__PURE__ */ new Set(), N.set(n, r)), r.add(t), () => { try { - let e = B.get(n); - e?.delete(t), e && !e.size && B.delete(n); + let e = N.get(n); + e?.delete(t), e && !e.size && N.delete(n); } catch (e) { console.debug?.(e); } }; }, getAll() { - let e = {}, t = U(); + let e = {}, t = sn(); if (!t) return e; try { let n = Number(t.length || 0) || 0; @@ -1230,17 +1678,17 @@ var G = { }, dispose() { try { - V && H && typeof window < "u" && window.removeEventListener("storage", H); + on && P && typeof window < "u" && window.removeEventListener("storage", P); } catch (e) { console.debug?.(e); } - V = !1, H = null, B.clear(); + on = !1, P = null, N.clear(); } -}, K = "en-US", q = K, St = /* @__PURE__ */ new Set(), Ct = ["mjr_lang", "majoor.lang"], wt = "mjr_lang_follow_comfy", Tt = 500, J = /* @__PURE__ */ new Set(), Y = null, Et = /* @__PURE__ */ new Set([ +}, I = "en-US", L = I, un = /* @__PURE__ */ new Set(), dn = ["mjr_lang", "majoor.lang"], fn = "mjr_lang_follow_comfy", pn = 500, R = /* @__PURE__ */ new Set(), mn = null, hn = /* @__PURE__ */ new Set([ "ar-SA", "fa-IR", "he-IL" -]), Dt = { +]), gn = { fr: "fr-FR", "fr-fr": "fr-FR", fr_FR: "fr-FR", @@ -1346,7 +1794,7 @@ var G = { "el-gr": "el-GR", el_gr: "el-GR", elgr: "el-GR" -}, X = { +}, z = { "en-US": { "cat.grid": "Grid", "cat.cards": "Cards", @@ -1382,8 +1830,6 @@ var G = { "setting.grid.videoAutoplayMode.off": "Off", "setting.grid.videoAutoplayMode.hover": "Hover", "setting.grid.videoAutoplayMode.always": "Always", - "setting.viewer.pan.name": "Majoor: Pan without Zoom", - "setting.viewer.pan.desc": "Allow panning the image even at zoom level 1.", "setting.viewer.pauseExecution.name": "Majoor: Pause Main Viewer During Execution", "setting.viewer.pauseExecution.desc": "Pause the main viewer render processors while ComfyUI is generating to reduce competition for CPU/GPU.", "setting.viewer.floatingPauseExecution.name": "Majoor: Pause Floating Viewer During Execution", @@ -1547,9 +1993,6 @@ var G = { "tags.addLabel": "Add tag", "tags.remove": "Remove tag", "tags.suggestions": "Tag suggestions", - "tags.bulkTitle": "Tags across {n} assets", - "tags.bulkAddPlaceholder": "Add tag to all...", - "tags.bulkAddMissing": "Add to all assets", "label.messages": "Messages", "label.readMe": "Read Me", "label.userGuide": "User Guide", @@ -1628,24 +2071,9 @@ var G = { "tooltip.assetsDaySingular": "{count} asset", "tooltip.assetsDayPlural": "{count} assets", "tooltip.deleteCollection": "Delete collection", - "tooltip.viewerShortcuts": "Viewer keyboard shortcuts", - "tooltip.singleViewMode": "Single view mode (one image)", - "tooltip.compareOverlayMode": "A/B compare mode (overlay)", - "tooltip.compareSideBySide": "Side-by-side comparison mode", - "tooltip.colorChannels": "View color channels or luminance", - "tooltip.scopesHistogram": "Show histogram/waveform scopes", - "tooltip.gridOverlay": "Grid overlay (rule of thirds, center)", - "tooltip.aspectRatioMask": "Aspect ratio overlay mask", - "tooltip.compareBlendMode": "Compare blend mode", - "tooltip.audioVisualizer": "Audio visualizer mode", - "tooltip.exportFrame": "Save current frame as PNG", - "tooltip.copyFrame": "Copy current frame to clipboard", - "tooltip.resetExposure": "Reset exposure to 0", - "tooltip.resetGamma": "Reset gamma to 1.00", "tooltip.resetInPoint": "Reset In point to start", "tooltip.resetOutPoint": "Reset Out point to end", "tooltip.maintenanceTools": "Database maintenance tools", - "tooltip.resetPlayerControls": "Reset all viewer controls", "filter.all": "All", "filter.any": "Any", "filter.images": "Images", @@ -1785,7 +2213,6 @@ var G = { "msg.errorLoading": "Error loading", "msg.errorLoadingFolders": "Error loading folders", "msg.noGenerationData": "No generation data found for this file.", - "msg.rawMetadata": "Raw metadata", "msg.noMessages": "No messages for now.", "msg.noPinnedFolders": "No pinned folders", "msg.noTagsYet": "No tags yet...", @@ -1848,7 +2275,6 @@ var G = { "msg.dbResetNotice": "Database reset required", "viewer.genInfo": "Generation Info", "viewer.workflow": "Workflow", - "viewer.metadata": "Metadata", "viewer.noWorkflow": "No workflow data", "viewer.noMetadata": "No metadata available", "viewer.copySuccess": "Copied to clipboard!", @@ -1860,11 +2286,6 @@ var G = { "viewer.mode.sideBySide": "Side-by-side", "viewer.mode.grid": "Grid", "viewer.pinSlots": "Pin slots A/B/C/D", - "viewer.loadingGenerationData": "Loading generation data...", - "viewer.errorLoadingMetadata": "Error Loading Metadata", - "viewer.noGenerationDataFile": "No generation data found for this file.", - "viewer.metadataErrorWithCode": "{message}\n\nCode: {code}\nClick to retry.", - "viewer.metadataErrorRetry": "{message}\n\nClick to retry.", "video.controls": "Video controls", "video.previewControls": "Video preview controls", "video.playPause": "Play/Pause", @@ -2131,13 +2552,9 @@ var G = { "ctx.renameFolder": "Rename folder...", "ctx.moveFolder": "Move folder...", "ctx.deleteFolder": "Delete folder...", - "ctx.refreshMetadata": "Refresh metadata", "ctx.resetIndexFile": "Reset index (this file)", - "ctx.openInNewTab": "Open in New Tab", - "ctx.downloadOriginal": "Download Original", "ctx.download": "Download", "ctx.editTags": "Edit tags", - "ctx.editTagsSelected": "Edit tags ({count} selected)", "ctx.setRating": "Set rating", "ctx.resetRating": "Reset rating", "ctx.showMetadataPanel": "Show metadata panel", @@ -2196,6 +2613,7 @@ var G = { "dialog.dbDelete.keepVectorsConfirm": "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?", "toast.scanStarted": "Scan started", "toast.scanComplete": "Scan complete", + "toast.scanCompleteSummary": "{added} new, {removed} removed", "toast.scanFailed": "Scan failed", "toast.resetTriggered": "Reset triggered: Reindexing all files...", "toast.resetStarted": "Index reset started. Files will be reindexed in the background.", @@ -2245,19 +2663,6 @@ var G = { "toast.ratingCleared": "Rating cleared", "toast.ratingSetN": "Rating set to {n} stars", "toast.tagsUpdated": "Tags updated", - "toast.bulkTagsProgress": "Updating tags on {n} assets...", - "toast.bulkTagsUpdated": "Tags updated on {n} asset(s)", - "toast.bulkTagsUpdatedWithFailed": ", {n} failed", - "toast.bulkTagsSkippedWorkflow": ", {n} skipped (workflow)", - "toast.bulkTagsSkippedInvalidId": ", {n} skipped (no id)", - "toast.bulkTagsSkippedMixed": ", {n} skipped ({workflow} workflow, {invalid} no id)", - "toast.bulkTagsSkippedOnlyWorkflow": "{n} workflow asset(s) skipped", - "toast.bulkTagsSkippedOnlyInvalidId": "{n} asset(s) without id skipped", - "toast.bulkTagsSkippedOnlyMixed": "{n} asset(s) skipped ({workflow} workflow, {invalid} no id)", - "toast.bulkTagsInvalidTag": "Tag not added (empty, too long, or invalid characters)", - "toast.bulkTagsHydrationIncomplete": "Couldn't load tags for {n} cards; counts may be incomplete", - "toast.bulkTagsFailed": "Bulk tag update failed", - "toast.maxTagsReached": "Maximum number of tags reached", "toast.remoteLanPresetApplied": "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations.", "toast.remoteLanPresetFailed": "Failed to apply the recommended remote LAN setup.", "toast.createFolderFailed": "Failed to create folder", @@ -2367,7 +2772,69 @@ var G = { "hotkey.details": "Toggle details (D)", "hotkey.delete": "Delete (Del)", "hotkey.viewer": "Open viewer (Enter)", - "hotkey.escape": "Close (Esc)" + "hotkey.escape": "Close (Esc)", + "viewer.studio.abLoop": "A-B loop (I / O, U to clear)", + "viewer.studio.actualSize": "Actual size", + "viewer.studio.aspect": "Aspect ratio mask", + "viewer.studio.channels": "Channels", + "viewer.studio.checker": "Transparency checkerboard", + "viewer.studio.clearLoop": "Clear A-B loop", + "viewer.studio.close": "Close (Esc)", + "viewer.studio.compare": "Compare A/B (C)", + "viewer.studio.compareTool": "Compare A/B (C)", + "viewer.studio.copied": "Copied to clipboard", + "viewer.studio.copy": "Copy image / frame to clipboard", + "viewer.studio.copyFailed": "Could not copy this image", + "viewer.studio.download": "Download", + "viewer.studio.ev": "Exposure", + "viewer.studio.exportFrame": "Save this frame as PNG", + "viewer.studio.exposure": "Exposure / gamma", + "viewer.studio.filmstrip": "Filmstrip", + "viewer.studio.fit": "Fit", + "viewer.studio.frame": "Frame", + "viewer.studio.fullscreen": "Fullscreen (F)", + "viewer.studio.gamma": "Gamma", + "viewer.studio.grid": "Guides (G)", + "viewer.studio.histogram": "Histogram", + "viewer.studio.inspector": "Generation info (Tab)", + "viewer.studio.loop": "Loop", + "viewer.studio.loupe": "Loupe (L) - right-click for settings", + "viewer.studio.loupeTitle": "Loupe", + "viewer.studio.magnification": "Magnification", + "viewer.studio.mediaError": "This file cannot be played by the browser.", + "viewer.studio.mute": "Mute (M)", + "viewer.studio.next": "Next (→)", + "viewer.studio.nextB": "Next B", + "viewer.studio.nextFrame": "Next frame (.)", + "viewer.studio.opacity": "Opacity", + "viewer.studio.pinB": "Use the current asset as B (B)", + "viewer.studio.pinBShort": "Set B", + "viewer.studio.play": "Play", + "viewer.studio.playPause": "Play / pause (Space)", + "viewer.studio.prev": "Previous (←)", + "viewer.studio.prevB": "Previous B", + "viewer.studio.prevFrame": "Previous frame (,)", + "viewer.studio.probe": "Pixel probe (P)", + "viewer.studio.reset": "Reset", + "viewer.studio.resetTools": "Reset all tools (R)", + "viewer.studio.scopes": "Scopes (S)", + "viewer.studio.seek": "Seek", + "viewer.studio.size": "Size", + "viewer.studio.speed": "Speed ([ / ])", + "viewer.studio.swap": "Swap A and B (X)", + "viewer.studio.swapShort": "Swap", + "viewer.studio.tabFile": "File", + "viewer.studio.tabGeneration": "Generation", + "viewer.studio.tabWorkflow": "Workflow", + "viewer.studio.threshold": "Threshold", + "viewer.studio.title": "Viewer", + "viewer.studio.tools": "Review tools", + "viewer.studio.unsupported": "No preview for this file type.", + "viewer.studio.volume": "Volume", + "viewer.studio.waveform": "Waveform", + "viewer.studio.wipe": "Wipe", + "viewer.studio.zebra": "Zebra highlights (Z)", + "viewer.studio.zoomHint": "Wheel to zoom, double-click for fit / 100 %" }, "fr-FR": { "tab.output": "Sortie", @@ -2446,6 +2913,8 @@ var G = { "dialog.workflowSaveName": "Nom du workflow", "dialog.workflowCategory": "Categorie du workflow", "dialog.deleteWorkflowConfirm": "Supprimer ce JSON workflow et ses thumbnails adjacents ?", + "toast.scanComplete": "Scan terminé", + "toast.scanCompleteSummary": "{added} nouveau(x), {removed} retiré(s)", "toast.workflowSaved": "Workflow enregistre", "toast.workflowSaveFailed": "Echec de l'enregistrement du workflow.", "toast.workflowSerializeFailed": "Impossible de lire le workflow ComfyUI courant.", @@ -2488,11 +2957,6 @@ var G = { "toast.memoryPurgeComplete": "Purge memoire terminee. Les caches des modeles IA Majoor et ComfyUI ont ete liberes.", "toast.memoryPurgeCompleteMajoorOnly": "Purge memoire terminee. Les caches IA Majoor ont ete liberes.", "viewer.copySuccessShort": "Copie !", - "viewer.loadingGenerationData": "Chargement des donnees de generation...", - "viewer.errorLoadingMetadata": "Erreur de chargement des metadonnees", - "viewer.noGenerationDataFile": "Aucune donnee de generation trouvee pour ce fichier.", - "viewer.metadataErrorWithCode": "{message}\n\nCode : {code}\nCliquer pour reessayer.", - "viewer.metadataErrorRetry": "{message}\n\nCliquer pour reessayer.", "sidebar.fileInfo.title": "Infos fichier", "sidebar.fileInfo.dimensionsTooltip": "Resolution image/video en pixels", "sidebar.fileInfo.duration": "Duree", @@ -2730,7 +3194,6 @@ var G = { "ctx.renameFolder": "Renommer dossier...", "ctx.moveFolder": "Deplacer dossier...", "ctx.deleteFolder": "Supprimer dossier...", - "ctx.refreshMetadata": "Rafraichir metadonnees", "ctx.openFolder": "Ouvrir dossier", "dialog.browserRootLabelOptional": "Label pour nouvelle racine browser (optionnel)", "dialog.newFolderName": "Nom du nouveau dossier", @@ -2861,9 +3324,71 @@ var G = { "msg.nightlyUpdateDetail": "Une build nightly plus recente est disponible. Télécharger : https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tag/nightly", "msg.newVersionTitle": "Mise à jour disponible", "msg.newVersionDetail": "La version {latest} est disponible. Version installée : {current}.", - "tooltip.starGithub": "Ouvrir GitHub et mettre une etoile" + "tooltip.starGithub": "Ouvrir GitHub et mettre une etoile", + "viewer.studio.abLoop": "Boucle A-B (I / O, U pour effacer)", + "viewer.studio.actualSize": "Taille réelle", + "viewer.studio.aspect": "Masque de format", + "viewer.studio.channels": "Canaux", + "viewer.studio.checker": "Damier de transparence", + "viewer.studio.clearLoop": "Effacer la boucle A-B", + "viewer.studio.close": "Fermer (Échap)", + "viewer.studio.compare": "Comparer A/B (C)", + "viewer.studio.compareTool": "Comparer A/B (C)", + "viewer.studio.copied": "Copié dans le presse-papiers", + "viewer.studio.copy": "Copier l'image / la frame", + "viewer.studio.copyFailed": "Impossible de copier cette image", + "viewer.studio.download": "Télécharger", + "viewer.studio.ev": "Exposition", + "viewer.studio.exportFrame": "Enregistrer cette frame en PNG", + "viewer.studio.exposure": "Exposition / gamma", + "viewer.studio.filmstrip": "Pellicule", + "viewer.studio.fit": "Ajuster", + "viewer.studio.frame": "Frame", + "viewer.studio.fullscreen": "Plein écran (F)", + "viewer.studio.gamma": "Gamma", + "viewer.studio.grid": "Guides (G)", + "viewer.studio.histogram": "Histogramme", + "viewer.studio.inspector": "Infos de génération (Tab)", + "viewer.studio.loop": "Boucle", + "viewer.studio.loupe": "Loupe (L) - clic droit pour les réglages", + "viewer.studio.loupeTitle": "Loupe", + "viewer.studio.magnification": "Grossissement", + "viewer.studio.mediaError": "Ce fichier ne peut pas être lu par le navigateur.", + "viewer.studio.mute": "Muet (M)", + "viewer.studio.next": "Suivant (→)", + "viewer.studio.nextB": "B suivant", + "viewer.studio.nextFrame": "Frame suivante (.)", + "viewer.studio.opacity": "Opacité", + "viewer.studio.pinB": "Utiliser l'asset courant comme B (B)", + "viewer.studio.pinBShort": "Définir B", + "viewer.studio.play": "Lecture", + "viewer.studio.playPause": "Lecture / pause (Espace)", + "viewer.studio.prev": "Précédent (←)", + "viewer.studio.prevB": "B précédent", + "viewer.studio.prevFrame": "Frame précédente (,)", + "viewer.studio.probe": "Pipette (P)", + "viewer.studio.reset": "Réinitialiser", + "viewer.studio.resetTools": "Réinitialiser les outils (R)", + "viewer.studio.scopes": "Scopes (S)", + "viewer.studio.seek": "Position", + "viewer.studio.size": "Taille", + "viewer.studio.speed": "Vitesse ([ / ])", + "viewer.studio.swap": "Inverser A et B (X)", + "viewer.studio.swapShort": "Inverser", + "viewer.studio.tabFile": "Fichier", + "viewer.studio.tabGeneration": "Génération", + "viewer.studio.tabWorkflow": "Workflow", + "viewer.studio.threshold": "Seuil", + "viewer.studio.title": "Viewer", + "viewer.studio.tools": "Outils de revue", + "viewer.studio.unsupported": "Pas d'aperçu pour ce type de fichier.", + "viewer.studio.volume": "Volume", + "viewer.studio.waveform": "Waveform", + "viewer.studio.wipe": "Volet", + "viewer.studio.zebra": "Zébras (Z)", + "viewer.studio.zoomHint": "Molette pour zoomer, double-clic pour ajuster / 100 %" } -}, Ot = Object.freeze({ +}, _n = Object.freeze({ "en-US": "English", "fr-FR": "Français", "zh-CN": "Chinese (Simplified)", @@ -2913,43 +3438,43 @@ var G = { "ro-RO", "el-GR" ].forEach((e) => { - X[e] || (X[e] = {}); + z[e] || (z[e] = {}); }); -var Z = !1, kt = null; -function At(e) { - Z || (Z = !0, Object.entries(e || {}).forEach(([e, t]) => { - X[e] = { - ...X[e] || {}, +var vn = !1, yn = null; +function bn(e) { + vn || (vn = !0, Object.entries(e || {}).forEach(([e, t]) => { + z[e] = { + ...z[e] || {}, ...t || {} }; - }), jt()); + }), xn()); } -function jt() { - let e = X["en-US"] || {}; - Object.keys(X).forEach((t) => { - t !== "en-US" && (X[t] = { +function xn() { + let e = z["en-US"] || {}; + Object.keys(z).forEach((t) => { + t !== "en-US" && (z[t] = { ...e, - ...X[t] || {} + ...z[t] || {} }); }); } -function Mt() { - return Z ? Promise.resolve() : (kt ||= import("./i18n.generated-DqByySOH.js").then(({ GENERATED_TRANSLATIONS: e }) => { - At(e); +function Sn() { + return vn ? Promise.resolve() : (yn ||= import("./i18n.generated-CezSPtOB.js").then(({ GENERATED_TRANSLATIONS: e }) => { + bn(e); }).catch((e) => { - console.warn("[Majoor i18n] Failed to load generated translations:", e), jt(); - }), kt); + console.warn("[Majoor i18n] Failed to load generated translations:", e), xn(); + }), yn); } -jt(); -function Q(e) { - if (!e) return K; +xn(); +function Cn(e) { + if (!e) return I; let t = String(e || "").trim(), n = t.toLowerCase(); - return Dt[n] ? Dt[n] : X[t] ? t : K; + return gn[n] ? gn[n] : z[t] ? t : I; } -function Nt() { +function wn() { try { - for (let e of Ct) { - let t = String(G.get(e) || "").trim(); + for (let e of dn) { + let t = String(F.get(e) || "").trim(); if (t) return t; } } catch (e) { @@ -2957,16 +3482,16 @@ function Nt() { } return ""; } -function Pt(e) { +function Tn(e) { try { - G.set(Ct[0], e), G.set(Ct[1], e); + F.set(dn[0], e), F.set(dn[1], e); } catch (e) { console.debug?.(e); } } -function Ft() { +function En() { try { - let e = String(G.get(wt) || "").trim().toLowerCase(); + let e = String(F.get(fn) || "").trim().toLowerCase(); return !e || ![ "0", "false", @@ -2978,14 +3503,14 @@ function Ft() { } return !0; } -function It(e) { +function Dn(e) { try { - G.set(wt, e ? "1" : "0"); + F.set(fn, e ? "1" : "0"); } catch (e) { console.debug?.(e); } } -function Lt(e) { +function On(e) { let t = [], n = (e) => { if (typeof e != "string") return; let n = e.trim(); @@ -2997,10 +3522,10 @@ function Lt(e) { "Comfy.LocaleCode", "ComfyUI.Locale", "ComfyUI.Frontend.Locale" - ]) n(Fe(e, t)); + ]) n(pt(e, t)); return n(e?.ui?.locale), n(e?.locale), n(e?.ui?.i18n?.locale), t; } -function Rt() { +function kn() { let e = [], t = (t) => { if (typeof t != "string") return; let n = t.trim(); @@ -3022,85 +3547,85 @@ function Rt() { } return e; } -function zt() { +function An() { try { if (typeof document < "u" && document.documentElement) { - let e = Et.has(q); + let e = hn.has(L); document.documentElement.dir = e ? "rtl" : "ltr"; } } catch (e) { console.debug?.(e); } } -var Bt = (e) => { +var jn = (e) => { try { - let t = Ft(), n = Nt(), r = Q(n), i = () => { - let t = Lt(e); + let t = En(), n = wn(), r = Cn(n), i = () => { + let t = On(e); for (let e of t) { - let t = Q(e); - if (X[t]) return $(t), !0; + let t = Cn(e); + if (z[t]) return B(t), !0; } return !1; }; if (t) { if (i()) return; - if (n && X[r]) { - $(r); + if (n && z[r]) { + B(r); return; } - if (X[q]) return; - $(K); + if (z[L]) return; + B(I); return; } - if (n && X[r]) { - $(r); + if (n && z[r]) { + B(r); return; } if (i()) return; - let a = Rt(); + let a = kn(); for (let e of a) { - let t = Q(e); - if (X[t]) { - $(t); + let t = Cn(e); + if (z[t]) { + B(t); return; } } - $(K); + B(I); } catch (e) { - console.warn("[Majoor i18n] Failed to detect language:", e), $(K); + console.warn("[Majoor i18n] Failed to detect language:", e), B(I); } -}, $ = (e) => { - X[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${K}`), e = K), q !== e && (q = e, Pt(e), zt(), e !== K && !Z && Mt().then(() => { - Array.from(St).forEach((t) => { +}, B = (e) => { + z[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${I}`), e = I), L !== e && (L = e, Tn(e), An(), e !== I && !vn && Sn().then(() => { + Array.from(un).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } }); - }), Array.from(St).forEach((t) => { + }), Array.from(un).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } })); -}, Vt = (e) => { - It(!!e); -}, Ht = (e) => { +}, Mn = (e) => { + Dn(!!e); +}, Nn = (e) => { try { - Y &&= (clearInterval(Y), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null); + mn &&= (clearInterval(mn), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null); } catch (e) { console.debug?.(e); } - Y = setInterval(() => { + mn = setInterval(() => { try { - if (!Ft()) return; - let t = Lt(e); + if (!En()) return; + let t = On(e); for (let e of t) { - let t = Q(e); - if (X[t] && t !== q) { - $(t); + let t = Cn(e); + if (z[t] && t !== L) { + B(t); return; } } @@ -3109,35 +3634,35 @@ var Bt = (e) => { } }, 2e3); try { - typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = Y); + typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = mn); } catch (e) { console.debug?.(e); } -}, Ut = () => q, Wt = () => Object.keys(X).map((e) => ({ +}, Pn = () => L, Fn = () => Object.keys(z).map((e) => ({ code: e, - name: Ot[e] || e -})), Gt = (e, t, n) => { - let r = X[q] || X[K], i = X[K], a = r[e] || i[e]; + name: _n[e] || e +})), V = (e, t, n) => { + let r = z[L] || z[I], i = z[I], a = r[e] || i[e]; if (!a) { - let n = `${q}:${String(e || "")}`; - if (!J.has(n)) { - if (J.size >= Tt) { - let e = Math.floor(Tt * .2), t = J.values(); + let n = `${L}:${String(e || "")}`; + if (!R.has(n)) { + if (R.size >= pn) { + let e = Math.floor(pn * .2), t = R.values(); for (let n = 0; n < e; n++) { let e = t.next().value; - e && J.delete(e); + e && R.delete(e); } } - J.add(n); + R.add(n); try { - console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${q}"`); + console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${L}"`); } catch (e) { console.debug?.(e); } try { typeof window < "u" && typeof window.dispatchEvent == "function" && window.dispatchEvent(new CustomEvent("mjr-i18n-missing-key", { detail: { key: String(e || ""), - locale: q + locale: L } })); } catch (e) { console.debug?.(e); @@ -3149,17 +3674,1399 @@ var Bt = (e) => { return o && typeof o == "object" && Object.entries(o).forEach(([e, t]) => { a = a.replaceAll(`{${e}}`, String(t)); }), a; -}, Kt = Object.freeze({ +}, In = "mjr_toast_history_v1", Ln = "mjr_toast_history_last_read_v1", Rn = 60, zn = "mjr:toast-history-changed", H = null; +function U(e) { + return String(e || "").trim(); +} +function Bn(e) { + let t = U(e).toLowerCase(); + return t === "warn" ? "warning" : t === "danger" ? "error" : t || "info"; +} +function Vn(e) { + let t = Number(e); + return Number.isFinite(t) ? t : null; +} +function Hn(e) { + if (!e || typeof e != "object") return null; + let t = Number(e.percent), n = Number.isFinite(t) ? Math.max(0, Math.min(100, Math.round(t))) : null, r = Number(e.current), i = Number(e.total), a = Number.isFinite(r) ? Math.max(0, Math.floor(r)) : null, o = Number.isFinite(i) ? Math.max(0, Math.floor(i)) : null, s = Number(e.indexed), c = Number(e.skipped), l = Number(e.errors), u = Number.isFinite(s) ? Math.max(0, Math.floor(s)) : null, d = Number.isFinite(c) ? Math.max(0, Math.floor(c)) : null, f = Number.isFinite(l) ? Math.max(0, Math.floor(l)) : null, p = U(e.label); + return n === null && a === null && o === null && u === null && d === null && f === null && !p ? null : { + percent: n, + current: a, + total: o, + indexed: u, + skipped: d, + errors: f, + label: p + }; +} +function Un(e, t, n) { + return e && t ? `${e}: ${t}` : t || e || n || ""; +} +function Wn(e, t = "info", n = null) { + if (!e || typeof e != "object") return null; + let r = U(e.title || e.summary), i = U(e.detail), a = U(e.message || Un(r, i, U(e.fallbackMessage))); + if (!a) return null; + let o = Vn(e.durationMs ?? e.duration ?? n), s = Number(e.createdAt), c = Number.isFinite(s) && s > 0 ? s : Date.now(), u = typeof e.persistent == "boolean" ? e.persistent : !(Number.isFinite(o) && (o ?? 0) > 0); + return { + id: U(e.id) || l(`th-${c}-`, 4), + message: a, + title: r, + detail: i, + type: Bn(e.type || t), + createdAt: c, + durationMs: o, + persistent: u, + source: U(e.source), + trackId: U(e.trackId), + status: U(e.status), + operation: U(e.operation), + progress: Hn(e.progress), + forceStore: !!e.forceStore, + actionLabel: U(e.actionLabel), + actionUrl: U(e.actionUrl) + }; +} +function Gn() { + if (H === null) try { + let e = localStorage.getItem(In), t = e ? JSON.parse(e) : []; + H = Array.isArray(t) ? t.map((e) => { + if (e && typeof e == "object") return Wn(e); + let t = U(e); + return t ? Wn({ message: t }) : null; + }).filter(Boolean) : []; + } catch { + H = []; + } +} +function Kn() { + try { + localStorage.setItem(In, JSON.stringify(H)); + } catch {} +} +function qn() { + try { + window.dispatchEvent(new CustomEvent(zn)); + } catch {} +} +function Jn() { + try { + return Number(localStorage.getItem(Ln)) || 0; + } catch { + return 0; + } +} +function Yn(e) { + try { + localStorage.setItem(Ln, String(Number(e) || 0)); + } catch {} +} +function Xn(e, t, n) { + Gn(); + let r = Wn(e && typeof e == "object" ? e : { + message: U(e), + type: t, + durationMs: n + }, t, n); + if (!r || !r.forceStore && !r.trackId && r.type === "info" && Number.isFinite(r.durationMs) && r.durationMs != null && r.durationMs > 0 && r.durationMs < 2500) return; + let i = String(r.trackId || "").trim(); + if (i) { + let e = H.findIndex((e) => String(e?.trackId || "").trim() === i); + if (e >= 0) { + let t = H[e] || {}; + H.splice(e, 1), r.id = String(t.id || r.id || "").trim() || r.id; + } + } + H.unshift(r), H.length > Rn && (H = H.slice(0, Rn)), Kn(), qn(); +} +function Zn() { + return Gn(), H.map((e) => ({ ...e })); +} +function Qn() { + Gn(); + let e = Jn(); + return H.filter((t) => t.createdAt > e).length; +} +function $n() { + Yn(Date.now()), qn(); +} +function er() { + Gn(), H = [], Kn(), Yn(Date.now()), qn(); +} +// ui/app/toast.ts +function tr(e) { + let t = String(e || "info").trim().toLowerCase(); + return t === "warn" ? "warning" : t === "danger" ? "error" : t === "success" || t === "warning" || t === "error" ? t : "info"; +} +function W(e) { + if (typeof e == "string") return e; + if (e && typeof e == "object") { + let t = String(e.summary || "").trim(), n = String(e.detail || e.message || "").trim(); + if (t && n) return `${t}: ${n}`; + if (n) return n; + if (t) return t; + } + try { + return String(e?.message || e || "").trim() || "Unknown message"; + } catch { + return "Unknown message"; + } +} +function nr(e, t, n, r) { + let i = r?.history && typeof r.history == "object" ? r.history : null, a = { + persistent: !(Number.isFinite(Number(n)) && Number(n) > 0), + source: String(i?.source || r?.source || "").trim(), + trackId: String(i?.trackId || "").trim(), + status: String(i?.status || "").trim(), + operation: String(i?.operation || "").trim(), + progress: i?.progress && typeof i.progress == "object" ? { ...i.progress } : null, + forceStore: !!i?.forceStore, + actionLabel: String(i?.actionLabel || "").trim(), + actionUrl: String(i?.actionUrl || "").trim() + }; + return e && typeof e == "object" ? (a.title = String(i?.title || e.summary || "").trim(), a.detail = String(i?.detail || e.detail || e.message || "").trim(), a.message = W(e), a) : (a.title = String(i?.title || "").trim(), a.detail = String(i?.detail || "").trim(), a.message = W(e), a); +} +function rr(e, t = "info", n, r) { + try { + let i = nr(e, t, n, r); + i.forceStore = !0, Xn(i, t, n ?? void 0); + } catch {} +} +function ir(e) { + switch (e) { + case "success": return 2e3; + case "info": return 3e3; + case "warning": return 4e3; + case "error": return 5e3; + default: return 5e3; + } +} +function ar(e) { + if (typeof e != "string") return e; + let t = e.trim(), n = { + "Failed to update rating": V("toast.ratingUpdateFailed", "Failed to update rating"), + "Error updating rating": V("toast.ratingUpdateError", "Error updating rating"), + "Rating cleared": V("toast.ratingCleared", "Rating cleared"), + "Failed to update tags": V("toast.tagsUpdateFailed", "Failed to update tags"), + "Tags updated": V("toast.tagsUpdated", "Tags updated"), + "Failed to toggle watcher": V("toast.watcherToggleFailed", "Failed to toggle watcher"), + "No valid assets selected.": V("toast.noValidAssetsSelected", "No valid assets selected."), + "Name collision in current view": V("toast.nameCollisionInView", "Name collision in current view"), + "Failed to create collection.": V("toast.failedCreateCollectionDot", "Failed to create collection."), + "Failed to add assets to collection.": V("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), + "Failed to remove from collection.": V("toast.removeFromCollectionFailed", "Failed to remove from collection."), + "Collection created": V("toast.collectionCreated", "Collection created"), + "Added to collection": V("toast.addedToCollection", "Added to collection"), + "Removed from collection": V("toast.removedFromCollection", "Removed from collection"), + "File renamed successfully!": V("toast.fileRenamedSuccess", "File renamed successfully!"), + "Failed to rename file": V("toast.fileRenameFailed", "Failed to rename file"), + "Failed to rename file.": V("toast.fileRenameFailed", "Failed to rename file."), + "File deleted successfully!": V("toast.fileDeletedSuccess", "File deleted successfully!"), + "Failed to delete file.": V("toast.fileDeleteFailed", "Failed to delete file."), + "Failed to delete file. ": V("toast.fileDeleteFailed", "Failed to delete file."), + "File deleted": V("toast.deleted", "File deleted"), + "File renamed": V("toast.renamed", "File renamed"), + "Folder created": V("toast.folderCreated", "Folder created"), + "Folder renamed": V("toast.folderRenamed", "Folder renamed"), + "Folder moved": V("toast.folderMoved", "Folder moved"), + "Folder deleted": V("toast.folderDeleted", "Folder deleted"), + "Failed to create folder": V("toast.createFolderFailed", "Failed to create folder"), + "Failed to rename folder": V("toast.renameFolderFailed", "Failed to rename folder"), + "Failed to move folder": V("toast.moveFolderFailed", "Failed to move folder"), + "Failed to delete folder": V("toast.deleteFolderFailed", "Failed to delete folder"), + "Failed to pin folder": V("toast.pinFolderFailed", "Failed to pin folder"), + "Failed to unpin folder": V("toast.unpinFolderFailed", "Failed to unpin folder"), + "Folder pinned as browser root": V("toast.folderPinnedAsBrowserRoot", "Folder pinned as browser root"), + "Folder added": V("toast.folderAdded", "Folder added"), + "Folder removed": V("toast.folderRemoved", "Folder removed"), + "Folder linked successfully": V("toast.folderLinked", "Folder linked successfully"), + "An error occurred while adding the custom folder": V("toast.errorAddingFolder", "An error occurred while adding the custom folder"), + "An error occurred while removing the custom folder": V("toast.errorRemovingFolder", "An error occurred while removing the custom folder"), + "Failed to add custom folder": V("toast.failedAddFolder", "Failed to add custom folder"), + "Failed to remove custom folder": V("toast.failedRemoveFolder", "Failed to remove custom folder"), + "Native folder browser unavailable. Please enter path manually.": V("toast.nativeBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), + "Opened in folder": V("toast.openedInFolder", "Opened in folder"), + "Failed to open folder": V("toast.openFolderFailed", "Failed to open folder"), + "Failed to open folder.": V("toast.openFolderFailed", "Failed to open folder."), + "File path copied to clipboard": V("toast.pathCopied", "File path copied to clipboard"), + "Failed to copy path": V("toast.pathCopyFailed", "Failed to copy path"), + "Failed to copy to clipboard": V("toast.copyClipboardFailed", "Failed to copy to clipboard"), + "No file path available for this asset.": V("toast.noFilePath", "No file path available for this asset."), + "Failed to refresh metadata.": V("toast.metadataRefreshFailed", "Failed to refresh metadata."), + "Metadata refreshed": V("toast.metadataRefreshed", "Metadata refreshed"), + "Duplicate analysis started": V("toast.dupAnalysisStarted", "Duplicate analysis started"), + "Tags merged": V("toast.tagsMerged", "Tags merged"), + "Duplicates deleted": V("toast.duplicatesDeleted", "Duplicates deleted"), + "Rescanning file...": V("toast.rescanningFile", "Rescanning file..."), + "Metadata enrichment complete": V("toast.enrichmentComplete", "Metadata enrichment complete"), + "Playback speed is available for video media only": V("toast.playbackVideoOnly", "Playback speed is available for video media only"), + "DB backup saved": V("toast.dbSaveSuccess", "DB backup saved"), + "Failed to save DB backup": V("toast.dbSaveFailed", "Failed to save DB backup"), + "DB restore started": V("toast.dbRestoreStarted", "DB restore started"), + "Failed to restore DB backup": V("toast.dbRestoreFailed", "Failed to restore DB backup"), + "Select a DB backup first": V("toast.dbRestoreSelect", "Select a DB backup first"), + "Stopping running workers": V("toast.dbRestoreStopping", "Stopping running workers"), + "Unlocking and resetting database": V("toast.dbRestoreResetting", "Unlocking and resetting database"), + "Recreating database": V("toast.dbRestoreReplacing", "Recreating database"), + "Replacing database files": V("toast.dbRestoreReplacing", "Replacing database files"), + "Restarting scan": V("toast.dbRestoreRescan", "Restarting scan"), + "Deleting database and rebuilding...": V("toast.dbDeleteTriggered", "Deleting database and rebuilding..."), + "Database deleted and rebuilt. Files are being reindexed.": V("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed."), + "Failed to delete database": V("toast.dbDeleteFailed", "Failed to delete database"), + "Database backup restored": V("toast.dbRestoreSuccess", "Database backup restored"), + "Index reset started. Files will be reindexed in the background.": V("toast.resetStarted", "Index reset started. Files will be reindexed in the background."), + "Failed to reset index": V("toast.resetFailed", "Failed to reset index"), + "Reset triggered: Reindexing all files...": V("toast.resetTriggered", "Reset triggered: Reindexing all files..."), + "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild.": V("toast.resetFailedCorrupt", "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild."), + "Scan started": V("toast.scanStarted", "Scan started"), + "Scan complete": V("toast.scanComplete", "Scan complete"), + "Scan failed": V("toast.scanFailed", "Scan failed"), + "Permission denied": V("toast.permissionDenied", "Permission denied"), + "Language changed. Reload the page for full effect.": V("toast.languageChanged", "Language changed. Reload the page for full effect."), + "Tag added": V("toast.tagAdded", "Tag added"), + "Tag removed": V("toast.tagRemoved", "Tag removed"), + "Rating saved": V("toast.ratingSaved", "Rating saved"), + "Failed to create collection": V("toast.failedCreateCollection", "Failed to create collection"), + "Failed to delete collection": V("toast.failedDeleteCollection", "Failed to delete collection") + }; + if (n[t]) return n[t]; + let r; + if (r = t.match(/Rating set to (\d+) star(?:s)?/i), r) return V("toast.ratingSetN", "Rating set to {n} stars", { n: Number(r[1]) }); + if (r = t.match(/Downloading (.+?)\.\.\./i), r) return V("toast.downloadingFile", "Downloading {filename}...", { filename: r[1] }); + if (r = t.match(/Playback ([0-9]+(?:\.[0-9]+)?)x/i), r) return V("toast.playbackRate", "Playback {rate}x", { rate: Number(r[1]).toFixed(2) }); + if (r = t.match(/Metadata refreshed(?:\s*(.*))?/i), r) return V("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: r[1] ? " (" + r[1] + ")" : "" }); + if (r = t.match(/Error renaming(?: file)?:\s*(.+)/i), r) return V("toast.errorRenaming", "Error renaming file: {error}", { error: r[1] }); + if (r = t.match(/Error deleting(?: files?| file)?:\s*(.+)/i), r) return V("toast.errorDeleting", "Error deleting file: {error}", { error: r[1] }); + if (r = t.match(/Tag merge failed:\s*(.+)/i), r) return V("toast.tagMergeFailed", "Tag merge failed: {error}", { error: r[1] }); + if (r = t.match(/Delete failed:\s*(.+)/i), r) return V("toast.deleteFailed", "Delete failed: {error}", { error: r[1] }); + if (r = t.match(/Analysis not started:\s*(.+)/i), r) return V("toast.analysisNotStarted", "Analysis not started: {error}", { error: r[1] }); + if (r = t.match(/(\d+)\s+files deleted successfully!/i), r) return V("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: Number(r[1]) }); + if (r = t.match(/(\d+)\s+files deleted,\s+(\d+)\s+failed\./i), r) return V("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { + success: Number(r[1]), + failed: Number(r[2]) + }); + if (r = t.match(/(\d+)\s+files?\s+deleted/i), r) return V("toast.filesDeletedShort", "{n} files deleted", { n: Number(r[1]) }); + if (r = t.match(/(\d+)\s+deleted,\s+(\d+)\s+failed/i), r) return V("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { + success: Number(r[1]), + failed: Number(r[2]) + }); + if (r = t.match(/^(.+?)\s+copied to clipboard!$/i), r) return V("toast.copiedToClipboardNamed", "{name} copied to clipboard!", { name: r[1] }); + if (r = t.match(/Folder created:\s*(.+)/i), r) return V("toast.folderCreated", "Folder created: {name}", { name: r[1] }); + if (r = t.match(/Failed to create folder:\s*(.+)/i), r) return V("toast.createFolderFailedDetail", "Failed to create folder: {error}", { error: r[1] }); + if (r = t.match(/Failed to rename folder:\s*(.+)/i), r) return V("toast.renameFolderFailedDetail", "Failed to rename folder: {error}", { error: r[1] }); + if (r = t.match(/Failed to move folder:\s*(.+)/i), r) return V("toast.moveFolderFailedDetail", "Failed to move folder: {error}", { error: r[1] }); + if (r = t.match(/Failed to delete folder:\s*(.+)/i), r) return V("toast.deleteFolderFailedDetail", "Failed to delete folder: {error}", { error: r[1] }); + if (r = t.match(/Error removing from collection:\s*(.+)/i), r) return V("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: r[1] }); + if (r = t.match(/^Failed to (.+)$/i), r) { + let e = r[1].toLowerCase(), t = { + "add folder": V("toast.failedAddFolder", "Failed to add custom folder"), + "remove folder": V("toast.failedRemoveFolder", "Failed to remove custom folder"), + "create collection": V("toast.failedCreateCollection", "Failed to create collection"), + "delete collection": V("toast.failedDeleteCollection", "Failed to delete collection") + }; + for (let [n, r] of Object.entries(t)) if (e.includes(n)) return r; + } + return t; +} +function or(e, t = "info", n, r) { + if (t = tr(t), e = ar(e), n ??= ir(t), !r?.noHistory) try { + Xn(nr(e, t, n, r), t, n ?? void 0); + } catch {} + let i = !(Number.isFinite(Number(n)) && Number(n) > 0); + try { + let a = dt(); + if (a && fr(a, e, t, i ? 0 : Number(n), r)) return; + } catch (e) { + console.debug("Majoor: extensionManager.toast failed", e); + } + console.warn("[Majoor Toast] Native toast API unavailable", { + type: t, + message: W(e), + duration: i ? 0 : n + }); +} +var sr = /* @__PURE__ */ new Set([ + "started", + "start", + "queued", + "pending", + "running", + "in_progress", + "progress", + "stopping_workers", + "resetting_db", + "restarting_scan", + "restoring", + "deleting" +]), cr = 2147483647, G = /* @__PURE__ */ new Map(); +function lr(e) { + if (e && typeof e == "object") { + let t = String(e.summary || "").trim(), n = String(e.detail || e.message || "").trim(); + return t ? { + title: t, + description: n + } : { + title: V("manager.title"), + description: n || W(e) + }; + } + return { + title: V("manager.title"), + description: W(e) + }; +} +function ur(e) { + return e?.history && typeof e.history == "object" ? e.history : {}; +} +function dr(e) { + let t = ur(e), n = String(t.actionLabel || "").trim(), r = String(t.actionUrl || "").trim(); + if (n && r && /^(https?:\/\/|\/(?!\/))/i.test(r)) return { + label: n, + onClick: () => { + try { + window.open(r, "_blank", "noopener,noreferrer"); + } catch (e) { + console.debug?.(e); + } + } + }; +} +function fr(e, t, n, r, i) { + let { title: a, description: o } = lr(t), s = ur(i), c = String(s.trackId || "").trim(), l = String(s.status || "").trim().toLowerCase(), u = !!c && sr.has(l), d = u ? "loading" : n, f = typeof e[d] == "function" ? e[d] : typeof e[n] == "function" ? e[n] : null; + if (f) { + let t = { closable: !0 }; + o && o !== a && (t.description = o), t.duration = r > 0 && !u ? r : cr; + let n = dr(i); + n && (t.action = n); + let s = c ? G.get(c) : void 0; + s != null && (t.id = s); + let l = f.call(e, a, t); + return c && (u && l != null ? G.set(c, l) : G.delete(c)), !0; + } + if (typeof e.add == "function") { + let t = { + severity: n === "warning" ? "warn" : n, + summary: a, + detail: o + }; + return r > 0 && (t.life = r), e.add(t), !0; + } + return !1; +} +function pr() { + let e = dt(); + for (let t of G.values()) try { + e?.dismiss?.(t); + } catch (e) { + console.debug?.(e); + } + G.clear(); +} +// ui/api/clientAuth.ts +var mr = 2e3, hr = 15e3, gr = 8e3, K = "token", _r = null, q = null, vr = null, yr = "", J = Re({ + ttlMs: mr, + maxSize: 1 +}); +function br() { + return String(yr || "").trim(); +} +function xr(e) { + return yr = String(e || "").trim(), !0; +} +function Sr() { + try { + let e = localStorage?.getItem?.(r), t = e ? JSON.parse(e) : {}, n = t && typeof t == "object" ? t : {}, i = n?.data && typeof n.data == "object" ? n.data : n; + i?.security && typeof i.security == "object" && String(i.security.apiToken || "").trim() && (i.security.apiToken = "", localStorage?.setItem?.(r, JSON.stringify(n))); + } catch (e) { + console.debug?.(e); + } +} +function Cr() { + try { + J.delete(K); + } catch (e) { + console.debug?.(e); + } + xr(""), Sr(); +} +function wr() { + let e = J.get(K); + if (e !== void 0) return e; + let t = Date.now(), n = br(); + if (n) return J.set(K, n, { at: t }), n; + try { + let e = localStorage?.getItem?.(r), n = e ? JSON.parse(e) : null, i = n?.data && typeof n.data == "object" ? n.data : n, a = String(i?.security?.apiToken || "").trim(); + if (a) { + xr(a); + try { + let e = n && typeof n == "object" ? n : {}, t = e?.data && typeof e.data == "object" ? e.data : e; + t?.security && typeof t.security == "object" && (t.security.apiToken = "", localStorage?.setItem?.(r, JSON.stringify(e)), window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } }))); + } catch (e) { + console.debug?.(e); + } + } + return J.set(K, a, { at: t }), a; + } catch { + return J.set(K, "", { at: t }), ""; + } +} +function Tr(e) { + let t = String(e || "").trim(); + if (!t) return !1; + try { + J.set(K, t), q = null, xr(t), Sr(); + try { + window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } })); + } catch (e) { + console.debug?.(e); + } + return !0; + } catch { + return !1; + } +} +var Er = /^[A-Za-z0-9._\-~+/]+=*$/; +function Dr(e) { + let t = String(e || "").trim(); + return t ? Er.test(t) ? Tr(t) : (console.debug?.("[MJR auth] Rejected malformed security token (invalid characters)"), !1) : !1; +} +function Or() { + return !!wr(); +} +function kr(e = {}) { + q = { + code: String(e?.code || "").trim().toUpperCase(), + error: String(e?.error || "").trim(), + status: Number(e?.status || 0) || 0, + at: Date.now() + }; +} +function Ar() { + let e = q; + if (!e) return null; + let t = Date.now() - (Number(e.at || 0) || 0); + return t < 0 || t > hr ? (q = null, null) : e; +} +function jr(e) { + let t = Ar(), n = String(e?.code || "").trim().toUpperCase(), r = String(e?.error || "").trim(), i = String(t?.code || "").trim().toUpperCase(), a = String(t?.error || "").trim().toLowerCase(), o = r.toLowerCase(); + return n === "FORBIDDEN" && (o.includes("api token over insecure transport") || o.includes("allow http token transport")) ? V("toast.writeAuthInsecureTransport", "Write access is blocked because the Majoor API token is being sent over plain HTTP from a remote machine. Use HTTPS, or enable Settings -> Security -> Allow HTTP Token Transport for a trusted LAN.") : i === "FORBIDDEN" && (a.includes("already configured") || a.includes("rotate-token")) ? V("toast.writeAuthConfiguredTokenRequired", "Write access requires the Majoor API token already configured on the server. Open Settings -> Security -> API Token and enter the matching token.") : i === "AUTH_REQUIRED" && (a.includes("sign in to comfyui") || a.includes("authenticated comfyui user")) ? V("toast.writeAuthSignInRequired", "Write access is blocked. Sign in to ComfyUI first, then retry so Majoor can bootstrap the remote session token automatically.") : i === "BOOTSTRAP_DISABLED" || i === "AUTH_REQUIRED" && a.includes("bootstrap") || n === "AUTH_REQUIRED" && o.includes("api token") ? V("toast.writeAuthBootstrapHelp", "Write access is blocked. Sign in to ComfyUI and retry so Majoor can bootstrap the remote session automatically, or set a Majoor API token in Settings -> Security.") : ""; +} +function Mr(e) { + let t = String(e || "").trim(); + if (!t) return; + let n = Date.now(), r = vr; + if (!(r && r.message === t && n - (Number(r.at || 0) || 0) < gr)) { + vr = { + message: t, + at: n + }; + try { + or({ + summary: V("toast.writeAuthTitle", "Majoor remote write access"), + detail: t + }, "warning", 6500, { noHistory: !0 }); + } catch (e) { + console.debug?.(e); + } + } +} +function Nr(e) { + let t = String(e?.code || "").trim().toUpperCase(), n = String(e?.error || "").trim().toLowerCase(), r = t === "FORBIDDEN" && n.includes("write operation blocked"); + if (t !== "AUTH_REQUIRED" && !r) return e; + let i = jr(e); + return i ? (Mr(i), { + ...e, + error: i + }) : e; +} +async function Pr() { + try { + let e = await fetch("/mjr/am/settings/security/bootstrap-token", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-Requested-With": "XMLHttpRequest" + }, + body: "{}" + }); + if (!(e.headers.get("content-type") || "").includes("application/json")) return kr({ + code: "INVALID_RESPONSE", + error: `Bootstrap token request returned non-JSON response (${e.status})`, + status: e.status + }), { + ok: !1, + token: !1 + }; + let t = await e.json().catch((e) => (console.debug?.("[MJR auth] JSON parse error:", e), null)); + if (!t || typeof t != "object") return kr({ + code: "INVALID_RESPONSE", + error: "Bootstrap token response was invalid.", + status: e.status + }), { + ok: !1, + token: !1 + }; + if (!t.ok) return kr({ + code: t?.code, + error: t?.error, + status: e.status + }), { + ok: !1, + token: !1 + }; + let n = String(t?.data?.token || "").trim(); + return n ? { + ok: Tr(n), + token: !0 + } : (q = null, { + ok: !0, + token: !1 + }); + } catch (e) { + return kr({ + code: "NETWORK_ERROR", + error: e?.message || "Bootstrap token request failed.", + status: 0 + }), { + ok: !1, + token: !1 + }; + } +} +async function Fr({ force: e = !1, allowCookieRefresh: t = !1 } = {}) { + let n = wr(); + if (n && !e) return n; + let r = { + ok: !1, + token: !1 + }; + _r ||= (async () => { + try { + return await Pr(); + } finally { + _r = null; + } + })(); + try { + r = await _r || r; + } catch (e) { + console.debug?.(e); + } + if (e && r?.ok && !r?.token && n) Cr(); + else if (e && !r?.ok) { + let e = Ar(), t = String(e?.code || "").trim().toUpperCase(); + t && ["NETWORK_ERROR", "INVALID_RESPONSE"].includes(t) || Cr(); + } + let i = wr(); + return !i && t && r?.ok ? !0 : i; +} +function Ir() { + J.clear(); +} +// ui/api/clientOps.ts +async function Lr(e) { + return !e || typeof e != "string" ? { + ok: !1, + error: "Missing mode", + code: "INVALID_INPUT" + } : $("/mjr/am/settings/probe-backend", { mode: e }); +} +async function Rr() { + return Q(v.SETTINGS_METADATA_FALLBACK); +} +async function zr({ image: e, media: t } = {}) { + return $(v.SETTINGS_METADATA_FALLBACK, { + image: e, + media: t + }); +} +async function Br() { + return Q(v.SETTINGS_VECTOR_SEARCH); +} +async function Vr(e = !0) { + if (e && typeof e == "object") { + let t = {}; + return "enabled" in e && (t.enabled = !!e.enabled), "caption_on_index" in e && (t.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (t.caption_on_index = !!e.captionOnIndex), "index_on_scan" in e && (t.index_on_scan = !!e.index_on_scan), "indexOnScan" in e && (t.index_on_scan = !!e.indexOnScan), "unload_after_use" in e && (t.unload_after_use = !!e.unload_after_use), "unloadAfterUse" in e && (t.unload_after_use = !!e.unloadAfterUse), "concurrency" in e && (t.concurrency = Number(e.concurrency) || 1), "vectorConcurrency" in e && (t.concurrency = Number(e.vectorConcurrency) || 1), $(v.SETTINGS_VECTOR_SEARCH, t); + } + return $(v.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); +} +async function Hr() { + return $(v.SETTINGS_VECTOR_SEARCH_UNLOAD, {}); +} +async function Ur() { + return Q(v.SETTINGS_EXECUTION_GROUPING); +} +async function Wr(e = !0) { + return $(v.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); +} +async function Gr(e = !0) { + return $(v.SETTINGS_BROWSER_SHOW_FOLDERS, { enabled: !!e }); +} +async function Kr() { + return Q(v.SETTINGS_HUGGINGFACE); +} +async function qr(e = "") { + return $(v.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); +} +async function Jr() { + return Q(v.SETTINGS_AI_LOGGING); +} +async function Yr(e = !1) { + return $(v.SETTINGS_AI_LOGGING, { enabled: !!e }); +} +async function Xr() { + return Q(v.SETTINGS_ROUTE_LOGGING); +} +async function Zr(e = !1) { + return $(v.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); +} +async function Qr() { + return Q(v.SETTINGS_STARTUP_LOGGING); +} +async function $r(e = !1) { + return $(v.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); +} +async function ei() { + return Q(v.SETTINGS_LTXAV_RGB_FALLBACK); +} +async function ti(e = !1) { + return $(v.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); +} +async function ni() { + return Q(v.SETTINGS_JXL); +} +async function ri(e = !1) { + return $(v.SETTINGS_JXL, { enabled: !!e }); +} +async function ii() { + return Q(v.SETTINGS_OUTPUT_DIRECTORY); +} +async function ai() { + return Q(v.SETTINGS_INPUT_DIRECTORY); +} +async function oi(e, t = {}) { + let n = String(e ?? "").trim(); + return $(v.SETTINGS_INPUT_DIRECTORY, { input_directory: n }, t); +} +async function si(e, t = {}) { + let n = String(e ?? "").trim(); + return $(v.SETTINGS_OUTPUT_DIRECTORY, { output_directory: n }, t); +} +async function ci() { + return Q(v.SETTINGS_INDEX_DIRECTORY); +} +async function li(e, t = {}) { + let n = String(e ?? "").trim(); + return $(v.SETTINGS_INDEX_DIRECTORY, { index_directory: n }, t); +} +async function ui(e = {}) { + return Q(v.SETTINGS_WORKFLOW_ROOTS, e); +} +async function di(e, t = {}) { + let n = Array.isArray(e) ? e.map((e) => String(e ?? "").trim()).filter(Boolean) : String(e ?? "").trim(); + return $(v.SETTINGS_WORKFLOW_ROOTS, { workflow_roots: n }, t); +} +async function fi() { + return Q("/mjr/am/settings/security"); +} +async function pi(e) { + return $("/mjr/am/settings/security", e && typeof e == "object" ? e : {}); +} +async function mi() { + let e = await $("/mjr/am/settings/security/bootstrap-token", {}); + if (e?.ok) try { + let t = String(e?.data?.token || "").trim(); + t && Tr(t); + } catch (e) { + console.debug?.(e); + } + return e; +} +async function hi(e) { + if (e && typeof e == "object") { + let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); + return t ? $("/mjr/am/open-in-folder", { filepath: t }) : $("/mjr/am/open-in-folder", { asset_id: d(e.id) }); + } + return $("/mjr/am/open-in-folder", { asset_id: d(e) }); +} +async function gi(e) { + let t = ""; + return t = e && typeof e == "object" ? String(e.filepath || e.path || e?.file_info?.filepath || "").trim() : String(e || "").trim(), t ? $(v.COLLECT_FILES, { filepath: t }) : { + ok: !1, + data: null, + error: "Missing file path", + code: "INVALID_INPUT" + }; +} +async function _i({ op: e = "", path: t = "", name: n = "", destination: r = "", recursive: i = !0 } = {}, a = {}) { + let o = { + op: String(e || "").trim().toLowerCase(), + path: String(t || "").trim() + }; + return n != null && String(n).trim() && (o.name = String(n).trim()), r != null && String(r).trim() && (o.destination = String(r).trim()), o.op === "delete" && (o.recursive = !!i), $(v.BROWSER_FOLDER_OP, o, a); +} +async function vi(e = {}) { + let t = (e, t) => e == null ? t : !!e, n = String(e.scope || "output").trim().toLowerCase() || "output", r = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, i = { + scope: n, + reindex: t(e.reindex, !0), + hard_reset_db: t(e.hardResetDb ?? e.hard_reset_db ?? e.deleteDbFiles ?? e.delete_db_files ?? e.deleteDb ?? e.delete_db ?? void 0, n === "all"), + clear_scan_journal: t(e.clearScanJournal ?? e.clear_scan_journal, !0), + clear_metadata_cache: t(e.clearMetadataCache ?? e.clear_metadata_cache, !0), + clear_asset_metadata: t(e.clearAssetMetadata ?? e.clear_asset_metadata, !0), + clear_assets: t(e.clearAssets ?? e.clear_assets, !0), + preserve_vectors: t(e.preserveVectors ?? e.preserve_vectors ?? e.keepVectors ?? e.keep_vectors, !1), + rebuild_fts: t(e.rebuildFts ?? e.rebuild_fts, !0), + incremental: t(e.incremental, !1), + fast: t(e.fast, !0), + background_metadata: t(e.backgroundMetadata ?? e.background_metadata, !0), + maintenance_force: t(e.maintenanceForce ?? e.maintenance_force, !1) + }; + return r && (i.custom_root_id = String(r)), $(v.INDEX_RESET, i); +} +async function yi({ scope: e = "output", customRootId: t = "" } = {}) { + let n = String(e || "output").trim().toLowerCase() || "output", r = String(t || "").trim(), i = { scope: n }; + return r && (i.custom_root_id = r), $(v.WATCHER_SCOPE, i); +} +async function bi(e = {}) { + return Q(v.WATCHER_STATUS, e); +} +async function xi(e = !0) { + return $(v.WATCHER_TOGGLE, { enabled: !!e }); +} +async function Si() { + return Q(v.WATCHER_SETTINGS); +} +async function Ci(e = {}) { + return $(v.WATCHER_SETTINGS, e); +} +async function wi(e = {}) { + return Q(v.TOOLS_STATUS, e); +} +async function Ti(e = {}) { + return Q(v.STATUS, e); +} +async function Ei() { + return $("/mjr/am/db/force-delete", {}); +} +async function Di(e = {}) { + return Q(v.DB_BACKUPS, e); +} +async function Oi() { + return $(v.DB_BACKUP_SAVE, {}); +} +async function ki({ name: e = "", useLatest: t = !1 } = {}) { + let n = {}; + return e && (n.name = String(e)), t && (n.use_latest = !0), $(v.DB_BACKUP_RESTORE, n); +} +async function Ai(e = 250) { + return $("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) }); +} +async function ji({ scope: e = "output", customRootId: t = "", maxGroups: n = 6, maxPairs: r = 10 } = {}, i = {}) { + let a = `/mjr/am/duplicates/alerts?scope=${encodeURIComponent(String(e || "output"))}`; + return t && (a += `&custom_root_id=${encodeURIComponent(String(t))}`), a += `&max_groups=${encodeURIComponent(String(Math.max(1, Number(n) || 6)))}`, a += `&max_pairs=${encodeURIComponent(String(Math.max(1, Number(r) || 10)))}`, Q(a, i); +} +async function Mi(e, t = []) { + return $("/mjr/am/duplicates/merge-tags", { + keep_asset_id: Number(e) || 0, + merge_asset_ids: Array.isArray(t) ? t.map((e) => Number(e) || 0).filter((e) => e > 0) : [] + }); +} +async function Ni(e) { + let t, n; + if (e && typeof e == "object") { + t = d(e.id); + let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); + n = t ? { asset_id: t } : { filepath: r }; + } else t = d(e), n = { asset_id: t }; + let r = await $("/mjr/am/asset/delete", n); + return r?.ok && t && Fi([t]), r; +} +async function Pi(e) { + let t = Array.isArray(e) ? e.map((e) => d(e)).filter(Boolean) : [], n = await $("/mjr/am/assets/delete", { ids: t }); + return n?.ok && Fi(t), n; +} +function Fi(e) { + try { + let t = (Array.isArray(e) ? e : [e]).map((e) => String(e || "").trim()).filter(Boolean); + if (!t.length) return; + window.dispatchEvent(new CustomEvent("mjr:assets-deleted", { detail: { ids: t } })); + } catch (e) { + console.debug?.(e); + } +} +async function Ii(e, t) { + let n; + if (e && typeof e == "object") { + n = d(e.id); + let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), i = n ? await $("/mjr/am/asset/rename", { + asset_id: n, + new_name: t + }) : await $("/mjr/am/asset/rename", { + filepath: r, + new_name: t + }); + if (i?.ok && n) try { + let e = await Ca(n); + e?.ok && e?.data && (i.data = { + ...i.data || {}, + asset: e.data + }); + } catch (e) { + console.debug?.(e); + } + return i; + } + n = d(e); + let r = await $("/mjr/am/asset/rename", { + asset_id: n, + new_name: t + }); + if (r?.ok && n) try { + let e = await Ca(n); + e?.ok && e?.data && (r.data = { + ...r.data || {}, + asset: e.data + }); + } catch (e) { + console.debug?.(e); + } + return r; +} +async function Li() { + let e = typeof AbortController < "u" ? new AbortController() : null, t = null; + try { + return e && (t = setTimeout(() => e.abort(), 1e4)), await Q("/mjr/am/collections", e ? { signal: e.signal } : {}); + } finally { + t && clearTimeout(t); + } +} +async function Ri(e) { + return $("/mjr/am/collections", { name: String(e || "").trim() }); +} +async function zi(e) { + let t = String(e || "").trim(); + return $(`/mjr/am/collections/${encodeURIComponent(t)}/delete`, {}); +} +async function Bi(e, t) { + let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; + return $(`/mjr/am/collections/${encodeURIComponent(n)}/add`, { assets: r }); +} +async function Vi(e, t) { + let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; + return $(`/mjr/am/collections/${encodeURIComponent(n)}/remove`, { filepaths: r }); +} +async function Hi(e) { + let t = String(e || "").trim(); + return Q(`/mjr/am/collections/${encodeURIComponent(t)}/assets`); +} +async function Ui(e, t = 20) { + let n = String(e || "").trim(); + if (!n) return { + ok: !1, + error: "Empty query" + }; + let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), s = `${v.VECTOR_SEARCH}?q=${encodeURIComponent(n)}&top_k=${i}`; + return a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`), s = y(s, { + subfolder: r?.subfolder ?? null, + kind: r?.kind ?? null, + hasWorkflow: r?.hasWorkflow ?? null, + minRating: r?.minRating ?? null, + minSizeMB: r?.minSizeMB ?? null, + maxSizeMB: r?.maxSizeMB ?? null, + minWidth: r?.minWidth ?? null, + minHeight: r?.minHeight ?? null, + maxWidth: r?.maxWidth ?? null, + maxHeight: r?.maxHeight ?? null, + workflowType: r?.workflowType ?? null, + workflowId: r?.workflowId ?? null, + dateRange: r?.dateRange ?? null, + dateExact: r?.dateExact ?? null + }), Q(s, { timeoutMs: 12e4 }); +} +async function Wi(e, t = 20) { + let n = String(e || "").trim(); + if (!n) return { + ok: !1, + error: "Missing asset ID" + }; + let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), s = `${v.VECTOR_SIMILAR}/${encodeURIComponent(n)}?top_k=${i}`; + return a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`), Q(s, { dedupeKey: `vec:${n}:${i}:${a}:${o}` }); +} +async function Gi(e) { + let t = String(e || "").trim(); + return t ? Q(`${v.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : { + ok: !1, + error: "Missing asset ID" + }; +} +async function Ki(e) { + let t = String(e || "").trim(); + return t ? $(`${v.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : { + ok: !1, + error: "Missing asset ID" + }; +} +async function qi() { + return Q(v.VECTOR_STATS); +} +async function Ji(e = 64, t = {}) { + let n = Math.max(1, Math.min(200, e)), r = typeof t?.onProgress == "function" ? t.onProgress : null, i = String(t?.scope || "").trim().toLowerCase(), a = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), o = `${v.VECTOR_BACKFILL}?batch_size=${n}&async=1`; + i && (o += `&scope=${encodeURIComponent(i)}`), a && (o += `&custom_root_id=${encodeURIComponent(a)}`); + let s = await $(o, {}, { timeoutMs: 3e4 }); + if (!s?.ok) return s; + let c = s?.data || {}, l = String(c?.status || "").toLowerCase(), u = String(c?.backfill_id || "").trim(); + try { + r?.(c); + } catch (e) { + console.debug?.(e); + } + if (!u || ![ + "queued", + "running", + "pending" + ].includes(l)) return s; + let d = Number(t?.pollIntervalMs), f = Number(t?.pollTimeoutMs), p = Number.isFinite(d) ? Math.max(500, Math.min(1e4, Math.floor(d))) : na, m = Number.isFinite(f) ? Math.max(1e4, Math.min(ia, Math.floor(f))) : ra, h = Date.now(), g = null; + for (; Date.now() - h < m;) { + await Ce(p); + let e = await Q(`${v.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(u)}`, { timeoutMs: 3e4 }); + if (!e?.ok) { + g = e; + continue; + } + let t = e?.data || {}, n = String(t?.status || "").toLowerCase(); + g = e; + try { + r?.(t); + } catch (e) { + console.debug?.(e); + } + if (n === "succeeded") return { + ok: !0, + data: t?.result || {}, + code: null, + status: 200 + }; + if (n === "failed") return { + ok: !1, + error: String(t?.error || "Vector backfill failed"), + code: String(t?.code || "DB_ERROR"), + data: t, + status: 500 + }; + } + let _ = await Q(`${v.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(u)}`, { timeoutMs: 3e4 }), y = _?.data || g?.data || {}, b = String(y?.status || "").toLowerCase(); + if (_?.ok && [ + "queued", + "running", + "pending" + ].includes(b)) { + try { + r?.(y); + } catch (e) { + console.debug?.(e); + } + return { + ok: !0, + code: "PENDING", + status: 202, + data: { + ...y, + pending: !0, + timed_out: !0, + poll_timeout_ms: m, + backfill_id: String(y?.backfill_id || u), + status: b || "running" + }, + meta: { pending: !0 } + }; + } + return _?.ok && b === "failed" ? { + ok: !1, + error: String(y?.error || "Vector backfill failed"), + code: String(y?.code || "DB_ERROR"), + data: y, + status: 500 + } : { + ok: !1, + error: `Vector backfill polling timed out after ${m}ms`, + code: "TIMEOUT", + data: y || null, + status: 408 + }; +} +async function Yi(e) { + let t = String(e || "").trim(); + return t ? $(`${v.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : { + ok: !1, + error: "Missing asset ID" + }; +} +async function Xi(e, { topK: t = 50, scope: n = "output", customRootId: r = "", subfolder: i = null, kind: a = null, hasWorkflow: o = null, minRating: s = null, minSizeMB: c = null, maxSizeMB: l = null, minWidth: u = null, minHeight: d = null, maxWidth: f = null, maxHeight: p = null, workflowType: m = null, workflowId: h = null, dateRange: g = null, dateExact: _ = null } = {}) { + let b = String(e || "").trim(); + if (!b) return { + ok: !1, + error: "Empty query" + }; + let x = `${v.HYBRID_SEARCH}?q=${encodeURIComponent(b)}&top_k=${Math.max(1, Math.min(200, t))}&scope=${encodeURIComponent(n)}`; + return r && (x += `&custom_root_id=${encodeURIComponent(r)}`), x = y(x, { + subfolder: i, + kind: a, + hasWorkflow: o, + minRating: s, + minSizeMB: c, + maxSizeMB: l, + minWidth: u, + minHeight: d, + maxWidth: f, + maxHeight: p, + workflowType: m, + workflowId: h, + dateRange: g, + dateExact: _ + }), Q(x, { timeoutMs: 12e4 }); +} +async function Zi(e = 8) { + return $(v.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); +} +// ui/api/client.ts +var Qi = 3e4, $i = "__MJR_API_CLIENT__", ea = 2e3, ta = 200, na = 1e3, ra = 18e5, ia = 432e5, Y = "settings", aa = "available-tags", X = Re({ + ttlMs: ea, + maxSize: 1 +}), Z = Re({ + ttlMs: ea, + maxSize: 1 +}), oa = Re({ + ttlMs: () => ua(), + maxSize: 1 +}), sa = /* @__PURE__ */ new Set([ + "1", + "true", + "yes", + "on" +]), ca = /* @__PURE__ */ new Set([ + "0", + "false", + "no", + "off" +]); +function la(e, t = !1) { + if (typeof e == "boolean") return e; + if (typeof e == "number") return e !== 0; + if (typeof e == "string") { + let t = e.trim().toLowerCase(); + if (sa.has(t)) return !0; + if (ca.has(t)) return !1; + } + return !!t; +} +function ua() { + try { + let e = localStorage?.getItem?.("mjrSettings") || "{}", t = JSON.parse(e), n = t?.cache?.tagsTTLms ?? t?.cache?.tagsTTL ?? t?.cache?.tags_ttl_ms ?? null, r = Number(n); + return Number.isFinite(r) ? Math.max(1e3, Math.min(6e5, Math.floor(r))) : Qi; + } catch { + return Qi; + } +} +function da() { + X.clear(); +} +function fa() { + Z.clear(); +} +function pa() { + oa.clear(); +} +function ma(e) { + return String(e ?? "").trim().toLowerCase() || ""; +} +function ha(e) { + let t = [], n = /* @__PURE__ */ new Set(); + for (let r of Array.isArray(e) ? e : []) { + let e = String(r ?? "").trim(); + if (!e) continue; + let i = ma(e); + i && !n.has(i) && (n.add(i), t.push(e)); + } + return t; +} +try { + let e = typeof window < "u" ? window : null; + e && !e[$i] && (e[$i] = { initialized: !0 }, e.addEventListener?.("storage", (e) => { + try { + e?.key === "mjrSettings" && (da(), fa(), pa(), Ir()); + } catch (e) { + console.debug?.(e); + } + }), e.addEventListener?.("mjr-settings-changed", () => { + da(), fa(), pa(), Ir(); + })); +} catch (e) { + console.debug?.(e); +} +var ga = () => { + let e = X.get(Y); + if (e !== void 0) return e; + let t = Date.now(); + try { + let e = localStorage?.getItem?.(r); + if (!e) return X.set(Y, !1, { at: t }), !1; + let n = !!JSON.parse(e)?.observability?.enabled; + return X.set(Y, n, { at: t }), n; + } catch { + return X.set(Y, !1, { at: t }), !1; + } +}, _a = () => { + let e = Z.get(Y); + if (e !== void 0) return e; + let t = Date.now(); + try { + let e = localStorage?.getItem?.(r); + if (!e) return Z.set(Y, !0, { at: t }), !0; + let n = JSON.parse(e)?.ratingTagsSync?.enabled, i = n == null || la(n, !0); + return Z.set(Y, i, { at: t }), i; + } catch { + return Z.set(Y, !0, { at: t }), !0; + } +}, va = Le({ + readObsEnabled: ga, + readAuthToken: wr, + ensureWriteAuthToken: Fr, + normalizeWriteAuthFailure: Nr +}), ya = va.fetchAPI; +async function Q(e, t = {}) { + return va.get(e, t); +} +async function $(e, t, n = {}) { + return va.post(e, t, n); +} +async function ba(e, t, n = {}) { + let r = _a(), i = e && typeof e == "object" ? e : null, a = d(i ? i.id : e), o = { rating: Math.max(0, Math.min(5, Number(t) || 0)) }; + return a ? o.asset_id = a : i && (o.filepath = i.filepath || i.path || i?.file_info?.filepath || "", o.type = i.type || "output", o.root_id = f(i)), ya("/mjr/am/asset/rating", { + ...n, + method: "POST", + headers: { + "Content-Type": "application/json", + ...r ? { "X-MJR-RTSYNC": "on" } : {} + }, + body: JSON.stringify(o) + }); +} +async function xa(e, t, n = {}) { + let r = _a(), i = e && typeof e == "object" ? e : null, a = d(i ? i.id : e), o = String(i?.kind || i?.type || "").trim().toLowerCase() === "workflow", s = String(i?.filepath || i?.path || i?.file_info?.filepath || "").trim(), c = { tags: Array.isArray(t) ? t : [] }; + o && s ? c.filepath = s : a ? c.asset_id = a : i && (c.filepath = i.filepath || i.path || i?.file_info?.filepath || "", c.type = i.type || "output", c.root_id = f(i)); + let l = await ya(o && s ? v.WORKFLOWS_TAGS : "/mjr/am/asset/tags", { + ...n, + method: "POST", + headers: { + "Content-Type": "application/json", + ...r ? { "X-MJR-RTSYNC": "on" } : {} + }, + body: JSON.stringify(c) + }); + return l?.ok && pa(), l; +} +async function Sa() { + let e = oa.get(aa); + if (Array.isArray(e)) return { + ok: !0, + data: e, + error: null, + code: "OK", + meta: { cached: !0 } + }; + let t = await Q("/mjr/am/tags"); + if (t?.ok && Array.isArray(t.data)) { + let e = ha(t.data); + return oa.set(aa, e), { + ...t, + data: e + }; + } + return t; +} +async function Ca(e, t = {}) { + let n = encodeURIComponent(d(e)); + return Q(`/mjr/am/asset/${n}`, { + ...t, + dedupeKey: t?.dedupeKey || `meta:${n}` + }); +} +async function wa(e, t = {}) { + let n = d(e); + if (!n) return { + ok: !1, + data: null, + error: "Missing assetId", + code: "INVALID_INPUT" + }; + let r = `/mjr/am/viewer/info?asset_id=${encodeURIComponent(n)}`; + t.refresh && (r += "&refresh=1"); + let { refresh: i, ...a } = t; + return Q(r, a); +} +async function Ta(e, t = {}) { + let n = Array.isArray(e) ? e : [], r = []; + for (let e of n) { + let t = Number(e); + if (Number.isFinite(t) && (r.push(Math.trunc(t)), r.length >= ta)) break; + } + return r.length ? $("/mjr/am/assets/batch", { asset_ids: r }, t) : { + ok: !0, + data: [], + error: null, + code: "OK" + }; +} +async function Ea(e, t = {}) { + let n = S(e); + return n ? Q(n, t) : { + ok: !1, + data: null, + error: "Missing workflow filepath", + code: "INVALID_INPUT" + }; +} +async function Da(e, t = {}) { + let n = ue(e); + return n ? Q(n, t) : { + ok: !1, + data: null, + error: "Missing workflow filepath", + code: "INVALID_INPUT" + }; +} +async function Oa(e, t = {}) { + let n = de(e); + return n ? Q(n, t) : { + ok: !1, + data: null, + error: "Missing workflow filepath", + code: "INVALID_INPUT" + }; +} +async function ka(e, t = "", n = {}) { + let r = fe(e, t); + return r ? Q(r, n) : { + ok: !1, + data: null, + error: "Missing workflow filepath", + code: "INVALID_INPUT" + }; +} +async function Aa({ workflow: e = null, name: t = "", category: n = "", overwrite: r = !1, filepath: i = "", task: a = "", model_family: o = "", provider: s = "", runs_on: c = "", notes: l = "" } = {}, u = {}) { + return $(v.WORKFLOWS_SAVE, { + workflow: e, + name: t, + category: n, + overwrite: r, + filepath: i, + task: a, + model_family: o, + provider: s, + runs_on: c, + notes: l + }, u); +} +async function ja({ filepath: e = "", name: t = "" } = {}, n = {}) { + return $(v.WORKFLOWS_DUPLICATE, { + filepath: e, + name: t + }, n); +} +async function Ma({ filepath: e = "", name: t = "", category: n = "" } = {}, r = {}) { + return $(v.WORKFLOWS_MOVE, { + filepath: e, + name: t, + category: n + }, r); +} +async function Na({ filepath: e = "" } = {}, t = {}) { + return $(v.WORKFLOWS_DELETE, { filepath: e }, t); +} +async function Pa({ filepath: e = "" } = {}, t = {}) { + return $(v.WORKFLOWS_MARK_LOADED, { filepath: e }, t); +} +async function Fa({ filepath: e = "", favorite: t = !1 } = {}, n = {}) { + return $(v.WORKFLOWS_FAVORITE, { + filepath: e, + favorite: !!t + }, n); +} +async function Ia({ filepath: e = "", task: t = "", model_family: n = "", provider: r = "", runs_on: i = "", notes: a = "" } = {}, o = {}) { + return $(v.WORKFLOWS_INFO, { + filepath: e, + task: t, + model_family: n, + provider: r, + runs_on: i, + notes: a + }, o); +} +async function La({ filepath: e = "", limit: t = 12 } = {}, n = {}) { + let r = Math.max(1, Math.min(50, Number(t) || 12)); + return Q(`${v.WORKFLOWS_THUMBNAIL_CANDIDATES}?filepath=${encodeURIComponent(String(e || "").trim())}&limit=${encodeURIComponent(String(r))}`, n); +} +async function Ra(e = {}) { + return Q(v.WORKFLOWS_MODEL_FAMILIES, e); +} +async function za({ q: e = "*", limit: t = 100, offset: n = 0, sort: r = "mtime" } = {}, i = {}) { + let a = Math.max(1, Math.min(500, Number(t) || 100)), o = Math.max(0, Number(n) || 0); + return Q(`${v.LIST}?scope=workflow&q=${encodeURIComponent(String(e || "*"))}&limit=${encodeURIComponent(String(a))}&offset=${encodeURIComponent(String(o))}&sort=${encodeURIComponent(String(r || "mtime"))}`, i); +} +async function Ba({ filepath: e = "", source_filepath: t = "" } = {}, n = {}) { + return $(v.WORKFLOWS_THUMBNAIL_SET, { + filepath: e, + source_filepath: t + }, n); +} +async function Va({ type: e = "output", filename: t = "", subfolder: n = "", root_id: r = "", rootId: i = "", filepath: a = "" } = {}, o = {}) { + let s = String(e || "output").trim().toLowerCase() || "output", c = String(t || "").trim(), l = String(n || "").trim(), u = String(r || i || "").trim(), d = String(a || "").trim(); + if (!c) return { + ok: !1, + data: null, + error: "Missing filename", + code: "INVALID_INPUT" + }; + let f = `/mjr/am/metadata?type=${encodeURIComponent(s)}&filename=${encodeURIComponent(c)}`; + return d && (f += `&filepath=${encodeURIComponent(d)}`), l && (f += `&subfolder=${encodeURIComponent(l)}`), u && (f += `&root_id=${encodeURIComponent(u)}`), Q(f, o); +} +async function Ha({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, r = {}) { + try { + if (globalThis.__mjrFolderInfoSupported === !1) return { + ok: !1, + data: null, + error: "Folder info endpoint unavailable", + code: "UNAVAILABLE" + }; + if (globalThis.__mjrFolderInfoSupported == null) { + let e = await Q("/mjr/am/routes"); + if (e?.ok && Array.isArray(e.data)) { + let t = e.data.some((e) => String(e?.path || "").trim() === "/mjr/am/folder-info"); + if (globalThis.__mjrFolderInfoSupported = !!t, !t) return { + ok: !1, + data: null, + error: "Folder info endpoint unavailable", + code: "UNAVAILABLE" + }; + } else globalThis.__mjrFolderInfoSupported = null; + } + } catch (e) { + console.debug?.(e); + } + let i = String(e || "").trim(), a = String(t || "").trim(), o = String(n || "").trim(), s = v.FOLDER_INFO, c = []; + i ? (c.push(`filepath=${encodeURIComponent(i)}`), c.push("browser_mode=1")) : (a && c.push(`root_id=${encodeURIComponent(a)}`), o && c.push(`subfolder=${encodeURIComponent(o)}`)), c.length && (s += `?${c.join("&")}`); + let l = await Q(s, r); + try { + !l?.ok && Number(l?.status || 0) === 404 && (globalThis.__mjrFolderInfoSupported = !1); + } catch (e) { + console.debug?.(e); + } + return l; +} +// ui/app/config.ts +var Ua = Object.freeze({ DEBUG_SAFE_CALL: !1, DEBUG_SAFE_LISTENERS: !1, DEBUG_VIEWER: !1, - VIEWER_ALLOW_PAN_AT_ZOOM_1: !1, - VIEWER_DISABLE_WEBGL_VIDEO: !1, - VIEWER_DISABLE_WEBGL_AUDIO: !1, - VIEWER_VIDEO_GRADE_THROTTLE_FPS: 12, - VIEWER_AUDIO_VISUALIZER_MODE: "artistic", - VIEWER_AUDIO_VIS_FPS: 18, - VIEWER_SCOPES_FPS: 8, GRID_MIN_SIZE: 150, FEED_GRID_MIN_SIZE: 120, GRID_GAP: 10, @@ -3224,8 +5131,6 @@ var Bt = (e) => { RT_HYDRATE_SEEN_MAX: 2e4, RT_HYDRATE_PRUNE_BUDGET: 250, RT_HYDRATE_SEEN_TTL_MS: 6e5, - VIEWER_META_TTL_MS: 3e4, - VIEWER_META_MAX_ENTRIES: 500, WORKFLOW_MINIMAP_ENABLED: !0, WATCHER_DEBOUNCE_MS: 3e3, WATCHER_DEDUPE_TTL_MS: 3e3, @@ -3239,43 +5144,5 @@ var Bt = (e) => { DELETE_CONFIRMATION: !0, DEBUG_VERBOSE_ERRORS: !1, SIDEBAR_ASSET_BADGE_ENABLED: !0 -}), qt = { ...Kt }, Jt = "mjr:asset-rating-changed", Yt = "mjr:asset-tags-changed", Xt = "mjr:viewer-info-refreshed", Zt = "mjr:viewer-active-asset-changed", Qt = Object.freeze({ - ASSET_RATING_CHANGED: Jt, - ASSET_TAGS_CHANGED: Yt, - VIEWER_INFO_REFRESHED: Xt, - VIEWER_ACTIVE_ASSET_CHANGED: Zt, - SCAN_COMPLETE: "mjr-scan-complete", - CORE_EXECUTION_ASSETS_READY: "mjr-core-execution-assets-ready", - ENRICHMENT_STATUS: "mjr-enrichment-status", - DB_RESTORE_STATUS: "mjr-db-restore-status", - ASSETS_DELETED: "mjr:assets-deleted", - SETTINGS_CHANGED: "mjr-settings-changed", - SELECTION_CHANGED: "mjr:selection-changed", - RELOAD_GRID: "mjr:reload-grid", - AGENDA_STATUS: "MJR:AgendaStatus", - VERSION_UPDATE_AVAILABLE: "mjr:version-update-available", - MFV_OPEN: "mjr:mfv-open", - MFV_CLOSE: "mjr:mfv-close", - MFV_TOGGLE: "mjr:mfv-toggle", - MFV_LIVE_TOGGLE: "mjr:mfv-live-toggle", - MFV_PREVIEW_TOGGLE: "mjr:mfv-preview-toggle", - MFV_POPOUT: "mjr:mfv-popout", - MFV_VISIBILITY_CHANGED: "mjr:mfv-visibility-changed", - MFV_NODESTREAM_TOGGLE: "mjr:mfv-nodestream-toggle", - NEW_GENERATION_OUTPUT: "mjr:new-generation-output", - NODE_STREAM_OUTPUT: "mjr:node-stream-output", - ASSET_ADDED: "mjr:asset-added", - ASSET_INDEXING: "mjr.asset.indexing", - ASSET_INDEXED: "mjr.asset.indexed", - ASSET_INDEX_FAILED: "mjr.asset.index_failed", - SCAN_PROGRESS: "mjr.scan.progress", - RUNTIME_STATUS: "mjr.runtime.status", - WATCHER_STATUS: "mjr.watcher.status", - STRUCTURED_EVENT: "mjr.event", - OPEN_ASSETS_MANAGER: "mjr:open-assets-manager", - OPEN_VIEWER: "mjr:open-viewer", - OPEN_STACK_GROUP: "mjr:open-stack-group", - OPEN_NODE_CONTEXT: "mjr:open-node-context", - OPEN_MESSAGE_HISTORY: "mjr:open-message-history" -}); -export { Ae as $, F as A, pt as B, mt as C, u as Ct, Pe as D, Ye as E, ut as F, dt as G, Be as H, Je as I, Ue as J, Ie as K, ft as L, rt as M, Fe as N, Xe as O, lt as P, fe as Q, at as R, We as S, l as St, bt as T, Ve as U, z as V, Le as W, A as X, qe as Y, pe as Z, Re as _, S as _t, Xt as a, ue as at, ht as b, o as bt, Ut as c, se as ct, Vt as d, ne as dt, ke as et, $ as f, y as ft, ze as g, le as gt, G as h, ce as ht, Zt as i, ee as it, He as j, Ne as k, Wt as l, b as lt, Gt as m, ie as mt, Yt as n, _ as nt, qt as o, x as ot, Ht as p, v as pt, Me as q, Qt as r, oe as rt, Kt as s, ae as st, Jt as t, g as tt, Bt as u, re as ut, ot as v, C as vt, it as w, ct as x, s as xt, yt as y, d as yt, Ke as z }; +}), Wa = { ...Ua }; +export { Br as $, se as $n, Fn as $t, _i as A, Ot as An, Ai as At, Ur as B, _t as Bn, qi as Bt, Ia as C, pt as Cn, Lr as Ct, Da as D, Xt as Dn, Vr as Dt, xa as E, kt as En, $r as Et, zi as F, ht as Fn, Wi as Ft, ei as G, ct as Gn, pr as Gt, ci as H, E as Hn, Or as Ht, Ei as I, vt as In, Yi as It, Xr as J, v as Jn, er as Jt, Rr as K, st as Kn, rr as Kt, Jr as L, Yt as Ln, Gi as Lt, Ri as M, M as Mn, Hr as Mt, Ni as N, xt as Nn, Ci as Nt, Bi as O, gt as On, yi as Ot, Pi as P, St as Pn, Ji as Pt, wi as Q, te as Qn, Pn as Qt, Hi as R, mt as Rn, Ki as Rt, Fa as S, zt as Sn, si as St, ba as T, Jt as Tn, pi as Tt, ai as U, Ge as Un, Dr as Ut, Kr as V, Tt as Vn, Zi as Vt, ni as W, We as Wn, or as Wt, fi as X, ne as Xn, Zn as Xt, Ti as Y, ce as Yn, Qn as Yt, Qr as Z, pe as Zn, $n as Zt, za as _, ft as _n, li as _t, ja as a, F as an, b as ar, Di as at, $ as b, wt as bn, ti as bt, Ta as c, Ht as cn, c as cr, Vi as ct, Ha as d, Wt as dn, f as dr, ki as dt, jn as en, le as er, Si as et, wa as f, Et as fn, i as fr, Oi as ft, Oa as g, jt as gn, qr as gt, La as h, an as hn, Wr as ht, ka as i, V as in, x as ir, Li as it, gi as j, Zt as jn, xi as jt, mi as k, Vt as kn, di as kt, Sa as l, rn as ln, l as lr, Ii as lt, Ra as m, Bt as mn, Gr as mt, Ua as n, B as nn, ae as nr, ui as nt, Q as o, bt as on, oe as or, Mi as ot, Ea as p, Qt as pn, r as pr, Yr as pt, ii as q, Re as qn, zn as qt, Na as r, Nn as rn, ie as rr, Xi as rt, Ca as s, yt as sn, p as sr, hi as st, Wa as t, Mn as tn, ee as tr, bi as tt, Va as u, $t as un, d as ur, vi as ut, Pa as v, Mt as vn, oi as vt, Ba as w, qt as wn, Zr as wt, Aa as x, Ct as xn, zr as xt, Ma as y, dt as yn, ri as yt, ji as z, ut as zn, Ui as zt }; diff --git a/dist/chunks/events-1iwo5blr.js b/dist/chunks/events-1iwo5blr.js new file mode 100644 index 00000000..8579e7dc --- /dev/null +++ b/dist/chunks/events-1iwo5blr.js @@ -0,0 +1,42 @@ +// ui/app/events.ts +var e = "mjr:asset-rating-changed", t = "mjr:asset-tags-changed", n = "mjr:viewer-info-refreshed", r = "mjr:viewer-active-asset-changed", i = Object.freeze({ + ASSET_RATING_CHANGED: e, + ASSET_TAGS_CHANGED: t, + VIEWER_INFO_REFRESHED: n, + VIEWER_ACTIVE_ASSET_CHANGED: r, + SCAN_COMPLETE: "mjr-scan-complete", + CORE_EXECUTION_ASSETS_READY: "mjr-core-execution-assets-ready", + ENRICHMENT_STATUS: "mjr-enrichment-status", + DB_RESTORE_STATUS: "mjr-db-restore-status", + ASSETS_DELETED: "mjr:assets-deleted", + ASSETS_REMOVED: "mjr-assets-removed", + SETTINGS_CHANGED: "mjr-settings-changed", + SELECTION_CHANGED: "mjr:selection-changed", + RELOAD_GRID: "mjr:reload-grid", + AGENDA_STATUS: "MJR:AgendaStatus", + VERSION_UPDATE_AVAILABLE: "mjr:version-update-available", + MFV_OPEN: "mjr:mfv-open", + MFV_CLOSE: "mjr:mfv-close", + MFV_TOGGLE: "mjr:mfv-toggle", + MFV_LIVE_TOGGLE: "mjr:mfv-live-toggle", + MFV_PREVIEW_TOGGLE: "mjr:mfv-preview-toggle", + MFV_POPOUT: "mjr:mfv-popout", + MFV_VISIBILITY_CHANGED: "mjr:mfv-visibility-changed", + MFV_NODESTREAM_TOGGLE: "mjr:mfv-nodestream-toggle", + NEW_GENERATION_OUTPUT: "mjr:new-generation-output", + NODE_STREAM_OUTPUT: "mjr:node-stream-output", + ASSET_ADDED: "mjr:asset-added", + ASSET_INDEXING: "mjr.asset.indexing", + ASSET_INDEXED: "mjr.asset.indexed", + ASSET_INDEX_FAILED: "mjr.asset.index_failed", + SCAN_PROGRESS: "mjr.scan.progress", + RUNTIME_STATUS: "mjr.runtime.status", + WATCHER_STATUS: "mjr.watcher.status", + STRUCTURED_EVENT: "mjr.event", + OPEN_ASSETS_MANAGER: "mjr:open-assets-manager", + OPEN_VIEWER: "mjr:open-viewer", + OPEN_STACK_GROUP: "mjr:open-stack-group", + OPEN_NODE_CONTEXT: "mjr:open-node-context", + OPEN_MESSAGE_HISTORY: "mjr:open-message-history" +}); +export { r as i, t as n, i as r, e as t }; diff --git a/dist/chunks/floatingViewerManager-B_I-SRbd.js b/dist/chunks/floatingViewerManager-B_I-SRbd.js new file mode 100644 index 00000000..ba08a638 --- /dev/null +++ b/dist/chunks/floatingViewerManager-B_I-SRbd.js @@ -0,0 +1,645 @@ +import { t as e } from "./rolldown-runtime-CGnMp29N.js"; +import { An as t, Wt as n, c as r, t as i } from "./config-C9a-wT5M.js"; +import { r as a } from "./events-1iwo5blr.js"; +// ui/utils/logging.ts +function o(e, ...t) { + try { + i.DEBUG_VERBOSE_ERRORS && console.debug(e, ...t); + } catch {} +} +function s(e, t = "Majoor", { showToast: r = !1, toastType: a = "error" } = {}) { + let o = e?.message || String(e || "Unknown error"); + try { + i.DEBUG_VERBOSE_ERRORS ? console.error(`[Majoor][${t}]`, o, e) : console.debug(`[Majoor][${t}]`, o); + } catch (e) { + console.debug?.(e); + } + if (r && i.DEBUG_VERBOSE_ERRORS) try { + n(`${t}: ${o}`, a, 4e3); + } catch (e) { + console.debug?.(e); + } +} +// ui/features/panel/panelRuntimeRefs.ts +var c = null; +function l(e) { + return e ? typeof e?.isConnected != "boolean" || e.isConnected : !1; +} +function u() { + try { + let e = document.getElementById("mjr-assets-grid") || document.querySelector(".mjr-grid"); + if (l(e)) return e; + } catch (e) { + console.debug?.(e); + } + return null; +} +function d(e) { + return c = e || null, c; +} +function f(e = null) { + e && c !== e || (c = null); +} +function p() { + return l(c) ? c : (c = null, u()); +} +// ui/features/grid/GridSelectionManager.ts +function m(e) { + let t = /* @__PURE__ */ new Set(); + if (!e) return t; + try { + let n = e.dataset?.mjrSelectedAssetIds; + if (n) { + let e = JSON.parse(n); + if (Array.isArray(e)) for (let n of e) n != null && t.add(String(n)); + return t; + } + } catch (e) { + console.warn("[MJR] selection state parse error:", e); + } + try { + let n = e.dataset?.mjrSelectedAssetId; + n && t.add(String(n)); + } catch (e) { + console.debug?.(e); + } + return t; +} +function h(e, t, n = "") { + let r = Array.from(t || []), i = n ? String(n) : r[0] ? String(r[0]) : ""; + try { + r.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(r), i ? e.dataset.mjrSelectedAssetId = String(i) : delete e.dataset.mjrSelectedAssetId) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); + } catch (e) { + console.debug?.(e); + } + return r; +} +function g(e, t, n) { + if (!e) return; + let r = t instanceof Set ? t : new Set(Array.from(t || []).map(String)); + try { + let t = typeof n == "function" ? n(e) : []; + for (let e of t) { + let t = e?.dataset?.mjrAssetId; + t && r.has(String(t)) ? (e.classList.add("is-selected"), e.setAttribute("aria-selected", "true")) : (e.classList.remove("is-selected"), e.setAttribute("aria-selected", "false")); + } + } catch (e) { + console.debug?.(e); + } +} +function _(e, t, { activeId: n = "" } = {}, r) { + if (!e) return []; + let i = new Set(Array.from(t || []).map(String).filter(Boolean)), a = h(e, i, n); + g(e, i, r); + let o = { + selectedIds: a, + activeId: n || a[0] || "" + }; + try { + e.dispatchEvent?.(new CustomEvent("mjr:selection-changed", { detail: o })); + } catch (e) { + console.debug?.(e); + } + try { + window.dispatchEvent(new CustomEvent("mjr:selection-changed", { detail: o })); + } catch (e) { + console.debug?.(e); + } + return a; +} +// ui/features/panel/controllers/hotkeysState.ts +var v = { + suspended: !1, + scope: null, + ratingHotkeysActive: !1 +}; +function ee() { + return v; +} +function te(e) { + v.scope = e == null ? null : String(e); +} +function ne() { + return !!v.suspended; +} +function re(e) { + v.ratingHotkeysActive = !!e; +} +// ui/features/viewer/viewerRuntimeHosts.ts +var y = null, ie = ".mjr-mfv"; +function ae(e) { + return !!e && typeof e.appendChild == "function"; +} +function b() { + return typeof document > "u" ? null : document?.body || null; +} +function oe() { + return typeof document > "u" ? null : document?.body || document?.documentElement || null; +} +function se(e) { + return ae(e) ? e === b() || typeof e?.isConnected != "boolean" || e.isConnected : !1; +} +function ce(e) { + return ae(e) ? e : null; +} +function x(e) { + return se(e) ? e : b(); +} +function le(e) { + let t = oe(); + return se(t) ? t : x(e); +} +function ue(e, t, n = x) { + let r = [], i = /* @__PURE__ */ new Set(); + for (let a of [ + n(t), + b(), + t + ]) { + if (!a || i.has(a)) continue; + i.add(a); + let t = []; + try { + t = Array.from(a.querySelectorAll?.(e) || []); + } catch (e) { + console.debug?.(e); + } + for (let e of t) e && !r.includes(e) && r.push(e); + } + return r; +} +function de(e, t, n = x) { + let r = n(t); + if (!r) return; + let i = ue(e, t, n); + for (let e of i) if (e && e.parentNode !== r) try { + r.appendChild(e); + } catch (e) { + console.debug?.(e); + } +} +function fe(e) { + return y = ce(e), de(ie, y, le), () => pe(e); +} +function pe(e) { + e && y !== e || (y = null); +} +function me(e) { + let t = le(y); + try { + t?.appendChild?.(e); + } catch (e) { + console.debug?.(e); + } + return t; +} +// ui/features/viewer/floatingViewerManager.ts +var he = /* @__PURE__ */ e({ + floatingViewerManager: () => X, + installFloatingViewerGlobalHandlers: () => $, + removeFloatingViewerGlobalHandlers: () => He, + teardownFloatingViewerManager: () => Ue +}), S = null, ge = null; +async function _e() { + return S || (ge ||= import("./FloatingViewer--x61GAzy.js").then((e) => (S = e.FloatingViewer, S)), ge); +} +var C = null, ve = null; +async function ye() { + if (!C) return ve ||= import("./NodeStreamController-CIKDDXJT.js").then((e) => { + C = e.setNodeStreamActive; + }), ve; +} +var w = Object.freeze({ + SIMPLE: "simple", + AB: "ab", + SIDE: "side", + GRID: "grid", + GRAPH: "graph" +}); +function be(e) { + let t = String(e || "").trim().toLowerCase(); + return t === "sidebyside" ? w.SIDE : Object.values(w).includes(t) ? t : ""; +} +var T = null; +function E() { + return i.MFV_LIVE_DEFAULT !== !1; +} +function D() { + return i.MFV_PREVIEW_DEFAULT !== !1; +} +var O = E(), k = D(), A = !1, j = null, M = !1, N = null, P = 0; +function xe() { + O = E(), k = D(), T?.setLiveActive(O), T?.setPreviewActive(k); +} +async function F() { + if (!T) { + let e = await _e(); + T || (T = new e({ controller: { + close: () => X.close(), + toggle: () => X.toggle(), + toggleLive: () => X.toggleLive(), + togglePreview: () => X.togglePreview(), + toggleNodeStream: () => X.toggleNodeStream(), + popOut: () => X.popOut(), + onModeChanged: (e) => { + T?.isVisible && e !== w.SIMPLE && U(); + }, + handleForwardedKeydown: (e) => Q(e, { forwarded: !0 }) + } }), me(T.render())); + } + try { + let e = T?.element || null; + e?.isConnected === !1 && me(e); + } catch (e) { + console.debug?.(e); + } + return T; +} +function I() { + try { + N?.abort(); + } catch (e) { + console.debug?.(e); + } + N = null; +} +function L() { + try { + let e = window.__MJR_LAST_SELECTION_GRID__; + if (e?.isConnected) return e; + } catch (e) { + console.debug?.(e); + } + return p(); +} +function Se() { + if (T) { + try { + T.dispose?.(); + } catch (e) { + console.debug?.(e); + } + T = null; + } +} +function R(e) { + typeof window < "u" && window.dispatchEvent(new CustomEvent(a.MFV_VISIBILITY_CHANGED, { detail: { visible: !!e } })); +} +function z(e) { + e && (e.setLiveActive(O), e.setPreviewActive(k), e.setNodeStreamActive?.(A)); +} +function B(e) { + e?.setNodeStreamSelection && e.setNodeStreamSelection(j || null); +} +function V(e, t) { + if (!e) return; + let n = e._mode; + if (n !== w.AB && n !== w.SIDE && n !== w.GRID) { + e.loadMediaA(t, { autoMode: !0 }); + return; + } + let r = e.getPinnedSlots(); + if (n === w.GRID) { + let n = [ + "A", + "B", + "C", + "D" + ].find((e) => !r.has(e)); + if (!n) return; + let i = { + A: e._mediaA, + B: e._mediaB, + C: e._mediaC, + D: e._mediaD + }; + i[n] = t, e.loadMediaQuad(i.A, i.B, i.C, i.D); + return; + } + let i = r.has("A"), a = r.has("B"); + i && a || (a ? e.loadMediaPair(t, e._mediaB) : e.loadMediaPair(e._mediaA, t)); +} +function Ce(e) { + try { + let t = L(); + if (!t) return null; + let n = Array.from(t.querySelectorAll("[data-mjr-asset-id]")), r = n.findIndex((t) => t.dataset.mjrAssetId === String(e)); + if (r < 0) return null; + let i = (n[r + 1] ?? n[r - 1] ?? null)?.dataset?.mjrAssetId ?? null; + return i && i !== String(e) ? i : null; + } catch (e) { + return console.debug?.("[MFV] _findAdjacentGridId error", e), null; + } +} +async function H(e, t = []) { + if (!e.length || !T) return; + I(); + let n = ++P, i = typeof AbortController < "u" ? new AbortController() : null; + N = i; + try { + let a = T.getPinnedSlots(), o = a.size > 0, s = T._mode, c = s === w.GRID, l = s === w.AB || s === w.SIDE, u = c ? 4 : 2, d = e.slice(0, u); + if (o && (l || c)) { + let e = u - a.size; + d = d.slice(0, Math.max(1, e)); + } else if (d.length === 1 && l) { + let e = Ce(d[0]); + e && (d = [d[0], e]); + } + let f = L(), p = f?._mjrGetAssets?.() || f?._mjrGetSelectedAssets?.() || [], m = new Map([...p, ...t].filter((e) => e && e.kind !== "folder").map((e) => [String(e.id), e])), h = d.filter((e) => Number.isSafeInteger(Number(e)) && Number(e) > 0), g = h.length ? await r(h, i ? { signal: i.signal } : {}) : { + ok: !0, + data: [] + }; + if (i?.signal.aborted || P !== n || !T) return; + let _ = new Map((g?.ok && Array.isArray(g.data) ? g.data : []).map((e) => [String(e.id), e])), v = d.map((e) => _.get(String(e)) || m.get(String(e))).filter(Boolean); + if (!v.length) return; + if (c) { + if (o) { + let e = { + A: T._mediaA, + B: T._mediaB, + C: T._mediaC, + D: T._mediaD + }, t = [ + "A", + "B", + "C", + "D" + ].filter((e) => !a.has(e)), n = 0; + for (let r of t) n < v.length && (e[r] = v[n++]); + T.loadMediaQuad(e.A, e.B, e.C, e.D); + } else v.length >= 3 ? T.loadMediaQuad(v[0], v[1], v[2], v[3] || null) : v.length >= 2 ? T.loadMediaPair(v[0], v[1]) : T.loadMediaA(v[0], { autoMode: !0 }); + return; + } + if (a.has("A") && a.has("B") && T._mediaA && T._mediaB) return; + a.has("A") && T._mediaA ? T.loadMediaPair(T._mediaA, v[0]) : a.has("B") && T._mediaB ? T.loadMediaPair(v[0], T._mediaB) : d.length >= 2 && v.length >= 2 ? T.loadMediaPair(v[0], v[1]) : T.loadMediaA(v[0], { autoMode: !0 }); + } catch (e) { + e?.name !== "AbortError" && s(e, "floatingViewerManager._loadFromIds"); + } finally { + N === i && (N = null); + } +} +function U() { + try { + let e = L(); + if (!e) return; + let t = m(e); + if (!t.size) return; + H(Array.from(t)); + } catch (e) { + console.debug?.("[MFV] Error reading current grid selection", e); + } +} +function we(e) { + if (!T?.isVisible || T._mode === w.GRAPH) return; + let t = Array.isArray(e?.detail?.selectedAssets) ? e.detail.selectedAssets : [], n = new Set(t.filter((e) => String(e?.kind || "").toLowerCase() === "folder").map((e) => String(e?.id || "")).filter(Boolean)), r = Array.isArray(e?.detail?.selectedIds) ? e.detail.selectedIds.map(String).filter((e) => !!e && !n.has(e)) : []; + if (r.length) H(r, t); + else try { + let e = L(); + if (!e) return; + let t = Array.from(m(e)).map(String).filter(Boolean); + if (!t.length) return; + H(t); + } catch (e) { + console.debug?.("[MFV] selection fallback failed", e); + } +} +function W() { + M || typeof window < "u" && (window.addEventListener(a.SELECTION_CHANGED, we), M = !0); +} +function Te() { + typeof window < "u" && window.removeEventListener(a.SELECTION_CHANGED, we), M = !1, I(); +} +var G = !1, K = null, q = null, J = ""; +function Ee() { + T?.isVisible && T.refreshSidebar?.(); +} +function De() { + Oe(); + let e = typeof window < "u" ? window : globalThis; + typeof e.requestAnimationFrame == "function" ? (J = "raf", q = e.requestAnimationFrame(() => { + q = null, J = "", Ee(); + })) : (J = "timeout", q = e.setTimeout(() => { + q = null, J = "", Ee(); + }, 16)); +} +function Oe() { + if (q == null) return; + let e = typeof window < "u" ? window : globalThis; + try { + J === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(q) : typeof e.clearTimeout == "function" && e.clearTimeout(q); + } catch (e) { + console.debug?.(e); + } + q = null, J = ""; +} +function Y() { + if (!G) try { + K = t(De, { includePointerFallback: !0 }), G = typeof K == "function"; + } catch (e) { + console.debug?.("[MFV] _bindNodeSelectionListener error", e); + } +} +function ke() { + if (G) { + Oe(); + try { + K?.(); + } catch (e) { + console.debug?.("[MFV] _unbindNodeSelectionListener error", e); + } + K = null, G = !1; + } +} +var X = { + isGraphModeVisible() { + return !!(T?.isVisible && T?._mode === w.GRAPH); + }, + async openAssets({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {}) { + let i = Array.isArray(e) ? e.filter(Boolean) : t ? [t] : []; + if (!i.length) return !1; + let a = await F(), o = !!a.isVisible, s = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), c = be(r); + c && a.setMode(c), a.show(), z(a), W(), Y(); + let l = a._mode; + return l === w.GRID && i.length >= 3 ? a.loadMediaQuad(i[0], i[1], i[2], i[3] || null) : (l === w.AB || l === w.SIDE) && i.length >= 2 ? a.loadMediaPair(i[0], i[1]) : a.loadMediaA(i[s], { autoMode: !1 }), o || R(!0), !0; + }, + async open() { + let e = await F(); + e.show(), z(e), W(), Y(), G || requestAnimationFrame(() => Y()), U(), A && B(e), R(!0); + }, + close() { + if (T) try { + T.isPopped && T.popIn(), T.hide(); + } catch (e) { + console.debug?.(e); + } + Te(), T?.setNodeStreamSelection?.(null), ke(), R(!1); + }, + async toggle() { + T?.isVisible ? X.close() : await X.open(); + }, + toggleLive() { + X.setLiveActive(!O); + }, + togglePreview() { + X.setPreviewActive(!k); + }, + async toggleCompareAB() { + let e = await F(); + if (!e.isVisible) { + e.setMode(w.AB), e.show(), z(e), W(), U(), R(!0); + return; + } + let t = { + [w.AB]: w.SIDE, + [w.SIDE]: w.SIMPLE, + [w.GRID]: w.SIMPLE, + [w.SIMPLE]: w.AB + }[e._mode] || w.AB; + e.setMode(t), t !== w.SIMPLE && U(); + }, + async upsertWithContent(e) { + let t = await F(), n = !!t.isVisible; + (n || i.MFV_LIVE_AUTO_OPEN !== !1) && (t.show(), z(t), W(), V(t, e), n || R(!0)); + }, + setLiveActive(e) { + O = !!e, T?.setLiveActive(O); + }, + getLiveActive() { + return O; + }, + async popOut() { + let e = await F(); + e.isPopped ? e.popIn() : (e.isVisible || await X.open(), e.popOut()); + }, + setPreviewActive(e) { + k = !!e, T?.setPreviewActive(k); + }, + getPreviewActive() { + return k; + }, + canAcceptPreviewBlob() { + return k ? T?.isVisible ? !0 : i.MFV_PREVIEW_AUTO_OPEN !== !1 : !1; + }, + async feedPreviewBlob(e, t = {}) { + if (!X.canAcceptPreviewBlob()) return; + let n = await F(), r = !!n.isVisible; + (r || i.MFV_PREVIEW_AUTO_OPEN !== !1) && (n.isVisible || n.show(), z(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), r || R(!0)); + }, + toggleNodeStream() { + X.setNodeStreamActive(!A); + }, + setNodeStreamActive(e) { + A = !!e, A || (j = null), ye().then(() => { + C && C(A); + }), T?.setNodeStreamActive?.(A), A ? T && B(T) : T?.setNodeStreamSelection?.(null); + }, + getNodeStreamActive() { + return A; + }, + setNodeStreamSelection(e, t, n) { + j = e == null || e === "" ? null : { + nodeId: e, + classType: t, + title: n + }; + let r = T; + r && B(r); + }, + async feedNodeStream(e) { + if (!A) return; + let t = await F(), n = !!t.isVisible; + (n || i.MFV_NODE_STREAM_AUTO_OPEN !== !1) && (t.isVisible || (t.show(), W()), z(t), B(t), V(t, e), n || R(!0)); + } +}, Z = !1, Ae = () => X.open(), je = () => X.close(), Me = () => X.toggle(), Ne = () => X.toggleLive(), Pe = () => X.togglePreview(), Fe = () => X.toggleNodeStream(), Ie = () => X.popOut(), Le = () => { + try { + T?.isPopped && T.popIn(); + } catch {} +}, Re = (e) => { + let t = String(e?.detail?.key || ""); + t && t !== "viewer" && t !== "viewer.mfvLiveDefault" && t !== "viewer.mfvPreviewDefault" || xe(); +}; +function ze(e) { + let t = String(e?.key || ""); + return t === " " || t === "Spacebar" || t === "ArrowLeft" || t === "ArrowRight"; +} +function Be(e) { + if (!T?.isVisible || !ze(e)) return !1; + try { + let t = e?.target, n = T?.element || null, r = !!n?.contains?.(t), i = (t?.closest?.(".mjr-mfv-simple-player") || (r || t == null ? n?.querySelector?.(".mjr-mfv-simple-player") : null))?._mjrSimplePlayerHandleKeydown; + if (typeof i == "function") return i(e), !!e?.defaultPrevented; + let a = (t?.closest?.(".mjr-mfv-player-host") || (r || t == null ? n?.querySelector?.(".mjr-mfv-player-host") : null))?._mjrMediaControlsHandle; + if (a && typeof a == "object") { + let t = String(e?.key || ""), n = () => { + e.preventDefault?.(), e.stopPropagation?.(), e.stopImmediatePropagation?.(); + }; + if ((t === " " || t === "Spacebar") && typeof a.togglePlay == "function") return a.togglePlay(), n(), !0; + if (t === "ArrowLeft" && typeof a.stepFrames == "function") return a.stepFrames(-1), n(), !0; + if (t === "ArrowRight" && typeof a.stepFrames == "function") return a.stepFrames(1), n(), !0; + } + return !1; + } catch (e) { + return console.debug?.(e), !1; + } +} +function Ve(e, t) { + if (t) return !0; + let n = T?.element; + if (!n) return !1; + try { + if (e?.target && n.contains?.(e.target)) return !0; + let t = typeof document < "u" ? document.activeElement : null; + return t && t !== document.body && n.contains?.(t) ? !0 : !!n.matches?.(":hover"); + } catch { + return !1; + } +} +var Q = (e, { forwarded: t = !1 } = {}) => { + if (!T?.isVisible || ne() || ee().scope === "viewer") return; + let n = e?.key?.toLowerCase?.() || "", r = e?.target?.isContentEditable || e?.target?.closest?.("input, textarea, select, [contenteditable='true']"); + if (r && Be(e) || r || Be(e)) return; + let i = () => { + e.preventDefault?.(), e.stopPropagation?.(), e.stopImmediatePropagation?.(); + }; + if (!e?.ctrlKey && !e?.metaKey && !e?.altKey && !e?.shiftKey) { + if (!Ve(e, t)) return; + if (n === "v") { + i(), X.toggle(); + return; + } + if (n === "k") { + i(), X.togglePreview(); + return; + } + if (n === "l") { + i(), X.toggleLive(); + return; + } + if (n === "n") { + i(), X.toggleNodeStream(); + return; + } + n === "c" && (i(), X.toggleCompareAB()); + } +}; +function $() { + Z || typeof window < "u" && window?.addEventListener && (window.addEventListener(a.MFV_OPEN, Ae), window.addEventListener(a.MFV_CLOSE, je), window.addEventListener(a.MFV_TOGGLE, Me), window.addEventListener(a.MFV_LIVE_TOGGLE, Ne), window.addEventListener(a.MFV_PREVIEW_TOGGLE, Pe), window.addEventListener(a.MFV_NODESTREAM_TOGGLE, Fe), window.addEventListener(a.MFV_POPOUT, Ie), window.addEventListener(a.SETTINGS_CHANGED, Re), window.addEventListener("keydown", Q, !0), window.addEventListener("beforeunload", Le), Z = !0); +} +function He() { + typeof window > "u" || !window?.removeEventListener || (window.removeEventListener(a.MFV_OPEN, Ae), window.removeEventListener(a.MFV_CLOSE, je), window.removeEventListener(a.MFV_TOGGLE, Me), window.removeEventListener(a.MFV_LIVE_TOGGLE, Ne), window.removeEventListener(a.MFV_PREVIEW_TOGGLE, Pe), window.removeEventListener(a.MFV_NODESTREAM_TOGGLE, Fe), window.removeEventListener(a.MFV_POPOUT, Ie), window.removeEventListener(a.SETTINGS_CHANGED, Re), window.removeEventListener("keydown", Q, !0), window.removeEventListener("beforeunload", Le)), Z = !1; +} +function Ue({ reinstallGlobalHandlers: e = !1 } = {}) { + let t = !!T?.isVisible; + try { + T?.isPopped && T.popIn(); + } catch (e) { + console.debug?.(e); + } + He(), Te(), ke(), I(), P += 1, O = E(), k = D(), A = !1; + try { + C && C(!1); + } catch (e) { + console.debug?.(e); + } + Se(), t && R(!1), e && $(); +} +export { s as _, fe as a, te as c, h as d, _ as f, o as g, d as h, Ue as i, re as l, p as m, he as n, ee as o, f as p, $ as r, ne as s, X as t, m as u }; diff --git a/dist/chunks/floatingViewerManager-BzaQii21.js b/dist/chunks/floatingViewerManager-BzaQii21.js deleted file mode 100644 index fa12e011..00000000 --- a/dist/chunks/floatingViewerManager-BzaQii21.js +++ /dev/null @@ -1,527 +0,0 @@ -import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-n0pKLECw.js"; -import { o, r as s, z as c } from "./events-C65wdOHm.js"; -// ui/features/panel/panelRuntimeRefs.ts -var l = null; -function u(e) { - return e ? typeof e?.isConnected != "boolean" || e.isConnected : !1; -} -function d() { - try { - let e = document.getElementById("mjr-assets-grid") || document.querySelector(".mjr-grid"); - if (u(e)) return e; - } catch (e) { - console.debug?.(e); - } - return null; -} -function f(e) { - return l = e || null, l; -} -function p(e = null) { - e && l !== e || (l = null); -} -function m() { - return u(l) ? l : (l = null, d()); -} -// ui/features/grid/GridSelectionManager.ts -function h(e) { - let t = /* @__PURE__ */ new Set(); - if (!e) return t; - try { - let n = e.dataset?.mjrSelectedAssetIds; - if (n) { - let e = JSON.parse(n); - if (Array.isArray(e)) for (let n of e) n != null && t.add(String(n)); - return t; - } - } catch (e) { - console.warn("[MJR] selection state parse error:", e); - } - try { - let n = e.dataset?.mjrSelectedAssetId; - n && t.add(String(n)); - } catch (e) { - console.debug?.(e); - } - return t; -} -function g(e, t, n = "") { - let r = Array.from(t || []), i = n ? String(n) : r[0] ? String(r[0]) : ""; - try { - r.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(r), i ? e.dataset.mjrSelectedAssetId = String(i) : delete e.dataset.mjrSelectedAssetId) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); - } catch (e) { - console.debug?.(e); - } - return r; -} -function ee(e, t, n) { - if (!e) return; - let r = t instanceof Set ? t : new Set(Array.from(t || []).map(String)); - try { - let t = typeof n == "function" ? n(e) : []; - for (let e of t) { - let t = e?.dataset?.mjrAssetId; - t && r.has(String(t)) ? (e.classList.add("is-selected"), e.setAttribute("aria-selected", "true")) : (e.classList.remove("is-selected"), e.setAttribute("aria-selected", "false")); - } - } catch (e) { - console.debug?.(e); - } -} -function _(e, t, { activeId: n = "" } = {}, r) { - if (!e) return []; - let i = new Set(Array.from(t || []).map(String).filter(Boolean)), a = g(e, i, n); - ee(e, i, r); - let o = { - selectedIds: a, - activeId: n || a[0] || "" - }; - try { - e.dispatchEvent?.(new CustomEvent("mjr:selection-changed", { detail: o })); - } catch (e) { - console.debug?.(e); - } - try { - window.dispatchEvent(new CustomEvent("mjr:selection-changed", { detail: o })); - } catch (e) { - console.debug?.(e); - } - return a; -} -// ui/features/viewer/floatingViewerManager.ts -var te = /* @__PURE__ */ e({ - floatingViewerManager: () => Y, - installFloatingViewerGlobalHandlers: () => $, - removeFloatingViewerGlobalHandlers: () => Ce, - teardownFloatingViewerManager: () => we -}), v = null, y = null; -async function ne() { - return v || (y ||= import("./FloatingViewer-BiEeZ0CS.js").then((e) => (v = e.FloatingViewer, v)), y); -} -var b = null, re = null; -async function ie() { - if (!b) return re ||= import("./NodeStreamController-CIKDDXJT.js").then((e) => { - b = e.setNodeStreamActive; - }), re; -} -var x = Object.freeze({ - SIMPLE: "simple", - AB: "ab", - SIDE: "side", - GRID: "grid", - GRAPH: "graph" -}); -function ae(e) { - let t = String(e || "").trim().toLowerCase(); - return t === "sidebyside" ? x.SIDE : Object.values(x).includes(t) ? t : ""; -} -var S = null; -function C() { - return o.MFV_LIVE_DEFAULT !== !1; -} -function w() { - return o.MFV_PREVIEW_DEFAULT !== !1; -} -var T = C(), E = w(), D = !1, O = null, k = !1, A = null, j = 0; -function oe() { - T = C(), E = w(), S?.setLiveActive(T), S?.setPreviewActive(E); -} -async function M() { - if (!S) { - let e = await ne(); - S || (S = new e({ controller: { - close: () => Y.close(), - toggle: () => Y.toggle(), - toggleLive: () => Y.toggleLive(), - togglePreview: () => Y.togglePreview(), - toggleNodeStream: () => Y.toggleNodeStream(), - popOut: () => Y.popOut(), - onModeChanged: (e) => { - S?.isVisible && e !== x.SIMPLE && z(); - }, - handleForwardedKeydown: (e) => Q(e) - } }), a(S.render())); - } - try { - let e = S?.element || null; - e?.isConnected === !1 && a(e); - } catch (e) { - console.debug?.(e); - } - return S; -} -function N() { - try { - A?.abort(); - } catch (e) { - console.debug?.(e); - } - A = null; -} -function P() { - try { - let e = window.__MJR_LAST_SELECTION_GRID__; - if (e?.isConnected) return e; - } catch (e) { - console.debug?.(e); - } - return m(); -} -function se() { - if (S) { - try { - S.dispose?.(); - } catch (e) { - console.debug?.(e); - } - S = null; - } -} -function F(e) { - typeof window < "u" && window.dispatchEvent(new CustomEvent(s.MFV_VISIBILITY_CHANGED, { detail: { visible: !!e } })); -} -function I(e) { - e && (e.setLiveActive(T), e.setPreviewActive(E), e.setNodeStreamActive?.(D)); -} -function L(e) { - e?.setNodeStreamSelection && e.setNodeStreamSelection(O || null); -} -function ce(e, t) { - if (!e) return; - let n = e._mode; - if (n !== x.AB && n !== x.SIDE && n !== x.GRID) { - e.loadMediaA(t, { autoMode: !0 }); - return; - } - let r = e.getPinnedSlots(); - if (n === x.GRID) { - let n = [ - "A", - "B", - "C", - "D" - ].find((e) => !r.has(e)); - if (!n) return; - let i = { - A: e._mediaA, - B: e._mediaB, - C: e._mediaC, - D: e._mediaD - }; - i[n] = t, e.loadMediaQuad(i.A, i.B, i.C, i.D); - return; - } - let i = r.has("A"), a = r.has("B"); - i && a || (a ? e.loadMediaPair(t, e._mediaB) : e.loadMediaPair(e._mediaA, t)); -} -function le(e) { - try { - let t = P(); - if (!t) return null; - let n = Array.from(t.querySelectorAll("[data-mjr-asset-id]")), r = n.findIndex((t) => t.dataset.mjrAssetId === String(e)); - if (r < 0) return null; - let i = (n[r + 1] ?? n[r - 1] ?? null)?.dataset?.mjrAssetId ?? null; - return i && i !== String(e) ? i : null; - } catch (e) { - return console.debug?.("[MFV] _findAdjacentGridId error", e), null; - } -} -async function R(e, r = []) { - if (!e.length || !S) return; - N(); - let i = ++j, a = typeof AbortController < "u" ? new AbortController() : null; - A = a; - try { - let n = S.getPinnedSlots(), o = n.size > 0, s = S._mode, c = s === x.GRID, l = s === x.AB || s === x.SIDE, u = c ? 4 : 2, d = e.slice(0, u); - if (o && (l || c)) { - let e = u - n.size; - d = d.slice(0, Math.max(1, e)); - } else if (d.length === 1 && l) { - let e = le(d[0]); - e && (d = [d[0], e]); - } - let f = P(), p = f?._mjrGetAssets?.() || f?._mjrGetSelectedAssets?.() || [], m = new Map([...p, ...r].filter((e) => e && e.kind !== "folder").map((e) => [String(e.id), e])), h = d.filter((e) => Number.isSafeInteger(Number(e)) && Number(e) > 0), g = h.length ? await t(h, a ? { signal: a.signal } : {}) : { - ok: !0, - data: [] - }; - if (a?.signal.aborted || j !== i || !S) return; - let ee = new Map((g?.ok && Array.isArray(g.data) ? g.data : []).map((e) => [String(e.id), e])), _ = d.map((e) => ee.get(String(e)) || m.get(String(e))).filter(Boolean); - if (!_.length) return; - if (c) { - if (o) { - let e = { - A: S._mediaA, - B: S._mediaB, - C: S._mediaC, - D: S._mediaD - }, t = [ - "A", - "B", - "C", - "D" - ].filter((e) => !n.has(e)), r = 0; - for (let n of t) r < _.length && (e[n] = _[r++]); - S.loadMediaQuad(e.A, e.B, e.C, e.D); - } else _.length >= 3 ? S.loadMediaQuad(_[0], _[1], _[2], _[3] || null) : _.length >= 2 ? S.loadMediaPair(_[0], _[1]) : S.loadMediaA(_[0], { autoMode: !0 }); - return; - } - if (n.has("A") && n.has("B") && S._mediaA && S._mediaB) return; - n.has("A") && S._mediaA ? S.loadMediaPair(S._mediaA, _[0]) : n.has("B") && S._mediaB ? S.loadMediaPair(_[0], S._mediaB) : d.length >= 2 && _.length >= 2 ? S.loadMediaPair(_[0], _[1]) : S.loadMediaA(_[0], { autoMode: !0 }); - } catch (e) { - e?.name !== "AbortError" && n(e, "floatingViewerManager._loadFromIds"); - } finally { - A === a && (A = null); - } -} -function z() { - try { - let e = P(); - if (!e) return; - let t = h(e); - if (!t.size) return; - R(Array.from(t)); - } catch (e) { - console.debug?.("[MFV] Error reading current grid selection", e); - } -} -function B(e) { - if (!S?.isVisible || S._mode === x.GRAPH) return; - let t = Array.isArray(e?.detail?.selectedAssets) ? e.detail.selectedAssets : [], n = new Set(t.filter((e) => String(e?.kind || "").toLowerCase() === "folder").map((e) => String(e?.id || "")).filter(Boolean)), r = Array.isArray(e?.detail?.selectedIds) ? e.detail.selectedIds.map(String).filter((e) => !!e && !n.has(e)) : []; - if (r.length) R(r, t); - else try { - let e = P(); - if (!e) return; - let t = Array.from(h(e)).map(String).filter(Boolean); - if (!t.length) return; - R(t); - } catch (e) { - console.debug?.("[MFV] selection fallback failed", e); - } -} -function V() { - k || typeof window < "u" && (window.addEventListener(s.SELECTION_CHANGED, B), k = !0); -} -function H() { - typeof window < "u" && window.removeEventListener(s.SELECTION_CHANGED, B), k = !1, N(); -} -var U = !1, W = null, G = null, K = ""; -function q() { - S?.isVisible && S.refreshSidebar?.(); -} -function ue() { - de(); - let e = typeof window < "u" ? window : globalThis; - typeof e.requestAnimationFrame == "function" ? (K = "raf", G = e.requestAnimationFrame(() => { - G = null, K = "", q(); - })) : (K = "timeout", G = e.setTimeout(() => { - G = null, K = "", q(); - }, 16)); -} -function de() { - if (G == null) return; - let e = typeof window < "u" ? window : globalThis; - try { - K === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(G) : typeof e.clearTimeout == "function" && e.clearTimeout(G); - } catch (e) { - console.debug?.(e); - } - G = null, K = ""; -} -function J() { - if (!U) try { - W = c(ue, { includePointerFallback: !0 }), U = typeof W == "function"; - } catch (e) { - console.debug?.("[MFV] _bindNodeSelectionListener error", e); - } -} -function fe() { - if (U) { - de(); - try { - W?.(); - } catch (e) { - console.debug?.("[MFV] _unbindNodeSelectionListener error", e); - } - W = null, U = !1; - } -} -var Y = { - isGraphModeVisible() { - return !!(S?.isVisible && S?._mode === x.GRAPH); - }, - async openAssets({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {}) { - let i = Array.isArray(e) ? e.filter(Boolean) : t ? [t] : []; - if (!i.length) return !1; - let a = await M(), o = !!a.isVisible, s = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), c = ae(r); - c && a.setMode(c), a.show(), I(a), V(), J(); - let l = a._mode; - return l === x.GRID && i.length >= 3 ? a.loadMediaQuad(i[0], i[1], i[2], i[3] || null) : (l === x.AB || l === x.SIDE) && i.length >= 2 ? a.loadMediaPair(i[0], i[1]) : a.loadMediaA(i[s], { autoMode: !1 }), o || F(!0), !0; - }, - async open() { - let e = await M(); - e.show(), I(e), V(), J(), U || requestAnimationFrame(() => J()), z(), D && L(e), F(!0); - }, - close() { - if (S) try { - S.isPopped && S.popIn(), S.hide(); - } catch (e) { - console.debug?.(e); - } - H(), S?.setNodeStreamSelection?.(null), fe(), F(!1); - }, - async toggle() { - S?.isVisible ? Y.close() : await Y.open(); - }, - toggleLive() { - Y.setLiveActive(!T); - }, - togglePreview() { - Y.setPreviewActive(!E); - }, - async toggleCompareAB() { - let e = await M(); - if (!e.isVisible) { - e.setMode(x.AB), e.show(), I(e), V(), z(), F(!0); - return; - } - let t = { - [x.AB]: x.SIDE, - [x.SIDE]: x.SIMPLE, - [x.GRID]: x.SIMPLE, - [x.SIMPLE]: x.AB - }[e._mode] || x.AB; - e.setMode(t), t !== x.SIMPLE && z(); - }, - async upsertWithContent(e) { - let t = await M(), n = !!t.isVisible; - (n || o.MFV_LIVE_AUTO_OPEN !== !1) && (t.show(), I(t), V(), ce(t, e), n || F(!0)); - }, - setLiveActive(e) { - T = !!e, S?.setLiveActive(T); - }, - getLiveActive() { - return T; - }, - async popOut() { - let e = await M(); - e.isPopped ? e.popIn() : (e.isVisible || await Y.open(), e.popOut()); - }, - setPreviewActive(e) { - E = !!e, S?.setPreviewActive(E); - }, - getPreviewActive() { - return E; - }, - canAcceptPreviewBlob() { - return E ? S?.isVisible ? !0 : o.MFV_PREVIEW_AUTO_OPEN !== !1 : !1; - }, - async feedPreviewBlob(e, t = {}) { - if (!Y.canAcceptPreviewBlob()) return; - let n = await M(), r = !!n.isVisible; - (r || o.MFV_PREVIEW_AUTO_OPEN !== !1) && (n.isVisible || n.show(), I(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), r || F(!0)); - }, - toggleNodeStream() { - Y.setNodeStreamActive(!D); - }, - setNodeStreamActive(e) { - D = !!e, D || (O = null), ie().then(() => { - b && b(D); - }), S?.setNodeStreamActive?.(D), D ? S && L(S) : S?.setNodeStreamSelection?.(null); - }, - getNodeStreamActive() { - return D; - }, - setNodeStreamSelection(e, t, n) { - O = e == null || e === "" ? null : { - nodeId: e, - classType: t, - title: n - }; - let r = S; - r && L(r); - }, - async feedNodeStream(e) { - if (!D) return; - let t = await M(), n = !!t.isVisible; - (n || o.MFV_NODE_STREAM_AUTO_OPEN !== !1) && (t.isVisible || (t.show(), V()), I(t), L(t), ce(t, e), n || F(!0)); - } -}, X = !1, pe = () => Y.open(), me = () => Y.close(), he = () => Y.toggle(), Z = () => Y.toggleLive(), ge = () => Y.togglePreview(), _e = () => Y.toggleNodeStream(), ve = () => Y.popOut(), ye = () => { - try { - S?.isPopped && S.popIn(); - } catch {} -}, be = (e) => { - let t = String(e?.detail?.key || ""); - t && t !== "viewer" && t !== "viewer.mfvLiveDefault" && t !== "viewer.mfvPreviewDefault" || oe(); -}; -function xe(e) { - let t = String(e?.key || ""); - return t === " " || t === "Spacebar" || t === "ArrowLeft" || t === "ArrowRight"; -} -function Se(e) { - if (!S?.isVisible || !xe(e)) return !1; - try { - let t = e?.target, n = S?.element || null, r = !!n?.contains?.(t), i = (t?.closest?.(".mjr-mfv-simple-player") || (r || t == null ? n?.querySelector?.(".mjr-mfv-simple-player") : null))?._mjrSimplePlayerHandleKeydown; - if (typeof i == "function") return i(e), !!e?.defaultPrevented; - let a = (t?.closest?.(".mjr-mfv-player-host") || (r || t == null ? n?.querySelector?.(".mjr-mfv-player-host") : null))?._mjrMediaControlsHandle; - if (a && typeof a == "object") { - let t = String(e?.key || ""), n = () => { - e.preventDefault?.(), e.stopPropagation?.(), e.stopImmediatePropagation?.(); - }; - if ((t === " " || t === "Spacebar") && typeof a.togglePlay == "function") return a.togglePlay(), n(), !0; - if (t === "ArrowLeft" && typeof a.stepFrames == "function") return a.stepFrames(-1), n(), !0; - if (t === "ArrowRight" && typeof a.stepFrames == "function") return a.stepFrames(1), n(), !0; - } - return !1; - } catch (e) { - return console.debug?.(e), !1; - } -} -var Q = (e) => { - if (!S?.isVisible || i() || r().scope === "viewer") return; - let t = e?.key?.toLowerCase?.() || "", n = e?.target?.isContentEditable || e?.target?.closest?.("input, textarea, select, [contenteditable='true']"); - if (n && Se(e) || n || Se(e)) return; - let a = () => { - e.preventDefault?.(), e.stopPropagation?.(), e.stopImmediatePropagation?.(); - }; - if (!e?.ctrlKey && !e?.metaKey && !e?.altKey && !e?.shiftKey) { - if (t === "v") { - a(), Y.toggle(); - return; - } - if (t === "k") { - a(), Y.togglePreview(); - return; - } - if (t === "l") { - a(), Y.toggleLive(); - return; - } - if (t === "n") { - a(), Y.toggleNodeStream(); - return; - } - t === "c" && (a(), Y.toggleCompareAB()); - } -}; -function $() { - X || typeof window < "u" && window?.addEventListener && (window.addEventListener(s.MFV_OPEN, pe), window.addEventListener(s.MFV_CLOSE, me), window.addEventListener(s.MFV_TOGGLE, he), window.addEventListener(s.MFV_LIVE_TOGGLE, Z), window.addEventListener(s.MFV_PREVIEW_TOGGLE, ge), window.addEventListener(s.MFV_NODESTREAM_TOGGLE, _e), window.addEventListener(s.MFV_POPOUT, ve), window.addEventListener(s.SETTINGS_CHANGED, be), window.addEventListener("keydown", Q, !0), window.addEventListener("beforeunload", ye), X = !0); -} -function Ce() { - typeof window > "u" || !window?.removeEventListener || (window.removeEventListener(s.MFV_OPEN, pe), window.removeEventListener(s.MFV_CLOSE, me), window.removeEventListener(s.MFV_TOGGLE, he), window.removeEventListener(s.MFV_LIVE_TOGGLE, Z), window.removeEventListener(s.MFV_PREVIEW_TOGGLE, ge), window.removeEventListener(s.MFV_NODESTREAM_TOGGLE, _e), window.removeEventListener(s.MFV_POPOUT, ve), window.removeEventListener(s.SETTINGS_CHANGED, be), window.removeEventListener("keydown", Q, !0), window.removeEventListener("beforeunload", ye)), X = !1; -} -function we({ reinstallGlobalHandlers: e = !1 } = {}) { - let t = !!S?.isVisible; - try { - S?.isPopped && S.popIn(); - } catch (e) { - console.debug?.(e); - } - Ce(), H(), fe(), N(), j += 1, T = C(), E = w(), D = !1; - try { - b && b(!1); - } catch (e) { - console.debug?.(e); - } - se(), t && F(!1), e && $(); -} -export { h as a, p as c, we as i, m as l, te as n, g as o, $ as r, _ as s, Y as t, f as u }; diff --git a/dist/chunks/frameExport-CnNO7oN6.js b/dist/chunks/frameExport-CnNO7oN6.js deleted file mode 100644 index cc4084db..00000000 --- a/dist/chunks/frameExport-CnNO7oN6.js +++ /dev/null @@ -1,106 +0,0 @@ -// ui/features/viewer/frameExport.ts -function e({ state: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i }) { - function a() { - try { - if (e?.mode === t.SINGLE) { - let e = n?.querySelector?.("canvas.mjr-viewer-media"); - return e instanceof HTMLCanvasElement ? e : null; - } - if (e?.mode === t.AB_COMPARE) { - let t = String(e?.abCompareMode || "wipe"); - if (t === "wipe" || t === "wipeV") { - let e = r?.querySelector?.("canvas.mjr-viewer-media[data-mjr-compare-role=\"A\"]"), n = r?.querySelector?.("canvas.mjr-viewer-media[data-mjr-compare-role=\"B\"]"); - if (e instanceof HTMLCanvasElement && n instanceof HTMLCanvasElement) return { - a: e, - b: n, - mode: t - }; - } - let n = r?.querySelector?.("canvas.mjr-viewer-media[data-mjr-compare-role=\"D\"]"); - if (n instanceof HTMLCanvasElement) return n; - let i = r?.querySelector?.("canvas.mjr-viewer-media"); - return i instanceof HTMLCanvasElement ? i : null; - } - if (e?.mode === t.SIDE_BY_SIDE) { - let e = i?.querySelector?.("canvas.mjr-viewer-media"); - return e instanceof HTMLCanvasElement ? e : null; - } - return null; - } catch { - return null; - } - } - let o = (e, t = "image/png", n = .92) => new Promise((r) => { - try { - if (e?.toBlob) { - e.toBlob((e) => r(e), t, n); - return; - } - } catch (e) { - console.debug?.(e); - } - try { - let i = e?.toDataURL?.(t, n); - if (!i || typeof i != "string") return r(null); - let a = i.split(",")[1] || "", o = atob(a), s = new Uint8Array(o.length); - for (let e = 0; e < o.length; e++) s[e] = o.charCodeAt(e); - r(new Blob([s], { type: t })); - } catch { - r(null); - } - }); - async function s({ toClipboard: t = !1 } = {}) { - try { - let n = a(); - if (!n) return !1; - await new Promise((e) => requestAnimationFrame(e)); - let r = null; - if (n instanceof HTMLCanvasElement) r = n; - else if (n?.a && n?.b) { - let t = n.a, i = n.b, a = Math.max(1, Math.min(Number(t.width) || 0, Number(i.width) || 0)), o = Math.max(1, Math.min(Number(t.height) || 0, Number(i.height) || 0)); - if (!(a > 1 && o > 1)) return !1; - let s = document.createElement("canvas"); - s.width = a, s.height = o; - let c = s.getContext("2d"); - if (!c) return !1; - try { - c.drawImage(i, 0, 0, a, o); - } catch (e) { - console.debug?.(e); - } - let l = Math.max(0, Math.min(100, Number(e?._abWipePercent) || 50)) / 100; - try { - c.save(), c.beginPath(), n.mode === "wipeV" ? c.rect(0, 0, a, o * l) : c.rect(0, 0, a * l, o), c.clip(), c.drawImage(t, 0, 0, a, o), c.restore(); - } catch (e) { - console.debug?.(e); - } - r = s; - } - if (!r) return !1; - let i = await o(r, "image/png"); - if (!i) return !1; - if (t) try { - let e = globalThis?.ClipboardItem, t = navigator?.clipboard; - return !e || !t?.write ? !1 : (await t.write([new e({ "image/png": i })]), !0); - } catch { - return !1; - } - try { - let t = e?.assets?.[e?.currentIndex] || null, n = `${String(t?.filename || "frame").replace(/[\\/:*?"<>|]+/g, "_").replace(/\.[^.]+$/, "") || "frame"}_export.png`, r = URL.createObjectURL(i), a = document.createElement("a"); - a.href = r, a.download = n, a.rel = "noopener", a.click(); - try { - setTimeout(() => URL.revokeObjectURL(r), 2e3); - } catch (e) { - console.debug?.(e); - } - return !0; - } catch { - return !1; - } - } catch { - return !1; - } - } - return { exportCurrentFrame: s }; -} -export { e as createFrameExporter }; diff --git a/dist/chunks/genInfo-DD23-sz2.js b/dist/chunks/genInfo-DD23-sz2.js deleted file mode 100644 index cb6b8fe6..00000000 --- a/dist/chunks/genInfo-DD23-sz2.js +++ /dev/null @@ -1,566 +0,0 @@ -import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, o as n } from "./events-C65wdOHm.js"; -import { h as r } from "./Viewer-W-G40j3K.js"; -import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-DrCNoS04.js"; -import { D as l, E as u, N as d, O as f, T as p, V as m, dt as h, ft as g, k as _, lt as v } from "./mjr-primevue-BRqtdXzb.js"; -// ui/vue/components/viewer/ViewerMetadataBlock.vue?vue&type=script&setup=true&lang.ts -var y = { style: { - display: "flex", - "flex-direction": "column", - gap: "10px", - "margin-bottom": "14px" -} }, b = { - key: 0, - style: { - "font-size": "12px", - "font-weight": "600", - "letter-spacing": "0.02em", - color: "rgba(255,255,255,0.86)" - } -}, x = { - key: 1, - style: { - padding: "10px 12px", - "border-radius": "10px", - border: "1px solid rgba(33,150,243,0.35)", - background: "rgba(33,150,243,0.08)", - color: "rgba(255,255,255,0.86)", - "white-space": "pre-wrap" - } -}, S = { style: { - "font-size": "12px", - "font-weight": "700", - "margin-bottom": "6px" -} }, C = { style: { - "font-size": "12px", - opacity: "0.88" -} }, w = { style: { - "font-size": "12px", - "font-weight": "700", - "margin-bottom": "6px" -} }, T = { style: { - "font-size": "12px", - opacity: "0.9" -} }, E = { - key: 6, - style: { - padding: "10px 12px", - "border-radius": "10px", - border: "1px solid rgba(255,255,255,0.12)", - background: "rgba(255,255,255,0.06)", - color: "rgba(255,255,255,0.72)" - } -}, D = { - key: 7, - style: { - border: "1px solid rgba(255,255,255,0.10)", - "border-radius": "10px", - background: "rgba(255,255,255,0.04)", - overflow: "hidden" - } -}, O = { style: { - cursor: "pointer", - padding: "10px 12px", - color: "rgba(255,255,255,0.78)", - "user-select": "none" -} }, k = { style: { - margin: "0", - padding: "10px 12px", - "max-height": "280px", - overflow: "auto", - "font-size": "11px", - "line-height": "1.35", - color: "rgba(255,255,255,0.86)" -} }, A = /* @__PURE__ */ d({ - __name: "ViewerMetadataBlock", - props: { - title: {}, - asset: {}, - loading: { type: Boolean }, - onRetry: { type: [Function, null] } - }, - setup(e) { - let r = e; - function c(e) { - try { - if (!e || typeof e != "object") return null; - let t = e?.metadata_raw; - return t && typeof t == "object" && t.geninfo_status && typeof t.geninfo_status == "object" ? t.geninfo_status : e?.geninfo_status && typeof e.geninfo_status == "object" ? e.geninfo_status : null; - } catch { - return null; - } - } - function d(e) { - let t = e?.metadata_raw ?? null; - if (!t) return null; - if (typeof t == "object") return t; - if (typeof t != "string") return null; - let n = t.trim(); - if (!n) return null; - try { - let e = JSON.parse(n); - return e && typeof e == "object" ? e : null; - } catch { - return null; - } - } - function A(e) { - try { - let t = Object.entries(e || {}); - if (!t.length) return !1; - let n = 0; - for (let [, e] of t.slice(0, 50)) if (e && typeof e == "object" && (e.inputs && typeof e.inputs == "object" && (n += 1), n >= 2)) return !0; - } catch { - return !1; - } - return !1; - } - function j(e) { - let t = d(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; - if (!n) return null; - if (typeof n == "object") return n; - if (typeof n != "string") return null; - let r = n.trim(); - if (!r) return null; - try { - return JSON.parse(r); - } catch { - return null; - } - } - function M(e) { - let t = d(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; - if (!n) return null; - if (typeof n == "object") return A(n) ? n : null; - if (typeof n != "string") return null; - let r = n.trim(); - if (!r) return null; - try { - let e = JSON.parse(r); - return A(e) ? e : null; - } catch { - return null; - } - } - function N(e) { - return !!(j(e) || M(e)); - } - function P(e) { - let t = e || {}, n = t.generation_time || t.file_creation_time || t.mtime || t.created_at; - return !!(t.width && t.height || t.duration && t.duration > 0 || n || t.size && t.size > 0 || t.size_bytes && t.size_bytes >= 0 || t.metadata_raw?.raw_ffprobe || t.id != null || t.job_id || t.file_info?.job_id || t.source_node_id || t.file_info?.source_node_id || t.source_node_type || t.file_info?.source_node_type || t.workflow_id || t.file_info?.workflow_id || t.user_metadata?.workflow?.id || t.metadata?.workflow_id); - } - function F(e) { - if (e == null) return ""; - let t = typeof e == "string" ? e : JSON.stringify(e, null, 2); - return t ? t.length > 4e4 ? `${t.slice(0, 4e4)}\n...(truncated)` : t : ""; - } - function I() { - typeof r.onRetry == "function" && r.onRetry(); - } - let L = p(() => c(r.asset)), R = p(() => o(r.asset)), z = p(() => R.value.kind !== "empty"), B = p(() => P(r.asset)), V = p(() => n.WORKFLOW_MINIMAP_ENABLED !== !1 && N(r.asset)), H = p(() => L.value && typeof L.value == "object" && L.value.kind === "fetch_error"), U = p(() => F(r.asset?.metadata_raw)), W = p(() => !r.loading && !H.value && !B.value && !z.value && !V.value), G = p(() => { - if (!H.value) return ""; - let e = String(L.value?.message || L.value?.error || "Failed to load generation data."), n = String(L.value?.code || L.value?.stage || "").trim(); - return n ? t("viewer.metadataErrorWithCode", "{message}\n\nCode: {code}\nClick to retry.", { - message: e, - code: n - }) : t("viewer.metadataErrorRetry", "{message}\n\nClick to retry.", { message: e }); - }); - return (e, n) => (m(), _("div", y, [ - r.title ? (m(), _("div", b, g(r.title), 1)) : f("", !0), - r.loading ? (m(), _("div", x, [u("div", S, g(v(t)("status.loading", "Loading")), 1), u("div", C, g(v(t)("viewer.loadingGenerationData", "Loading generation data...")), 1)])) : f("", !0), - H.value ? (m(), _("div", { - key: 2, - style: h([{ - padding: "10px 12px", - "border-radius": "10px", - border: "1px solid rgba(244,67,54,0.35)", - background: "rgba(244,67,54,0.08)", - color: "rgba(255,255,255,0.9)", - "white-space": "pre-wrap" - }, { cursor: r.onRetry ? "pointer" : "default" }]), - onClick: I - }, [u("div", w, g(v(t)("viewer.errorLoadingMetadata", "Error Loading Metadata")), 1), u("div", T, g(G.value), 1)], 4)) : f("", !0), - B.value ? (m(), l(i, { - key: 3, - asset: r.asset - }, null, 8, ["asset"])) : f("", !0), - z.value ? (m(), l(a, { - key: 4, - asset: r.asset - }, null, 8, ["asset"])) : f("", !0), - V.value ? (m(), l(s, { - key: 5, - asset: r.asset - }, null, 8, ["asset"])) : f("", !0), - W.value ? (m(), _("div", E, g(v(t)("viewer.noGenerationDataFile", "No generation data found for this file.")), 1)) : f("", !0), - U.value ? (m(), _("details", D, [u("summary", O, g(v(t)("msg.rawMetadata", "Raw metadata")), 1), u("pre", k, g(U.value), 1)])) : f("", !0) - ])); - } -}), j = /* @__PURE__ */ e({ - buildViewerMetadataBlocks: () => ee, - ensureViewerMetadataAsset: () => $ -}), M = (e, t = null) => { - let n = r(e); - return n === void 0 ? t : n; -}, N = n?.VIEWER_GENINFO_TTL_MS ?? 3e4, P = n?.VIEWER_GENINFO_ERROR_TTL_MS ?? 8e3, F = n?.VIEWER_GENINFO_MAX_ENTRIES ?? 300, I = /* @__PURE__ */ new Map(), L = /* @__PURE__ */ new Map(), R = /* @__PURE__ */ new Map(), z = (e, t, n) => { - try { - let r = Date.now(); - for (let [n, i] of e.entries()) i ? r - (i.at || 0) > t && e.delete(n) : e.delete(n); - if (e.size <= n) return; - let i = Array.from(e.entries()).sort((e, t) => (e?.[1]?.at || 0) - (t?.[1]?.at || 0)), a = e.size - n; - for (let t = 0; t < a; t++) { - let n = i[t]?.[0]; - n != null && e.delete(n); - } - } catch (e) { - console.debug?.(e); - } -}, B = (e, t, n) => { - try { - let r = e.get(t); - return r ? Date.now() - (r.at || 0) > n ? (e.delete(t), null) : r.data ?? null : null; - } catch { - return null; - } -}, V = (e, t, n, r, i) => { - try { - e.set(t, { - at: Date.now(), - data: n - }), z(e, r, i); - } catch (e) { - console.debug?.(e); - } -}, H = (e) => { - try { - let t = e?.id; - if (t != null) return `id:${t}`; - let n = J(e); - if (n) return `fp:${n}`; - let r = String(e?.filename || e?.name || "").trim(), i = String(e?.subfolder || "").trim(), a = String(e?.source || e?.type || "output").trim().toLowerCase(); - if (r) return `name:${a}:${i}:${r}`; - } catch (e) { - console.debug?.(e); - } - return null; -}, U = (e) => { - try { - if (!e || typeof e != "object") return null; - let t = e?.metadata_raw; - return t && typeof t == "object" && t.geninfo_status && typeof t.geninfo_status == "object" ? t.geninfo_status : e?.geninfo_status && typeof e.geninfo_status == "object" ? e.geninfo_status : null; - } catch { - return null; - } -}, W = (e, t) => { - try { - if (!e || typeof e != "object" || !t || typeof t != "object") return; - try { - e.geninfo_status = t; - } catch (e) { - console.debug?.(e); - } - try { - let n = e.metadata_raw; - if (n && typeof n == "object") { - n.geninfo_status = t, e.metadata_raw = n; - return; - } - if (typeof n == "string") return; - } catch (e) { - console.debug?.(e); - } - try { - e.metadata_raw = { geninfo_status: t }; - } catch (e) { - console.debug?.(e); - } - } catch (e) { - console.debug?.(e); - } -}, G = (e) => { - try { - if (!e || typeof e != "object") return !1; - if (e.geninfo && typeof e.geninfo == "object" && Object.keys(e.geninfo).length || e.prompt != null || e.workflow != null || e.metadata != null || e.exif != null) return !0; - let t = e.metadata_raw; - if (t && typeof t == "object") { - for (let e of [ - "geninfo", - "GenInfo", - "generation", - "prompt", - "Prompt", - "negative_prompt", - "workflow", - "Workflow", - "comfy_workflow", - "geninfo_status" - ]) if (t[e] != null) return !0; - return !1; - } - if (typeof t == "string") { - let e = t.trim(); - if (!e || e === "{}" || e === "null" || e === "[]" || e === "{{}}") return !1; - for (let t of [ - "Negative prompt:", - "\"prompt\"", - "\"negative_prompt\"", - "\"geninfo\"", - "\"workflow\"", - "\"comfy_workflow\"" - ]) if (e.includes(t)) return !0; - return !1; - } - return !1; - } catch { - return !1; - } -}, K = (e) => { - let t = typeof e == "string" ? e.trim() : ""; - if (!t || t.includes("\n")) return !1; - if (/^[A-Za-z]:[\\/]/.test(t)) return !0; - let n = t.replace(/\\/g, "/"); - return /(?:^|\/)[^/\n]+\.(?:png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg)$/i.test(n); -}, q = (e) => { - try { - if (!e || typeof e != "object") return !1; - if (e.geninfo && typeof e.geninfo == "object" && Object.keys(e.geninfo).length) return !0; - if (e.metadata_raw && typeof e.metadata_raw == "object") { - let t = e.metadata_raw; - if (t.geninfo || t.GenInfo || t.generation || t.parameters || typeof t.prompt == "string" && t.prompt.trim() && !K(t.prompt) || t.prompt && typeof t.prompt == "object") return !0; - let n = t.raw_ffprobe?.format?.tags || t.ffprobe?.format?.tags || null; - if (n && typeof n == "object") { - let e = n.prompt || n["comfyui:prompt"] || n.comfy_prompt; - if (e && !K(e)) return !0; - } - } - return !!(e.prompt && typeof e.prompt == "object" || typeof e.prompt == "string" && e.prompt.trim() && !K(e.prompt)); - } catch { - return !1; - } -}, J = (e) => { - let t = e?.filepath || e?.path || e?.file_info?.filepath || e?.file_info?.path || e?.filePath || null; - return typeof t == "string" && t.trim() || null; -}, Y = (e) => { - try { - if (String(e?.mime || e?.mimetype || e?.type || "").toLowerCase().startsWith("video/")) return !0; - let t = (J(e) || String(e?.filename || e?.name || "")).split(".").pop()?.toLowerCase?.() || ""; - return [ - "mp4", - "webm", - "mov", - "mkv", - "avi", - "m4v", - "gif" - ].includes(t); - } catch { - return !1; - } -}, X = (e) => { - if (!e) return null; - if (typeof e == "object") return e; - if (typeof e != "string") return null; - let t = e.trim(); - return t ? M(() => { - let e = JSON.parse(t); - return e && typeof e == "object" ? e : null; - }, null) : null; -}, Z = (e) => { - try { - if (!Y(e) || e?.geninfo || e?.prompt || e?.workflow || e?.metadata) return; - let t = X(e?.metadata_raw) || {}; - if (t.geninfo_status) return; - if (e?.geninfo_status) { - t.geninfo_status = e.geninfo_status, e.metadata_raw = t; - return; - } - t.geninfo_status = { kind: "media_pipeline" }, e.metadata_raw = t; - } catch (e) { - console.debug?.(e); - } -}, Q = (e, t) => { - let n = t && typeof t == "object" ? t : null; - if (!n) return e; - try { - e.prompt = e.prompt ?? n.prompt; - } catch (e) { - console.debug?.(e); - } - try { - e.workflow = e.workflow ?? n.workflow; - } catch (e) { - console.debug?.(e); - } - try { - e.geninfo = e.geninfo ?? n.geninfo; - } catch (e) { - console.debug?.(e); - } - try { - e.geninfo_status = e.geninfo_status ?? n.geninfo_status; - } catch (e) { - console.debug?.(e); - } - try { - e.exif = e.exif ?? n.exif; - } catch (e) { - console.debug?.(e); - } - try { - e.ffprobe = e.ffprobe ?? n.ffprobe; - } catch (e) { - console.debug?.(e); - } - try { - if (e.metadata_raw == null) e.metadata_raw = n; - else { - let t = X(e.metadata_raw); - if (t && typeof t == "object") { - for (let e of [ - "geninfo_status", - "workflow", - "prompt", - "geninfo" - ]) (t[e] == null && n[e] != null || e === "prompt" && K(t[e]) && n[e] != null) && (t[e] = n[e]); - n.raw_ffprobe && t.raw_ffprobe == null && (t.raw_ffprobe = n.raw_ffprobe), n.ffprobe && t.ffprobe == null && (t.ffprobe = n.ffprobe), e.metadata_raw = t; - } - } - } catch (e) { - console.debug?.(e); - } - return e; -}; -async function $(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCache: r, signal: i } = {}) { - if (!e || typeof e != "object") return e; - let a = e?.id ?? null, o = H(e), s = e, c = o ? B(I, o, N) : null; - if (c && typeof c == "object") return { - ...e, - ...c - }; - let l = o ? B(L, o, P) : null; - if (l) { - try { - W(s, l); - } catch (e) { - console.debug?.(e); - } - return s; - } - if (o && R.has(o)) try { - let e = R.get(o); - if (e && typeof e.then == "function") return await e; - } catch (e) { - console.debug?.(e); - } - let u = async () => { - let c = a == null ? null : M(() => r?.getCached?.(a)?.data || null, null); - c && typeof c == "object" && (s = { - ...e, - ...c - }); - let l = !!(s?.has_generation_data || s?.has_workflow || s?.has_generation || s?.has_generation_info), u = !!(s?.geninfo || s?.prompt || s?.workflow || s?.metadata), d = null; - if (a != null && (!q(s) || l && !u)) { - let e = await M(() => t?.(a, i ? { signal: i } : {}), null); - e?.ok && e.data && typeof e.data == "object" ? (s = { - ...s, - ...e.data - }, M(() => r?.setCached?.(a, e.data))) : e && e?.code !== "ABORTED" && (d = { - kind: "fetch_error", - stage: "asset", - code: e?.code || "FETCH_ERROR", - message: e?.error || "Failed to load asset metadata" - }); - } - if (!q(s)) try { - let e = String(s?.source || s?.type || "output").trim().toLowerCase() || "output", t = String(s?.filename || s?.name || s?.file_info?.filename || "").trim(), r = String(s?.subfolder || s?.file_info?.subfolder || "").trim(), a = String(s?.root_id || s?.rootId || s?.file_info?.root_id || "").trim(), o = String(s?.filepath || s?.path || s?.file_info?.filepath || "").trim(); - if (t) { - let c = await M(() => n?.({ - type: e, - filename: t, - subfolder: r, - root_id: a, - filepath: o - }, i ? { signal: i } : {}), null); - c?.ok && c.data ? s = Q({ ...s }, c.data) : c && c?.code !== "ABORTED" && (d = { - kind: "fetch_error", - stage: "file_scoped", - code: c?.code || "FETCH_ERROR", - message: c?.error || "Failed to extract file metadata" - }); - } - } catch (e) { - console.debug?.(e); - } - if (Z(s), !G(s) && d) { - let e = U(s); - e && e.kind === "media_pipeline" || W(s, d); - } - return q(s) && o ? V(I, o, s, N, F) : d && o && V(L, o, d, P, F), s; - }; - if (o) { - let e = () => { - try { - R.delete(o); - } catch (e) { - console.debug?.(e); - } - }; - try { - i?.addEventListener?.("abort", e, { once: !0 }); - } catch (e) { - console.debug?.(e); - } - let t = u().finally(() => { - try { - i?.removeEventListener?.("abort", e); - } catch (e) { - console.debug?.(e); - } - try { - R.delete(o); - } catch (e) { - console.debug?.(e); - } - }); - return R.set(o, t), await t; - } - return await u(); -} -function ee({ title: e, asset: t, ui: n } = {}) { - let r = document.createElement("div"); - try { - let { app: i } = c(A, { - title: e, - asset: t, - loading: !!n?.loading, - onRetry: typeof n?.onRetry == "function" ? n.onRetry : null - }); - return i.mount(r), r._mjrDispose = () => { - try { - i.unmount(); - } catch (e) { - console.debug?.(e); - } - }, r; - } catch (e) { - console.debug?.(e); - } - let i = document.createElement("div"); - if (i.style.cssText = "display:flex; flex-direction:column; gap:10px; margin-bottom: 14px;", e) { - let t = document.createElement("div"); - t.textContent = e, t.style.cssText = "font-size: 12px; font-weight: 600; letter-spacing: 0.02em; color: rgba(255,255,255,0.86);", i.appendChild(t); - } - let a = t?.metadata_raw; - if (a != null) { - let e = document.createElement("details"); - e.style.cssText = "border: 1px solid rgba(255,255,255,0.10); border-radius: 10px; background: rgba(255,255,255,0.04); overflow: hidden;"; - let t = document.createElement("summary"); - t.textContent = "Raw metadata", t.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; - let n = document.createElement("pre"); - n.style.cssText = "margin:0; padding: 10px 12px; max-height: 280px; overflow:auto; font-size: 11px; line-height: 1.35; color: rgba(255,255,255,0.86);"; - let r = typeof a == "string" ? a : JSON.stringify(a, null, 2); - r.length > 4e4 && (r = `${r.slice(0, 4e4)}\n...(truncated)`), n.textContent = r, e.appendChild(t), e.appendChild(n), i.appendChild(e); - } - return i; -} -export { j as n, $ as t }; diff --git a/dist/chunks/genInfo-Dk8cerKp.js b/dist/chunks/genInfo-Dk8cerKp.js new file mode 100644 index 00000000..2e6e4928 --- /dev/null +++ b/dist/chunks/genInfo-Dk8cerKp.js @@ -0,0 +1,2490 @@ +import { in as e, or as t, t as n } from "./config-C9a-wT5M.js"; +import { _ as r, f as i, p as a } from "./generationSectionState-DuXxSw-j.js"; +import { r as o } from "./events-1iwo5blr.js"; +import { $ as s, B as c, C as l, D as u, E as d, H as ee, J as te, M as f, O as p, P as m, Q as h, S as g, T as _, V as v, W as y, X as ne, b, gt as x, ht as S, j as C, k as w, mt as T, pt as E, q as re, st as D } from "./mjr-primevue-C07IsEdU.js"; +// ui/features/viewer/model3dCore.ts +function ie(e, t) { + if (e && typeof t == "function") try { + e.traverse?.((e) => { + (e?.isMesh || e?.isPoints || e?.isLine) && t(e); + }); + } catch (e) { + console.debug?.(e); + } +} +function ae(e) { + let t = !1; + try { + e.traverse?.((e) => { + !t && e?.isSkinnedMesh && (e.skeleton?.bones?.length ?? 0) > 0 && (t = !0); + }); + } catch (e) { + console.debug?.(e); + } + return t; +} +function oe(e) { + let t = /* @__PURE__ */ new Map(); + return ie(e, (e) => { + t.set(e.uuid, e.material); + }), t; +} +function O(e, t, n, r, i) { + ie(t, (t) => { + try { + if (n === "original") { + let e = r?.get(t.uuid); + e !== void 0 && (t.material = e); + } else if (n === "normal" && t.isMesh) { + let n = new e.MeshNormalMaterial({ side: e.DoubleSide }); + i?.add(n), t.material = n; + } else if (n === "depth" && t.isMesh) { + let n = new e.MeshDepthMaterial(); + i?.add(n), t.material = n; + } else if (n === "wireframe" && t.isMesh) { + let n = new e.MeshBasicMaterial({ + color: 9489145, + wireframe: !0 + }); + i?.add(n), t.material = n; + } else if (n === "pointcloud") { + let n = !!t.geometry?.getAttribute?.("color"), r = new e.PointsMaterial({ + size: .012, + sizeAttenuation: !0, + vertexColors: n, + color: n ? 16777215 : 9489145 + }); + i?.add(r), t.material = r; + } + } catch (e) { + console.debug?.(e); + } + }); +} +function se(e) { + if (e) { + for (let t of e) try { + t?.dispose?.(); + } catch (e) { + console.debug?.(e); + } + e.clear(); + } +} +function ce(e, t) { + try { + if (t === "gltf" || t === "fbx") return Array.isArray(e?.animations) ? e.animations : []; + } catch (e) { + console.debug?.(e); + } + return []; +} +function le(e, t) { + let n = new e.Box3().setFromObject(t); + if (n.isEmpty()) return null; + let r = n.getSize(new e.Vector3()), i = n.getCenter(new e.Vector3()), a = Math.max(r.x, r.y, r.z, .01); + return { + box: n, + size: r, + center: i, + maxDim: a, + radius: Math.max(a * .72, .5) + }; +} +function ue(e, t, n, r) { + if (!r || !t || !n) return; + let i = t.fov * (Math.PI / 180), a = r.maxDim / (2 * Math.tan(i / 2)) * 1.55, o = new e.Vector3(1, .8, 1).normalize(); + t.position.copy(r.center).addScaledVector(o, a), t.near = Math.max(.01, a / 250), t.far = Math.max(1e3, a * 60), t.updateProjectionMatrix(), n.target.copy(r.center), n.minDistance = Math.max(.01, a / 25), n.maxDistance = Math.max(10, a * 12), n.minZoom = .25, n.maxZoom = 12, n.update(); +} +function k(e, t, n, r) { + if (!n || !e || !t) return null; + let i = Math.max(1e-4, Number(r) || 1), a = Math.max(n.maxDim * 1.9, 2), o = a * i; + return e.left = -o / 2, e.right = o / 2, e.top = a / 2, e.bottom = -a / 2, e.near = -Math.max(1e3, n.maxDim * 40), e.far = Math.max(1e3, n.maxDim * 40), e.zoom = 1, e.position.copy(n.center).add({ + x: n.radius * 2.1, + y: n.radius * 1.6, + z: n.radius * 2.1 + }), e.updateProjectionMatrix(), t.target.copy(n.center), t.minZoom = .25, t.maxZoom = 12, t.minDistance = 0, t.maxDistance = Math.max(10, n.maxDim * 12), t.update(), a; +} +function A(e, t, n) { + if (!n) return null; + if (t === "gltf") return n.scene || null; + if (t === "obj" || t === "fbx") return n; + if (t === "stl" || t === "ply") { + let r = n; + if (r?.computeVertexNormals) try { + r.computeVertexNormals(); + } catch (e) { + console.debug?.(e); + } + let i = !!r?.getAttribute?.("normal"), a = !!r?.getAttribute?.("color"); + return t === "ply" && !i ? new e.Points(r, new e.PointsMaterial({ + size: .02, + sizeAttenuation: !0, + vertexColors: a, + color: a ? 16777215 : 9489145 + })) : new e.Mesh(r, new e.MeshStandardMaterial({ + color: a ? 16777215 : 14212841, + metalness: .08, + roughness: .72, + vertexColors: a + })); + } + return null; +} +// ui/features/viewer/model3dLoaders.ts +var j = "/mjr/am/vendor/three", de = null; +function fe(e, t, n) { + switch (t) { + case "gltf": return new e.GLTFLoader(n); + case "obj": return new e.OBJLoader(n); + case "fbx": return new e.FBXLoader(n); + case "stl": return new e.STLLoader(n); + case "ply": return new e.PLYLoader(n); + default: return null; + } +} +function M(e, t, n) { + return new Promise((t, r) => { + !e || !n ? r(/* @__PURE__ */ Error("Missing loader or URL")) : typeof e.loadAsync == "function" ? e.loadAsync(n).then(t).catch(r) : e.load(n, t, void 0, r); + }); +} +function N() { + return de || (de = Promise.all([ + import( + /* @vite-ignore */ + `${j}/three.module.js` +), + import( + /* @vite-ignore */ + `${j}/addons/controls/OrbitControls.js` +), + import( + /* @vite-ignore */ + `${j}/addons/loaders/GLTFLoader.js` +), + import( + /* @vite-ignore */ + `${j}/addons/loaders/FBXLoader.js` +), + import( + /* @vite-ignore */ + `${j}/addons/loaders/OBJLoader.js` +), + import( + /* @vite-ignore */ + `${j}/addons/loaders/MTLLoader.js` +), + import( + /* @vite-ignore */ + `${j}/addons/loaders/STLLoader.js` +), + import( + /* @vite-ignore */ + `${j}/addons/loaders/PLYLoader.js` +) + ]).then(([e, t, n, r, i, a, o, s]) => ({ + THREE: e, + OrbitControls: t.OrbitControls, + GLTFLoader: n.GLTFLoader, + FBXLoader: r.FBXLoader, + OBJLoader: i.OBJLoader, + MTLLoader: a.MTLLoader, + STLLoader: o.STLLoader, + PLYLoader: s.PLYLoader + })), de); +} +// ui/features/viewer/imageProcessor.ts +function P(e, t, n) { + if (!e) return; + try { + e.width > 1 && e.height > 1 || (e.width = 960, e.height = 540); + } catch (e) { + console.debug?.(e); + } + let r = (() => { + try { + return e.getContext?.("2d"); + } catch { + return null; + } + })(); + if (r) { + try { + r.save(); + } catch (e) { + console.debug?.(e); + } + try { + r.fillStyle = "rgba(0,0,0,0.85)", r.fillRect(0, 0, e.width, e.height); + } catch (e) { + console.debug?.(e); + } + try { + r.fillStyle = "rgba(255, 120, 120, 0.95)", r.font = "14px system-ui, -apple-system, Segoe UI, Roboto, sans-serif", r.textBaseline = "top"; + let e = t ? String(t) : "Failed to load media"; + r.fillText(e, 14, 14), r.fillStyle = "rgba(255,255,255,0.7)"; + let i = n == null ? "Check file permissions / path, or try re-indexing." : String(n); + r.fillText(i, 14, 34); + } catch (e) { + console.debug?.(e); + } + try { + r.restore(); + } catch (e) { + console.debug?.(e); + } + } +} +// ui/features/viewer/model3dSupport.ts +var F = [ + .25, + .5, + 1, + 1.5, + 2 +], I = 44; +function L(e, { preventDefault: t = !1, immediate: n = !1 } = {}) { + if (e) { + try { + t && e.preventDefault?.(); + } catch (e) { + console.debug?.(e); + } + try { + e.stopPropagation?.(), n && e.stopImmediatePropagation?.(); + } catch (e) { + console.debug?.(e); + } + } +} +function R(e) { + let t = Math.max(0, Number(e) || 0), n = Math.floor(t / 60), r = Math.floor(t % 60); + return n > 0 ? `${n}:${String(r).padStart(2, "0")}` : `${Math.floor(t)}s`; +} +function z(t, n) { + let r = document.createElement("button"); + return r.type = "button", r.textContent = String(t || ""), r.title = String(n || t || ""), r.setAttribute("aria-label", String(n || t || e("model3d.viewportAction", "3D viewport action"))), r.style.cssText = "height:28px;padding:0 10px;border-radius:999px;border:1px solid rgba(255,255,255,0.16);background:rgba(13,15,20,0.78);color:rgba(255,255,255,0.92);font:600 11px system-ui,sans-serif;letter-spacing:0.02em;cursor:pointer;backdrop-filter:blur(8px);display:inline-flex;align-items:center;justify-content:center;box-shadow:0 4px 18px rgba(0,0,0,0.24)", r; +} +function B(e, t) { + if (!e) return; + let n = !!t; + e.dataset.active = n ? "1" : "0", e.style.background = n ? "rgba(76,175,80,0.18)" : "rgba(13,15,20,0.78)", e.style.borderColor = n ? "rgba(76,175,80,0.42)" : "rgba(255,255,255,0.16)", e.style.color = n ? "rgba(230,255,235,0.96)" : "rgba(255,255,255,0.92)"; +} +function V(t, n, r = "", i = "#4CAF50") { + if (!t) return; + try { + let e = Math.max(480, Number(t.width) || 960), n = Math.max(270, Number(t.height) || 540); + t.width = e, t.height = n; + } catch (e) { + console.debug?.(e); + } + let a = (() => { + try { + return t.getContext("2d"); + } catch { + return null; + } + })(); + if (!a) return; + let o = Number(t.width) || 960, s = Number(t.height) || 540, c = o / 2, l = s / 2; + try { + let t = a.createLinearGradient(0, 0, o, s); + t.addColorStop(0, "#0f1419"), t.addColorStop(1, "#11181f"), a.fillStyle = t, a.fillRect(0, 0, o, s), a.save(), a.translate(c, l - 32), a.strokeStyle = i, a.lineWidth = 3, a.globalAlpha = .95, a.beginPath(), a.moveTo(0, -44), a.lineTo(42, -22), a.lineTo(42, 22), a.lineTo(0, 44), a.lineTo(-42, 22), a.lineTo(-42, -22), a.closePath(), a.stroke(), a.beginPath(), a.moveTo(0, -44), a.lineTo(0, 0), a.lineTo(42, 22), a.moveTo(0, 0), a.lineTo(-42, 22), a.moveTo(-42, -22), a.lineTo(0, 0), a.moveTo(42, -22), a.lineTo(0, 0), a.stroke(), a.restore(), a.fillStyle = "rgba(255,255,255,0.94)", a.font = "600 18px system-ui, sans-serif", a.textAlign = "center", a.textBaseline = "middle", a.fillText(String(n || e("model3d.preview", "3D preview")), c, l + 44), r && (a.fillStyle = "rgba(255,255,255,0.62)", a.font = "13px system-ui, sans-serif", a.fillText(String(r), c, l + 72)); + } catch (i) { + console.debug?.(i); + try { + P(t, n, r || e("model3d.unavailable", "3D viewer unavailable")); + } catch (e) { + console.debug?.(e); + } + } +} +function pe({ defaultBgColor: t, defaultFov: n, defaultLightIntensity: r, hasSkeleton: i } = {}) { + let a = document.createElement("div"); + a.className = "mjr-model3d-settings", a.style.cssText = "position:absolute;right:0;top:44px;width:210px;max-height:calc(100% - 100px);overflow-y:auto;background:rgba(14,18,26,0.96);border:1px solid rgba(255,255,255,0.10);border-right:none;border-radius:10px 0 0 10px;padding:10px 10px 12px 10px;z-index:4;display:none;box-shadow:-6px 4px 24px rgba(0,0,0,0.5);backdrop-filter:blur(12px);font:13px system-ui,sans-serif;color:rgba(255,255,255,0.88);scrollbar-width:thin", [ + "pointerdown", + "pointermove", + "pointerup", + "mousedown", + "mousemove", + "mouseup", + "wheel", + "click", + "contextmenu", + "dragstart", + "dragover", + "drop" + ].forEach((e) => { + a.addEventListener(e, (e) => L(e, { preventDefault: !1 })); + }); + let o = (e) => { + let t = document.createElement("div"); + t.style.cssText = "font:700 10px system-ui,sans-serif;letter-spacing:0.08em;color:rgba(255,255,255,0.40);text-transform:uppercase;margin:10px 0 6px 0", t.textContent = e, a.appendChild(t); + let n = document.createElement("div"); + n.style.cssText = "height:1px;background:rgba(255,255,255,0.07);margin-bottom:8px;", a.appendChild(n); + }, s = (e, t) => { + let n = document.createElement("div"); + n.style.cssText = "display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;gap:6px;"; + let r = document.createElement("span"); + return r.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.65);white-space:nowrap;flex-shrink:0;", r.textContent = e, n.appendChild(r), n.appendChild(t), a.appendChild(n), n; + }, c = (e, t) => { + let n = document.createElement("select"); + n.style.cssText = "background:rgba(25,30,42,0.95);color:rgba(255,255,255,0.88);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 5px;font:11px system-ui,sans-serif;cursor:pointer;flex:1;min-width:0"; + for (let [r, i] of e) { + let e = document.createElement("option"); + e.value = r, e.textContent = i, r === t && (e.selected = !0), n.appendChild(e); + } + return n; + }, l = (e, t, n, r) => { + let i = document.createElement("div"); + i.style.cssText = "display:flex;align-items:center;gap:5px;flex:1;"; + let a = document.createElement("input"); + a.type = "range", a.min = String(e), a.max = String(t), a.step = String(n), a.value = String(r), a.style.cssText = "flex:1;cursor:pointer;accent-color:#4CAF50;height:3px;"; + let o = document.createElement("span"); + return o.style.cssText = "font:11px system-ui,sans-serif;color:rgba(255,255,255,0.45);min-width:26px;text-align:right;", o.textContent = String(r), a.addEventListener("input", () => { + o.textContent = a.value; + }), i.appendChild(a), i.appendChild(o), { + wrap: i, + slider: a, + valLbl: o + }; + }; + o("Scene"); + let u = document.createElement("input"); + u.type = "color", u.value = t || "#282828", u.style.cssText = "width:34px;height:24px;cursor:pointer;border:1px solid rgba(255,255,255,0.18);border-radius:4px;padding:1px;background:none;flex-shrink:0;", s(e("model3d.background", "Background"), u), o("Model"); + let d = c([ + ["original", "Original"], + ["normal", "Normal map"], + ["depth", "Depth"], + ["wireframe", "Wireframe"], + ["pointcloud", "Point cloud"] + ], "original"); + s(e("model3d.material", "Material"), d); + let ee = c([ + ["original", "Original"], + ["+y", "+Y (default)"], + ["-y", "-Y"], + ["+z", "+Z (CAD)"], + ["-z", "-Z"], + ["+x", "+X"], + ["-x", "-X"] + ], "original"); + s("Up", ee); + let te = null, f = null; + i && (f = document.createElement("input"), f.type = "checkbox", f.checked = !1, f.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;", te = s(e("model3d.skeleton", "Skeleton"), f)), o("Camera"); + let p = l(15, 120, 1, n ?? 75); + s("FOV", p.wrap), o(e("model3d.lights", "Lights")); + let m = l(0, 5, .1, r ?? 1); + return s(e("model3d.intensity", "Intensity"), m.wrap), { + panel: a, + bgInput: u, + materialSel: d, + upSel: ee, + skeletonToggle: f, + skeletonRow: te, + fovSlider: p.slider, + fovValLbl: p.valLbl, + lightSlider: m.slider, + lightValLbl: m.valLbl + }; +} +function me() { + let t = document.createElement("div"); + t.className = "mjr-model3d-anim-bar", t.style.cssText = [ + "position:absolute", + "bottom:0", + "left:0", + "right:0", + `height:${I}px`, + "display:none", + "align-items:center", + "gap:7px", + "padding:0 10px", + "background:rgba(10,13,20,0.90)", + "backdrop-filter:blur(10px)", + "border-top:1px solid rgba(255,255,255,0.07)", + "z-index:3" + ].join(";"), [ + "pointerdown", + "pointermove", + "pointerup", + "mousedown", + "mousemove", + "mouseup", + "wheel", + "click" + ].forEach((e) => { + t.addEventListener(e, (e) => L(e, { preventDefault: !1 })); + }); + let n = document.createElement("button"); + n.type = "button", n.textContent = e("model3d.play", "Play"), n.title = e("model3d.playPause", "Play / Pause"), n.style.cssText = "width:28px;height:28px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(76,175,80,0.14);color:rgba(255,255,255,0.92);font:600 12px system-ui,sans-serif;cursor:pointer;flex-shrink:0;padding:0;line-height:1;display:flex;align-items:center;justify-content:center"; + let r = document.createElement("select"); + r.title = e("model3d.playbackSpeed", "Playback speed"), r.style.cssText = "background:rgba(20,24,34,0.9);color:rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 4px;font:11px system-ui,sans-serif;cursor:pointer;width:52px;flex-shrink:0"; + for (let e of F) { + let t = document.createElement("option"); + t.value = String(e), t.textContent = `${e}x`, e === 1 && (t.selected = !0), r.appendChild(t); + } + let i = document.createElement("select"); + i.title = "Animation clip", i.style.cssText = "background:rgba(20,24,34,0.9);color:rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 5px;font:11px system-ui,sans-serif;cursor:pointer;max-width:130px;flex-shrink:1;min-width:0"; + let a = document.createElement("input"); + a.type = "range", a.min = "0", a.max = "1000", a.value = "0", a.style.cssText = "flex:1;min-width:50px;cursor:pointer;accent-color:#4CAF50;height:3px;"; + let o = document.createElement("span"); + return o.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.45);white-space:nowrap;flex-shrink:0", o.textContent = "0s / 0s", t.appendChild(n), t.appendChild(r), t.appendChild(i), t.appendChild(a), t.appendChild(o), { + bar: t, + playBtn: n, + speedSel: r, + animSel: i, + progressSlider: a, + timeLbl: o + }; +} +// ui/features/viewer/model3dRenderer.impl.ts +var H = Object.freeze({ + ".gltf": "gltf", + ".glb": "gltf", + ".obj": "obj", + ".fbx": "fbx", + ".stl": "stl", + ".ply": "ply", + ".splat": "splat", + ".ksplat": "splat", + ".spz": "splat" +}), U = new Set(Object.keys(H)), he = /* @__PURE__ */ new Set([ + "gltf", + "obj", + "fbx", + "stl", + "ply" +]), ge = "#282828", W = e("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"), G = Object.freeze({ + PERSPECTIVE: "perspective", + ORTHOGRAPHIC: "orthographic" +}); +Object.freeze({ + ORIGINAL: "original", + NORMAL: "normal", + DEPTH: "depth", + WIREFRAME: "wireframe", + POINTCLOUD: "pointcloud" +}); +var _e = Object.freeze({ + original: [ + 0, + 0, + 0 + ], + "+y": [ + 0, + 0, + 0 + ], + "-y": [ + Math.PI, + 0, + 0 + ], + "+z": [ + -Math.PI / 2, + 0, + 0 + ], + "-z": [ + Math.PI / 2, + 0, + 0 + ], + "+x": [ + 0, + 0, + Math.PI / 2 + ], + "-x": [ + 0, + 0, + -Math.PI / 2 + ] +}), ve = 75, ye = 1, K = Object.freeze({ + ambient: .5, + main: .8, + fill: .3, + back: .3, + rim: .3, + bottom: .2 +}); +function be(e) { + try { + let t = String(e?.ext || "").trim().toLowerCase(); + if (t) return t.startsWith(".") ? t : `.${t}`; + } catch (e) { + console.debug?.(e); + } + try { + let t = String(e?.filename || e?.filepath || e?.path || "").trim(), n = t.lastIndexOf("."); + return n >= 0 ? t.slice(n).toLowerCase() : ""; + } catch (e) { + console.debug?.(e); + } + return ""; +} +function xe(e) { + let t = String(e || "").trim(); + return t ? t.startsWith("/") || /^[a-z][\w+\-.]*:/i.test(t) : !1; +} +function q(e) { + return String(e?.loader || e?.viewer_info?.loader || "").trim().toLowerCase() || H[be(e)] || ""; +} +function Se(e) { + return q(e) || "gltf"; +} +function Ce(e) { + try { + return !!e?.closest?.(".mjr-model3d-host, .mjr-viewer-model3d-host, .mjr-mfv-model3d-host"); + } catch { + return !1; + } +} +function we(e, t) { + let n = t || { + ROTATE: 0, + DOLLY: 1, + PAN: 2 + }; + return { + LEFT: n.ROTATE, + MIDDLE: n.DOLLY, + RIGHT: n.PAN + }; +} +function Te(r, i, a = {}) { + let s = a?.pauseDuringExecution == null ? !!n?.VIEWER_PAUSE_DURING_EXECUTION : !!a.pauseDuringExecution, c = document.createElement("div"); + c.className = a.hostClassName || "mjr-model3d-host mjr-viewer-model3d-host", c.style.cssText = a.hostStyle || "width:100%;height:100%;display:flex;align-items:stretch;justify-content:stretch;position:relative;overflow:hidden;border-radius:12px;background:radial-gradient(circle at top, rgba(76,175,80,0.10), rgba(0,0,0,0) 42%), linear-gradient(180deg, rgba(40,40,40,0.98), rgba(19,22,28,0.99));box-shadow:inset 0 0 0 1px rgba(255,255,255,0.06)", c.setAttribute("data-capture-wheel", "true"), c.tabIndex = -1; + let l = document.createElement("canvas"); + l.className = a.canvasClassName || "mjr-viewer-media mjr-model3d-render-canvas", l.style.cssText = a.canvasStyle || "display:block;width:100%;height:100%;max-width:100%;max-height:100%;outline:none;touch-action:none", l.tabIndex = 0, l._mjrDisableViewerTransform = a.disableViewerTransform !== !1; + try { + r?.id != null && (l.dataset.mjrAssetId = String(r.id)); + } catch (e) { + console.debug?.(e); + } + c.appendChild(l); + let u = document.createElement("canvas"); + u.className = "mjr-model3d-status", u.style.cssText = "position:absolute;inset:0;display:block;width:100%;height:100%;pointer-events:none;z-index:1", c.appendChild(u); + let d = be(r).replace(".", "").toUpperCase(); + if (d) { + let e = document.createElement("div"); + e.className = "mjr-model3d-badge", e.textContent = d, e.style.cssText = "position:absolute;top:10px;left:10px;padding:4px 8px;border-radius:999px;font:700 10px system-ui,sans-serif;letter-spacing:0.08em;color:#fff;background:rgba(76,175,80,0.9);pointer-events:none;z-index:2", c.appendChild(e); + } + let ee = document.createElement("div"); + ee.className = "mjr-model3d-toolbar", ee.style.cssText = "position:absolute;top:10px;right:10px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:none;z-index:5"; + let te = document.createElement("div"); + te.style.cssText = "display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:auto;"; + let f = z(e("model3d.reset", "Reset"), e("model3d.resetView", "Reset 3D view")), p = z(e("model3d.grid", "Grid"), e("model3d.toggleGrid", "Toggle grid")), m = z(e("model3d.persp", "Persp"), e("model3d.switchCamera", "Switch perspective / orthographic")), h = z(e("model3d.settings", "Settings"), e("model3d.settings", "Settings")); + te.append(f, p, m, h), ee.appendChild(te), c.appendChild(ee); + let g = document.createElement("div"); + g.className = "mjr-model3d-hint", g.textContent = a.hintText || W, g.style.cssText = "position:absolute;right:10px;bottom:10px;padding:5px 10px;border-radius:999px;font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.75);background:rgba(0,0,0,0.35);backdrop-filter:blur(6px);pointer-events:none;z-index:2;transition:bottom 0.2s", c.appendChild(g); + let _ = pe({ + defaultBgColor: ge, + defaultFov: ve, + defaultLightIntensity: ye, + hasSkeleton: !1 + }); + c.appendChild(_.panel); + let v = me(); + c.appendChild(v.bar); + let y = !1, ne = null, b = null, x = null, S = null, C = null, w = null, T = null, E = null, re = null, D = null, ie = !1, j = null, de = null, P = null, F = null, I = null, H = null, U = 0, q = G.PERSPECTIVE, Ce = /* @__PURE__ */ new Map(), Te = /* @__PURE__ */ new Set(), Ee = null, De = !1, Oe = null, ke = [], Ae = ye, J = null, je = null, Y = [], X = [], Z = 0, Me = 1, Q = !1, Ne = !1, Pe = !1, Fe = String(r?.filename || "3D model"), Ie = () => { + try { + a.scheduleOverlayRedraw?.(); + } catch (e) { + console.debug?.(e); + } + }, $ = (e, t = "", n = "#4CAF50") => { + j = { + title: e, + hintText: t, + accent: n + }, u.style.display = "block", V(u, e, t, n); + }, Le = () => { + j = null, u.style.display = "none"; + }, Re = () => { + try { + let e = c.getBoundingClientRect(); + l._mjrNaturalW = Math.max(1, Math.round(e.width || l.width || 1)), l._mjrNaturalH = Math.max(1, Math.round(e.height || l.height || 1)); + } catch (e) { + console.debug?.(e); + } + try { + j && V(u, j.title, j.hintText, j.accent); + } catch (e) { + console.debug?.(e); + } + }, ze = (e, t) => { + if (!T || !(U > 0)) return; + let n = Math.max(1e-4, (Number(e) || 1) / Math.max(1, Number(t) || 1)), r = U * n; + T.left = -r / 2, T.right = r / 2, T.top = U / 2, T.bottom = -U / 2, T.updateProjectionMatrix(); + }, Be = () => { + if (F && E && H) { + if (q === G.ORTHOGRAPHIC) { + let e = c.getBoundingClientRect(); + U = k(T, E, H, Math.max(1e-4, (e.width || 1) / Math.max(1, e.height || 1))) || U, C = T; + } else ue(b, w, E, H), C = w; + try { + E.object = C, E.update(); + } catch (e) { + console.debug?.(e); + } + } + }, Ve = (e, { refit: t = !0 } = {}) => { + q = e === G.ORTHOGRAPHIC ? G.ORTHOGRAPHIC : G.PERSPECTIVE, C = q === G.ORTHOGRAPHIC ? T : w; + try { + E && (E.object = C); + } catch (e) { + console.debug?.(e); + } + if (t) Be(); + else { + try { + C?.updateProjectionMatrix?.(); + } catch (e) { + console.debug?.(e); + } + try { + E?.update?.(); + } catch (e) { + console.debug?.(e); + } + } + Xe(), Ie(); + }, He = (e) => { + Ae = Math.max(0, Math.min(10, Number(e) || 0)); + try { + Oe && (Oe.intensity = K.ambient * Ae); + } catch (e) { + console.debug?.(e); + } + let t = [ + K.main, + K.back, + K.fill, + K.fill, + K.bottom + ]; + ke.forEach((e, n) => { + try { + e && (e.intensity = (t[n] ?? K.fill) * Ae); + } catch (e) { + console.debug?.(e); + } + }); + }, Ue = (e) => { + I && b && (se(Te), O(b, I, e, Ce, Te), Ie()); + }, We = (e) => { + if (!F) return; + let t = _e[e] || [ + 0, + 0, + 0 + ]; + try { + F.rotation.set(t[0], t[1], t[2]), F.updateMatrixWorld(!0); + } catch (e) { + console.debug?.(e); + } + b && (H = le(b, F)), Be(); + }, Ge = (e) => { + if (Ee) try { + Ee.visible = !!e; + } catch (e) { + console.debug?.(e); + } + }, Ke = () => { + if (!J || Y.length === 0) return; + let e = X[Z]; + if (!e) return; + let t = Y[Z]?.duration || 0, n = e.time || 0; + try { + v.timeLbl.textContent = `${R(n)} / ${R(t)}`; + } catch (e) { + console.debug?.(e); + } + if (!Ne && t > 0) try { + let e = Number(v.progressSlider.max) || 1e3; + v.progressSlider.value = String(Math.round(n / t * e)); + } catch (e) { + console.debug?.(e); + } + }, qe = (t) => { + if (!J || !Y.length) return; + let n = Y[t]; + if (!n) return; + X.forEach((e) => { + try { + e?.stop(); + } catch (e) { + console.debug?.(e); + } + }); + let r = J.clipAction(n); + r.timeScale = Me, r.clampWhenFinished = !1, r.loop = b?.LoopRepeat ?? 2201, r.play(), X[t] = r, Z = t, Q = !0, v.playBtn.textContent = e("model3d.pause", "Pause"); + try { + let e = Math.max(100, Math.min(1e4, Math.round((n.duration || 1) * 100))); + v.progressSlider.max = String(e); + } catch {} + }, Je = () => { + J && Y.length && (Q ? (J.timeScale = 0, Q = !1, v.playBtn.textContent = e("model3d.play", "Play")) : (J.timeScale = Me, X[Z]?.isRunning?.() ? (Q = !0, v.playBtn.textContent = e("model3d.pause", "Pause")) : qe(Z))); + }, Ye = (e, t) => { + e && e.length !== 0 && b && (Y = e, J = new b.AnimationMixer(t), je = new b.Clock(), X = Array(e.length).fill(null), v.animSel.innerHTML = "", e.forEach((e, t) => { + let n = document.createElement("option"); + n.value = String(t), n.textContent = e.name || `Animation ${t + 1}`, v.animSel.appendChild(n); + }), v.animSel.style.display = e.length > 1 ? "" : "none", v.bar.style.display = "flex", g.style.bottom = "54px", qe(0), v.playBtn.addEventListener("click", (e) => { + L(e), Je(); + }), v.speedSel.addEventListener("change", () => { + Me = Number(v.speedSel.value) || 1, J.timeScale = Q ? Me : 0; + let e = X[Z]; + e && (e.timeScale = Me); + }), v.animSel.addEventListener("change", () => { + let e = Number(v.animSel.value) || 0; + qe(e); + }), v.progressSlider.addEventListener("pointerdown", () => { + Ne = !0; + }), v.progressSlider.addEventListener("pointerup", () => { + Ne = !1; + let e = X[Z], t = Y[Z]; + if (e && t) { + let n = Number(v.progressSlider.max) || 1e3, r = Number(v.progressSlider.value) / n * t.duration; + e.time = Math.max(0, Math.min(r, t.duration)); + } + }), v.progressSlider.addEventListener("input", () => { + let e = X[Z], t = Y[Z]; + if (e && t && Ne) { + let n = Number(v.progressSlider.max) || 1e3, r = Number(v.progressSlider.value) / n * t.duration; + e.time = Math.max(0, Math.min(r, t.duration)), v.timeLbl.textContent = `${R(r)} / ${R(t.duration)}`; + } + })); + }, Xe = () => { + B(p, !!P?.visible), B(m, q === G.ORTHOGRAPHIC), m.textContent = q === G.ORTHOGRAPHIC ? e("model3d.ortho", "Ortho") : e("model3d.persp", "Persp"), B(h, Pe); + }; + _.bgInput.addEventListener("input", () => { + let e = _.bgInput.value; + try { + S && (S.background = new ((b?.Color) || Object)(e)); + } catch (e) { + console.debug?.(e); + } + }), _.materialSel.addEventListener("change", () => { + Ue(_.materialSel.value); + }), _.upSel.addEventListener("change", () => { + We(_.upSel.value); + }), _.skeletonToggle && _.skeletonToggle.addEventListener("change", () => { + Ge(_.skeletonToggle.checked); + }), _.fovSlider.addEventListener("input", () => { + let e = Math.max(1, Math.min(179, Number(_.fovSlider.value) || ve)); + try { + w && (w.fov = e, w.updateProjectionMatrix()); + } catch (e) { + console.debug?.(e); + } + }), _.lightSlider.addEventListener("input", () => { + He(Number(_.lightSlider.value)); + }); + let Ze = () => { + let e = [], t = (t, n, r, i) => { + t.addEventListener(n, r, i), e.push(() => t.removeEventListener(n, r, i)); + }; + return t(c, "pointerdown", () => { + try { + l.focus?.(); + } catch (e) { + console.debug?.(e); + } + }), t(c, "wheel", (e) => L(e)), t(c, "contextmenu", (e) => L(e, { preventDefault: !0 })), t(c, "dragstart", (e) => L(e, { preventDefault: !0 })), t(c, "dragover", (e) => L(e, { preventDefault: !0 })), t(c, "dragleave", (e) => L(e)), t(c, "drop", (e) => L(e, { preventDefault: !0 })), () => { + for (let t of e) try { + t(); + } catch (e) { + console.debug?.(e); + } + }; + }, Qe = () => { + y = !0; + try { + window.removeEventListener(o.RUNTIME_STATUS, tt); + } catch {} + try { + c._mjr3D = null; + } catch {} + try { + re != null && cancelAnimationFrame(re); + } catch (e) { + console.debug?.(e); + } + re = null; + try { + de?.(); + } catch (e) { + console.debug?.(e); + } + de = null; + try { + ne?.disconnect?.(); + } catch (e) { + console.debug?.(e); + } + ne = null; + try { + E?.dispose?.(); + } catch (e) { + console.debug?.(e); + } + E = null; + try { + J?.stopAllAction?.(), J?.uncacheRoot?.(J.getRoot?.()); + } catch (e) { + console.debug?.(e); + } + try { + for (let e of X) try { + J?.uncacheAction?.(e); + } catch {} + } catch (e) { + console.debug?.(e); + } + try { + for (let e of Y) try { + e?.dispose?.(); + } catch {} + } catch (e) { + console.debug?.(e); + } + J = null, X = [], Y = [], se(Te); + try { + Ee && (S?.remove?.(Ee), Ee.dispose?.()); + } catch (e) { + console.debug?.(e); + } + Ee = null; + try { + S?.traverse?.((e) => { + try { + e.geometry?.dispose?.(); + } catch {} + try { + let t = Array.isArray(e.material) ? e.material : e.material ? [e.material] : []; + for (let e of t) try { + if (e) { + for (let t of Object.keys(e)) try { + let n = e[t]; + n && typeof n == "object" && typeof n.dispose == "function" && n.isTexture && n.dispose(); + } catch {} + e.dispose?.(); + } + } catch {} + } catch {} + }); + } catch (e) { + console.debug?.(e); + } + try { + c._mjrAxisScene &&= (c._mjrAxisScene.traverse?.((e) => { + try { + e.geometry?.dispose?.(); + } catch {} + try { + e.material?.dispose?.(); + } catch {} + }), null); + } catch (e) { + console.debug?.(e); + } + try { + x?.dispose?.(); + } catch (e) { + console.debug?.(e); + } + x = null, S = null, C = null, w = null, T = null, I = null, F = null, H = null, D = null; + try { + let e = l.getContext("webgl2") || l.getContext("webgl"); + e && e.getExtension("WEBGL_lose_context")?.loseContext?.(); + } catch (e) { + console.debug?.(e); + } + }, $e = () => { + ie = !0; + try { + re != null && cancelAnimationFrame(re); + } catch (e) { + console.debug?.(e); + } + re = null; + }, et = () => { + if (ie = !1, !(y || re != null || typeof D != "function")) try { + re = requestAnimationFrame(D); + } catch (e) { + console.debug?.(e); + } + }, tt = (e) => { + s && (String(e?.detail?.active_prompt_id || "").trim() ? $e() : et()); + }; + l._mjrProc = { + setParams: () => {}, + destroy: Qe, + captureCanvas: () => l, + pause: $e, + resume: et + }; + try { + s && (window.addEventListener(o.RUNTIME_STATUS, tt), String(window.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (ie = !0)); + } catch (e) { + console.debug?.(e); + } + return $("Preparing 3D preview", Fe), Promise.resolve().then(async () => { + let n = Se(r); + if (he.has(n)) try { + let e = await N(); + if (y) return; + let o = e.THREE; + b = o; + let s = new o.LoadingManager(); + s.setURLModifier((e) => { + if (!e || xe(e)) return e; + let n = t(r, e); + if (n) return n; + try { + return new URL(e, i).href; + } catch { + return e; + } + }), x = new o.WebGLRenderer({ + canvas: l, + antialias: !0, + alpha: !0, + preserveDrawingBuffer: !0 + }), x.outputColorSpace = o.SRGBColorSpace, x.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)), S = new o.Scene(), S.background = new o.Color(ge), w = new o.PerspectiveCamera(ve, 16 / 9, .01, 1e4), T = new o.OrthographicCamera(-1, 1, 1, -1, -1e4, 1e4), C = w, E = new e.OrbitControls(C, l), E.enableDamping = !0, E.dampingFactor = .08, E.rotateSpeed = .82, E.zoomSpeed = 1, E.panSpeed = .9, E.screenSpacePanning = !0, E.mouseButtons = we(null, o.MOUSE), de = Ze(), Oe = new o.AmbientLight(16777215, K.ambient * Ae), S.add(Oe); + let u = new o.DirectionalLight(16777215, K.main * Ae); + u.position.set(0, 10, 10); + let d = new o.DirectionalLight(16777215, K.back * Ae); + d.position.set(-10, 0, -10); + let ee = new o.DirectionalLight(15266047, K.fill * Ae); + ee.position.set(10, 5, -5); + let te = new o.DirectionalLight(16773352, K.fill * Ae); + te.position.set(-10, 5, 5); + let v = new o.DirectionalLight(16777215, K.bottom * Ae); + v.position.set(0, -10, 0), ke = [ + u, + d, + ee, + te, + v + ], ke.forEach((e) => S.add(e)), P = new o.GridHelper(20, 20, 5068128, 3094338), S.add(P); + let O = () => { + if (y || !x || !C) return; + let e = c.getBoundingClientRect(), t = Math.max(1, Math.round(e.width || l.clientWidth || 1)), n = Math.max(1, Math.round(e.height || l.clientHeight || 1)); + x.setSize(t, n, !1), w && (w.aspect = t / n, w.updateProjectionMatrix()), ze(t, n), Re(), Ie(); + }; + typeof ResizeObserver < "u" && (ne = new ResizeObserver(() => O()), ne.observe(c)); + let se = fe(e, n, s); + if (!se) { + $("3D loader unavailable", `${n.toUpperCase()} loader could not be created.`), g.style.display = "none"; + return; + } + if (n === "obj" && e.MTLLoader) try { + let t = i.replace(/\.obj(\?.*)?$/i, (e, t) => `.mtl${t || ""}`), n = new e.MTLLoader(s), r = await new Promise((e) => { + n.load(t, e, void 0, () => e(null)); + }); + r && !y && (r.preload(), se.setMaterials(r)); + } catch (e) { + console.debug?.("[MJR 3D] MTL load skipped:", e?.message); + } + let ue = await M(se, n, i); + if (y) return; + let k = A(o, n, ue); + if (!k) { + $("Empty 3D scene", "The loader returned no renderable object."), g.style.display = "none"; + return; + } + try { + let e = new o.Box3().setFromObject(k); + if (!e.isEmpty()) { + let t = e.getSize(new o.Vector3()), n = e.getCenter(new o.Vector3()), r = 5 / Math.max(t.x, t.y, t.z, .001); + k.scale.multiplyScalar(r), e.setFromObject(k), e.getCenter(n), k.position.set(-n.x, -e.min.y, -n.z); + } + } catch (e) { + console.debug?.("[MJR 3D] normalize skipped:", e); + } + if (I = k, F = new o.Group(), F.add(k), S.add(F), Ce = oe(k), De = ae(k), De) { + Ee = new o.SkeletonHelper(k), Ee.visible = !1, S.add(Ee); + let e = pe({ + defaultBgColor: ge, + defaultFov: ve, + defaultLightIntensity: ye, + hasSkeleton: !0 + }); + c.replaceChild(e.panel, _.panel), Object.assign(_, e), _.bgInput.addEventListener("input", () => { + try { + S && (S.background = new o.Color(_.bgInput.value)); + } catch (e) { + console.debug?.(e); + } + }), _.materialSel.addEventListener("change", () => { + Ue(_.materialSel.value); + }), _.upSel.addEventListener("change", () => { + We(_.upSel.value); + }), _.skeletonToggle && _.skeletonToggle.addEventListener("change", () => { + Ge(_.skeletonToggle.checked); + }), _.fovSlider.addEventListener("input", () => { + let e = Math.max(1, Math.min(179, Number(_.fovSlider.value) || ve)); + try { + w && (w.fov = e, w.updateProjectionMatrix()); + } catch (e) { + console.debug?.(e); + } + }), _.lightSlider.addEventListener("input", () => { + He(Number(_.lightSlider.value)); + }); + } + H = le(o, F), H && (P.position.y = H.box.min.y), q = G.PERSPECTIVE, Be(), O(), Le(), Xe(); + let j = ce(ue, n); + j.length > 0 && Ye(j, k); + let R = new o.Scene(); + c._mjrAxisScene = R; + let z = new o.PerspectiveCamera(50, 1, .1, 100); + z.position.set(0, 0, 3.2), z.lookAt(0, 0, 0); + let B = [ + { + dir: [ + 1, + 0, + 0 + ], + color: 16724787 + }, + { + dir: [ + 0, + 1, + 0 + ], + color: 3407667 + }, + { + dir: [ + 0, + 0, + 1 + ], + color: 5605631 + } + ], V = new o.SphereGeometry(.1, 12, 8), me = new o.SphereGeometry(.08, 10, 6), U = new o.MeshBasicMaterial({ color: 13421772 }); + R.add(new o.Mesh(me, U)); + for (let { dir: e, color: t } of B) { + let n = new o.LineBasicMaterial({ color: t }), r = [new o.Vector3(0, 0, 0), new o.Vector3(e[0], e[1], e[2])], i = new o.BufferGeometry().setFromPoints(r); + R.add(new o.Line(i, n)); + let a = new o.MeshBasicMaterial({ color: t }), s = new o.Mesh(V, a); + s.position.set(e[0], e[1], e[2]), R.add(s); + } + c._mjr3D = { + controls: E, + get camera() { + return C; + } + }; + try { + a.onReady?.({ + canvas: l, + host: c, + object: F, + renderer: x, + camera: C, + controls: E + }); + } catch (e) { + console.debug?.(e); + } + Ie(); + let he = () => { + if (!y && !ie && x && S && C) { + try { + if (E?.update?.(), J && je) { + let e = je.getDelta(); + Q && J.update(e), Ke(); + } + x.setScissorTest(!1), x.setViewport(0, 0, l.width, l.height), x.render(S, C); + let e = Math.min(2, window.devicePixelRatio || 1), t = Math.round(96 * e); + x.setScissorTest(!0), x.setScissor(0, 0, t, t), x.setViewport(0, 0, t, t), x.setClearColor(0, 0), x.clear(!0, !0, !1); + let n = C.quaternion; + z.position.set(0, 0, 3.2).applyQuaternion(n), z.quaternion.copy(n), x.render(R, z), x.setScissorTest(!1); + try { + x.setClearColor(S.background || 0, 1); + } catch {} + Re(); + } catch (e) { + console.debug?.(e); + } + ie || (re = requestAnimationFrame(he)); + } + }; + D = he; + let W = (e) => L(e, { preventDefault: !0 }); + f.addEventListener("click", (e) => { + W(e), Be(), Xe(); + }), p.addEventListener("click", (e) => { + W(e), P && (P.visible = !P.visible), Xe(), Ie(); + }), m.addEventListener("click", (e) => { + W(e), Ve(q === G.PERSPECTIVE ? G.ORTHOGRAPHIC : G.PERSPECTIVE); + }), h.addEventListener("click", (e) => { + W(e), Pe = !Pe, _.panel.style.display = Pe ? "block" : "none", Xe(); + }), ie || he(); + } catch (e) { + console.warn("[MJR 3D] preview init failed", e), $("Failed to load 3D preview", String(e?.message || "Three.js initialization failed.")), g.style.display = "none"; + } + else if ($("3D preview unavailable", `${n.toUpperCase()} is not supported in the embedded viewer.`), g.style.display = "none", i) try { + let t = document.createElement("a"); + t.href = i, t.download = String(r?.filename || "model"), t.textContent = e("model3d.downloadFile", "Download {file}", { file: String(r?.filename || "file") }), t.style.cssText = "position:absolute;bottom:18px;left:50%;transform:translateX(-50%);padding:7px 16px;border-radius:8px;font:600 12px system-ui,sans-serif;color:#fff;background:rgba(76,175,80,0.85);text-decoration:none;pointer-events:auto;z-index:3", c.appendChild(t); + } catch {} + }).catch((e) => { + if (!y) { + console.warn("[MJR 3D] preview init unhandled error", e); + try { + $("Failed to load 3D preview", String(e?.message || "Initialization failed.")); + } catch {} + try { + g.style.display = "none"; + } catch {} + } + }), c; +} +// ui/features/viewer/studio/studioFx.ts +function Ee() { + return { + channel: "rgb", + exposure: 0, + gamma: 1, + zebra: !1, + zebraThreshold: .95, + scopes: "off", + grid: "off", + aspect: "off", + maskOpacity: .65, + probe: !1, + loupe: !1, + loupeSize: 140, + loupeZoom: 8, + compare: "off", + wipe: 50 + }; +} +var De = .2126, Oe = .7152, ke = .0722; +function Ae(e) { + let t = (e, t, n, r = 0) => [ + e, + t, + n, + r, + 0, + e, + t, + n, + r, + 0, + e, + t, + n, + r, + 0 + ].join(" "); + switch (e) { + case "r": return `${t(1, 0, 0)} 0 0 0 1 0`; + case "g": return `${t(0, 1, 0)} 0 0 0 1 0`; + case "b": return `${t(0, 0, 1)} 0 0 0 1 0`; + case "l": return `${t(De, Oe, ke)} 0 0 0 1 0`; + case "a": return `${t(0, 0, 0, 1)} 0 0 0 0 1`; + default: return null; + } +} +function J(e) { + return 2 ** (Number.isFinite(e) ? Math.max(-10, Math.min(10, e)) : 0); +} +function je(e) { + return 1 / (Number.isFinite(e) && e > 0 ? e : 1); +} +function Y(e) { + return e.channel !== "rgb" || Math.abs(e.exposure) > .001 || Math.abs(e.gamma - 1) > .001; +} +function X(e) { + switch (e) { + case "16:9": return 16 / 9; + case "1:1": return 1; + case "4:3": return 4 / 3; + case "2.39": return 2.39; + case "9:16": return 9 / 16; + default: return null; + } +} +function Z(e, t, n) { + let r = X(n); + if (!r || e <= 0 || t <= 0) return null; + let i = e, a = e / r; + return a > t && (a = t, i = t * r), { + x: (e - i) / 2, + y: (t - a) / 2, + w: i, + h: a + }; +} +function Me(e, t, n) { + let r = [], i = []; + if (e <= 0 || t <= 0 || n === "off") return { + lines: r, + rects: i + }; + let a = (n) => r.push({ + x1: e * n, + y1: 0, + x2: e * n, + y2: t + }), o = (n) => r.push({ + x1: 0, + y1: t * n, + x2: e, + y2: t * n + }); + if (n === "thirds") a(1 / 3), a(2 / 3), o(1 / 3), o(2 / 3); + else if (n === "golden") { + let e = .381966; + a(e), a(.618034), o(e), o(.618034); + } else if (n === "center") a(.5), o(.5); + else if (n === "safe") { + for (let n of [.9, .8]) i.push({ + x: e * (1 - n) / 2, + y: t * (1 - n) / 2, + w: e * n, + h: t * n + }); + a(.5), o(.5); + } + return { + lines: r, + rects: i + }; +} +function Q(e, t, n) { + return De * e + Oe * t + ke * n; +} +function Ne(e) { + let t = /* @__PURE__ */ new Uint32Array(256), n = /* @__PURE__ */ new Uint32Array(256), r = /* @__PURE__ */ new Uint32Array(256), i = /* @__PURE__ */ new Uint32Array(256); + for (let a = 0; a + 3 < e.length; a += 4) e[a + 3] !== 0 && (t[e[a]] += 1, n[e[a + 1]] += 1, r[e[a + 2]] += 1, i[Math.round(Q(e[a], e[a + 1], e[a + 2]))] += 1); + let a = 1; + for (let e = 1; e < 255; e++) a = Math.max(a, t[e], n[e], r[e], i[e]); + return { + r: t, + g: n, + b: r, + l: i, + max: a + }; +} +function Pe(e, t, n, r = 256) { + let i = Math.max(1, Math.min(r, t)), a = new Uint32Array(i * 256), o = 1; + for (let r = 0; r < n; r++) for (let n = 0; n < t; n++) { + let s = (r * t + n) * 4; + if (e[s + 3] === 0) continue; + let c = Math.min(i - 1, Math.floor(n * i / t)), l = Math.round(Q(e[s], e[s + 1], e[s + 2])), u = c * 256 + l; + a[u] += 1, a[u] > o && (o = a[u]); + } + return { + columns: i, + bins: a, + max: o + }; +} +function Fe(e, t, n, r, i = 0) { + let a = new Uint8ClampedArray(/* @__PURE__ */ new ArrayBuffer(t * n * 4)), o = Math.max(0, Math.min(1, r)) * 255; + for (let r = 0; r < n; r++) for (let n = 0; n < t; n++) { + let s = (r * t + n) * 4; + if (Q(e[s], e[s + 1], e[s + 2]) < o) continue; + let c = Math.floor((n + r + i) / 4) % 2 == 0; + a[s] = c ? 255 : 20, a[s + 1] = c ? 40 : 20, a[s + 2] = c ? 40 : 20, a[s + 3] = 200; + } + return a; +} +function Ie(e, t, n = 256) { + if (e <= 0 || t <= 0) return { + w: 0, + h: 0 + }; + let r = Math.min(1, n / Math.max(e, t)); + return { + w: Math.max(1, Math.round(e * r)), + h: Math.max(1, Math.round(t * r)) + }; +} +function $(e, t, n, r) { + return { + hex: `#${[ + e, + t, + n + ].map((e) => Math.round(e).toString(16).padStart(2, "0")).join("")}`.toUpperCase(), + rgb: `${e}, ${t}, ${n}${r < 255 ? ` · α ${r}` : ""}`, + luma: `${Math.round(Q(e, t, n) / 255 * 100)}%` + }; +} +function Le(e) { + switch (e) { + case "difference": return "difference"; + case "add": return "plus-lighter"; + case "multiply": return "multiply"; + case "screen": return "screen"; + default: return null; + } +} +var Re = [ + { + value: "wipe", + label: "Wipe ↔" + }, + { + value: "wipeV", + label: "Wipe ↕" + }, + { + value: "side", + label: "Side by side" + }, + { + value: "difference", + label: "Difference" + }, + { + value: "add", + label: "Add" + }, + { + value: "subtract", + label: "Subtract", + imageOnly: !0 + }, + { + value: "multiply", + label: "Multiply" + }, + { + value: "screen", + label: "Screen" + } +]; +function ze(e, t, n, r = () => !0) { + let i = e.length; + if (i < 2) return null; + let a = n < 0 ? -1 : 1; + for (let n = 1; n < i; n++) { + let o = ((t + a * n) % i + i) % i; + if (o !== t && r(e[o], o)) return o; + } + return null; +} +// ui/features/viewer/studio/studioMedia.ts +var Be = /* @__PURE__ */ new Set([ + "png", + "jpg", + "jpeg", + "webp", + "gif", + "bmp", + "avif", + "tif", + "tiff", + "jxl", + "exr", + "svg" +]), Ve = /* @__PURE__ */ new Set([ + "mp4", + "webm", + "mov", + "mkv", + "avi", + "m4v" +]), He = /* @__PURE__ */ new Set([ + "mp3", + "wav", + "flac", + "ogg", + "opus", + "m4a", + "aac", + "aiff" +]), Ue = /* @__PURE__ */ new Set([ + "glb", + "gltf", + "obj", + "fbx", + "stl", + "ply", + "splat", + "ksplat", + "spz" +]); +function We(e) { + let t = String(e?.filename || e?.name || e?.filepath || "").trim(), n = t.lastIndexOf("."); + return n >= 0 ? t.slice(n + 1).toLowerCase() : ""; +} +function Ge(e) { + let t = String(e?.kind || "").trim().toLowerCase(); + if (t === "image" || t === "video" || t === "audio" || t === "model3d") return t; + let n = We(e); + return Be.has(n) ? "image" : Ve.has(n) ? "video" : He.has(n) ? "audio" : Ue.has(n) ? "model3d" : "other"; +} +function Ke(e, { withCentis: t = !0 } = {}) { + let n = Math.floor((Number.isFinite(e) && e > 0 ? e : 0) * 100 + 1e-6), r = n % 100, i = Math.floor(n / 100), a = i % 60, o = Math.floor(i / 60) % 60, s = Math.floor(i / 3600), c = s > 0 ? String(o).padStart(2, "0") : String(o), l = `${s > 0 ? `${s}:` : ""}${c}:${String(a).padStart(2, "0")}`; + return t ? `${l}.${String(r).padStart(2, "0")}` : l; +} +function qe(e, t) { + return !t || !Number.isFinite(t) || t <= 0 ? 0 : Math.max(0, Math.floor(Math.max(0, e) * t + 1e-6)); +} +function Je(e, t) { + return !t || !Number.isFinite(t) || t <= 0 ? 0 : Math.max(0, (Math.max(0, Math.floor(e)) + .25) / t); +} +function Ye(e, t, n, r) { + let i = t && Number.isFinite(t) && t > 0 ? t : 24, a = Je(qe(e, i) + n, i); + return Math.min(Math.max(0, a), Math.max(0, (Number.isFinite(r) && r > 0 ? r : a) - .5 / i)); +} +function Xe(e, t, n) { + let r = Number(n); + return Number.isFinite(r) && r > 0 ? Math.floor(r) : !t || !Number.isFinite(e) || e <= 0 ? null : Math.max(1, Math.round(e * t)); +} +function Ze(e, t) { + if (e.a == null || e.b == null) return null; + let n = Number.isFinite(t) && t > 0 ? t : Math.max(e.a, e.b), r = Math.min(Math.max(0, Math.min(e.a, e.b)), n), i = Math.min(Math.max(0, Math.max(e.a, e.b)), n); + return i - r >= .02 ? { + a: r, + b: i + } : null; +} +function Qe(e, t, n) { + let r = Ze(t, n); + return r && (e >= r.b || e < r.a - .05) ? r.a : null; +} +var $e = [ + .25, + .5, + 1, + 1.5, + 2 +]; +function et(e, t) { + return a(e) ?? i(t?.fps_raw ?? t?.fps ?? t?.frame_rate) ?? i(e?.fps); +} +function tt(e) { + let t = [], n = Number(e?.width), r = Number(e?.height); + n > 0 && r > 0 && t.push(`${n}×${r}`); + let i = We(e); + i && t.push(i.toUpperCase()); + let a = Number(e?.duration); + a > 0 && t.push(Ke(a, { withCentis: !1 })); + let o = Number(e?.size); + return o > 0 && t.push(nt(o)), t.join(" · "); +} +function nt(e) { + if (!Number.isFinite(e) || e <= 0) return ""; + let t = [ + "B", + "KB", + "MB", + "GB" + ], n = e, r = 0; + for (; n >= 1024 && r < t.length - 1;) n /= 1024, r += 1; + return `${n >= 10 || r === 0 ? Math.round(n) : n.toFixed(1)} ${t[r]}`; +} +function rt(e, t, n = 40) { + if (e <= 0) return { + start: 0, + end: 0 + }; + let r = n * 2 + 1; + if (e <= r) return { + start: 0, + end: e + }; + let i = Math.max(0, t - n), a = i + r; + return a > e && (a = e, i = e - r), { + start: i, + end: a + }; +} +// ui/vue/components/viewer/studio/StudioPlayer.vue?vue&type=script&setup=true&lang.ts +var it = ["src"], at = ["src"], ot = { + key: 0, + class: "mjr-studio-stage__ab" +}, st = { class: "is-sep" }, ct = { + class: "pi pi-volume-up", + "aria-hidden": "true" +}, lt = ["src"], ut = { + key: 3, + class: "mjr-studio-player__error" +}, dt = [ + "aria-label", + "aria-valuemax", + "aria-valuenow" +], ft = { class: "mjr-studio-player__row" }, pt = { class: "mjr-studio-player__time" }, mt = { class: "is-dim" }, ht = ["title"], gt = ["title"], _t = { class: "mjr-studio-player__group" }, vt = ["aria-label", "aria-valuenow"], yt = /* @__PURE__ */ m({ + __name: "StudioPlayer", + props: { + src: {}, + kind: {}, + fps: {}, + frameCount: {}, + filename: {}, + initialMuted: { type: Boolean }, + initialRate: {}, + compact: { type: Boolean }, + mediaFilter: {}, + compareSrc: {}, + compare: {}, + wipe: {}, + lightDismiss: { type: Boolean }, + mediaClass: {} + }, + emits: [ + "ended", + "update:wipe", + "dismiss" + ], + setup(t, { expose: n, emit: r }) { + let i = t, a = r, o = D(null), m = D(null), ie = D(null), ae = D(null), oe = D(null), O = D({ + x: 0, + y: 0, + w: 0, + h: 0 + }), se = D(!1), ce = null, le = D(null), ue = D(!1), k = null, A = null, j = 0; + async function de() { + if (i.kind !== "audio" || A || k) return; + let e = q(), t = window.AudioContext || window.webkitAudioContext; + if (e && t) try { + if (k = new t(), await k.resume?.(), k.state !== "running") { + k.close?.(), k = null; + return; + } + let n = k.createMediaElementSource(e); + A = k.createAnalyser(), A.fftSize = 256, A.smoothingTimeConstant = .78, n.connect(A), A.connect(k.destination), ue.value = !0, fe(); + } catch (e) { + console.debug?.(e); + } + } + function fe() { + cancelAnimationFrame(j); + let e = le.value, t = e?.getContext("2d"); + if (!e || !t || !A) return; + let n = e.width = e.clientWidth || 480, r = e.height = e.clientHeight || 160, i = new Uint8Array(A.frequencyBinCount); + A.getByteFrequencyData(i), t.clearRect(0, 0, n, r); + let a = Math.min(64, i.length), o = Math.max(2, (n - 3 * (a - 1)) / a); + t.fillStyle = getComputedStyle(e).getPropertyValue("--mjr-accent").trim() || "#4fa3ff"; + for (let e = 0; e < a; e++) { + let n = i[Math.min(i.length - 1, Math.floor((e / a) ** 1.6 * i.length))] / 255, s = Math.max(2, n * r); + t.globalAlpha = .35 + n * .65, t.fillRect(e * (o + 3), r - s, o, s); + } + t.globalAlpha = 1, M.value && (j = requestAnimationFrame(fe)); + } + let M = D(!1), N = D(0), P = D(0), F = D(0), I = D(1), L = D(!!i.initialMuted), R = D(Number(i.initialRate) > 0 ? Number(i.initialRate) : 1), z = D(!0), B = D(null), V = D(null), pe = D(null), me = D(!1), H = D(!0), U = D(""), he = null, ge = 0, W = _(() => i.fps && i.fps > 0 ? i.fps : null), G = _(() => qe(N.value, W.value)), _e = _(() => Xe(P.value, W.value, i.frameCount)), ve = _(() => P.value > 0 ? N.value / P.value * 100 : 0), ye = _(() => P.value > 0 ? F.value / P.value * 100 : 0), K = _(() => Ze({ + a: B.value, + b: V.value + }, P.value)), be = _(() => { + if (!K.value || P.value <= 0) return null; + let e = K.value.a / P.value * 100, t = (K.value.b - K.value.a) / P.value * 100; + return { + left: `${e}%`, + width: `${t}%` + }; + }), xe = _(() => pe.value == null || P.value <= 0 ? null : pe.value / 100 * P.value); + function q() { + return o.value; + } + let Se = _(() => i.kind === "video" && !!i.compareSrc && !!i.compare && i.compare !== "off"), Ce = _(() => Se.value && i.compare === "side"), we = _(() => Se.value && (i.compare === "wipe" || i.compare === "wipeV")), Te = _(() => Math.max(0, Math.min(100, Number(i.wipe ?? 50)))), Ee = _(() => { + let e = Se.value ? Le(i.compare || "off") : null; + if (e) return { mixBlendMode: e }; + if (we.value) { + let e = O.value; + return i.compare === "wipeV" ? { clipPath: `inset(${e.y + e.h * Te.value / 100}px 0 0 0)` } : { clipPath: `inset(0 0 0 ${e.x + e.w * Te.value / 100}px)` }; + } + return {}; + }), De = _(() => ({ + left: `${O.value.x}px`, + top: `${O.value.y}px`, + width: `${O.value.w}px`, + height: `${O.value.h}px` + })); + function Oe() { + let e = o.value; + if (!(e instanceof HTMLVideoElement) || !ae.value) return; + let t = e.clientWidth, n = e.clientHeight, r = e.videoWidth, i = e.videoHeight; + if (!t || !n || !r || !i) { + O.value = { + x: e.offsetLeft, + y: e.offsetTop, + w: t, + h: n + }; + return; + } + let a = Math.min(t / r, n / i), s = r * a, c = i * a; + O.value = { + x: e.offsetLeft + (t - s) / 2, + y: e.offsetTop + (n - c) / 2, + w: s, + h: c + }; + } + function ke(e = !1) { + let t = q(), n = oe.value; + if (!t || !n || !Se.value) return; + n.muted = !0, n.playbackRate !== t.playbackRate && (n.playbackRate = t.playbackRate); + let r = Math.min(t.currentTime || 0, Number.isFinite(n.duration) ? n.duration : Infinity); + if (e || Math.abs((n.currentTime || 0) - r) > .08) try { + n.currentTime = r; + } catch (e) { + console.debug?.(e); + } + t.paused && !n.paused ? n.pause() : !t.paused && n.paused && n.play()?.catch?.(() => {}); + } + function Ae(e) { + let t = ae.value?.getBoundingClientRect(), n = O.value, r = e.target?.tagName === "VIDEO" && (Ce.value || !t || e.clientX >= t.left + n.x && e.clientX <= t.left + n.x + n.w && e.clientY >= t.top + n.y && e.clientY <= t.top + n.y + n.h); + i.lightDismiss && !r ? a("dismiss") : $(); + } + function J(e) { + i.lightDismiss && e.target === m.value && a("dismiss"); + } + function je(e) { + let t = ae.value?.getBoundingClientRect(), n = O.value; + if (!t || n.w <= 0 || n.h <= 0) return; + let r = i.compare === "wipeV" ? (e.clientY - t.top - n.y) / n.h : (e.clientX - t.left - n.x) / n.w; + a("update:wipe", Math.round(Math.max(0, Math.min(1, r)) * 1e3) / 10); + } + function Y(e) { + se.value = !0, e.currentTarget?.setPointerCapture?.(e.pointerId), je(e); + } + function X(e) { + se.value && je(e); + } + function Z() { + let e = q(); + if (e) { + N.value = e.currentTime || 0; + let t = Qe(N.value, { + a: B.value, + b: V.value + }, P.value); + t != null && M.value && (e.currentTime = t, N.value = t), ke(t != null); + } + M.value && (ge = requestAnimationFrame(Z)); + } + function Me() { + M.value = !0, cancelAnimationFrame(ge), ge = requestAnimationFrame(Z), ke(!0), i.kind === "audio" && (A ? fe() : de()), Tt(); + } + function Q() { + M.value = !1, cancelAnimationFrame(ge), ke(!0), wt(); + } + function Ne() { + let e = q(); + P.value = Number.isFinite(e?.duration) ? Number(e?.duration) : 0, U.value = "", e && (e.volume = I.value, e.muted = L.value, e.playbackRate = R.value), c(Oe); + } + function Pe() { + let e = q(); + if (e) { + M.value || (N.value = e.currentTime || 0); + try { + let t = e.buffered; + F.value = t.length ? t.end(t.length - 1) : 0; + } catch { + F.value = 0; + } + } + } + function Fe() { + if (z.value && !K.value) { + let e = q(); + e && (e.currentTime = 0, e.play()?.catch?.(() => {})); + } else a("ended"); + } + function Ie() { + U.value = e("viewer.studio.mediaError", "This file cannot be played by the browser."); + } + function $() { + let e = q(); + e && (e.paused ? e.play()?.catch?.(() => {}) : e.pause()); + } + function Re(e) { + let t = q(); + if (!t || !Number.isFinite(e)) return; + let n = P.value > 0 ? P.value : e; + t.currentTime = Math.max(0, Math.min(e, n)), N.value = t.currentTime, ke(!0); + } + function ze(e) { + let t = q(); + t && (t.paused || t.pause(), Re(Ye(t.currentTime || 0, W.value, e, P.value))); + } + function Be(e) { + Re((q()?.currentTime || 0) + e); + } + function Ve(e) { + let t = ie.value?.getBoundingClientRect(); + return !t || t.width <= 0 ? 0 : Math.max(0, Math.min(100, (e.clientX - t.left) / t.width * 100)); + } + function He(e) { + P.value <= 0 || (me.value = !0, e.currentTarget?.setPointerCapture?.(e.pointerId), Re(Ve(e) / 100 * P.value)); + } + function Ue(e) { + pe.value = Ve(e), me.value && Re(pe.value / 100 * P.value); + } + function We(e) { + me.value = !1, e.currentTarget?.releasePointerCapture?.(e.pointerId); + } + function Ge(e) { + R.value = e; + let t = q(); + t && (t.playbackRate = e); + } + function Je(e = 1, t = !1) { + let n = $e, r = n.indexOf(R.value), i = (r < 0 ? n.indexOf(1) : r) + e; + t && (i = (i + n.length) % n.length), Ge(n[Math.max(0, Math.min(n.length - 1, i))]); + } + function et() { + L.value = !L.value; + let e = q(); + e && (e.muted = L.value); + } + let tt = D(!1); + function nt(e) { + if (e.type === "pointerdown") tt.value = !0, e.currentTarget?.setPointerCapture?.(e.pointerId); + else if (!tt.value) return; + let t = e.currentTarget.getBoundingClientRect(), n = t.width > 0 ? (e.clientX - t.left) / t.width : 1; + rt(Math.round(Math.max(0, Math.min(1, n)) * 20) / 20); + } + function rt(e) { + I.value = e; + let t = q(); + t && (t.volume = I.value, I.value > 0 && L.value && (L.value = !1, t.muted = !1)); + } + function yt() { + B.value = N.value, V.value != null && V.value <= B.value && (V.value = null); + } + function bt() { + V.value = N.value, B.value ??= 0; + } + function xt() { + B.value = null, V.value = null; + } + function St() { + let e = m.value; + e && (document.fullscreenElement ? document.exitFullscreen?.() : e.requestFullscreen?.()); + } + async function Ct() { + let e = q(); + if (i.kind !== "video" || !(e instanceof HTMLVideoElement) || !e.videoWidth) return; + let t = document.createElement("canvas"); + t.width = e.videoWidth, t.height = e.videoHeight, t.getContext("2d")?.drawImage(e, 0, 0); + let n = await new Promise((e) => t.toBlob(e, "image/png")); + if (!n) return; + let r = URL.createObjectURL(n), a = String(i.filename || "frame").replace(/\.[^.]+$/, ""), o = document.createElement("a"); + o.href = r, o.download = `${a}_f${String(G.value).padStart(5, "0")}.png`, o.click(), setTimeout(() => URL.revokeObjectURL(r), 1e3); + } + function wt() { + H.value = !0, Tt(); + } + function Tt() { + he && clearTimeout(he), he = setTimeout(() => { + M.value && !me.value && i.kind === "video" && (H.value = !1); + }, 2200); + } + function Et(e) { + if (e) try { + e.pause(), e.removeAttribute("src"), e.load(); + } catch (e) { + console.debug?.(e); + } + } + function Dt() { + Et(oe.value), Et(q()); + } + ne(() => i.src, () => { + xt(), N.value = 0, P.value = 0, F.value = 0, U.value = ""; + }); + function Ot() { + let e = q(); + if (!e) return; + e.muted = L.value, e.playbackRate = R.value; + let t = e.play?.(); + t && typeof t.catch == "function" && t.catch(() => { + e.muted || (L.value = !0, e.muted = !0, e.play?.()?.catch?.(() => {})); + }); + } + return ne([ + Se, + () => i.compareSrc, + () => i.compare + ], () => void c(() => { + Oe(), ke(!0); + })), ee(() => { + Ot(); + try { + ce = new ResizeObserver(() => Oe()), ae.value && ce.observe(ae.value); + } catch (e) { + console.debug?.(e); + } + }), v(() => { + ce?.disconnect(), cancelAnimationFrame(j); + try { + k?.close?.(); + } catch (e) { + console.debug?.(e); + } + k = null, A = null, cancelAnimationFrame(ge), he && clearTimeout(he), Dt(); + }), n({ + togglePlay: $, + play: Ot, + stepFrame: ze, + seekBy: Be, + cycleRate: Je, + toggleMute: et, + setLoopA: yt, + setLoopB: bt, + clearLoop: xt, + toggleFullscreen: St, + exportFrame: Ct, + release: Dt, + getSource: () => o.value instanceof HTMLVideoElement ? o.value : null, + getBox: () => i.kind === "video" ? ae.value?.querySelector(".mjr-studio-player__box") : null, + isPlaying: () => M.value + }), (n, r) => { + let i = te("MButton"); + return y(), w("div", { + ref_key: "root", + ref: m, + class: T(["mjr-studio-player", { + "is-audio": t.kind === "audio", + "is-compact": t.compact, + "controls-hidden": !H.value + }]), + onPointermove: wt, + onClick: J + }, [ + t.kind === "video" ? (y(), w("div", { + key: 0, + ref_key: "screen", + ref: ae, + class: T(["mjr-studio-player__screen", { "is-side": Ce.value }]), + onClick: Ae, + onDblclick: St + }, [ + d("div", { + class: "mjr-studio-player__layers", + style: S(t.mediaFilter ? { filter: t.mediaFilter } : void 0) + }, [d("video", { + ref_key: "media", + ref: o, + class: T(["mjr-studio-player__media", t.mediaClass]), + src: t.src, + playsinline: "", + preload: "auto", + onPlay: Me, + onPause: Q, + onLoadedmetadata: Ne, + onTimeupdate: Pe, + onProgress: Pe, + onEnded: Fe, + onError: Ie + }, null, 42, it), Se.value ? (y(), w("video", { + ref_key: "mediaB", + ref: oe, + key: `b:${t.compareSrc}`, + class: "mjr-studio-player__media is-b", + src: t.compareSrc || "", + playsinline: "", + muted: "", + preload: "auto", + style: S(Ee.value), + onLoadedmetadata: r[0] ||= (e) => ke(!0) + }, null, 44, at)) : p("", !0)], 4), + d("div", { + class: "mjr-studio-player__box", + style: S(De.value) + }, [re(n.$slots, "overlay", { + width: O.value.w, + height: O.value.h + }), we.value ? (y(), w("div", { + key: 0, + class: T(["mjr-studio-stage__divider", { + "is-vertical": t.compare === "wipeV", + "is-active": se.value + }]), + style: S(t.compare === "wipeV" ? { top: `${Te.value}%` } : { left: `${Te.value}%` }), + onClick: r[1] ||= g(() => {}, ["stop"]), + onDblclick: r[2] ||= g((e) => a("update:wipe", 50), ["stop"]), + onPointerdown: g(Y, ["stop"]), + onPointermove: X, + onPointerup: r[3] ||= (e) => se.value = !1, + onPointercancel: r[4] ||= (e) => se.value = !1 + }, [...r[12] ||= [d("span", { class: "mjr-studio-stage__divider-grip" }, null, -1)]], 38)) : p("", !0)], 4), + Se.value ? (y(), w("div", ot, [ + r[13] ||= d("span", null, "A", -1), + d("span", st, x(t.compare === "wipeV" ? "/" : "|"), 1), + r[14] ||= d("span", null, "B", -1) + ])) : p("", !0) + ], 34)) : (y(), w("div", { + key: 1, + class: T(["mjr-studio-player__audio-art", { "has-spectrum": ue.value }]), + onClick: $ + }, [ + s(d("canvas", { + ref_key: "spectrum", + ref: le, + class: "mjr-studio-player__spectrum", + "aria-hidden": "true" + }, null, 512), [[b, ue.value]]), + s(d("i", ct, null, 512), [[b, !ue.value]]), + d("span", null, x(t.filename), 1), + d("audio", { + ref_key: "media", + ref: o, + src: t.src, + preload: "auto", + onPlay: Me, + onPause: Q, + onLoadedmetadata: Ne, + onTimeupdate: Pe, + onProgress: Pe, + onEnded: Fe, + onError: Ie + }, null, 40, lt) + ], 2)), + !M.value && !U.value ? (y(), u(i, { + key: 2, + type: "button", + class: "mjr-studio-player__big-play", + "aria-label": E(e)("viewer.studio.play", "Play"), + onClick: $ + }, { + default: h(() => [...r[15] ||= [d("i", { + class: "pi pi-play", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["aria-label"])) : p("", !0), + U.value ? (y(), w("div", ut, x(U.value), 1)) : p("", !0), + d("div", { + class: "mjr-studio-player__controls", + onPointerdown: r[11] ||= g(() => {}, ["stop"]) + }, [d("div", { + ref_key: "track", + ref: ie, + class: "mjr-studio-player__track", + role: "slider", + "aria-label": E(e)("viewer.studio.seek", "Seek"), + "aria-valuemin": 0, + "aria-valuemax": P.value, + "aria-valuenow": N.value, + onPointerdown: He, + onPointermove: Ue, + onPointerup: We, + onPointerleave: r[5] ||= (e) => pe.value = null + }, [ + d("div", { + class: "mjr-studio-player__buffered", + style: S({ width: `${ye.value}%` }) + }, null, 4), + be.value ? (y(), w("div", { + key: 0, + class: "mjr-studio-player__loop", + style: S(be.value) + }, null, 4)) : p("", !0), + d("div", { + class: "mjr-studio-player__progress", + style: S({ width: `${ve.value}%` }) + }, null, 4), + d("div", { + class: "mjr-studio-player__thumb", + style: S({ left: `${ve.value}%` }) + }, null, 4), + xe.value == null ? p("", !0) : (y(), w("div", { + key: 1, + class: "mjr-studio-player__hover", + style: S({ left: `${pe.value}%` }) + }, [C(x(E(Ke)(xe.value)), 1), W.value ? (y(), w(l, { key: 0 }, [C(" · f" + x(E(qe)(xe.value, W.value)), 1)], 64)) : p("", !0)], 4)) + ], 40, dt), d("div", ft, [ + f(i, { + type: "button", + class: "mjr-studio-btn", + title: E(e)("viewer.studio.playPause", "Play / pause (Space)"), + onClick: $ + }, { + default: h(() => [d("i", { + class: T(M.value ? "pi pi-pause" : "pi pi-play"), + "aria-hidden": "true" + }, null, 2)]), + _: 1 + }, 8, ["title"]), + t.kind === "video" ? (y(), w(l, { key: 0 }, [f(i, { + type: "button", + class: "mjr-studio-btn", + title: E(e)("viewer.studio.prevFrame", "Previous frame (,)"), + onClick: r[6] ||= (e) => ze(-1) + }, { + default: h(() => [...r[16] ||= [d("i", { + class: "pi pi-step-backward", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"]), f(i, { + type: "button", + class: "mjr-studio-btn", + title: E(e)("viewer.studio.nextFrame", "Next frame (.)"), + onClick: r[7] ||= (e) => ze(1) + }, { + default: h(() => [...r[17] ||= [d("i", { + class: "pi pi-step-forward", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"])], 64)) : p("", !0), + d("span", pt, [C(x(E(Ke)(N.value)) + " ", 1), d("span", mt, "/ " + x(E(Ke)(P.value)), 1)]), + t.kind === "video" && W.value ? (y(), w("span", { + key: 1, + class: "mjr-studio-chip", + title: E(e)("viewer.studio.frame", "Frame") + }, [ + C(" f " + x(G.value), 1), + _e.value ? (y(), w(l, { key: 0 }, [C(" / " + x(_e.value - 1), 1)], 64)) : p("", !0), + C(" · " + x(Math.round(W.value * 100) / 100) + " fps ", 1) + ], 8, ht)) : p("", !0), + r[24] ||= d("span", { class: "mjr-studio-player__spacer" }, null, -1), + d("div", { + class: "mjr-studio-player__group", + title: E(e)("viewer.studio.abLoop", "A-B loop (I / O, U to clear)") + }, [ + f(i, { + type: "button", + class: T(["mjr-studio-btn is-text", { "is-on": B.value != null }]), + onClick: yt + }, { + default: h(() => [...r[18] ||= [C("A", -1)]]), + _: 1 + }, 8, ["class"]), + f(i, { + type: "button", + class: T(["mjr-studio-btn is-text", { "is-on": V.value != null }]), + onClick: bt + }, { + default: h(() => [...r[19] ||= [C("B", -1)]]), + _: 1 + }, 8, ["class"]), + B.value != null || V.value != null ? (y(), u(i, { + key: 0, + type: "button", + class: "mjr-studio-btn", + title: E(e)("viewer.studio.clearLoop", "Clear A-B loop"), + onClick: xt + }, { + default: h(() => [...r[20] ||= [d("i", { + class: "pi pi-times", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"])) : p("", !0) + ], 8, gt), + f(i, { + type: "button", + class: T(["mjr-studio-btn", { "is-on": z.value }]), + title: E(e)("viewer.studio.loop", "Loop"), + onClick: r[8] ||= (e) => z.value = !z.value + }, { + default: h(() => [...r[21] ||= [d("i", { + class: "pi pi-replay", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["class", "title"]), + f(i, { + type: "button", + class: T(["mjr-studio-btn is-text", { "is-on": R.value !== 1 }]), + title: E(e)("viewer.studio.speed", "Speed ([ / ])"), + onClick: r[9] ||= (e) => Je(1, !0) + }, { + default: h(() => [C(x(R.value) + "×", 1)]), + _: 1 + }, 8, ["class", "title"]), + d("div", _t, [f(i, { + type: "button", + class: "mjr-studio-btn", + title: E(e)("viewer.studio.mute", "Mute (M)"), + onClick: et + }, { + default: h(() => [d("i", { + class: T(L.value || I.value === 0 ? "pi pi-volume-off" : "pi pi-volume-up"), + "aria-hidden": "true" + }, null, 2)]), + _: 1 + }, 8, ["title"]), d("div", { + class: "mjr-studio-player__volume", + role: "slider", + "aria-label": E(e)("viewer.studio.volume", "Volume"), + "aria-valuemin": 0, + "aria-valuemax": 1, + "aria-valuenow": L.value ? 0 : I.value, + onPointerdown: nt, + onPointermove: nt, + onPointerup: r[10] ||= (e) => tt.value = !1 + }, [d("div", { + class: "mjr-studio-player__volume-fill", + style: S({ width: `${(L.value ? 0 : I.value) * 100}%` }) + }, null, 4)], 40, vt)]), + t.kind === "video" ? (y(), u(i, { + key: 2, + type: "button", + class: "mjr-studio-btn", + title: E(e)("viewer.studio.exportFrame", "Save this frame as PNG"), + onClick: Ct + }, { + default: h(() => [...r[22] ||= [d("i", { + class: "pi pi-camera", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"])) : p("", !0), + t.kind === "video" ? (y(), u(i, { + key: 3, + type: "button", + class: "mjr-studio-btn", + title: E(e)("viewer.studio.fullscreen", "Fullscreen (F)"), + onClick: St + }, { + default: h(() => [...r[23] ||= [d("i", { + class: "pi pi-window-maximize", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title"])) : p("", !0) + ])], 32) + ], 34); + }; + } +}), bt = (e, t = null) => { + let n = r(e); + return n === void 0 ? t : n; +}, xt = n?.VIEWER_GENINFO_TTL_MS ?? 3e4, St = n?.VIEWER_GENINFO_ERROR_TTL_MS ?? 8e3, Ct = n?.VIEWER_GENINFO_MAX_ENTRIES ?? 300, wt = /* @__PURE__ */ new Map(), Tt = /* @__PURE__ */ new Map(), Et = /* @__PURE__ */ new Map(), Dt = (e, t, n) => { + try { + let r = Date.now(); + for (let [n, i] of e.entries()) i ? r - (i.at || 0) > t && e.delete(n) : e.delete(n); + if (e.size <= n) return; + let i = Array.from(e.entries()).sort((e, t) => (e?.[1]?.at || 0) - (t?.[1]?.at || 0)), a = e.size - n; + for (let t = 0; t < a; t++) { + let n = i[t]?.[0]; + n != null && e.delete(n); + } + } catch (e) { + console.debug?.(e); + } +}, Ot = (e, t, n) => { + try { + let r = e.get(t); + return r ? Date.now() - (r.at || 0) > n ? (e.delete(t), null) : r.data ?? null : null; + } catch { + return null; + } +}, kt = (e, t, n, r, i) => { + try { + e.set(t, { + at: Date.now(), + data: n + }), Dt(e, r, i); + } catch (e) { + console.debug?.(e); + } +}, At = (e) => { + try { + let t = e?.id; + if (t != null) return `id:${t}`; + let n = It(e); + if (n) return `fp:${n}`; + let r = String(e?.filename || e?.name || "").trim(), i = String(e?.subfolder || "").trim(), a = String(e?.source || e?.type || "output").trim().toLowerCase(); + if (r) return `name:${a}:${i}:${r}`; + } catch (e) { + console.debug?.(e); + } + return null; +}, jt = (e) => { + try { + if (!e || typeof e != "object") return null; + let t = e?.metadata_raw; + return t && typeof t == "object" && t.geninfo_status && typeof t.geninfo_status == "object" ? t.geninfo_status : e?.geninfo_status && typeof e.geninfo_status == "object" ? e.geninfo_status : null; + } catch { + return null; + } +}, Mt = (e, t) => { + try { + if (!e || typeof e != "object" || !t || typeof t != "object") return; + try { + e.geninfo_status = t; + } catch (e) { + console.debug?.(e); + } + try { + let n = e.metadata_raw; + if (n && typeof n == "object") { + n.geninfo_status = t, e.metadata_raw = n; + return; + } + if (typeof n == "string") return; + } catch (e) { + console.debug?.(e); + } + try { + e.metadata_raw = { geninfo_status: t }; + } catch (e) { + console.debug?.(e); + } + } catch (e) { + console.debug?.(e); + } +}, Nt = (e) => { + try { + if (!e || typeof e != "object") return !1; + if (e.geninfo && typeof e.geninfo == "object" && Object.keys(e.geninfo).length || e.prompt != null || e.workflow != null || e.metadata != null || e.exif != null) return !0; + let t = e.metadata_raw; + if (t && typeof t == "object") { + for (let e of [ + "geninfo", + "GenInfo", + "generation", + "prompt", + "Prompt", + "negative_prompt", + "workflow", + "Workflow", + "comfy_workflow", + "geninfo_status" + ]) if (t[e] != null) return !0; + return !1; + } + if (typeof t == "string") { + let e = t.trim(); + if (!e || e === "{}" || e === "null" || e === "[]" || e === "{{}}") return !1; + for (let t of [ + "Negative prompt:", + "\"prompt\"", + "\"negative_prompt\"", + "\"geninfo\"", + "\"workflow\"", + "\"comfy_workflow\"" + ]) if (e.includes(t)) return !0; + return !1; + } + return !1; + } catch { + return !1; + } +}, Pt = (e) => { + let t = typeof e == "string" ? e.trim() : ""; + if (!t || t.includes("\n")) return !1; + if (/^[A-Za-z]:[\\/]/.test(t)) return !0; + let n = t.replace(/\\/g, "/"); + return /(?:^|\/)[^/\n]+\.(?:png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg)$/i.test(n); +}, Ft = (e) => { + try { + if (!e || typeof e != "object") return !1; + if (e.geninfo && typeof e.geninfo == "object" && Object.keys(e.geninfo).length) return !0; + if (e.metadata_raw && typeof e.metadata_raw == "object") { + let t = e.metadata_raw; + if (t.geninfo || t.GenInfo || t.generation || t.parameters || typeof t.prompt == "string" && t.prompt.trim() && !Pt(t.prompt) || t.prompt && typeof t.prompt == "object") return !0; + let n = t.raw_ffprobe?.format?.tags || t.ffprobe?.format?.tags || null; + if (n && typeof n == "object") { + let e = n.prompt || n["comfyui:prompt"] || n.comfy_prompt; + if (e && !Pt(e)) return !0; + } + } + return !!(e.prompt && typeof e.prompt == "object" || typeof e.prompt == "string" && e.prompt.trim() && !Pt(e.prompt)); + } catch { + return !1; + } +}, It = (e) => { + let t = e?.filepath || e?.path || e?.file_info?.filepath || e?.file_info?.path || e?.filePath || null; + return typeof t == "string" && t.trim() || null; +}, Lt = (e) => { + try { + if (String(e?.mime || e?.mimetype || e?.type || "").toLowerCase().startsWith("video/")) return !0; + let t = (It(e) || String(e?.filename || e?.name || "")).split(".").pop()?.toLowerCase?.() || ""; + return [ + "mp4", + "webm", + "mov", + "mkv", + "avi", + "m4v", + "gif" + ].includes(t); + } catch { + return !1; + } +}, Rt = (e) => { + if (!e) return null; + if (typeof e == "object") return e; + if (typeof e != "string") return null; + let t = e.trim(); + return t ? bt(() => { + let e = JSON.parse(t); + return e && typeof e == "object" ? e : null; + }, null) : null; +}, zt = (e) => { + try { + if (!Lt(e) || e?.geninfo || e?.prompt || e?.workflow || e?.metadata) return; + let t = Rt(e?.metadata_raw) || {}; + if (t.geninfo_status) return; + if (e?.geninfo_status) { + t.geninfo_status = e.geninfo_status, e.metadata_raw = t; + return; + } + t.geninfo_status = { kind: "media_pipeline" }, e.metadata_raw = t; + } catch (e) { + console.debug?.(e); + } +}, Bt = (e, t) => { + let n = t && typeof t == "object" ? t : null; + if (!n) return e; + try { + e.prompt = e.prompt ?? n.prompt; + } catch (e) { + console.debug?.(e); + } + try { + e.workflow = e.workflow ?? n.workflow; + } catch (e) { + console.debug?.(e); + } + try { + e.geninfo = e.geninfo ?? n.geninfo; + } catch (e) { + console.debug?.(e); + } + try { + e.geninfo_status = e.geninfo_status ?? n.geninfo_status; + } catch (e) { + console.debug?.(e); + } + try { + e.exif = e.exif ?? n.exif; + } catch (e) { + console.debug?.(e); + } + try { + e.ffprobe = e.ffprobe ?? n.ffprobe; + } catch (e) { + console.debug?.(e); + } + try { + if (e.metadata_raw == null) e.metadata_raw = n; + else { + let t = Rt(e.metadata_raw); + if (t && typeof t == "object") { + for (let e of [ + "geninfo_status", + "workflow", + "prompt", + "geninfo" + ]) (t[e] == null && n[e] != null || e === "prompt" && Pt(t[e]) && n[e] != null) && (t[e] = n[e]); + n.raw_ffprobe && t.raw_ffprobe == null && (t.raw_ffprobe = n.raw_ffprobe), n.ffprobe && t.ffprobe == null && (t.ffprobe = n.ffprobe), e.metadata_raw = t; + } + } + } catch (e) { + console.debug?.(e); + } + return e; +}; +async function Vt(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCache: r, signal: i } = {}) { + if (!e || typeof e != "object") return e; + let a = e?.id ?? null, o = At(e), s = e, c = o ? Ot(wt, o, xt) : null; + if (c && typeof c == "object") return { + ...e, + ...c + }; + let l = o ? Ot(Tt, o, St) : null; + if (l) { + try { + Mt(s, l); + } catch (e) { + console.debug?.(e); + } + return s; + } + if (o && Et.has(o)) try { + let e = Et.get(o); + if (e && typeof e.then == "function") return await e; + } catch (e) { + console.debug?.(e); + } + let u = async () => { + let c = a == null ? null : bt(() => r?.getCached?.(a)?.data || null, null); + c && typeof c == "object" && (s = { + ...e, + ...c + }); + let l = !!(s?.has_generation_data || s?.has_workflow || s?.has_generation || s?.has_generation_info), u = !!(s?.geninfo || s?.prompt || s?.workflow || s?.metadata), d = null; + if (a != null && (!Ft(s) || l && !u)) { + let e = await bt(() => t?.(a, i ? { signal: i } : {}), null); + e?.ok && e.data && typeof e.data == "object" ? (s = { + ...s, + ...e.data + }, bt(() => r?.setCached?.(a, e.data))) : e && e?.code !== "ABORTED" && (d = { + kind: "fetch_error", + stage: "asset", + code: e?.code || "FETCH_ERROR", + message: e?.error || "Failed to load asset metadata" + }); + } + if (!Ft(s)) try { + let e = String(s?.source || s?.type || "output").trim().toLowerCase() || "output", t = String(s?.filename || s?.name || s?.file_info?.filename || "").trim(), r = String(s?.subfolder || s?.file_info?.subfolder || "").trim(), a = String(s?.root_id || s?.rootId || s?.file_info?.root_id || "").trim(), o = String(s?.filepath || s?.path || s?.file_info?.filepath || "").trim(); + if (t) { + let c = await bt(() => n?.({ + type: e, + filename: t, + subfolder: r, + root_id: a, + filepath: o + }, i ? { signal: i } : {}), null); + c?.ok && c.data ? s = Bt({ ...s }, c.data) : c && c?.code !== "ABORTED" && (d = { + kind: "fetch_error", + stage: "file_scoped", + code: c?.code || "FETCH_ERROR", + message: c?.error || "Failed to extract file metadata" + }); + } + } catch (e) { + console.debug?.(e); + } + if (zt(s), !Nt(s) && d) { + let e = jt(s); + e && e.kind === "media_pipeline" || Mt(s, d); + } + return Ft(s) && o ? kt(wt, o, s, xt, Ct) : d && o && kt(Tt, o, d, St, Ct), s; + }; + if (o) { + let e = () => { + try { + Et.delete(o); + } catch (e) { + console.debug?.(e); + } + }; + try { + i?.addEventListener?.("abort", e, { once: !0 }); + } catch (e) { + console.debug?.(e); + } + let t = u().finally(() => { + try { + i?.removeEventListener?.("abort", e); + } catch (e) { + console.debug?.(e); + } + try { + Et.delete(o); + } catch (e) { + console.debug?.(e); + } + }); + return Et.set(o, t), await t; + } + return await u(); +} +export { Te as C, U as S, je as _, et as a, ze as b, Z as c, Ne as d, Pe as f, $ as g, J as h, rt as i, Ae as l, Ee as m, yt as n, Ge as o, Fe as p, tt as r, Re as s, Vt as t, Le as u, Me as v, Ce as w, Ie as x, Y as y }; diff --git a/dist/chunks/generationSectionState-DuXxSw-j.js b/dist/chunks/generationSectionState-DuXxSw-j.js new file mode 100644 index 00000000..4ebbcf9e --- /dev/null +++ b/dist/chunks/generationSectionState-DuXxSw-j.js @@ -0,0 +1,5338 @@ +import { $ as e, $t as t, B as n, Bn as r, Bt as i, Cn as a, Ct as o, Dt as s, Et as c, Fn as l, G as u, H as d, Ht as f, J as p, K as m, Kt as h, L as g, Mt as _, Nt as v, On as y, Pt as b, Qt as x, Rn as S, St as C, Tt as ee, U as te, Ut as w, V as ne, W as T, Wt as E, X as D, Y as O, Z as re, _n as ie, _t as ae, an as k, ar as A, bt as j, en as oe, et as se, gt as ce, hn as le, ht as ue, in as M, jt as de, k as fe, kt as pe, mt as me, n as N, nn as he, nt as ge, pr as _e, pt as ve, q as ye, rn as be, t as P, tn as xe, tt as Se, vt as Ce, wt as we, xn as Te, xt as Ee, yn as De, yt as Oe } from "./config-C9a-wT5M.js"; +// ui/utils/events.ts +function ke(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { + let i = n || (typeof window < "u" ? window : null); + if (!i || typeof i.dispatchEvent != "function") return !1; + try { + return i.dispatchEvent(new CustomEvent(e, { detail: t })); + } catch (t) { + try { + console.warn(`${r} Failed to dispatch event: ${e}`, t); + } catch (e) { + console.debug?.(e); + } + return !1; + } +} +// ui/app/settings/settingsUtils.ts +var F = (e, t) => { + if (typeof e == "boolean") return e; + if (typeof e == "string") { + let t = e.trim().toLowerCase(); + if ([ + "1", + "true", + "yes", + "on" + ].includes(t)) return !0; + if ([ + "0", + "false", + "no", + "off" + ].includes(t)) return !1; + } + return !!t; +}, I = (e, t) => { + let n = Number(e); + return Number.isFinite(n) ? n : Number(t); +}, Ae = (e, t, n) => { + let r = typeof e == "string" ? e.trim() : String(e ?? ""); + return t.includes(r) ? r : n; +}, je = (e) => e === "__proto__" || e === "prototype" || e === "constructor", Me = (e, t) => { + let n = { ...e }; + return !t || typeof t != "object" || Object.keys(t).forEach((r) => { + if (je(r)) return; + let i = t[r]; + i && typeof i == "object" && !Array.isArray(i) ? n[r] = Me(e[r] || {}, i) : i !== void 0 && (n[r] = i); + }), n; +}, Ne = Object.freeze({ + small: 80, + medium: 120, + large: 180 +}), Pe = Object.freeze([ + "small", + "medium", + "large" +]), Fe = (e, t) => Math.max(60, Math.min(600, Math.round(I(e, t)))), Ie = (e = {}) => { + let t = Number(e?.minSize); + if (Number.isFinite(t)) return Fe(t, N.GRID_MIN_SIZE); + let n = Ae(String(e?.minSizePreset || "").toLowerCase(), Pe, ""); + return n ? Ne[n] : Fe(e?.minSize, N.GRID_MIN_SIZE); +}, Le = (e = {}) => Fe(e?.minSize, N.FEED_GRID_MIN_SIZE), Re = (e) => { + let t = Math.round(I(e, N.GRID_MIN_SIZE)); + return t <= 100 ? "small" : t >= 150 ? "large" : "medium"; +}, ze = async (e, t = "Majoor", n = {}) => { + let r = Ue(); + if (r && typeof r.alert == "function") try { + await r.alert({ + title: String(t || "Majoor"), + message: String(e || "") + }); + return; + } catch (e) { + console.debug?.(e); + } + let i = We(); + if (i) try { + let n = String(e || ""); + typeof i.info == "function" ? i.info(String(t || "Majoor"), { + description: n, + duration: 5e3, + closable: !0 + }) : typeof i.addAlert == "function" ? i.addAlert(n) : typeof i.add == "function" && i.add({ + severity: "info", + summary: String(t || "Majoor"), + detail: n, + life: 5e3 + }); + return; + } catch (e) { + console.debug?.(e); + } + if (n?.native !== !1) { + let n = Ge(); + if (n) try { + n.show(Ke(e, t)); + try { + n.element?.style?.setProperty?.("z-index", "1100"); + } catch (e) { + console.debug?.(e); + } + return; + } catch (e) { + console.debug?.(e); + } + } + let a = Ze(); + if (a) return new Promise((n) => { + let r = new a(); + tt(r); + let i = L("div", { style: { + display: "flex", + flexDirection: "column", + gap: "18px", + padding: "18px 20px 18px 20px" + } }, [ + L("div", { style: { + display: "flex", + alignItems: "center", + justifyContent: "flex-start" + } }, [L("div", { + textContent: t, + style: { + fontWeight: "700", + fontSize: "30px", + color: "rgba(255,255,255,0.96)", + lineHeight: "1.2" + } + })]), + L("div", { + textContent: String(e || ""), + style: { + fontSize: "22px", + color: "rgba(255,255,255,0.86)", + whiteSpace: "pre-wrap", + lineHeight: "1.45" + } + }), + L("div", { style: { + display: "flex", + justifyContent: "flex-end", + gap: "10px" + } }, [L("button", { + textContent: M("dialog.confirm", "Confirm"), + onclick: () => { + try { + r.close(); + } catch (e) { + console.debug?.(e); + } + n(); + }, + style: { + padding: "10px 16px", + borderRadius: "10px", + border: "1px solid rgba(17,132,255,0.75)", + background: "#1184ff", + color: "rgba(255,255,255,0.98)", + fontWeight: "600", + cursor: "pointer" + } + })]) + ]); + try { + r.show(i), setTimeout(() => nt(r), 0); + } catch { + try { + window.alert(e); + } catch (e) { + console.debug?.(e); + } + n(); + } + }); + try { + window.alert(e); + } catch (e) { + console.debug?.(e); + } +}, Be = async (e, t = "Majoor") => { + let n = Ue(); + if (n) try { + let r = { + title: String(t || M("dialog.confirm", "Confirm")), + message: String(e || "") + }; + return !!(typeof n.confirm == "function" && await n.confirm(r)); + } catch (e) { + console.debug?.(e); + } + let r = Ze(); + if (!r) try { + return window.confirm(e); + } catch { + return !1; + } + return new Promise((n) => { + let i = new r(); + tt(i); + let a = (e) => { + try { + i.close(); + } catch (e) { + console.debug?.(e); + } + n(!!e); + }, o = L("div", { style: { + display: "flex", + flexDirection: "column", + gap: "18px", + padding: "18px 20px 18px 20px" + } }, [ + L("div", { style: { + display: "flex", + alignItems: "center", + justifyContent: "flex-start" + } }, [L("div", { + textContent: t, + style: { + fontWeight: "700", + fontSize: "30px", + color: "rgba(255,255,255,0.96)", + lineHeight: "1.2" + } + })]), + L("div", { + textContent: String(e || ""), + style: { + fontSize: "22px", + color: "rgba(255,255,255,0.86)", + whiteSpace: "pre-wrap", + lineHeight: "1.45" + } + }), + L("div", { style: { + display: "flex", + justifyContent: "flex-end", + gap: "10px" + } }, [L("button", { + textContent: M("dialog.cancel", "Cancel"), + onclick: () => a(!1), + style: { + padding: "10px 16px", + borderRadius: "10px", + border: "1px solid rgba(255,255,255,0.18)", + background: "rgba(255,255,255,0.06)", + color: "rgba(255,255,255,0.85)", + fontWeight: "600", + cursor: "pointer" + } + }), L("button", { + textContent: M("dialog.confirm", "Confirm"), + onclick: () => a(!0), + style: { + padding: "10px 16px", + borderRadius: "10px", + border: "1px solid rgba(17,132,255,0.75)", + background: "#1184ff", + color: "rgba(255,255,255,0.98)", + fontWeight: "600", + cursor: "pointer" + } + })]) + ]); + try { + i.show(o), setTimeout(() => nt(i), 0); + } catch { + try { + n(!!window.confirm(e)); + } catch { + n(!1); + } + } + }); +}, Ve = async (e, t = "", n = "Majoor") => { + let r = Ue(); + if (r) try { + let i = { + title: String(n || M("dialog.prompt", "Prompt")), + message: String(e || ""), + defaultValue: String(t ?? "") + }, a = typeof r.prompt == "function" ? await r.prompt(i) : null; + return a == null ? null : String(a); + } catch (e) { + console.debug?.(e); + } + let i = Ze(); + if (!i) try { + return window.prompt(e, t); + } catch { + return null; + } + return new Promise((r) => { + let a = new i(); + tt(a); + let o = (e) => { + try { + a.close(); + } catch (e) { + console.debug?.(e); + } + r(e ?? null); + }, s = L("input", { + type: "text", + value: String(t ?? ""), + style: { + width: "100%", + padding: "10px 10px", + borderRadius: "10px", + border: "1px solid rgba(255,255,255,0.12)", + background: "rgba(0,0,0,0.25)", + color: "rgba(255,255,255,0.9)", + outline: "none", + boxSizing: "border-box" + }, + onkeydown: (e) => { + e.key === "Enter" && o(s.value), e.key === "Escape" && o(null), e.stopPropagation(); + } + }), c = L("div", { style: { + display: "flex", + flexDirection: "column", + gap: "12px", + padding: "16px" + } }, [ + L("div", { + textContent: n, + style: { + fontWeight: "600", + fontSize: "14px", + color: "rgba(255,255,255,0.95)" + } + }), + L("div", { + textContent: String(e || ""), + style: { + fontSize: "13px", + color: "rgba(255,255,255,0.80)", + whiteSpace: "pre-wrap", + lineHeight: "1.4" + } + }), + s, + L("div", { style: { + display: "flex", + justifyContent: "flex-end", + gap: "10px" + } }, [L("button", { + textContent: M("dialog.cancel", "Cancel"), + onclick: () => o(null), + style: { + padding: "8px 12px", + borderRadius: "8px", + border: "1px solid rgba(255,255,255,0.12)", + background: "rgba(0,0,0,0.25)", + color: "rgba(255,255,255,0.85)", + cursor: "pointer" + } + }), L("button", { + textContent: M("dialog.ok", "OK"), + onclick: () => o(s.value), + style: { + padding: "8px 12px", + borderRadius: "8px", + border: "1px solid rgba(95,179,255,0.45)", + background: "rgba(95,179,255,0.18)", + color: "rgba(255,255,255,0.95)", + cursor: "pointer" + } + })]) + ]); + try { + a.show(c), setTimeout(() => nt(a), 0), setTimeout(() => { + try { + s.focus(), s.select(); + } catch (e) { + console.debug?.(e); + } + }, 0); + } catch { + try { + r(window.prompt(e, t)); + } catch { + r(null); + } + } + }); +}, He = () => { + try { + return Te()?.ui || null; + } catch { + return null; + } +}, Ue = () => { + let e = (e) => !!e && (typeof e.alert == "function" || typeof e.confirm == "function" || typeof e.prompt == "function"); + try { + let t = ie(); + if (e(t)) return t; + } catch (e) { + console.debug?.(e); + } + return null; +}, We = () => { + try { + let e = De(); + if (e) return e; + } catch (e) { + console.debug?.(e); + } + return null; +}, Ge = () => { + try { + let e = He(); + if (e?.dialog && typeof e.dialog.show == "function") return e.dialog; + } catch (e) { + console.debug?.(e); + } + return null; +}, Ke = (e, t = "Majoor") => { + let n = String(e ?? ""), r = String(t ?? "").trim(); + return !r || r.toLowerCase() === "majoor" ? n : `${r}

${n}`; +}, qe = /* @__PURE__ */ new Set(/* @__PURE__ */ "abort.blur.change.click.close.contextmenu.dblclick.dragend.dragenter.dragleave.dragover.dragstart.drop.error.focus.input.keydown.keypress.keyup.load.mousedown.mouseenter.mouseleave.mousemove.mouseout.mouseover.mouseup.reset.resize.scroll.select.submit.touchcancel.touchend.touchmove.touchstart.transitionend.unload.wheel".split(".")), Je = /* @__PURE__ */ new Set([ + "__proto__", + "constructor", + "prototype", + "innerHTML", + "outerHTML", + "srcdoc", + "__defineGetter__", + "__defineSetter__", + "__lookupGetter__", + "__lookupSetter__" +]), Ye = /* @__PURE__ */ new Set([ + "id", + "name", + "value", + "type", + "checked", + "disabled", + "placeholder", + "title", + "textContent", + "htmlFor", + "role", + "tabIndex" +]), Xe = (e, t = {}, n = []) => { + let r = document.createElement(e); + return Object.entries(t || {}).forEach(([e, t]) => { + let n = String(e || ""); + if (n && !Je.has(n)) { + if (e === "style" && t && typeof t == "object") Object.assign(r.style, t); + else if (e === "className") r.className = String(t); + else if (n.startsWith("on")) { + if (typeof t == "function") { + let e = n.slice(2).toLowerCase(); + qe.has(e) && r.addEventListener(e, t); + } + } else { + if (Ye.has(n)) try { + r[n] = t; + return; + } catch (e) { + console.debug?.(e); + } + try { + r.setAttribute(n, String(t)); + } catch (e) { + console.debug?.(e); + } + } + } + }), (Array.isArray(n) ? n : [n]).filter(Boolean).forEach((e) => { + try { + r.appendChild(e); + } catch { + r.appendChild(document.createTextNode(String(e))); + } + }), r; +}, L = (e, t, n) => { + let r = He(); + if (r?.$el) try { + return r.$el(e, t, n); + } catch {} + return Xe(e, t, n); +}, Ze = () => He()?.ComfyDialog || null, Qe = 999999, $e = 560, et = 12, tt = (e) => { + try { + e.element.style.zIndex = String(Qe), e.element.style.width = `${$e}px`, e.element.style.padding = "0", e.element.style.backgroundColor = "var(--comfy-menu-bg, #131722)", e.element.style.border = "1px solid rgba(255,255,255,0.14)", e.element.style.borderRadius = `${et}px`, e.element.style.boxSizing = "border-box", e.element.style.overflow = "hidden", e.element.style.boxShadow = "0 18px 48px rgba(0,0,0,0.48)"; + } catch (e) { + console.debug?.(e); + } +}, nt = (e) => { + try { + let t = e?.element; + if (!t) return; + let n = t.querySelectorAll("button,[role='button']"); + for (let e of n) { + let t = String(e?.textContent || "").trim().toLowerCase(), n = String(e?.getAttribute?.("aria-label") || "").trim().toLowerCase(); + if (t === "close" || n === "close") try { + e.style.display = "none"; + } catch (e) { + console.debug?.(e); + } + } + } catch (e) { + console.debug?.(e); + } +}, R = { + debug: { + safeCall: N.DEBUG_SAFE_CALL, + safeListeners: N.DEBUG_SAFE_LISTENERS, + viewer: N.DEBUG_VIEWER + }, + grid: { + pageSize: N.DEFAULT_PAGE_SIZE, + minSize: N.GRID_MIN_SIZE, + minSizePreset: Re(N.GRID_MIN_SIZE), + gap: N.GRID_GAP, + showExtBadge: N.GRID_SHOW_BADGES_EXTENSION, + showRatingBadge: N.GRID_SHOW_BADGES_RATING, + showTagsBadge: N.GRID_SHOW_BADGES_TAGS, + showDetails: N.GRID_SHOW_DETAILS, + showFilename: N.GRID_SHOW_DETAILS_FILENAME, + showDate: N.GRID_SHOW_DETAILS_DATE, + showDimensions: N.GRID_SHOW_DETAILS_DIMENSIONS, + showGenTime: N.GRID_SHOW_DETAILS_GENTIME, + showHoverInfo: N.GRID_SHOW_HOVER_INFO, + showWorkflowDot: N.GRID_SHOW_WORKFLOW_DOT, + workflowGroupBy: N.WORKFLOW_GRID_GROUP_BY, + videoAutoplayMode: N.GRID_VIDEO_AUTOPLAY_MODE, + starColor: N.BADGE_STAR_COLOR, + badgeImageColor: N.BADGE_IMAGE_COLOR, + badgeVideoColor: N.BADGE_VIDEO_COLOR, + badgeAudioColor: N.BADGE_AUDIO_COLOR, + badgeModel3dColor: N.BADGE_MODEL3D_COLOR, + badgeDuplicateAlertColor: N.BADGE_DUPLICATE_ALERT_COLOR + }, + infiniteScroll: { + enabled: N.INFINITE_SCROLL_ENABLED, + rootMargin: N.INFINITE_SCROLL_ROOT_MARGIN, + threshold: N.INFINITE_SCROLL_THRESHOLD, + bottomGapPx: N.BOTTOM_GAP_PX + }, + siblings: { hidePngSiblings: !0 }, + autoScan: { onStartup: N.AUTO_SCAN_ON_STARTUP }, + scan: { + fastMode: !0, + jxlEnabled: !1 + }, + watcher: { + enabled: !0, + debounceMs: N.WATCHER_DEBOUNCE_MS, + dedupeTtlMs: N.WATCHER_DEDUPE_TTL_MS, + maxPending: 500, + minSize: 100, + maxSize: 4294967296 + }, + safety: { confirmDeletion: !0 }, + status: { pollInterval: N.STATUS_POLL_INTERVAL }, + viewer: { + pauseDuringExecution: N.VIEWER_PAUSE_DURING_EXECUTION, + floatingPauseDuringExecution: N.FLOATING_VIEWER_PAUSE_DURING_EXECUTION, + mfvLiveDefault: N.MFV_LIVE_DEFAULT, + mfvPreviewDefault: N.MFV_PREVIEW_DEFAULT, + mfvTopbarButton: N.MFV_TOPBAR_BUTTON, + mfvSidebarPosition: "right", + mfvPreviewMethod: N.MFV_PREVIEW_METHOD, + mfvKjPreviewOverrideEnabled: N.MFV_KJ_PREVIEW_OVERRIDE_ENABLED, + ltxavRgbFallback: !1 + }, + browser: { showFolders: !1 }, + rtHydrate: { + concurrency: N.RT_HYDRATE_CONCURRENCY, + queueMax: N.RT_HYDRATE_QUEUE_MAX, + seenMax: N.RT_HYDRATE_SEEN_MAX, + pruneBudget: N.RT_HYDRATE_PRUNE_BUDGET, + seenTtlMs: N.RT_HYDRATE_SEEN_TTL_MS + }, + observability: { + enabled: !1, + runtimeDashboardMode: "autoHide30", + verboseErrors: !1, + verboseRouteRegistrationLogs: !1, + verboseStartupLogs: !1 + }, + feed: { + minSize: N.FEED_GRID_MIN_SIZE, + showInfo: N.FEED_SHOW_INFO, + showFilename: N.FEED_SHOW_FILENAME, + showDimensions: N.FEED_SHOW_DIMENSIONS, + showDate: N.FEED_SHOW_DATE, + showGenTime: N.FEED_SHOW_GENTIME, + showWorkflowDot: N.FEED_SHOW_WORKFLOW_DOT, + showExtBadge: N.FEED_SHOW_BADGES_EXTENSION, + showRatingBadge: N.FEED_SHOW_BADGES_RATING, + showTagsBadge: N.FEED_SHOW_BADGES_TAGS + }, + sidebar: { + position: "right", + showPreviewThumb: !0, + widthPx: 360, + assetBadgeEnabled: N.SIDEBAR_ASSET_BADGE_ENABLED + }, + integration: { hideNativeAssetsTab: !1 }, + probeBackend: { mode: "auto" }, + i18n: { followComfyLanguage: !0 }, + metadataFallback: { + image: !0, + media: !0 + }, + paths: { + outputDirectory: "", + inputDirectory: "", + indexDirectory: "", + workflowRoots: "" + }, + db: { + timeoutMs: 5e3, + maxConnections: 10, + queryTimeoutMs: 1e3 + }, + ratingTagsSync: { enabled: !0 }, + cache: { tagsTTLms: 3e4 }, + search: { maxResults: N.SEARCH_DEFAULT_LIMIT }, + ai: { + vectorSearchEnabled: !0, + vectorCaptionOnIndex: !1, + verboseAiLogs: !1 + }, + executionGrouping: { enabled: N.EXECUTION_GROUPING_ENABLED }, + workflowMinimap: { + enabled: N.WORKFLOW_MINIMAP_ENABLED, + nodeColors: !0, + showLinks: !0, + showGroups: !0, + renderBypassState: !0, + renderErrorState: !0, + showViewport: !0, + showNodeLabels: !1, + size: "comfortable" + }, + ui: { + cardHoverColor: N.UI_CARD_HOVER_COLOR, + cardSelectionColor: N.UI_CARD_SELECTION_COLOR, + ratingColor: N.UI_RATING_COLOR, + tagColor: N.UI_TAG_COLOR + }, + security: { + safeMode: !1, + allowWrite: !0, + requireAuth: !1, + allowRemoteWrite: !1, + allowInsecureTokenTransport: !1, + allowDelete: !0, + allowRename: !0, + allowOpenInFolder: !0, + allowResetIndex: !0, + apiToken: "", + tokenConfigured: !1, + tokenHint: "" + } +}, z = () => { + try { + let e = k.get(_e); + if (!e) return { ...R }; + let t = JSON.parse(e), n = t && typeof t == "object" && Number.isInteger(t.version) && t.data && typeof t.data == "object"; + if (!n && (!t || typeof t != "object" || Array.isArray(t))) return { ...R }; + if (n && Number(t.version) > 1) return console.warn("[Majoor] settings schema version is newer than this build, using defaults"), { ...R }; + let r = n ? t.data : t, i = /* @__PURE__ */ new Set(/* @__PURE__ */ "debug.grid.infiniteScroll.siblings.autoScan.scan.watcher.status.viewer.rtHydrate.observability.feed.sidebar.probeBackend.i18n.paths.db.ratingTagsSync.cache.search.ai.executionGrouping.workflowMinimap.ui.security.safety".split(".")), a = {}; + if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) i.has(e) && (a[e] = t); + let o = Me(R, a); + if (!n) try { + B(o); + } catch (e) { + console.debug?.(e); + } + return o; + } catch (e) { + return console.warn("[Majoor] settings load failed, using defaults", e), { ...R }; + } +}, B = (e) => { + try { + let t = JSON.parse(JSON.stringify(e || {})); + t?.security && typeof t.security == "object" && (t.security.apiToken = ""); + let n = { + version: 1, + data: t + }; + if (!k.set("mjrSettings", JSON.stringify(n))) throw Error("SettingsStore rejected the write"); + } catch (e) { + console.warn("[Majoor] settings save failed", e); + try { + let e = Date.now(); + e - (Number(window?._mjrSettingsSaveFailAt || 0) || 0) > 3e4 && (window._mjrSettingsSaveFailAt = e, ze(M("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked)."))); + } catch (e) { + console.debug?.(e); + } + try { + ke("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); + } catch (e) { + console.debug?.(e); + } + } +}, V = (e) => { + let t = Number(N.MAX_PAGE_SIZE) || 2e3, n = Math.max(50, Math.min(t, Number(e.grid?.pageSize) || N.DEFAULT_PAGE_SIZE)); + P.DEFAULT_PAGE_SIZE = n, P.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, P.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? N.EXECUTION_GROUPING_ENABLED), P.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || N.STATUS_POLL_INTERVAL), P.DEBUG_SAFE_CALL = !!e.debug?.safeCall, P.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, P.DEBUG_VIEWER = !!e.debug?.viewer, P.GRID_MIN_SIZE = Ie(e.grid), P.FEED_GRID_MIN_SIZE = Le(e.feed), P.GRID_GAP = Math.max(0, Math.min(40, Math.round(I(e.grid?.gap, N.GRID_GAP)))), P.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? N.GRID_SHOW_BADGES_EXTENSION), P.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? N.GRID_SHOW_BADGES_RATING), P.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? N.GRID_SHOW_BADGES_TAGS), P.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? N.GRID_SHOW_DETAILS), P.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? N.GRID_SHOW_DETAILS_FILENAME), P.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? N.GRID_SHOW_DETAILS_DATE), P.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? N.GRID_SHOW_DETAILS_DIMENSIONS), P.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? N.GRID_SHOW_DETAILS_GENTIME), P.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? N.GRID_SHOW_HOVER_INFO), P.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? N.GRID_SHOW_WORKFLOW_DOT); + { + let t = String(e.grid?.workflowGroupBy ?? N.WORKFLOW_GRID_GROUP_BY).toLowerCase(); + P.WORKFLOW_GRID_GROUP_BY = [ + "none", + "task", + "model", + "category" + ].includes(t) ? t : N.WORKFLOW_GRID_GROUP_BY; + } + P.FEED_SHOW_INFO = !!(e.feed?.showInfo ?? N.FEED_SHOW_INFO), P.FEED_SHOW_FILENAME = !!(e.feed?.showFilename ?? N.FEED_SHOW_FILENAME), P.FEED_SHOW_DIMENSIONS = !!(e.feed?.showDimensions ?? N.FEED_SHOW_DIMENSIONS), P.FEED_SHOW_DATE = !!(e.feed?.showDate ?? N.FEED_SHOW_DATE), P.FEED_SHOW_GENTIME = !!(e.feed?.showGenTime ?? N.FEED_SHOW_GENTIME), P.FEED_SHOW_WORKFLOW_DOT = !!(e.feed?.showWorkflowDot ?? N.FEED_SHOW_WORKFLOW_DOT), P.FEED_SHOW_BADGES_EXTENSION = !!(e.feed?.showExtBadge ?? N.FEED_SHOW_BADGES_EXTENSION), P.FEED_SHOW_BADGES_RATING = !!(e.feed?.showRatingBadge ?? N.FEED_SHOW_BADGES_RATING), P.FEED_SHOW_BADGES_TAGS = !!(e.feed?.showTagsBadge ?? N.FEED_SHOW_BADGES_TAGS); + { + let t = e.grid?.videoAutoplayMode ?? N.GRID_VIDEO_AUTOPLAY_MODE; + t ??= e.grid?.videoHoverAutoplay === !1 ? "off" : "hover", t === !0 && (t = "hover"), t === !1 && (t = "off"), t !== "hover" && t !== "always" && t !== "off" && (t = "hover"), P.GRID_VIDEO_AUTOPLAY_MODE = t; + } + let r = (e, t) => { + let n = String(e || "").trim(); + return /^[0-9a-fA-F]{6}$/.test(n) && (n = `#${n}`), /^#[0-9a-fA-F]{3,8}$/.test(n) ? n : t; + }; + P.BADGE_STAR_COLOR = r(e.grid?.starColor, N.BADGE_STAR_COLOR), P.BADGE_IMAGE_COLOR = r(e.grid?.badgeImageColor, N.BADGE_IMAGE_COLOR), P.BADGE_VIDEO_COLOR = r(e.grid?.badgeVideoColor, N.BADGE_VIDEO_COLOR), P.BADGE_AUDIO_COLOR = r(e.grid?.badgeAudioColor, N.BADGE_AUDIO_COLOR), P.BADGE_MODEL3D_COLOR = r(e.grid?.badgeModel3dColor, N.BADGE_MODEL3D_COLOR), P.BADGE_DUPLICATE_ALERT_COLOR = r(e.grid?.badgeDuplicateAlertColor, N.BADGE_DUPLICATE_ALERT_COLOR), P.UI_CARD_HOVER_COLOR = r(e.ui?.cardHoverColor, N.UI_CARD_HOVER_COLOR), P.UI_CARD_SELECTION_COLOR = r(e.ui?.cardSelectionColor, N.UI_CARD_SELECTION_COLOR), P.UI_RATING_COLOR = r(e.ui?.ratingColor, N.UI_RATING_COLOR), P.UI_TAG_COLOR = r(e.ui?.tagColor, N.UI_TAG_COLOR); + try { + let e = Array.from(document.querySelectorAll(".mjr-assets-manager")); + for (let t of e) t.style.setProperty("--mjr-star-active", P.BADGE_STAR_COLOR), t.style.setProperty("--mjr-badge-image", P.BADGE_IMAGE_COLOR), t.style.setProperty("--mjr-badge-video", P.BADGE_VIDEO_COLOR), t.style.setProperty("--mjr-badge-audio", P.BADGE_AUDIO_COLOR), t.style.setProperty("--mjr-badge-model3d", P.BADGE_MODEL3D_COLOR), t.style.setProperty("--mjr-badge-duplicate-alert", P.BADGE_DUPLICATE_ALERT_COLOR), t.style.setProperty("--mjr-card-hover-color", P.UI_CARD_HOVER_COLOR), t.style.setProperty("--mjr-card-selection-color", P.UI_CARD_SELECTION_COLOR), t.style.setProperty("--mjr-rating-color", P.UI_RATING_COLOR), t.style.setProperty("--mjr-tag-color", P.UI_TAG_COLOR); + } catch (e) { + console.debug?.(e); + } + P.INFINITE_SCROLL_ENABLED = !!e.infiniteScroll?.enabled, P.INFINITE_SCROLL_ROOT_MARGIN = String(e.infiniteScroll?.rootMargin || N.INFINITE_SCROLL_ROOT_MARGIN), P.INFINITE_SCROLL_THRESHOLD = Math.max(0, Math.min(1, I(e.infiniteScroll?.threshold, N.INFINITE_SCROLL_THRESHOLD))), P.BOTTOM_GAP_PX = Math.max(0, Math.min(5e3, Math.round(I(e.infiniteScroll?.bottomGapPx, N.BOTTOM_GAP_PX)))), P.VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.pauseDuringExecution ?? N.VIEWER_PAUSE_DURING_EXECUTION), P.FLOATING_VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.floatingPauseDuringExecution ?? N.FLOATING_VIEWER_PAUSE_DURING_EXECUTION), P.MFV_LIVE_DEFAULT = e.viewer?.mfvLiveDefault ?? N.MFV_LIVE_DEFAULT, P.MFV_PREVIEW_DEFAULT = e.viewer?.mfvPreviewDefault ?? N.MFV_PREVIEW_DEFAULT, P.MFV_KJ_PREVIEW_OVERRIDE_ENABLED = !!(e.viewer?.mfvKjPreviewOverrideEnabled ?? N.MFV_KJ_PREVIEW_OVERRIDE_ENABLED), P.MFV_TOPBAR_BUTTON = !!(e.viewer?.mfvTopbarButton ?? N.MFV_TOPBAR_BUTTON), P.MFV_LIVE_AUTO_OPEN = !1, P.MFV_PREVIEW_AUTO_OPEN = !1, P.MFV_NODE_STREAM_AUTO_OPEN = !1; + { + let t = String(e.viewer?.mfvPreviewMethod || N.MFV_PREVIEW_METHOD).toLowerCase(); + P.MFV_PREVIEW_METHOD = [ + "default", + "auto", + "latent2rgb", + "taesd", + "none" + ].includes(t) ? t : N.MFV_PREVIEW_METHOD; + } + { + let t = String(e.viewer?.mfvSidebarPosition || "right").toLowerCase(); + P.MFV_SIDEBAR_POSITION = [ + "left", + "right", + "bottom" + ].includes(t) ? t : "right"; + } + P.WORKFLOW_MINIMAP_ENABLED = !!(e.workflowMinimap?.enabled ?? N.WORKFLOW_MINIMAP_ENABLED), P.RT_HYDRATE_CONCURRENCY = Math.max(1, Math.min(16, Math.round(I(e.rtHydrate?.concurrency, N.RT_HYDRATE_CONCURRENCY)))), P.RT_HYDRATE_QUEUE_MAX = Math.max(10, Math.min(5e3, Math.round(I(e.rtHydrate?.queueMax, N.RT_HYDRATE_QUEUE_MAX)))), P.RT_HYDRATE_SEEN_MAX = Math.max(1e3, Math.min(2e5, Math.round(I(e.rtHydrate?.seenMax, N.RT_HYDRATE_SEEN_MAX)))), P.RT_HYDRATE_PRUNE_BUDGET = Math.max(10, Math.min(1e4, Math.round(I(e.rtHydrate?.pruneBudget, N.RT_HYDRATE_PRUNE_BUDGET)))), P.RT_HYDRATE_SEEN_TTL_MS = Math.max(5e3, Math.min(216e5, Math.round(I(e.rtHydrate?.seenTtlMs, N.RT_HYDRATE_SEEN_TTL_MS)))), P.DELETE_CONFIRMATION = !!e.safety?.confirmDeletion, P.DEBUG_VERBOSE_ERRORS = !!e.observability?.verboseErrors, P.WATCHER_MAX_PENDING = Math.max(10, Math.min(5e3, Math.round(I(e.watcher?.maxPending, 500)))), P.WATCHER_MIN_SIZE = Math.max(0, Math.min(1e6, Math.round(I(e.watcher?.minSize, 100)))), P.WATCHER_MAX_SIZE = Math.max(1e5, Math.min(17179869184, Math.round(I(e.watcher?.maxSize, 4294967296)))), P.DB_TIMEOUT_MS = Math.max(1e3, Math.min(3e4, Math.round(I(e.db?.timeoutMs, 5e3)))), P.DB_MAX_CONNECTIONS = Math.max(1, Math.min(100, Math.round(I(e.db?.maxConnections, 10)))), P.DB_QUERY_TIMEOUT_MS = Math.max(500, Math.min(1e4, Math.round(I(e.db?.queryTimeoutMs, 1e3)))), P.SIDEBAR_ASSET_BADGE_ENABLED = !!(e.sidebar?.assetBadgeEnabled ?? N.SIDEBAR_ASSET_BADGE_ENABLED), P.SEARCH_REQUEST_LIMIT = Math.max(10, Math.min(N.MAX_PAGE_SIZE || 2e3, Math.round(I(e.search?.maxResults, N.SEARCH_DEFAULT_LIMIT)))); +}; +async function rt() { + try { + let e = await D(); + if (!e?.ok) return; + let t = e.data?.prefs; + if (!t || typeof t != "object") return; + let n = z(); + if (n.security = n.security || {}, n.security.safeMode = F(t.safe_mode, n.security.safeMode), n.security.allowWrite = F(t.allow_write, n.security.allowWrite), n.security.requireAuth = F(t.require_auth, n.security.requireAuth), n.security.allowRemoteWrite = F(t.allow_remote_write, n.security.allowRemoteWrite), n.security.allowInsecureTokenTransport = F(t.allow_insecure_token_transport, n.security.allowInsecureTokenTransport), n.security.allowDelete = F(t.allow_delete, n.security.allowDelete), n.security.allowRename = F(t.allow_rename, n.security.allowRename), n.security.allowOpenInFolder = F(t.allow_open_in_folder, n.security.allowOpenInFolder), n.security.allowResetIndex = F(t.allow_reset_index, n.security.allowResetIndex), n.security.tokenConfigured = F(t.token_configured, n.security.tokenConfigured), n.security.tokenHint = String(t.token_hint || "").trim(), !String(n.security.apiToken || "").trim()) try { + let e = await fe(), t = String(e?.data?.token || "").trim(); + e?.ok && t && w(t); + } catch (e) { + console.debug?.(e); + } + B(n), V(n), ke("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); + } catch (e) { + console.warn("[Majoor] failed to sync backend security settings", e); + } +} +async function it() { + try { + let t = await e(); + if (!t?.ok) return; + let n = t.data?.prefs; + if (!n || typeof n != "object") return; + let r = z(); + r.ai = r.ai || {}, r.ai.vectorSearchEnabled = F(n.enabled, r.ai.vectorSearchEnabled ?? !0), r.ai.vectorCaptionOnIndex = F(n.caption_on_index ?? n.captionOnIndex, r.ai.vectorCaptionOnIndex ?? !1), r.ai.vectorIndexOnScan = F(n.index_on_scan ?? n.indexOnScan, r.ai.vectorIndexOnScan ?? !1), r.ai.vectorUnloadAfterUse = F(n.unload_after_use ?? n.unloadAfterUse, r.ai.vectorUnloadAfterUse ?? !1), r.ai.vectorConcurrency = Math.max(1, Math.min(16, Math.floor(Number(n.concurrency ?? r.ai.vectorConcurrency ?? 1) || 1))), B(r), V(r), ke("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); + } catch (e) { + console.warn("[Majoor] failed to sync backend vector search settings", e); + } +} +async function at() { + try { + let e = await n(); + if (!e?.ok) return; + let t = e.data?.prefs; + if (!t || typeof t != "object") return; + let r = z(); + r.executionGrouping = r.executionGrouping || {}, r.executionGrouping.enabled = F(t.enabled, r.executionGrouping.enabled ?? N.EXECUTION_GROUPING_ENABLED), B(r), V(r), ke("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); + } catch (e) { + console.warn("[Majoor] failed to sync backend execution grouping settings", e); + } +} +// ui/app/settings/settingsRuntime.ts +var ot = "mjr-runtime-status-dashboard", st = 3e4; +function ct() { + try { + let e = z(), t = String(e?.observability?.runtimeDashboardMode || R.observability.runtimeDashboardMode); + return [ + "autoHide30", + "always", + "hidden" + ].includes(t) ? t : "autoHide30"; + } catch { + return "autoHide30"; + } +} +function lt() { + try { + document.getElementById(ot)?.remove?.(); + } catch (e) { + console.debug?.(e); + } +} +function ut() { + try { + window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ && (clearTimeout(window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__), window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = null); + } catch (e) { + console.debug?.(e); + } +} +function dt(e, t) { + let n = t === "auth" ? "__mjrAuthLine" : "__mjrMetricsLine"; + if (e?.[n]) return e[n]; + let r = document.createElement("div"); + return r.style.whiteSpace = "nowrap", r.style.lineHeight = "1.35", t === "auth" && (r.style.marginTop = "4px", r.style.fontWeight = "600"), e.appendChild(r), e[n] = r, r; +} +function ft(e) { + let t = String(e?.token_hint || "").trim(), n = f(), r = t || (n ? "(session)" : ""), i = e?.allow_write !== !1, a = e?.require_auth === !0, o = e?.token_configured === !0; + return i ? n ? { + text: M("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: r || "(session)" }), + color: "#7ee0a0" + } : a && o ? { + text: M("runtime.writeAuthMissing", "Write auth: missing in this browser {tokenHint}", { tokenHint: r || "(server token configured)" }), + color: "#f1c36d" + } : a ? { + text: M("runtime.writeAuthRequired", "Write auth: required"), + color: "#f1c36d" + } : e && typeof e == "object" ? { + text: M("runtime.writeAuthNotRequired", "Write auth: not required"), + color: "#8fd0ff" + } : { + text: M("runtime.writeAuthUnknown", "Write auth: unknown"), + color: "#c8ced8" + } : { + text: M("runtime.writeAuthBlocked", "Write auth: writes blocked by server"), + color: "#ff9b9b" + }; +} +function pt() { + try { + if (ct() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return lt(), null; + let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(ot); + if (!e) { + try { + t?.remove?.(); + } catch (e) { + console.debug?.(e); + } + return null; + } + try { + let t = String(getComputedStyle(e).position || "").toLowerCase(); + t && t !== "static" || (e.style.position = "relative"); + } catch (e) { + console.debug?.(e); + } + let n = document.getElementById(ot); + return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = ot, n.style.position = "absolute", n.style.bottom = "10px", n.style.right = "10px", n.style.zIndex = "9999", n.style.padding = "6px 10px", n.style.borderRadius = "10px", n.style.border = "1px solid rgba(255,255,255,0.16)", n.style.background = "rgba(0,0,0,0.45)", n.style.backdropFilter = "blur(4px)", n.style.color = "var(--content-fg, #fff)", n.style.fontSize = "11px", n.style.pointerEvents = "none", n.style.display = "flex", n.style.flexDirection = "column", e.appendChild(n)), n; + } catch { + return null; + } +} +async function mt() { + let e = pt(); + if (!e) return !1; + let t = dt(e, "metrics"), n = dt(e, "auth"); + try { + let [r, i] = await Promise.all([O(), D()]), a = M("runtime.unavailable", "Runtime: unavailable"); + if (!r?.ok || !r?.data) t.textContent = a; + else { + let e = r.data.db || {}, n = r.data.index || {}, i = r.data.watcher || {}, o = Number(e.active_connections || 0), s = Number(n.enrichment_queue_length || 0), c = Number(i.pending_files || 0); + t.textContent = M("runtime.metricsLine", "DB active: {active} | Enrich Q: {enrichQ} | Watcher pending: {pending}", { + active: o, + enrichQ: s, + pending: c + }), a = M("runtime.metricsTitle", "Runtime Metrics\nDB active connections: {active}\nEnrichment queue: {enrichQ}\nWatcher pending files: {pending}", { + active: o, + enrichQ: s, + pending: c + }); + } + let o = ft(i?.data?.prefs || null); + return n.textContent = o.text, n.style.color = o.color, e.title = `${a}\n${o.text}`, !0; + } catch { + return t.textContent = M("runtime.unavailable", "Runtime: unavailable"), n.textContent = M("runtime.writeAuthUnknown", "Write auth: unknown"), n.style.color = "#c8ced8", e.title = `${M("runtime.unavailable", "Runtime: unavailable")}\n${n.textContent}`, !0; + } +} +function ht() { + try { + let e = ct(); + if (e === "hidden") { + window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, ut(), lt(); + return; + } + window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ || (window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ = (e) => { + if (e?.detail?.key !== "observability.runtimeDashboardMode") return; + let t = ct(); + window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", ut(), lt(), t !== "hidden" && ht(); + }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, ut(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => { + window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, lt(); + }, st)), mt().catch(() => {}), window.__MJR_RUNTIME_STATUS_INFLIGHT__ ?? (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1), window.__MJR_RUNTIME_STATUS_MISS_COUNT__ ?? (window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0), window.__MJR_RUNTIME_STATUS_INTERVAL__ || (window.__MJR_RUNTIME_STATUS_INTERVAL__ = setInterval(() => { + window.__MJR_RUNTIME_STATUS_INFLIGHT__ || (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !0, mt().then((e) => { + e ? window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0 : window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = Number(window.__MJR_RUNTIME_STATUS_MISS_COUNT__ || 0) + 1; + }).catch(() => {}).finally(() => { + window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1; + })); + }, 1e4)); + } catch (e) { + console.debug?.(e); + } +} +// ui/utils/debounce.ts +var gt = 300; +function _t(e, t = gt) { + let n, r = (...r) => { + clearTimeout(n), n = setTimeout(() => e(...r), t); + }; + return r.cancel = () => { + clearTimeout(n); + }, r.flush = (...t) => { + clearTimeout(n), e(...t); + }, r; +} +// ui/features/runtime/nativeAssetsTab.ts +var vt = /* @__PURE__ */ new Set([ + "assets", + "media-assets", + "assets-sidebar" +]), yt = [ + 500, + 2e3, + 6e3 +], bt = !1, xt = /* @__PURE__ */ new Map(), St = []; +function Ct(e) { + let t = String(e?.id || "").trim().toLowerCase(); + return !t || t.startsWith("majoor") || t.startsWith("mjr") ? !1 : vt.has(t); +} +function wt() { + for (let e of St.splice(0)) clearTimeout(e); +} +function Tt() { + let e = 0; + for (let t of y()) { + if (!Ct(t)) continue; + let n = String(t.id); + r(n) && (xt.set(n, t), e += 1); + } + return e; +} +function Et() { + for (let [e, t] of [...xt.entries()]) (y().some((t) => String(t?.id || "") === e) || l(t)) && xt.delete(e); +} +function Dt(e) { + if (bt = !!e, wt(), !bt) Et(); + else { + Tt(); + for (let e of yt) St.push(setTimeout(() => { + bt && Tt(); + }, e)); + } +} +function Ot() { + bt = !1, wt(), Et(); +} +// ui/app/settings/settingsGrid.ts +var H = "Majoor", kt = "Majoor Assets Manager"; +function At(e, t, n) { + let r = (e, t) => [ + kt, + e, + t + ], i = (e) => [ + kt, + M("cat.cards", "Cards"), + e + ], a = (e) => [ + kt, + M("cat.badges", "Badges"), + e + ], o = (e) => [ + kt, + M("cat.badges", "Badges"), + e + ], s = (e, t) => { + let n = String(e || "").trim(); + return /^[0-9a-fA-F]{6}$/.test(n) && (n = `#${n}`), /^#[0-9a-fA-F]{6}$/.test(n) ? n.toUpperCase() : t; + }; + t.grid?.minSizePreset || (t.grid = t.grid || {}, t.grid.minSizePreset = Re(t.grid.minSize), B(t)), e({ + id: `${H}.Cards.ThumbSize`, + category: i(M("setting.grid.cardSize.group", "Card size")), + name: M("setting.grid.cardSize.name", "Majoor: Card Size"), + tooltip: M("setting.grid.cardSize.desc", "Choose the card size preset used by the grid layout."), + type: "combo", + defaultValue: (() => { + let e = Ae(String(t.grid?.minSizePreset || "").toLowerCase(), Pe, Re(t.grid?.minSize)), n = { + small: M("setting.grid.cardSize.small", "Small"), + medium: M("setting.grid.cardSize.medium", "Medium"), + large: M("setting.grid.cardSize.large", "Large") + }; + return n[e] || n.medium; + })(), + options: [ + M("setting.grid.cardSize.small", "Small"), + M("setting.grid.cardSize.medium", "Medium"), + M("setting.grid.cardSize.large", "Large") + ], + onChange: (e) => { + let r = String(e || "").trim().toLowerCase(), i = M("setting.grid.cardSize.small", "Small").toLowerCase(), a = M("setting.grid.cardSize.medium", "Medium").toLowerCase(), o = M("setting.grid.cardSize.large", "Large").toLowerCase(), s = "medium"; + r === i || r === "small" || r === "petit" ? s = "small" : r === o || r === "large" || r === "grand" ? s = "large" : (r === a || r === "medium" || r === "moyen") && (s = "medium"), t.grid.minSizePreset = s, t.grid.minSize = Ne[s], B(t), V(t), n("grid.minSizePreset"); + } + }), e({ + id: `${H}.Cards.CustomThumbSize`, + category: i(M("setting.grid.cardSize.group", "Card size")), + name: "Majoor: Custom Card Size (px)", + tooltip: "Set the minimum card width used by the main grid layout (60-600 px).", + type: "number", + defaultValue: Math.max(60, Math.min(600, Number(t.grid?.minSize) || 120)), + attrs: { + min: 60, + max: 600, + step: 10 + }, + onChange: (e) => { + let r = Math.max(60, Math.min(600, Math.round(Number(e) || 120))); + t.grid.minSize = r, t.grid.minSizePreset = Re(r), B(t), V(t), n("grid.minSize"); + } + }), e({ + id: `${H}.Grid.ShowDetails`, + category: i("Show card details"), + name: "Show metadata panel", + tooltip: "Show the bottom details panel on asset cards (filename, date, etc.)", + type: "boolean", + defaultValue: !!t.grid?.showDetails, + onChange: (e) => { + t.grid.showDetails = !!e, B(t), V(t), n("grid.showDetails"); + } + }), e({ + id: `${H}.Grid.ShowFilename`, + category: i("Show filename"), + name: "Show filename", + tooltip: "Display filename in details panel", + type: "boolean", + defaultValue: !!t.grid?.showFilename, + onChange: (e) => { + t.grid.showFilename = !!e, B(t), V(t), n("grid.showFilename"); + } + }), e({ + id: `${H}.Grid.ShowDate`, + category: i("Show date/time"), + name: "Show date/time", + tooltip: "Display date and time in details panel", + type: "boolean", + defaultValue: !!t.grid?.showDate, + onChange: (e) => { + t.grid.showDate = !!e, B(t), V(t), n("grid.showDate"); + } + }), e({ + id: `${H}.Grid.ShowDimensions`, + category: i("Show dimensions"), + name: "Show dimensions", + tooltip: "Display resolution (WxH) in details panel", + type: "boolean", + defaultValue: !!t.grid?.showDimensions, + onChange: (e) => { + t.grid.showDimensions = !!e, B(t), V(t), n("grid.showDimensions"); + } + }), e({ + id: `${H}.Grid.ShowGenTime`, + category: i("Show generation time"), + name: "Show generation time", + tooltip: "Display seconds taken to generate the asset (if available)", + type: "boolean", + defaultValue: !!(t.grid?.showGenTime ?? N.GRID_SHOW_DETAILS_GENTIME), + onChange: (e) => { + t.grid.showGenTime = !!e, B(t), V(t), n("grid.showGenTime"); + } + }), e({ + id: `${H}.Grid.ShowHoverInfo`, + category: i("Show prompt on hover"), + name: "Show prompt on hover", + tooltip: "Show positive prompt and generation time as a tooltip overlay when hovering over a card thumbnail. Does not block video play-on-hover.", + type: "boolean", + defaultValue: !!(t.grid?.showHoverInfo ?? N.GRID_SHOW_HOVER_INFO), + onChange: (e) => { + t.grid.showHoverInfo = !!e, B(t), V(t), n("grid.showHoverInfo"); + } + }), e({ + id: `${H}.Grid.ShowWorkflowDot`, + category: i("Show workflow dot"), + name: "Show workflow indicator", + tooltip: "Display the green dot indicating workflow metadata availability (bottom right of card)", + type: "boolean", + defaultValue: !!t.grid?.showWorkflowDot, + onChange: (e) => { + t.grid.showWorkflowDot = !!e, B(t), V(t), n("grid.showWorkflowDot"); + } + }), e({ + id: `${H}.Grid.ShowExtBadge`, + category: a("Show format badges"), + name: "Show format badges", + tooltip: "Display format badges (e.g. JPG, MP4) on thumbnails", + type: "boolean", + defaultValue: !!t.grid?.showExtBadge, + onChange: (e) => { + t.grid.showExtBadge = !!e, B(t), V(t), n("grid.showExtBadge"); + } + }), e({ + id: `${H}.Grid.ShowRatingBadge`, + category: a("Show rating badges"), + name: "Show ratings", + tooltip: "Display star ratings on thumbnails", + type: "boolean", + defaultValue: !!t.grid?.showRatingBadge, + onChange: (e) => { + t.grid.showRatingBadge = !!e, B(t), V(t), n("grid.showRatingBadge"); + } + }), e({ + id: `${H}.Grid.ShowTagsBadge`, + category: a("Show tags badges"), + name: "Show tags", + tooltip: "Display a small indicator if an asset has tags", + type: "boolean", + defaultValue: !!t.grid?.showTagsBadge, + onChange: (e) => { + t.grid.showTagsBadge = !!e, B(t), V(t), n("grid.showTagsBadge"); + } + }), e({ + id: `${H}.Badges.StarColor`, + category: o(M("setting.starColor", "Star color")), + name: M("setting.starColor", "Majoor: Star color"), + tooltip: M("setting.starColor.tooltip", "Color of rating stars on thumbnails (hex, e.g. #FFD45A)"), + type: "color", + defaultValue: s(t.grid?.starColor, N.BADGE_STAR_COLOR), + onChange: (e) => { + t.grid.starColor = s(e, N.BADGE_STAR_COLOR), B(t), V(t), n("grid.starColor"); + } + }), e({ + id: `${H}.Badges.ImageColor`, + category: o(M("setting.badgeImageColor", "Image badge color")), + name: M("setting.badgeImageColor", "Majoor: Image badge color"), + tooltip: M("setting.badgeImageColor.tooltip", "Color for image badges: PNG, JPG, WEBP, GIF, BMP, TIF (hex)"), + type: "color", + defaultValue: s(t.grid?.badgeImageColor, N.BADGE_IMAGE_COLOR), + onChange: (e) => { + t.grid.badgeImageColor = s(e, N.BADGE_IMAGE_COLOR), B(t), V(t), n("grid.badgeImageColor"); + } + }), e({ + id: `${H}.Badges.VideoColor`, + category: o(M("setting.badgeVideoColor", "Video badge color")), + name: M("setting.badgeVideoColor", "Majoor: Video badge color"), + tooltip: M("setting.badgeVideoColor.tooltip", "Color for video badges: MP4, WEBM, MOV, AVI, MKV (hex)"), + type: "color", + defaultValue: s(t.grid?.badgeVideoColor, N.BADGE_VIDEO_COLOR), + onChange: (e) => { + t.grid.badgeVideoColor = s(e, N.BADGE_VIDEO_COLOR), B(t), V(t), n("grid.badgeVideoColor"); + } + }), e({ + id: `${H}.Badges.AudioColor`, + category: o(M("setting.badgeAudioColor", "Audio badge color")), + name: M("setting.badgeAudioColor", "Majoor: Audio badge color"), + tooltip: M("setting.badgeAudioColor.tooltip", "Color for audio badges: MP3, WAV, OGG, FLAC (hex)"), + type: "color", + defaultValue: s(t.grid?.badgeAudioColor, N.BADGE_AUDIO_COLOR), + onChange: (e) => { + t.grid.badgeAudioColor = s(e, N.BADGE_AUDIO_COLOR), B(t), V(t), n("grid.badgeAudioColor"); + } + }), e({ + id: `${H}.Badges.Model3dColor`, + category: o(M("setting.badgeModel3dColor", "3D model badge color")), + name: M("setting.badgeModel3dColor", "Majoor: 3D model badge color"), + tooltip: M("setting.badgeModel3dColor.tooltip", "Color for 3D model badges: OBJ, FBX, GLB, GLTF (hex)"), + type: "color", + defaultValue: s(t.grid?.badgeModel3dColor, N.BADGE_MODEL3D_COLOR), + onChange: (e) => { + t.grid.badgeModel3dColor = s(e, N.BADGE_MODEL3D_COLOR), B(t), V(t), n("grid.badgeModel3dColor"); + } + }), e({ + id: `${H}.Badges.DuplicateAlertColor`, + category: o(M("setting.badgeDuplicateAlertColor", "Duplicate alert badge color")), + name: M("setting.badgeDuplicateAlertColor", "Majoor: Duplicate alert badge color"), + tooltip: M("setting.badgeDuplicateAlertColor.tooltip", "Color for duplicate extension badges (PNG+, JPG+, etc)."), + type: "color", + defaultValue: s(t.grid?.badgeDuplicateAlertColor, N.BADGE_DUPLICATE_ALERT_COLOR), + onChange: (e) => { + t.grid.badgeDuplicateAlertColor = s(e, N.BADGE_DUPLICATE_ALERT_COLOR), B(t), V(t), n("grid.badgeDuplicateAlertColor"); + } + }), e({ + id: `${H}.Grid.PageSize`, + category: r(M("cat.grid"), M("setting.grid.pagesize.name").replace("Majoor: ", "")), + name: M("setting.grid.pagesize.name"), + tooltip: M("setting.grid.pagesize.desc"), + type: "number", + defaultValue: t.grid.pageSize, + attrs: { + min: 50, + max: Number(P.MAX_PAGE_SIZE) || 2e3, + step: 50 + }, + onChange: (e) => { + let r = Number(P.MAX_PAGE_SIZE) || 2e3; + t.grid.pageSize = Math.max(50, Math.min(r, Number(e) || N.DEFAULT_PAGE_SIZE)), B(t), V(t), n("grid.pageSize"); + } + }), e({ + id: `${H}.Grid.WorkflowGroupBy`, + category: r(M("cat.grid"), "Workflow grouping"), + name: "Workflow grid grouping", + tooltip: "In Workflow scope, insert titled separators and group cards by Task, Model, or Category.", + type: "combo", + defaultValue: (() => { + let e = String(t.grid?.workflowGroupBy || N.WORKFLOW_GRID_GROUP_BY).trim().toLowerCase(), n = { + none: "None", + task: "Task", + model: "Model", + category: "Category" + }; + return n[e] || n.none; + })(), + options: [ + "None", + "Task", + "Model", + "Category" + ], + onChange: (e) => { + let r = { + None: "none", + Task: "task", + Model: "model", + Category: "category" + }[String(e || "")] || "none"; + t.grid = t.grid || {}, t.grid.workflowGroupBy = r, B(t), V(t), n("grid.workflowGroupBy"); + } + }), e({ + id: `${H}.InfiniteScroll.Enabled`, + category: r(M("cat.grid"), M("setting.nav.infinite.name").replace("Majoor: ", "")), + name: M("setting.nav.infinite.name"), + tooltip: M("setting.nav.infinite.desc"), + type: "boolean", + defaultValue: !!t.infiniteScroll?.enabled, + onChange: (e) => { + t.infiniteScroll = t.infiniteScroll || {}, t.infiniteScroll.enabled = !!e, B(t), V(t), n("infiniteScroll.enabled"); + } + }), e({ + id: `${H}.Sidebar.Position`, + category: r(M("cat.grid"), M("setting.sidebar.pos.name").replace("Majoor: ", "")), + name: M("setting.sidebar.pos.name"), + tooltip: M("setting.sidebar.pos.desc"), + type: "combo", + defaultValue: t.sidebar?.position || "right", + options: ["left", "right"], + onChange: (e) => { + t.sidebar = t.sidebar || {}, t.sidebar.position = e === "left" ? "left" : "right", B(t), n("sidebar.position"); + } + }), e({ + id: `${H}.Sidebar.ShowPreviewThumb`, + category: r(M("cat.grid"), "Sidebar preview"), + name: "Show sidebar preview thumb", + tooltip: "Show/hide the large media preview at the top of the sidebar metadata panel.", + type: "boolean", + defaultValue: !!(t.sidebar?.showPreviewThumb ?? !0), + onChange: (e) => { + t.sidebar = t.sidebar || {}, t.sidebar.showPreviewThumb = !!e, B(t), n("sidebar.showPreviewThumb"); + } + }), e({ + id: `${H}.Sidebar.AssetBadgeEnabled`, + category: r(M("cat.grid"), "Sidebar asset notification badge"), + name: "Show new asset badge on sidebar icon", + tooltip: "Display a small counter on the Majoor sidebar icon only when a new asset is indexed by Assets Manager.", + type: "boolean", + defaultValue: !!(t.sidebar?.assetBadgeEnabled ?? N.SIDEBAR_ASSET_BADGE_ENABLED), + onChange: (e) => { + t.sidebar = t.sidebar || {}, t.sidebar.assetBadgeEnabled = !!e, B(t), V(t), n("sidebar.assetBadgeEnabled"); + } + }), e({ + id: `${H}.Integration.HideNativeAssetsTab`, + category: r(M("cat.grid"), "Hide ComfyUI native Assets tab"), + name: "Hide ComfyUI's native Assets sidebar tab", + tooltip: "Optional. Removes ComfyUI's built-in Assets tab from the sidebar so only Majoor Assets Manager is shown. Turning it off restores the native tab. Your files and the native tab's data are not affected.", + type: "boolean", + defaultValue: !!t.integration?.hideNativeAssetsTab, + onChange: (e) => { + t.integration = t.integration || {}, t.integration.hideNativeAssetsTab = !!e, B(t), Dt(!!e), n("integration.hideNativeAssetsTab"); + } + }), e({ + id: `${H}.Sidebar.WidthPx`, + category: r(M("cat.grid"), "Sidebar width"), + name: "Sidebar width (px)", + tooltip: "Set the details sidebar width in pixels (240-640).", + type: "number", + defaultValue: Math.max(240, Math.min(640, Number(t.sidebar?.widthPx) || 360)), + attrs: { + min: 240, + max: 640, + step: 10 + }, + onChange: (e) => { + t.sidebar = t.sidebar || {}, t.sidebar.widthPx = Math.max(240, Math.min(640, Math.round(Number(e) || 360))), B(t), n("sidebar.widthPx"); + } + }), e({ + id: `${H}.General.HideSiblings`, + category: r(M("cat.grid"), M("setting.siblings.hide.name").replace("Majoor: ", "")), + name: M("setting.siblings.hide.name"), + tooltip: M("setting.siblings.hide.desc"), + type: "boolean", + defaultValue: !!t.siblings?.hidePngSiblings, + onChange: (e) => { + t.siblings = t.siblings || {}, t.siblings.hidePngSiblings = !!e, B(t), n("siblings.hidePngSiblings"); + } + }), e({ + id: `${H}.Grid.VideoAutoplayMode`, + category: r(M("cat.grid"), M("setting.grid.videoAutoplayMode.name", "Video autoplay").replace("Majoor: ", "")), + name: M("setting.grid.videoAutoplayMode.name", "Majoor: Video autoplay"), + tooltip: M("setting.grid.videoAutoplayMode.desc", "Controls video thumbnail playback in the grid. Off: static frame. Hover: play on mouse hover. Always: loop while visible."), + type: "combo", + defaultValue: (() => { + let e = t.grid?.videoAutoplayMode; + e ??= t.grid?.videoHoverAutoplay === !1 ? "off" : "hover", e === !0 && (e = "hover"), e === !1 && (e = "off"), e !== "hover" && e !== "always" && e !== "off" && (e = "hover"); + let n = { + off: M("setting.grid.videoAutoplayMode.off", "Off"), + hover: M("setting.grid.videoAutoplayMode.hover", "Hover"), + always: M("setting.grid.videoAutoplayMode.always", "Always") + }; + return n[e] || n.off; + })(), + options: [ + M("setting.grid.videoAutoplayMode.off", "Off"), + M("setting.grid.videoAutoplayMode.hover", "Hover"), + M("setting.grid.videoAutoplayMode.always", "Always") + ], + onChange: (e) => { + let r = { + [M("setting.grid.videoAutoplayMode.off", "Off")]: "off", + [M("setting.grid.videoAutoplayMode.hover", "Hover")]: "hover", + [M("setting.grid.videoAutoplayMode.always", "Always")]: "always" + }[e] || "off"; + t.grid = t.grid || {}, t.grid.videoAutoplayMode = r, delete t.grid.videoHoverAutoplay, B(t), V(t), n("grid.videoAutoplayMode"); + } + }), e({ + id: `${H}.Cards.HoverColor`, + category: i("Hover color"), + name: "Majoor: Card hover color", + tooltip: "Background tint used when hovering a card (hex, e.g. #3D3D3D).", + type: "color", + defaultValue: s(t.ui?.cardHoverColor, N.UI_CARD_HOVER_COLOR), + onChange: (e) => { + t.ui = t.ui || {}, t.ui.cardHoverColor = s(e, N.UI_CARD_HOVER_COLOR), B(t), V(t), n("ui.cardHoverColor"); + } + }), e({ + id: `${H}.Cards.SelectionColor`, + category: i("Selection color"), + name: "Majoor: Card selection color", + tooltip: "Outline/accent color used for selected cards (hex, e.g. #4A90E2).", + type: "color", + defaultValue: s(t.ui?.cardSelectionColor, N.UI_CARD_SELECTION_COLOR), + onChange: (e) => { + t.ui = t.ui || {}, t.ui.cardSelectionColor = s(e, N.UI_CARD_SELECTION_COLOR), B(t), V(t), n("ui.cardSelectionColor"); + } + }), e({ + id: `${H}.Badges.RatingColor`, + category: a("Rating color"), + name: "Majoor: Rating badge color", + tooltip: "Color used for rating badge text/accent (hex, e.g. #FF9500).", + type: "color", + defaultValue: s(t.ui?.ratingColor, N.UI_RATING_COLOR), + onChange: (e) => { + t.ui = t.ui || {}, t.ui.ratingColor = s(e, N.UI_RATING_COLOR), B(t), V(t), n("ui.ratingColor"); + } + }), e({ + id: `${H}.Badges.TagColor`, + category: a("Tag color"), + name: "Majoor: Tags badge color", + tooltip: "Color used for tags badge text/accent (hex, e.g. #4A90E2).", + type: "color", + defaultValue: s(t.ui?.tagColor, N.UI_TAG_COLOR), + onChange: (e) => { + t.ui = t.ui || {}, t.ui.tagColor = s(e, N.UI_TAG_COLOR), B(t), V(t), n("ui.tagColor"); + } + }); +} +// ui/app/settings/settingsViewer.ts +var jt = "Majoor", Mt = "Majoor Assets Manager"; +function Nt(e, t, n) { + let r = (e, t) => [ + Mt, + e, + t + ], i = (e) => r(M("cat.viewer", "Viewer"), e), a = (e) => r(M("cat.floatingViewer", "Floating Viewer"), e); + e({ + id: `${jt}.Viewer.PauseDuringExecution`, + category: i(M("setting.viewer.pauseExecution.name").replace("Majoor: ", "")), + name: M("setting.viewer.pauseExecution.name"), + tooltip: M("setting.viewer.pauseExecution.desc"), + type: "boolean", + defaultValue: !!t.viewer?.pauseDuringExecution, + onChange: (e) => { + t.viewer = t.viewer || {}, t.viewer.pauseDuringExecution = !!e, B(t), V(t), n("viewer.pauseDuringExecution"); + } + }), e({ + id: `${jt}.Viewer.FloatingPauseDuringExecution`, + category: a(M("setting.viewer.floatingPauseExecution.name").replace("Majoor: ", "")), + name: M("setting.viewer.floatingPauseExecution.name"), + tooltip: M("setting.viewer.floatingPauseExecution.desc"), + type: "boolean", + defaultValue: !!t.viewer?.floatingPauseDuringExecution, + onChange: (e) => { + t.viewer = t.viewer || {}, t.viewer.floatingPauseDuringExecution = !!e, B(t), V(t), n("viewer.floatingPauseDuringExecution"); + } + }), e({ + id: `${jt}.Browser.ShowFolders`, + category: i("Browser"), + name: "Show folders in Input / Output panels", + tooltip: "When enabled, subdirectories under the Input and Output roots are shown as folder cards in the browser grid. Disable to see only files.", + type: "boolean", + defaultValue: !!(t.browser?.showFolders ?? !1), + onChange: async (e) => { + let r = !!e, i = !!(t.browser?.showFolders ?? !1); + t.browser = t.browser || {}, t.browser.showFolders = r, B(t), V(t), n("browser.showFolders"); + try { + let e = await me(r); + if (!e?.ok) throw Error(e?.error || "Failed to update show folders setting"); + } catch (e) { + t.browser.showFolders = i, B(t), V(t), n("browser.showFolders"), E(e?.message || "Failed to update show folders setting", "error"); + } + } + }), e({ + id: `${jt}.Viewer.MfvLiveDefault`, + category: a(M("setting.viewer.mfvLiveDefault.name").replace("Majoor: ", "")), + name: M("setting.viewer.mfvLiveDefault.name"), + tooltip: M("setting.viewer.mfvLiveDefault.desc"), + type: "boolean", + defaultValue: !!(t.viewer?.mfvLiveDefault ?? N.MFV_LIVE_DEFAULT), + onChange: (e) => { + t.viewer = t.viewer || {}, t.viewer.mfvLiveDefault = !!e, B(t), V(t), n("viewer.mfvLiveDefault"); + } + }), e({ + id: `${jt}.Viewer.MfvPreviewDefault`, + category: a(M("setting.viewer.mfvPreviewDefault.name").replace("Majoor: ", "")), + name: M("setting.viewer.mfvPreviewDefault.name"), + tooltip: M("setting.viewer.mfvPreviewDefault.desc"), + type: "boolean", + defaultValue: !!(t.viewer?.mfvPreviewDefault ?? N.MFV_PREVIEW_DEFAULT), + onChange: (e) => { + t.viewer = t.viewer || {}, t.viewer.mfvPreviewDefault = !!e, B(t), V(t), n("viewer.mfvPreviewDefault"); + } + }), e({ + id: `${jt}.Viewer.MfvTopbarButton`, + category: a("Top bar Viewer button"), + name: "Show Viewer button in the top bar", + tooltip: "Show a Viewer toggle button in the ComfyUI top bar next to the queue controls. Disable to hide it (the V shortcut keeps working).", + type: "boolean", + defaultValue: !!(t.viewer?.mfvTopbarButton ?? N.MFV_TOPBAR_BUTTON), + onChange: (e) => { + t.viewer = t.viewer || {}, t.viewer.mfvTopbarButton = !!e, B(t), V(t), n("viewer.mfvTopbarButton"); + } + }), e({ + id: `${jt}.Viewer.MfvSidebarPosition`, + category: a("Node Parameters sidebar position"), + name: "Node Parameters sidebar position", + tooltip: "Position of the Node Parameters sidebar in the Floating Viewer (right, left, or bottom).", + type: "combo", + defaultValue: t.viewer?.mfvSidebarPosition || "right", + options: [ + "right", + "left", + "bottom" + ], + onChange: (e) => { + let r = [ + "left", + "right", + "bottom" + ].includes(e) ? e : "right"; + t.viewer = t.viewer || {}, t.viewer.mfvSidebarPosition = r, B(t), V(t), n("viewer.mfvSidebarPosition"); + } + }), e({ + id: `${jt}.Viewer.MfvPreviewMethod`, + category: a(M("setting.viewer.mfvPreviewMethod.name").replace("Majoor: ", "")), + name: M("setting.viewer.mfvPreviewMethod.name"), + tooltip: M("setting.viewer.mfvPreviewMethod.desc"), + type: "combo", + defaultValue: t.viewer?.mfvPreviewMethod || N.MFV_PREVIEW_METHOD, + options: [ + "taesd", + "latent2rgb", + "auto", + "default", + "none" + ], + onChange: (e) => { + let r = [ + "taesd", + "latent2rgb", + "auto", + "default", + "none" + ].includes(e) ? e : N.MFV_PREVIEW_METHOD; + t.viewer = t.viewer || {}, t.viewer.mfvPreviewMethod = r, B(t), V(t), n("viewer.mfvPreviewMethod"); + } + }), e({ + id: `${jt}.Viewer.MfvKjPreviewOverrideEnabled`, + category: a(M("setting.viewer.mfvKjPreviewOverride.name").replace("Majoor: ", "")), + name: M("setting.viewer.mfvKjPreviewOverride.name"), + tooltip: M("setting.viewer.mfvKjPreviewOverride.desc"), + type: "boolean", + defaultValue: !!(t.viewer?.mfvKjPreviewOverrideEnabled ?? N.MFV_KJ_PREVIEW_OVERRIDE_ENABLED), + onChange: (e) => { + t.viewer = t.viewer || {}, t.viewer.mfvKjPreviewOverrideEnabled = !!e, B(t), V(t), n("viewer.mfvKjPreviewOverrideEnabled"); + } + }), e({ + id: `${jt}.Viewer.LtxavRgbFallback`, + category: a("LTXAV preview fallback"), + name: "Majoor: LTXAV RGB Preview Fallback (experimental)", + tooltip: "Reuse LTXV RGB projection for LTXAV when native latent preview is unavailable. Experimental; quality may be approximate.", + type: "boolean", + defaultValue: !!t.viewer?.ltxavRgbFallback, + onChange: async (e) => { + let r = !!e, i = !!t.viewer?.ltxavRgbFallback; + t.viewer = t.viewer || {}, t.viewer.ltxavRgbFallback = r, B(t), V(t), n("viewer.ltxavRgbFallback"); + try { + let e = await j(r); + if (!e?.ok) throw Error(e?.error || "Failed to update LTXAV RGB preview fallback setting"); + } catch (e) { + t.viewer.ltxavRgbFallback = i, B(t), V(t), n("viewer.ltxavRgbFallback"), E(e?.message || "Failed to update LTXAV RGB preview fallback setting", "error"); + } + } + }); + try { + u().then((e) => { + if (!e?.ok) return; + let r = !!e?.data?.prefs?.enabled, i = z(); + i.viewer = i.viewer || {}, !!i.viewer.ltxavRgbFallback !== r && (i.viewer.ltxavRgbFallback = r, Object.assign(t, i), B(i), V(i), n("viewer.ltxavRgbFallback")); + }).catch(() => {}); + } catch (e) { + console.debug?.(e); + } + ((r, a, o, s) => { + e({ + id: `${jt}.WorkflowMinimap.${r}`, + category: i(M(o).replace("Majoor: ", "")), + name: M(o), + tooltip: M(s), + type: "boolean", + defaultValue: !!t.workflowMinimap?.[a], + onChange: (e) => { + t.workflowMinimap = t.workflowMinimap || {}, t.workflowMinimap[a] = !!e, B(t), n(`workflowMinimap.${a}`); + } + }); + })("Enabled", "enabled", "setting.minimap.enabled.name", "setting.minimap.enabled.desc"); +} +// ui/app/settings/settingsScanning.ts +var U = "Majoor", Pt = "Majoor Assets Manager"; +function Ft(e, t, n) { + let r = (e, t) => [ + Pt, + e, + t + ]; + e({ + id: `${U}.ExecutionGrouping.Enabled`, + category: r(M("cat.scanning"), "Execution grouping"), + name: "Execution job/stack grouping", + tooltip: "Enable or disable all live job_id / stack_id tracking, grouping, and stack finalization logic.", + type: "boolean", + defaultValue: !!(t.executionGrouping?.enabled ?? N.EXECUTION_GROUPING_ENABLED), + onChange: async (e) => { + let r = !!(t.executionGrouping?.enabled ?? N.EXECUTION_GROUPING_ENABLED), i = !!e; + t.executionGrouping = t.executionGrouping || {}, t.executionGrouping.enabled = i, B(t), V(t), n("executionGrouping.enabled"); + try { + let e = await ue(i); + if (!e?.ok) throw Error(e?.error || "Failed to update execution grouping setting"); + t.executionGrouping.enabled = !!e?.data?.prefs?.enabled, B(t), V(t), n("executionGrouping.enabled"); + } catch (e) { + t.executionGrouping.enabled = r, B(t), V(t), n("executionGrouping.enabled"), E(e?.message || "Failed to update execution grouping setting", "error"); + } + } + }), e({ + id: `${U}.AutoScan.OnStartup`, + category: r(M("cat.scanning"), M("setting.scan.startup.name").replace("Majoor: ", "")), + name: M("setting.scan.startup.name"), + tooltip: M("setting.scan.startup.desc"), + type: "boolean", + defaultValue: !!t.autoScan?.onStartup, + onChange: (e) => { + t.autoScan = t.autoScan || {}, t.autoScan.onStartup = !!e, B(t), V(t), n("autoScan.onStartup"); + } + }), e({ + id: `${U}.Scan.FastMode`, + category: r(M("cat.scanning"), "Scan mode"), + name: "Fast scan mode", + tooltip: "Use fast scan mode for manual backfill scans (skip heavier metadata work during scan).", + type: "boolean", + defaultValue: !!(t.scan?.fastMode ?? !0), + onChange: (e) => { + t.scan = t.scan || {}, t.scan.fastMode = !!e, B(t), n("scan.fastMode"); + } + }), e({ + id: `${U}.Scan.JpegXL`, + category: r(M("cat.scanning"), "Image formats"), + name: "JPEG XL (JXL) support (Experimental)", + tooltip: "Index and preview .jxl images. Preview generation requires JPEG XL support in Pillow or FFmpeg. Run a new scan after enabling.", + type: "boolean", + defaultValue: !!t.scan?.jxlEnabled, + onChange: async (e) => { + let r = !!t.scan?.jxlEnabled, i = !!e; + t.scan = t.scan || {}, t.scan.jxlEnabled = i, B(t), n("scan.jxlEnabled"); + try { + let e = await Oe(i); + if (!e?.ok) throw Error(e?.error || "Failed to update JPEG XL support"); + } catch (e) { + t.scan.jxlEnabled = r, B(t), n("scan.jxlEnabled"), E(e?.message || "Failed to update JPEG XL support", "error"); + } + } + }), T().then((e) => { + e?.ok && (t.scan = t.scan || {}, t.scan.jxlEnabled = !!e?.data?.prefs?.enabled, B(t), n("scan.jxlEnabled")); + }).catch(() => {}), e({ + id: `${U}.RtHydrate.Concurrency`, + category: r(M("cat.scanning"), "Hydration"), + name: "Hydrate Concurrency", + tooltip: "Maximum concurrent hydration requests for rating/tags.", + type: "number", + defaultValue: Number(t.rtHydrate?.concurrency || N.RT_HYDRATE_CONCURRENCY || 5), + attrs: { + min: 1, + max: 20, + step: 1 + }, + onChange: (e) => { + t.rtHydrate = t.rtHydrate || {}, t.rtHydrate.concurrency = Math.max(1, Math.min(20, Math.round(I(e, N.RT_HYDRATE_CONCURRENCY || 5)))), B(t), V(t), n("rtHydrate.concurrency"); + } + }); + let i = (e, t, n, r) => { + let i = Math.round(I(e, t)); + return Math.max(n, Math.min(r, i)); + }, a = (e = {}) => { + let r = []; + if (t.watcher = t.watcher || {}, typeof e.debounce_ms == "number") { + let n = Math.max(50, Math.min(5e3, Math.round(e.debounce_ms))); + t.watcher.debounceMs !== n && (t.watcher.debounceMs = n, r.push("watcher.debounceMs")); + } + if (typeof e.dedupe_ttl_ms == "number") { + let n = Math.max(100, Math.min(3e4, Math.round(e.dedupe_ttl_ms))); + t.watcher.dedupeTtlMs !== n && (t.watcher.dedupeTtlMs = n, r.push("watcher.dedupeTtlMs")); + } + r.length && (B(t), r.forEach((e) => n(e))); + }, o = async () => { + try { + let e = await se(); + if (!e?.ok) return; + a(e.data || {}); + } catch (e) { + console.debug?.(e); + } + }; + e({ + id: `${U}.Watcher.Enabled`, + category: r(M("cat.scanning"), M("setting.watcher.enabled.label", "Enable watcher")), + name: M("setting.watcher.name"), + tooltip: M("setting.watcher.desc") + " (env: MJR_ENABLE_WATCHER)", + type: "boolean", + defaultValue: !!t.watcher?.enabled, + onChange: async (e) => { + t.watcher = t.watcher || {}, t.watcher.enabled = !!e, B(t), n("watcher.enabled"); + try { + let r = await de(!!e); + r?.ok || (t.watcher.enabled = !e, B(t), n("watcher.enabled"), E(r?.error || M("toast.failedToggleWatcher", "Failed to toggle watcher"), "error")); + } catch { + t.watcher.enabled = !e, B(t), n("watcher.enabled"); + } + } + }), e({ + id: `${U}.Watcher.DebounceDelay`, + category: r(M("cat.scanning"), M("setting.watcher.debounce.label", "Watcher debounce delay")), + name: M("setting.watcher.debounce.name"), + tooltip: M("setting.watcher.debounce.desc") + " (env: MJR_WATCHER_DEBOUNCE_MS)", + type: "number", + defaultValue: t.watcher?.debounceMs ?? N.WATCHER_DEBOUNCE_MS, + attrs: { + min: 50, + max: 6e4, + step: 50 + }, + onChange: async (e) => { + let r = N.WATCHER_DEBOUNCE_MS, a = i(e, r, 50, 6e4), o = t.watcher?.debounceMs ?? r; + if (a !== o) { + t.watcher = t.watcher || {}, t.watcher.debounceMs = a, B(t); + try { + let e = await v({ debounce_ms: a }); + if (!e?.ok) throw Error(e?.error || M("setting.watcher.debounce.error")); + let r = Math.round(Number(e?.data?.debounce_ms ?? a)); + t.watcher.debounceMs = r, B(t), n("watcher.debounceMs"); + } catch (e) { + t.watcher.debounceMs = o, B(t), n("watcher.debounceMs"), E(e?.message || M("setting.watcher.debounce.error"), "error"); + } + } + } + }), e({ + id: `${U}.Watcher.DedupeWindow`, + category: r(M("cat.scanning"), M("setting.watcher.dedupe.label", "Watcher dedupe window")), + name: M("setting.watcher.dedupe.name"), + tooltip: M("setting.watcher.dedupe.desc") + " (env: MJR_WATCHER_DEDUPE_TTL_MS)", + type: "number", + defaultValue: t.watcher?.dedupeTtlMs ?? N.WATCHER_DEDUPE_TTL_MS, + attrs: { + min: 100, + max: 12e4, + step: 100 + }, + onChange: async (e) => { + let r = N.WATCHER_DEDUPE_TTL_MS, a = i(e, r, 100, 12e4), o = t.watcher?.dedupeTtlMs ?? r; + if (a !== o) { + t.watcher = t.watcher || {}, t.watcher.dedupeTtlMs = a, B(t); + try { + let e = await v({ dedupe_ttl_ms: a }); + if (!e?.ok) throw Error(e?.error || M("setting.watcher.dedupe.error")); + let r = Math.round(Number(e?.data?.dedupe_ttl_ms ?? a)); + t.watcher.dedupeTtlMs = r, B(t), n("watcher.dedupeTtlMs"); + } catch (e) { + t.watcher.dedupeTtlMs = o, B(t), n("watcher.dedupeTtlMs"), E(e?.message || M("setting.watcher.dedupe.error"), "error"); + } + } + } + }), e({ + id: `${U}.Watcher.MaxPending`, + category: r(M("cat.scanning"), "Watcher queue"), + name: "Watcher: max pending files", + tooltip: "Maximum number of pending watcher files kept in memory.", + type: "number", + defaultValue: Number(t.watcher?.maxPending ?? 500), + attrs: { + min: 10, + max: 5e3, + step: 10 + }, + onChange: (e) => { + t.watcher = t.watcher || {}, t.watcher.maxPending = Math.max(10, Math.min(5e3, Math.round(I(e, 500)))), B(t), V(t), n("watcher.maxPending"); + } + }), e({ + id: `${U}.Watcher.MinSize`, + category: r(M("cat.scanning"), "Watcher file size"), + name: "Watcher: min size (bytes)", + tooltip: "Minimum file size indexed by watcher.", + type: "number", + defaultValue: Number(t.watcher?.minSize ?? 100), + attrs: { + min: 0, + max: 1e6, + step: 100 + }, + onChange: (e) => { + t.watcher = t.watcher || {}, t.watcher.minSize = Math.max(0, Math.min(1e6, Math.round(I(e, 100)))), B(t), V(t), n("watcher.minSize"); + } + }), e({ + id: `${U}.Watcher.MaxSize`, + category: r(M("cat.scanning"), "Watcher file size"), + name: "Watcher: max size (bytes)", + tooltip: "Maximum file size indexed by watcher.", + type: "number", + defaultValue: Number(t.watcher?.maxSize ?? 4294967296), + attrs: { + min: 1e5, + max: 17179869184, + step: 1e5 + }, + onChange: (e) => { + t.watcher = t.watcher || {}, t.watcher.maxSize = Math.max(1e5, Math.min(17179869184, Math.round(I(e, 4294967296)))), B(t), V(t), n("watcher.maxSize"); + } + }); + try { + o().catch(() => {}); + } catch (e) { + console.debug?.(e); + } + e({ + id: `${U}.RatingTagsSync.Enabled`, + category: r(M("cat.scanning"), M("setting.sync.rating.name").replace("Majoor: ", "")), + name: M("setting.sync.rating.name"), + tooltip: M("setting.sync.rating.desc"), + type: "boolean", + defaultValue: !!t.ratingTagsSync?.enabled, + onChange: (e) => { + t.ratingTagsSync = t.ratingTagsSync || {}, t.ratingTagsSync.enabled = !!e, B(t), n("ratingTagsSync.enabled"); + } + }); +} +// ui/app/settings/settingsFeed.ts +var It = "Majoor", Lt = "Majoor Assets Manager"; +function Rt(e, t, n) { + let r = (e) => [ + Lt, + M("cat.feed", "Generated Feed"), + e + ], i = () => { + t.feed = t.feed || {}; + }; + e({ + id: `${It}.Feed.CardSize`, + category: r("Card size"), + name: "Feed card size (px)", + tooltip: "Set the minimum card width used by the Generated Feed layout (60-600 px).", + type: "number", + defaultValue: Math.max(60, Math.min(600, Number(t.feed?.minSize) || 120)), + attrs: { + min: 60, + max: 600, + step: 10 + }, + onChange: (e) => { + i(), t.feed.minSize = Math.max(60, Math.min(600, Math.round(Number(e) || 120))), B(t), V(t), n("feed.minSize"); + } + }), e({ + id: `${It}.Feed.ShowInfo`, + category: r("Show info section"), + name: "Show card info section", + tooltip: "Show or hide the entire info section (filename, metadata, dots) below thumbnails in the Generated Feed.", + type: "boolean", + defaultValue: !!(t.feed?.showInfo ?? N.FEED_SHOW_INFO), + onChange: (e) => { + i(), t.feed.showInfo = !!e, B(t), V(t), n("feed.showInfo"); + } + }), e({ + id: `${It}.Feed.ShowFilename`, + category: r("Show filename"), + name: "Show filename", + tooltip: "Display the filename on feed cards.", + type: "boolean", + defaultValue: !!(t.feed?.showFilename ?? N.FEED_SHOW_FILENAME), + onChange: (e) => { + i(), t.feed.showFilename = !!e, B(t), V(t), n("feed.showFilename"); + } + }), e({ + id: `${It}.Feed.ShowDimensions`, + category: r("Show dimensions"), + name: "Show dimensions", + tooltip: "Display resolution (WxH) and duration on feed cards.", + type: "boolean", + defaultValue: !!(t.feed?.showDimensions ?? N.FEED_SHOW_DIMENSIONS), + onChange: (e) => { + i(), t.feed.showDimensions = !!e, B(t), V(t), n("feed.showDimensions"); + } + }), e({ + id: `${It}.Feed.ShowDate`, + category: r("Show date/time"), + name: "Show date/time", + tooltip: "Display date and time on feed cards.", + type: "boolean", + defaultValue: !!(t.feed?.showDate ?? N.FEED_SHOW_DATE), + onChange: (e) => { + i(), t.feed.showDate = !!e, B(t), V(t), n("feed.showDate"); + } + }), e({ + id: `${It}.Feed.ShowGenTime`, + category: r("Show generation time"), + name: "Show generation time", + tooltip: "Display the generation time badge on feed cards.", + type: "boolean", + defaultValue: !!(t.feed?.showGenTime ?? N.FEED_SHOW_GENTIME), + onChange: (e) => { + i(), t.feed.showGenTime = !!e, B(t), V(t), n("feed.showGenTime"); + } + }), e({ + id: `${It}.Feed.ShowWorkflowDot`, + category: r("Show workflow dot"), + name: "Show workflow indicator", + tooltip: "Display the workflow availability dot on feed cards.", + type: "boolean", + defaultValue: !!(t.feed?.showWorkflowDot ?? N.FEED_SHOW_WORKFLOW_DOT), + onChange: (e) => { + i(), t.feed.showWorkflowDot = !!e, B(t), V(t), n("feed.showWorkflowDot"); + } + }), e({ + id: `${It}.Feed.ShowExtBadge`, + category: r("Show format badges"), + name: "Show format badges", + tooltip: "Display format badges (e.g. JPG, MP4) on feed card thumbnails.", + type: "boolean", + defaultValue: !!(t.feed?.showExtBadge ?? N.FEED_SHOW_BADGES_EXTENSION), + onChange: (e) => { + i(), t.feed.showExtBadge = !!e, B(t), V(t), n("feed.showExtBadge"); + } + }), e({ + id: `${It}.Feed.ShowRatingBadge`, + category: r("Show rating badges"), + name: "Show ratings", + tooltip: "Display star ratings on feed card thumbnails.", + type: "boolean", + defaultValue: !!(t.feed?.showRatingBadge ?? N.FEED_SHOW_BADGES_RATING), + onChange: (e) => { + i(), t.feed.showRatingBadge = !!e, B(t), V(t), n("feed.showRatingBadge"); + } + }), e({ + id: `${It}.Feed.ShowTagsBadge`, + category: r("Show tags badges"), + name: "Show tags", + tooltip: "Display tag indicators on feed card thumbnails.", + type: "boolean", + defaultValue: !!(t.feed?.showTagsBadge ?? N.FEED_SHOW_BADGES_TAGS), + onChange: (e) => { + i(), t.feed.showTagsBadge = !!e, B(t), V(t), n("feed.showTagsBadge"); + } + }); +} +// ui/app/settings/settingsSecurity.ts +var zt = "Majoor", Bt = "Majoor Assets Manager", Vt = 16, Ht = { + safeMode: !1, + allowWrite: !0, + allowDelete: !0, + allowRename: !0, + allowOpenInFolder: !0, + allowResetIndex: !0 +}; +function Ut(e) { + return !!e; +} +function Wt(e, t) { + return Ut(e) === Ut(t); +} +function Gt(e) { + return typeof e == "string" ? e.trim() : ""; +} +function Kt(e) { + let t = String(e || "").trim().toLowerCase(); + return t === "localhost" || t === "127.0.0.1" || t === "::1"; +} +function qt() { + return globalThis.location || globalThis.window?.location || null; +} +function Jt() { + let e = qt(); + if (!e) return !1; + let t = String(e.protocol || "").toLowerCase(), n = String(e.hostname || "").trim(); + return t === "http:" && !Kt(n); +} +function Yt(e) { + let t = globalThis.crypto; + if (!t?.getRandomValues) throw Error("Secure token generation requires crypto.getRandomValues()."); + return t.getRandomValues(e); +} +function Xt(e) { + let t = Math.max(4, Number(e) || 0), n = new Uint8Array(t); + return Yt(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); +} +function Zt() { + return `mjr_${Xt(18)}`; +} +function Qt(e) { + return String(e?.apiToken || "").trim().length >= Vt && F(e?.allowWrite, !0) && F(e?.requireAuth, !1) && !F(e?.allowRemoteWrite, !1); +} +function $t(e) { + let t = String((e && typeof e == "object" ? e : {}).apiToken || "").trim(); + return { + apiToken: t.length >= Vt ? t : Zt(), + allowWrite: !0, + requireAuth: !0, + allowRemoteWrite: !1, + allowInsecureTokenTransport: Jt() + }; +} +function en(e) { + let t = e || {}; + return { + safe_mode: F(t.safeMode, !1), + allow_write: F(t.allowWrite, !0), + require_auth: F(t.requireAuth, !1), + allow_remote_write: F(t.allowRemoteWrite, !1), + allow_insecure_token_transport: F(t.allowInsecureTokenTransport, !1), + allow_delete: F(t.allowDelete, !0), + allow_rename: F(t.allowRename, !0), + allow_open_in_folder: F(t.allowOpenInFolder, !0), + allow_reset_index: F(t.allowResetIndex, !0), + ...String(t.apiToken || "").trim() ? { api_token: String(t.apiToken || "").trim() } : {} + }; +} +function tn(e) { + return ee(en(e)); +} +function nn(e) { + let t = String(e?.security?.tokenHint || "").trim(); + return t ? M("setting.sec.token.placeholderConfigured", "Token configured on server ({tokenHint}). Leave blank to keep the current server token.", { tokenHint: t }) : e?.security?.tokenConfigured ? M("setting.sec.token.placeholderConfiguredGeneric", "Token configured on server. Leave blank to keep the current server token.") : M("setting.sec.token.placeholder", "Auto-generated for this browser session."); +} +function rn(e, t, n) { + let r = (e, t) => [ + Bt, + e, + t + ]; + e({ + id: `${zt}.Safety.ConfirmDeletion`, + category: r(M("cat.security"), "Confirm before deleting"), + name: "Confirm before deleting", + tooltip: "Show a confirmation dialog before deleting files. Disabling this allows instant deletion.", + type: "boolean", + defaultValue: t.safety?.confirmDeletion !== !1, + onChange: (e) => { + Wt(t.safety?.confirmDeletion !== !1, e) || (t.safety = t.safety || {}, t.safety.confirmDeletion = !!e, B(t), V(t), n("safety.confirmDeletion")); + } + }); + let i = (i, a, o, s = "cat.security") => { + e({ + id: `${zt}.Security.${i}`, + category: r(M(s), M(a).replace("Majoor: ", "")), + name: M(a), + tooltip: M(o), + type: "boolean", + defaultValue: F(t.security?.[i], Ht[i] ?? !1), + onChange: (e) => { + if (!Wt(t.security?.[i], e)) { + t.security = t.security || {}, t.security[i] = !!e, B(t), n(`security.${i}`); + try { + tn(t.security).then((e) => { + e?.ok && e.data?.prefs ? rt() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e); + }).catch(() => {}); + } catch (e) { + console.debug?.(e); + } + } + } + }); + }; + i("safeMode", "setting.sec.safe.name", "setting.sec.safe.desc"), i("allowWrite", "setting.sec.write.name", "setting.sec.write.desc"), i("allowDelete", "setting.sec.del.name", "setting.sec.del.desc"), i("allowRename", "setting.sec.ren.name", "setting.sec.ren.desc"), i("allowOpenInFolder", "setting.sec.open.name", "setting.sec.open.desc"), i("allowResetIndex", "setting.sec.reset.name", "setting.sec.reset.desc"), e({ + id: `${zt}.Security.RemoteLanPreset`, + category: r(M("cat.remote"), M("setting.sec.remoteLanPreset.name").replace("Majoor: ", "")), + name: M("setting.sec.remoteLanPreset.name"), + tooltip: M("setting.sec.remoteLanPreset.desc"), + type: "boolean", + defaultValue: Qt(t.security), + onChange: (e) => { + if (t.security = t.security || {}, Wt(t.security.remoteLanPreset, e)) return; + if (t.security.remoteLanPreset = !!e, !e) { + B(t), n("security.remoteLanPreset"); + return; + } + let r; + try { + r = $t(t.security); + } catch (e) { + E(e?.message || M("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); + return; + } + Object.assign(t.security, r), t.security.tokenConfigured = !0, t.security.tokenHint = String(r.apiToken || "").trim() ? `...${String(r.apiToken).trim().slice(-4)}` : "", r.apiToken && w(r.apiToken), B(t), n("security.remoteLanPreset"), n("security.apiToken"), n("security.allowWrite"), n("security.requireAuth"), n("security.allowRemoteWrite"), n("security.allowInsecureTokenTransport"); + try { + tn(t.security).then((e) => { + e?.ok && e.data?.prefs ? (rt(), E(M("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (E(e.error || M("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"), console.warn("[Majoor] backend remote LAN preset update failed", e.error || e)); + }).catch((e) => { + E(e?.message || M("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); + }); + } catch (e) { + console.debug?.(e); + } + } + }), e({ + id: `${zt}.Security.ApiToken`, + category: r(M("cat.remote"), M("setting.sec.token.name").replace("Majoor: ", "")), + name: M("setting.sec.token.name", "Majoor: API Token"), + tooltip: M("setting.sec.token.desc", "Store the API token used for write operations. Majoor sends it via X-MJR-Token and Authorization headers."), + type: "text", + defaultValue: t.security?.apiToken || "", + attrs: { placeholder: nn(t) }, + onChange: (e) => { + t.security = t.security || {}; + let r = Gt(e); + if (Gt(t.security.apiToken) !== r && (t.security.apiToken = r, t.security.apiToken && (t.security.tokenConfigured = !0, t.security.tokenHint = `...${t.security.apiToken.slice(-4)}`, w(t.security.apiToken)), B(t), n("security.apiToken"), t.security.apiToken)) try { + ee({ api_token: t.security.apiToken }).then((e) => { + e?.ok && e.data?.prefs ? rt() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e); + }).catch(() => {}); + } catch (e) { + console.debug?.(e); + } + } + }), i("requireAuth", "setting.sec.requireAuth.name", "setting.sec.requireAuth.desc", "cat.remote"), i("allowRemoteWrite", "setting.sec.remote.name", "setting.sec.remote.desc", "cat.remote"), i("allowInsecureTokenTransport", "setting.sec.insecureTransport.name", "setting.sec.insecureTransport.desc", "cat.remote"); +} +// ui/app/settings/settingsAdvanced.ts +var W = "Majoor", an = "Majoor Assets Manager"; +function on(e, n, r, a) { + let s = (e, t) => [ + an, + e, + t + ], l = String(n.paths?.outputDirectory || ""), u = null, f = 0, _ = null; + e({ + id: `${W}.Paths.OutputDirectory`, + category: s(M("cat.advanced"), "Paths / Output"), + name: "Majoor: Generation Output Directory", + tooltip: "Override the ComfyUI generation output directory used by Majoor (equivalent to --output-directory). Leave empty to keep the current backend default.", + type: "text", + defaultValue: String(n.paths?.outputDirectory || ""), + attrs: { placeholder: "D:\\\\____COMFY_OUTPUTS" }, + onChange: async (e) => { + let t = String(e || "").trim(); + n.paths = n.paths || {}, n.paths.outputDirectory = t, B(n); + try { + u &&= (clearTimeout(u), null); + } catch (e) { + console.debug?.(e); + } + u = setTimeout(async () => { + u = null; + let e = ++f; + try { + _?.abort?.(); + } catch (e) { + console.debug?.(e); + } + _ = typeof AbortController < "u" ? new AbortController() : null; + try { + let i = await C(t, _ ? { signal: _.signal } : {}); + if (e !== f) return; + if (!i?.ok) throw Error(i?.error || M("toast.failedSetOutputDirectory", "Failed to set output directory")); + let a = String(i?.data?.output_directory || t).trim(); + n.paths.outputDirectory = a, l = a, B(n), r("paths.outputDirectory"); + } catch (t) { + if (e !== f || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return; + n.paths.outputDirectory = l, B(n), r("paths.outputDirectory"), E(t?.message || M("toast.failedSetOutputDirectory", "Failed to set output directory"), "error"); + } + }, 700); + } + }); + try { + ye().then((e) => { + if (!e?.ok) return; + let t = String(e?.data?.output_directory || "").trim(); + n.paths = n.paths || {}, n.paths.outputDirectory !== t && (n.paths.outputDirectory = t, l = t, B(n), r("paths.outputDirectory")); + }).catch(() => {}); + } catch (e) { + console.debug?.(e); + } + let v = String(n.paths?.inputDirectory || ""), y = null, ee = 0, w = null, T = (e) => { + n.paths = n.paths || {}, n.paths.inputDirectory = e, B(n), S(a, `${W}.Paths.InputDirectory`, e), r("paths.inputDirectory"); + }; + e({ + id: `${W}.Paths.InputDirectory`, + category: s(M("cat.advanced"), "Paths / Input"), + name: "Majoor: Input Directory", + tooltip: "Override the folder indexed by the Inputs tab. Leave empty to use ComfyUI's input directory (--input-directory). Run a scan after changing it.", + type: "text", + defaultValue: String(n.paths?.inputDirectory || ""), + attrs: { placeholder: "D:\\ComfyUI\\input" }, + onChange: (e) => { + let t = String(e || "").trim(); + if (t === String(n.paths?.inputDirectory || "")) return; + n.paths = n.paths || {}, n.paths.inputDirectory = t, B(n), y && clearTimeout(y); + let r = ++ee; + w?.abort(), y = setTimeout(async () => { + y = null, w = typeof AbortController < "u" ? new AbortController() : null; + try { + let e = await Ce(t, w ? { signal: w.signal } : {}); + if (r !== ee) return; + if (!e?.ok) throw Error(e?.error || "Failed to set input directory"); + let n = String(e?.data?.input_directory ?? t).trim(); + v = n, T(n); + } catch (e) { + if (r !== ee || e?.name === "AbortError" || e?.code === "ABORTED") return; + T(v), E(e?.message || "Failed to set input directory", "error"); + } + }, 700); + } + }); + try { + te().then((e) => { + if (!e?.ok || ee !== 0) return; + let t = String(e?.data?.input_directory || "").trim(); + v = t, T(t); + }).catch(() => {}); + } catch (e) { + console.debug?.(e); + } + let D = String(n.paths?.indexDirectory || ""), O = null, ie = 0, k = null; + e({ + id: `${W}.Paths.IndexDirectory`, + category: s(M("cat.advanced"), "Paths / Index"), + name: "Majoor: Index Database Directory", + tooltip: "Override the Majoor index database directory. Use this to keep the SQLite index on a different local disk. Requires restart.", + type: "text", + defaultValue: String(n.paths?.indexDirectory || ""), + attrs: { placeholder: "D:\\MajoorIndex" }, + onChange: async (e) => { + let t = String(e || "").trim(); + n.paths = n.paths || {}, n.paths.indexDirectory = t, B(n); + try { + O &&= (clearTimeout(O), null); + } catch (e) { + console.debug?.(e); + } + O = setTimeout(async () => { + O = null; + let e = ++ie; + try { + k?.abort?.(); + } catch (e) { + console.debug?.(e); + } + k = typeof AbortController < "u" ? new AbortController() : null; + try { + let i = await ae(t, k ? { signal: k.signal } : {}); + if (e !== ie) return; + if (!i?.ok) throw Error(i?.error || M("toast.failedSetIndexDirectory", "Failed to set index directory")); + let a = String(i?.data?.index_directory || t).trim(), o = a !== D; + n.paths.indexDirectory = a, D = a, B(n), r("paths.indexDirectory"), o && E(M("toast.indexDirectorySavedRestart", "Index directory saved. Restart ComfyUI to apply."), "success", void 0, { history: { trackId: "settings:index-directory-saved" } }); + } catch (t) { + if (e !== ie || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return; + n.paths.indexDirectory = D, B(n), r("paths.indexDirectory"), E(t?.message || M("toast.failedSetIndexDirectory", "Failed to set index directory"), "error"); + } + }, 700); + } + }); + try { + d().then((e) => { + if (!e?.ok) return; + let t = String(e?.data?.index_directory || "").trim(); + n.paths = n.paths || {}, n.paths.indexDirectory !== t && (n.paths.indexDirectory = t, D = t, B(n), r("paths.indexDirectory")); + }).catch(() => {}); + } catch (e) { + console.debug?.(e); + } + let A = String(n.paths?.workflowRoots || ""), j = null, se = 0, le = null; + e({ + id: `${W}.Paths.WorkflowRoots`, + category: s(M("cat.advanced"), "Paths / Workflows"), + name: "Majoor: Workflow Roots", + tooltip: "Folders scanned by the Workflow tab. Use one folder per line, or separate folders with semicolons. Leave empty to use ComfyUI defaults and MJR_AM_WORKFLOW_DIRECTORY.", + type: "text", + defaultValue: String(n.paths?.workflowRoots || ""), + attrs: { placeholder: "D:\\\\ComfyUI\\\\user\\\\default\\\\workflows" }, + onChange: async (e) => { + let t = String(e || "").trim(); + n.paths = n.paths || {}, n.paths.workflowRoots = t, B(n); + try { + j &&= (clearTimeout(j), null); + } catch (e) { + console.debug?.(e); + } + j = setTimeout(async () => { + j = null; + let e = ++se; + try { + le?.abort?.(); + } catch (e) { + console.debug?.(e); + } + le = typeof AbortController < "u" ? new AbortController() : null; + try { + let i = await pe(t, le ? { signal: le.signal } : {}); + if (e !== se) return; + if (!i?.ok) throw Error(i?.error || M("toast.failedSetWorkflowRoots", "Failed to set workflow roots")); + let a = String(i?.data?.workflow_roots_text || t).trim(); + n.paths.workflowRoots = a, A = a, B(n), r("paths.workflowRoots"), E(M("toast.workflowRootsSaved", "Workflow roots saved"), "success", 1800); + } catch (t) { + if (e !== se || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return; + n.paths.workflowRoots = A, B(n), r("paths.workflowRoots"), E(t?.message || M("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); + } + }, 700); + } + }); + try { + ge().then((e) => { + if (!e?.ok) return; + let t = String(e?.data?.workflow_roots_text || "").trim(); + n.paths = n.paths || {}, n.paths.workflowRoots !== t && (n.paths.workflowRoots = t, A = t, B(n), r("paths.workflowRoots")); + }).catch(() => {}); + } catch (e) { + console.debug?.(e); + } + let ue = t().map((e) => e.code), de = ["auto", ...ue]; + e({ + id: `${W}.Language`, + category: s(M("cat.advanced"), M("setting.language.name", "Language")), + name: M("setting.language.name", "Majoor: Language"), + tooltip: "Use auto to detect and follow ComfyUI language. Or choose a fixed language for Majoor only.", + type: "combo", + defaultValue: n.i18n?.followComfyLanguage ? "auto" : x(), + options: de, + onChange: (e) => { + n.i18n = n.i18n || {}, e === "auto" ? (n.i18n.followComfyLanguage = !0, xe(!0), oe(a), B(n), r("language")) : ue.includes(e) && (n.i18n.followComfyLanguage = !1, xe(!1), he(e), B(n), r("language")); + } + }), e({ + id: `${W}.ProbeBackend.Mode`, + category: s(M("cat.advanced"), M("setting.probe.mode.name").replace("Majoor: ", "")), + name: M("setting.probe.mode.name"), + tooltip: M("setting.probe.mode.desc") + " (env: MAJOOR_MEDIA_PROBE_BACKEND)", + type: "combo", + defaultValue: n.probeBackend?.mode || R.probeBackend.mode, + options: [ + "auto", + "exiftool", + "ffprobe", + "both" + ], + onChange: (e) => { + let t = Ae(e, [ + "auto", + "exiftool", + "ffprobe", + "both" + ], R.probeBackend.mode); + n.probeBackend = n.probeBackend || {}, n.probeBackend.mode = t, B(n), V(n), r("probeBackend.mode"), o(t).catch(() => {}); + } + }), e({ + id: `${W}.MetadataFallback.Image`, + category: s(M("cat.advanced"), "Metadata"), + name: "Majoor: Metadata Fallback (Images)", + tooltip: "Enable Pillow fallback when ExifTool is missing or fails.", + type: "boolean", + defaultValue: n.metadataFallback?.image ?? R.metadataFallback.image, + onChange: async (e) => { + let t = !!e, i = !!(n.metadataFallback?.image ?? R.metadataFallback.image); + n.metadataFallback = n.metadataFallback || {}, n.metadataFallback.image = t, B(n), r("metadataFallback.image"); + try { + let e = await Ee({ + image: t, + media: n.metadataFallback?.media ?? R.metadataFallback.media + }); + if (!e?.ok) throw Error(e?.error || M("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings")); + } catch (e) { + n.metadataFallback.image = i, B(n), r("metadataFallback.image"), E(e?.message || M("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error"); + } + } + }), e({ + id: `${W}.MetadataFallback.Media`, + category: s(M("cat.advanced"), "Metadata"), + name: "Majoor: Metadata Fallback (Audio/Video)", + tooltip: "Enable hachoir fallback when ffprobe is missing or fails.", + type: "boolean", + defaultValue: n.metadataFallback?.media ?? R.metadataFallback.media, + onChange: async (e) => { + let t = !!e, i = !!(n.metadataFallback?.media ?? R.metadataFallback.media); + n.metadataFallback = n.metadataFallback || {}, n.metadataFallback.media = t, B(n), r("metadataFallback.media"); + try { + let e = await Ee({ + image: n.metadataFallback?.image ?? R.metadataFallback.image, + media: t + }); + if (!e?.ok) throw Error(e?.error || M("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings")); + } catch (e) { + n.metadataFallback.media = i, B(n), r("metadataFallback.media"), E(e?.message || M("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error"); + } + } + }); + try { + m().then((e) => { + if (!e?.ok || !e?.data?.prefs) return; + let t = e.data.prefs || {}, i = !!(t.image ?? R.metadataFallback.image), a = !!(t.media ?? R.metadataFallback.media); + n.metadataFallback = n.metadataFallback || {}; + let o = !1; + n.metadataFallback.image !== i && (n.metadataFallback.image = i, o = !0), n.metadataFallback.media !== a && (n.metadataFallback.media = a, o = !0), o && (B(n), r("metadataFallback")); + }).catch(() => {}); + } catch (e) { + console.debug?.(e); + } + e({ + id: `${W}.Db.Timeout`, + category: s(M("cat.advanced"), "Database"), + name: "DB Timeout (ms)", + tooltip: "Client-side DB timeout preference (stored locally).", + type: "number", + defaultValue: Number(n.db?.timeoutMs || 5e3), + attrs: { + min: 1e3, + max: 3e4, + step: 1e3 + }, + onChange: (e) => { + n.db = n.db || {}, n.db.timeoutMs = Math.max(1e3, Math.min(3e4, Math.round(I(e, 5e3)))), B(n), V(n), r("db.timeoutMs"); + } + }), e({ + id: `${W}.Db.MaxConnections`, + category: s(M("cat.advanced"), "Database"), + name: "DB Max Connections", + tooltip: "Client-side DB max connections preference (stored locally).", + type: "number", + defaultValue: Number(n.db?.maxConnections || 10), + attrs: { + min: 1, + max: 100, + step: 1 + }, + onChange: (e) => { + n.db = n.db || {}, n.db.maxConnections = Math.max(1, Math.min(100, Math.round(I(e, 10)))), B(n), V(n), r("db.maxConnections"); + } + }), e({ + id: `${W}.Db.QueryTimeout`, + category: s(M("cat.advanced"), "Database"), + name: "DB Query Timeout (ms)", + tooltip: "Client-side DB query timeout preference (stored locally).", + type: "number", + defaultValue: Number(n.db?.queryTimeoutMs || 1e3), + attrs: { + min: 500, + max: 1e4, + step: 500 + }, + onChange: (e) => { + n.db = n.db || {}, n.db.queryTimeoutMs = Math.max(500, Math.min(1e4, Math.round(I(e, 1e3)))), B(n), V(n), r("db.queryTimeoutMs"); + } + }), e({ + id: `${W}.Observability.Enabled`, + category: s(M("cat.advanced"), M("setting.obs.enabled.name").replace("Majoor: ", "")), + name: M("setting.obs.enabled.name"), + tooltip: M("setting.obs.enabled.desc"), + type: "boolean", + defaultValue: !!n.observability?.enabled, + onChange: (e) => { + n.observability = n.observability || {}, n.observability.enabled = !!e, B(n), V(n), r("observability.enabled"); + } + }), e({ + id: `${W}.Observability.RuntimeDashboardMode`, + category: s(M("cat.advanced"), "Runtime metrics badge"), + name: "Majoor: Runtime metrics badge", + tooltip: "Controls the small DB/enrichment/watcher metrics badge in the Assets Manager panel.", + type: "combo", + defaultValue: n.observability?.runtimeDashboardMode || R.observability.runtimeDashboardMode, + options: [ + "autoHide30", + "always", + "hidden" + ], + onChange: (e) => { + let t = Ae(e, [ + "autoHide30", + "always", + "hidden" + ], R.observability.runtimeDashboardMode); + n.observability = n.observability || {}, n.observability.runtimeDashboardMode = t, B(n), r("observability.runtimeDashboardMode"); + } + }), e({ + id: `${W}.Observability.VerboseErrors`, + category: s(M("cat.advanced"), "Verbose error logging"), + name: "Verbose error logging", + tooltip: "Show detailed error messages in toasts and console. Useful for debugging.", + type: "boolean", + defaultValue: !!n.observability?.verboseErrors, + onChange: (e) => { + n.observability = n.observability || {}, n.observability.verboseErrors = !!e, B(n), V(n), r("observability.verboseErrors"); + } + }), e({ + id: `${W}.Observability.VerboseRouteRegistrationLogs`, + category: s(M("cat.advanced"), "Logs"), + name: "Majoor: Verbose route registration logs", + tooltip: "When disabled, Majoor prints a compact startup summary instead of listing every registered API route. Takes effect on the next backend restart.", + type: "boolean", + defaultValue: !!(n.observability?.verboseRouteRegistrationLogs ?? R.observability?.verboseRouteRegistrationLogs ?? !1), + onChange: async (e) => { + let t = !!e, i = !!(n.observability?.verboseRouteRegistrationLogs ?? R.observability?.verboseRouteRegistrationLogs ?? !1); + n.observability = n.observability || {}, n.observability.verboseRouteRegistrationLogs = t, B(n), r("observability.verboseRouteRegistrationLogs"); + try { + let e = await we(t); + if (!e?.ok) throw Error(e?.error || "Failed to update route logging settings"); + } catch (e) { + n.observability.verboseRouteRegistrationLogs = i, B(n), r("observability.verboseRouteRegistrationLogs"), E(e?.message || "Failed to update route logging settings", "error"); + } + } + }), (async () => { + try { + let e = !!(await p())?.data?.prefs?.enabled; + n.observability = n.observability || {}, n.observability.verboseRouteRegistrationLogs !== e && (n.observability.verboseRouteRegistrationLogs = e, B(n), r("observability.verboseRouteRegistrationLogs")); + } catch (e) { + console.debug?.(e); + } + })(), e({ + id: `${W}.Observability.VerboseStartupLogs`, + category: s(M("cat.advanced"), "Logs"), + name: "Majoor: Verbose startup logs", + tooltip: "When disabled, Majoor suppresses most informational bootstrap logs during backend startup while keeping warnings and errors. Takes effect on the next backend restart.", + type: "boolean", + defaultValue: !!(n.observability?.verboseStartupLogs ?? R.observability?.verboseStartupLogs ?? !1), + onChange: async (e) => { + let t = !!e, i = !!(n.observability?.verboseStartupLogs ?? R.observability?.verboseStartupLogs ?? !1); + n.observability = n.observability || {}, n.observability.verboseStartupLogs = t, B(n), r("observability.verboseStartupLogs"); + try { + let e = await c(t); + if (!e?.ok) throw Error(e?.error || "Failed to update startup logging settings"); + } catch (e) { + n.observability.verboseStartupLogs = i, B(n), r("observability.verboseStartupLogs"), E(e?.message || "Failed to update startup logging settings", "error"); + } + } + }), (async () => { + try { + let e = !!(await re())?.data?.prefs?.enabled; + n.observability = n.observability || {}, n.observability.verboseStartupLogs !== e && (n.observability.verboseStartupLogs = e, B(n), r("observability.verboseStartupLogs")); + } catch (e) { + console.debug?.(e); + } + })(); + { + let t = "HuggingFace Token", i = "", a = null, o = 0, c = !!n.ai?.huggingFaceTokenVisible, l = () => { + try { + let e = Array.from(document.querySelectorAll("input[data-mjr-hf-token=\"1\"]")); + for (let t of e) try { + t.type = c ? "text" : "password"; + } catch (e) { + console.debug?.(e); + } + } catch (e) { + console.debug?.(e); + } + }, u = (e) => { + try { + let t = String(e || "").trim(); + if (!t) return; + let n = Array.from(document.querySelectorAll("input[data-mjr-hf-token=\"1\"]")); + for (let e of n) try { + e.placeholder = t; + } catch (e) { + console.debug?.(e); + } + } catch (e) { + console.debug?.(e); + } + }; + e({ + id: `${W}.AI.HuggingFaceTokenVisible`, + category: s(M("cat.advanced"), t), + name: "Show HuggingFace token", + tooltip: "Show or hide the HuggingFace token while editing.", + type: "boolean", + defaultValue: c, + onChange: (e) => { + let t = !!e; + c = t, n.ai = n.ai || {}, n.ai.huggingFaceTokenVisible = t, B(n), r("ai.huggingFaceTokenVisible"), setTimeout(l, 0); + } + }), e({ + id: `${W}.AI.HuggingFaceToken`, + category: s(M("cat.advanced"), t), + name: "HuggingFace Token", + tooltip: "Optional token for HuggingFace Hub downloads (higher rate limits).\nSaved server-side and used by CLIP model loading.\nLeave empty to clear the stored token.", + type: "text", + defaultValue: "", + attrs: { + placeholder: "Paste HuggingFace token (hf_...)", + type: c ? "text" : "password", + autocomplete: "new-password", + name: "mjr_huggingface_token", + "data-mjr-hf-token": "1" + }, + onChange: (e) => { + let t = String(e || "").trim(); + if (t !== i) { + try { + a &&= (clearTimeout(a), null); + } catch (e) { + console.debug?.(e); + } + a = setTimeout(async () => { + a = null; + let e = ++o; + try { + let n = await ce(t); + if (e !== o) return; + if (!n?.ok) throw Error(n?.error || "Failed to update HuggingFace token"); + i = t, r("ai.huggingFaceToken"), t ? E("HuggingFace token saved", "success") : E("HuggingFace token cleared", "success", void 0, { noHistory: !0 }); + } catch (t) { + if (e !== o) return; + E(t?.message || "Failed to update HuggingFace token", "error"); + } + }, 900); + } + } + }), setTimeout(l, 0), (async () => { + try { + let e = (await ne())?.data?.prefs || {}, t = !!e?.has_token, n = String(e?.token_hint || "").trim(), r = t ? `Configured ${n || "(saved)"}` : "Paste HuggingFace token (hf_...)"; + u(r); + } catch (e) { + console.debug?.(e); + } + })(), e({ + id: `${W}.AI.VerboseLogs`, + category: s(M("cat.advanced"), t), + name: "Majoor: Verbose AI logs", + tooltip: "Enable detailed HuggingFace/SigLIP2/X-CLIP logs and progress bars during model download/loading.", + type: "boolean", + defaultValue: !!(n.ai?.verboseAiLogs ?? R.ai?.verboseAiLogs ?? !1), + onChange: async (e) => { + let t = !!e, i = !!(n.ai?.verboseAiLogs ?? R.ai?.verboseAiLogs ?? !1); + n.ai = n.ai || {}, n.ai.verboseAiLogs = t, B(n), r("ai.verboseAiLogs"); + try { + let e = await ve(t); + if (!e?.ok) throw Error(e?.error || "Failed to update AI logging settings"); + } catch (e) { + n.ai.verboseAiLogs = i, B(n), r("ai.verboseAiLogs"), E(e?.message || "Failed to update AI logging settings", "error"); + } + } + }), (async () => { + try { + let e = !!(await g())?.data?.prefs?.enabled; + n.ai = n.ai || {}, n.ai.verboseAiLogs !== e && (n.ai.verboseAiLogs = e, B(n), r("ai.verboseAiLogs")); + } catch (e) { + console.debug?.(e); + } + })(); + } + e({ + id: `${W}.AI.VectorStats`, + category: s(M("cat.advanced"), "AI / Vector Search"), + name: "Vector Index Status", + tooltip: "Current status of the SigLIP2/X-CLIP vector index used for semantic search", + type: "text", + defaultValue: "Loading vector status..." + }), (async () => { + try { + let e = await i(); + e?.ok ? console.debug?.("[Majoor] Vector status:", `${e.data?.total || 0} assets indexed | Model: ${e.data?.model || "N/A"}`) : console.debug?.("[Majoor] Vector status unavailable"); + } catch (e) { + console.debug?.("[Majoor] Vector status fetch failed", e); + } + })(), e({ + id: `${W}.AI.VectorBackfillAction`, + category: s(M("cat.advanced"), "AI / Vector Search"), + name: "Vector Index Action", + tooltip: "Compute CLIP embeddings for all assets that don't have them yet.\nThis is required for AI semantic search to work.\n\nChoose 'Run backfill now' to start indexing.\nThis may take several minutes for large libraries.\n\nNote: New assets are indexed automatically during scanning.", + type: "combo", + defaultValue: "Idle", + options: ["Idle", "Run backfill now"], + onChange: async (e) => { + if (String(e || "") !== "Run backfill now") return; + let t = { history: { + trackId: "vector-backfill:advanced-settings", + title: "Vector Backfill", + source: "all", + operation: "vector_backfill", + forceStore: !0 + } }; + try { + E(M("toast.vectorBackfillStarting", "Starting vector backfill... This may take a while."), "info", void 0, { history: { + ...t.history, + status: "started", + detail: "Starting vector backfill... This may take a while." + } }); + let e = await b(64, { onProgress: (e) => { + let n = String(e?.status || "running").toLowerCase() || "running", r = e?.progress || e?.result || {}, i = Number(r?.candidates ?? r?.processed ?? 0), a = Number(r?.indexed ?? 0), o = Number(r?.skipped ?? 0), s = Number(r?.errors ?? 0), c = Math.max(i, a + o + s), l = c > 0 ? Math.round((a + o + s) / c * 100) : null, u = n === "queued" ? "Vector backfill queued" : `Candidates ${i}, indexed ${a}, skipped ${o}, errors ${s}`; + h({ + summary: "Vector Backfill", + detail: u + }, n === "failed" ? "error" : n === "succeeded" ? "success" : "info", 0, { history: { + ...t.history, + status: n, + detail: u, + progress: { + current: a + o + s, + total: c, + percent: l, + indexed: a, + skipped: o, + errors: s, + label: n + } + } }); + } }); + if (e?.ok) { + let n = e.data || {}, r = String(n?.status || "").toLowerCase(), a = !!n?.pending || [ + "queued", + "running", + "pending" + ].includes(r), o = n?.progress || {}, s = Number(n?.processed ?? o?.candidates ?? 0), c = Number(n?.indexed ?? o?.indexed ?? 0), l = Number(n?.skipped ?? o?.skipped ?? 0); + if (a) { + let e = String(n?.job_id || "").trim(); + E(M("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (job ${e.slice(0, 8)})` : "" }), "info", void 0, { history: { + ...t.history, + status: "running", + detail: `Vector backfill still running in background${e ? ` (${e.slice(0, 8)})` : ""}.`, + progress: { + current: c + l, + total: Math.max(s, c + l), + percent: Math.max(s, c + l) > 0 ? Math.round((c + l) / Math.max(s, c + l) * 100) : null, + indexed: c, + skipped: l, + label: "running" + } + } }); + } else { + let e = M("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { + processed: s, + indexed: c, + skipped: l + }); + E(e, "success", void 0, { history: { + ...t.history, + status: "succeeded", + detail: `Processed ${s}, indexed ${c}, skipped ${l}`, + progress: { + current: s, + total: s, + percent: s > 0 ? 100 : null, + indexed: c, + skipped: l, + label: "done" + } + } }); + } + try { + let e = await i(); + e?.ok && console.debug?.("[Majoor] Vector stats after backfill:", e.data); + } catch (e) { + console.debug?.("[Majoor] Failed to refresh vector stats:", e); + } + } else throw Error(e?.error || M("toast.vectorBackfillFailedGeneric", "Backfill failed")); + } catch (e) { + let n = e?.message || String(e || M("status.unknown", "unknown")); + E(M("toast.vectorBackfillFailedDetail", "Vector backfill failed: {error}", { error: n }), "error", void 0, { history: { + ...t.history, + status: "failed", + detail: n + } }), console.error("[Majoor] Vector backfill error:", e); + } + } + }); +} +// ui/app/settings/settingsSearch.ts +var sn = "Majoor", cn = "Majoor Assets Manager"; +function ln(e, t, n) { + let r = (e, t) => [ + cn, + e, + t + ]; + e({ + id: `${sn}.AI.VectorSearchEnabled`, + category: r(M("cat.search", "Search"), "AI"), + name: M("setting.ai.vector.enabled.name", "Enable AI semantic search"), + tooltip: M("setting.ai.vector.enabled.desc", "Enable/disable AI vector search features (SigLIP2/X-CLIP: description search, prompt alignment, AI tag suggestions, smart collections)."), + type: "boolean", + defaultValue: !!(t.ai?.vectorSearchEnabled ?? !0), + onChange: async (e) => { + t.ai = t.ai || {}; + let r = !!(t.ai.vectorSearchEnabled ?? !0), i = !!e; + t.ai.vectorSearchEnabled = i, B(t), V(t), n("ai.vectorSearchEnabled"); + try { + let e = await s(i); + if (!e?.ok) { + t.ai.vectorSearchEnabled = r, B(t), V(t), n("ai.vectorSearchEnabled"), E(e?.error || "Failed to update AI vector search setting", "error"); + return; + } + E(i ? "AI semantic search enabled" : "AI semantic search disabled", "info", 2200); + } catch (e) { + t.ai.vectorSearchEnabled = r, B(t), V(t), n("ai.vectorSearchEnabled"), E(e?.message || "Failed to update AI vector search setting", "error"); + } + } + }), e({ + id: `${sn}.AI.VectorCaptionOnIndex`, + category: r(M("cat.search", "Search"), "AI"), + name: M("setting.ai.vector.captionOnIndex.name", "Generate AI captions during indexing"), + tooltip: M("setting.ai.vector.captionOnIndex.desc", "Allow automatic vector indexing and backfill to run Florence-2 captions for image assets. This is slower and can use significant VRAM/CPU; leave it off for faster grid startup."), + type: "boolean", + defaultValue: !!(t.ai?.vectorCaptionOnIndex ?? !1), + onChange: async (e) => { + t.ai = t.ai || {}; + let r = !!(t.ai.vectorCaptionOnIndex ?? !1), i = !!e; + t.ai.vectorCaptionOnIndex = i, B(t), V(t), n("ai.vectorCaptionOnIndex"); + try { + let e = await s({ caption_on_index: i }); + if (!e?.ok) { + t.ai.vectorCaptionOnIndex = r, B(t), V(t), n("ai.vectorCaptionOnIndex"), E(e?.error || "Failed to update AI caption indexing setting", "error"); + return; + } + i && E("AI captions during indexing enabled", "info", 2600); + } catch (e) { + t.ai.vectorCaptionOnIndex = r, B(t), V(t), n("ai.vectorCaptionOnIndex"), E(e?.message || "Failed to update AI caption indexing setting", "error"); + } + } + }), e({ + id: `${sn}.AI.VectorIndexOnScan`, + category: r(M("cat.search", "Search"), "AI"), + name: M("setting.ai.vector.indexOnScan.name", "Index vectors during scans"), + tooltip: M("setting.ai.vector.indexOnScan.desc", "Compute SigLIP/X-CLIP embeddings while assets are scanned. Disable to avoid surprise VRAM use; run vector backfill manually when needed."), + type: "boolean", + defaultValue: !!(t.ai?.vectorIndexOnScan ?? !1), + onChange: async (e) => { + t.ai = t.ai || {}; + let r = !!(t.ai.vectorIndexOnScan ?? !1), i = !!e; + t.ai.vectorIndexOnScan = i, B(t), V(t), n("ai.vectorIndexOnScan"); + try { + let e = await s({ index_on_scan: i }); + if (!e?.ok) { + t.ai.vectorIndexOnScan = r, B(t), V(t), n("ai.vectorIndexOnScan"), E(e?.error || "Failed to update vector scan indexing", "error"); + return; + } + E(i ? "Vector indexing during scans enabled" : "Vector indexing during scans disabled", "info", 2400); + } catch (e) { + t.ai.vectorIndexOnScan = r, B(t), V(t), n("ai.vectorIndexOnScan"), E(e?.message || "Failed to update vector scan indexing", "error"); + } + } + }), e({ + id: `${sn}.AI.VectorConcurrency`, + category: r(M("cat.search", "Search"), "AI"), + name: M("setting.ai.vector.concurrency.name", "Vector indexing concurrency"), + tooltip: M("setting.ai.vector.concurrency.desc", "Maximum concurrent vector embedding workers. Use 1 to minimize transient VRAM spikes."), + type: "number", + defaultValue: Number(t.ai?.vectorConcurrency || 1), + attrs: { + min: 1, + max: 16, + step: 1 + }, + onChange: async (e) => { + t.ai = t.ai || {}; + let r = Number(t.ai.vectorConcurrency || 1), i = Math.max(1, Math.min(16, Math.floor(Number(e) || 1))); + t.ai.vectorConcurrency = i, B(t), V(t), n("ai.vectorConcurrency"); + try { + let e = await s({ concurrency: i }); + e?.ok || (t.ai.vectorConcurrency = r, B(t), V(t), n("ai.vectorConcurrency"), E(e?.error || "Failed to update vector concurrency", "error")); + } catch (e) { + t.ai.vectorConcurrency = r, B(t), V(t), n("ai.vectorConcurrency"), E(e?.message || "Failed to update vector concurrency", "error"); + } + } + }), e({ + id: `${sn}.AI.VectorUnloadAfterUse`, + category: r(M("cat.search", "Search"), "AI"), + name: M("setting.ai.vector.unloadAfterUse.name", "Unload AI models after use"), + tooltip: M("setting.ai.vector.unloadAfterUse.desc", "Unload Majoor SigLIP/X-CLIP/Florence models after heavy AI actions and call torch CUDA cache cleanup. This frees VRAM but makes the next AI action slower."), + type: "boolean", + defaultValue: !!(t.ai?.vectorUnloadAfterUse ?? !1), + onChange: async (e) => { + t.ai = t.ai || {}; + let r = !!(t.ai.vectorUnloadAfterUse ?? !1), i = !!e; + t.ai.vectorUnloadAfterUse = i, B(t), V(t), n("ai.vectorUnloadAfterUse"); + try { + let e = await s({ unload_after_use: i }); + if (!e?.ok) { + t.ai.vectorUnloadAfterUse = r, B(t), V(t), n("ai.vectorUnloadAfterUse"), E(e?.error || "Failed to update model unload setting", "error"); + return; + } + E(i ? "AI model unload after use enabled" : "AI model unload after use disabled", "info", 2400); + } catch (e) { + t.ai.vectorUnloadAfterUse = r, B(t), V(t), n("ai.vectorUnloadAfterUse"), E(e?.message || "Failed to update model unload setting", "error"); + } + } + }), e({ + id: `${sn}.AI.VectorUnloadNow`, + category: r(M("cat.search", "Search"), "AI"), + name: M("setting.ai.vector.unloadNow.name", "Memory purge now"), + tooltip: M("setting.ai.vector.unloadNow.desc", "Immediately unload Majoor AI vector/caption models, ask ComfyUI to unload loaded models, and clear torch CUDA cache when idle."), + type: "combo", + options: ["Idle", "Unload now"], + defaultValue: "Idle", + onChange: async (e) => { + if (String(e || "") === "Unload now") try { + let e = await _(); + E(e?.ok ? "Majoor AI model cache unloaded" : e?.error || "Failed to unload Majoor AI model cache", e?.ok ? "info" : "error", 2600); + } catch (e) { + E(e?.message || "Failed to unload Majoor AI model cache", "error"); + } + } + }), e({ + id: `${sn}.Search.MaxResults`, + category: r(M("cat.search", "Search")), + name: M("setting.search.maxResults.name", "Max search results (client)"), + tooltip: M("setting.search.maxResults.desc", "Maximum number of results requested per search. The backend still enforces MAJOOR_SEARCH_MAX_LIMIT; increase that env var if you need a higher hard cap."), + type: "number", + defaultValue: Number(t.search?.maxResults || N.SEARCH_DEFAULT_LIMIT), + attrs: { + min: 10, + max: N.MAX_PAGE_SIZE || 2e3, + step: 1 + }, + onChange: (e) => { + t.search = t.search || {}, t.search.maxResults = Math.max(10, Math.min(N.MAX_PAGE_SIZE || 2e3, Number(e) || N.SEARCH_DEFAULT_LIMIT)), B(t), V(t), n("search.maxResults"); + } + }), e({ + id: `${sn}.EnvVars.Reference`, + category: r(M("cat.advanced"), "Environment variables"), + name: "Environment variables reference", + tooltip: "Set these env vars before starting ComfyUI to override defaults:\n\nMAJOOR_OUTPUT_DIRECTORY - Override output root directory\nMAJOOR_EXIFTOOL_PATH - Path to exiftool binary\nMAJOOR_FFPROBE_PATH - Path to ffprobe binary\nMAJOOR_MEDIA_PROBE_BACKEND - Probe mode: auto|exiftool|ffprobe|both\nMAJOOR_EXIFTOOL_TIMEOUT - ExifTool timeout in seconds (default: 15)\nMAJOOR_FFPROBE_TIMEOUT - FFprobe timeout in seconds (default: 10)\nMAJOOR_DB_TIMEOUT - Database timeout in seconds (default: 30)\nMAJOOR_DB_MAX_CONNECTIONS - Max DB connections (default: 8)\nMAJOOR_METADATA_CACHE_MAX - Metadata cache max entries (default: 100000)\nMAJOOR_METADATA_EXTRACT_CONCURRENCY - Parallel metadata workers (default: 1)\nMJR_ENABLE_WATCHER - Enable file watcher: 1|0 (default: 1)\nMJR_WATCHER_DEBOUNCE_MS - Watcher debounce delay in ms (default: 3000)\nMJR_WATCHER_DEDUPE_TTL_MS - Watcher dedupe window in ms (default: 3000)\nMJR_WATCHER_MAX_FILE_SIZE_BYTES - Max file size to index (default: 512MB)\nMJR_WATCHER_FLUSH_MAX_FILES - Max files per flush batch (default: 256)\nMJR_WATCHER_PENDING_MAX - Max pending watcher queue (default: 5000)\nMJR_AM_ENABLE_VECTOR_SEARCH - Enable AI vector/semantic search: 1|0 (default: 1)\nMJR_AM_VECTOR_INDEX_ON_SCAN - Compute vectors during scans: 1|0 (default: 0)\nMJR_AM_VECTOR_CAPTION_ON_INDEX - Generate Florence captions during vector indexing: 1|0 (default: 0)\nMJR_VECTOR_CONCURRENCY - Concurrent vector workers (default: 2, use 1 for lower VRAM spikes)\nMJR_AM_VECTOR_UNLOAD_AFTER_USE - Unload Majoor AI models after heavy vector actions: 1|0 (default: 0)\nMAJOOR_SEARCH_MAX_LIMIT - Max search results (default: 500)\nMAJOOR_BG_SCAN_ON_LIST - Scan on directory list: 0|1 (default: 0)", + type: "text", + defaultValue: "Hover for full list of environment variables" + }); +} +// ui/app/settings/SettingsPanel.ts +var un = "Majoor Assets Manager", dn = /^\s*Majoor:\s*/i, fn = Object.freeze({ + ASSETS_PANEL: "Assets Panel", + GENERATED_FEED: "Generated Feed", + VIEWER: "Viewer & Floating Viewer", + INDEXING: "Indexing & Watcher", + SEARCH_AI: "Search & AI", + GENERAL: "General", + ADVANCED: "Advanced", + SECURITY: "Security" +}), pn = /* @__PURE__ */ new Set([ + "grid.starColor", + "grid.badgeImageColor", + "grid.badgeVideoColor", + "grid.badgeAudioColor", + "grid.badgeModel3dColor", + "grid.badgeDuplicateAlertColor", + "ui.cardHoverColor", + "ui.cardSelectionColor", + "ui.ratingColor", + "ui.tagColor" +]), mn = "Majoor.General.ResetAllSettings", hn = "mjr-settings-reset-btn", gn = null, _n = null; +function vn(e) { + let t = String(e || "").trim(); + return !t || t === mn || t === "Majoor.Language" ? fn.GENERAL : /^Majoor\.(Safety|Security)\./.test(t) ? fn.SECURITY : /^Majoor\.(Paths|Db|ProbeBackend|MetadataFallback|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" ? fn.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? fn.VIEWER : /^Majoor\.Feed\./.test(t) ? fn.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) || t === "Majoor.RtHydrate.Concurrency" ? fn.INDEXING : /^Majoor\.AI\.(HuggingFaceTokenVisible|HuggingFaceToken|VerboseLogs|VectorStats|VectorBackfillAction|VectorSearchEnabled|VectorCaptionOnIndex|VectorIndexOnScan|VectorConcurrency|VectorUnloadAfterUse|VectorUnloadNow)$/.test(t) || /^Majoor\.Search\./.test(t) ? fn.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? fn.ASSETS_PANEL : fn.GENERAL; +} +function yn(e) { + let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = vn(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(dn, "").trim(); + return [ + un, + n, + i || r || a || n + ]; +} +var bn = !1, xn = null, Sn = null, Cn = !1, wn = /* @__PURE__ */ new Set(); +function Tn(e) { + if (!e || typeof e != "object") return null; + let t = { ...e }; + try { + typeof t.name == "string" && (t.name = t.name.replace(dn, "").trim()); + } catch (e) { + console.debug?.(e); + } + try { + t.category = yn(t); + } catch { + t.category = [un, fn.GENERAL]; + } + return !t.tooltip && typeof t.name == "string" && t.name.trim() && (t.tooltip = t.name.trim()), t; +} +function En(e, t, n) { + let r = String(t?.id || "").trim(); + if (!r || wn.has(r)) return !1; + wn.add(r); + try { + return S(e, r, n); + } finally { + wn.delete(r); + } +} +function Dn(e, t) { + if (!t || typeof t != "object") return t; + let n = { ...t }; + En(e, n, n.defaultValue); + let r = n.onChange; + return n.onChange = (t, ...i) => { + if (En(e, n, t), typeof r == "function") return r(t, ...i); + n.defaultValue = t; + }, n; +} +function On(e) { + try { + return JSON.parse(JSON.stringify(e || {})); + } catch { + return { ...R }; + } +} +function kn(e, t, n, { wrapForComfy: r = !0 } = {}) { + let i = [], a = (e) => { + let n = Tn(e); + n && i.push(r ? Dn(t, n) : n); + }; + return At(a, e, n), Rt(a, e, n), Nt(a, e, n), Ft(a, e, n), rn(a, e, n), on(a, e, n, t), ln(a, e, n), i; +} +function An(e, t) { + if (e === t) return !0; + try { + return JSON.stringify(e) === JSON.stringify(t); + } catch { + return !1; + } +} +function jn(e) { + return e ? e.querySelector(".form-input") || e.querySelector(".p-inputgroup") || e.querySelector(".setting-input") || e.querySelector("[class*='input']") : null; +} +function Mn(e, t) { + let n = document.createElement("button"); + return n.type = "button", n.className = hn, n.textContent = e, n.title = t, n.style.marginLeft = "8px", n.style.minWidth = e.length > 2 ? "auto" : "24px", n.style.height = "24px", n.style.padding = e.length > 2 ? "0 10px" : "0", n.style.borderRadius = "6px", n.style.border = "1px solid var(--border-color, #555)", n.style.background = "var(--comfy-input-bg, #2b2b2b)", n.style.color = "var(--input-text, inherit)", n.style.cursor = "pointer", n.style.fontSize = "12px", n.style.lineHeight = "22px", n.style.flexShrink = "0", n; +} +function Nn(e, t, n) { + String(e?.id || "").trim() && (En(n, e, t), typeof e?.onChange == "function" && e.onChange(t)); +} +function Pn(e, t, n, r) { + let i = !An(a(r, t.id, t.defaultValue), n); + e.disabled = !i, e.style.opacity = i ? "1" : "0.45"; +} +function Fn() { + if (typeof document > "u" || !_n) return; + let { app: e, definitions: t, defaultValues: n } = _n, r = document.querySelector(`[data-setting-id="${mn}"]`), i = jn(r); + if (r && i && !r.getAttribute("data-mjr-reset-injected")) { + r.setAttribute("data-mjr-reset-injected", "true"), i.innerHTML = ""; + let a = Mn("Reset all settings", "Reset all Majoor settings to defaults"); + a.onclick = (r) => { + r.preventDefault(), r.stopPropagation(); + for (let r of t) r.id !== mn && n.has(r.id) && Nn(r, n.get(r.id), e); + Fn(); + }, i.appendChild(a); + } + for (let r of t) { + if (!r?.id || r.id === mn || !n.has(r.id)) continue; + let t = document.querySelector(`[data-setting-id="${r.id}"]`); + if (!t || t.getAttribute("data-mjr-reset-injected")) continue; + let i = jn(t); + if (!i) continue; + t.setAttribute("data-mjr-reset-injected", "true"); + let a = Mn("Reset", "Reset this setting to default"); + Pn(a, r, n.get(r.id), e), a.onclick = (t) => { + t.preventDefault(), t.stopPropagation(); + let i = n.get(r.id); + Nn(r, i, e), Pn(a, r, i, e); + }, i.appendChild(a); + } +} +function In(e, t, n) { + typeof document < "u" && typeof MutationObserver < "u" && (_n = { + app: e, + definitions: t, + defaultValues: new Map(n.filter((e) => e?.id && e.id !== mn).map((e) => [e.id, e.defaultValue])) + }, Fn(), !gn && (gn = new MutationObserver(() => Fn()), gn.observe(document.body, { + childList: !0, + subtree: !0 + }))); +} +function Ln(e, t, { initRuntime: n = !1 } = {}) { + if (Sn) typeof t == "function" && Sn.onAppliedListeners.add(t), e && !Sn.app && (Sn.app = e); + else { + let n = z(); + n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? xe(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, xe(!0), B(n)); + let r = /* @__PURE__ */ new Set(); + typeof t == "function" && r.add(t); + let i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = () => { + if (!i.size) return; + let e = Array.from(i); + i.clear(); + for (let t of e) ke("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + }, s = () => { + if (!a.size) return; + let e = Array.from(a); + a.clear(); + for (let t of e) ke("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + }, c = _t(o, 120), l = _t(s, 450), u = (e) => { + typeof e == "string" && i.add(e), c(); + }, d = (e) => { + typeof e == "string" && a.add(e), l(); + }, f = () => { + let e = z(); + Object.assign(n, e), V(n), u("storage"); + }, p = (e) => { + e && e.key === "mjrSettings" && e.newValue !== e.oldValue && f(); + }; + if (!bn) { + if (xn && typeof window < "u") try { + window.removeEventListener("storage", xn); + } catch (e) { + console.debug?.(e); + } + try { + window.addEventListener("storage", p), bn = !0, xn = p; + } catch (e) { + console.debug?.(e); + } + } + Sn = { + app: e, + notifyApplied: (e) => { + for (let t of r) try { + t(n, e); + } catch (e) { + console.debug?.(e); + } + pn.has(String(e || "")) ? d(e) : u(e); + }, + onAppliedListeners: r, + refreshFromStorage: f, + settings: n + }; + } + if (n && !Cn) { + let t = e || Sn.app, n = Sn.settings; + oe(t), V(n), be(t), rt(), it(), at(), n?.watcher && typeof n.watcher.enabled == "boolean" && de(!!n.watcher.enabled).catch(() => {}), ht(), Cn = !0; + } + return Sn; +} +var Rn = (e, t) => Ln(e, t, { initRuntime: !0 }).settings, zn = (e, t) => { + let n = Ln(e, t, { initRuntime: !1 }); + Object.assign(n.settings, z()); + let r = e || n.app, i = kn(n.settings, r, n.notifyApplied), a = kn(On(R), r, () => {}, { wrapForComfy: !1 }); + return i.unshift(Dn(r, { + id: mn, + category: [ + un, + fn.GENERAL, + "Reset" + ], + name: "Reset all settings to defaults", + tooltip: "Reset every Majoor Assets Manager setting to its default value.", + type: "text", + defaultValue: "" + })), In(r, i, a), i; +}; +try { + let e = z(); + e?.watcher && typeof e.watcher.enabled == "boolean" && Se().then((e) => { + let t = !!e?.ok && !!e?.data?.enabled, n = z(); + n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, B(n), ke("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); + }).catch(() => {}); +} catch (e) { + console.debug?.(e); +} +// ui/features/viewer/workflowGraphMap/workflowNodeLabeling.ts +var Bn = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Vn = /^[0-9a-f]{20,}$/i; +function Hn(...e) { + for (let t of e) { + let e = String(t || "").trim(); + if (e) return e; + } + return ""; +} +function Un(e) { + let t = String(e || "").trim(); + return !!t && (Bn.test(t) || Vn.test(t)); +} +function Wn(e) { + return String(e?.type || e?.class_type || e?.comfyClass || e?.classType || "").trim(); +} +function Gn(e) { + return Hn(e?.properties?.subgraph_name, e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name, e?.subgraph?.name, e?.subgraph_instance?.name); +} +function Kn(e) { + let t = Wn(e), n = Gn(e); + return n && (!t || Un(t) || n !== t) ? n : t && !Un(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node"); +} +function qn(e) { + let t = Wn(e); + return t && !Un(t) ? t : t ? "Subgraph" : "Node"; +} +// ui/components/sidebar/utils/minimap.ts +var Jn = 6, Yn = 1, Xn = 64, Zn = 74, Qn = 42, $n = [ + ["sampler", "#8e5cff"], + ["ksampler", "#8e5cff"], + ["loader", "#4f8cff"], + ["load", "#4f8cff"], + ["clip", "#d4a634"], + ["vae", "#36a7c9"], + ["latent", "#47a56d"], + ["image", "#8fb04a"], + ["video", "#c47b3d"], + ["mask", "#999999"], + ["conditioning", "#b56bd8"], + ["controlnet", "#c44f76"], + ["lora", "#d27a45"], + ["save", "#4aa37c"], + ["preview", "#4aa37c"], + ["api", "#3aa6a6"] +], er = (e, t, n) => { + let r = Number(e); + return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; +}, tr = (e, t = !1) => { + let n = String(e || "").toUpperCase(); + return n.includes("IMAGE") ? "rgba(145,198,99,0.9)" : n.includes("LATENT") ? "rgba(89,178,118,0.9)" : n.includes("MODEL") ? "rgba(112,155,255,0.9)" : n.includes("CONDITIONING") ? "rgba(191,123,226,0.9)" : n.includes("CLIP") ? "rgba(220,178,77,0.9)" : n.includes("VAE") ? "rgba(72,184,214,0.9)" : n.includes("MASK") ? "rgba(190,190,190,0.88)" : n.includes("STRING") || n.includes("TEXT") ? "rgba(230,230,230,0.86)" : n.includes("INT") || n.includes("FLOAT") || n.includes("NUMBER") ? "rgba(130,210,220,0.88)" : t ? "rgba(170,220,255,0.82)" : "rgba(255,255,255,0.72)"; +}, nr = (e, t, n) => { + let r = String(t || "").replace(/\s+/g, " ").trim(), i = Math.max(1, Number(n) || 1); + if (!r || e.measureText(r).width <= i) return r; + let a = r; + for (; a.length > 3 && e.measureText(`${a}...`).width > i;) a = a.slice(0, -1); + return a.length > 3 ? `${a}...` : r.slice(0, 3); +}; +function rr(e, t, n = null) { + if (!e) return; + let r = e.getContext?.("2d"); + if (!r) return; + let i = { + nodeColors: !0, + showLinks: !0, + showGroups: !0, + renderBypassState: !0, + renderErrorState: !0, + showViewport: !0, + showNodeLabels: !1, + expandSubgraphs: !0, + ...n && typeof n == "object" ? n : {} + }, a = i.expandSubgraphs === !1 ? t : ir(t), o = Array.isArray(a?.nodes) ? a.nodes : [], s = Array.isArray(a?.groups) && a.groups || Array.isArray(a?.extra?.groups) && a.extra.groups || Array.isArray(a?.extra?.groupNodes) && a.extra.groupNodes || Array.isArray(a?.extra?.group_nodes) && a.extra.group_nodes || [], c = Array.isArray(a?.links) && a.links || Array.isArray(a?.extra?.links) && a.extra.links || [], l = Math.max(1, e.clientWidth || e.width || 1), u = Math.max(1, e.clientHeight || e.height || 1); + if ((!o || o.length === 0) && (!s || s.length === 0)) return r.clearRect(0, 0, l, u), null; + let d = (e, t) => { + if (!e || typeof e != "string") return `rgba(255,255,255,${t})`; + let n = e.trim(); + if (!n) return `rgba(255,255,255,${t})`; + let r = n.match(/^rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([0-9.]+))?\)\s*$/i); + if (r) { + let e = Number(r[1]), n = Number(r[2]), i = Number(r[3]); + if ([ + e, + n, + i + ].every((e) => Number.isFinite(e))) return `rgba(${e},${n},${i},${t})`; + } + let i = n.startsWith("#") ? n.slice(1) : ""; + if (i.length === 3) { + let e = parseInt(i[0] + i[0], 16), n = parseInt(i[1] + i[1], 16), r = parseInt(i[2] + i[2], 16); + if ([ + e, + n, + r + ].every((e) => Number.isFinite(e))) return `rgba(${e},${n},${r},${t})`; + } + if (i.length === 6) { + let e = parseInt(i.slice(0, 2), 16), n = parseInt(i.slice(2, 4), 16), r = parseInt(i.slice(4, 6), 16); + if ([ + e, + n, + r + ].every((e) => Number.isFinite(e))) return `rgba(${e},${n},${r},${t})`; + } + return n; + }, f = (e) => { + let t = e?.bgcolor || e?.color || null; + if (t) return t; + let n = String(e?.category || e?.type || e?.comfyClass || e?.class_type || e?.title || "").toLowerCase(); + for (let [e, t] of $n) if (n.includes(e)) return t; + let r = 0; + for (let e = 0; e < n.length; e += 1) r = r * 31 + n.charCodeAt(e) | 0; + return `hsl(${Math.abs(r) % 360} 42% 42%)`; + }, p = (e) => { + let t = [], n = e?.inputs && typeof e.inputs == "object" && !Array.isArray(e.inputs) ? e.inputs : null; + if (n) { + for (let [e, r] of Object.entries(n)) if (!(Array.isArray(r) || r && typeof r == "object") && (t.push([e, r]), t.length >= 3)) return t; + } + let r = Array.isArray(e?.widgets_values) ? e.widgets_values : [], i = Array.isArray(e?.widgets) ? e.widgets : [], a = Array.isArray(e?.inputs) ? e.inputs : [], o = a.filter((e) => e?.widget === !0 || e?.widget && typeof e.widget == "object" || typeof e?.widget == "string" && e.widget.trim()), s = a.filter((e) => e?.link == null && fr(e?.type)), c = (o.length ? o : s.length ? s : a).map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); + return r.forEach((e, n) => { + let r = i[n]?.name || i[n]?.label || c[n] || `p${n + 1}`; + t.push([r, e]); + }), t.slice(0, 3); + }, m = [], h = /* @__PURE__ */ new Map(), g = (e) => { + if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; + if (e && typeof e == "object") { + let t = e[0] ?? e[0] ?? e.x ?? e.left ?? null, n = e[1] ?? e[1] ?? e.y ?? e.top ?? null; + if (t !== null && n !== null) return [Number(t), Number(n)]; + } + return null; + }, _ = (e) => { + if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; + if (e && typeof e == "object") { + let t = e[0] ?? e[0] ?? e.w ?? e.width ?? null, n = e[1] ?? e[1] ?? e.h ?? e.height ?? null; + if (t !== null && n !== null) return [Number(t), Number(n)]; + } + return null; + }; + for (let e of o || []) { + let t = e?.id ?? e?.ID ?? e?.node_id ?? null, n = t == null ? null : String(t), r = g(e?.pos), o = _(e?.size); + if (!r || !o) continue; + let s = Number(r[0]), c = Number(r[1]), l = Math.max(1, Number(o[0])), u = Math.max(1, Number(o[1])); + if (!Number.isFinite(s) || !Number.isFinite(c) || !Number.isFinite(l) || !Number.isFinite(u)) continue; + let d = Number(e?.mode), v = d === 2 || d === 4, y = a?.extra?.errors || a?.extra?.node_errors || null, b = !!(y && typeof y == "object" && n && y[n] || e?.error || e?.errors || e?.flags?.error || e?.properties?.error), x = f(e), S = Array.isArray(e?.inputs) ? e.inputs : [], C = Array.isArray(e?.outputs) ? e.outputs : []; + m.push({ + kind: "node", + id: n, + x: s, + y: c, + w: l, + h: u, + fill: i.nodeColors ? x : null, + stroke: i.nodeColors ? e?.color || x : null, + bypassed: v, + errored: b, + type: String(e?.type || e?.comfyClass || e?.class_type || "").trim(), + rows: p(e), + inputs: S, + outputs: C, + inputCount: S.length || (e?.inputs && typeof e.inputs == "object" ? Object.keys(e.inputs).length : 0), + outputCount: C.length, + label: Kn(e).replace(/\s+/g, " ").trim() + }), n && h.set(n, m[m.length - 1]); + } + if (i.showGroups) for (let e of s || []) { + let t = Array.isArray(e?.bounding) && e.bounding.length >= 4 ? e.bounding : null, n = t ? [Number(t[0]), Number(t[1])] : g(e?.pos), r = t ? [Number(t[2]), Number(t[3])] : _(e?.size); + if (!n || !r) continue; + let i = Number(n[0]), a = Number(n[1]), o = Math.max(1, Number(r[0])), s = Math.max(1, Number(r[1])); + Number.isFinite(i) && Number.isFinite(a) && Number.isFinite(o) && Number.isFinite(s) && m.push({ + kind: "group", + x: i, + y: a, + w: o, + h: s, + fill: e?.color || e?.bgcolor || e?.borderColor || null, + stroke: e?.borderColor || e?.color || e?.bgcolor || null + }); + } + if (!m.length) return r.clearRect(0, 0, l, u), null; + let v = m[0].x, y = m[0].y, b = m[0].x + m[0].w, x = m[0].y + m[0].h; + for (let e of m) v = Math.min(v, e.x), y = Math.min(y, e.y), b = Math.max(b, e.x + e.w), x = Math.max(x, e.y + e.h); + let S = Math.max(1, b - v), C = Math.max(1, x - y), ee = v + S / 2, te = y + C / 2, w = i.view && typeof i.view == "object" ? i.view : Object.create(null), ne = er(w.zoom ?? 1, Yn, Xn), T = Math.max(1, S / ne), E = Math.max(1, C / ne), D = T / 2, O = E / 2, re = T >= S ? ee : er(w.centerX ?? ee, v + D, b - D), ie = E >= C ? te : er(w.centerY ?? te, y + O, x - O), ae = re - D, k = ie - O, A = Jn, j = Math.min((l - 12) / T, (u - 12) / E), oe = w.hoveredNodeId !== null && w.hoveredNodeId !== void 0 ? String(w.hoveredNodeId) : null; + r.clearRect(0, 0, l, u), r.fillStyle = "rgba(0,0,0,0.22)", r.fillRect(0, 0, l, u); + let se = (e, t) => ({ + x: A + (e - ae) * j, + y: A + (t - k) * j + }), ce = (e, t) => ({ + x: er(ae + (Number(e) - A) / j, v, b), + y: er(k + (Number(t) - A) / j, y, x) + }), ue = (e) => ({ + x: A + (e.x - ae) * j, + y: A + (e.y - k) * j, + w: Math.max(1, e.w * j), + h: Math.max(1, e.h * j) + }), M = (e) => Math.max(10, Math.min(24, Math.floor(Number(e) * .2))), de = (e, t, n) => { + let r = ue(e), i = M(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = er(t, 0, Math.max(0, o - 1)); + return r.y + i + (r.h - i) * (s + 1) / (o + 1); + }, fe = (e) => Array.isArray(e) && e.length >= 5 ? { + originId: e[1], + originSlot: Number(e[2]) || 0, + targetId: e[3], + targetSlot: Number(e[4]) || 0, + type: e[5] + } : e && typeof e == "object" ? { + originId: e.origin_id ?? e.originId ?? e.from ?? null, + originSlot: Number(e.origin_slot ?? e.originSlot ?? e.fromSlot ?? 0) || 0, + targetId: e.target_id ?? e.targetId ?? e.to ?? null, + targetSlot: Number(e.target_slot ?? e.targetSlot ?? e.toSlot ?? 0) || 0, + type: e.type + } : null, pe = (e) => { + let t = String(e || "").toUpperCase(); + return t.includes("IMAGE") ? "rgba(145,198,99,0.38)" : t.includes("LATENT") ? "rgba(89,178,118,0.38)" : t.includes("MODEL") ? "rgba(112,155,255,0.38)" : t.includes("CONDITIONING") ? "rgba(191,123,226,0.38)" : t.includes("CLIP") ? "rgba(220,178,77,0.38)" : t.includes("VAE") ? "rgba(72,184,214,0.38)" : t.includes("MASK") ? "rgba(190,190,190,0.36)" : "rgba(255,255,255,0.2)"; + }, me = () => { + if (i.showLinks && c && c.length !== 0) { + r.save(), r.globalAlpha = 1, r.lineWidth = 1; + for (let e of c) { + let t = fe(e), n = t?.originId, i = t?.targetId; + if (n === null || i === null) continue; + let a = h.get(String(n)), o = h.get(String(i)); + if (!a || !o) continue; + let s = ue(a), c = ue(o), l = { + x: s.x + s.w, + y: de(a, t?.originSlot ?? 0, "output") + }, u = { + x: c.x, + y: de(o, t?.targetSlot ?? 0, "input") + }, d = Math.max(12, Math.min(80, Math.abs(u.x - l.x) * .35)); + r.strokeStyle = pe(t?.type), r.beginPath(), r.moveTo(l.x, l.y), r.bezierCurveTo(l.x + d, l.y, u.x - d, u.y, u.x, u.y), r.stroke(); + } + r.restore(); + } + }, N = (e) => { + let { x: t, y: n, w: a, h: o } = ue(e), s = e.kind === "node", c = e.kind === "group", l = !!e.bypassed, u = !!e.errored, f = c ? .18 : l && i.renderBypassState ? .14 : .62, p = c ? .55 : l && i.renderBypassState ? .32 : .8, m = d(e.fill, f), h = d(e.stroke, p), g = s && i.showNodeLabels && a >= Zn && o >= Qn, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? M(o) : 0; + if (r.save(), r.globalAlpha = 1, typeof m == "string" && (m.startsWith("#") || m.startsWith("rgb") || m.startsWith("hsl")) ? (r.fillStyle = m, r.globalAlpha = f) : (r.fillStyle = typeof m == "string" ? m : "rgba(82,88,96,0.72)", r.globalAlpha = f), typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, o, _), r.fill()) : r.fillRect(t, n, a, o), r.restore(), s && (r.save(), r.fillStyle = d(e.stroke || e.fill, l ? .34 : .9), typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, v, [ + _, + _, + 0, + 0 + ]), r.fill()) : r.fillRect(t, n, a, v), r.restore()), r.globalAlpha = 1, r.strokeStyle = "rgba(255,255,255,0.22)", typeof h == "string" && (h.startsWith("#") || h.startsWith("rgb") || h.startsWith("hsl")) && (r.save(), r.globalAlpha = p, r.strokeStyle = h, r.restore()), s && l && i.renderBypassState) try { + r.setLineDash([3, 2]); + } catch (e) { + console.debug?.(e); + } + else try { + r.setLineDash([]); + } catch (e) { + console.debug?.(e); + } + if (r.lineWidth = 1, typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, o, _), r.stroke()) : r.strokeRect(t, n, a, o), s && a >= 24 && o >= 20) { + let n = Math.min(g ? 16 : 6, Number(e.inputCount) || 0), i = Math.min(g ? 16 : 6, Number(e.outputCount) || 0); + r.save(), r.strokeStyle = "rgba(0,0,0,0.48)", r.lineWidth = 1; + for (let i = 0; i < n; i += 1) { + let n = de(e, i, "input"); + r.fillStyle = tr(e.inputs?.[i]?.type, !1), r.beginPath(), r.arc(t, n, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); + } + for (let n = 0; n < i; n += 1) { + let i = de(e, n, "output"); + r.fillStyle = tr(e.outputs?.[n]?.type, !0), r.beginPath(), r.arc(t + a, i, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); + } + r.restore(); + } + if (s && u && i.renderErrorState) { + try { + r.setLineDash([]); + } catch (e) { + console.debug?.(e); + } + r.strokeStyle = "rgba(244,67,54,0.95)", r.lineWidth = 1.5, r.strokeRect(t - .5, n - .5, a + 1, o + 1); + } + if (s && oe && String(e.id || "") === oe) { + try { + r.setLineDash([]); + } catch (e) { + console.debug?.(e); + } + r.strokeStyle = "rgba(255,224,130,0.96)", r.lineWidth = 2, r.strokeRect(t - 1, n - 1, a + 2, o + 2); + } + if (s && i.showNodeLabels && e.label && a >= 42 && o >= 12) { + let i = Math.max(8, Math.min(12, Math.floor(v * .58))), o = n + Math.max(8, Math.floor((v + i) / 2) - 1), s = Math.max(20, a - 6), c = e.label; + for (r.save(), r.beginPath(), r.rect(t + 2, n + 1, a - 4, v - 1), r.clip(), r.font = `600 ${i}px sans-serif`; c.length > 3 && r.measureText(`${c}...`).width > s;) c = c.slice(0, -1); + let l = c === e.label ? c : `${c}...`; + r.fillStyle = "rgba(255,255,255,0.92)", r.shadowColor = "rgba(0,0,0,0.5)", r.shadowBlur = 2, r.fillText(l, t + 3, o, s), r.restore(); + } + if (s && i.showNodeLabels && Array.isArray(e.rows) && a >= 76 && o >= 46) { + let i = Math.max(7, Math.min(10, Math.floor(o * .12))), s = Math.max(9, i + 4), c = n + v + 4; + r.save(), r.font = `500 ${i}px sans-serif`, r.fillStyle = "rgba(255,255,255,0.62)"; + for (let l = 0; l < e.rows.length; l += 1) { + let u = c + l * s; + if (u + s > n + o - 2) break; + let [d, f] = e.rows[l], p = `${String(d)}: ${String(f).replace(/\s+/g, " ").slice(0, 42)}`; + r.fillText(p, t + 5, u + i, Math.max(20, a - 10)); + } + r.restore(); + } + if (g && a >= 110) { + let n = Math.max(7, Math.min(9, Math.floor(o * .09))); + r.save(), r.font = `500 ${n}px sans-serif`, r.fillStyle = "rgba(255,255,255,0.5)"; + let i = Math.max(24, a * .34); + for (let a = 0; a < Math.min(8, e.inputs?.length || 0); a += 1) { + let o = e.inputs[a], s = String(o?.label || o?.localized_name || o?.name || "").trim(); + s && r.fillText(nr(r, s, i), t + 7, de(e, a, "input") + n * .35, i); + } + for (let o = 0; o < Math.min(8, e.outputs?.length || 0); o += 1) { + let s = e.outputs[o], c = String(s?.label || s?.localized_name || s?.name || "").trim(); + if (!c) continue; + let l = nr(r, c, i); + r.fillText(l, t + a - 7 - Math.min(i, r.measureText(l).width), de(e, o, "output") + n * .35, i); + } + r.restore(); + } + }; + for (let e of m.filter((e) => e.kind === "group")) N(e); + me(); + for (let e of m.filter((e) => e.kind === "node")) N(e); + if (i.showViewport) try { + let e = le(); + if (e) { + let t = se(e.x0, e.y0), n = se(e.x1, e.y1), i = Math.min(t.x, n.x), a = Math.min(t.y, n.y), o = Math.abs(n.x - t.x), s = Math.abs(n.y - t.y); + r.save(), r.globalAlpha = 1, r.strokeStyle = "rgba(255,255,255,0.9)", r.lineWidth = 1, r.strokeRect(i, a, o, s), r.restore(); + } + } catch (e) { + console.debug?.(e); + } + return r.globalAlpha = 1, { + bounds: { + minX: v, + minY: y, + maxX: b, + maxY: x, + width: S, + height: C + }, + resolvedView: { + zoom: ne, + centerX: re, + centerY: ie, + visibleW: T, + visibleH: E, + viewMinX: ae, + viewMinY: k, + pad: A, + renderScale: j + }, + canvasToWorld: ce, + worldToCanvas: se, + hitTestNode: (e, t) => { + let n = ce(e, t); + for (let e = m.length - 1; e >= 0; --e) { + let t = m[e]; + if (t.kind === "node" && n.x >= t.x && n.x <= t.x + t.w && n.y >= t.y && n.y <= t.y + t.h) return t; + } + return null; + } + }; +} +function ir(e, t = null) { + if (!e || typeof e != "object") return e; + let n = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], r = ar(e, t); + if (!n.length) return e; + let i = [], a = Array.isArray(e.links) ? [...e.links] : [], o = [...Array.isArray(e.groups) ? e.groups : [], ...Array.isArray(e.extra?.groups) ? e.extra.groups : []]; + for (let e of n) { + i.push(e); + let t = or(e, r); + if (!t || !Array.isArray(t.nodes) || !t.nodes.length) continue; + let n = cr(e, ir(t, r)); + i.push(...n.nodes), a.push(...n.links), n.group && o.push(n.group); + } + return { + ...e, + nodes: i, + links: a, + groups: o, + extra: { + ...e.extra || {}, + groups: o + } + }; +} +function ar(e, t = null) { + let n = [ + ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], + ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], + ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] + ], r = new Map(t || []); + for (let e of n) for (let t of sr(e)) t != null && r.set(String(t), e); + return r; +} +function or(e, t) { + let n = [ + e?.type, + e?.comfyClass, + e?.class_type, + e?.properties?.subgraph_id, + e?.properties?.subgraphId, + e?.subgraph?.id, + e?._subgraph?.id, + e?.subgraph_instance?.id + ]; + for (let e of n) { + if (e == null) continue; + let n = t.get(String(e)); + if (n) return n; + } + return [ + e?.subgraph, + e?._subgraph, + e?.subgraph?.graph, + e?.subgraph?.lgraph, + e?.properties?.subgraph, + e?.subgraph_instance, + e?.subgraph_instance?.graph, + e?.inner_graph, + e?.subgraph_graph + ].find((e) => e && typeof e == "object" && Array.isArray(e.nodes)) || null; +} +function sr(e) { + return [ + e?.id, + e?.name, + e?.type, + e?.uuid, + e?.workflowId, + e?.workflow_id, + e?.properties?.subgraph_id, + e?.properties?.subgraphId + ].filter((e) => e != null && String(e).trim()); +} +function cr(e, t) { + let n = String(e?.id ?? e?.ID ?? ""), r = ur(e?.pos) || [0, 0], i = dr(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = lr(a), s = Math.min(22, Math.max(8, i[0] * .08)), c = Math.min(34, Math.max(18, i[1] * .18)), l = Math.min(18, Math.max(8, i[1] * .08)), u = Math.max(40, i[0] - s * 2), d = Math.max(34, i[1] - c - l), f = Math.min(1, u / o.width, d / o.height), p = r[0] + s + (u - o.width * f) / 2, m = r[1] + c + (d - o.height * f) / 2, h = a.map((r) => { + let i = ur(r?.pos) || [o.minX, o.minY], a = dr(r?.size) || [140, 60]; + return { + ...r, + id: `${n}::${r?.id ?? r?.ID ?? ""}`, + pos: [p + (i[0] - o.minX) * f, m + (i[1] - o.minY) * f], + size: [Math.max(18, a[0] * f), Math.max(14, a[1] * f)], + _mjrSubgraphParentId: n, + _mjrSubgraphName: t?.name || e?.title || e?.type || "Subgraph" + }; + }), g = (e) => `${n}::${e}`; + return { + nodes: h, + links: (Array.isArray(t.links) ? t.links : []).map((e) => { + if (Array.isArray(e) && e.length >= 4) { + let t = [...e]; + return t[1] = g(t[1]), t[3] = g(t[3]), t; + } + return e && typeof e == "object" ? { + ...e, + origin_id: e.origin_id == null ? e.origin_id : g(e.origin_id), + originId: e.originId == null ? e.originId : g(e.originId), + from: e.from == null ? e.from : g(e.from), + target_id: e.target_id == null ? e.target_id : g(e.target_id), + targetId: e.targetId == null ? e.targetId : g(e.targetId), + to: e.to == null ? e.to : g(e.to) + } : e; + }), + group: { + title: t?.name || e?.title || "Subgraph", + bounding: [ + r[0] + 4, + r[1] + 18, + Math.max(1, i[0] - 8), + Math.max(1, i[1] - 22) + ], + color: e?.color || e?.bgcolor || "#7f8ca3", + borderColor: "#9fb5d8" + } + }; +} +function lr(e) { + let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity; + for (let a of e) { + let e = ur(a?.pos); + if (!e) continue; + let o = dr(a?.size) || [140, 60]; + t = Math.min(t, e[0]), n = Math.min(n, e[1]), r = Math.max(r, e[0] + o[0]), i = Math.max(i, e[1] + o[1]); + } + return Number.isFinite(t) ? { + minX: t, + minY: n, + width: Math.max(1, r - t), + height: Math.max(1, i - n) + } : { + minX: 0, + minY: 0, + width: 1, + height: 1 + }; +} +function ur(e) { + if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; + if (e && typeof e == "object") { + let t = e[0] ?? e[0] ?? e.x ?? e.left ?? null, n = e[1] ?? e[1] ?? e.y ?? e.top ?? null; + if (t !== null && n !== null) return [Number(t), Number(n)]; + } + return null; +} +function dr(e) { + if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; + if (e && typeof e == "object") { + let t = e[0] ?? e[0] ?? e.w ?? e.width ?? null, n = e[1] ?? e[1] ?? e.h ?? e.height ?? null; + if (t !== null && n !== null) return [Number(t), Number(n)]; + } + return null; +} +function fr(e) { + if (Array.isArray(e)) return !0; + let t = String(e || "").trim().toUpperCase(); + return t === "INT" || t === "FLOAT" || t === "STRING" || t === "BOOLEAN" || t === "BOOL" || t === "COMBO" || t === "ENUM"; +} +function pr(e, t = null) { + if (!e || typeof e != "object") return null; + let n = { + maxNodes: 220, + ...t && typeof t == "object" ? t : {} + }, r = Object.entries(e); + if (!r.length) return null; + let i = [], a = [], o = /* @__PURE__ */ new Map(), s = (e) => e == null ? null : String(e) || null, c = (e) => Array.isArray(e) && e.length === 2 && s(e[0]) != null && Number.isFinite(Number(e[1])); + for (let [e, t] of r.slice(0, n.maxNodes)) { + if (!t || typeof t != "object") continue; + let n = s(e); + if (!n) continue; + let r = String(t.class_type || t.type || t.classType || "").trim(), l = t.inputs && typeof t.inputs == "object" ? t.inputs : {}, u = {}, d = []; + for (let e of Object.values(l)) { + if (!c(e)) continue; + let t = s(e[0]); + t && (d.push(t), a.push([t, n])); + } + for (let [e, t] of Object.entries(l)) c(t) || (u[e] = t); + o.set(n, d); + let f = r.toLowerCase(), p = "#3a3a3a", m = "#6b6b6b"; + f.includes("ksampler") || f.includes("sampler") ? (p = "#6a4b1f", m = "#b07a2c") : f.includes("cliptext") || f.includes("textencode") || f.includes("conditioning") ? (p = "#1f5f3a", m = "#2cb06c") : f.includes("checkpoint") || f.includes("loader") || f.includes("model") ? (p = "#243a6a", m = "#3f6fd6") : (f.includes("save") || f.includes("preview") || f.includes("video")) && (p = "#4a2a5f", m = "#8c4cd1"), i.push({ + id: Number.isFinite(Number(n)) ? Number(n) : n, + type: r || "Node", + pos: [0, 0], + size: [180, 80], + bgcolor: p, + color: m, + title: String(t?._meta?.title || t?.title || "").trim() || void 0, + inputs: u, + outputs: [] + }); + } + if (!i.length) return null; + let l = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Set(), d = (e) => { + if (l.has(e)) return l.get(e); + if (u.has(e)) return 0; + u.add(e); + let t = 0, n = o.get(e) || []; + for (let e of n) t = Math.max(t, d(e) + 1); + return u.delete(e), l.set(e, t), t; + }; + for (let e of i) d(String(e.id)); + let f = /* @__PURE__ */ new Map(); + for (let e of i) { + let t = l.get(String(e.id)) ?? 0; + f.has(t) || f.set(t, []), f.get(t).push(e); + } + let p = Array.from(f.keys()).sort((e, t) => e - t); + for (let e of p) { + let t = f.get(e) || []; + t.sort((e, t) => Number(e.id) - Number(t.id)); + for (let n = 0; n < t.length; n++) t[n].pos = [e * 220, n * 110]; + } + let m = 1; + return { + id: "synthetic", + nodes: i, + links: a.filter(([e, t]) => e !== t).slice(0, 4e3).map(([e, t]) => [ + m++, + Number.isFinite(Number(e)) ? Number(e) : e, + 0, + Number.isFinite(Number(t)) ? Number(t) : t, + 0, + "LINK" + ]), + extra: { synthetic: !0 } + }; +} +// ui/utils/safeCall.ts +var mr = () => {}; +function hr(e) { + try { + return !!P?.[e]; + } catch { + return !1; + } +} +function gr(e, t) { + try { + console.warn(`[Majoor] ${e}`, t); + } catch (e) { + console.debug?.(e); + } +} +function _r(e, t = "safeCall") { + try { + return e?.(); + } catch (e) { + hr("DEBUG_SAFE_CALL") && gr(t, e); + return; + } +} +function vr(e, t, n, r, i = "safeAddListener") { + try { + return e?.addEventListener?.(t, n, r), () => { + try { + e?.removeEventListener?.(t, n, r); + } catch (e) { + hr("DEBUG_SAFE_LISTENERS") && gr(`${i}:remove:${String(t || "")}`, e); + } + }; + } catch (e) { + return hr("DEBUG_SAFE_LISTENERS") && gr(`${i}:add:${String(t || "")}`, e), mr; + } +} +// ui/utils/mediaFps.ts +function yr(e) { + try { + let t = Number(e); + if (Number.isFinite(t) && t > 0) return t; + let n = String(e || "").trim(); + if (!n) return null; + if (n.includes("/")) { + let [e, t] = n.split("/"), r = Number(e), i = Number(t); + if (Number.isFinite(r) && Number.isFinite(i) && i !== 0) { + let e = r / i; + return Number.isFinite(e) && e > 0 ? e : null; + } + } + let r = Number.parseFloat(n); + return Number.isFinite(r) && r > 0 ? r : null; + } catch { + return null; + } +} +function br(e) { + try { + let t = e, n = t.metadata_raw || {}, r = (n.raw_ffprobe || {}).video_stream || {}; + return yr(r.avg_frame_rate) ?? yr(r.r_frame_rate) ?? yr(n.fps_raw) ?? yr(n.fps) ?? yr(n.frame_rate) ?? yr(t.fps); + } catch { + return null; + } +} +function xr(e, t) { + try { + let n = e, r = n.metadata_raw || {}, i = (r.raw_ffprobe || {}).video_stream || {}, a = Number(n.frame_count) || Number(r.frame_count) || Number(r.frames) || Number(i.nb_frames) || Number(i.nb_read_frames) || 0; + if (Number.isFinite(a) && a > 0) return Math.floor(a); + let o = Number(n.duration ?? r.duration ?? i.duration); + if (Number.isFinite(o) && o > 0 && t != null && Number.isFinite(t) && t > 0) return Math.max(1, Math.round(o * t)); + } catch (e) { + console.debug?.(e); + } + return null; +} +function Sr(e) { + let t = Number(e); + return !Number.isFinite(t) || t <= 0 ? "" : Math.abs(t - Math.round(t)) < .001 ? `${Math.round(t)} fps` : `${t.toFixed(3).replace(/\.?0+$/, "")} fps`; +} +// ui/components/sidebar/parsers/a1111ParamsParser.ts +function Cr(e) { + if (!e || typeof e != "string") return null; + let t = {}, n = e.split(/\nNegative prompt:\s*/i); + if (n[0] && (t.prompt = n[0].trim()), n[1]) { + let e = n[1].match(/^(.*?)\n?(Steps:.*)$/s); + if (e) { + t.negative_prompt = e[1].trim(); + let n = e[2], r = (e) => { + let t = n.match(e); + return t ? t[1].trim() : null; + }; + t.steps = r(/Steps:\s*(\d+)/i), t.sampler = r(/Sampler:\s*([^,\n]+)/i), t.cfg = r(/CFG scale:\s*([\d.]+)/i), t.seed = r(/Seed:\s*(\d+)/i), t.width = r(/Size:\s*(\d+)x\d+/i), t.height = r(/Size:\s*\d+x(\d+)/i), t.model = r(/Model:\s*([^,\n]+)/i), t.denoising = r(/Denoising strength:\s*([\d.]+)/i), t.clip_skip = r(/Clip skip:\s*(\d+)/i); + } else t.negative_prompt = n[1].trim(); + } + return Object.keys(t).length > 0 ? t : null; +} +// ui/components/sidebar/parsers/comfyWorkflowParser.ts +function wr(e) { + try { + let t = Object.entries(e || {}); + if (!t.length) return !1; + let n = 0; + for (let [, e] of t.slice(0, 50)) if (e && typeof e == "object" && (e.inputs && typeof e.inputs == "object" && (n += 1), n >= 2)) return !0; + return !1; + } catch { + return !1; + } +} +function Tr(e) { + if (!e || typeof e != "object") return null; + let t = {}, n = [], r = Br(e), i = [], a = Yr(e); + for (let e of a) { + if (!e || typeof e != "object") continue; + let a = $r(e); + if (!a || typeof a != "object") continue; + let o = String(e?.class_type || e?.type || "").toLowerCase(), s = String(e?.title || e?._meta?.title || "").toLowerCase(), c = (e, n) => { + if (t[e] || typeof n != "string") return; + let r = n.trim(); + r && (/^[\d\s.,+-]+$/.test(r) || (t[e] = r)); + }; + if ((o.includes("cliptextencode") || o.includes("clip_text_encode") || s.includes("clip text encode")) && typeof a.text == "string") { + let e = s.includes("negative"); + s.includes("positive") || s.includes("(prompt)") || s.includes("prompt"), c(e ? "negative_prompt" : "prompt", a.text); + } + if (c("negative_prompt", a.negative_prompt), c("negative_prompt", a.negative), !t.prompt && typeof a.text == "string") { + let e = a.text.trim(); + (o.includes("prompt") || o.includes("encode") || o.includes("positive") || o.includes("negative") || s.includes("prompt") || s.includes("positive") || s.includes("negative")) && e.length >= 12 && /[a-zA-Z]/.test(e) && c("prompt", e); + } + let l = K(a.seed, r), u = K(a.steps, r), d = K(a.cfg, r), f = K(a.denoise, r); + if (l !== void 0 && t.seed === void 0 && (t.seed = l), u !== void 0 && t.steps === void 0 && (t.steps = u), d !== void 0 && t.cfg === void 0 && (t.cfg = d), a.sampler_name && !t.sampler && (t.sampler = a.sampler_name), a.scheduler && !t.scheduler && (t.scheduler = a.scheduler), f !== void 0 && t.denoise === void 0 && (t.denoise = f), Vr(o)) { + let t = Hr(e, r), n = Kr(e, r), o = qr(e?.inputs?.model, r) || qr(n.model_link, r); + i.push({ + sampler_name: a.sampler_name || n.sampler_name || a.sampler, + scheduler: a.scheduler || n.scheduler, + steps: K(a.steps, r) ?? n.steps, + cfg: K(a.cfg, r) ?? n.cfg, + denoise: K(a.denoise, r) ?? n.denoise, + seed: K(a.seed ?? a.noise_seed, r) ?? n.seed, + start_at_step: K(a.start_at_step, r), + end_at_step: K(a.end_at_step, r), + model: o, + pass_stage: t + }); + } + a.width !== void 0 && t.width === void 0 && (t.width = a.width), a.height !== void 0 && t.height === void 0 && (t.height = a.height); + let p = (e, n) => { + if (t[e] || typeof n != "string") return; + let r = n.trim(); + r && (t[e] = r); + }, m = [ + a.ckpt_name, + a.checkpoint, + a.checkpoint_name, + a.model_name, + a.model + ]; + for (let e of m) !t.model && !o.includes("upscale") && p("model", e); + o.includes("upscale") && p("upscaler", a.model_name || a.upscale_model || a.model), p("vae", a.vae_name || a.vae), p("clip", a.clip_name || a.clip); + let h = a.unet_name || a.unet; + if (typeof h == "string" && h.trim()) { + let e = t.models && typeof t.models == "object" ? t.models : {}; + /high[_\s-]?noise/i.test(h) ? e.unet_high_noise = { name: h.trim() } : /low[_\s-]?noise/i.test(h) ? e.unet_low_noise = { name: h.trim() } : p("unet", h), Object.keys(e).length && (t.models = e); + } + if (p("diffusion", a.diffusion_name || a.diffusion_model || a.diffusion), o.includes("lora") || o.includes("loraloader")) { + let e = a.lora_name || a.lora || a.name || null, t = a.strength_model ?? a.strength ?? a.weight ?? a.lora_strength ?? null; + if (e) { + let r = { name: e }; + a.strength_model === void 0 ? r.weight = t : r.strength_model = a.strength_model, n.push(r); + } + } + } + let o = zr(n), s = zr(i, Rr); + if (o.length && (t.loras = o), s.length > 1 && (t.all_samplers = s), t.seed === void 0) { + let e = s.find((e) => e?.seed !== void 0 && e?.seed !== null)?.seed; + e != null && (t.seed = e); + } + return Or(t, a, r), Er(t, a), Object.keys(t).length > 0 ? t : null; +} +function Er(e, t) { + if (e.ideogram) return; + let n = t.find((e) => { + let t = String(e?.class_type || e?.type || e?.comfyClass || "").toLowerCase(); + return t.includes("ideogram4promptbuilderkj") || t.includes("ideogram4promptbuilder"); + }); + if (!n) return; + let r = $r(n) || {}, i = Dr(G(r.elements_data, r.elements, r.bboxes)), a = Dr(G(r.style_palette_data, r.palette, r.color_palette)), o = Ir({ + width: G(r.width, r.custom_width), + height: G(r.height, r.custom_height), + high_level_description: r.high_level_description, + background: r.background, + style: r.style, + photo_style: r["style.photo"] || r.photo_style, + aesthetics: r.aesthetics, + lighting: r.lighting, + medium: r.medium, + bg_brightness: r.bg_brightness, + coord_mode: r.coord_mode, + bbox_order: r.bbox_order, + color_palette: a, + elements: i + }); + if (!Object.keys(o).length) return; + let s = JSON.stringify(o, null, 2); + e.ideogram = Ir({ + title: String(n?._meta?.title || n?.title || "Ideogram 4").trim(), + json: s, + payload: o, + high_level_description: o.high_level_description, + background: o.background, + elements: Array.isArray(i) ? i : [], + color_palette: Array.isArray(a) ? a : [] + }), e.prompt = s, e.workflow_type = e.workflow_type || "ideogram"; +} +function Dr(e) { + if (e && typeof e == "object" || typeof e != "string" || !e.trim()) return e; + try { + return JSON.parse(e); + } catch { + return e; + } +} +function Or(e, t, n) { + if (e.ltx_director) return; + let r = t.find((e) => { + let t = String(e?.class_type || e?.type || e?.comfyClass || "").toLowerCase(); + return t === "ltxdirector" || t === "ltxdirectorguide"; + }); + if (!r) return; + let i = $r(r) || {}, a = r?.properties && typeof r.properties == "object" ? r.properties : {}, o = kr(G(i.timeline_data, a.timeline_data)), s = G(i.frame_rate, a.frame_rate, o.frame_rate, 0), c = Number(s), l = Number.isFinite(c) && c > 0 ? c : null, u = Ar(o.segments, l), d = String(G(o.global_prompt, i.global_prompt, a.global_prompt, "") || "").trim(), f = Fr(t, r, n), p = G(i.custom_width, a.custom_width, i.width), m = G(i.custom_height, a.custom_height, i.height); + e.ltx_director = Ir({ + title: String(r?._meta?.title || r?.title || "LTX Director").trim(), + global_prompt: d, + frame_rate: s, + duration_frames: G(i.duration_frames, a.duration_frames), + duration_seconds: G(i.duration_seconds, a.duration_seconds), + width: p, + height: m, + segments: u, + models: f + }); + let h = [d, ...u.map((e) => e.prompt)].filter((e) => String(e || "").trim()); + !e.prompt && h.length && (e.prompt = h.join("\n")), !e.models && Object.keys(f).length && (e.models = f), !e.width && p && (e.width = p), !e.height && m && (e.height = m); +} +function G(...e) { + return e.find((e) => e != null && e !== ""); +} +function kr(e) { + if (e && typeof e == "object") return e; + if (typeof e != "string" || !e.trim()) return {}; + try { + let t = JSON.parse(e); + return t && typeof t == "object" ? t : {}; + } catch { + return {}; + } +} +function Ar(e, t) { + return Array.isArray(e) ? e.map((e, n) => jr(e, n, t)).filter((e) => e.prompt || e.filename || e.in !== "" || e.out !== "") : []; +} +function jr(e, t, n) { + let r = G(e?.start, e?.startFrame, e?.in, e?.from, e?.start_frame), i = G(e?.end, e?.endFrame, e?.out, e?.to, e?.end_frame), a = G(e?.length, e?.duration, e?.frames, e?.duration_frames), o = i === void 0 ? Mr(r, a) : i, s = String(G(e?.prompt, e?.text, e?.caption, "") || "").trim(), c = String(G(e?.imageFile, e?.videoFile, e?.audioFile, e?.filename, e?.file, e?.path, "") || "").trim(); + return Ir({ + index: t + 1, + id: e?.id, + prompt: s, + in: Nr(r, n), + out: Nr(o, n), + in_frame: r, + out_frame: o, + filename: c, + type: e?.type + }); +} +function Mr(e, t) { + let n = Number(e), r = Number(t); + if (Number.isFinite(n) && Number.isFinite(r)) return n + r; +} +function Nr(e, t) { + if (e == null || e === "") return ""; + let n = Number(e); + return !Number.isFinite(n) || !t ? String(e) : Pr(n / t); +} +function Pr(e) { + if (!Number.isFinite(e)) return ""; + let t = Math.max(0, e); + if (t < 60) return `${t < 10 && Math.abs(t - Math.round(t)) > .05 ? Math.round(t * 10) / 10 : Math.round(t)}s`; + let n = Math.floor(t / 60), r = Math.round(t % 60); + return r === 0 ? `${n}m` : `${n}m ${r}s`; +} +function Fr(e, t, n) { + let r = {}, i = (e, t) => { + if (r[e] || typeof t != "string") return; + let n = t.trim(); + n && (r[e] = n); + }, a = $r(t) || {}; + i("unet", qr(a.model, n)), i("clip", qr(a.clip, n)), i("audio_vae", qr(a.audio_vae, n)), i("video_vae", qr(a.video_vae, n)); + for (let t of e) { + let e = $r(t) || {}, n = String(t?.class_type || t?.type || "").toLowerCase(); + if (n.includes("unet") && i("unet", e.unet_name || e.model_name), n.includes("latentupscale") && i("upscaler", e.model_name || e.upscale_model), n.includes("clip") && i("clip", e.clip_name || e.clip_name1), n.includes("vae")) { + let t = e.vae_name || e.model_name; + /audio/i.test(String(t || "")) || n.includes("audio") ? i("audio_vae", t) : /tae|tiny/i.test(String(t || "")) ? i("tiny_vae", t) : i("video_vae", t); + } + } + return r; +} +function Ir(e) { + let t = {}; + for (let [n, r] of Object.entries(e || {})) r != null && r !== "" && (Array.isArray(r) && r.length === 0 || (!r || typeof r != "object" || Array.isArray(r) || Object.keys(r).length !== 0) && (t[n] = r)); + return t; +} +function Lr(e) { + if (!e || typeof e != "object") return JSON.stringify(e); + let t = {}; + for (let n of Object.keys(e).sort()) { + let r = e[n]; + r != null && r !== "" && (t[n] = r); + } + return JSON.stringify(t); +} +function Rr(e) { + return !e || typeof e != "object" ? Lr(e) : [ + e.sampler_name || e.sampler || "", + e.scheduler || "", + e.steps ?? "", + e.cfg ?? "", + e.denoise ?? "", + e.seed ?? "", + e.start_at_step ?? "", + e.end_at_step ?? "" + ].map((e) => String(e)).join("::"); +} +function zr(e, t = Lr) { + let n = /* @__PURE__ */ new Set(), r = []; + for (let i of e) { + let e = t(i); + n.has(e) || (n.add(e), r.push(i)); + } + return r; +} +function Br(e) { + if (!e || typeof e != "object") return null; + let t = e.prompt; + if (typeof t == "string" && t.trim()) try { + t = JSON.parse(t); + } catch { + t = null; + } + let n = t && typeof t == "object" ? t : e; + return wr(n) ? n : null; +} +function Vr(e) { + return e.includes("ksamplerselect") || e.includes("samplerselect") ? !1 : e.includes("ksampler") || e.includes("samplercustom") || e.includes("sampler_custom"); +} +function Hr(e, t) { + if (!t) return ""; + let n = qr(e?.inputs?.model, t).toLowerCase(); + if (Ur(n)) return "high"; + if (Wr(n)) return "low"; + if (/\b(upscale|upscaler|_to_\d{3,5}|to[_-]?\d{3,5})\b/i.test(n)) return "upscale"; + let r = Gr(e, t).join(" "); + if (Ur(r)) return "high"; + if (Wr(r)) return "low"; + if (/\b(pidconditioning|imageupscalewithmodel|ultimate|supir|esrgan|realesrgan)\b/i.test(r)) return "upscale"; + let i = Gr(e, t, "latent_image").join(" "); + return /\b(inpaint|vaeencodeforinpaint|setlatentnoise mask|masktoimage)\b/i.test(i) ? "inpaint" : /\b(latentupscale|latentupsampler|imageupscalewithmodel|ultimate|supir|esrgan|realesrgan)\b/i.test(i) && !Ur(r) && !Wr(r) ? "upscale" : /\b(vaeencode|loadimage|imagebatch|imagetolatent)\b/i.test(i) ? "img2img" : /\b(emptylatentimage|emptysd3latentimage|emptychromaradiancelatentimage|empty latent)\b/i.test(i) ? "txt2img" : ""; +} +function Ur(e) { + return /(?:^|[^a-z0-9])high[_\s-]?noise(?:[^a-z0-9]|$)/i.test(String(e || "")); +} +function Wr(e) { + return /(?:^|[^a-z0-9])low[_\s-]?noise(?:[^a-z0-9]|$)/i.test(String(e || "")); +} +function Gr(e, t, n) { + let r = n ? [e?.inputs?.[n]] : Object.values(e?.inputs || {}), i = [], a = /* @__PURE__ */ new Set(), o = (e) => { + let n = String(e?._mjrPromptId || e?.id || ""); + if (n && a.has(n)) return; + n && a.add(n); + let r = String(e?.class_type || e?.type || e?._meta?.title || ""); + r && i.push(r.toLowerCase()); + let s = e?.inputs && typeof e.inputs == "object" ? e.inputs : {}; + for (let e of Object.values(s)) { + let n = Jr(e, t); + n && o(n); + } + }; + for (let e of r) { + let n = Jr(e, t); + n && o(n); + } + return i; +} +function Kr(e, t) { + let n = {}; + if (!t) return n; + let r = Jr(e?.inputs?.noise, t)?.inputs || {}; + r.noise_seed !== void 0 && (n.seed = r.noise_seed), r.seed !== void 0 && (n.seed = r.seed); + let i = Jr(e?.inputs?.guider, t)?.inputs || {}; + i.cfg !== void 0 && (n.cfg = i.cfg), i.model !== void 0 && (n.model_link = i.model); + let a = Jr(e?.inputs?.sampler, t)?.inputs || {}; + a.sampler_name && (n.sampler_name = a.sampler_name); + let o = Jr(e?.inputs?.sigmas, t)?.inputs || {}; + if (o.scheduler && (n.scheduler = o.scheduler), o.steps !== void 0 && (n.steps = K(o.steps, t)), o.denoise !== void 0 && (n.denoise = K(o.denoise, t)), n.steps === void 0 && typeof o.sigmas == "string") { + let e = o.sigmas.split(",").map((e) => e.trim()).filter(Boolean).length; + e > 1 && (n.steps = Math.max(1, e - 1)); + } + return n; +} +function K(e, t, n = /* @__PURE__ */ new Set()) { + if (e == null || !Array.isArray(e)) return e; + if (!t) return; + let r = Jr(e, t); + if (!r) return; + let i = String(r?._mjrPromptId || r?.id || e[0] || ""); + if (i && n.has(i)) return; + i && n.add(i); + let a = r?.inputs && typeof r.inputs == "object" ? r.inputs : {}; + if (String(r?.class_type || r?.type || "").toLowerCase().includes("switch")) return K(K(a.switch, t, n) ? a.on_true : a.on_false, t, n); + if (Object.prototype.hasOwnProperty.call(a, "value")) return a.value; + for (let e of [ + "number", + "int", + "float", + "seed", + "steps", + "cfg" + ]) if (Object.prototype.hasOwnProperty.call(a, e)) return a[e]; +} +function qr(e, t) { + if (!t) return ""; + let n = /* @__PURE__ */ new Set(), r = (e) => { + let i = Jr(e, t); + if (!i) return ""; + let a = String(i?._mjrPromptId || i?.id || ""); + if (a && n.has(a)) return ""; + a && n.add(a); + let o = i?.inputs || {}; + if (String(i?.class_type || i?.type || "").toLowerCase().includes("switch")) { + let e = K(o.switch, t), n = r(e ? o.on_true : o.on_false); + if (n) return n; + } + let s = o.unet_name || o.ckpt_name || o.model_name || o.model || o.checkpoint || o.checkpoint_name || ""; + if (typeof s == "string" && s.trim()) return s.trim(); + for (let e of Object.values(o)) { + let t = r(e); + if (t) return t; + } + return ""; + }; + return r(e); +} +function Jr(e, t) { + if (!Array.isArray(e) || e.length < 1) return null; + let n = String(e[0]), r = t[n]; + if (!r || typeof r != "object") return null; + if (!r._mjrPromptId) try { + Object.defineProperty(r, "_mjrPromptId", { + value: n, + enumerable: !1 + }); + } catch {} + return r; +} +function Yr(e, t = /* @__PURE__ */ new WeakSet()) { + if (!e || typeof e != "object" || t.has(e)) return []; + t.add(e); + let n = e.prompt; + if (typeof n == "string" && n.trim()) try { + n = JSON.parse(n); + } catch { + n = null; + } + let r = n && typeof n == "object" ? n : null; + if (r && wr(r)) return Object.values(r); + let i = []; + wr(e) && i.push(...Object.values(e)); + for (let n of Xr(e)) { + let e = Array.isArray(n?.nodes) ? n.nodes.filter(Boolean) : []; + i.push(...e); + for (let n of e) for (let e of Qr(n)) i.push(...Yr(e, t)); + for (let e of Zr(n)) i.push(...Yr(e, t)); + } + return i; +} +function Xr(e) { + if (!e || typeof e != "object") return []; + let t = [], n = (e) => { + e && typeof e == "object" && Array.isArray(e.nodes) && t.push(e); + }; + n(e); + for (let t of [ + "workflow", + "Workflow", + "template", + "Template", + "subgraph", + "Subgraph", + "graph", + "lgraph" + ]) n(e?.[t]); + return t; +} +function Zr(e) { + return [ + ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], + ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], + ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] + ].filter((e) => e && typeof e == "object" && Array.isArray(e.nodes)); +} +function Qr(e) { + return [ + e?.subgraph, + e?._subgraph, + e?.subgraph?.graph, + e?.subgraph?.lgraph, + e?.properties?.subgraph, + e?.subgraph_instance, + e?.subgraph_instance?.graph, + e?.inner_graph, + e?.subgraph_graph + ].filter((e) => e && typeof e == "object" && Array.isArray(e.nodes)); +} +function $r(e) { + let t = e?.inputs; + if (t && typeof t == "object" && !Array.isArray(t)) return t; + let n = e?.widgets_values, r = {}; + if (n && typeof n == "object" && !Array.isArray(n)) { + for (let [e, t] of Object.entries(n)) r[e] = t; + return r; + } + if (!Array.isArray(t) || !Array.isArray(n)) return null; + let i = t.filter(ei); + for (let e = 0; e < n.length; e += 1) { + let a = i[e] || t[e] || null, o = String(a?.label || a?.localized_name || a?.name || a?.widget?.name || a?.widget?.label || "").trim(); + r[o || `param_${e + 1}`] = n[e]; + } + return r; +} +function ei(e) { + if (!e || typeof e != "object") return !1; + if (e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim()) return !0; + if (e.link != null) return !1; + let t = String(e.type || "").trim().toUpperCase(); + return [ + "INT", + "FLOAT", + "STRING", + "BOOLEAN", + "BOOL", + "COMBO", + "ENUM" + ].includes(t); +} +// ui/components/sidebar/parsers/geninfoParser.ts +var ti = /^(?:[a-z]:[\\/]|[\\/]{1,2}|\.{1,2}[\\/]|~[\\/]).+?[\\/][^\\/\n]+\.(?:png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl|ckpt|safetensors|pt|pth|bin|gguf|json|ya?ml)$/i, ni = /^(?!.*[,;])(?!.*\b(?:cinematic|portrait|landscape|lighting|style|detailed|masterpiece|photo|render)\b).*(?:[\\/][^\\/\n]+){2,}\.(?:png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl|ckpt|safetensors|pt|pth|bin|gguf|json|ya?ml)$/i, ri = /* @__PURE__ */ new Set([ + "workflow", + "quicktime:workflow", + "keys:workflow", + "comfyui:workflow", + "comfy_workflow", + "comfyuiworkflow" +]), ii = /* @__PURE__ */ new Set([ + "prompt", + "quicktime:prompt", + "keys:prompt", + "comfyui:prompt", + "comfy_prompt", + "comfyuiprompt" +]); +function ai(e) { + if (!e) return null; + if (typeof e == "object") { + let t = e.geninfo || e.GenInfo || e.generation || null; + if (t && typeof t == "object") { + let n = {}, r = /* @__PURE__ */ new Set(), i = (e, t) => { + if (t && typeof t == "object" && (t.confidence === "override" || t.source === "majoor_geninfo")) for (let t of Array.isArray(e) ? e : [e]) r.add(t); + }, a = t.positive?.value ?? t.positive?.text ?? null, o = t.negative?.value ?? t.negative?.text ?? null; + typeof a == "string" && a.trim() && (n.prompt = a), typeof o == "string" && o.trim() && (n.negative_prompt = o), i("prompt", t.positive), i("negative_prompt", t.negative); + let s = t.checkpoint?.name ?? t.checkpoint ?? null; + typeof s == "string" && s.trim() && (n.model = s), i(["model", "checkpoint"], t.checkpoint); + let c = t.clip?.name ?? t.clip ?? null; + typeof c == "string" && c.trim() && (n.clip = c), i("clip", t.clip); + let l = t.vae?.name ?? t.vae ?? null; + typeof l == "string" && l.trim() && (n.vae = l), i("vae", t.vae); + let u = t.models; + u && typeof u == "object" && (n.models = u); + let d = Array.isArray(t.model_groups) ? t.model_groups : null; + d && d.length && (n.model_groups = d); + let f = Array.isArray(t.loras) ? t.loras : null; + f && (n.loras = f), f?.some((e) => e?.confidence === "override" || e?.source === "majoor_geninfo") && r.add("loras"); + let p = t.sampler?.name ?? t.sampler ?? null; + typeof p == "string" && p.trim() && (n.sampler = p), i("sampler", t.sampler); + let m = t.scheduler?.name ?? t.scheduler ?? null; + typeof m == "string" && m.trim() && (n.scheduler = m), i("scheduler", t.scheduler); + let h = t.steps?.value ?? t.steps ?? null; + h != null && (n.steps = h), i("steps", t.steps); + let g = t.cfg?.value ?? t.cfg ?? null; + g != null && (n.cfg = g), i(["cfg", "cfg_scale"], t.cfg); + let _ = t.cfg_high_noise?.value ?? t.cfg_high_noise ?? null; + _ != null && (n.cfg_high_noise = _); + let v = t.cfg_low_noise?.value ?? t.cfg_low_noise ?? null; + v != null && (n.cfg_low_noise = v); + let y = t.seed?.value ?? t.seed ?? null; + y != null && (n.seed = y), i("seed", t.seed); + let b = t.voice?.name ?? t.voice?.value ?? t.voice ?? null; + b != null && String(b).trim() && (n.voice = String(b).trim()); + let x = t.language?.value ?? t.language ?? null; + x != null && String(x).trim() && (n.language = String(x).trim()); + let S = t.temperature?.value ?? t.temperature ?? null; + S != null && (n.temperature = S); + let C = t.top_k?.value ?? t.top_k ?? null; + C != null && (n.top_k = C); + let ee = t.top_p?.value ?? t.top_p ?? null; + ee != null && (n.top_p = ee); + let te = t.repetition_penalty?.value ?? t.repetition_penalty ?? null; + te != null && (n.repetition_penalty = te); + let w = t.max_new_tokens?.value ?? t.max_new_tokens ?? null; + w != null && (n.max_new_tokens = w); + let ne = t.device?.value ?? t.device ?? null; + ne != null && String(ne).trim() && (n.device = String(ne).trim()); + let T = t.voice_preset?.value ?? t.voice_preset ?? null; + T != null && String(T).trim() && (n.voice_preset = String(T).trim()); + let E = t.instruct?.value ?? t.instruct ?? null; + E != null && String(E).trim() && (n.instruct = String(E).trim()); + let D = t.dtype?.value ?? t.dtype ?? null; + D != null && String(D).trim() && (n.dtype = String(D).trim()); + let O = t.attn_implementation?.value ?? t.attn_implementation ?? null; + O != null && String(O).trim() && (n.attn_implementation = String(O).trim()); + let re = t.x_vector_only_mode?.value ?? t.x_vector_only_mode ?? null; + re != null && (n.x_vector_only_mode = re); + let ie = t.use_torch_compile?.value ?? t.use_torch_compile ?? null; + ie != null && (n.use_torch_compile = ie); + let ae = t.use_cuda_graphs?.value ?? t.use_cuda_graphs ?? null; + ae != null && (n.use_cuda_graphs = ae); + let k = t.compile_mode?.value ?? t.compile_mode ?? null; + k != null && String(k).trim() && (n.compile_mode = String(k).trim()); + let A = t.enable_chunking?.value ?? t.enable_chunking ?? null; + A != null && (n.enable_chunking = A); + let j = t.max_chars_per_chunk?.value ?? t.max_chars_per_chunk ?? null; + j != null && (n.max_chars_per_chunk = j); + let oe = t.chunk_combination_method?.value ?? t.chunk_combination_method ?? null; + oe != null && String(oe).trim() && (n.chunk_combination_method = String(oe).trim()); + let se = t.silence_between_chunks_ms?.value ?? t.silence_between_chunks_ms ?? null; + se != null && (n.silence_between_chunks_ms = se); + let ce = t.enable_audio_cache?.value ?? t.enable_audio_cache ?? null; + ce != null && (n.enable_audio_cache = ce); + let le = t.batch_size?.value ?? t.batch_size ?? null; + le != null && (n.batch_size = le); + let ue = t.denoise?.value ?? t.denoise ?? null; + ue != null && (n.denoise = ue), i(["denoise", "denoising"], t.denoise); + let M = t.clip_skip?.value ?? t.clip_skip ?? t.clipSkip ?? null; + M != null && (n.clip_skip = M); + let de = t.inputs; + Array.isArray(de) && (n.inputs = de), t.ltx_director && typeof t.ltx_director == "object" && (n.ltx_director = t.ltx_director); + let fe = t.lyrics?.value ?? t.lyrics ?? null; + typeof fe == "string" && fe.trim() && (n.lyrics = fe); + let pe = t.lyrics_strength?.value ?? t.lyrics_strength ?? null; + pe != null && (n.lyrics_strength = pe); + let me = t.notes?.value ?? t.workflow_notes?.value ?? t.notes ?? t.workflow_notes ?? null; + typeof me == "string" && me.trim() && (n.workflow_notes = me.trim()), i(["workflow_notes", "notes"], t.notes ?? t.workflow_notes), Array.isArray(t.custom_info) && (n.custom_info = t.custom_info), Array.isArray(t.custom_info) && t.engine?.mode === "override" && r.add("custom_info"), Array.isArray(t.all_positive_prompts) && t.all_positive_prompts.length > 1 && (n.all_positive_prompts = t.all_positive_prompts), Array.isArray(t.all_negative_prompts) && t.all_negative_prompts.length > 1 && (n.all_negative_prompts = t.all_negative_prompts), Array.isArray(t.all_samplers) && t.all_samplers.length > 1 && (n.all_samplers = t.all_samplers), Array.isArray(t.chained_passes) && t.chained_passes.length > 1 && (n.chained_passes = t.chained_passes), Array.isArray(t.all_checkpoints) && t.all_checkpoints.length > 1 && (n.all_checkpoints = t.all_checkpoints); + let N = t.size || null; + if (N && typeof N == "object" && (N.width !== void 0 && (n.width = N.width), N.height !== void 0 && (n.height = N.height)), t.engine && typeof t.engine == "object" && (n.engine = t.engine, (t.engine.mode === "override" || t.engine.parser_version === "geninfo-override-v1" || t.engine.source === "majoor_geninfo") && (n.is_override = !0)), r.size && (n.override_fields = Array.from(r)), ui(n, pi(e)), mi(n, e), Object.keys(n).length) return n; + } + let n = Tr(e); + if (n) return n; + if (wr(e)) { + let t = Tr({ prompt: e }); + if (t) return t; + } + let r = pi(e); + if (r) return r; + if ([ + "prompt", + "negative_prompt", + "negativePrompt", + "steps", + "sampler", + "sampler_name", + "cfg", + "cfg_scale", + "seed", + "width", + "height" + ].some((t) => Object.prototype.hasOwnProperty.call(e, t))) return e; + let i = e.parameters || e["PNG:Parameters"] || e["EXIF:UserComment"] || e.UserComment || e.ImageDescription || null; + if (typeof i == "string") { + let e = Cr(i); + if (e) return e; + } + let a = e.workflow || e.Workflow || e.comfy || e.comfyui || e.ComfyUI || null; + if (a && typeof a == "object") { + let e = Tr(a); + if (e) return e; + } + return e; + } + if (typeof e == "string") { + let t = e.trim(); + if (!t) return null; + let n = Cr(t); + if (n) return n; + if (t.startsWith("{") && t.endsWith("}") || t.startsWith("[") && t.endsWith("]")) try { + return ai(JSON.parse(t)); + } catch { + return null; + } + return { prompt: t }; + } + return null; +} +function oi(e) { + return String(e || "").trim().replace(/\\/g, "/").toLowerCase(); +} +function si(e) { + if (!e) return null; + if (typeof e == "object") return e; + if (typeof e != "string") return null; + let t = e.trim(); + if (!t || !(t.startsWith("{") || t.startsWith("["))) return null; + try { + return JSON.parse(t); + } catch { + return null; + } +} +function ci(e) { + if (!e || typeof e != "object") return []; + let t = [], n = (e) => { + e && typeof e == "object" && !t.includes(e) && t.push(e); + }; + n(e), n(e.metadata_raw), n(e.metadata), n(e.raw), n(e.exif), n(e.metadata_raw?.exif), n(e.metadata?.exif), n(e.format?.tags), n(e.ffprobe?.format?.tags), n(e.raw_ffprobe?.format?.tags), n(e.metadata_raw?.raw_ffprobe?.format?.tags), n(e.metadata_raw?.ffprobe?.format?.tags), n(e.metadata?.raw_ffprobe?.format?.tags), n(e.metadata?.ffprobe?.format?.tags); + let r = [ + e.streams, + e.ffprobe?.streams, + e.raw_ffprobe?.streams, + e.metadata_raw?.raw_ffprobe?.streams, + e.metadata_raw?.ffprobe?.streams, + e.metadata?.raw_ffprobe?.streams, + e.metadata?.ffprobe?.streams + ]; + for (let e of r) if (Array.isArray(e)) for (let t of e) n(t?.tags); + return t; +} +function li(e, t) { + if (!e || typeof e != "object") return null; + for (let [n, r] of Object.entries(e)) if (t.has(oi(n))) return r; + return null; +} +function ui(e, t) { + if (t && typeof t == "object") for (let [n, r] of Object.entries(t)) r != null && r !== "" && (Array.isArray(r) && Array.isArray(e[n]) ? e[n] = fi(e[n], r) : r && typeof r == "object" && !Array.isArray(r) && e[n] && typeof e[n] == "object" && !Array.isArray(e[n]) ? e[n] = { + ...r, + ...e[n] + } : (e[n] === void 0 || e[n] === null || e[n] === "") && (e[n] = r)); +} +function di(e) { + if (!e || typeof e != "object") return JSON.stringify(e); + let t = e.name || e.lora_name || e.model || e.sampler_name || e.sampler || "", n = e.key || e.pass_stage || e.source || ""; + return t || n ? `${String(n).toLowerCase()}::${String(t).toLowerCase()}` : JSON.stringify(e); +} +function fi(e, t) { + let n = [...e], r = new Set(n.map((e) => di(e))); + for (let e of t) { + let t = di(e); + r.has(t) || (r.add(t), n.push(e)); + } + return n; +} +function pi(e) { + let t = null, n = null; + for (let r of ci(e)) if (t ||= si(li(r, ri)), n ||= si(li(r, ii)), t && n) break; + let r = {}; + return (t || n) && (ui(r, Tr({ + workflow: t, + prompt: n + })), ui(r, Tr(t)), n && wr(n) && ui(r, Tr({ prompt: n }))), Object.keys(r).length ? r : null; +} +function mi(e, t) { + let n = t?.workflow || t?.Workflow || t?.comfy_workflow || t?.comfy || t?.comfyui || t?.ComfyUI || null; + if (!n || typeof n != "object") return; + let r = Tr(n), i = Array.isArray(r?.all_samplers) ? r.all_samplers : []; + if (i.length) { + for (let t of ["all_samplers", "chained_passes"]) { + let n = Array.isArray(e[t]) ? e[t] : []; + n.length && (e[t] = n.map((e, t) => { + let n = i[t]?.pass_stage; + return !n || e?.pass_stage ? e : { + ...e, + pass_stage: n + }; + })); + } + !Array.isArray(e.all_samplers) && i.length > 1 && (e.all_samplers = i); + } +} +function hi(e) { + let t = typeof e == "string" ? e.trim() : ""; + return !t || t.includes("\n") ? !1 : ti.test(t) || ni.test(t); +} +function q(e) { + let t = typeof e == "string" ? e.trim() : ""; + return t ? hi(t) ? "" : t : ""; +} +function gi(e, t) { + let n = q(e), r = q(t); + if (n) { + let e = /(?:^|\n)\s*Negative prompt:\s*/i; + if (e.test(n)) { + let t = n.split(e), i = (t[0] || "").trim(), a = t.slice(1).join("Negative prompt:").trim(), o = a.search(/\n\s*Steps:\s*\d+/i), s = (o >= 0 ? a.slice(0, o) : a).trim(); + i && (n = q(i)), !r && s && (r = q(s)); + } + } + return n && r && n.trim() === r.trim() && (r = ""), { + positive: n, + negative: r + }; +} +function J(e) { + if (!e) return ""; + let t = String(e).trim().replace(/\\/g, "/"); + return (t.split("/").pop() || t).replace(/\.(safetensors|ckpt|pt|pth|bin|gguf|json)$/i, ""); +} +function _i(e) { + let t = Number(e); + return Number.isFinite(t) ? Math.abs(t - Math.round(t)) < 1e-9 ? String(Math.round(t)) : t.toFixed(2).replace(/0+$/g, "").replace(/\.$/, "") : String(e ?? "").trim(); +} +function vi(e) { + if (!e) return ""; + if (typeof e == "string") return J(e); + let t = J(e.name || e.lora_name || ""); + if (!t) return ""; + let n = e.weight ?? e.strength ?? null, r = e.strength_model ?? null, i = e.strength_clip ?? null; + if (r !== null || i !== null) { + let e = []; + return r != null && e.push(`m=${_i(r)}`), i != null && e.push(`c=${_i(i)}`), e.length ? `${t} (${e.join(", ")})` : t; + } + return n == null ? t : `${t} (${_i(n)})`; +} +function yi(e) { + let t = String(e || "").trim().toLowerCase(); + return t ? t === "img2vid" ? "Image-to-Video" : t === "txt2vid" ? "Text-to-Video" : t === "img2img" ? "Image-to-Image" : t === "txt2img" ? "Text-to-Image" : t === "vid2vid" ? "Video-to-Video" : t === "tts" ? "Text-to-Speech" : t === "audio" ? "Audio" : t.split(/[_\s-]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ") : ""; +} +function bi(e) { + let t = String(e || "").trim().toLowerCase(); + if (!t || t === "api") return ""; + let n = { + happy_horse: "Happy Horse", + google_gemini: "Google Gemini", + google_veo: "Google Veo", + openai: "OpenAI", + anthropic: "Anthropic", + black_forest_labs: "Black Forest Labs", + stability_ai: "Stability AI", + alibaba_wan: "Alibaba Wan", + kling_ai: "Kling AI", + luma_dream_machine: "Luma Dream Machine", + minimax_hailuo: "MiniMax Hailuo", + xai_grok: "xAI Grok", + ltxv_api: "LTXV API", + eleven_labs: "ElevenLabs", + bytedance_seedance: "ByteDance Seedance" + }; + return n[t] ? n[t] : t.split(/[_\s-]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" "); +} +function xi(e) { + let t = e?.engine && typeof e.engine == "object" ? e.engine : null, n = String(t?.type || "").trim(), r = String(t?.sampler_mode || "").trim().toLowerCase(), i = yi(n) || n, a = bi(t?.api_provider), o = r === "api" ? `API ${i || "Workflow"}` : i; + return { + workflowType: n, + workflowLabel: String(o || n).trim(), + workflowBadge: a + }; +} +// ui/vue/components/panel/sidebar/generationSectionState.ts +var Si = /* @__PURE__ */ new Set([ + "png", + "jpg", + "jpeg", + "webp", + "gif", + "bmp", + "tiff", + "tif", + "avif", + "jxl", + "heic", + "heif", + "apng", + "hdr", + "svg" +]); +function Ci(e) { + let t = String(e?.filename || e?.name || e?.filepath || e?.path || "").trim().toLowerCase(); + return !t || !t.includes(".") ? "" : t.split(".").pop() || ""; +} +function wi(e) { + return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : Si.has(Ci(e)); +} +function Ti(e) { + let t = Ci(e); + return t === "jpg" || t === "jpeg"; +} +function Ei() { + try { + return !!(z()?.ai?.vectorSearchEnabled ?? !0); + } catch { + return !0; + } +} +function Di(e) { + return e >= .75 ? "#4CAF50" : e >= .5 ? "#8BC34A" : e >= .3 ? "#FF9800" : "#F44336"; +} +function Oi(e) { + return e >= .85 ? "Excellent" : e >= .7 ? "Good" : e >= .5 ? "Fair" : e >= .3 ? "Low" : "Very Low"; +} +function ki(e) { + let t = String(e || "").trim(); + if (!t) return ""; + let n = []; + for (let e of t.replace(/\r\n/g, "\n").split("\n")) { + let t = String(e || "").trim(); + t && (/^title\s*:/i.test(t) || (/^caption\s*:/i.test(t) && (t = t.replace(/^caption\s*:/i, "").trim()), t && n.push(t))); + } + return (n.length ? n.join(" ") : t).replace(/\s+/g, " ").replace(/:{2,}\s*$/, "").trim(); +} +function Ai(e) { + let t = String(e?.filename || "").trim(); + if (!t) return []; + let n = String(e?.subfolder || "").trim(), r = String(e?.folder_type || "input").trim().toLowerCase(), i = [], a = (e) => { + if (!e) return; + let r = A(t, n, e); + r && !i.includes(r) && i.push(r); + }; + return (r === "input" || r === "output") && a(r), a("input"), a("output"), i; +} +function ji(e) { + let t = String(e?.filepath || "").trim(), n = String(e?.filename || "").trim(); + return !t || t === n ? "" : t; +} +function Mi(e) { + let t = String(e || "").trim(); + if (!t) return !1; + if (t.startsWith("/")) return !0; + try { + let e = new URL(t); + return e.protocol === "http:" || e.protocol === "https:"; + } catch { + return !1; + } +} +function Y(e) { + return e == null || e === "" ? "-" : String(e); +} +function Ni(e, t) { + let n = String(e?.pass_stage || e?.stage || e?.kind || "").trim().toLowerCase(); + if (n === "txt2img" || n === "text_to_image" || n === "text-to-image") return M("sidebar.generation.stageTextToImage", "Text-to-Image"); + if (n === "img2img" || n === "image_to_image" || n === "image-to-image") return M("sidebar.generation.stageImageToImage", "Image-to-Image"); + if (n === "inpaint" || n === "inpainting") return M("sidebar.generation.stageInpaint", "Inpaint"); + if (n === "upscale" || n === "upscaling") return M("sidebar.generation.stageUpscale", "Upscale"); + if (n === "refine" || n === "refiner") return M("sidebar.generation.stageRefine", "Refine"); + let r = String(e?.pass_name || "").trim(); + if (r && r.toLowerCase() !== "base") return r; + let i = Number(e?.denoise); + return t === 0 || i === 1 ? M("sidebar.generation.stageBase", "Base") : Number.isFinite(i) && i < 1 ? M("sidebar.generation.stageRefineUpscale", "Refine / Upscale") : M("sidebar.generation.stagePassN", "Pass {n}", { n: t + 1 }); +} +function Pi(e) { + let t = []; + return e?.metadata_raw && t.push(e.metadata_raw), e?.workflow && t.push(e.workflow), e?.metadata_raw?.workflow && t.push(e.metadata_raw.workflow), e?.metadata_raw?.raw_ffprobe?.format?.tags && t.push(e.metadata_raw.raw_ffprobe.format.tags), e?.metadata_raw?.ffprobe?.format?.tags && t.push(e.metadata_raw.ffprobe.format.tags), e?.geninfo && typeof e.geninfo == "object" && t.push({ geninfo: e.geninfo }), e?.metadata && (typeof e.metadata == "object" || typeof e.metadata == "string") && t.push(e.metadata), e?.prompt && (typeof e.prompt == "object" || typeof e.prompt == "string") && t.push(e.prompt), e?.exif && t.push(e.exif), e && typeof e == "object" && t.push(e), t; +} +function Fi(e, t) { + for (let [n, r] of Object.entries(t)) r != null && r !== "" && (e[n] === void 0 || e[n] === null || e[n] === "") && (e[n] = r); +} +function Ii(e) { + let t = Pi(e), n = {}; + for (let e of t) { + let t = ai(e); + t && typeof t == "object" && Fi(n, t); + } + return Object.keys(n).length ? n : null; +} +function Li(e) { + try { + if (!e || typeof e != "object") return !1; + if (e.is_override || typeof e.workflow_notes == "string" && e.workflow_notes.trim() || typeof e.notes == "string" && e.notes.trim() || Array.isArray(e.custom_info) && e.custom_info.length > 0 || e.engine && typeof e.engine == "object" && e.engine.type || q(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && q(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || e.ltx_director && typeof e.ltx_director == "object" || e.ideogram && typeof e.ideogram == "object" || e.sampler || e.sampler_name || e.steps || e.cfg || e.cfg_scale || e.cfg_high_noise || e.cfg_low_noise || e.scheduler || Array.isArray(e.chained_passes) && e.chained_passes.length > 0 || Array.isArray(e.all_samplers) && e.all_samplers.length > 0 || e.seed || e.denoise || e.denoising || e.clip_skip || e.voice || e.language || e.temperature || e.top_k || e.top_p || e.repetition_penalty || e.max_new_tokens || e.device || e.voice_preset || e.instruct || e.dtype || e.attn_implementation || e.enable_chunking !== void 0 || e.max_chars_per_chunk || e.chunk_combination_method || e.silence_between_chunks_ms || e.enable_audio_cache !== void 0 || e.batch_size !== void 0 || e.use_torch_compile !== void 0 || e.use_cuda_graphs !== void 0 || e.compile_mode || typeof e.lyrics == "string" && e.lyrics.trim()) return !0; + } catch { + return !1; + } + return !1; +} +function X(e) { + return e ? typeof e == "string" ? J(e) : typeof e == "object" ? J(e.name || e.value || "") : "" : ""; +} +function Z(e, t, n, r) { + let i = String(r || "").trim(); + if (!i) return; + let a = `${n}::${i}`; + t.has(a) || (t.add(a), e.push({ + label: n, + value: i + })); +} +function Ri(e) { + let t = `${String(e?.source || "").toLowerCase()} ${String(e?.name || e?.lora_name || "").toLowerCase()}`; + return t.includes("high_noise") || t.includes("high noise") ? "high_noise" : t.includes("low_noise") || t.includes("low noise") ? "low_noise" : ""; +} +function zi(e) { + let t = [], n = Array.isArray(e.model_groups) ? e.model_groups : []; + if (n.length) return n.forEach((e) => { + if (!e || typeof e != "object") return; + let n = X(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => vi(e)).filter(Boolean) : []; + (n || r.length) && t.push({ + key: String(e.key || "").trim() || `group-${t.length + 1}`, + label: String(e.label || "").trim() || `Group ${t.length + 1}`, + model: n, + loras: r + }); + }), t; + let r = e.models && typeof e.models == "object" ? e.models : null, i = Array.isArray(e.loras) ? e.loras : []; + return r && [{ + key: "high_noise", + label: M("sidebar.generation.highNoise", "High Noise"), + model: X(r.unet_high_noise) + }, { + key: "low_noise", + label: M("sidebar.generation.lowNoise", "Low Noise"), + model: X(r.unet_low_noise) + }].forEach((e) => { + let n = i.filter((t) => Ri(t) === e.key).map((e) => vi(e)).filter(Boolean); + (e.model || n.length) && t.push({ + ...e, + loras: n + }); + }), t; +} +function Bi(e, t) { + return t == null ? null : { + label: e, + value: t ? M("state.on", "on") : M("state.off", "off") + }; +} +function Q(e) { + return e != null && String(e).trim() !== ""; +} +function Vi(e) { + let t = String(e || "").toLowerCase(); + return t.includes("high") ? "#52ffe8" : t.includes("low") ? "#42A5F5" : t.includes("refine") ? "#AB47BC" : t.includes("upscale") ? "#66BB6A" : t.includes("interpolation") || t.includes("video") ? "#dace26" : "#9C27B0"; +} +function Hi(e) { + return String(e || "").trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, ""); +} +function Ui(e, t) { + let n = String(t || e || "").trim(), r = String(e || n).toLowerCase(), i = r.match(/^pass_(\d+)$/); + return i ? M("sidebar.generation.stagePassN", "Pass {n}", { n: Number(i[1]) }) : r.includes("high") ? "High" : r.includes("low") ? "Low" : r.includes("refine") ? "Refiner" : r.includes("upscale") ? "Upscale" : r.includes("text_to_image") || r.includes("image_to_image") || r === "base" ? "Base" : n || "Branch"; +} +function Wi(e, t) { + let n = new Set(t.map((e) => String(e).toLowerCase())); + return e.find((e) => n.has(String(e.label || "").toLowerCase())) || null; +} +function Gi(e, t) { + return Q(t) ? { + label: e, + value: t + } : null; +} +function Ki(e) { + let t = String(e || "").toLowerCase(); + return t.includes("high_noise") || t.includes("high-noise") || t.includes("high noise") ? "high" : t.includes("low_noise") || t.includes("low-noise") || t.includes("low noise") ? "low" : ""; +} +function qi(e) { + return Array.isArray(e) || e && typeof e == "object" ? !1 : Q(e) && String(e).trim() !== "-"; +} +function Ji(e) { + return typeof e == "number" ? Math.abs(e - Math.round(e)) < 1e-9 ? String(Math.round(e)) : e.toFixed(2).replace(/0+$/g, "").replace(/\.$/, "") : String(e ?? "").trim(); +} +function Yi(e) { + if (!Q(e)) return null; + let t = Number(e); + return !Number.isFinite(t) || t <= 0 ? null : e; +} +function Xi(e, t) { + let n = Yi(e.seed); + if (n !== null) return n; + let r = [Array.isArray(e.chained_passes) ? e.chained_passes : [], Array.isArray(e.all_samplers) ? e.all_samplers : []]; + for (let e of r) for (let t of e) { + let e = Yi(t?.seed_val ?? t?.seed); + if (e !== null) return e; + } + for (let e of t || []) { + let t = Yi(Wi(e.fields || [], ["Seed"])?.value); + if (t !== null) return t; + } + return null; +} +function Zi(e, t) { + if (!t || !qi(t.value)) return; + let n = `${String(t.label || "").toLowerCase()}::${Ji(t.value)}`; + e.some((e) => `${String(e.label || "").toLowerCase()}::${Ji(e.value)}` === n) || e.push({ + ...t, + value: Ji(t.value) + }); +} +function Qi(e, t, n, r) { + let i = /* @__PURE__ */ new Map(), a = (e, t) => { + let n = Hi(e || t || "branch") || "branch"; + n.includes("high") && (n = "high"), n.includes("low") && (n = "low"); + let r = i.get(n); + if (r) return r; + let a = { + key: n, + label: Ui(n, t), + accent: Vi(n), + modelFields: [], + samplingFields: [], + loras: [] + }; + return i.set(n, a), a; + }, o = (e, t, n) => { + let r = String(n || "").trim(); + r && (e.modelFields.some((e) => String(e.label || "").toLowerCase() === String(t || "").toLowerCase() && J(e.value) === J(r)) || e.modelFields.push({ + label: t, + value: r + })); + }, s = (e, t) => { + let n = String(t || "").trim(); + n && !e.loras.includes(n) && e.loras.push(n); + }; + for (let e of t || []) { + let t = a(e.key, e.label); + e.model && o(t, "UNet", e.model); + for (let n of e.loras || []) s(t, n); + } + let c = e.models && typeof e.models == "object" ? e.models : null; + if (c) { + let t = X(c.unet), n = Ki(t), r = X(c.checkpoint || (n ? null : c.unet) || e.model || e.checkpoint), i = X(c.unet_high_noise) || (n === "high" ? t : ""), l = X(c.unet_low_noise) || (n === "low" ? t : ""), u = X(c.clip), d = X(c.vae), f = Array.isArray(e.loras) ? e.loras.map((e) => vi(e)).filter(Boolean) : [], p = !!(i || l), m = !p && (r || u || d || f.length) ? a("base", "Base") : null, h = p && (u || d) ? a("shared", "Shared") : null, g = i ? a("high", "High") : null, _ = l ? a("low", "Low") : null; + if (m) { + r && o(m, e.model || e.checkpoint || c.checkpoint ? "Model" : "UNet", r), u && o(m, "CLIP", u), d && o(m, "VAE", d); + for (let e of f) s(m, e); + } + h && (u && o(h, "CLIP", u), d && o(h, "VAE", d)), g && o(g, "UNet", i), _ && o(_, "UNet", l); + } + let l = i.get("high") || i.get("high_noise"), u = i.get("low") || i.get("low_noise"), d = [ + Wi(n, ["Sampler"]), + Wi(n, ["Scheduler"]), + Wi(n, ["Steps"]), + Wi(n, ["Seed"]) + ].filter(Boolean), f = Gi("CFG", e.cfg_high_noise), p = Gi("CFG", e.cfg_low_noise); + l && [...d, ...f ? [f] : []].forEach((e) => Zi(l.samplingFields, e)), u && [...d, ...p ? [p] : []].forEach((e) => Zi(u.samplingFields, e)); + let m = (r || []).some((e) => Hi(e.label).includes("upscale")), h = (r || []).length === 2 && (r || []).every((e) => ["base", "pass_2"].includes(Hi(e.label))); + for (let [e, t] of (r || []).entries()) { + let n = Hi(t.label); + if (!n) continue; + let i = (r || []).filter((e) => Hi(e.label) === Hi(t.label)).length, o = Hi(t.stage), s = o ? (r || []).filter((e) => Hi(e.stage) === o).length : 0, c = Wi(t.fields || [], ["Model"]), d = Ki(c?.value); + ["high", "low"].includes(n) || (d ? n = d : s > 1 || i > 1 ? n = `pass_${e + 1}` : h ? n = e === 0 ? "high" : "low" : n === "base" && l && u ? n = "high" : ["text_to_image", "image_to_image"].includes(n) && (n = m ? "low" : "base")), n.includes("upscale") && m && (n = "high"); + let f = a(n, t.label); + if (!/^pass_\d+$/i.test(n) && c && String(c.value || "") !== "-") { + let e = J(c.value); + f.modelFields.some((t) => J(t.value) === e) || f.modelFields.push(c); + } + for (let e of t.fields || []) [ + "Sampler", + "Scheduler", + "Steps", + "CFG", + "Denoise", + "Seed", + "Start", + "End" + ].includes(String(e.label || "")) && Zi(f.samplingFields, e); + } + return Array.from(i.values()).filter((e) => e.modelFields.length || e.samplingFields.length || e.loras.length); +} +function $i(e, t, n, r) { + let i = [], a = (e, t, n, r) => { + let a = r.filter((e) => e && Q(e.value) && String(e.value) !== "-"); + a.length && i.push({ + key: e, + title: t, + accent: n, + fields: a + }); + }; + for (let n of t || []) { + let t = Hi(n.label), r = (n.fields || []).some((e) => { + let t = String(e?.label || "").toLowerCase(), n = String(e?.value || "").toLowerCase(); + return t.includes("upscaler") || n.includes("upscale") || n.includes("upscaler") || /(?:^|[_\s-])to[_\s-]?\d{3,5}(?:[_\s.-]|$)/i.test(n); + }); + t.includes("upscale") && (e.upscaler || r) && a("upscale", "Upscale", "#66BB6A", n.fields || []), (t.includes("interpolation") || t.includes("rife") || t.includes("film")) && a("interpolation", "Interpolation", "#26C6DA", n.fields || []); + } + a("audio", "MMAudio", "#26A69A", [ + Gi("Voice", e.voice), + Gi("Language", e.language), + Gi("Temperature", e.temperature), + Gi("Lyrics Strength", e.lyrics_strength) + ].filter(Boolean)), a("interpolation", "Interpolation", "#26C6DA", [ + Gi("Engine", e.interpolation_engine || e.frame_interpolation || e.interpolator), + Gi("Source FPS", e.source_fps || e.input_fps), + Gi("Final FPS", e.final_fps || e.output_fps || e.fps) + ].filter(Boolean)); + for (let e of n || []) i.push({ + key: Hi(e.title) || `module_${i.length}`, + title: e.title, + accent: e.color || "#2196F3", + fields: [{ + label: "Info", + value: e.content + }] + }); + r && !i.some((e) => String(e.title).toLowerCase() === String(r).toLowerCase()) && a("workflow_engine", r, "#2196F3", [Gi("Engine", r)].filter(Boolean)); + let o = /* @__PURE__ */ new Set(); + return i.filter((e) => { + let t = `${e.key}:${e.title}:${JSON.stringify(e.fields)}`; + return !o.has(t) && (o.add(t), !0); + }); +} +function ea(e) { + return new Set(Array.isArray(e.override_fields) ? e.override_fields.map((e) => String(e || "").trim()).filter(Boolean) : []); +} +function $(e, ...t) { + return t.some((t) => e.has(t)); +} +function ta(e) { + return Array.isArray(e) ? e.filter((e) => e && typeof e == "object").map((e, t) => ({ + title: String(e.title || M("sidebar.generation.customInfoN", "Custom Info {n}", { n: t + 1 })).trim(), + content: String(e.content ?? e.value ?? "").trim(), + color: /^#[0-9a-fA-F]{6}$/.test(String(e.color || "").trim()) ? String(e.color).trim() : "#2196F3" + })).filter((e) => e.content) : []; +} +function na(e) { + if (!e || typeof e != "object") return null; + let t = [], n = (e, n) => { + Q(n) && t.push({ + label: e, + value: Ji(n) + }); + }; + n("FPS", e.frame_rate), n("Frames", e.duration_frames), n("Duration", e.duration_seconds), (Q(e.width) || Q(e.height)) && t.push({ + label: "Size", + value: `${e.width || "?"} x ${e.height || "?"}` + }); + let r = Array.isArray(e.segments) ? e.segments.map((e, t) => { + if (!e || typeof e != "object") return null; + let n = q(e.prompt || e.text || ""), r = String(e.filename || e.imageFile || e.videoFile || e.audioFile || "").trim(), i = String(e.filepath || e.path || r).trim(), a = String(e.in || e.in_label || e.start || e.start_frame || "").trim(), o = String(e.out || e.out_label || e.end || e.end_frame || "").trim(); + if (!n && !r && !a && !o) return null; + let s = String(e.type || "").trim().toLowerCase(), c = s === "video" || /\.(mp4|mov|webm|mkv|avi|m4v)$/i.test(r), l = s === "audio" || /\.(mp3|wav|flac|ogg|m4a|aac|opus)$/i.test(r); + return { + key: String(e.id || `segment-${t + 1}`), + label: `Segment ${t + 1}`, + prompt: n, + inLabel: a, + outLabel: o, + filename: r, + filepath: i, + type: String(e.type || "").trim(), + isVideo: c, + isAudio: l, + previewCandidates: r ? Ai({ + filename: r, + filepath: i, + folder_type: String(e.folder_type || e.folderType || "input").trim(), + subfolder: String(e.subfolder || "").trim() + }) : [] + }; + }).filter(Boolean) : [], i = q(e.global_prompt || e.globalPrompt || ""); + return !i && !r.length && !t.length ? null : { + title: String(e.title || "LTX Director").trim(), + globalPrompt: i, + fields: t, + segments: r + }; +} +function ra(e) { + if (!e || typeof e != "object") return null; + let t = e.payload && typeof e.payload == "object" ? e.payload : e, n = typeof e.json == "string" && e.json.trim() ? e.json.trim() : JSON.stringify(t, null, 2), r = q(e.high_level_description || e.highLevelDescription || t.high_level_description || ""), i = q(e.background || t.background || ""), a = [], o = (e, t) => { + Q(t) && a.push({ + label: e, + value: Ji(t) + }); + }; + o("Style", t.style), o("Photo Style", t.photo_style || t["style.photo"]), o("Medium", t.medium), o("Lighting", t.lighting), o("Aesthetics", t.aesthetics), o("BG Brightness", t.bg_brightness), (Q(t.width) || Q(t.height)) && a.push({ + label: "Size", + value: `${t.width || "?"} x ${t.height || "?"}` + }); + let s = (Array.isArray(e.elements) ? e.elements : Array.isArray(t.elements) ? t.elements : []).map((e, t) => { + if (!e || typeof e != "object") return null; + let n = [ + e.x, + e.y, + e.w, + e.h + ].map((e) => Number(e)).map((e) => Number.isFinite(e) ? e.toFixed(3).replace(/0+$/g, "").replace(/\.$/, "") : "").join(", "), r = Array.isArray(e.palette) ? e.palette.map((e) => String(e || "").trim()).filter(Boolean) : [], i = String(e.desc || e.description || "").trim(), a = String(e.text || "").trim(); + return !i && !a && !n && !r.length ? null : { + key: String(e.id || `ideogram-element-${t + 1}`), + label: `Element ${t + 1}`, + description: i, + text: a, + bbox: n, + palette: r + }; + }).filter(Boolean), c = Array.isArray(e.color_palette) ? e.color_palette : Array.isArray(t.color_palette) ? t.color_palette : []; + return !n && !r && !i && !s.length ? null : { + title: String(e.title || "Ideogram 4").trim(), + json: n, + highLevelDescription: r, + background: i, + fields: a, + elements: s, + colorPalette: c.map((e) => String(e || "").trim()).filter(Boolean) + }; +} +function ia(e) { + let t = Ii(e), n = { + kind: "empty", + title: M("sidebar.generation.title", "Generation"), + workflowType: "", + workflowLabel: "", + workflowBadge: "", + isTruncated: !1, + positivePrompt: "", + negativePrompt: "", + positivePromptOverride: !1, + negativePromptOverride: !1, + promptTabs: [], + mediaOnlyMessage: "", + showAlignment: !1, + captionLabel: M("sidebar.generation.imageDescription", "Image Description"), + emptyCaptionText: M("sidebar.generation.noImageDescription", "No image description yet."), + isImageAsset: wi(e), + lyrics: "", + modelFields: [], + modelGroups: [], + branchCards: [], + pipelineTabs: [], + samplingFields: [], + ttsFields: [], + ttsEngineFields: [], + ttsInstruction: "", + ttsRuntimeFields: [], + audioFields: [], + seed: null, + imageFields: [], + inputFiles: [], + isOverride: !1, + overrideLabel: "", + notesFields: [], + customInfoBlocks: [], + moduleBlocks: [], + ltxDirector: null, + ideogram: null + }; + if (!t || typeof t == "object" && Object.keys(t).length === 0 || !Li(t)) { + let t = e?.metadata_raw?.geninfo_status || e?.geninfo_status; + return t && typeof t == "object" && t.kind === "media_pipeline" ? { + ...n, + kind: "media-only", + mediaOnlyMessage: M("sidebar.generation.mediaOnlyPipeline", "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.") + } : wi(e) || Ti(e) ? { + ...n, + kind: "caption-only", + showAlignment: !1 + } : n; + } + let r = t, i = na(r.ltx_director), a = ra(r.ideogram), o = ea(r), s = r.engine && typeof r.engine == "object" ? r.engine : null, c = !!(r.is_override || s?.mode === "override" || s?.parser_version === "geninfo-override-v1" || s?.source === "majoor_geninfo"), l = xi(r), u = gi(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), d = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => { + let n = gi(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : ""); + return { + label: M("sidebar.generation.promptN", "Prompt {n}", { n: t + 1 }), + positive: q(n.positive), + negative: q(n.negative) + }; + }).filter((e) => e.positive) : [], f = [], p = /* @__PURE__ */ new Set(), m = r.models && typeof r.models == "object" ? r.models : null, h = zi(r), g = new Set(h.map((e) => String(e.model || "").trim()).filter(Boolean)), _ = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null; + if (m) { + let e = new Set([ + X(m.unet_high_noise), + X(m.unet_low_noise), + ...g + ].filter(Boolean)); + if (_) _.forEach((e, t) => { + let n = X(e); + Z(f, p, M("sidebar.generation.checkpointN", "Checkpoint {n}", { n: t + 1 }), n); + }); + else { + let t = X(m.checkpoint); + t && !e.has(t) && Z(f, p, M("sidebar.generation.checkpoint", "Checkpoint"), t); + } + [ + ["UNet", X(m.unet)], + ["Diffusion", X(m.diffusion)], + [M("sidebar.generation.upscaler", "Upscaler"), X(m.upscaler)], + ["CLIP", X(m.clip)], + ["VAE", X(m.vae)] + ].forEach(([t, n]) => { + e.has(n) || Z(f, p, t, n); + }); + } else (r.model || r.checkpoint) && Z(f, p, M("sidebar.generation.model", "Model"), J(r.model || r.checkpoint)); + if (Array.isArray(r.loras) && r.loras.length > 0) { + let e = r.loras.map((e) => vi(e)).filter(Boolean).join("\n"); + e && Z(f, p, r.loras.length > 1 ? M("sidebar.generation.loras", "LoRAs") : "LoRA", e); + } + !m && r.clip && Z(f, p, "CLIP", J(r.clip)), !m && r.vae && Z(f, p, "VAE", J(r.vae)), !m && r.unet && Z(f, p, "UNet", J(r.unet)), !m && r.diffusion && Z(f, p, "Diffusion", J(r.diffusion)), !m && r.upscaler && Z(f, p, M("sidebar.generation.upscaler", "Upscaler"), J(r.upscaler)), m && r.clip && Z(f, p, "CLIP", J(r.clip)), m && r.vae && Z(f, p, "VAE", J(r.vae)); + for (let e of f) { + let t = String(e.label || "").toLowerCase(); + (t.includes("checkpoint") || t === "model") && (e.override = $(o, "checkpoint", "model")), t === "clip" && (e.override = $(o, "clip")), t === "vae" && (e.override = $(o, "vae")), t.includes("lora") && (e.override = $(o, "loras")); + } + let v = []; + Q(r.seed) && v.push({ + label: M("sidebar.generation.seed", "Seed"), + value: r.seed, + override: $(o, "seed") + }), (r.sampler || r.sampler_name) && v.push({ + label: M("sidebar.generation.sampler", "Sampler"), + value: r.sampler || r.sampler_name, + override: $(o, "sampler", "sampler_name") + }), Q(r.steps) && v.push({ + label: M("sidebar.generation.steps", "Steps"), + value: r.steps, + override: $(o, "steps") + }); + let y = Q(r.cfg) ? r.cfg : r.cfg_scale; + Q(y) && v.push({ + label: M("sidebar.generation.cfgScale", "CFG Scale"), + value: y, + override: $(o, "cfg", "cfg_scale") + }), r.cfg_high_noise !== void 0 && r.cfg_high_noise !== null && v.push({ + label: M("sidebar.generation.cfgHighNoise", "CFG High Noise"), + value: r.cfg_high_noise + }), r.cfg_low_noise !== void 0 && r.cfg_low_noise !== null && v.push({ + label: M("sidebar.generation.cfgLowNoise", "CFG Low Noise"), + value: r.cfg_low_noise + }), r.scheduler && v.push({ + label: M("sidebar.generation.scheduler", "Scheduler"), + value: r.scheduler, + override: $(o, "scheduler") + }); + let b = Q(r.denoise) ? r.denoise : r.denoising; + Q(b) && v.push({ + label: M("sidebar.generation.denoise", "Denoise"), + value: b, + override: $(o, "denoise", "denoising") + }); + let x = []; + Array.isArray(r.chained_passes) && r.chained_passes.length > 1 ? x = r.chained_passes.filter((e) => e && typeof e == "object").map((e, t) => ({ + label: Ni(e, t), + stage: String(e?.pass_stage || "").trim(), + fields: [ + { + label: M("sidebar.generation.model", "Model"), + value: Y(e?.model) + }, + { + label: M("sidebar.generation.sampler", "Sampler"), + value: Y(e?.sampler_name || e?.sampler) + }, + { + label: M("sidebar.generation.scheduler", "Scheduler"), + value: Y(e?.scheduler) + }, + { + label: M("sidebar.generation.steps", "Steps"), + value: Y(e?.steps) + }, + { + label: "CFG", + value: Y(e?.cfg) + }, + { + label: M("sidebar.generation.denoise", "Denoise"), + value: Y(e?.denoise) + }, + { + label: "Start", + value: Y(e?.start_at_step) + }, + { + label: "End", + value: Y(e?.end_at_step) + }, + { + label: M("sidebar.generation.seed", "Seed"), + value: Y(e?.seed_val ?? e?.seed) + } + ] + })) : Array.isArray(r.all_samplers) && r.all_samplers.length > 1 && (x = r.all_samplers.filter((e) => e && typeof e == "object").map((e, t) => ({ + label: Ni(e, t), + stage: String(e?.pass_stage || "").trim(), + fields: [ + { + label: M("sidebar.generation.model", "Model"), + value: Y(e?.model) + }, + { + label: M("sidebar.generation.sampler", "Sampler"), + value: Y(e?.sampler_name || e?.sampler) + }, + { + label: M("sidebar.generation.scheduler", "Scheduler"), + value: Y(e?.scheduler) + }, + { + label: M("sidebar.generation.steps", "Steps"), + value: Y(e?.steps) + }, + { + label: "CFG", + value: Y(e?.cfg) + }, + { + label: M("sidebar.generation.denoise", "Denoise"), + value: Y(e?.denoise) + }, + { + label: "Start", + value: Y(e?.start_at_step) + }, + { + label: "End", + value: Y(e?.end_at_step) + }, + { + label: M("sidebar.generation.seed", "Seed"), + value: Y(e?.seed_val ?? e?.seed) + } + ] + }))); + let S = []; + r.voice && S.push({ + label: M("sidebar.generation.narratorVoice", "Narrator Voice"), + value: r.voice + }), r.language && S.push({ + label: M("sidebar.generation.language", "Language"), + value: r.language + }), r.top_k !== void 0 && r.top_k !== null && S.push({ + label: "Top-k", + value: r.top_k + }), r.top_p !== void 0 && r.top_p !== null && S.push({ + label: "Top-p", + value: r.top_p + }), r.temperature !== void 0 && r.temperature !== null && S.push({ + label: M("sidebar.generation.temperature", "Temperature"), + value: r.temperature + }), r.repetition_penalty !== void 0 && r.repetition_penalty !== null && S.push({ + label: M("sidebar.generation.repetitionPenalty", "Repetition Penalty"), + value: r.repetition_penalty + }), r.max_new_tokens !== void 0 && r.max_new_tokens !== null && S.push({ + label: M("sidebar.generation.maxNewTokens", "Max New Tokens"), + value: r.max_new_tokens + }); + let C = []; + r.device && C.push({ + label: M("sidebar.generation.device", "Device"), + value: r.device + }), r.voice_preset && C.push({ + label: M("sidebar.generation.voicePreset", "Voice Preset"), + value: r.voice_preset + }), r.dtype && C.push({ + label: M("sidebar.generation.dtype", "Dtype"), + value: r.dtype + }), r.attn_implementation && C.push({ + label: M("sidebar.generation.attention", "Attention"), + value: r.attn_implementation + }), r.compile_mode && C.push({ + label: M("sidebar.generation.compileMode", "Compile Mode"), + value: r.compile_mode + }), [ + Bi(M("sidebar.generation.torchCompile", "Torch Compile"), r.use_torch_compile), + Bi(M("sidebar.generation.cudaGraphs", "CUDA Graphs"), r.use_cuda_graphs), + Bi(M("sidebar.generation.xVectorOnly", "X-Vector Only"), r.x_vector_only_mode) + ].filter(Boolean).forEach((e) => C.push(e)); + let ee = []; + [ + Bi(M("sidebar.generation.chunking", "Chunking"), r.enable_chunking), + r.max_chars_per_chunk !== void 0 && r.max_chars_per_chunk !== null ? { + label: M("sidebar.generation.maxCharsChunk", "Max Chars/Chunk"), + value: r.max_chars_per_chunk + } : null, + r.chunk_combination_method ? { + label: M("sidebar.generation.chunkMethod", "Chunk Method"), + value: r.chunk_combination_method + } : null, + r.silence_between_chunks_ms !== void 0 && r.silence_between_chunks_ms !== null ? { + label: M("sidebar.generation.silenceBetweenChunks", "Silence Between Chunks (ms)"), + value: r.silence_between_chunks_ms + } : null, + Bi(M("sidebar.generation.audioCache", "Audio Cache"), r.enable_audio_cache), + r.batch_size !== void 0 && r.batch_size !== null ? { + label: M("sidebar.generation.batchSize", "Batch Size"), + value: r.batch_size + } : null + ].filter(Boolean).forEach((e) => ee.push(e)); + let te = []; + r.lyrics_strength !== void 0 && r.lyrics_strength !== null && te.push({ + label: M("sidebar.generation.lyricsStrength", "Lyrics Strength"), + value: r.lyrics_strength + }); + let w = []; + Q(b) && !v.some((e) => e.label === "Denoise") && w.push({ + label: M("sidebar.generation.denoise", "Denoise"), + value: b + }), Q(r.clip_skip) && w.push({ + label: M("sidebar.generation.clipSkip", "Clip Skip"), + value: r.clip_skip + }); + let ne = [], T = String(r.workflow_notes || r.notes || "").trim(); + T && ne.push({ + label: M("sidebar.generation.workflowNotes", "Workflow Notes"), + value: T, + override: $(o, "workflow_notes", "notes") + }); + let E = ta(r.custom_info), D = Qi(r, h, v, x), O = $i(r, x, E, l.workflowType), re = Xi(r, x), ie = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ + id: `${e.filename}-${t}`, + filename: String(e.filename || "").trim(), + subfolder: String(e.subfolder || "").trim(), + type: String(e.folder_type || "input").trim().toLowerCase(), + root_id: String(e.root_id || e.rootId || "").trim(), + kind: String(e.kind || e.media_kind || e.type || "").trim().toLowerCase(), + filepath: ji(e), + role: String(e.role || "").trim(), + roleLabel: String(e.role || "").trim().replace(/_/g, " "), + isVideo: String(e.type || "").toLowerCase() === "video" || /\.(mp4|mov|webm)$/i.test(String(e.filename || "")), + isAudio: String(e.type || "").toLowerCase() === "audio" || /\.(wav|mp3|flac|ogg|m4a|aac|opus)$/i.test(String(e.filename || "")), + previewCandidates: Ai(e) + })) : []; + return { + ...n, + kind: "full", + metadata: r, + workflowType: l.workflowType, + workflowLabel: l.workflowLabel, + workflowBadge: l.workflowBadge, + isTruncated: !!(e?.geninfo?._truncated || e?.metadata?._truncated || e?.prompt?._truncated), + positivePrompt: d.length || a ? "" : String(u.positive || "").trim(), + negativePrompt: d.length ? "" : String(u.negative || "").trim(), + positivePromptOverride: $(o, "prompt", "positive", "positive_prompt"), + negativePromptOverride: $(o, "negative_prompt", "negative", "negativePrompt"), + promptTabs: d, + showAlignment: !!e?.id && (!!String(u.positive || "").trim() || d.length > 0), + isImageAsset: wi(e), + lyrics: String(r.lyrics || "").trim(), + modelFields: f, + modelGroups: h, + branchCards: D, + pipelineTabs: x, + samplingFields: v, + ttsFields: S, + ttsEngineFields: C, + ttsInstruction: String(r.instruct || "").trim(), + ttsRuntimeFields: ee, + audioFields: te, + seed: re, + imageFields: w, + inputFiles: ie, + isOverride: c, + overrideLabel: c ? "Gen Info Override" : "", + notesFields: ne, + customInfoBlocks: E, + moduleBlocks: O, + ltxDirector: i, + ideogram: a + }; +} +export { B as A, zn as C, _t as D, Ot as E, Ve as M, ke as N, V as O, qn as S, Dt as T, _r as _, Mi as a, Kn as b, J as c, Sr as d, yr as f, vr as g, mr as h, Ei as i, Be as j, z as k, ai as l, xr as m, Di as n, ki as o, br as p, Oi as r, xi as s, ia as t, q as u, rr as v, Rn as w, Wn as x, pr as y }; diff --git a/dist/chunks/geninfoParser-CgHp-y-n.js b/dist/chunks/geninfoParser-CgHp-y-n.js deleted file mode 100644 index e082c5b1..00000000 --- a/dist/chunks/geninfoParser-CgHp-y-n.js +++ /dev/null @@ -1,792 +0,0 @@ -// ui/components/sidebar/parsers/a1111ParamsParser.ts -function e(e) { - if (!e || typeof e != "string") return null; - let t = {}, n = e.split(/\nNegative prompt:\s*/i); - if (n[0] && (t.prompt = n[0].trim()), n[1]) { - let e = n[1].match(/^(.*?)\n?(Steps:.*)$/s); - if (e) { - t.negative_prompt = e[1].trim(); - let n = e[2], r = (e) => { - let t = n.match(e); - return t ? t[1].trim() : null; - }; - t.steps = r(/Steps:\s*(\d+)/i), t.sampler = r(/Sampler:\s*([^,\n]+)/i), t.cfg = r(/CFG scale:\s*([\d.]+)/i), t.seed = r(/Seed:\s*(\d+)/i), t.width = r(/Size:\s*(\d+)x\d+/i), t.height = r(/Size:\s*\d+x(\d+)/i), t.model = r(/Model:\s*([^,\n]+)/i), t.denoising = r(/Denoising strength:\s*([\d.]+)/i), t.clip_skip = r(/Clip skip:\s*(\d+)/i); - } else t.negative_prompt = n[1].trim(); - } - return Object.keys(t).length > 0 ? t : null; -} -// ui/components/sidebar/parsers/comfyWorkflowParser.ts -function t(e) { - try { - let t = Object.entries(e || {}); - if (!t.length) return !1; - let n = 0; - for (let [, e] of t.slice(0, 50)) if (e && typeof e == "object" && (e.inputs && typeof e.inputs == "object" && (n += 1), n >= 2)) return !0; - return !1; - } catch { - return !1; - } -} -function n(e) { - if (!e || typeof e != "object") return null; - let t = {}, n = [], i = v(e), o = [], s = O(e); - for (let e of s) { - if (!e || typeof e != "object") continue; - let r = M(e); - if (!r || typeof r != "object") continue; - let a = String(e?.class_type || e?.type || "").toLowerCase(), s = String(e?.title || e?._meta?.title || "").toLowerCase(), c = (e, n) => { - if (t[e] || typeof n != "string") return; - let r = n.trim(); - r && (/^[\d\s.,+-]+$/.test(r) || (t[e] = r)); - }; - if ((a.includes("cliptextencode") || a.includes("clip_text_encode") || s.includes("clip text encode")) && typeof r.text == "string") { - let e = s.includes("negative"); - s.includes("positive") || s.includes("(prompt)") || s.includes("prompt"), c(e ? "negative_prompt" : "prompt", r.text); - } - if (c("negative_prompt", r.negative_prompt), c("negative_prompt", r.negative), !t.prompt && typeof r.text == "string") { - let e = r.text.trim(); - (a.includes("prompt") || a.includes("encode") || a.includes("positive") || a.includes("negative") || s.includes("prompt") || s.includes("positive") || s.includes("negative")) && e.length >= 12 && /[a-zA-Z]/.test(e) && c("prompt", e); - } - let l = T(r.seed, i), u = T(r.steps, i), d = T(r.cfg, i), f = T(r.denoise, i); - if (l !== void 0 && t.seed === void 0 && (t.seed = l), u !== void 0 && t.steps === void 0 && (t.steps = u), d !== void 0 && t.cfg === void 0 && (t.cfg = d), r.sampler_name && !t.sampler && (t.sampler = r.sampler_name), r.scheduler && !t.scheduler && (t.scheduler = r.scheduler), f !== void 0 && t.denoise === void 0 && (t.denoise = f), y(a)) { - let t = b(e, i), n = w(e, i), a = E(e?.inputs?.model, i) || E(n.model_link, i); - o.push({ - sampler_name: r.sampler_name || n.sampler_name || r.sampler, - scheduler: r.scheduler || n.scheduler, - steps: T(r.steps, i) ?? n.steps, - cfg: T(r.cfg, i) ?? n.cfg, - denoise: T(r.denoise, i) ?? n.denoise, - seed: T(r.seed ?? r.noise_seed, i) ?? n.seed, - start_at_step: T(r.start_at_step, i), - end_at_step: T(r.end_at_step, i), - model: a, - pass_stage: t - }); - } - r.width !== void 0 && t.width === void 0 && (t.width = r.width), r.height !== void 0 && t.height === void 0 && (t.height = r.height); - let p = (e, n) => { - if (t[e] || typeof n != "string") return; - let r = n.trim(); - r && (t[e] = r); - }, m = [ - r.ckpt_name, - r.checkpoint, - r.checkpoint_name, - r.model_name, - r.model - ]; - for (let e of m) !t.model && !a.includes("upscale") && p("model", e); - a.includes("upscale") && p("upscaler", r.model_name || r.upscale_model || r.model), p("vae", r.vae_name || r.vae), p("clip", r.clip_name || r.clip); - let h = r.unet_name || r.unet; - if (typeof h == "string" && h.trim()) { - let e = t.models && typeof t.models == "object" ? t.models : {}; - /high[_\s-]?noise/i.test(h) ? e.unet_high_noise = { name: h.trim() } : /low[_\s-]?noise/i.test(h) ? e.unet_low_noise = { name: h.trim() } : p("unet", h), Object.keys(e).length && (t.models = e); - } - if (p("diffusion", r.diffusion_name || r.diffusion_model || r.diffusion), a.includes("lora") || a.includes("loraloader")) { - let e = r.lora_name || r.lora || r.name || null, t = r.strength_model ?? r.strength ?? r.weight ?? r.lora_strength ?? null; - if (e) { - let i = { name: e }; - r.strength_model === void 0 ? i.weight = t : i.strength_model = r.strength_model, n.push(i); - } - } - } - let c = _(n), l = _(o, g); - if (c.length && (t.loras = c), l.length > 1 && (t.all_samplers = l), t.seed === void 0) { - let e = l.find((e) => e?.seed !== void 0 && e?.seed !== null)?.seed; - e != null && (t.seed = e); - } - return a(t, s, i), r(t, s), Object.keys(t).length > 0 ? t : null; -} -function r(e, t) { - if (e.ideogram) return; - let n = t.find((e) => { - let t = String(e?.class_type || e?.type || e?.comfyClass || "").toLowerCase(); - return t.includes("ideogram4promptbuilderkj") || t.includes("ideogram4promptbuilder"); - }); - if (!n) return; - let r = M(n) || {}, a = i(o(r.elements_data, r.elements, r.bboxes)), s = i(o(r.style_palette_data, r.palette, r.color_palette)), c = m({ - width: o(r.width, r.custom_width), - height: o(r.height, r.custom_height), - high_level_description: r.high_level_description, - background: r.background, - style: r.style, - photo_style: r["style.photo"] || r.photo_style, - aesthetics: r.aesthetics, - lighting: r.lighting, - medium: r.medium, - bg_brightness: r.bg_brightness, - coord_mode: r.coord_mode, - bbox_order: r.bbox_order, - color_palette: s, - elements: a - }); - if (!Object.keys(c).length) return; - let l = JSON.stringify(c, null, 2); - e.ideogram = m({ - title: String(n?._meta?.title || n?.title || "Ideogram 4").trim(), - json: l, - payload: c, - high_level_description: c.high_level_description, - background: c.background, - elements: Array.isArray(a) ? a : [], - color_palette: Array.isArray(s) ? s : [] - }), e.prompt = l, e.workflow_type = e.workflow_type || "ideogram"; -} -function i(e) { - if (e && typeof e == "object" || typeof e != "string" || !e.trim()) return e; - try { - return JSON.parse(e); - } catch { - return e; - } -} -function a(e, t, n) { - if (e.ltx_director) return; - let r = t.find((e) => { - let t = String(e?.class_type || e?.type || e?.comfyClass || "").toLowerCase(); - return t === "ltxdirector" || t === "ltxdirectorguide"; - }); - if (!r) return; - let i = M(r) || {}, a = r?.properties && typeof r.properties == "object" ? r.properties : {}, l = s(o(i.timeline_data, a.timeline_data)), u = o(i.frame_rate, a.frame_rate, l.frame_rate, 0), d = Number(u), f = Number.isFinite(d) && d > 0 ? d : null, h = c(l.segments, f), g = String(o(l.global_prompt, i.global_prompt, a.global_prompt, "") || "").trim(), _ = p(t, r, n), v = o(i.custom_width, a.custom_width, i.width), y = o(i.custom_height, a.custom_height, i.height); - e.ltx_director = m({ - title: String(r?._meta?.title || r?.title || "LTX Director").trim(), - global_prompt: g, - frame_rate: u, - duration_frames: o(i.duration_frames, a.duration_frames), - duration_seconds: o(i.duration_seconds, a.duration_seconds), - width: v, - height: y, - segments: h, - models: _ - }); - let b = [g, ...h.map((e) => e.prompt)].filter((e) => String(e || "").trim()); - !e.prompt && b.length && (e.prompt = b.join("\n")), !e.models && Object.keys(_).length && (e.models = _), !e.width && v && (e.width = v), !e.height && y && (e.height = y); -} -function o(...e) { - return e.find((e) => e != null && e !== ""); -} -function s(e) { - if (e && typeof e == "object") return e; - if (typeof e != "string" || !e.trim()) return {}; - try { - let t = JSON.parse(e); - return t && typeof t == "object" ? t : {}; - } catch { - return {}; - } -} -function c(e, t) { - return Array.isArray(e) ? e.map((e, n) => l(e, n, t)).filter((e) => e.prompt || e.filename || e.in !== "" || e.out !== "") : []; -} -function l(e, t, n) { - let r = o(e?.start, e?.startFrame, e?.in, e?.from, e?.start_frame), i = o(e?.end, e?.endFrame, e?.out, e?.to, e?.end_frame), a = o(e?.length, e?.duration, e?.frames, e?.duration_frames), s = i === void 0 ? u(r, a) : i, c = String(o(e?.prompt, e?.text, e?.caption, "") || "").trim(), l = String(o(e?.imageFile, e?.videoFile, e?.audioFile, e?.filename, e?.file, e?.path, "") || "").trim(); - return m({ - index: t + 1, - id: e?.id, - prompt: c, - in: d(r, n), - out: d(s, n), - in_frame: r, - out_frame: s, - filename: l, - type: e?.type - }); -} -function u(e, t) { - let n = Number(e), r = Number(t); - if (Number.isFinite(n) && Number.isFinite(r)) return n + r; -} -function d(e, t) { - if (e == null || e === "") return ""; - let n = Number(e); - return !Number.isFinite(n) || !t ? String(e) : f(n / t); -} -function f(e) { - if (!Number.isFinite(e)) return ""; - let t = Math.max(0, e); - if (t < 60) return `${t < 10 && Math.abs(t - Math.round(t)) > .05 ? Math.round(t * 10) / 10 : Math.round(t)}s`; - let n = Math.floor(t / 60), r = Math.round(t % 60); - return r === 0 ? `${n}m` : `${n}m ${r}s`; -} -function p(e, t, n) { - let r = {}, i = (e, t) => { - if (r[e] || typeof t != "string") return; - let n = t.trim(); - n && (r[e] = n); - }, a = M(t) || {}; - i("unet", E(a.model, n)), i("clip", E(a.clip, n)), i("audio_vae", E(a.audio_vae, n)), i("video_vae", E(a.video_vae, n)); - for (let t of e) { - let e = M(t) || {}, n = String(t?.class_type || t?.type || "").toLowerCase(); - if (n.includes("unet") && i("unet", e.unet_name || e.model_name), n.includes("latentupscale") && i("upscaler", e.model_name || e.upscale_model), n.includes("clip") && i("clip", e.clip_name || e.clip_name1), n.includes("vae")) { - let t = e.vae_name || e.model_name; - /audio/i.test(String(t || "")) || n.includes("audio") ? i("audio_vae", t) : /tae|tiny/i.test(String(t || "")) ? i("tiny_vae", t) : i("video_vae", t); - } - } - return r; -} -function m(e) { - let t = {}; - for (let [n, r] of Object.entries(e || {})) r != null && r !== "" && (Array.isArray(r) && r.length === 0 || (!r || typeof r != "object" || Array.isArray(r) || Object.keys(r).length !== 0) && (t[n] = r)); - return t; -} -function h(e) { - if (!e || typeof e != "object") return JSON.stringify(e); - let t = {}; - for (let n of Object.keys(e).sort()) { - let r = e[n]; - r != null && r !== "" && (t[n] = r); - } - return JSON.stringify(t); -} -function g(e) { - return !e || typeof e != "object" ? h(e) : [ - e.sampler_name || e.sampler || "", - e.scheduler || "", - e.steps ?? "", - e.cfg ?? "", - e.denoise ?? "", - e.seed ?? "", - e.start_at_step ?? "", - e.end_at_step ?? "" - ].map((e) => String(e)).join("::"); -} -function _(e, t = h) { - let n = /* @__PURE__ */ new Set(), r = []; - for (let i of e) { - let e = t(i); - n.has(e) || (n.add(e), r.push(i)); - } - return r; -} -function v(e) { - if (!e || typeof e != "object") return null; - let n = e.prompt; - if (typeof n == "string" && n.trim()) try { - n = JSON.parse(n); - } catch { - n = null; - } - let r = n && typeof n == "object" ? n : e; - return t(r) ? r : null; -} -function y(e) { - return e.includes("ksamplerselect") || e.includes("samplerselect") ? !1 : e.includes("ksampler") || e.includes("samplercustom") || e.includes("sampler_custom"); -} -function b(e, t) { - if (!t) return ""; - let n = E(e?.inputs?.model, t).toLowerCase(); - if (x(n)) return "high"; - if (S(n)) return "low"; - if (/\b(upscale|upscaler|_to_\d{3,5}|to[_-]?\d{3,5})\b/i.test(n)) return "upscale"; - let r = C(e, t).join(" "); - if (x(r)) return "high"; - if (S(r)) return "low"; - if (/\b(pidconditioning|imageupscalewithmodel|ultimate|supir|esrgan|realesrgan)\b/i.test(r)) return "upscale"; - let i = C(e, t, "latent_image").join(" "); - return /\b(inpaint|vaeencodeforinpaint|setlatentnoise mask|masktoimage)\b/i.test(i) ? "inpaint" : /\b(latentupscale|latentupsampler|imageupscalewithmodel|ultimate|supir|esrgan|realesrgan)\b/i.test(i) && !x(r) && !S(r) ? "upscale" : /\b(vaeencode|loadimage|imagebatch|imagetolatent)\b/i.test(i) ? "img2img" : /\b(emptylatentimage|emptysd3latentimage|emptychromaradiancelatentimage|empty latent)\b/i.test(i) ? "txt2img" : ""; -} -function x(e) { - return /(?:^|[^a-z0-9])high[_\s-]?noise(?:[^a-z0-9]|$)/i.test(String(e || "")); -} -function S(e) { - return /(?:^|[^a-z0-9])low[_\s-]?noise(?:[^a-z0-9]|$)/i.test(String(e || "")); -} -function C(e, t, n) { - let r = n ? [e?.inputs?.[n]] : Object.values(e?.inputs || {}), i = [], a = /* @__PURE__ */ new Set(), o = (e) => { - let n = String(e?._mjrPromptId || e?.id || ""); - if (n && a.has(n)) return; - n && a.add(n); - let r = String(e?.class_type || e?.type || e?._meta?.title || ""); - r && i.push(r.toLowerCase()); - let s = e?.inputs && typeof e.inputs == "object" ? e.inputs : {}; - for (let e of Object.values(s)) { - let n = D(e, t); - n && o(n); - } - }; - for (let e of r) { - let n = D(e, t); - n && o(n); - } - return i; -} -function w(e, t) { - let n = {}; - if (!t) return n; - let r = D(e?.inputs?.noise, t)?.inputs || {}; - r.noise_seed !== void 0 && (n.seed = r.noise_seed), r.seed !== void 0 && (n.seed = r.seed); - let i = D(e?.inputs?.guider, t)?.inputs || {}; - i.cfg !== void 0 && (n.cfg = i.cfg), i.model !== void 0 && (n.model_link = i.model); - let a = D(e?.inputs?.sampler, t)?.inputs || {}; - a.sampler_name && (n.sampler_name = a.sampler_name); - let o = D(e?.inputs?.sigmas, t)?.inputs || {}; - if (o.scheduler && (n.scheduler = o.scheduler), o.steps !== void 0 && (n.steps = T(o.steps, t)), o.denoise !== void 0 && (n.denoise = T(o.denoise, t)), n.steps === void 0 && typeof o.sigmas == "string") { - let e = o.sigmas.split(",").map((e) => e.trim()).filter(Boolean).length; - e > 1 && (n.steps = Math.max(1, e - 1)); - } - return n; -} -function T(e, t, n = /* @__PURE__ */ new Set()) { - if (e == null || !Array.isArray(e)) return e; - if (!t) return; - let r = D(e, t); - if (!r) return; - let i = String(r?._mjrPromptId || r?.id || e[0] || ""); - if (i && n.has(i)) return; - i && n.add(i); - let a = r?.inputs && typeof r.inputs == "object" ? r.inputs : {}; - if (String(r?.class_type || r?.type || "").toLowerCase().includes("switch")) return T(T(a.switch, t, n) ? a.on_true : a.on_false, t, n); - if (Object.prototype.hasOwnProperty.call(a, "value")) return a.value; - for (let e of [ - "number", - "int", - "float", - "seed", - "steps", - "cfg" - ]) if (Object.prototype.hasOwnProperty.call(a, e)) return a[e]; -} -function E(e, t) { - if (!t) return ""; - let n = /* @__PURE__ */ new Set(), r = (e) => { - let i = D(e, t); - if (!i) return ""; - let a = String(i?._mjrPromptId || i?.id || ""); - if (a && n.has(a)) return ""; - a && n.add(a); - let o = i?.inputs || {}; - if (String(i?.class_type || i?.type || "").toLowerCase().includes("switch")) { - let e = T(o.switch, t), n = r(e ? o.on_true : o.on_false); - if (n) return n; - } - let s = o.unet_name || o.ckpt_name || o.model_name || o.model || o.checkpoint || o.checkpoint_name || ""; - if (typeof s == "string" && s.trim()) return s.trim(); - for (let e of Object.values(o)) { - let t = r(e); - if (t) return t; - } - return ""; - }; - return r(e); -} -function D(e, t) { - if (!Array.isArray(e) || e.length < 1) return null; - let n = String(e[0]), r = t[n]; - if (!r || typeof r != "object") return null; - if (!r._mjrPromptId) try { - Object.defineProperty(r, "_mjrPromptId", { - value: n, - enumerable: !1 - }); - } catch {} - return r; -} -function O(e, n = /* @__PURE__ */ new WeakSet()) { - if (!e || typeof e != "object" || n.has(e)) return []; - n.add(e); - let r = e.prompt; - if (typeof r == "string" && r.trim()) try { - r = JSON.parse(r); - } catch { - r = null; - } - let i = r && typeof r == "object" ? r : null; - if (i && t(i)) return Object.values(i); - let a = []; - t(e) && a.push(...Object.values(e)); - for (let t of k(e)) { - let e = Array.isArray(t?.nodes) ? t.nodes.filter(Boolean) : []; - a.push(...e); - for (let t of e) for (let e of j(t)) a.push(...O(e, n)); - for (let e of A(t)) a.push(...O(e, n)); - } - return a; -} -function k(e) { - if (!e || typeof e != "object") return []; - let t = [], n = (e) => { - e && typeof e == "object" && Array.isArray(e.nodes) && t.push(e); - }; - n(e); - for (let t of [ - "workflow", - "Workflow", - "template", - "Template", - "subgraph", - "Subgraph", - "graph", - "lgraph" - ]) n(e?.[t]); - return t; -} -function A(e) { - return [ - ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], - ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], - ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] - ].filter((e) => e && typeof e == "object" && Array.isArray(e.nodes)); -} -function j(e) { - return [ - e?.subgraph, - e?._subgraph, - e?.subgraph?.graph, - e?.subgraph?.lgraph, - e?.properties?.subgraph, - e?.subgraph_instance, - e?.subgraph_instance?.graph, - e?.inner_graph, - e?.subgraph_graph - ].filter((e) => e && typeof e == "object" && Array.isArray(e.nodes)); -} -function M(e) { - let t = e?.inputs; - if (t && typeof t == "object" && !Array.isArray(t)) return t; - let n = e?.widgets_values, r = {}; - if (n && typeof n == "object" && !Array.isArray(n)) { - for (let [e, t] of Object.entries(n)) r[e] = t; - return r; - } - if (!Array.isArray(t) || !Array.isArray(n)) return null; - let i = t.filter(N); - for (let e = 0; e < n.length; e += 1) { - let a = i[e] || t[e] || null, o = String(a?.label || a?.localized_name || a?.name || a?.widget?.name || a?.widget?.label || "").trim(); - r[o || `param_${e + 1}`] = n[e]; - } - return r; -} -function N(e) { - if (!e || typeof e != "object") return !1; - if (e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim()) return !0; - if (e.link != null) return !1; - let t = String(e.type || "").trim().toUpperCase(); - return [ - "INT", - "FLOAT", - "STRING", - "BOOLEAN", - "BOOL", - "COMBO", - "ENUM" - ].includes(t); -} -// ui/components/sidebar/parsers/geninfoParser.ts -var P = /^(?:[a-z]:[\\/]|[\\/]{1,2}|\.{1,2}[\\/]|~[\\/]).+?[\\/][^\\/\n]+\.(?:png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl|ckpt|safetensors|pt|pth|bin|gguf|json|ya?ml)$/i, F = /^(?!.*[,;])(?!.*\b(?:cinematic|portrait|landscape|lighting|style|detailed|masterpiece|photo|render)\b).*(?:[\\/][^\\/\n]+){2,}\.(?:png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl|ckpt|safetensors|pt|pth|bin|gguf|json|ya?ml)$/i, I = /* @__PURE__ */ new Set([ - "workflow", - "quicktime:workflow", - "keys:workflow", - "comfyui:workflow", - "comfy_workflow", - "comfyuiworkflow" -]), L = /* @__PURE__ */ new Set([ - "prompt", - "quicktime:prompt", - "keys:prompt", - "comfyui:prompt", - "comfy_prompt", - "comfyuiprompt" -]); -function R(r) { - if (!r) return null; - if (typeof r == "object") { - let i = r.geninfo || r.GenInfo || r.generation || null; - if (i && typeof i == "object") { - let e = {}, t = /* @__PURE__ */ new Set(), n = (e, n) => { - if (n && typeof n == "object" && (n.confidence === "override" || n.source === "majoor_geninfo")) for (let n of Array.isArray(e) ? e : [e]) t.add(n); - }, a = i.positive?.value ?? i.positive?.text ?? null, o = i.negative?.value ?? i.negative?.text ?? null; - typeof a == "string" && a.trim() && (e.prompt = a), typeof o == "string" && o.trim() && (e.negative_prompt = o), n("prompt", i.positive), n("negative_prompt", i.negative); - let s = i.checkpoint?.name ?? i.checkpoint ?? null; - typeof s == "string" && s.trim() && (e.model = s), n(["model", "checkpoint"], i.checkpoint); - let c = i.clip?.name ?? i.clip ?? null; - typeof c == "string" && c.trim() && (e.clip = c), n("clip", i.clip); - let l = i.vae?.name ?? i.vae ?? null; - typeof l == "string" && l.trim() && (e.vae = l), n("vae", i.vae); - let u = i.models; - u && typeof u == "object" && (e.models = u); - let d = Array.isArray(i.model_groups) ? i.model_groups : null; - d && d.length && (e.model_groups = d); - let f = Array.isArray(i.loras) ? i.loras : null; - f && (e.loras = f), f?.some((e) => e?.confidence === "override" || e?.source === "majoor_geninfo") && t.add("loras"); - let p = i.sampler?.name ?? i.sampler ?? null; - typeof p == "string" && p.trim() && (e.sampler = p), n("sampler", i.sampler); - let m = i.scheduler?.name ?? i.scheduler ?? null; - typeof m == "string" && m.trim() && (e.scheduler = m), n("scheduler", i.scheduler); - let h = i.steps?.value ?? i.steps ?? null; - h != null && (e.steps = h), n("steps", i.steps); - let g = i.cfg?.value ?? i.cfg ?? null; - g != null && (e.cfg = g), n(["cfg", "cfg_scale"], i.cfg); - let _ = i.cfg_high_noise?.value ?? i.cfg_high_noise ?? null; - _ != null && (e.cfg_high_noise = _); - let v = i.cfg_low_noise?.value ?? i.cfg_low_noise ?? null; - v != null && (e.cfg_low_noise = v); - let y = i.seed?.value ?? i.seed ?? null; - y != null && (e.seed = y), n("seed", i.seed); - let b = i.voice?.name ?? i.voice?.value ?? i.voice ?? null; - b != null && String(b).trim() && (e.voice = String(b).trim()); - let x = i.language?.value ?? i.language ?? null; - x != null && String(x).trim() && (e.language = String(x).trim()); - let S = i.temperature?.value ?? i.temperature ?? null; - S != null && (e.temperature = S); - let C = i.top_k?.value ?? i.top_k ?? null; - C != null && (e.top_k = C); - let w = i.top_p?.value ?? i.top_p ?? null; - w != null && (e.top_p = w); - let T = i.repetition_penalty?.value ?? i.repetition_penalty ?? null; - T != null && (e.repetition_penalty = T); - let E = i.max_new_tokens?.value ?? i.max_new_tokens ?? null; - E != null && (e.max_new_tokens = E); - let D = i.device?.value ?? i.device ?? null; - D != null && String(D).trim() && (e.device = String(D).trim()); - let O = i.voice_preset?.value ?? i.voice_preset ?? null; - O != null && String(O).trim() && (e.voice_preset = String(O).trim()); - let k = i.instruct?.value ?? i.instruct ?? null; - k != null && String(k).trim() && (e.instruct = String(k).trim()); - let A = i.dtype?.value ?? i.dtype ?? null; - A != null && String(A).trim() && (e.dtype = String(A).trim()); - let j = i.attn_implementation?.value ?? i.attn_implementation ?? null; - j != null && String(j).trim() && (e.attn_implementation = String(j).trim()); - let M = i.x_vector_only_mode?.value ?? i.x_vector_only_mode ?? null; - M != null && (e.x_vector_only_mode = M); - let N = i.use_torch_compile?.value ?? i.use_torch_compile ?? null; - N != null && (e.use_torch_compile = N); - let P = i.use_cuda_graphs?.value ?? i.use_cuda_graphs ?? null; - P != null && (e.use_cuda_graphs = P); - let F = i.compile_mode?.value ?? i.compile_mode ?? null; - F != null && String(F).trim() && (e.compile_mode = String(F).trim()); - let I = i.enable_chunking?.value ?? i.enable_chunking ?? null; - I != null && (e.enable_chunking = I); - let L = i.max_chars_per_chunk?.value ?? i.max_chars_per_chunk ?? null; - L != null && (e.max_chars_per_chunk = L); - let R = i.chunk_combination_method?.value ?? i.chunk_combination_method ?? null; - R != null && String(R).trim() && (e.chunk_combination_method = String(R).trim()); - let z = i.silence_between_chunks_ms?.value ?? i.silence_between_chunks_ms ?? null; - z != null && (e.silence_between_chunks_ms = z); - let B = i.enable_audio_cache?.value ?? i.enable_audio_cache ?? null; - B != null && (e.enable_audio_cache = B); - let V = i.batch_size?.value ?? i.batch_size ?? null; - V != null && (e.batch_size = V); - let H = i.denoise?.value ?? i.denoise ?? null; - H != null && (e.denoise = H), n(["denoise", "denoising"], i.denoise); - let W = i.clip_skip?.value ?? i.clip_skip ?? i.clipSkip ?? null; - W != null && (e.clip_skip = W); - let G = i.inputs; - Array.isArray(G) && (e.inputs = G), i.ltx_director && typeof i.ltx_director == "object" && (e.ltx_director = i.ltx_director); - let J = i.lyrics?.value ?? i.lyrics ?? null; - typeof J == "string" && J.trim() && (e.lyrics = J); - let Y = i.lyrics_strength?.value ?? i.lyrics_strength ?? null; - Y != null && (e.lyrics_strength = Y); - let X = i.notes?.value ?? i.workflow_notes?.value ?? i.notes ?? i.workflow_notes ?? null; - typeof X == "string" && X.trim() && (e.workflow_notes = X.trim()), n(["workflow_notes", "notes"], i.notes ?? i.workflow_notes), Array.isArray(i.custom_info) && (e.custom_info = i.custom_info), Array.isArray(i.custom_info) && i.engine?.mode === "override" && t.add("custom_info"), Array.isArray(i.all_positive_prompts) && i.all_positive_prompts.length > 1 && (e.all_positive_prompts = i.all_positive_prompts), Array.isArray(i.all_negative_prompts) && i.all_negative_prompts.length > 1 && (e.all_negative_prompts = i.all_negative_prompts), Array.isArray(i.all_samplers) && i.all_samplers.length > 1 && (e.all_samplers = i.all_samplers), Array.isArray(i.chained_passes) && i.chained_passes.length > 1 && (e.chained_passes = i.chained_passes), Array.isArray(i.all_checkpoints) && i.all_checkpoints.length > 1 && (e.all_checkpoints = i.all_checkpoints); - let Z = i.size || null; - if (Z && typeof Z == "object" && (Z.width !== void 0 && (e.width = Z.width), Z.height !== void 0 && (e.height = Z.height)), i.engine && typeof i.engine == "object" && (e.engine = i.engine, (i.engine.mode === "override" || i.engine.parser_version === "geninfo-override-v1" || i.engine.source === "majoor_geninfo") && (e.is_override = !0)), t.size && (e.override_fields = Array.from(t)), U(e, K(r)), q(e, r), Object.keys(e).length) return e; - } - let a = n(r); - if (a) return a; - if (t(r)) { - let e = n({ prompt: r }); - if (e) return e; - } - let o = K(r); - if (o) return o; - if ([ - "prompt", - "negative_prompt", - "negativePrompt", - "steps", - "sampler", - "sampler_name", - "cfg", - "cfg_scale", - "seed", - "width", - "height" - ].some((e) => Object.prototype.hasOwnProperty.call(r, e))) return r; - let s = r.parameters || r["PNG:Parameters"] || r["EXIF:UserComment"] || r.UserComment || r.ImageDescription || null; - if (typeof s == "string") { - let t = e(s); - if (t) return t; - } - let c = r.workflow || r.Workflow || r.comfy || r.comfyui || r.ComfyUI || null; - if (c && typeof c == "object") { - let e = n(c); - if (e) return e; - } - return r; - } - if (typeof r == "string") { - let t = r.trim(); - if (!t) return null; - let n = e(t); - if (n) return n; - if (t.startsWith("{") && t.endsWith("}") || t.startsWith("[") && t.endsWith("]")) try { - return R(JSON.parse(t)); - } catch { - return null; - } - return { prompt: t }; - } - return null; -} -function z(e) { - return String(e || "").trim().replace(/\\/g, "/").toLowerCase(); -} -function B(e) { - if (!e) return null; - if (typeof e == "object") return e; - if (typeof e != "string") return null; - let t = e.trim(); - if (!t || !(t.startsWith("{") || t.startsWith("["))) return null; - try { - return JSON.parse(t); - } catch { - return null; - } -} -function V(e) { - if (!e || typeof e != "object") return []; - let t = [], n = (e) => { - e && typeof e == "object" && !t.includes(e) && t.push(e); - }; - n(e), n(e.metadata_raw), n(e.metadata), n(e.raw), n(e.exif), n(e.metadata_raw?.exif), n(e.metadata?.exif), n(e.format?.tags), n(e.ffprobe?.format?.tags), n(e.raw_ffprobe?.format?.tags), n(e.metadata_raw?.raw_ffprobe?.format?.tags), n(e.metadata_raw?.ffprobe?.format?.tags), n(e.metadata?.raw_ffprobe?.format?.tags), n(e.metadata?.ffprobe?.format?.tags); - let r = [ - e.streams, - e.ffprobe?.streams, - e.raw_ffprobe?.streams, - e.metadata_raw?.raw_ffprobe?.streams, - e.metadata_raw?.ffprobe?.streams, - e.metadata?.raw_ffprobe?.streams, - e.metadata?.ffprobe?.streams - ]; - for (let e of r) if (Array.isArray(e)) for (let t of e) n(t?.tags); - return t; -} -function H(e, t) { - if (!e || typeof e != "object") return null; - for (let [n, r] of Object.entries(e)) if (t.has(z(n))) return r; - return null; -} -function U(e, t) { - if (t && typeof t == "object") for (let [n, r] of Object.entries(t)) r != null && r !== "" && (Array.isArray(r) && Array.isArray(e[n]) ? e[n] = G(e[n], r) : r && typeof r == "object" && !Array.isArray(r) && e[n] && typeof e[n] == "object" && !Array.isArray(e[n]) ? e[n] = { - ...r, - ...e[n] - } : (e[n] === void 0 || e[n] === null || e[n] === "") && (e[n] = r)); -} -function W(e) { - if (!e || typeof e != "object") return JSON.stringify(e); - let t = e.name || e.lora_name || e.model || e.sampler_name || e.sampler || "", n = e.key || e.pass_stage || e.source || ""; - return t || n ? `${String(n).toLowerCase()}::${String(t).toLowerCase()}` : JSON.stringify(e); -} -function G(e, t) { - let n = [...e], r = new Set(n.map((e) => W(e))); - for (let e of t) { - let t = W(e); - r.has(t) || (r.add(t), n.push(e)); - } - return n; -} -function K(e) { - let r = null, i = null; - for (let t of V(e)) if (r ||= B(H(t, I)), i ||= B(H(t, L)), r && i) break; - let a = {}; - return (r || i) && (U(a, n({ - workflow: r, - prompt: i - })), U(a, n(r)), i && t(i) && U(a, n({ prompt: i }))), Object.keys(a).length ? a : null; -} -function q(e, t) { - let r = t?.workflow || t?.Workflow || t?.comfy_workflow || t?.comfy || t?.comfyui || t?.ComfyUI || null; - if (!r || typeof r != "object") return; - let i = n(r), a = Array.isArray(i?.all_samplers) ? i.all_samplers : []; - if (a.length) { - for (let t of ["all_samplers", "chained_passes"]) { - let n = Array.isArray(e[t]) ? e[t] : []; - n.length && (e[t] = n.map((e, t) => { - let n = a[t]?.pass_stage; - return !n || e?.pass_stage ? e : { - ...e, - pass_stage: n - }; - })); - } - !Array.isArray(e.all_samplers) && a.length > 1 && (e.all_samplers = a); - } -} -function J(e) { - let t = typeof e == "string" ? e.trim() : ""; - return !t || t.includes("\n") ? !1 : P.test(t) || F.test(t); -} -function Y(e) { - let t = typeof e == "string" ? e.trim() : ""; - return t ? J(t) ? "" : t : ""; -} -function X(e, t) { - let n = Y(e), r = Y(t); - if (n) { - let e = /(?:^|\n)\s*Negative prompt:\s*/i; - if (e.test(n)) { - let t = n.split(e), i = (t[0] || "").trim(), a = t.slice(1).join("Negative prompt:").trim(), o = a.search(/\n\s*Steps:\s*\d+/i), s = (o >= 0 ? a.slice(0, o) : a).trim(); - i && (n = Y(i)), !r && s && (r = Y(s)); - } - } - return n && r && n.trim() === r.trim() && (r = ""), { - positive: n, - negative: r - }; -} -function Z(e) { - if (!e) return ""; - let t = String(e).trim().replace(/\\/g, "/"); - return (t.split("/").pop() || t).replace(/\.(safetensors|ckpt|pt|pth|bin|gguf|json)$/i, ""); -} -function Q(e) { - let t = Number(e); - return Number.isFinite(t) ? Math.abs(t - Math.round(t)) < 1e-9 ? String(Math.round(t)) : t.toFixed(2).replace(/0+$/g, "").replace(/\.$/, "") : String(e ?? "").trim(); -} -function $(e) { - if (!e) return ""; - if (typeof e == "string") return Z(e); - let t = Z(e.name || e.lora_name || ""); - if (!t) return ""; - let n = e.weight ?? e.strength ?? null, r = e.strength_model ?? null, i = e.strength_clip ?? null; - if (r !== null || i !== null) { - let e = []; - return r != null && e.push(`m=${Q(r)}`), i != null && e.push(`c=${Q(i)}`), e.length ? `${t} (${e.join(", ")})` : t; - } - return n == null ? t : `${t} (${Q(n)})`; -} -function ee(e) { - let t = String(e || "").trim().toLowerCase(); - return t ? t === "img2vid" ? "Image-to-Video" : t === "txt2vid" ? "Text-to-Video" : t === "img2img" ? "Image-to-Image" : t === "txt2img" ? "Text-to-Image" : t === "vid2vid" ? "Video-to-Video" : t === "tts" ? "Text-to-Speech" : t === "audio" ? "Audio" : t.split(/[_\s-]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ") : ""; -} -function te(e) { - let t = String(e || "").trim().toLowerCase(); - if (!t || t === "api") return ""; - let n = { - happy_horse: "Happy Horse", - google_gemini: "Google Gemini", - google_veo: "Google Veo", - openai: "OpenAI", - anthropic: "Anthropic", - black_forest_labs: "Black Forest Labs", - stability_ai: "Stability AI", - alibaba_wan: "Alibaba Wan", - kling_ai: "Kling AI", - luma_dream_machine: "Luma Dream Machine", - minimax_hailuo: "MiniMax Hailuo", - xai_grok: "xAI Grok", - ltxv_api: "LTXV API", - eleven_labs: "ElevenLabs", - bytedance_seedance: "ByteDance Seedance" - }; - return n[t] ? n[t] : t.split(/[_\s-]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" "); -} -function ne(e) { - let t = e?.engine && typeof e.engine == "object" ? e.engine : null, n = String(t?.type || "").trim(), r = String(t?.sampler_mode || "").trim().toLowerCase(), i = ee(n) || n, a = te(t?.api_provider), o = r === "api" ? `API ${i || "Workflow"}` : i; - return { - workflowType: n, - workflowLabel: String(o || n).trim(), - workflowBadge: a - }; -} -export { X as a, R as i, $ as n, Y as o, Z as r, ne as t }; diff --git a/dist/chunks/i18n.generated-DqByySOH.js b/dist/chunks/i18n.generated-CezSPtOB.js similarity index 98% rename from dist/chunks/i18n.generated-DqByySOH.js rename to dist/chunks/i18n.generated-CezSPtOB.js index fc6655dd..44792ea6 100644 --- a/dist/chunks/i18n.generated-DqByySOH.js +++ b/dist/chunks/i18n.generated-CezSPtOB.js @@ -27,8 +27,6 @@ var e = { "setting.nav.infinite.desc": "滚动时自动加载更多文件。", "setting.grid.pagesize.name": "主要:网格页面大小", "setting.grid.pagesize.desc": "网格中每页/请求加载的资源数量。", - "setting.viewer.pan.name": "主要:平移而不缩放", - "setting.viewer.pan.desc": "即使在缩放级别 1 下也允许平移图像。", "setting.minimap.enabled.name": "主要:启用小地图", "setting.minimap.enabled.desc": "工作流程小地图的全局激活。", "setting.scan.startup.name": "主要:启动时自动扫描", @@ -184,10 +182,8 @@ var e = { "msg.errorLoading": "加载错误", "msg.errorLoadingFolders": "加载文件夹时出错", "msg.noGenerationData": "找不到该文件的生成数据。", - "msg.rawMetadata": "原始元数据", "viewer.genInfo": "一代信息", "viewer.workflow": "工作流程", - "viewer.metadata": "元数据", "viewer.noWorkflow": "无工作流程数据", "viewer.noMetadata": "没有可用的元数据", "viewer.copySuccess": "已复制到剪贴板!", @@ -337,8 +333,6 @@ var e = { "setting.nav.infinite.desc": "スクロール時にさらに多くのファイルを自動的にロードします。", "setting.grid.pagesize.name": "メジャー: グリッド ページ サイズ", "setting.grid.pagesize.desc": "グリッド内のページ/リクエストごとにロードされるアセットの数。", - "setting.viewer.pan.name": "メジャー: ズームなしのパン", - "setting.viewer.pan.desc": "ズーム レベル 1 であっても画像のパンを許可します。", "setting.minimap.enabled.name": "メジャー: ミニマップを有効にする", "setting.minimap.enabled.desc": "ワークフロー ミニマップのグローバルなアクティブ化。", "setting.scan.startup.name": "メジャー: 起動時に自動スキャン", @@ -494,10 +488,8 @@ var e = { "msg.errorLoading": "読み込みエラー", "msg.errorLoadingFolders": "フォルダーの読み込みエラー", "msg.noGenerationData": "このファイルの世代データは見つかりませんでした。", - "msg.rawMetadata": "生のメタデータ", "viewer.genInfo": "世代情報", "viewer.workflow": "ワークフロー", - "viewer.metadata": "メタデータ", "viewer.noWorkflow": "ワークフローデータがありません", "viewer.noMetadata": "利用可能なメタデータがありません", "viewer.copySuccess": "クリップボードにコピーされました!", @@ -647,8 +639,6 @@ var e = { "setting.nav.infinite.desc": "스크롤할 때 자동으로 더 많은 파일을 로드합니다.", "setting.grid.pagesize.name": "전공: 그리드 페이지 크기", "setting.grid.pagesize.desc": "그리드의 페이지/요청당 로드된 자산 수입니다.", - "setting.viewer.pan.name": "전공: 확대/축소 없이 이동", - "setting.viewer.pan.desc": "확대/축소 수준 1에서도 이미지 패닝을 허용합니다.", "setting.minimap.enabled.name": "주요: 미니맵 활성화", "setting.minimap.enabled.desc": "작업흐름 미니맵의 전역 활성화.", "setting.scan.startup.name": "주요: 시작 시 자동 스캔", @@ -804,10 +794,8 @@ var e = { "msg.errorLoading": "로드 중 오류 발생", "msg.errorLoadingFolders": "폴더를 로드하는 중에 오류가 발생했습니다.", "msg.noGenerationData": "이 파일에 대한 생성 데이터가 없습니다.", - "msg.rawMetadata": "원시 메타데이터", "viewer.genInfo": "세대 정보", "viewer.workflow": "작업흐름", - "viewer.metadata": "메타데이터", "viewer.noWorkflow": "워크플로 데이터 없음", "viewer.noMetadata": "사용 가능한 메타데이터가 없습니다.", "viewer.copySuccess": "클립보드에 복사되었습니다!", @@ -957,8 +945,6 @@ var e = { "setting.nav.infinite.desc": "स्क्रॉल करते समय स्वचालित रूप से अधिक फ़ाइलें लोड करें।", "setting.grid.pagesize.name": "प्रमुख: ग्रिड पृष्ठ का आकार", "setting.grid.pagesize.desc": "ग्रिड में प्रति पृष्ठ/अनुरोध पर लोड की गई संपत्तियों की संख्या।", - "setting.viewer.pan.name": "मेजर: ज़ूम के बिना पैन", - "setting.viewer.pan.desc": "ज़ूम स्तर 1 पर भी छवि को पैन करने की अनुमति दें।", "setting.minimap.enabled.name": "मेजर: मिनिमैप सक्षम करें", "setting.minimap.enabled.desc": "वर्कफ़्लो मिनिमैप का वैश्विक सक्रियण।", "setting.scan.startup.name": "प्रमुख: स्टार्टअप पर ऑटो-स्कैन", @@ -1114,10 +1100,8 @@ var e = { "msg.errorLoading": "लोड होने मे त्रुटि", "msg.errorLoadingFolders": "फ़ोल्डर लोड करने में त्रुटि", "msg.noGenerationData": "इस फ़ाइल के लिए कोई पीढ़ी डेटा नहीं मिला.", - "msg.rawMetadata": "कच्चा मेटाडेटा", "viewer.genInfo": "पीढ़ी की जानकारी", "viewer.workflow": "कार्यप्रवाह", - "viewer.metadata": "मेटाडाटा", "viewer.noWorkflow": "कोई वर्कफ़्लो डेटा नहीं", "viewer.noMetadata": "कोई मेटाडेटा उपलब्ध नहीं है", "viewer.copySuccess": "क्लिपबोर्ड पर कॉपी किया गया!", @@ -1267,8 +1251,6 @@ var e = { "setting.nav.infinite.desc": "Carregue automaticamente mais arquivos ao rolar.", "setting.grid.pagesize.name": "Principal: Tamanho da página da grade", "setting.grid.pagesize.desc": "Número de ativos carregados por página/solicitação na grade.", - "setting.viewer.pan.name": "Principal: panorâmica sem zoom", - "setting.viewer.pan.desc": "Permitir deslocar a imagem mesmo no nível de zoom 1.", "setting.minimap.enabled.name": "Principal: Habilitar Minimapa", "setting.minimap.enabled.desc": "Ativação global do minimapa do fluxo de trabalho.", "setting.scan.startup.name": "Principal: Verificação automática na inicialização", @@ -1424,10 +1406,8 @@ var e = { "msg.errorLoading": "Erro ao carregar", "msg.errorLoadingFolders": "Erro ao carregar pastas", "msg.noGenerationData": "Nenhum dado de geração encontrado para este arquivo.", - "msg.rawMetadata": "Metadados brutos", "viewer.genInfo": "Informações de geração", "viewer.workflow": "Fluxo de trabalho", - "viewer.metadata": "Metadados", "viewer.noWorkflow": "Nenhum dado de fluxo de trabalho", "viewer.noMetadata": "Nenhum metadado disponível", "viewer.copySuccess": "Copiado para a área de transferência!", @@ -1577,8 +1557,6 @@ var e = { "setting.nav.infinite.desc": "Cargue automáticamente más archivos al desplazarse.", "setting.grid.pagesize.name": "Mayor: Tamaño de página de cuadrícula", "setting.grid.pagesize.desc": "Número de recursos cargados por página/solicitud en la cuadrícula.", - "setting.viewer.pan.name": "Mayor: panorámica sin zoom", - "setting.viewer.pan.desc": "Permita desplazar la imagen incluso en el nivel de zoom 1.", "setting.minimap.enabled.name": "Mayor: habilitar minimapa", "setting.minimap.enabled.desc": "Activación global del minimapa del flujo de trabajo.", "setting.scan.startup.name": "Majoor: Escaneo automático al iniciar", @@ -1734,10 +1712,8 @@ var e = { "msg.errorLoading": "Error al cargar", "msg.errorLoadingFolders": "Error al cargar carpetas", "msg.noGenerationData": "No se encontraron datos de generación para este archivo.", - "msg.rawMetadata": "Metadatos sin procesar", "viewer.genInfo": "Información de generación", "viewer.workflow": "Flujo de trabajo", - "viewer.metadata": "Metadatos", "viewer.noWorkflow": "Sin datos de flujo de trabajo", "viewer.noMetadata": "No hay metadatos disponibles", "viewer.copySuccess": "¡Copiado al portapapeles!", @@ -1887,8 +1863,6 @@ var e = { "setting.nav.infinite.desc": "Автоматически загружать больше файлов при прокрутке.", "setting.grid.pagesize.name": "Основное: Размер страницы сетки", "setting.grid.pagesize.desc": "Количество ресурсов, загруженных на страницу/запрос в сетке.", - "setting.viewer.pan.name": "Мажор: Панорамирование без масштабирования", - "setting.viewer.pan.desc": "Разрешить панорамирование изображения даже при уровне масштабирования 1.", "setting.minimap.enabled.name": "Майор: включить миникарту", "setting.minimap.enabled.desc": "Глобальная активация миникарты рабочего процесса.", "setting.scan.startup.name": "Основное: автоматическое сканирование при запуске.", @@ -2044,10 +2018,8 @@ var e = { "msg.errorLoading": "Ошибка загрузки", "msg.errorLoadingFolders": "Ошибка загрузки папок.", "msg.noGenerationData": "Для этого файла не найдены данные о создании.", - "msg.rawMetadata": "Необработанные метаданные", "viewer.genInfo": "Информация о поколении", "viewer.workflow": "Рабочий процесс", - "viewer.metadata": "Метаданные", "viewer.noWorkflow": "Нет данных о рабочем процессе", "viewer.noMetadata": "Нет доступных метаданных", "viewer.copySuccess": "Скопировано в буфер обмена!", diff --git a/dist/chunks/mjr-primevue-BRqtdXzb.js b/dist/chunks/mjr-primevue-C07IsEdU.js similarity index 79% rename from dist/chunks/mjr-primevue-BRqtdXzb.js rename to dist/chunks/mjr-primevue-C07IsEdU.js index 40ffeb51..15a4b91e 100644 --- a/dist/chunks/mjr-primevue-BRqtdXzb.js +++ b/dist/chunks/mjr-primevue-C07IsEdU.js @@ -11,74 +11,74 @@ var t = {}, n = [], r = () => {}, i = () => !1, a = (e) => e.charCodeAt(0) === 1 }, l = Object.prototype.hasOwnProperty, u = (e, t) => l.call(e, t), d = Array.isArray, f = (e) => x(e) === "[object Map]", p = (e) => x(e) === "[object Set]", m = (e) => x(e) === "[object Date]", h = (e) => typeof e == "function", g = (e) => typeof e == "string", _ = (e) => typeof e == "symbol", v = (e) => typeof e == "object" && !!e, y = (e) => (v(e) || h(e)) && h(e.then) && h(e.catch), b = Object.prototype.toString, x = (e) => b.call(e), S = (e) => x(e).slice(8, -1), C = (e) => x(e) === "[object Object]", w = (e) => g(e) && e !== "NaN" && e[0] !== "-" && "" + parseInt(e, 10) === e, ee = /* @__PURE__ */ e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"), te = (e) => { let t = /* @__PURE__ */ Object.create(null); return ((n) => t[n] || (t[n] = e(n))); -}, ne = /-\w/g, T = te((e) => e.replace(ne, (e) => e.slice(1).toUpperCase())), re = /\B([A-Z])/g, E = te((e) => e.replace(re, "-$1").toLowerCase()), ie = te((e) => e.charAt(0).toUpperCase() + e.slice(1)), ae = te((e) => e ? `on${ie(e)}` : ""), oe = (e, t) => !Object.is(e, t), se = (e, ...t) => { +}, ne = /-\w/g, T = te((e) => e.replace(ne, (e) => e.slice(1).toUpperCase())), re = /\B([A-Z])/g, E = te((e) => e.replace(re, "-$1").toLowerCase()), ie = te((e) => e.charAt(0).toUpperCase() + e.slice(1)), ae = te((e) => e ? `on${ie(e)}` : ""), D = (e, t) => !Object.is(e, t), oe = (e, ...t) => { for (let n = 0; n < e.length; n++) e[n](...t); -}, ce = (e, t, n, r = !1) => { +}, se = (e, t, n, r = !1) => { Object.defineProperty(e, t, { configurable: !0, enumerable: !1, writable: r, value: n }); -}, le = (e) => { +}, ce = (e) => { let t = parseFloat(e); return isNaN(t) ? e : t; -}, ue = (e) => { +}, le = (e) => { let t = g(e) ? Number(e) : NaN; return isNaN(t) ? e : t; -}, de, fe = () => de ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}; -function pe(e) { +}, ue, de = () => ue ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}; +function fe(e) { if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) { - let r = e[n], i = g(r) ? _e(r) : pe(r); + let r = e[n], i = g(r) ? ge(r) : fe(r); if (i) for (let e in i) t[e] = i[e]; } return t; } if (g(e) || v(e)) return e; } -var me = /;(?![^(]*\))/g, he = /:([^]+)/, ge = /"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g; -function _e(e) { +var pe = /;(?![^(]*\))/g, me = /:([^]+)/, he = /"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g; +function ge(e) { let t = {}; - return e.replace(ge, (e) => e.startsWith("/*") ? "" : e).split(me).forEach((e) => { + return e.replace(he, (e) => e.startsWith("/*") ? "" : e).split(pe).forEach((e) => { if (e) { - let n = e.split(he); + let n = e.split(me); n.length > 1 && (t[n[0].trim()] = n[1].trim()); } }), t; } -function D(e) { +function O(e) { let t = ""; if (g(e)) t = e; else if (d(e)) for (let n = 0; n < e.length; n++) { - let r = D(e[n]); + let r = O(e[n]); r && (t += r + " "); } else if (v(e)) for (let n in e) e[n] && (t += n + " "); return t.trim(); } -function ve(e) { +function _e(e) { if (!e) return null; let { class: t, style: n } = e; - return t && !g(t) && (e.class = D(t)), n && (e.style = pe(n)), e; + return t && !g(t) && (e.class = O(t)), n && (e.style = fe(n)), e; } -var ye = /* @__PURE__ */ e("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly"); -function be(e) { +var ve = /* @__PURE__ */ e("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,playsinline,readonly"); +function ye(e) { return !!e || e === ""; } -function xe(e, t, n) { +function be(e, t, n) { if (e.length !== t.length) return !1; let r = !0; - for (let i = 0; r && i < e.length; i++) r = Te(e[i], t[i], n); + for (let i = 0; r && i < e.length; i++) r = we(e[i], t[i], n); return r; } -function Se(e, t, n) { +function xe(e, t, n) { if (e.size !== t.size) return !1; let r = Array.from(t), i = new Uint8Array(r.length); for (let t of e) { let e = -1; - for (let a = 0; a < r.length; a++) if (!i[a] && Te(t, r[a], n)) { + for (let a = 0; a < r.length; a++) if (!i[a] && we(t, r[a], n)) { e = a; break; } @@ -87,17 +87,17 @@ function Se(e, t, n) { } return !0; } -function Ce(e, t, n) { +function Se(e, t, n) { let r = f(e), i = f(t); - if (r || i || (r = p(e), i = p(t), r || i)) return r && i ? Se(e, t, n) : !1; + if (r || i || (r = p(e), i = p(t), r || i)) return r && i ? xe(e, t, n) : !1; if (Object.keys(e).length !== Object.keys(t).length) return !1; for (let r in e) { let i = e.hasOwnProperty(r), a = t.hasOwnProperty(r); - if (i && !a || !i && a || !Te(e[r], t[r], n)) return !1; + if (i && !a || !i && a || !we(e[r], t[r], n)) return !1; } return String(e) === String(t); } -function we(e, t, n, r) { +function Ce(e, t, n, r) { n ||= [/* @__PURE__ */ new Map(), /* @__PURE__ */ new Map()]; let [i, a] = n; if (i.has(e) || a.has(t)) return i.get(e) === t && a.get(t) === e; @@ -105,17 +105,17 @@ function we(e, t, n, r) { let o = r(e, t, n); return i.delete(e), a.delete(t), o; } -function Te(e, t, n) { +function we(e, t, n) { if (e === t) return !0; let r = m(e), i = m(t); - return r || i ? r && i ? e.getTime() === t.getTime() : !1 : (r = _(e), i = _(t), r || i ? e === t : (r = d(e), i = d(t), r || i ? r && i ? we(e, t, n, xe) : !1 : (r = v(e), i = v(t), r || i ? !r || !i ? !1 : we(e, t, n, Ce) : String(e) === String(t)))); + return r || i ? r && i ? e.getTime() === t.getTime() : !1 : (r = _(e), i = _(t), r || i ? e === t : (r = d(e), i = d(t), r || i ? r && i ? Ce(e, t, n, be) : !1 : (r = v(e), i = v(t), r || i ? !r || !i ? !1 : Ce(e, t, n, Se) : String(e) === String(t)))); } -function Ee(e, t) { - return e.findIndex((e) => Te(e, t)); +function Te(e, t) { + return e.findIndex((e) => we(e, t)); } -var De = (e) => !!(e && e.__v_isRef === !0), O = (e) => g(e) ? e : e == null ? "" : d(e) || v(e) && (e.toString === b || !h(e.toString)) ? De(e) ? O(e.value) : JSON.stringify(e, Oe, 2) : String(e), Oe = (e, t) => De(t) ? Oe(e, t.value) : f(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[ke(t, r) + " =>"] = n, e), {}) } : p(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => ke(e)) } : _(t) ? ke(t) : v(t) && !d(t) && !C(t) ? String(t) : t, ke = (e, t = "") => _(e) ? `Symbol(${e.description ?? t})` : e, k, Ae = class { +var Ee = (e) => !!(e && e.__v_isRef === !0), k = (e) => g(e) ? e : e == null ? "" : d(e) || v(e) && (e.toString === b || !h(e.toString)) ? Ee(e) ? k(e.value) : JSON.stringify(e, De, 2) : String(e), De = (e, t) => Ee(t) ? De(e, t.value) : f(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[Oe(t, r) + " =>"] = n, e), {}) } : p(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => Oe(e)) } : _(t) ? Oe(t) : v(t) && !d(t) && !C(t) ? String(t) : t, Oe = (e, t = "") => _(e) ? `Symbol(${e.description ?? t})` : e, A, ke = class { constructor(e = !1) { - this.detached = e, this._active = !0, this._on = 0, this.effects = [], this.cleanups = [], this._isPaused = !1, this._warnOnRun = !0, this.__v_skip = !0, !e && k && (k.active ? (this.parent = k, this.index = (k.scopes || (k.scopes = [])).push(this) - 1) : (this._active = !1, this._warnOnRun = !1)); + this.detached = e, this._active = !0, this._on = 0, this.effects = [], this.cleanups = [], this._isPaused = !1, this._warnOnRun = !0, this.__v_skip = !0, !e && A && (A.active ? (this.parent = A, this.index = (A.scopes || (A.scopes = [])).push(this) - 1) : (this._active = !1, this._warnOnRun = !1)); } get active() { return this._active; @@ -145,22 +145,22 @@ var De = (e) => !!(e && e.__v_isRef === !0), O = (e) => g(e) ? e : e == null ? " } run(e) { if (this._active) { - let t = k; + let t = A; try { - return k = this, e(); + return A = this, e(); } finally { - k = t; + A = t; } } } on() { - ++this._on === 1 && (this.prevScope = k, k = this); + ++this._on === 1 && (this.prevScope = A, A = this); } off() { if (this._on > 0 && --this._on === 0) { - if (k === this) k = this.prevScope; + if (A === this) A = this.prevScope; else { - let e = k; + let e = A; for (; e;) { if (e.prevScope === this) { e.prevScope = this.prevScope; @@ -191,74 +191,74 @@ var De = (e) => !!(e && e.__v_isRef === !0), O = (e) => g(e) ? e : e == null ? " } } }; -function je(e) { - return new Ae(e); +function Ae(e) { + return new ke(e); } -function Me() { - return k; +function je() { + return A; } -function Ne(e, t = !1) { - k && k.cleanups.push(e); +function Me(e, t = !1) { + A && A.cleanups.push(e); } -var A, Pe = /* @__PURE__ */ new WeakSet(), Fe = class { +var j, Ne = /* @__PURE__ */ new WeakSet(), Pe = class { constructor(e) { - this.fn = e, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0, k && (k.active ? k.effects.push(this) : this.flags &= -2); + this.fn = e, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0, A && (A.active ? A.effects.push(this) : this.flags &= -2); } pause() { this.flags |= 64; } resume() { - this.flags & 64 && (this.flags &= -65, Pe.has(this) && (Pe.delete(this), this.trigger())); + this.flags & 64 && (this.flags &= -65, Ne.has(this) && (Ne.delete(this), this.trigger())); } notify() { - this.flags & 2 && !(this.flags & 32) || this.flags & 8 || ze(this); + this.flags & 2 && !(this.flags & 32) || this.flags & 8 || Re(this); } run() { if (!(this.flags & 1)) return this.fn(); - this.flags |= 2, Qe(this), He(this); - let e = A, t = Je; - A = this, Je = !0; + this.flags |= 2, Ze(this), Ve(this); + let e = j, t = qe; + j = this, qe = !0; try { return this.fn(); } finally { - Ue(this), A = e, Je = t, this.flags &= -3; + He(this), j = e, qe = t, this.flags &= -3; } } stop() { if (this.flags & 1) { - for (let e = this.deps; e; e = e.nextDep) Ke(e); - this.deps = this.depsTail = void 0, Qe(this), this.onStop && this.onStop(), this.flags &= -2; + for (let e = this.deps; e; e = e.nextDep) Ge(e); + this.deps = this.depsTail = void 0, Ze(this), this.onStop && this.onStop(), this.flags &= -2; } } trigger() { - this.flags & 64 ? Pe.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); + this.flags & 64 ? Ne.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); } runIfDirty() { - We(this) && this.run(); + Ue(this) && this.run(); } get dirty() { - return We(this); + return Ue(this); } -}, Ie = 0, Le, Re; -function ze(e, t = !1) { - e.flags |= 8, t ? (e.next = Re, Re = e) : (e.next = Le, Le = e); +}, Fe = 0, Ie, Le; +function Re(e, t = !1) { + e.flags |= 8, t ? (e.next = Le, Le = e) : (e.next = Ie, Ie = e); +} +function ze() { + Fe++; } function Be() { - Ie++; -} -function Ve() { - if (--Ie > 0) return; - if (Re) { - let e = Re; - for (Re = void 0; e;) { + if (--Fe > 0) return; + if (Le) { + let e = Le; + for (Le = void 0; e;) { let t = e.next; e.next = void 0, e.flags &= -9, e = t; } } let e; - for (; Le;) { - let t = Le; - for (Le = void 0; t;) { + for (; Ie;) { + let t = Ie; + for (Ie = void 0; t;) { let n = t.next; if (t.next = void 0, t.flags &= -9, t.flags & 1) try { t.trigger(); @@ -270,186 +270,186 @@ function Ve() { } if (e) throw e; } -function He(e) { +function Ve(e) { for (let t = e.deps; t; t = t.nextDep) t.version = -1, t.prevActiveLink = t.dep.activeLink, t.dep.activeLink = t; } -function Ue(e) { +function He(e) { let t, n = e.depsTail, r = n; for (; r;) { let e = r.prevDep; - r.version === -1 ? (r === n && (n = e), Ke(r), qe(r)) : t = r, r.dep.activeLink = r.prevActiveLink, r.prevActiveLink = void 0, r = e; + r.version === -1 ? (r === n && (n = e), Ge(r), Ke(r)) : t = r, r.dep.activeLink = r.prevActiveLink, r.prevActiveLink = void 0, r = e; } e.deps = t, e.depsTail = n; } -function We(e) { - for (let t = e.deps; t; t = t.nextDep) if (t.dep.version !== t.version || t.dep.computed && (Ge(t.dep.computed) || t.dep.version !== t.version)) return !0; +function Ue(e) { + for (let t = e.deps; t; t = t.nextDep) if (t.dep.version !== t.version || t.dep.computed && (We(t.dep.computed) || t.dep.version !== t.version)) return !0; return !!e._dirty; } -function Ge(e) { - if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === $e) || (e.globalVersion = $e, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !We(e)))) return; +function We(e) { + if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === Qe) || (e.globalVersion = Qe, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Ue(e)))) return; e.flags |= 2; - let t = e.dep, n = A, r = Je; - A = e, Je = !0; + let t = e.dep, n = j, r = qe; + j = e, qe = !0; try { - He(e); + Ve(e); let n = e.fn(e._value); - (t.version === 0 || oe(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); + (t.version === 0 || D(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); } catch (e) { throw t.version++, e; } finally { - A = n, Je = r, Ue(e), e.flags &= -3; + j = n, qe = r, He(e), e.flags &= -3; } } -function Ke(e, t = !1) { +function Ge(e, t = !1) { let { dep: n, prevSub: r, nextSub: i } = e; if (r && (r.nextSub = i, e.prevSub = void 0), i && (i.prevSub = r, e.nextSub = void 0), n.subs === e && (n.subs = r, !r && n.computed)) { n.computed.flags &= -5; - for (let e = n.computed.deps; e; e = e.nextDep) Ke(e, !0); + for (let e = n.computed.deps; e; e = e.nextDep) Ge(e, !0); } !t && !--n.sc && n.map && n.map.delete(n.key); } -function qe(e) { +function Ke(e) { let { prevDep: t, nextDep: n } = e; t && (t.nextDep = n, e.prevDep = void 0), n && (n.prevDep = t, e.nextDep = void 0); } -var Je = !0, Ye = []; +var qe = !0, Je = []; +function Ye() { + Je.push(qe), qe = !1; +} function Xe() { - Ye.push(Je), Je = !1; + let e = Je.pop(); + qe = e === void 0 || e; } -function Ze() { - let e = Ye.pop(); - Je = e === void 0 || e; -} -function Qe(e) { +function Ze(e) { let { cleanup: t } = e; if (e.cleanup = void 0, t) { - let e = A; - A = void 0; + let e = j; + j = void 0; try { t(); } finally { - A = e; + j = e; } } } -var $e = 0, et = class { +var Qe = 0, $e = class { constructor(e, t) { this.sub = e, this.dep = t, this.version = t.version, this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; } -}, tt = class { +}, et = class { constructor(e) { this.computed = e, this.version = 0, this.activeLink = void 0, this.subs = void 0, this.map = void 0, this.key = void 0, this.sc = 0, this.__v_skip = !0; } track(e) { - if (!A || !Je || A === this.computed) return; + if (!j || !qe || j === this.computed) return; let t = this.activeLink; - if (t === void 0 || t.sub !== A) t = this.activeLink = new et(A, this), A.deps ? (t.prevDep = A.depsTail, A.depsTail.nextDep = t, A.depsTail = t) : A.deps = A.depsTail = t, nt(t); + if (t === void 0 || t.sub !== j) t = this.activeLink = new $e(j, this), j.deps ? (t.prevDep = j.depsTail, j.depsTail.nextDep = t, j.depsTail = t) : j.deps = j.depsTail = t, tt(t); else if (t.version === -1 && (t.version = this.version, t.nextDep)) { let e = t.nextDep; - e.prevDep = t.prevDep, t.prevDep && (t.prevDep.nextDep = e), t.prevDep = A.depsTail, t.nextDep = void 0, A.depsTail.nextDep = t, A.depsTail = t, A.deps === t && (A.deps = e); + e.prevDep = t.prevDep, t.prevDep && (t.prevDep.nextDep = e), t.prevDep = j.depsTail, t.nextDep = void 0, j.depsTail.nextDep = t, j.depsTail = t, j.deps === t && (j.deps = e); } return t; } trigger(e) { - this.version++, $e++, this.notify(e); + this.version++, Qe++, this.notify(e); } notify(e) { - Be(); + ze(); try { for (let e = this.subs; e; e = e.prevSub) e.sub.notify() && e.sub.dep.notify(); } finally { - Ve(); + Be(); } } }; -function nt(e) { +function tt(e) { if (e.dep.sc++, e.sub.flags & 4) { let t = e.dep.computed; if (t && !e.dep.subs) { t.flags |= 20; - for (let e = t.deps; e; e = e.nextDep) nt(e); + for (let e = t.deps; e; e = e.nextDep) tt(e); } let n = e.dep.subs; n !== e && (e.prevSub = n, n && (n.nextSub = e)), e.dep.subs = e; } } -var rt = /* @__PURE__ */ new WeakMap(), it = /* @__PURE__ */ Symbol(""), at = /* @__PURE__ */ Symbol(""), ot = /* @__PURE__ */ Symbol(""); -function st(e, t, n) { - if (Je && A) { - let t = rt.get(e); - t || rt.set(e, t = /* @__PURE__ */ new Map()); +var nt = /* @__PURE__ */ new WeakMap(), rt = /* @__PURE__ */ Symbol(""), it = /* @__PURE__ */ Symbol(""), at = /* @__PURE__ */ Symbol(""); +function ot(e, t, n) { + if (qe && j) { + let t = nt.get(e); + t || nt.set(e, t = /* @__PURE__ */ new Map()); let r = t.get(n); - r || (t.set(n, r = new tt()), r.map = t, r.key = n), r.track(); + r || (t.set(n, r = new et()), r.map = t, r.key = n), r.track(); } } -function ct(e, t, n, r, i, a) { - let o = rt.get(e); +function st(e, t, n, r, i, a) { + let o = nt.get(e); if (!o) { - $e++; + Qe++; return; } let s = (e) => { e && e.trigger(); }; - if (Be(), t === "clear") o.forEach(s); + if (ze(), t === "clear") o.forEach(s); else { let i = d(e), a = i && w(n); if (i && n === "length") { let e = Number(r); o.forEach((t, n) => { - (n === "length" || n === ot || !_(n) && n >= e) && s(t); + (n === "length" || n === at || !_(n) && n >= e) && s(t); }); - } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(ot)), t) { + } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(at)), t) { case "add": - i ? a && s(o.get("length")) : (s(o.get(it)), f(e) && s(o.get(at))); + i ? a && s(o.get("length")) : (s(o.get(rt)), f(e) && s(o.get(it))); break; case "delete": - i || (s(o.get(it)), f(e) && s(o.get(at))); + i || (s(o.get(rt)), f(e) && s(o.get(it))); break; - case "set": f(e) && s(o.get(it)); + case "set": f(e) && s(o.get(rt)); } } - Ve(); + Be(); } -function lt(e, t) { - let n = rt.get(e); +function ct(e, t) { + let n = nt.get(e); return n && n.get(t); } +function lt(e) { + let t = /* @__PURE__ */ M(e); + return t === e || (ot(t, "iterate", at), /* @__PURE__ */ Yt(e)) ? t : /* @__PURE__ */ Jt(e) ? /* @__PURE__ */ qt(e) ? t.map((e) => $t(Qt(e))) : t.map($t) : t.map(Qt); +} function ut(e) { - let t = /* @__PURE__ */ j(e); - return t === e || (st(t, "iterate", ot), /* @__PURE__ */ Yt(e)) ? t : /* @__PURE__ */ Jt(e) ? /* @__PURE__ */ qt(e) ? t.map((e) => $t(Qt(e))) : t.map($t) : t.map(Qt); + return ot(e = /* @__PURE__ */ M(e), "iterate", at), e; } -function dt(e) { - return st(e = /* @__PURE__ */ j(e), "iterate", ot), e; -} -function ft(e, t) { +function dt(e, t) { return /* @__PURE__ */ Jt(e) ? $t(/* @__PURE__ */ qt(e) ? Qt(t) : t) : Qt(t); } -var pt = { +var ft = { __proto__: null, [Symbol.iterator]() { - return mt(this, Symbol.iterator, (e) => ft(this, e)); + return pt(this, Symbol.iterator, (e) => dt(this, e)); }, concat(...e) { - return ut(this).concat(...e.map((e) => d(e) ? ut(e) : e)); + return lt(this).concat(...e.map((e) => d(e) ? lt(e) : e)); }, entries() { - return mt(this, "entries", (e) => (e[1] = ft(this, e[1]), e)); + return pt(this, "entries", (e) => (e[1] = dt(this, e[1]), e)); }, every(e, t) { return gt(this, "every", e, t, void 0, arguments); }, filter(e, t) { - return gt(this, "filter", e, t, (e) => e.map((e) => ft(this, e)), arguments); + return gt(this, "filter", e, t, (e) => e.map((e) => dt(this, e)), arguments); }, find(e, t) { - return gt(this, "find", e, t, (e) => ft(this, e), arguments); + return gt(this, "find", e, t, (e) => dt(this, e), arguments); }, findIndex(e, t) { return gt(this, "findIndex", e, t, void 0, arguments); }, findLast(e, t) { - return gt(this, "findLast", e, t, (e) => ft(this, e), arguments); + return gt(this, "findLast", e, t, (e) => dt(this, e), arguments); }, findLastIndex(e, t) { return gt(this, "findLastIndex", e, t, void 0, arguments); @@ -464,7 +464,7 @@ var pt = { return vt(this, "indexOf", e); }, join(e) { - return ut(this).join(e); + return lt(this).join(e); }, lastIndexOf(...e) { return vt(this, "lastIndexOf", e); @@ -494,38 +494,54 @@ var pt = { return yt(this, "splice", e); }, toReversed() { - return ut(this).toReversed(); + return lt(this).toReversed(); }, toSorted(e) { - return ut(this).toSorted(e); + return lt(this).toSorted(e); }, toSpliced(...e) { - return ut(this).toSpliced(...e); + return lt(this).toSpliced(...e); }, unshift(...e) { return yt(this, "unshift", e); }, values() { - return mt(this, "values", (e) => ft(this, e)); + return pt(this, "values", (e) => dt(this, e)); } }; -function mt(e, t, n) { - let r = dt(e), i = r[t](); - return r !== e && !/* @__PURE__ */ Yt(e) && (i._next = i.next, i.next = () => { - let e = i._next(); - return e.done || (e.value = n(e.value)), e; - }), i; +function pt(e, t, n) { + let r = ut(e), i = r[t], a = i.call(r); + if (r !== e && !/* @__PURE__ */ Yt(e)) { + if (a[Symbol.toStringTag] === "Array Iterator") { + let e = Object.create(Object.getPrototypeOf(a)); + return e.next = () => mt(a.next(), n), i !== ht[t] && Object.defineProperties(e, { + return: { get() { + let e = a.return; + return typeof e == "function" ? e.bind(a) : e; + } }, + throw: { get() { + let e = a.throw; + return typeof e == "function" ? e.bind(a) : e; + } } + }), e; + } + a._next = a.next, a.next = () => mt(a._next(), n); + } + return a; +} +function mt(e, t) { + return e.done || (e.value = t(e.value)), e; } var ht = Array.prototype; function gt(e, t, n, r, i, a) { - let o = dt(e), s = o !== e && !/* @__PURE__ */ Yt(e), c = o[t]; + let o = ut(e), s = o !== e && !/* @__PURE__ */ Yt(e), c = o[t]; if (c !== ht[t]) { let t = c.apply(e, a); return s ? Qt(t) : t; } let l = n; o !== e && (s ? l = function(t, r) { - return n.call(this, ft(e, t), r, e); + return n.call(this, dt(e, t), r, e); } : n.length > 2 && (l = function(t, r) { return n.call(this, t, r, e); })); @@ -533,31 +549,31 @@ function gt(e, t, n, r, i, a) { return s && i ? i(u) : u; } function _t(e, t, n, r) { - let i = dt(e), a = i !== e && !/* @__PURE__ */ Yt(e), o = n, s = !1; + let i = ut(e), a = i !== e && !/* @__PURE__ */ Yt(e), o = n, s = !1; i !== e && (a ? (s = r.length === 0, o = function(t, r, i) { - return s && (s = !1, t = ft(e, t)), n.call(this, t, ft(e, r), i, e); + return s && (s = !1, t = dt(e, t)), n.call(this, t, dt(e, r), i, e); }) : n.length > 3 && (o = function(t, r, i) { return n.call(this, t, r, i, e); })); let c = i[t](o, ...r); - return s ? ft(e, c) : c; + return s ? dt(e, c) : c; } function vt(e, t, n) { - let r = /* @__PURE__ */ j(e); - st(r, "iterate", ot); + let r = /* @__PURE__ */ M(e); + ot(r, "iterate", at); let i = r[t](...n); - return (i === -1 || i === !1) && /* @__PURE__ */ Xt(n[0]) ? (n[0] = /* @__PURE__ */ j(n[0]), r[t](...n)) : i; + return (i === -1 || i === !1) && /* @__PURE__ */ Xt(n[0]) ? (n[0] = /* @__PURE__ */ M(n[0]), r[t](...n)) : i; } function yt(e, t, n = []) { - Xe(), Be(); - let r = (/* @__PURE__ */ j(e))[t].apply(e, n); - return Ve(), Ze(), r; + Ye(), ze(); + let r = (/* @__PURE__ */ M(e))[t].apply(e, n); + return Be(), Xe(), r; } var bt = /* @__PURE__ */ e("__proto__,__v_isRef,__isVue"), xt = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(_)); function St(e) { _(e) || (e = String(e)); - let t = /* @__PURE__ */ j(this); - return st(t, "has", e), t.hasOwnProperty(e); + let t = /* @__PURE__ */ M(this); + return ot(t, "has", e), t.hasOwnProperty(e); } var Ct = class { constructor(e = !1, t = !1) { @@ -573,12 +589,12 @@ var Ct = class { let a = d(e); if (!r) { let e; - if (a && (e = pt[t])) return e; + if (a && (e = ft[t])) return e; if (t === "hasOwnProperty") return St; } - let o = Reflect.get(e, t, /* @__PURE__ */ M(e) ? e : n); - if ((_(t) ? xt.has(t) : bt(t)) || (r || st(e, "get", t), i)) return o; - if (/* @__PURE__ */ M(o)) { + let o = Reflect.get(e, t, /* @__PURE__ */ N(e) ? e : n); + if ((_(t) ? xt.has(t) : bt(t)) || (r || ot(e, "get", t), i)) return o; + if (/* @__PURE__ */ N(o)) { let e = a && w(t) ? o : o.value; return r && v(e) ? /* @__PURE__ */ Gt(e) : e; } @@ -592,21 +608,21 @@ var Ct = class { let i = e[t], a = d(e) && w(t); if (!this._isShallow) { let e = /* @__PURE__ */ Jt(i); - if (!/* @__PURE__ */ Yt(n) && !/* @__PURE__ */ Jt(n) && (i = /* @__PURE__ */ j(i), n = /* @__PURE__ */ j(n)), !a && /* @__PURE__ */ M(i) && !/* @__PURE__ */ M(n)) return e || (i.value = n), !0; + if (!/* @__PURE__ */ Yt(n) && !/* @__PURE__ */ Jt(n) && (i = /* @__PURE__ */ M(i), n = /* @__PURE__ */ M(n)), !a && /* @__PURE__ */ N(i) && !/* @__PURE__ */ N(n)) return e || (i.value = n), !0; } - let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ M(e) ? e : r); - return e === /* @__PURE__ */ j(r) && s && (o ? oe(n, i) && ct(e, "set", t, n, i) : ct(e, "add", t, n)), s; + let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ N(e) ? e : r); + return e === /* @__PURE__ */ M(r) && s && (o ? D(n, i) && st(e, "set", t, n, i) : st(e, "add", t, n)), s; } deleteProperty(e, t) { let n = u(e, t), r = e[t], i = Reflect.deleteProperty(e, t); - return i && n && ct(e, "delete", t, void 0, r), i; + return i && n && st(e, "delete", t, void 0, r), i; } has(e, t) { let n = Reflect.has(e, t); - return _(t) && xt.has(t) || st(e, "has", t), n; + return _(t) && xt.has(t) || ot(e, "has", t), n; } ownKeys(e) { - return st(e, "iterate", d(e) ? "length" : it), Reflect.ownKeys(e); + return ot(e, "iterate", d(e) ? "length" : rt), Reflect.ownKeys(e); } }, Tt = class extends Ct { constructor(e = !1) { @@ -621,8 +637,8 @@ var Ct = class { }, Et = /* @__PURE__ */ new wt(), Dt = /* @__PURE__ */ new Tt(), Ot = /* @__PURE__ */ new wt(!0), kt = (e) => e, At = (e) => Reflect.getPrototypeOf(e); function jt(e, t, n) { return function(...r) { - let i = this.__v_raw, a = /* @__PURE__ */ j(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? kt : t ? $t : Qt; - return !t && st(a, "iterate", l ? at : it), s(Object.create(u), { next() { + let i = this.__v_raw, a = /* @__PURE__ */ M(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? kt : t ? $t : Qt; + return !t && ot(a, "iterate", l ? it : rt), s(Object.create(u), { next() { let { value: e, done: t } = u.next(); return t ? { value: e, @@ -642,8 +658,8 @@ function Mt(e) { function Nt(e, t) { let n = { get(n) { - let r = this.__v_raw, i = /* @__PURE__ */ j(r), a = /* @__PURE__ */ j(n); - e || (oe(n, a) && st(i, "get", n), st(i, "get", a)); + let r = this.__v_raw, i = /* @__PURE__ */ M(r), a = /* @__PURE__ */ M(n); + e || (D(n, a) && ot(i, "get", n), ot(i, "get", a)); let { has: o } = At(i), s = t ? kt : e ? $t : Qt; if (o.call(i, n)) return s(r.get(n)); if (o.call(i, a)) return s(r.get(a)); @@ -651,15 +667,15 @@ function Nt(e, t) { }, get size() { let t = this.__v_raw; - return !e && st(/* @__PURE__ */ j(t), "iterate", it), t.size; + return !e && ot(/* @__PURE__ */ M(t), "iterate", rt), t.size; }, has(t) { - let n = this.__v_raw, r = /* @__PURE__ */ j(n), i = /* @__PURE__ */ j(t); - return e || (oe(t, i) && st(r, "has", t), st(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); + let n = this.__v_raw, r = /* @__PURE__ */ M(n), i = /* @__PURE__ */ M(t); + return e || (D(t, i) && ot(r, "has", t), ot(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); }, forEach(n, r) { - let i = this, a = i.__v_raw, o = /* @__PURE__ */ j(a), s = t ? kt : e ? $t : Qt; - return !e && st(o, "iterate", it), a.forEach((e, t) => n.call(r, s(e), s(t), i)); + let i = this, a = i.__v_raw, o = /* @__PURE__ */ M(a), s = t ? kt : e ? $t : Qt; + return !e && ot(o, "iterate", rt), a.forEach((e, t) => n.call(r, s(e), s(t), i)); } }; return s(n, e ? { @@ -669,25 +685,25 @@ function Nt(e, t) { clear: Mt("clear") } : { add(e) { - let n = /* @__PURE__ */ j(this), r = At(n), i = /* @__PURE__ */ j(e), a = !t && !/* @__PURE__ */ Yt(e) && !/* @__PURE__ */ Jt(e) ? i : e; - return r.has.call(n, a) || oe(e, a) && r.has.call(n, e) || oe(i, a) && r.has.call(n, i) || (n.add(a), ct(n, "add", a, a)), this; + let n = /* @__PURE__ */ M(this), r = At(n), i = /* @__PURE__ */ M(e), a = !t && !/* @__PURE__ */ Yt(e) && !/* @__PURE__ */ Jt(e) ? i : e; + return r.has.call(n, a) || D(e, a) && r.has.call(n, e) || D(i, a) && r.has.call(n, i) || (n.add(a), st(n, "add", a, a)), this; }, set(e, n) { - t || /* @__PURE__ */ Yt(n) || /* @__PURE__ */ Jt(n) || (n = /* @__PURE__ */ j(n)); - let r = /* @__PURE__ */ j(this), { has: i, get: a } = At(r), o = i.call(r, e); - o ||= (e = /* @__PURE__ */ j(e), i.call(r, e)); + t || /* @__PURE__ */ Yt(n) || /* @__PURE__ */ Jt(n) || (n = /* @__PURE__ */ M(n)); + let r = /* @__PURE__ */ M(this), { has: i, get: a } = At(r), o = i.call(r, e); + o ||= (e = /* @__PURE__ */ M(e), i.call(r, e)); let s = a.call(r, e); - return r.set(e, n), o ? oe(n, s) && ct(r, "set", e, n, s) : ct(r, "add", e, n), this; + return r.set(e, n), o ? D(n, s) && st(r, "set", e, n, s) : st(r, "add", e, n), this; }, delete(e) { - let t = /* @__PURE__ */ j(this), { has: n, get: r } = At(t), i = n.call(t, e); - i ||= (e = /* @__PURE__ */ j(e), n.call(t, e)); + let t = /* @__PURE__ */ M(this), { has: n, get: r } = At(t), i = n.call(t, e); + i ||= (e = /* @__PURE__ */ M(e), n.call(t, e)); let a = r ? r.call(t, e) : void 0, o = t.delete(e); - return i && ct(t, "delete", e, void 0, a), o; + return i && st(t, "delete", e, void 0, a), o; }, clear() { - let e = /* @__PURE__ */ j(this), t = e.size !== 0, n = e.clear(); - return t && ct(e, "clear", void 0, void 0, void 0), n; + let e = /* @__PURE__ */ M(this), t = e.size !== 0, n = e.clear(); + return t && st(e, "clear", void 0, void 0, void 0), n; } }), [ "keys", @@ -700,7 +716,7 @@ function Nt(e, t) { } function Pt(e, t) { let n = Nt(e, t); - return (t, r, i) => r === "__v_isReactive" ? !e : r === "__v_isReadonly" ? e : r === "__v_raw" ? t : Reflect.get(u(n, r) && r in t ? n : t, r, i); + return (r, i, a) => i === "__v_isReactive" ? !e : i === "__v_isReadonly" ? e : i === "__v_isShallow" ? t : i === "__v_raw" ? r : Reflect.get(u(n, i) && i in r ? n : r, i, a); } var Ft = { get: /* @__PURE__ */ Pt(!1, !1) }, It = { get: /* @__PURE__ */ Pt(!1, !0) }, Lt = { get: /* @__PURE__ */ Pt(!0, !1) }, Rt = /* @__PURE__ */ new WeakMap(), zt = /* @__PURE__ */ new WeakMap(), Bt = /* @__PURE__ */ new WeakMap(), Vt = /* @__PURE__ */ new WeakMap(); function Ht(e) { @@ -752,16 +768,16 @@ function Xt(e) { return e ? !!e.__v_raw : !1; } // @__NO_SIDE_EFFECTS__ -function j(e) { +function M(e) { let t = e && e.__v_raw; - return t ? /* @__PURE__ */ j(t) : e; + return t ? /* @__PURE__ */ M(t) : e; } function Zt(e) { - return !u(e, "__v_skip") && Object.isExtensible(e) && ce(e, "__v_skip", !0), e; + return !u(e, "__v_skip") && Object.isExtensible(e) && se(e, "__v_skip", !0), e; } var Qt = (e) => v(e) ? /* @__PURE__ */ Ut(e) : e, $t = (e) => v(e) ? /* @__PURE__ */ Gt(e) : e; // @__NO_SIDE_EFFECTS__ -function M(e) { +function N(e) { return e ? e.__v_isRef === !0 : !1; } // @__NO_SIDE_EFFECTS__ @@ -773,45 +789,61 @@ function tn(e) { return nn(e, !0); } function nn(e, t) { - return /* @__PURE__ */ M(e) ? e : new rn(e, t); + return /* @__PURE__ */ N(e) ? e : new rn(e, t); } var rn = class { constructor(e, t) { - this.dep = new tt(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ j(e), this._value = t ? e : Qt(e), this.__v_isShallow = t; + this.dep = new et(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ M(e), this._value = t ? e : Qt(e), this.__v_isShallow = t; } get value() { return this.dep.track(), this._value; } set value(e) { let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ Yt(e) || /* @__PURE__ */ Jt(e); - e = n ? e : /* @__PURE__ */ j(e), oe(e, t) && (this._rawValue = e, this._value = n ? e : Qt(e), this.dep.trigger()); + e = n ? e : /* @__PURE__ */ M(e), D(e, t) && (this._rawValue = e, this._value = n ? e : Qt(e), this.dep.trigger()); } }; function an(e) { e.dep && e.dep.trigger(); } function on(e) { - return /* @__PURE__ */ M(e) ? e.value : e; + return /* @__PURE__ */ N(e) ? e.value : e; } var sn = { get: (e, t, n) => t === "__v_raw" ? e : on(Reflect.get(e, t, n)), set: (e, t, n, r) => { let i = e[t]; - return /* @__PURE__ */ M(i) && !/* @__PURE__ */ M(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); + return /* @__PURE__ */ N(i) && !/* @__PURE__ */ N(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); } }; function cn(e) { return /* @__PURE__ */ qt(e) ? e : new Proxy(e, sn); } +var ln = class { + constructor(e) { + this.__v_isRef = !0, this._value = void 0; + let t = this.dep = new et(), { get: n, set: r } = e(t.track.bind(t), t.trigger.bind(t)); + this._get = n, this._set = r; + } + get value() { + return this._value = this._get(); + } + set value(e) { + this._set(e); + } +}; +function un(e) { + return new ln(e); +} // @__NO_SIDE_EFFECTS__ -function ln(e) { +function dn(e) { let t = d(e) ? Array(e.length) : {}; - for (let n in e) t[n] = dn(e, n); + for (let n in e) t[n] = pn(e, n); return t; } -var un = class { +var fn = class { constructor(e, t, n) { - this._object = e, this._defaultValue = n, this.__v_isRef = !0, this._value = void 0, this._key = _(t) ? t : String(t), this._raw = /* @__PURE__ */ j(e); + this._object = e, this._defaultValue = n, this.__v_isRef = !0, this._value = void 0, this._key = _(t) ? t : String(t), this._raw = /* @__PURE__ */ M(e); let r = !0, i = e; if (!d(e) || _(this._key) || !w(this._key)) do r = !/* @__PURE__ */ Xt(i) || /* @__PURE__ */ Yt(i); @@ -823,9 +855,9 @@ var un = class { return this._shallow && (e = on(e)), this._value = e === void 0 ? this._defaultValue : e; } set value(e) { - if (this._shallow && /* @__PURE__ */ M(this._raw[this._key])) { + if (this._shallow && /* @__PURE__ */ N(this._raw[this._key])) { let t = this._object[this._key]; - if (/* @__PURE__ */ M(t)) { + if (/* @__PURE__ */ N(t)) { t.value = e; return; } @@ -833,141 +865,144 @@ var un = class { this._object[this._key] = e; } get dep() { - return lt(this._raw, this._key); + return ct(this._raw, this._key); } }; -function dn(e, t, n) { - return new un(e, t, n); +function pn(e, t, n) { + return new fn(e, t, n); } -var fn = class { +var mn = class { constructor(e, t, n) { - this.fn = e, this.setter = t, this._value = void 0, this.dep = new tt(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = $e - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; + this.fn = e, this.setter = t, this._value = void 0, this.dep = new et(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = Qe - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; } notify() { - if (this.flags |= 16, !(this.flags & 8) && A !== this) return ze(this, !0), !0; + if (this.flags |= 16, !(this.flags & 8) && j !== this) return Re(this, !0), !0; } get value() { let e = this.dep.track(); - return Ge(this), e && (e.version = this.dep.version), this._value; + return We(this), e && (e.version = this.dep.version), this._value; } set value(e) { this.setter && this.setter(e); } }; // @__NO_SIDE_EFFECTS__ -function pn(e, t, n = !1) { +function hn(e, t, n = !1) { let r, i; - return h(e) ? r = e : (r = e.get, i = e.set), new fn(r, i, n); + return h(e) ? r = e : (r = e.get, i = e.set), new mn(r, i, n); } -var mn = {}, hn = /* @__PURE__ */ new WeakMap(), gn = void 0; -function _n(e, t = !1, n = gn) { +var gn = {}, _n = /* @__PURE__ */ new WeakMap(), vn = void 0; +function yn(e, t = !1, n = vn) { if (n) { - let t = hn.get(n); - t || hn.set(n, t = []), t.push(e); + let t = _n.get(n); + t || _n.set(n, t = []), t.push(e); } } -function vn(e, n, i = t) { - let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ Yt(e) || o === !1 || o === 0 ? yn(e, 1) : yn(e), m, g, _, v, y = !1, b = !1; - if (/* @__PURE__ */ M(e) ? (g = () => e.value, y = /* @__PURE__ */ Yt(e)) : /* @__PURE__ */ qt(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ qt(e) || /* @__PURE__ */ Yt(e)), g = () => e.map((e) => { - if (/* @__PURE__ */ M(e)) return e.value; +function bn(e, n, i = t) { + let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ Yt(e) || o === !1 || o === 0 ? xn(e, 1) : xn(e), m, g, _, v, y = !1, b = !1; + if (/* @__PURE__ */ N(e) ? (g = () => e.value, y = /* @__PURE__ */ Yt(e)) : /* @__PURE__ */ qt(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ qt(e) || /* @__PURE__ */ Yt(e)), g = () => e.map((e) => { + if (/* @__PURE__ */ N(e)) return e.value; if (/* @__PURE__ */ qt(e)) return p(e); if (h(e)) return f ? f(e, 2) : e(); })) : g = h(e) ? n ? f ? () => f(e, 2) : e : () => { if (_) { - Xe(); + Ye(); try { _(); } finally { - Ze(); + Xe(); } } - let t = gn; - gn = m; + let t = vn; + vn = m; try { return f ? f(e, 3, [v]) : e(v); } finally { - gn = t; + vn = t; } } : r, n && o) { let e = g, t = o === !0 ? Infinity : o; - g = () => yn(e(), t); + g = () => xn(e(), t); } - let x = Me(), S = () => { + let x = je(), S = () => { m.stop(), x && x.active && c(x.effects, m); }; if (s && n) { let e = n; n = (...t) => { - let n = e(...t); - return S(), n; + try { + return e(...t); + } finally { + S(); + } }; } - let C = b ? Array(e.length).fill(mn) : mn, w = (e) => { + let C = b ? Array(e.length).fill(gn) : gn, w = (e) => { if (m.flags & 1 && (m.dirty || e)) { if (n) { let t = m.run(); - if (e || o || y || (b ? t.some((e, t) => oe(e, C[t])) : oe(t, C))) { - _ && _(); - let e = gn; - gn = m; + if (e || o || y || (b ? t.some((e, t) => D(e, C[t])) : D(t, C))) { + let e = vn; + Ye(); try { + _ && _(), vn = m; let e = [ t, - C === mn ? void 0 : b && C[0] === mn ? [] : C, + C === gn ? void 0 : b && C[0] === gn ? [] : C, v ]; C = t, f ? f(n, 3, e) : n(...e); } finally { - gn = e; + vn = e, Xe(); } } } else m.run(); } }; - return u && u(w), m = new Fe(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => _n(e, !1, m), _ = m.onStop = () => { - let e = hn.get(m); + return u && u(w), m = new Pe(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => yn(e, !1, m), _ = m.onStop = () => { + let e = _n.get(m); if (e) { if (f) f(e, 4); else for (let t of e) t(); - hn.delete(m); + _n.delete(m); } }, n ? a ? w(!0) : C = m.run() : l ? l(w.bind(null, !0), !0) : m.run(), S.pause = m.pause.bind(m), S.resume = m.resume.bind(m), S.stop = S, S; } -function yn(e, t = Infinity, n) { +function xn(e, t = Infinity, n) { if (t <= 0 || !v(e) || e.__v_skip || (n ||= /* @__PURE__ */ new Map(), (n.get(e) || 0) >= t)) return e; - if (n.set(e, t), t--, /* @__PURE__ */ M(e)) yn(e.value, t, n); - else if (d(e)) for (let r = 0; r < e.length; r++) yn(e[r], t, n); + if (n.set(e, t), t--, /* @__PURE__ */ N(e)) xn(e.value, t, n); + else if (d(e)) for (let r = 0; r < e.length; r++) xn(e[r], t, n); else if (p(e) || f(e)) e.forEach((e) => { - yn(e, t, n); + xn(e, t, n); }); else if (C(e)) { - for (let r in e) yn(e[r], t, n); - for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && yn(e[r], t, n); + for (let r in e) xn(e[r], t, n); + for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && xn(e[r], t, n); } return e; } // node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js -function bn(e, t, n, r) { +function Sn(e, t, n, r) { try { return r ? e(...r) : e(); } catch (e) { - Sn(e, t, n); + wn(e, t, n); } } -function xn(e, t, n, r) { +function Cn(e, t, n, r) { if (h(e)) { - let i = bn(e, t, n, r); + let i = Sn(e, t, n, r); return i && y(i) && i.catch((e) => { - Sn(e, t, n); + wn(e, t, n); }), i; } if (d(e)) { let i = []; - for (let a = 0; a < e.length; a++) i.push(xn(e[a], t, n, r)); + for (let a = 0; a < e.length; a++) i.push(Cn(e[a], t, n, r)); return i; } } -function Sn(e, n, r, i = !0) { +function wn(e, n, r, i = !0) { let a = n ? n.vnode : null, { errorHandler: o, throwUnhandledErrorInProduction: s } = n && n.appContext.config || t; if (n) { let t = n.parent, i = n.proxy, a = `https://vuejs.org/error-reference/#runtime-${r}`; @@ -979,114 +1014,136 @@ function Sn(e, n, r, i = !0) { t = t.parent; } if (o) { - Xe(), bn(o, null, 10, [ + Ye(), Sn(o, null, 10, [ e, i, a - ]), Ze(); + ]), Xe(); return; } } - Cn(e, r, a, i, s); + Tn(e, r, a, i, s); } -function Cn(e, t, n, r = !0, i = !1) { +function Tn(e, t, n, r = !0, i = !1) { if (i) throw e; console.error(e); } -var wn = [], Tn = -1, En = [], Dn = null, On = 0, kn = /* @__PURE__ */ Promise.resolve(), An = null; -function jn(e) { - let t = An || kn; +var En = [], Dn = -1, On = [], kn = null, An = 0, jn = /* @__PURE__ */ Promise.resolve(), Mn = null; +function Nn(e) { + let t = Mn || jn; return e ? t.then(this ? e.bind(this) : e) : t; } -function Mn(e) { - let t = Tn + 1, n = wn.length; +function Pn(e) { + let t = Dn + 1, n = En.length; for (; t < n;) { - let r = t + n >>> 1, i = wn[r], a = Rn(i); + let r = t + n >>> 1, i = En[r], a = Hn(i); a < e || a === e && i.flags & 2 ? t = r + 1 : n = r; } return t; } -function Nn(e) { - if (!(e.flags & 1)) { - let t = Rn(e), n = wn[wn.length - 1]; - !n || !(e.flags & 2) && t >= Rn(n) ? wn.push(e) : wn.splice(Mn(t), 0, e), e.flags |= 1, Pn(); - } -} -function Pn() { - An ||= kn.then(zn); -} function Fn(e) { - if (!d(e)) Dn && e.id === -1 ? Dn.splice(On + 1, 0, e) : e.flags & 1 || (En.push(e), e.flags |= 1); - else for (let t = 0; t < e.length; t++) En.push(e[t]); - Pn(); -} -function In(e, t, n = Tn + 1) { - for (; n < wn.length; n++) { - let t = wn[n]; - if (t && t.flags & 2) { - if (e && t.id !== e.uid) continue; - wn.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); - } + if (!(e.flags & 1)) { + let t = Hn(e), n = En[En.length - 1]; + !n || !(e.flags & 2) && t >= Hn(n) ? En.push(e) : En.splice(Pn(t), 0, e), e.flags |= 1, In(); } } +function In() { + Mn ||= jn.then(Un); +} function Ln(e) { - if (En.length) { - let e = [...new Set(En)].sort((e, t) => Rn(e) - Rn(t)); - if (En.length = 0, Dn) { - for (let t = 0; t < e.length; t++) Dn.push(e[t]); + if (!d(e)) kn && e.id === -1 ? kn.splice(An + 1, 0, e) : e.flags & 1 || (On.push(e), e.flags |= 1); + else for (let t = 0; t < e.length; t++) On.push(e[t]); + In(); +} +function Rn(e, t, n, r = Dn + 1) { + for (; r < En.length; r++) { + let n = En[r]; + if (n && n.flags & 2) { + if (e && n.id !== e.uid || t !== void 0 && !(n.id >= t)) continue; + En.splice(r, 1), r = e ? r - 1 : Dn, n.flags & 4 && (n.flags &= -2), n(), n.flags & 4 || (n.flags &= -2); + } + } +} +function zn(e, t, n = 0) { + if (On.length) { + let e = On, r = 0; + if (t) { + e = []; + for (let i = 0; i < On.length; i++) { + let a = On[i]; + (a.i === void 0 ? t.has(a) : !a.i || a.i.uid < n) ? On[r++] = a : e.push(a); + } + } + let i = [...new Set(e)].sort((e, t) => Hn(e) - Hn(t)); + if (On.length = r, kn) { + for (let e = 0; e < i.length; e++) kn.push(i[e]); return; } - for (Dn = e, On = 0; On < Dn.length; On++) { - let e = Dn[On]; + for (kn = i, An = 0; An < kn.length; An++) { + let e = kn[An]; e.flags & 4 && (e.flags &= -2), e.flags & 8 || e(), e.flags &= -2; } - Dn = null, On = 0; + kn = null, An = 0; } } -var Rn = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; -function zn(e) { +var Bn = !1; +function Vn(e, t) { + if (Bn) { + e(); + return; + } + let n = t === void 0 ? void 0 : new Set(On); + e(), Bn = !0; try { - for (Tn = 0; Tn < wn.length; Tn++) { - let e = wn[Tn]; - e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), bn(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); + Rn(void 0, t), zn(void 0, n, t); + } finally { + Bn = !1; + } +} +var Hn = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; +function Un(e) { + try { + for (Dn = 0; Dn < En.length; Dn++) { + let e = En[Dn]; + e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), Sn(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); } } finally { - for (; Tn < wn.length; Tn++) { - let e = wn[Tn]; + for (; Dn < En.length; Dn++) { + let e = En[Dn]; e && (e.flags &= -2); } - Tn = -1, wn.length = 0, Ln(e), An = null, (wn.length || En.length) && zn(e); + Dn = -1, En.length = 0, zn(e), Mn = null, (En.length || On.length) && Un(e); } } -var N = null, Bn = null; -function Vn(e) { - let t = N; - return N = e, Bn = e && e.type.__scopeId || null, t; +var Wn = null, Gn = null; +function Kn(e) { + let t = Wn; + return Wn = e, Gn = e && e.type.__scopeId || null, t; } -function P(e, t = N, n) { +function P(e, t = Wn, n) { if (!t || e._n) return e; let r = (...n) => { - r._d && Pa(-1); - let i = Vn(t), a = Aa.length, o; + r._d && Ha(-1); + let i = Kn(t), a = Ra.length, o; try { o = e(...n); } finally { - for (let e = Aa.length; e > a; e--) Ma(); - Vn(i), r._d && Pa(1); + for (let e = Ra.length; e > a; e--) Ba(); + Kn(i), r._d && Ha(1); } return o; }; return r._n = !0, r._c = !0, r._d = !0, r; } -function Hn(e, n) { - if (N === null) return e; - let r = fo(N), i = e.dirs ||= []; +function qn(e, n) { + if (Wn === null) return e; + let r = So(Wn), i = e.dirs ||= []; for (let e = 0; e < n.length; e++) { let [a, o, s, c = t] = n[e]; a && (h(a) && (a = { mounted: a, updated: a - }), a.deep && yn(o), i.push({ + }), a.deep && xn(o), i.push({ dir: a, instance: r, value: o, @@ -1097,75 +1154,78 @@ function Hn(e, n) { } return e; } -function Un(e, t, n, r) { +function Jn(e, t, n, r) { let i = e.dirs, a = t && t.dirs; for (let o = 0; o < i.length; o++) { let s = i[o]; a && (s.oldValue = a[o].value); let c = s.dir[r]; - c && (Xe(), xn(c, n, 8, [ + c && (Ye(), Cn(c, n, 8, [ e.el, s, e, t - ]), Ze()); + ]), Xe()); } } -function Wn(e, t) { - if (Za) { - let n = Za.provides, r = Za.parent && Za.parent.provides; - r === n && (n = Za.provides = Object.create(r)), n[e] = t; +function Yn(e, t) { + if (so) { + let n = so.provides, r = so.parent && so.parent.provides; + r === n && (n = so.provides = Object.create(r)), n[e] = t; } } -function Gn(e, t, n = !1) { - let r = Qa(); - if (r || Li) { - let i = Li ? Li._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; +function Xn(e, t, n = !1) { + let r = co(); + if (r || Wi) { + let i = Wi ? Wi._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; if (i && e in i) return i[e]; if (arguments.length > 1) return n && h(t) ? t.call(r && r.proxy) : t; } } -function Kn() { - return !!(Qa() || Li); +function Zn() { + return !!(co() || Wi); } -var qn = /* @__PURE__ */ Symbol.for("v-scx"), Jn = () => Gn(qn); -function Yn(e, t) { - return Zn(e, null, t); +var Qn = /* @__PURE__ */ Symbol.for("v-scx"), $n = () => Xn(Qn); +function er(e, t) { + return rr(e, null, t); } -function Xn(e, t, n) { - return Zn(e, t, n); +function tr(e, t) { + return rr(e, null, { flush: "sync" }); } -function Zn(e, n, i = t) { +function nr(e, t, n) { + return rr(e, t, n); +} +function rr(e, n, i = t) { let { immediate: a, deep: o, flush: c, once: l } = i, u = s({}, i), d = n && a || !n && c !== "post", f; - if (io) { + if (ho) { if (c === "sync") { - let e = Jn(); + let e = $n(); f = e.__watcherHandles ||= []; } else if (!d) { let e = () => {}; return e.stop = r, e.resume = r, e.pause = r, e; } } - let p = Za; - u.call = (e, t, n) => xn(e, p, t, n); + let p = so; + u.call = (e, t, n) => Cn(e, p, t, n); let m = !1; c === "post" ? u.scheduler = (e) => { - ma(e, p && p.suspense); + e.i = p, Ca(e, p && p.suspense); } : c !== "sync" && (m = !0, u.scheduler = (e, t) => { - t ? e() : Nn(e); + t ? e() : Fn(e); }), u.augmentJob = (e) => { n && (e.flags |= 4), m && (e.flags |= 2, p && (e.id = p.uid, e.i = p)); }; - let h = vn(e, n, u); - return io && (f ? f.push(h) : d && h()), h; + let h = bn(e, n, u); + return ho && (f ? f.push(h) : d && h()), h; } -function Qn(e, t, n) { - let r = this.proxy, i = g(e) ? e.includes(".") ? $n(r, e) : () => r[e] : e.bind(r, r), a; +function ir(e, t, n) { + let r = this.proxy, i = g(e) ? e.includes(".") ? ar(r, e) : () => r[e] : e.bind(r, r), a; h(t) ? a = t : (a = t.handler, n = t); - let o = to(this), s = Zn(i, a.bind(r), n); + let o = fo(this), s = rr(i, a.bind(r), n); return o(), s; } -function $n(e, t) { +function ar(e, t) { let n = t.split("."); return () => { let t = e; @@ -1173,71 +1233,71 @@ function $n(e, t) { return t; }; } -var er = /* @__PURE__ */ new WeakMap(), tr = /* @__PURE__ */ Symbol("_vte"), nr = (e) => e.__isTeleport, rr = (e) => e && (e.disabled || e.disabled === ""), ir = (e) => e && (e.defer || e.defer === ""), ar = (e) => typeof SVGElement < "u" && e instanceof SVGElement, or = (e) => typeof MathMLElement == "function" && e instanceof MathMLElement, sr = (e, t) => { +var or = /* @__PURE__ */ new WeakMap(), sr = /* @__PURE__ */ Symbol("_vte"), cr = (e) => e.__isTeleport, lr = (e) => e && (e.disabled || e.disabled === ""), ur = (e) => e && (e.defer || e.defer === ""), dr = (e) => typeof SVGElement < "u" && e instanceof SVGElement, fr = (e) => typeof MathMLElement == "function" && e instanceof MathMLElement, pr = (e, t) => { let n = e && e.to; return g(n) ? t ? t(n) : null : n; -}, cr = { +}, mr = { name: "Teleport", __isTeleport: !0, process(e, t, n, r, i, a, o, s, c, l) { - let { mc: u, pc: d, pbc: f, o: { insert: p, querySelector: m, createText: h, createComment: g, parentNode: _ } } = l, v = rr(t.props), { dynamicChildren: y } = t, b = (e, t, n) => { + let { mc: u, pc: d, pbc: f, o: { insert: p, querySelector: m, createText: h, createComment: g, parentNode: _ } } = l, v = lr(t.props), { dynamicChildren: y } = t, b = (e, t, n) => { e.shapeFlag & 16 && u(e.children, t, n, i, a, o, s, c); }, x = (e = t) => { - let n = rr(e.props), r = e.target = sr(e.props, m), a = pr(r, e, h, p); - r && (o !== "svg" && ar(r) ? o = "svg" : o !== "mathml" && or(r) && (o = "mathml"), i && i.isCE && (i.ce._teleportTargets || (i.ce._teleportTargets = /* @__PURE__ */ new Set())).add(r), n || (b(e, r, a), fr(e, !1))); + let n = lr(e.props), r = e.target = pr(e.props, m), a = yr(r, e, h, p); + r && (o !== "svg" && dr(r) ? o = "svg" : o !== "mathml" && fr(r) && (o = "mathml"), i && i.isCE && (i.ce._teleportTargets || (i.ce._teleportTargets = /* @__PURE__ */ new Set())).add(r), n || (b(e, r, a), vr(e, !1))); }, S = (e) => { let t = () => { - if (er.get(e) === t) { - if (er.delete(e), rr(e.props)) { + if (or.get(e) === t) { + if (or.delete(e), lr(e.props)) { let t = _(e.el) || n; - b(e, t, e.anchor), fr(e, !0); + b(e, t, e.anchor), vr(e, !0); } x(e); } }; - er.set(e, t), ma(t, a); + or.set(e, t), Ca(t, a); }; if (e == null) { let e = t.el = h(""), i = t.anchor = h(""); - if (p(e, n, r), p(i, n, r), ir(t.props) || a && a.pendingBranch) { + if (p(e, n, r), p(i, n, r), ur(t.props) || a && a.pendingBranch) { S(t); return; } - v && (b(t, n, i), fr(t, !0)), x(); + v && (b(t, n, i), vr(t, !0)), x(); } else { t.el = e.el; - let r = t.anchor = e.anchor, u = er.get(e); + let r = t.anchor = e.anchor, u = or.get(e); if (u) { - u.flags |= 8, er.delete(e), S(t); + u.flags |= 8, or.delete(e), S(t); return; } t.targetStart = e.targetStart; - let p = t.target = e.target, h = t.targetAnchor = e.targetAnchor, g = rr(e.props), _ = g ? n : p, b = g ? r : h; - if (o === "svg" || ar(p) ? o = "svg" : (o === "mathml" || or(p)) && (o = "mathml"), y ? (f(e.dynamicChildren, y, _, i, a, o, s), ba(e, t, !0)) : c || d(e, t, _, b, i, a, o, s, !1), v) g ? t.props && e.props && t.props.to !== e.props.to && (t.props.to = e.props.to) : lr(t, n, r, l, 1); + let p = t.target = e.target, h = t.targetAnchor = e.targetAnchor, g = lr(e.props), _ = g ? n : p, b = g ? r : h; + if (o === "svg" || dr(p) ? o = "svg" : (o === "mathml" || fr(p)) && (o = "mathml"), y ? (f(e.dynamicChildren, y, _, i, a, o, s), ka(e, t, !0)) : c || d(e, t, _, b, i, a, o, s, !1), v) g ? t.props && e.props && t.props.to !== e.props.to && (t.props.to = e.props.to) : hr(t, n, r, l, 1); else if ((t.props && t.props.to) !== (e.props && e.props.to)) { - let e = sr(t.props, m); - e && (t.target = e, lr(t, e, null, l, 0)); - } else g && lr(t, p, h, l, 1); - fr(t, v); + let e = pr(t.props, m); + e && (t.target = e, hr(t, e, null, l, 0)); + } else g && hr(t, p, h, l, 1); + vr(t, v); } }, remove(e, t, n, { um: r, o: { remove: i } }, a) { - let { shapeFlag: o, children: s, anchor: c, targetStart: l, targetAnchor: u, target: d, props: f } = e, p = rr(f), m = a || !p, h = er.get(e); - if (h && (h.flags |= 8, er.delete(e)), d && (i(l), i(u)), a && i(c), !h && (p || d) && o & 16) for (let e = 0; e < s.length; e++) { + let { shapeFlag: o, children: s, anchor: c, targetStart: l, targetAnchor: u, target: d, props: f } = e, p = lr(f), m = a || !p, h = or.get(e); + if (h && (h.flags |= 8, or.delete(e)), d && (i(l), i(u)), a && i(c), !h && (p || d) && o & 16) for (let e = 0; e < s.length; e++) { let i = s[e]; r(i, t, n, m, !!i.dynamicChildren); } }, - move: lr, - hydrate: ur + move: hr, + hydrate: gr }; -function lr(e, t, n, { o: { insert: r }, m: i }, a = 2) { - a === 0 && r(e.targetAnchor, t, n); +function hr(e, t, n, { o: { insert: r }, m: i }, a = 2) { + a === 0 && (e.targetStart && r(e.targetStart, t, n), r(e.targetAnchor, t, n), n = e.targetAnchor); let { el: o, anchor: s, shapeFlag: c, children: l, props: u } = e, d = a === 2; - if (d && r(o, t, n), !er.has(e) && (!d || rr(u)) && c & 16) for (let e = 0; e < l.length; e++) i(l[e], t, n, 2); + if (d && r(o, t, n), !or.has(e) && (!d || lr(u)) && c & 16) for (let e = 0; e < l.length; e++) i(l[e], t, n, 2); d && r(s, t, n); } -function ur(e, t, n, r, i, a, { o: { nextSibling: o, parentNode: s, querySelector: c, insert: l, createText: u } }, d) { +function gr(e, t, n, r, i, a, { o: { nextSibling: o, parentNode: s, querySelector: c, insert: l, createText: u } }, d) { function f(e, n) { let r = n; for (; r;) { @@ -1254,15 +1314,15 @@ function ur(e, t, n, r, i, a, { o: { nextSibling: o, parentNode: s, querySelecto function p(e, t) { t.anchor = d(o(e), t, s(e), n, r, i, a); } - let m = t.target = sr(t.props, c), h = rr(t.props); + let m = t.target = pr(t.props, c), h = lr(t.props); if (m) { let c = m._lpa || m.firstChild; - t.shapeFlag & 16 && (h ? (p(e, t), f(m, c), t.targetAnchor || pr(m, t, u, l, s(e) === m ? e : null)) : (t.anchor = o(e), f(m, c), t.targetAnchor || pr(m, t, u, l), d(c && o(c), t, m, n, r, i, a))), fr(t, h); + t.shapeFlag & 16 && (h ? (p(e, t), f(m, c), t.targetAnchor || yr(m, t, u, l, s(e) === m ? e : null)) : (t.anchor = o(e), f(m, c), t.targetAnchor || yr(m, t, u, l), d(c && o(c), t, m, n, r, i, a))), vr(t, h); } else h && t.shapeFlag & 16 && (p(e, t), t.targetStart = e, t.targetAnchor = o(e)); return t.anchor && o(t.anchor); } -var dr = cr; -function fr(e, t) { +var _r = mr; +function vr(e, t) { let n = e.ctx; if (n && n.ut) { let r, i; @@ -1270,67 +1330,64 @@ function fr(e, t) { n.ut(); } } -function pr(e, t, n, r, i = null) { +function yr(e, t, n, r, i = null) { let a = t.targetStart = n(""), o = t.targetAnchor = n(""); - return a[tr] = o, e && (r(a, e, i), r(o, e, i)), o; + return a[sr] = o, e && (r(a, e, i), r(o, e, i)), o; } -var mr = /* @__PURE__ */ Symbol("_leaveCb"), hr = /* @__PURE__ */ Symbol("_enterCb"); -function gr() { +var br = /* @__PURE__ */ Symbol("_leaveCb"), xr = /* @__PURE__ */ Symbol("_enterCb"); +function Sr() { let e = { isMounted: !1, isLeaving: !1, isUnmounting: !1, leavingVNodes: /* @__PURE__ */ new Map() }; - return Yr(() => { + return ti(() => { e.isMounted = !0; - }), Qr(() => { + }), ii(() => { e.isUnmounting = !0; }), e; } -var _r = [Function, Array], vr = { +var Cr = [Function, Array], wr = { mode: String, appear: Boolean, persisted: Boolean, - onBeforeEnter: _r, - onEnter: _r, - onAfterEnter: _r, - onEnterCancelled: _r, - onBeforeLeave: _r, - onLeave: _r, - onAfterLeave: _r, - onLeaveCancelled: _r, - onBeforeAppear: _r, - onAppear: _r, - onAfterAppear: _r, - onAppearCancelled: _r -}, yr = (e) => { - let t = e.subTree; - return t.component ? yr(t.component) : t; -}, br = { + onBeforeEnter: Cr, + onEnter: Cr, + onAfterEnter: Cr, + onEnterCancelled: Cr, + onBeforeLeave: Cr, + onLeave: Cr, + onAfterLeave: Cr, + onLeaveCancelled: Cr, + onBeforeAppear: Cr, + onAppear: Cr, + onAfterAppear: Cr, + onAppearCancelled: Cr +}, Tr = { name: "BaseTransition", - props: vr, + props: wr, setup(e, { slots: t }) { - let n = Qa(), r = gr(); + let n = co(), r = Sr(); return () => { - let i = t.default && Or(t.default(), !0), a = i && i.length ? xr(i) : n.subTree ? U() : void 0; + let i = t.default && Nr(t.default(), !0), a = i && i.length ? Er(i) : n.subTree ? W() : void 0; if (!a) return; - let o = /* @__PURE__ */ j(e), { mode: s } = o; - if (r.isLeaving) return Tr(a); - let c = Er(a); - if (!c) return Tr(a); - let l = wr(c, o, r, n, (e) => l = e); - c.type !== Oa && Dr(c, l); - let u = n.subTree && Er(n.subTree); - if (u && u.type !== Oa && !La(u, c) && yr(n).type !== Oa) { - let e = wr(u, o, r, n); - if (Dr(u, e), s === "out-in" && c.type !== Oa) return r.isLeaving = !0, e.afterLeave = () => { + let o = /* @__PURE__ */ M(e), { mode: s } = o; + if (r.isLeaving) return Ar(a); + let c = jr(a); + if (!c) return Ar(a); + let l = kr(c, o, r, n, (e) => l = e); + c.type !== R && Mr(c, l); + let u = n.subTree && jr(n.subTree); + if (u && u.type !== R && !Ga(u, c) && Pr(n.subTree)) { + let e = kr(u, o, r, n); + if (Mr(u, e), s === "out-in" && c.type !== R) return r.isLeaving = !0, e.afterLeave = () => { r.isLeaving = !1, n.job.flags & 8 || n.update(), delete e.afterLeave, u = void 0; - }, Tr(a); - s === "in-out" && c.type !== Oa ? e.delayLeave = (e, t, n) => { - let i = Cr(r, u); - i[String(u.key)] = u, e[mr] = () => { - t(), e[mr] = void 0, delete l.delayedLeave, u = void 0; + }, Ar(a); + s === "in-out" && c.type !== R ? e.delayLeave = (e, t, n) => { + let i = Or(r, u); + i[String(u.key)] = u, e[br] = () => { + t(), e[br] = void 0, delete l.delayedLeave, u = void 0; }, l.delayedLeave = () => { n(), delete l.delayedLeave, u = void 0; }; @@ -1340,24 +1397,24 @@ var _r = [Function, Array], vr = { }; } }; -function xr(e) { +function Er(e) { let t = e[0]; if (e.length > 1) { - for (let n of e) if (n.type !== Oa) { + for (let n of e) if (n.type !== R) { t = n; break; } } return t; } -var Sr = br; -function Cr(e, t) { +var Dr = Tr; +function Or(e, t) { let { leavingVNodes: n } = e, r = n.get(t.type); return r || (r = /* @__PURE__ */ Object.create(null), n.set(t.type, r)), r; } -function wr(e, t, n, r, i) { - let { appear: a, mode: o, persisted: s = !1, onBeforeEnter: c, onEnter: l, onAfterEnter: u, onEnterCancelled: f, onBeforeLeave: p, onLeave: m, onAfterLeave: h, onLeaveCancelled: g, onBeforeAppear: _, onAppear: v, onAfterAppear: y, onAppearCancelled: b } = t, x = String(e.key), S = Cr(n, e), C = (e, t) => { - e && xn(e, r, 9, t); +function kr(e, t, n, r, i) { + let { appear: a, mode: o, persisted: s = !1, onBeforeEnter: c, onEnter: l, onAfterEnter: u, onEnterCancelled: f, onBeforeLeave: p, onLeave: m, onAfterLeave: h, onLeaveCancelled: g, onBeforeAppear: _, onAppear: v, onAfterAppear: y, onAppearCancelled: b } = t, x = String(e.key), S = Or(n, e), C = (e, t) => { + e && Cn(e, r, 9, t); }, w = (e, t) => { let n = t[1]; C(e, t), d(e) ? e.every((e) => e.length <= 1) && n() : e.length <= 1 && n(); @@ -1370,9 +1427,17 @@ function wr(e, t, n, r, i) { if (a) r = _ || c; else return; } - t[mr] && t[mr](!0); + t[br] && t[br](!0); let i = S[x]; - i && La(e, i) && i.el[mr] && i.el[mr](), C(r, [t]); + if (i && Ga(e, i)) { + let e = i.el[br]; + if (!e) { + let t = Pr(i); + e = t && t.el[br]; + } + e && e(); + } + C(r, [t]); }, enter(t) { if (S[x] === e) return; @@ -1382,35 +1447,35 @@ function wr(e, t, n, r, i) { else return; } let s = !1; - t[hr] = (e) => { - s || (s = !0, C(e ? o : i, [t]), ee.delayedLeave && ee.delayedLeave(), t[hr] = void 0); + t[xr] = (e) => { + s || (s = !0, C(e ? o : i, [t]), ee.delayedLeave && ee.delayedLeave(), t[xr] = void 0); }; - let c = t[hr].bind(null, !1); + let c = t[xr].bind(null, !1); r ? w(r, [t, c]) : c(); }, leave(t, r) { let i = String(e.key); - if (t[hr] && t[hr](!0), n.isUnmounting) return r(); + if (t[xr] && t[xr](!0), n.isUnmounting) return r(); C(p, [t]); let a = !1; - t[mr] = (n) => { - a || (a = !0, r(), C(n ? g : h, [t]), t[mr] = void 0, S[i] === e && delete S[i]); + t[br] = (n) => { + a || (a = !0, r(), C(n ? g : h, [t]), t[br] = void 0, S[i] === e && delete S[i]); }; - let o = t[mr].bind(null, !1); + let o = t[br].bind(null, !1); S[i] = e, m ? w(m, [t, o]) : o(); }, clone(e) { - let a = wr(e, t, n, r, i); + let a = kr(e, t, n, r, i); return i && i(a), a; } }; return ee; } -function Tr(e) { - if (Vr(e)) return e = Ha(e), e.children = null, e; +function Ar(e) { + if (qr(e)) return e = Xa(e), e.children = null, e; } -function Er(e) { - if (!Vr(e)) return nr(e.type) && e.children ? xr(e.children) : e; +function jr(e) { + if (!qr(e)) return cr(e.type) && e.children ? Er(e.children) : e; if (e.component) return e.component.subTree; let { shapeFlag: t, children: n } = e; if (n) { @@ -1418,62 +1483,74 @@ function Er(e) { if (t & 32 && h(n.default)) return n.default(); } } -function Dr(e, t) { +function Mr(e, t) { if (e.shapeFlag & 6 && e.component) { e.transition = t; let n = e.component.subTree; - Dr(nr(n.type) && Er(n) || n, t); - } else e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; + Mr(cr(n.type) && jr(n) || n, t); + } else if (e.shapeFlag & 128) e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback); + else if (e.transition = t, e.type === L && d(e.children)) { + let n = Qi(e.children, !1); + n && Mr(n, t); + } } -function Or(e, t = !1, n) { +function Nr(e, t = !1, n) { let r = [], i = 0; for (let a = 0; a < e.length; a++) { let o = e[a], s = n == null ? o.key : String(n) + String(o.key == null ? a : o.key); - o.type === L ? (o.patchFlag & 128 && i++, r = r.concat(Or(o.children, t, s))) : (t || o.type !== Oa) && r.push(s == null ? o : Ha(o, { key: s })); + o.type === L ? (o.patchFlag & 128 && i++, r = r.concat(Nr(o.children, t, s))) : (t || o.type !== R) && r.push(s == null ? o : Xa(o, { key: s })); } if (i > 1) for (let e = 0; e < r.length; e++) r[e].patchFlag = -2; return r; } +function Pr(e) { + if (e.component) return Pr(e.component.subTree); + if (e.type === L) { + let t = d(e.children) && Qi(e.children, !1); + return t ? Pr(t) : void 0; + } + if (e.type !== R) return e; +} // @__NO_SIDE_EFFECTS__ -function kr(e, t) { +function Fr(e, t) { return h(e) ? /* @__PURE__ */ s({ name: e.name }, t, { setup: e }) : e; } -function Ar() { - let e = Qa(); +function Ir() { + let e = co(); return e ? (e.appContext.config.idPrefix || "v") + "-" + e.ids[0] + e.ids[1]++ : ""; } -function jr(e) { +function Lr(e) { e.ids = [ e.ids[0] + e.ids[2]++ + "-", 0, 0 ]; } -function Mr(e, t) { +function Rr(e, t) { let n; return !!((n = Object.getOwnPropertyDescriptor(e, t)) && !n.configurable); } -var Nr = /* @__PURE__ */ new WeakMap(); -function Pr(e, n, r, a, o = !1) { +var zr = /* @__PURE__ */ new WeakMap(); +function Br(e, n, r, a, o = !1) { if (d(e)) { - e.forEach((e, t) => Pr(e, n && (d(n) ? n[t] : n), r, a, o)); + e.forEach((e, t) => Br(e, n && (d(n) ? n[t] : n), r, a, o)); return; } - if (Rr(a) && !o) { - a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && Pr(e, n, r, a.component.subTree); + if (Wr(a) && !o) { + a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && Br(e, n, r, a.component.subTree); return; } - let s = a.shapeFlag & 4 ? fo(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ j(v), b = v === t ? i : (e) => !Mr(_, e) && u(y, e), x = (e, t) => !(t && Mr(_, t)); + let s = a.shapeFlag & 4 ? So(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ M(v), b = v === t ? i : (e) => !Rr(_, e) && u(y, e), x = (e, t) => !(t && Rr(_, t)); if (m != null && m !== p) { - if (Fr(n), g(m)) _[m] = null, b(m) && (v[m] = null); - else if (/* @__PURE__ */ M(m)) { + if (Vr(n), g(m)) _[m] = null, b(m) && (v[m] = null); + else if (/* @__PURE__ */ N(m)) { let e = n; x(m, e.k) && (m.value = null), e.k && (_[e.k] = null); } } - if (h(p)) bn(p, f, 12, [l, _]); + if (h(p)) Sn(p, f, 12, [l, _]); else { - let t = g(p), n = /* @__PURE__ */ M(p); + let t = g(p), n = /* @__PURE__ */ N(p); if (t || n) { let i = () => { if (e.f) { @@ -1489,26 +1566,26 @@ function Pr(e, n, r, a, o = !1) { }; if (l) { let t = () => { - i(), Nr.delete(e); + i(), zr.delete(e); }; - t.id = -1, Nr.set(e, t), ma(t, r); - } else Fr(e), i(); + t.id = -1, zr.set(e, t), Ca(t, r); + } else Vr(e), i(); } } } -function Fr(e) { - let t = Nr.get(e); - t && (t.flags |= 8, Nr.delete(e)); +function Vr(e) { + let t = zr.get(e); + t && (t.flags |= 8, zr.delete(e)); } -var Ir = (e) => e.nodeType === 8; -fe().requestIdleCallback, fe().cancelIdleCallback; -function Lr(e, t) { - if (Ir(e) && e.data === "[") { +var Hr = (e) => e.nodeType === 8; +de().requestIdleCallback, de().cancelIdleCallback; +function Ur(e, t) { + if (Hr(e) && e.data === "[") { let n = 1, r = e.nextSibling; for (; r;) { if (r.nodeType === 1) { if (t(r) === !1) break; - } else if (Ir(r)) { + } else if (Hr(r)) { if (r.data === "]") { if (--n === 0) break; } else r.data === "[" && n++; @@ -1517,9 +1594,9 @@ function Lr(e, t) { } } else t(e); } -var Rr = (e) => !!e.type.__asyncLoader; +var Wr = (e) => !!e.type.__asyncLoader; // @__NO_SIDE_EFFECTS__ -function zr(e) { +function Gr(e) { h(e) && (e = { loader: e }); let { loader: t, loadingComponent: n, errorComponent: r, delay: i = 200, hydrate: a, timeout: o, suspensible: s = !0, onError: c } = e, l = null, u, d = 0, f = () => (d++, l = null, p()), p = () => { let e; @@ -1530,7 +1607,7 @@ function zr(e) { throw e; }).then((t) => e !== l && l ? l : (t && (t.__esModule || t[Symbol.toStringTag] === "Module") && (t = t.default), u = t, t))); }; - return /* @__PURE__ */ kr({ + return /* @__PURE__ */ Fr({ name: "AsyncComponentWrapper", __asyncLoader: p, __asyncHydrate(e, t, n) { @@ -1539,7 +1616,7 @@ function zr(e) { let o = () => { i || !e.parentNode || r && !e.isConnected || n(); }, s = a ? () => { - let n = a(o, (t) => Lr(e, t)); + let n = a(o, (t) => Ur(e, t)); n && (t.bum ||= []).push(n); } : o; u ? s() : p().then(() => !t.isUnmounted && s()); @@ -1548,14 +1625,14 @@ function zr(e) { return u; }, setup() { - let e = Za; - if (jr(e), u) return () => Br(u, e); + let e = so; + if (Lr(e), u) return () => Kr(u, e); let t = (t) => { - l = null, Sn(t, e, 13, !r); + l = null, wn(t, e, 13, !r); }; - if (s && e.suspense || io) return p().then((t) => () => Br(t, e)).catch((e) => (t(e), () => r ? H(r, { error: e }) : null)); + if (s && e.suspense || ho) return p().then((t) => () => Kr(t, e)).catch((e) => (t(e), () => r ? U(r, { error: e }) : null)); let a = /* @__PURE__ */ en(!1), c = /* @__PURE__ */ en(), d = /* @__PURE__ */ en(!!i), f, m; - return $r(() => { + return ai(() => { f != null && clearTimeout(f), m != null && clearTimeout(m); }), i && (m = setTimeout(() => { e.isUnmounted || (d.value = !1); @@ -1565,29 +1642,29 @@ function zr(e) { t(e), c.value = e; } }, o)), p().then(() => { - e.isUnmounted || (a.value = !0, e.parent && Vr(e.parent.vnode) && e.parent.update()); + e.isUnmounted || (a.value = !0, e.parent && qr(e.parent.vnode) && e.parent.update()); }).catch((n) => { e.isUnmounted ? l = null : (t(n), c.value = n); }), () => { - if (a.value && u) return Br(u, e); - if (c.value && r) return H(r, { error: c.value }); - if (n && !d.value) return Br(n, e); + if (a.value && u) return Kr(u, e); + if (c.value && r) return U(r, { error: c.value }); + if (n && !d.value) return Kr(n, e); }; } }); } -function Br(e, t) { - let { ref: n, props: r, children: i, ce: a } = t.vnode, o = H(e, r, i); +function Kr(e, t) { + let { ref: n, props: r, children: i, ce: a } = t.vnode, o = U(e, r, i); return o.ref = n, o.ce = a, delete t.vnode.ce, o; } -var Vr = (e) => e.type.__isKeepAlive; -function Hr(e, t) { - Wr(e, "a", t); +var qr = (e) => e.type.__isKeepAlive; +function Jr(e, t) { + Xr(e, "a", t); } -function Ur(e, t) { - Wr(e, "da", t); +function Yr(e, t) { + Xr(e, "da", t); } -function Wr(e, t, n = Za) { +function Xr(e, t, n = so) { let r = e.__wdc ||= () => { let t = n; for (; t;) { @@ -1596,68 +1673,71 @@ function Wr(e, t, n = Za) { } return e(); }; - if (Kr(t, r, n), n) { + if (Qr(t, r, n), n) { let e = n.parent; - for (; e && e.parent;) Vr(e.parent.vnode) && Gr(r, t, n, e), e = e.parent; + for (; e && e.parent;) qr(e.parent.vnode) && Zr(r, t, n, e), e = e.parent; } } -function Gr(e, t, n, r) { - let i = Kr(t, e, r, !0); - $r(() => { +function Zr(e, t, n, r) { + let i = Qr(t, e, r, !0); + ai(() => { c(r[t], i); }, n); } -function Kr(e, t, n = Za, r = !1) { +function Qr(e, t, n = so, r = !1) { if (n) { let i = n[e] || (n[e] = []), a = t.__weh ||= (...r) => { - Xe(); - let i = to(n), a = xn(t, n, e, r); - return i(), Ze(), a; + Ye(); + let i = fo(n), a = Cn(t, n, e, r); + return i(), Xe(), a; }; return r ? i.unshift(a) : i.push(a), a; } } -var qr = (e) => (t, n = Za) => { - io && e !== "sp" || Kr(e, (...e) => t(...e), n); -}, Jr = qr("bm"), Yr = qr("m"), Xr = qr("bu"), Zr = qr("u"), Qr = qr("bum"), $r = qr("um"), ei = qr("sp"), ti = qr("rtg"), ni = qr("rtc"); -function ri(e, t = Za) { - Kr("ec", e, t); +var $r = (e) => (t, n = so) => { + ho && e !== "sp" || Qr(e, (...e) => t(...e), n); +}, ei = $r("bm"), ti = $r("m"), ni = $r("bu"), ri = $r("u"), ii = $r("bum"), ai = $r("um"), oi = $r("sp"), si = $r("rtg"), ci = $r("rtc"); +function li(e, t = so) { + Qr("ec", e, t); } -var ii = "components", ai = "directives"; +var ui = "components", di = "directives"; function F(e, t) { - return li(ii, e, !0, t) || e; + return hi(ui, e, !0, t) || e; } -var oi = /* @__PURE__ */ Symbol.for("v-ndc"); -function si(e) { - return g(e) ? li(ii, e, !1) || e : e || oi; +var fi = /* @__PURE__ */ Symbol.for("v-ndc"); +function pi(e) { + return g(e) ? hi(ui, e, !1) || e : e || fi; } -function ci(e) { - return li(ai, e); +function mi(e) { + return hi(di, e); } -function li(e, t, n = !0, r = !1) { - let i = N || Za; +function hi(e, t, n = !0, r = !1) { + let i = Wn || so; if (i) { let n = i.type; - if (e === ii) { - let e = po(n, !1); + if (e === ui) { + let e = Co(n, !1); if (e && (e === t || e === T(t) || e === ie(T(t)))) return n; } - let a = ui(i[e] || n[e], t) || ui(i.appContext[e], t); + let a = gi(i[e] || n[e], t) || gi(i.appContext[e], t); return !a && r ? n : a; } } -function ui(e, t) { +function gi(e, t) { return e && (e[t] || e[T(t)] || e[ie(T(t))]); } -function di(e, t, n, r) { +function _i(e, t, n, r) { let i, a = n && n[r], o = d(e); if (o || g(e)) { let n = o && /* @__PURE__ */ qt(e), r = !1, s = !1; - n && (r = !/* @__PURE__ */ Yt(e), s = /* @__PURE__ */ Jt(e), e = dt(e)), i = Array(e.length); + n && (r = !/* @__PURE__ */ Yt(e), s = /* @__PURE__ */ Jt(e), e = ut(e)), i = Array(e.length); for (let n = 0, o = e.length; n < o; n++) i[n] = t(r ? s ? $t(Qt(e[n])) : Qt(e[n]) : e[n], n, void 0, a && a[n]); } else if (typeof e == "number") { - i = Array(e); - for (let n = 0; n < e; n++) i[n] = t(n + 1, n, void 0, a && a[n]); + if (!Number.isInteger(e) || e < 0) i = []; + else { + i = Array(e); + for (let n = 0; n < e; n++) i[n] = t(n + 1, n, void 0, a && a[n]); + } } else if (v(e)) { if (e[Symbol.iterator]) i = Array.from(e, (e, n) => t(e, n, void 0, a && a[n])); else { @@ -1671,7 +1751,7 @@ function di(e, t, n, r) { } else i = []; return n && (n[r] = i), i; } -function fi(e, t) { +function vi(e, t) { for (let n = 0; n < t.length; n++) { let r = t[n]; if (d(r)) for (let t = 0; t < r.length; t++) e[r[t].name] = r[t].fn; @@ -1683,30 +1763,30 @@ function fi(e, t) { return e; } function I(e, t, n, r, i, a) { - if (n ??= {}, N.ce || N.parent && Rr(N.parent) && N.parent.ce) { + if (n ??= {}, Wn.ce || Wn.parent && Wr(Wn.parent) && Wn.parent.ce) { let e = a != null && n.key == null ? s({}, n, { key: a }) : n, i = Object.keys(e).length > 0; - return t !== "default" && (e.name = t), R(), B(L, null, [H("slot", e, r && r())], i ? -2 : 64); + return t !== "default" && (e.name = t), z(), V(L, null, [U("slot", e, r && r())], i ? -2 : 64); } let o = e[t]; o && o._c && (o._d = !1); - let c = Aa.length; - R(); + let c = Ra.length; + z(); let l; try { - let i = o && pi(o(n)), s = n.key || a || i && i.key; - l = B(L, { key: (s && !_(s) ? s : `_${t}`) + (!i && r ? "_fb" : "") }, i || (r ? r() : []), i && e._ === 1 ? 64 : -2); + let i = o && yi(o(n)), s = n.key || a || i && i.key; + l = V(L, { key: (s && !_(s) ? s : `_${t}`) + (!i && r ? "_fb" : "") }, i || (r ? r() : []), i && e._ === 1 ? 64 : -2); } catch (e) { - for (let e = Aa.length; e > c; e--) Ma(); + for (let e = Ra.length; e > c; e--) Ba(); throw e; } finally { o && o._c && (o._d = !0); } return !i && l.scopeId && (l.slotScopeIds = [l.scopeId + "-s"]), l; } -function pi(e) { - return e.some((e) => !Ia(e) || !(e.type === Oa || e.type === L && !pi(e.children))) ? e : null; +function yi(e) { + return e.some((e) => !Wa(e) || !(e.type === R || e.type === L && !yi(e.children))) ? e : null; } -var mi = (e) => e ? ro(e) ? fo(e) : mi(e.parent) : null, hi = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { +var bi = (e) => e ? mo(e) ? So(e) : bi(e.parent) : null, xi = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { $: (e) => e, $el: (e) => e.vnode.el, $data: (e) => e.data, @@ -1714,17 +1794,17 @@ var mi = (e) => e ? ro(e) ? fo(e) : mi(e.parent) : null, hi = /* @__PURE__ */ s( $attrs: (e) => e.attrs, $slots: (e) => e.slots, $refs: (e) => e.refs, - $parent: (e) => mi(e.parent), - $root: (e) => mi(e.root), + $parent: (e) => bi(e.parent), + $root: (e) => bi(e.root), $host: (e) => e.ce, $emit: (e) => e.emit, - $options: (e) => wi(e), + $options: (e) => ji(e), $forceUpdate: (e) => e.f ||= () => { - Nn(e.update); + Fn(e.update); }, - $nextTick: (e) => e.n ||= jn.bind(e.proxy), - $watch: (e) => Qn.bind(e) -}), gi = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), _i = { + $nextTick: (e) => e.n ||= Nn.bind(e.proxy), + $watch: (e) => ir.bind(e) +}), Si = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), Ci = { get({ _: e }, n) { if (n === "__v_skip") return !0; let { ctx: r, setupState: i, data: a, props: o, accessCache: s, type: c, appContext: l } = e; @@ -1736,39 +1816,42 @@ var mi = (e) => e ? ro(e) ? fo(e) : mi(e.parent) : null, hi = /* @__PURE__ */ s( case 4: return r[n]; case 3: return o[n]; } - else if (gi(i, n)) return s[n] = 1, i[n]; + else if (Si(i, n)) return s[n] = 1, i[n]; else if (a !== t && u(a, n)) return s[n] = 2, a[n]; else if (u(o, n)) return s[n] = 3, o[n]; else if (r !== t && u(r, n)) return s[n] = 4, r[n]; - else yi && (s[n] = 0); + else Ei && (s[n] = 0); } - let d = hi[n], f, p; - if (d) return n === "$attrs" && st(e.attrs, "get", ""), d(e); + let d = xi[n], f, p; + if (d) return n === "$attrs" && ot(e.attrs, "get", ""), d(e); if ((f = c.__cssModules) && (f = f[n])) return f; if (r !== t && u(r, n)) return s[n] = 4, r[n]; if (p = l.config.globalProperties, u(p, n)) return p[n]; }, set({ _: e }, n, r) { let { data: i, setupState: a, ctx: o } = e; - return gi(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); + return Si(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); }, has({ _: { data: e, setupState: n, accessCache: r, ctx: i, appContext: a, props: o, type: s } }, c) { let l; - return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || gi(n, c) || u(o, c) || u(i, c) || u(hi, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); + return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || Si(n, c) || u(o, c) || u(i, c) || u(xi, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); }, defineProperty(e, t, n) { return n.get == null ? u(n, "value") && this.set(e, t, n.value, null) : e._.accessCache[t] = 0, Reflect.defineProperty(e, t, n); } }; -function vi(e) { +function wi(e) { return d(e) ? e.reduce((e, t) => (e[t] = null, e), {}) : e; } -var yi = !0; -function bi(e) { - let t = wi(e), n = e.proxy, i = e.ctx; - yi = !1, t.beforeCreate && Si(t.beforeCreate, e, "bc"); - let { data: a, computed: o, methods: s, watch: c, provide: l, inject: u, created: f, beforeMount: p, mounted: m, beforeUpdate: g, updated: _, activated: y, deactivated: b, beforeDestroy: x, beforeUnmount: S, destroyed: C, unmounted: w, render: ee, renderTracked: te, renderTriggered: ne, errorCaptured: T, serverPrefetch: re, expose: E, inheritAttrs: ie, components: ae, directives: oe, filters: se } = t; - if (u && xi(u, i, null), s) for (let e in s) { +function Ti(e, t) { + return !e || !t ? e || t : d(e) && d(t) ? e.concat(t) : s({}, wi(e), wi(t)); +} +var Ei = !0; +function Di(e) { + let t = ji(e), n = e.proxy, i = e.ctx; + Ei = !1, t.beforeCreate && ki(t.beforeCreate, e, "bc"); + let { data: a, computed: o, methods: s, watch: c, provide: l, inject: u, created: f, beforeMount: p, mounted: m, beforeUpdate: g, updated: _, activated: y, deactivated: b, beforeDestroy: x, beforeUnmount: S, destroyed: C, unmounted: w, render: ee, renderTracked: te, renderTriggered: ne, errorCaptured: T, serverPrefetch: re, expose: E, inheritAttrs: ie, components: ae, directives: D, filters: oe } = t; + if (u && Oi(u, i, null), s) for (let e in s) { let t = s[e]; h(t) && (i[e] = t.bind(n)); } @@ -1776,8 +1859,8 @@ function bi(e) { let t = a.call(n, n); v(t) && (e.data = /* @__PURE__ */ Ut(t)); } - if (yi = !0, o) for (let e in o) { - let t = o[e], a = ho({ + if (Ei = !0, o) for (let e in o) { + let t = o[e], a = To({ get: h(t) ? t.bind(n, n) : h(t.get) ? t.get.bind(n, n) : r, set: !h(t) && h(t.set) ? t.set.bind(n) : r }); @@ -1788,18 +1871,18 @@ function bi(e) { set: (e) => a.value = e }); } - if (c) for (let e in c) Ci(c[e], i, n, e); + if (c) for (let e in c) Ai(c[e], i, n, e); if (l) { let e = h(l) ? l.call(n) : l; Reflect.ownKeys(e).forEach((t) => { - Wn(t, e[t]); + Yn(t, e[t]); }); } - f && Si(f, e, "c"); - function ce(e, t) { + f && ki(f, e, "c"); + function se(e, t) { d(t) ? t.forEach((t) => e(t.bind(n))) : t && e(t.bind(n)); } - if (ce(Jr, p), ce(Yr, m), ce(Xr, g), ce(Zr, _), ce(Hr, y), ce(Ur, b), ce(ri, T), ce(ni, te), ce(ti, ne), ce(Qr, S), ce($r, w), ce(ei, re), d(E)) { + if (se(ei, p), se(ti, m), se(ni, g), se(ri, _), se(Jr, y), se(Yr, b), se(li, T), se(ci, te), se(si, ne), se(ii, S), se(ai, w), se(oi, re), d(E)) { if (E.length) { let t = e.exposed ||= {}; E.forEach((e) => { @@ -1811,13 +1894,13 @@ function bi(e) { }); } else e.exposed ||= {}; } - ee && e.render === r && (e.render = ee), ie != null && (e.inheritAttrs = ie), ae && (e.components = ae), oe && (e.directives = oe), re && jr(e); + ee && e.render === r && (e.render = ee), ie != null && (e.inheritAttrs = ie), ae && (e.components = ae), D && (e.directives = D), re && Lr(e); } -function xi(e, t, n = r) { - d(e) && (e = ki(e)); +function Oi(e, t, n = r) { + d(e) && (e = Ii(e)); for (let n in e) { let r = e[n], i; - i = v(r) ? "default" in r ? Gn(r.from || n, r.default, !0) : Gn(r.from || n) : Gn(r), /* @__PURE__ */ M(i) ? Object.defineProperty(t, n, { + i = v(r) ? "default" in r ? Xn(r.from || n, r.default, !0) : Xn(r.from || n) : Xn(r), /* @__PURE__ */ N(i) ? Object.defineProperty(t, n, { enumerable: !0, configurable: !0, get: () => i.value, @@ -1825,71 +1908,71 @@ function xi(e, t, n = r) { }) : t[n] = i; } } -function Si(e, t, n) { - xn(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); +function ki(e, t, n) { + Cn(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); } -function Ci(e, t, n, r) { - let i = r.includes(".") ? $n(n, r) : () => n[r]; +function Ai(e, t, n, r) { + let i = r.includes(".") ? ar(n, r) : () => n[r]; if (g(e)) { let n = t[e]; - h(n) && Xn(i, n); - } else if (h(e)) Xn(i, e.bind(n)); + h(n) && nr(i, n); + } else if (h(e)) nr(i, e.bind(n)); else if (v(e)) { - if (d(e)) e.forEach((e) => Ci(e, t, n, r)); + if (d(e)) e.forEach((e) => Ai(e, t, n, r)); else { let r = h(e.handler) ? e.handler.bind(n) : t[e.handler]; - h(r) && Xn(i, r, e); + h(r) && nr(i, r, e); } } } -function wi(e) { +function ji(e) { let t = e.type, { mixins: n, extends: r } = t, { mixins: i, optionsCache: a, config: { optionMergeStrategies: o } } = e.appContext, s = a.get(t), c; - return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => Ti(c, e, o, !0)), Ti(c, t, o)), v(t) && a.set(t, c), c; + return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => Mi(c, e, o, !0)), Mi(c, t, o)), v(t) && a.set(t, c), c; } -function Ti(e, t, n, r = !1) { +function Mi(e, t, n, r = !1) { let { mixins: i, extends: a } = t; - a && Ti(e, a, n, !0), i && i.forEach((t) => Ti(e, t, n, !0)); + a && Mi(e, a, n, !0), i && i.forEach((t) => Mi(e, t, n, !0)); for (let i in t) if (!(r && i === "expose")) { - let r = Ei[i] || n && n[i]; + let r = Ni[i] || n && n[i]; e[i] = r ? r(e[i], t[i]) : t[i]; } return e; } -var Ei = { - data: Di, - props: Mi, - emits: Mi, - methods: ji, - computed: ji, - beforeCreate: Ai, - created: Ai, - beforeMount: Ai, - mounted: Ai, - beforeUpdate: Ai, - updated: Ai, - beforeDestroy: Ai, - beforeUnmount: Ai, - destroyed: Ai, - unmounted: Ai, - activated: Ai, - deactivated: Ai, - errorCaptured: Ai, - serverPrefetch: Ai, - components: ji, - directives: ji, - watch: Ni, - provide: Di, - inject: Oi +var Ni = { + data: Pi, + props: zi, + emits: zi, + methods: Ri, + computed: Ri, + beforeCreate: Li, + created: Li, + beforeMount: Li, + mounted: Li, + beforeUpdate: Li, + updated: Li, + beforeDestroy: Li, + beforeUnmount: Li, + destroyed: Li, + unmounted: Li, + activated: Li, + deactivated: Li, + errorCaptured: Li, + serverPrefetch: Li, + components: Ri, + directives: Ri, + watch: Bi, + provide: Pi, + inject: Fi }; -function Di(e, t) { +function Pi(e, t) { return t ? e ? function() { return s(h(e) ? e.call(this, this) : e, h(t) ? t.call(this, this) : t); } : t : e; } -function Oi(e, t) { - return ji(ki(e), ki(t)); +function Fi(e, t) { + return Ri(Ii(e), Ii(t)); } -function ki(e) { +function Ii(e) { if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) t[e[n]] = e[n]; @@ -1897,23 +1980,23 @@ function ki(e) { } return e; } -function Ai(e, t) { +function Li(e, t) { return e ? [...new Set([].concat(e, t))] : t; } -function ji(e, t) { +function Ri(e, t) { return e ? s(/* @__PURE__ */ Object.create(null), e, t) : t; } -function Mi(e, t) { - return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), vi(e), vi(t ?? {})) : t; +function zi(e, t) { + return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), wi(e), wi(t ?? {})) : t; } -function Ni(e, t) { +function Bi(e, t) { if (!e) return t; if (!t) return e; let n = s(/* @__PURE__ */ Object.create(null), e); - for (let r in t) n[r] = Ai(e[r], t[r]); + for (let r in t) n[r] = Li(e[r], t[r]); return n; } -function Pi() { +function Vi() { return { app: null, config: { @@ -1934,18 +2017,18 @@ function Pi() { emitsCache: /* @__PURE__ */ new WeakMap() }; } -var Fi = 0; -function Ii(e, t) { +var Hi = 0; +function Ui(e, t) { return function(n, r = null) { h(n) || (n = s({}, n)), r != null && !v(r) && (r = null); - let i = Pi(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { - _uid: Fi++, + let i = Vi(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { + _uid: Hi++, _component: n, _props: r, _container: null, _context: i, _instance: null, - version: _o, + version: Do, get config() { return i.config; }, @@ -1964,126 +2047,168 @@ function Ii(e, t) { }, mount(a, o, s) { if (!c) { - let u = l._ceVNode || H(n, r); - return u.appContext = i, s === !0 ? s = "svg" : s === !1 && (s = void 0), o && t ? t(u, a) : e(u, a, s), c = !0, l._container = a, a.__vue_app__ = l, fo(u.component); + let u = l._ceVNode || U(n, r); + return u.appContext = i, s === !0 ? s = "svg" : s === !1 && (s = void 0), o && t ? t(u, a) : e(u, a, s), c = !0, l._container = a, a.__vue_app__ = l, So(u.component); } }, onUnmount(e) { o.push(e); }, unmount() { - c && (xn(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); + c && (Cn(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); }, provide(e, t) { return i.provides[e] = t, l; }, runWithContext(e) { - let t = Li; - Li = l; + let t = Wi; + Wi = l; try { return e(); } finally { - Li = t; + Wi = t; } } }; return l; }; } -var Li = null, Ri = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${T(t)}Modifiers`] || e[`${E(t)}Modifiers`]; -function zi(e, n, ...r) { +var Wi = null; +function Gi(e, n, r = t) { + let i = co(), a = T(n), o = E(n), s = Ki(e, a), c = un((s, c) => { + let l, u = t, d; + return tr(() => { + let t = e[a]; + D(l, t) && (l = t, c()); + }), { + get() { + return s(), r.get ? r.get(l) : l; + }, + set(e) { + let s = r.set ? r.set(e) : e; + if (!D(s, l) && !(u !== t && D(e, u))) return; + let f = i.vnode.props, p = !!(f && (n in f || a in f || o in f) && (`onUpdate:${n}` in f || `onUpdate:${a}` in f || `onUpdate:${o}` in f)); + p || (l = e, c()), i.emit(`update:${n}`, s), D(e, u) && (D(e, s) && !D(s, d) || p && u !== t && !D(s, l)) && c(), u = e, d = s; + } + }; + }); + return c[Symbol.iterator] = () => { + let e = 0; + return { next() { + return e < 2 ? { + value: e++ ? s || t : c, + done: !1 + } : { done: !0 }; + } }; + }, c; +} +var Ki = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${T(t)}Modifiers`] || e[`${E(t)}Modifiers`]; +function qi(e, n, ...r) { if (e.isUnmounted) return; - let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && Ri(i, n.slice(7)); - s && (s.trim && (a = r.map((e) => g(e) ? e.trim() : e)), s.number && (a = a.map(le))); + let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && Ki(i, n.slice(7)); + s && (s.trim && (a = r.map((e) => g(e) ? e.trim() : e)), s.number && (a = a.map(ce))); let c, l = i[c = ae(n)] || i[c = ae(T(n))]; - !l && o && (l = i[c = ae(E(n))]), l && xn(l, e, 6, a); + !l && o && (l = i[c = ae(E(n))]), l && Cn(l, e, 6, a); let u = i[c + "Once"]; if (u) { if (!e.emitted) e.emitted = {}; else if (e.emitted[c]) return; - e.emitted[c] = !0, xn(u, e, 6, a); + e.emitted[c] = !0, Cn(u, e, 6, a); } } -var Bi = /* @__PURE__ */ new WeakMap(); -function Vi(e, t, n = !1) { - let r = n ? Bi : t.emitsCache, i = r.get(e); +var Ji = /* @__PURE__ */ new WeakMap(); +function Yi(e, t, n = !1) { + let r = n ? Ji : t.emitsCache, i = r.get(e); if (i !== void 0) return i; let a = e.emits, o = {}, c = !1; if (!h(e)) { let r = (e) => { - let n = Vi(e, t, !0); + let n = Yi(e, t, !0); n && (c = !0, s(o, n)); }; !n && t.mixins.length && t.mixins.forEach(r), e.extends && r(e.extends), e.mixins && e.mixins.forEach(r); } return !a && !c ? (v(e) && r.set(e, null), null) : (d(a) ? a.forEach((e) => o[e] = null) : s(o, a), v(e) && r.set(e, o), o); } -function Hi(e, t) { +function Xi(e, t) { return !e || !a(t) ? !1 : (t = t.slice(2), t = t === "Once" ? t : t.replace(/Once$/, ""), u(e, t[0].toLowerCase() + t.slice(1)) || u(e, E(t)) || u(e, t)); } -function Ui(e) { - let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = Vn(e), v, y; +function Zi(e) { + let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = Kn(e), v, y; try { if (n.shapeFlag & 4) { let e = i || r, t = e; - v = Wa(u.call(t, e, d, f, m, p, h)), y = c; + v = $a(u.call(t, e, d, f, m, p, h)), y = c; } else { let e = t; - v = Wa(e.length > 1 ? e(f, { + v = $a(e.length > 1 ? e(f, { attrs: c, slots: s, emit: l - }) : e(f, null)), y = t.props ? c : Wi(c); + }) : e(f, null)), y = t.props ? c : $i(c); } } catch (t) { - Aa.length = 0, Sn(t, e, 1), v = H(Oa); + Ra.length = 0, wn(t, e, 1), v = U(R); } let b = v; if (y && g !== !1) { let e = Object.keys(y), { shapeFlag: t } = b; - e.length && t & 7 && (a && e.some(o) && (y = Gi(y, a)), b = Ha(b, y, !1, !0)); + e.length && t & 7 && (a && e.some(o) && (y = ea(y, a)), b = Xa(b, y, !1, !0)); } - return n.dirs && (b = Ha(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Dr(nr(b.type) && Er(b) || b, n.transition), v = b, Vn(_), v; + return n.dirs && (b = Xa(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Mr(cr(b.type) && jr(b) || b, n.transition), v = b, Kn(_), v; } -var Wi = (e) => { +function Qi(e, t = !0) { + let n; + for (let t = 0; t < e.length; t++) { + let r = e[t]; + if (Wa(r)) { + if (r.type !== R || r.children === "v-if") { + if (n) return; + n = r; + } + } else return; + } + return n; +} +var $i = (e) => { let t; for (let n in e) (n === "class" || n === "style" || a(n)) && ((t ||= {})[n] = e[n]); return t; -}, Gi = (e, t) => { +}, ea = (e, t) => { let n = {}; for (let r in e) o(r) && r.slice(9) in t || (n[r] = e[r]); return n; }; -function Ki(e, t, n) { +function ta(e, t, n) { let { props: r, children: i, component: a } = e, { props: o, children: s, patchFlag: c } = t, l = a.emitsOptions; if (t.dirs || t.transition) return !0; if (n && c >= 0) { if (c & 1024) return !0; - if (c & 16) return r ? qi(r, o, l) : !!o; + if (c & 16) return r ? na(r, o, l) : !!o; if (c & 8) { let e = t.dynamicProps; for (let t = 0; t < e.length; t++) { let n = e[t]; - if (Ji(o, r, n) && !Hi(l, n)) return !0; + if (ra(o, r, n) && !Xi(l, n)) return !0; } } - } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? !o || qi(r, o, l) : !!o; + } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? !o || na(r, o, l) : !!o; return !1; } -function qi(e, t, n) { +function na(e, t, n) { let r = Object.keys(t); if (r.length !== Object.keys(e).length) return !0; for (let i = 0; i < r.length; i++) { let a = r[i]; - if (Ji(t, e, a) && !Hi(n, a)) return !0; + if (!u(e, a) || ra(t, e, a) && !Xi(n, a)) return !0; } return !1; } -function Ji(e, t, n) { +function ra(e, t, n) { let r = e[n], i = t[n]; - return n === "style" && v(r) && v(i) ? !Te(r, i) : r !== i; + return n === "style" && v(r) && v(i) ? !we(r, i) : r !== i; } -function Yi({ vnode: e, parent: t, suspense: n }, r) { +function ia({ vnode: e, parent: t, suspense: n }, r) { for (; t;) { let n = t.subTree; if (n.suspense && n.suspense.activeBranch === e && (n.suspense.vnode.el = n.el = r, e = n), n === e) (e = t.vnode).el = r, t = t.parent; @@ -2091,56 +2216,56 @@ function Yi({ vnode: e, parent: t, suspense: n }, r) { } n && n.activeBranch === e && (n.vnode.el = r); } -var Xi = {}, Zi = () => Object.create(Xi), Qi = (e) => Object.getPrototypeOf(e) === Xi; -function $i(e, t, n, r = !1) { - let i = {}, a = Zi(); - e.propsDefaults = /* @__PURE__ */ Object.create(null), ta(e, t, i, a); +var aa = {}, oa = () => Object.create(aa), sa = (e) => Object.getPrototypeOf(e) === aa; +function ca(e, t, n, r = !1) { + let i = {}, a = oa(); + e.propsDefaults = /* @__PURE__ */ Object.create(null), ua(e, t, i, a); for (let t in e.propsOptions[0]) t in i || (i[t] = void 0); e.props = n ? r ? i : /* @__PURE__ */ Wt(i) : e.type.props ? i : a, e.attrs = a; } -function ea(e, t, n, r) { - let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ j(i), [c] = e.propsOptions, l = !1; +function la(e, t, n, r) { + let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ M(i), [c] = e.propsOptions, l = !1; if ((r || o > 0) && !(o & 16)) { if (o & 8) { let n = e.vnode.dynamicProps; for (let r = 0; r < n.length; r++) { let o = n[r]; - if (Hi(e.emitsOptions, o)) continue; + if (Xi(e.emitsOptions, o)) continue; let d = t[o]; if (c) { if (u(a, o)) d !== a[o] && (a[o] = d, l = !0); else { let t = T(o); - i[t] = na(c, s, t, d, e, !1); + i[t] = da(c, s, t, d, e, !1); } } else d !== a[o] && (a[o] = d, l = !0); } } } else { - ta(e, t, i, a) && (l = !0); + ua(e, t, i, a) && (l = !0); let r; - for (let a in s) t && (u(t, a) || (r = E(a)) !== a && u(t, r)) || (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = na(c, s, a, void 0, e, !0)) : delete i[a]); + for (let a in s) t && (u(t, a) || (r = E(a)) !== a && u(t, r)) || (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = da(c, s, a, void 0, e, !0)) : delete i[a]); if (a !== s) for (let e in a) t && u(t, e) || (delete a[e], l = !0); } - l && ct(e.attrs, "set", ""); + l && st(e.attrs, "set", ""); } -function ta(e, n, r, i) { +function ua(e, n, r, i) { let [a, o] = e.propsOptions, s = !1, c; if (n) for (let t in n) { if (ee(t)) continue; let l = n[t], d; - a && u(a, d = T(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : Hi(e.emitsOptions, t) || t in i && l === i[t] || (i[t] = l, s = !0); + a && u(a, d = T(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : Xi(e.emitsOptions, t) || t in i && l === i[t] || (i[t] = l, s = !0); } if (o) { - let n = /* @__PURE__ */ j(r), i = c || t; + let n = /* @__PURE__ */ M(r), i = c || t; for (let t = 0; t < o.length; t++) { let s = o[t]; - r[s] = na(a, n, s, i[s], e, !u(i, s)); + r[s] = da(a, n, s, i[s], e, !u(i, s)); } } return s; } -function na(e, t, n, r, i, a) { +function da(e, t, n, r, i, a) { let o = e[n]; if (o != null) { let e = u(o, "default"); @@ -2150,7 +2275,7 @@ function na(e, t, n, r, i, a) { let { propsDefaults: a } = i; if (n in a) r = a[n]; else { - let o = to(i); + let o = fo(i); r = a[n] = e.call(null, t), o(); } } else r = e; @@ -2160,15 +2285,15 @@ function na(e, t, n, r, i, a) { } return r; } -var ra = /* @__PURE__ */ new WeakMap(); -function ia(e, r, i = !1) { - let a = i ? ra : r.propsCache, o = a.get(e); +var fa = /* @__PURE__ */ new WeakMap(); +function pa(e, r, i = !1) { + let a = i ? fa : r.propsCache, o = a.get(e); if (o) return o; let c = e.props, l = {}, f = [], p = !1; if (!h(e)) { let t = (e) => { p = !0; - let [t, n] = ia(e, r, !0); + let [t, n] = pa(e, r, !0); s(l, t), n && f.push(...n); }; !i && r.mixins.length && r.mixins.forEach(t), e.extends && t(e.extends), e.mixins && e.mixins.forEach(t); @@ -2176,11 +2301,11 @@ function ia(e, r, i = !1) { if (!c && !p) return v(e) && a.set(e, n), n; if (d(c)) for (let e = 0; e < c.length; e++) { let n = T(c[e]); - aa(n) && (l[n] = t); + ma(n) && (l[n] = t); } else if (c) for (let e in c) { let t = T(e); - if (aa(t)) { + if (ma(t)) { let n = c[e], r = l[t] = d(n) || h(n) ? { type: n } : s({}, n), i = r.type, a = !1, o = !0; if (d(i)) for (let e = 0; e < i.length; ++e) { let t = i[e], n = h(t) && t.name; @@ -2197,69 +2322,69 @@ function ia(e, r, i = !1) { let m = [l, f]; return v(e) && a.set(e, m), m; } -function aa(e) { +function ma(e) { return e[0] !== "$" && !ee(e); } -var oa = (e) => e === "_" || e === "_ctx" || e === "$stable", sa = (e) => d(e) ? e.map(Wa) : [Wa(e)], ca = (e, t, n) => { +var ha = (e) => e === "_" || e === "_ctx" || e === "$stable", ga = (e) => d(e) ? e.map($a) : [$a(e)], _a = (e, t, n) => { if (t._n) return t; - let r = P((...e) => sa(t(...e)), n); + let r = P((...e) => ga(t(...e)), n); return r._c = !1, r; -}, la = (e, t, n) => { +}, va = (e, t, n) => { let r = e._ctx; for (let n in e) { - if (oa(n)) continue; + if (ha(n)) continue; let i = e[n]; - if (h(i)) t[n] = ca(n, i, r); + if (h(i)) t[n] = _a(n, i, r); else if (i != null) { - let e = sa(i); + let e = ga(i); t[n] = () => e; } } -}, ua = (e, t) => { - let n = sa(t); +}, ya = (e, t) => { + let n = ga(t); e.slots.default = () => n; -}, da = (e, t, n) => { - for (let r in t) (n || !oa(r)) && (e[r] = t[r]); -}, fa = (e, t, n) => { - let r = e.slots = Zi(); +}, ba = (e, t, n) => { + for (let r in t) (n || !ha(r)) && (e[r] = t[r]); +}, xa = (e, t, n) => { + let r = e.slots = oa(); if (e.vnode.shapeFlag & 32) { let e = t._; - e ? (da(r, t, n), n && ce(r, "_", e, !0)) : la(t, r); - } else t && ua(e, t); -}, pa = (e, n, r) => { + e ? (ba(r, t, n), n && se(r, "_", e, !0)) : va(t, r); + } else t && ya(e, t); +}, Sa = (e, n, r) => { let { vnode: i, slots: a } = e, o = !0, s = t; if (i.shapeFlag & 32) { let e = n._; - e ? r && e === 1 ? o = !1 : da(a, n, r) : (o = !n.$stable, la(n, a)), s = n; - } else n && (ua(e, n), s = { default: 1 }); - if (o) for (let e in a) !oa(e) && s[e] == null && delete a[e]; -}, ma = Ea; -function ha(e) { - return ga(e); + e ? r && e === 1 ? o = !1 : ba(a, n, r) : (o = !n.$stable, va(n, a)), s = n; + } else n && (ya(e, n), s = { default: 1 }); + if (o) for (let e in a) !ha(e) && s[e] == null && delete a[e]; +}, Ca = Fa; +function wa(e) { + return Ta(e); } -function ga(e, i) { - let a = fe(); +function Ta(e, i) { + let a = de(); a.__VUE__ = !0; let { insert: o, remove: s, patchProp: c, createElement: l, createText: u, createComment: d, setText: f, setElementText: p, parentNode: m, nextSibling: h, setScopeId: g = r, insertStaticContent: _ } = e, v = (e, t, r, i = null, a = null, o = null, s = void 0, c = null, l = !!t.dynamicChildren) => { if (e === t) return; - e && !La(e, t) && (i = xe(e), _e(e, a, o, !0), e = null), t.patchFlag === -2 && (l = !1, t.dynamicChildren = null), t.dynamicChildren && e && e.dynamicChildren && e.dynamicChildren.hasOnce && (t.dynamicChildren === n && (t.dynamicChildren = []), t.dynamicChildren.hasOnce = !0); + e && !Ga(e, t) && (i = be(e), ge(e, a, o, !0), e = null), t.patchFlag === -2 && (l = !1, t.dynamicChildren = null), t.dynamicChildren && e && e.dynamicChildren && e.dynamicChildren.hasOnce && (t.dynamicChildren === n && (t.dynamicChildren = []), t.dynamicChildren.hasOnce = !0); let { type: u, ref: d, shapeFlag: f } = t; switch (u) { - case Da: + case Ia: y(e, t, r, i); break; - case Oa: + case R: b(e, t, r, i); break; - case ka: + case La: e ?? x(t, r, i, s); break; case L: ae(e, t, r, i, a, o, s, c, l); break; - default: f & 1 ? w(e, t, r, i, a, o, s, c, l) : f & 6 ? oe(e, t, r, i, a, o, s, c, l) : (f & 64 || f & 128) && u.process(e, t, r, i, a, o, s, c, l, we); + default: f & 1 ? w(e, t, r, i, a, o, s, c, l) : f & 6 ? D(e, t, r, i, a, o, s, c, l) : (f & 64 || f & 128) && u.process(e, t, r, i, a, o, s, c, l, Se); } - d != null && a ? Pr(d, e && e.ref, o, t || e, !t) : d == null && e && e.ref != null && Pr(e.ref, null, o, e, !0); + d != null && a ? Br(d, e && e.ref, o, t || e, !t) : d == null && e && e.ref != null && Br(e.ref, null, o, e, !0); }, y = (e, t, n, r) => { if (e == null) o(t.el = u(t.children), n, r); else { @@ -2290,36 +2415,36 @@ function ga(e, i) { } }, te = (e, t, n, r, i, a, s, u) => { let d, f, { props: m, shapeFlag: h, transition: g, dirs: _ } = e; - if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && T(e.children, d, null, r, i, _a(e, a), s, u), _ && Un(e, null, r, "created"), ne(d, e, e.scopeId, s, r), m) { + if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && T(e.children, d, null, r, i, Ea(e, a), s, u), _ && Jn(e, null, r, "created"), ne(d, e, e.scopeId, s, r), m) { for (let e in m) e !== "value" && !ee(e) && c(d, e, null, m[e], a, r); - "value" in m && c(d, "value", null, m.value, a), (f = m.onVnodeBeforeMount) && qa(f, r, e); + "value" in m && c(d, "value", null, m.value, a), (f = m.onVnodeBeforeMount) && no(f, r, e); } - _ && Un(e, null, r, "beforeMount"); - let v = ya(i, g); - v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && ma(() => { + _ && Jn(e, null, r, "beforeMount"); + let v = Oa(i, g); + v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && Ca(() => { try { - f && qa(f, r, e), v && g.enter(d), _ && Un(e, null, r, "mounted"); + f && no(f, r, e), v && g.enter(d), _ && Jn(e, null, r, "mounted"); } finally {} }, i); }, ne = (e, t, n, r, i) => { if (n && g(e, n), r) for (let t = 0; t < r.length; t++) g(e, r[t]); if (i) { let n = i.subTree; - if (t === n || Ta(n.type) && (n.ssContent === t || n.ssFallback === t)) { + if (t === n || Pa(n.type) && (n.ssContent === t || n.ssFallback === t)) { let t = i.vnode; ne(e, t, t.scopeId, t.slotScopeIds, i.parent); } } }, T = (e, t, n, r, i, a, o, s, c = 0) => { for (let l = c; l < e.length; l++) { - let c = e[l] = s ? Ga(e[l]) : Wa(e[l]); + let c = e[l] = s ? eo(e[l]) : $a(e[l]); v(null, c, t, n, r, i, a, o, s); } }, re = (e, n, r, i, a, o, s) => { let l = n.el = e.el, { patchFlag: u, dynamicChildren: d, dirs: f } = n; u |= e.patchFlag & 16; let m = e.props || t, h = n.props || t, g; - if (r && va(r, !1), (g = h.onVnodeBeforeUpdate) && qa(g, r, n, e), f && Un(n, e, r, "beforeUpdate"), r && va(r, !0), d && (!e.dynamicChildren || e.dynamicChildren.length !== d.length) && (u = 0, s = !1, d = null), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? E(e.dynamicChildren, d, l, r, i, _a(n, a), o) : s || pe(e, n, l, null, r, i, _a(n, a), o, !1), u > 0) { + if (r && Da(r, !1), (g = h.onVnodeBeforeUpdate) && no(g, r, n, e), f && Jn(n, e, r, "beforeUpdate"), r && Da(r, !0), d && (!e.dynamicChildren || e.dynamicChildren.length !== d.length) && (u = 0, s = !1, d = null), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? E(e.dynamicChildren, d, l, r, i, Ea(n, a), o) : s || fe(e, n, l, null, r, i, Ea(n, a), o, !1), u > 0) { if (u & 16) ie(l, m, h, r, a); else if (u & 2 && m.class !== h.class && c(l, "class", null, h.class, a), u & 4 && c(l, "style", m.style, h.style, a), u & 8) { let e = n.dynamicProps; @@ -2330,13 +2455,13 @@ function ga(e, i) { } u & 1 && e.children !== n.children && p(l, n.children); } else !s && d == null && ie(l, m, h, r, a); - ((g = h.onVnodeUpdated) || f) && ma(() => { - g && qa(g, r, n, e), f && Un(n, e, r, "updated"); + ((g = h.onVnodeUpdated) || f) && Ca(() => { + g && no(g, r, n, e), f && Jn(n, e, r, "updated"); }, i); }, E = (e, t, n, r, i, a, o) => { for (let s = 0; s < t.length; s++) { - let c = e[s], l = t[s], u = c.el && (c.type === L || !La(c, l) || c.shapeFlag & 198) ? m(c.el) : n; - v(c, l, u, null, r, i, a, o, !0); + let c = e[s], l = t[s], u = c.el || Na(c), d = u && (c.type === L || !Ga(c, l) || c.shapeFlag & 198) ? m(u) : n; + v(c, l, d, null, r, i, a, o, !0); } }, ie = (e, n, r, i, a) => { if (n !== r) { @@ -2350,35 +2475,35 @@ function ga(e, i) { } }, ae = (e, t, n, r, i, a, s, c, l) => { let d = t.el = e ? e.el : u(""), f = t.anchor = e ? e.anchor : u(""), { patchFlag: p, dynamicChildren: m, slotScopeIds: h } = t; - h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), T(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (E(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && ba(e, t, !0)) : pe(e, t, n, f, i, a, s, c, l); - }, oe = (e, t, n, r, i, a, o, s, c) => { - t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : ce(t, n, r, i, a, o, c) : le(e, t, c); - }, ce = (e, t, n, r, i, a, o) => { - let s = e.component = Xa(e, r, i); - if (Vr(e) && (s.ctx.renderer = we), ao(s, !1, o), s.asyncDep) { - if (i && i.registerDep(s, ue, o), !e.el) { - let r = s.subTree = H(Oa); + h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), T(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (E(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && ka(e, t, !0)) : fe(e, t, n, f, i, a, s, c, l); + }, D = (e, t, n, r, i, a, o, s, c) => { + t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : se(t, n, r, i, a, o, c) : ce(e, t, c); + }, se = (e, t, n, r, i, a, o) => { + let s = e.component = oo(e, r, i); + if (qr(e) && (s.ctx.renderer = Se), go(s, !1, o), s.asyncDep) { + if (i && i.registerDep(s, le, o, a), !e.el) { + let r = s.subTree = U(R); b(null, r, t, n), e.placeholder = r.el; } - } else ue(s, e, t, n, i, a, o); - }, le = (e, t, n) => { + } else le(s, e, t, n, i, a, o); + }, ce = (e, t, n) => { let r = t.component = e.component; - if (Ki(e, t, n)) { + if (ta(e, t, n)) { if (r.asyncDep && !r.asyncResolved) { - t.el = e.el, de(r, t, n); + t.el = e.el, t.placeholder = e.placeholder, ue(r, t, n); return; } r.next = t, r.update(); - } else t.el = e.el, r.vnode = t; - }, ue = (e, t, n, r, i, a, o) => { + } else t.el = e.el, t.placeholder = e.placeholder, r.vnode = t; + }, le = (e, t, n, r, i, a, o) => { let s = () => { if (e.isMounted) { let { next: t, bu: n, u: r, parent: s, vnode: c } = e; { - let n = Sa(e); + let n = ja(e); if (n) { - t && (t.el = c.el, de(e, t, o)), n.asyncDep.then(() => { - ma(() => { + t && (t.el = c.el, ue(e, t, o)), n.asyncDep.then(() => { + Ca(() => { e.isUnmounted || l(); }, i); }); @@ -2386,82 +2511,82 @@ function ga(e, i) { } } let u = t, d; - va(e, !1), t ? (t.el = c.el, de(e, t, o)) : t = c, n && se(n), (d = t.props && t.props.onVnodeBeforeUpdate) && qa(d, s, t, c), va(e, !0); - let f = Ui(e), p = e.subTree; - e.subTree = f, v(p, f, m(p.el), xe(p), e, i, a), t.el = f.el, u === null && Yi(e, f.el), r && ma(r, i), (d = t.props && t.props.onVnodeUpdated) && ma(() => qa(d, s, t, c), i); + Da(e, !1), t ? (t.el = c.el, ue(e, t, o)) : t = c, n && oe(n), (d = t.props && t.props.onVnodeBeforeUpdate) && no(d, s, t, c), Da(e, !0); + let f = Zi(e), p = e.subTree; + e.subTree = f, v(p, f, m(p.el), be(p), e, i, a), t.el = f.el, u === null && ia(e, f.el), r && Ca(r, i), (d = t.props && t.props.onVnodeUpdated) && Ca(() => no(d, s, t, c), i); } else { - let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = Rr(t); - if (va(e, !1), l && se(l), !m && (o = c && c.onVnodeBeforeMount) && qa(o, d, t), va(e, !0), s && Ee) { + let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = Wr(t); + if (Da(e, !1), l && oe(l), !m && (o = c && c.onVnodeBeforeMount) && no(o, d, t), Da(e, !0), s && we) { let t = () => { - e.subTree = Ui(e), Ee(s, e.subTree, e, i, null); + e.subTree = Zi(e), we(s, e.subTree, e, i, null); }; m && p.__asyncHydrate ? p.__asyncHydrate(s, e, t) : t(); } else { f.ce && f.ce._hasShadowRoot() && f.ce._injectChildStyle(p, e.parent ? e.parent.type : void 0); - let o = e.subTree = Ui(e); + let o = e.subTree = Zi(e); v(null, o, n, r, e, i, a), t.el = o.el; } - if (u && ma(u, i), !m && (o = c && c.onVnodeMounted)) { + if (u && Ca(u, i), !m && (o = c && c.onVnodeMounted)) { let e = t; - ma(() => qa(o, d, e), i); + Ca(() => no(o, d, e), i); } - (t.shapeFlag & 256 || d && Rr(d.vnode) && d.vnode.shapeFlag & 256) && e.a && ma(e.a, i), e.isMounted = !0, t = n = r = null; + (t.shapeFlag & 256 || d && Wr(d.vnode) && d.vnode.shapeFlag & 256) && e.a && Ca(e.a, i), e.isMounted = !0, t = n = r = null; } }; e.scope.on(); - let c = e.effect = new Fe(s); + let c = e.effect = new Pe(s); e.scope.off(); let l = e.update = c.run.bind(c), u = e.job = c.runIfDirty.bind(c); - u.i = e, u.id = e.uid, c.scheduler = () => Nn(u), va(e, !0), l(); - }, de = (e, t, n) => { + u.i = e, u.id = e.uid, c.scheduler = () => Fn(u), Da(e, !0), l(); + }, ue = (e, t, n) => { t.component = e; let r = e.vnode.props; - e.vnode = t, e.next = null, ea(e, t.props, r, n), pa(e, t.children, n), Xe(), In(e), Ze(); - }, pe = (e, t, n, r, i, a, o, s, c = !1) => { + e.vnode = t, e.next = null, la(e, t.props, r, n), Sa(e, t.children, n), Ye(), Rn(e), Xe(); + }, fe = (e, t, n, r, i, a, o, s, c = !1) => { let l = e && e.children, u = e ? e.shapeFlag : 0, d = t.children, { patchFlag: f, shapeFlag: m } = t; if (f > 0) { if (f & 128) { - he(l, d, n, r, i, a, o, s, c); - return; - } - if (f & 256) { me(l, d, n, r, i, a, o, s, c); return; } + if (f & 256) { + pe(l, d, n, r, i, a, o, s, c); + return; + } } - m & 8 ? (u & 16 && be(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? he(l, d, n, r, i, a, o, s, c) : be(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && T(d, n, r, i, a, o, s, c)); - }, me = (e, t, r, i, a, o, s, c, l) => { + m & 8 ? (u & 16 && ye(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? me(l, d, n, r, i, a, o, s, c) : ye(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && T(d, n, r, i, a, o, s, c)); + }, pe = (e, t, r, i, a, o, s, c, l) => { e ||= n, t ||= n; let u = e.length, d = t.length, f = Math.min(u, d), p = 0; for (; p < f; p++) { - let n = t[p] = l ? Ga(t[p]) : Wa(t[p]); + let n = t[p] = l ? eo(t[p]) : $a(t[p]); v(e[p], n, r, null, a, o, s, c, l); } - u > d ? be(e, a, o, !0, !1, f) : T(t, r, i, a, o, s, c, l, f); - }, he = (e, t, r, i, a, o, s, c, l) => { + u > d ? ye(e, a, o, !0, !1, f) : T(t, r, i, a, o, s, c, l, f); + }, me = (e, t, r, i, a, o, s, c, l) => { let u = 0, d = t.length, f = e.length - 1, p = d - 1; for (; u <= f && u <= p;) { - let n = e[u], i = t[u] = l ? Ga(t[u]) : Wa(t[u]); - if (La(n, i)) v(n, i, r, null, a, o, s, c, l); + let n = e[u], i = t[u] = l ? eo(t[u]) : $a(t[u]); + if (Ga(n, i)) v(n, i, r, null, a, o, s, c, l); else break; u++; } for (; u <= f && u <= p;) { - let n = e[f], i = t[p] = l ? Ga(t[p]) : Wa(t[p]); - if (La(n, i)) v(n, i, r, null, a, o, s, c, l); + let n = e[f], i = t[p] = l ? eo(t[p]) : $a(t[p]); + if (Ga(n, i)) v(n, i, r, null, a, o, s, c, l); else break; f--, p--; } if (u > f) { if (u <= p) { let e = p + 1, n = e < d ? t[e].el : i; - for (; u <= p;) v(null, t[u] = l ? Ga(t[u]) : Wa(t[u]), r, n, a, o, s, c, l), u++; + for (; u <= p;) v(null, t[u] = l ? eo(t[u]) : $a(t[u]), r, n, a, o, s, c, l), u++; } - } else if (u > p) for (; u <= f;) _e(e[u], a, o, !0), u++; + } else if (u > p) for (; u <= f;) ge(e[u], a, o, !0), u++; else { let m = u, h = u, g = /* @__PURE__ */ new Map(); for (u = h; u <= p; u++) { - let e = t[u] = l ? Ga(t[u]) : Wa(t[u]); + let e = t[u] = l ? eo(t[u]) : $a(t[u]); e.key != null && g.set(e.key, u); } let _, y = 0, b = p - h + 1, x = !1, S = 0, C = Array(b); @@ -2469,137 +2594,138 @@ function ga(e, i) { for (u = m; u <= f; u++) { let n = e[u]; if (y >= b) { - _e(n, a, o, !0); + ge(n, a, o, !0); continue; } let i; if (n.key != null) i = g.get(n.key); - else for (_ = h; _ <= p; _++) if (C[_ - h] === 0 && La(n, t[_])) { + else for (_ = h; _ <= p; _++) if (C[_ - h] === 0 && Ga(n, t[_])) { i = _; break; } - i === void 0 ? _e(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); + i === void 0 ? ge(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); } - let w = x ? xa(C) : n; + let w = x ? Aa(C) : n; for (_ = w.length - 1, u = b - 1; u >= 0; u--) { - let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || wa(f) : i; - C[u] === 0 ? v(null, n, r, p, a, o, s, c, l) : x && (_ < 0 || u !== w[_] ? ge(n, r, p, 2) : _--); + let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || Na(f) : i; + C[u] === 0 ? v(null, n, r, p, a, o, s, c, l) : x && (_ < 0 || u !== w[_] ? he(n, r, p, 2) : _--); } } - }, ge = (e, t, n, r, i = null) => { + }, he = (e, t, n, r, i = null) => { let { el: a, type: c, transition: l, children: u, shapeFlag: d } = e; - if (d & 6) ge(e.component.subTree, t, n, r); + if (d & 6) he(e.component.subTree, t, n, r); else if (d & 128) e.suspense.move(t, n, r); - else if (d & 64) c.move(e, t, n, we); + else if (d & 64) c.move(e, t, n, Se); else if (c === L) { o(a, t, n); - for (let e = 0; e < u.length; e++) ge(u[e], t, n, r); + for (let e = 0; e < u.length; e++) he(u[e], t, n, r); o(e.anchor, t, n); - } else if (c === ka) S(e, t, n); + } else if (c === La) S(e, t, n); else if (r !== 2 && d & 1 && l) { - if (r === 0) l.persisted && !a[mr] ? o(a, t, n) : (l.beforeEnter(a), o(a, t, n), ma(() => l.enter(a), i)); + if (r === 0) l.persisted && !a[br] ? o(a, t, n) : (l.beforeEnter(a), o(a, t, n), Ca(() => l.enter(a), i)); else { let { leave: r, delayLeave: i, afterLeave: c } = l, u = () => { e.ctx.isUnmounted ? s(a) : o(a, t, n); }, d = () => { - let e = a._isLeaving || !!a[mr]; - a._isLeaving && a[mr](!0), l.persisted && !e ? u() : r(a, () => { + let e = a._isLeaving || !!a[br]; + a._isLeaving && a[br](!0), l.persisted && !e ? u() : r(a, () => { u(), c && c(); }); }; i ? i(a, u, d) : d(); } } else o(a, t, n); - }, _e = (e, t, n, r = !1, i = !1) => { + }, ge = (e, t, n, r = !1, i = !1) => { let { type: a, props: o, ref: s, children: c, dynamicChildren: l, shapeFlag: u, patchFlag: d, dirs: f, cacheIndex: p, memo: m } = e; - if ((d === -2 || l && l.hasOnce) && (i = !1), s != null && (Xe(), Pr(s, null, n, e, !0), Ze()), p == null || e.ctx && e.ctx !== t || (t.renderCache[p] = void 0), u & 256) { + if ((d === -2 || l && l.hasOnce) && (i = !1), s != null && (Ye(), Br(s, null, n, e, !0), Xe()), p == null || e.ctx && e.ctx !== t || (t.renderCache[p] = void 0), u & 256) { t.ctx.deactivate(e); return; } - let h = u & 1 && f, g = !Rr(e), _; - if (g && (_ = o && o.onVnodeBeforeUnmount) && qa(_, t, e), u & 6) ye(e.component, n, r); + let h = u & 1 && f, g = !Wr(e), _; + if (g && (_ = o && o.onVnodeBeforeUnmount) && no(_, t, e), u & 6) ve(e.component, n, r); else { if (u & 128) { e.suspense.unmount(n, r); return; } - h && Un(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, we, r) : l && !l.hasOnce && (a !== L || d > 0 && d & 64) ? be(l, t, n, !1, !0) : (a === L && d & 384 || !i && u & 16) && be(c, t, n), r && D(e); + h && Jn(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, Se, r) : l && !l.hasOnce && (a !== L || d > 0 && d & 64) ? ye(l, t, n, !1, !0) : (a === L && d & 384 || !i && u & 16) && ye(c, t, n), r && O(e); } let v = m != null && p == null; - (g && (_ = o && o.onVnodeUnmounted) || h || v) && ma(() => { - _ && qa(_, t, e), h && Un(e, null, t, "unmounted"), v && (e.el = null); + (g && (_ = o && o.onVnodeUnmounted) || h || v) && Ca(() => { + _ && no(_, t, e), h && Jn(e, null, t, "unmounted"), v && (e.el = null); }, n); - }, D = (e) => { - let { type: t, el: n, anchor: r, transition: i } = e; - if (t === L) { - ve(n, r); + }, O = (e) => { + let { type: t, el: n, anchor: r, transition: i } = e, a = t === L; + if (a && !i) { + _e(n, r); return; } - if (t === ka) { + if (t === La) { C(e), i && !i.persisted && i.afterLeave && i.afterLeave(); return; } - let a = () => { - s(n), i && !i.persisted && i.afterLeave && i.afterLeave(); + let o = a ? Pr(e) : e, c = () => { + a ? m(n) && _e(n, r) : s(n), i && !i.persisted && i.afterLeave && i.afterLeave(); }; - if (e.shapeFlag & 1 && i && !i.persisted) { - let { leave: t, delayLeave: r } = i, o = () => t(n, a); - r ? r(e.el, a, o) : o(); - } else a(); - }, ve = (e, t) => { + if (o && o.shapeFlag & 1 && i && !i.persisted) { + let { leave: e, delayLeave: t } = i, n = o.el, r = () => e(n, c); + t ? t(n, c, r) : r(); + } else c(); + }, _e = (e, t) => { let n; for (; e !== t;) n = h(e), s(e), e = n; s(t); - }, ye = (e, t, n) => { + }, ve = (e, t, n) => { let { bum: r, scope: i, job: a, subTree: o, um: s, m: c, a: l } = e; - Ca(c), Ca(l), r && se(r), i.stop(), a ? (a.flags |= 8, _e(o, e, t, n)) : e.vnode.el && o && (o.transition = e.vnode.transition, _e(o, e, t, n)), s && ma(s, t), ma(() => { + Ma(c), Ma(l), r && oe(r), i.stop(), a ? (a.flags |= 8, ge(o, e, t, n)) : e.vnode.el && o && (o.transition = e.vnode.transition, ge(o, e, t, n)), s && Ca(s, t), Ca(() => { e.isUnmounted = !0; }, t); - }, be = (e, t, n, r = !1, i = !1, a = 0) => { - for (let o = a; o < e.length; o++) _e(e[o], t, n, r, i); - }, xe = (e) => { - if (e.shapeFlag & 6) return xe(e.component.subTree); + }, ye = (e, t, n, r = !1, i = !1, a = 0) => { + for (let o = a; o < e.length; o++) ge(e[o], t, n, r, i); + }, be = (e) => { + if (e.shapeFlag & 6) return be(e.component.subTree); if (e.shapeFlag & 128) return e.suspense.next(); - let t = h(e.anchor || e.el), n = t && t[tr]; + let t = h(e.anchor || e.el), n = t && t[sr]; return n ? h(n) : t; - }, Se = !1, Ce = (e, t, n) => { - let r; - e == null ? t._vnode && (_e(t._vnode, null, null, !0), r = t._vnode.component) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e, Se ||= (Se = !0, In(r), Ln(), !1); - }, we = { + }, xe = (e, t, n) => { + Vn(() => { + e == null ? t._vnode && ge(t._vnode, null, null, !0) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e; + }, e && t._vnode ? void 0 : e && e.component ? e.component.uid : ao()); + }, Se = { p: v, - um: _e, - m: ge, - r: D, - mt: ce, + um: ge, + m: he, + r: O, + mt: se, mc: T, - pc: pe, + pc: fe, pbc: E, - n: xe, + n: be, o: e - }, Te, Ee; - return i && ([Te, Ee] = i(we)), { - render: Ce, - hydrate: Te, - createApp: Ii(Ce, Te) + }, Ce, we; + return i && ([Ce, we] = i(Se)), { + render: xe, + hydrate: Ce, + createApp: Ui(xe, Ce) }; } -function _a({ type: e, props: t }, n) { +function Ea({ type: e, props: t }, n) { return n === "svg" && e === "foreignObject" || n === "mathml" && e === "annotation-xml" && t && t.encoding && t.encoding.includes("html") ? void 0 : n; } -function va({ effect: e, job: t }, n) { +function Da({ effect: e, job: t }, n) { n ? (e.flags |= 32, t.flags |= 4) : (e.flags &= -33, t.flags &= -5); } -function ya(e, t) { +function Oa(e, t) { return (!e || e && !e.pendingBranch) && t && !t.persisted; } -function ba(e, t, n = !1) { +function ka(e, t, n = !1) { let r = e.children, i = t.children; if (d(r) && d(i)) for (let e = 0; e < r.length; e++) { let t = r[e], a = i[e]; - a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = Ga(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && ba(t, a)), a.type === Da && (a.patchFlag === -1 && (a = i[e] = Ga(a)), a.el = t.el), a.type === Oa && !a.el && (a.el = t.el); + a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = eo(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && ka(t, a)), a.type === Ia && (a.patchFlag === -1 && (a = i[e] = eo(a)), a.el = t.el), a.type === R && !a.el && (a.el = t.el); } } -function xa(e) { +function Aa(e) { let t = e.slice(), n = [0], r, i, a, o, s, c = e.length; for (r = 0; r < c; r++) { let c = e[r]; @@ -2615,63 +2741,63 @@ function xa(e) { for (a = n.length, o = n[a - 1]; a-- > 0;) n[a] = o, o = t[o]; return n; } -function Sa(e) { +function ja(e) { let t = e.subTree.component; - if (t) return t.asyncDep && !t.asyncResolved ? t : Sa(t); + if (t) return t.asyncDep && !t.asyncResolved ? t : ja(t); } -function Ca(e) { +function Ma(e) { if (e) for (let t = 0; t < e.length; t++) e[t].flags |= 8; } -function wa(e) { +function Na(e) { if (e.placeholder) return e.placeholder; let t = e.component; - return t ? wa(t.subTree) : null; + return t ? Na(t.subTree) : null; } -var Ta = (e) => e.__isSuspense; -function Ea(e, t) { - t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : Fn(e); +var Pa = (e) => e.__isSuspense; +function Fa(e, t) { + t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : Ln(e); } -var L = /* @__PURE__ */ Symbol.for("v-fgt"), Da = /* @__PURE__ */ Symbol.for("v-txt"), Oa = /* @__PURE__ */ Symbol.for("v-cmt"), ka = /* @__PURE__ */ Symbol.for("v-stc"), Aa = [], ja = null; -function R(e = !1) { - Aa.push(ja = e ? null : []); +var L = /* @__PURE__ */ Symbol.for("v-fgt"), Ia = /* @__PURE__ */ Symbol.for("v-txt"), R = /* @__PURE__ */ Symbol.for("v-cmt"), La = /* @__PURE__ */ Symbol.for("v-stc"), Ra = [], za = null; +function z(e = !1) { + Ra.push(za = e ? null : []); } -function Ma() { - Aa.pop(), ja = Aa[Aa.length - 1] || null; +function Ba() { + Ra.pop(), za = Ra[Ra.length - 1] || null; } -var Na = 1; -function Pa(e, t = !1) { - Na += e, e < 0 && ja && t && (ja.hasOnce = !0); +var Va = 1; +function Ha(e, t = !1) { + Va += e, e < 0 && za && t && (za.hasOnce = !0); } -function Fa(e) { - return e.dynamicChildren = Na > 0 ? ja || n : null, Ma(), Na > 0 && ja && ja.push(e), e; +function Ua(e) { + return e.dynamicChildren = Va > 0 ? za || n : null, Ba(), Va > 0 && za && za.push(e), e; } -function z(e, t, n, r, i, a) { - return Fa(V(e, t, n, r, i, a, !0)); +function B(e, t, n, r, i, a) { + return Ua(H(e, t, n, r, i, a, !0)); } -function B(e, t, n, r, i) { - return Fa(H(e, t, n, r, i, !0)); +function V(e, t, n, r, i) { + return Ua(U(e, t, n, r, i, !0)); } -function Ia(e) { +function Wa(e) { return e ? e.__v_isVNode === !0 : !1; } -function La(e, t) { +function Ga(e, t) { return e.type === t.type && e.key === t.key; } -var Ra = ({ key: e }) => e ?? null, za = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ M(e) || h(e) ? { - i: N, +var Ka = ({ key: e }) => e ?? null, qa = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ N(e) || h(e) ? { + i: Wn, r: e, k: t, f: !!n } : e); -function V(e, t = null, n = null, r = 0, i = null, a = e === L ? 0 : 1, o = !1, s = !1) { +function H(e, t = null, n = null, r = 0, i = null, a = e === L ? 0 : 1, o = !1, s = !1) { let c = { __v_isVNode: !0, __v_skip: !0, type: e, props: t, - key: t && Ra(t), - ref: t && za(t), - scopeId: Bn, + key: t && Ka(t), + ref: t && qa(t), + scopeId: Gn, slotScopeIds: null, children: n, component: null, @@ -2691,35 +2817,35 @@ function V(e, t = null, n = null, r = 0, i = null, a = e === L ? 0 : 1, o = !1, dynamicProps: i, dynamicChildren: null, appContext: null, - ctx: N + ctx: Wn }; - return s ? (Ka(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), Na > 0 && !o && ja && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && ja.push(c), c; + return s ? (to(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), Va > 0 && !o && za && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && za.push(c), c; } -var H = Ba; -function Ba(e, t = null, n = null, r = 0, i = null, a = !1) { - if (e && e !== oi || (e = Oa), Ia(e)) { - let r = Ha(e, t, !0); - return n && Ka(r, n), Na > 0 && !a && ja && (r.shapeFlag & 6 ? ja[ja.indexOf(e)] = r : ja.push(r)), r.patchFlag = -2, r; +var U = Ja; +function Ja(e, t = null, n = null, r = 0, i = null, a = !1) { + if (e && e !== fi || (e = R), Wa(e)) { + let r = Xa(e, t, !0); + return n && to(r, n), Va > 0 && !a && za && (r.shapeFlag & 6 ? za[za.indexOf(e)] = r : za.push(r)), r.patchFlag = -2, r; } - if (mo(e) && (e = e.__vccOpts), t) { - t = Va(t); + if (wo(e) && (e = e.__vccOpts), t) { + t = Ya(t); let { class: e, style: n } = t; - e && !g(e) && (t.class = D(e)), v(n) && (/* @__PURE__ */ Xt(n) && !d(n) && (n = s({}, n)), t.style = pe(n)); + e && !g(e) && (t.class = O(e)), v(n) && (/* @__PURE__ */ Xt(n) && !d(n) && (n = s({}, n)), t.style = fe(n)); } - let o = g(e) ? 1 : Ta(e) ? 128 : nr(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; - return V(e, t, n, r, i, o, a, !0); + let o = g(e) ? 1 : Pa(e) ? 128 : cr(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; + return H(e, t, n, r, i, o, a, !0); } -function Va(e) { - return e ? /* @__PURE__ */ Xt(e) || Qi(e) ? s({}, e) : e : null; +function Ya(e) { + return e ? /* @__PURE__ */ Xt(e) || sa(e) ? s({}, e) : e : null; } -function Ha(e, t, n = !1, r = !1) { - let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? W(i || {}, t) : i, u = { +function Xa(e, t, n = !1, r = !1) { + let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? G(i || {}, t) : i, u = { __v_isVNode: !0, __v_skip: !0, type: e.type, props: l, - key: l && Ra(l), - ref: t && t.ref ? n && a ? d(a) ? a.concat(za(t)) : [a, za(t)] : za(t) : a, + key: l && Ka(l), + ref: t && t.ref ? n && a ? d(a) ? a.concat(qa(t)) : [a, qa(t)] : qa(t) : a, scopeId: e.scopeId, slotScopeIds: e.slotScopeIds, children: s, @@ -2736,8 +2862,8 @@ function Ha(e, t, n = !1, r = !1) { transition: c, component: e.component, suspense: e.suspense, - ssContent: e.ssContent && Ha(e.ssContent), - ssFallback: e.ssFallback && Ha(e.ssFallback), + ssContent: e.ssContent && Xa(e.ssContent), + ssFallback: e.ssFallback && Xa(e.ssFallback), placeholder: e.placeholder, el: e.el, anchor: e.anchor, @@ -2745,53 +2871,57 @@ function Ha(e, t, n = !1, r = !1) { ce: e.ce, cacheIndex: e.cacheIndex }; - return c && r && Dr(u, c.clone(u)), u; + return c && r && Mr(u, c.clone(u)), u; } -function Ua(e = " ", t = 0) { - return H(Da, null, e, t); +function Za(e = " ", t = 0) { + return U(Ia, null, e, t); } -function U(e = "", t = !1) { - return t ? (R(), B(Oa, null, e)) : H(Oa, null, e); +function Qa(e, t) { + let n = U(La, null, e); + return n.staticCount = t, n; } -function Wa(e) { - return e == null || typeof e == "boolean" ? H(Oa) : d(e) ? H(L, null, e.slice()) : Ia(e) ? Ga(e) : H(Da, null, String(e)); +function W(e = "", t = !1) { + return t ? (z(), V(R, null, e)) : U(R, null, e); } -function Ga(e) { - return e.el === null && e.patchFlag !== -1 || e.memo ? e : Ha(e); +function $a(e) { + return e == null || typeof e == "boolean" ? U(R) : d(e) ? U(L, null, e.slice()) : Wa(e) ? eo(e) : U(Ia, null, String(e)); } -function Ka(e, t) { +function eo(e) { + return e.el === null && e.patchFlag !== -1 || e.memo ? e : Xa(e); +} +function to(e, t) { let n = 0, { shapeFlag: r } = e; if (t == null) t = null; else if (d(t)) n = 16; else if (typeof t == "object") { if (r & 65) { let n = t.default; - n && (n._c && (n._d = !1), Ka(e, n()), n._c && (n._d = !0)); + n && (n._c && (n._d = !1), to(e, n()), n._c && (n._d = !0)); return; } { n = 32; let r = t._; - !r && !Qi(t) ? t._ctx = N : r === 3 && N && (N.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); + !r && !sa(t) ? t._ctx = Wn : r === 3 && Wn && (Wn.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); } } else if (h(t)) { if (r & 65) { - Ka(e, { default: t }); + to(e, { default: t }); return; } t = { default: t, - _ctx: N + _ctx: Wn }, n = 32; - } else t = String(t), r & 64 ? (n = 16, t = [Ua(t)]) : n = 8; + } else t = String(t), r & 64 ? (n = 16, t = [Za(t)]) : n = 8; e.children = t, e.shapeFlag |= n; } -function W(...e) { +function G(...e) { let t = {}; for (let n = 0; n < e.length; n++) { let r = e[n]; - for (let e in r) if (e === "class") t.class !== r.class && (t.class = D([t.class, r.class])); - else if (e === "style") t.style = pe([t.style, r.style]); + for (let e in r) if (e === "class") t.class !== r.class && (t.class = O([t.class, r.class])); + else if (e === "style") t.style = fe([t.style, r.style]); else if (a(e)) { let n = t[e], i = r[e]; i && n !== i && !(d(n) && n.includes(i)) ? t[e] = n ? [].concat(n, i) : i : i == null && n == null && !o(e) && (t[e] = i); @@ -2799,13 +2929,16 @@ function W(...e) { } return t; } -function qa(e, t, n, r = null) { - xn(e, t, 7, [n, r]); +function no(e, t, n, r = null) { + Cn(e, t, 7, [n, r]); } -var Ja = Pi(), Ya = 0; -function Xa(e, n, r) { - let i = e.type, a = (n ? n.appContext : e.appContext) || Ja, o = { - uid: Ya++, +var ro = Vi(), io = 0; +function ao() { + return io; +} +function oo(e, n, r) { + let i = e.type, a = (n ? n.appContext : e.appContext) || ro, o = { + uid: io++, vnode: e, type: i, parent: n, @@ -2816,7 +2949,7 @@ function Xa(e, n, r) { effect: null, update: null, job: null, - scope: new Ae(!0), + scope: new ke(!0), render: null, proxy: null, exposed: null, @@ -2832,8 +2965,8 @@ function Xa(e, n, r) { renderCache: [], components: null, directives: null, - propsOptions: ia(i, a), - emitsOptions: Vi(i, a), + propsOptions: pa(i, a), + emitsOptions: Yi(i, a), emit: null, emitted: null, propsDefaults: t, @@ -2868,81 +3001,81 @@ function Xa(e, n, r) { ec: null, sp: null }; - return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = zi.bind(null, o), e.ce && e.ce(o), o; + return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = qi.bind(null, o), e.ce && e.ce(o), o; } -var Za = null, Qa = () => Za || N, $a, eo; +var so = null, co = () => so || Wn, lo, uo; { - let e = fe(), t = (t, n) => { + let e = de(), t = (t, n) => { let r; return (r = e[t]) || (r = e[t] = []), r.push(n), (e) => { r.length > 1 ? r.forEach((t) => t(e)) : r[0](e); }; }; - $a = t("__VUE_INSTANCE_SETTERS__", (e) => Za = e), eo = t("__VUE_SSR_SETTERS__", (e) => io = e); + lo = t("__VUE_INSTANCE_SETTERS__", (e) => so = e), uo = t("__VUE_SSR_SETTERS__", (e) => ho = e); } -var to = (e) => { - let t = Za; - return $a(e), e.scope.on(), () => { - e.scope.off(), $a(t); +var fo = (e) => { + let t = so; + return lo(e), e.scope.on(), () => { + e.scope.off(), lo(t); }; -}, no = () => { - Za && Za.scope.off(), $a(null); +}, po = () => { + so && so.scope.off(), lo(null); }; -function ro(e) { +function mo(e) { return e.vnode.shapeFlag & 4; } -var io = !1; -function ao(e, t = !1, n = !1) { - t && eo(t); - let { props: r, children: i } = e.vnode, a = ro(e); - $i(e, r, a, t), fa(e, i, n || t); - let o = a ? oo(e, t) : void 0; - return t && eo(!1), o; +var ho = !1; +function go(e, t = !1, n = !1) { + t && uo(t); + let { props: r, children: i } = e.vnode, a = mo(e); + ca(e, r, a, t), xa(e, i, n || t); + let o = a ? _o(e, t) : void 0; + return t && uo(!1), o; } -function oo(e, t) { +function _o(e, t) { let n = e.type; - e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, _i); + e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, Ci); let { setup: r } = n; if (r) { - Xe(); - let n = e.setupContext = r.length > 1 ? uo(e) : null, i = to(e), a = bn(r, e, 0, [e.props, n]), o = y(a); - if (Ze(), i(), (o || e.sp) && !Rr(e) && jr(e), o) { - if (a.then(no, no), t) return a.then((n) => { - eo(!0); + Ye(); + let n = e.setupContext = r.length > 1 ? xo(e) : null, i = fo(e), a = Sn(r, e, 0, [e.props, n]), o = y(a); + if (Xe(), i(), (o || e.sp) && !Wr(e) && Lr(e), o) { + if (a.then(po, po), t) return a.then((n) => { + uo(!0); try { - so(e, n, t); + vo(e, n, t); } finally { - eo(!1); + uo(!1); } }).catch((t) => { - Sn(t, e, 0); + wn(t, e, 0); }); e.asyncDep = a; - } else so(e, a, t); - } else co(e, t); + } else vo(e, a, t); + } else yo(e, t); } -function so(e, t, n) { - h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = cn(t)), co(e, n); +function vo(e, t, n) { + h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = cn(t)), yo(e, n); } -function co(e, t, n) { +function yo(e, t, n) { let i = e.type; e.render ||= i.render || r; { - let t = to(e); - Xe(); + let t = fo(e); + Ye(); try { - bi(e); + Di(e); } finally { - Ze(), t(); + Xe(), t(); } } } -var lo = { get(e, t) { - return st(e, "get", ""), e[t]; +var bo = { get(e, t) { + return ot(e, "get", ""), e[t]; } }; -function uo(e) { +function xo(e) { return { - attrs: new Proxy(e.attrs, lo), + attrs: new Proxy(e.attrs, bo), slots: e.slots, emit: e.emit, expose: (t) => { @@ -2950,38 +3083,38 @@ function uo(e) { } }; } -function fo(e) { +function So(e) { return e.exposed ? e.exposeProxy ||= new Proxy(cn(Zt(e.exposed)), { get(t, n) { if (n in t) return t[n]; - if (n in hi) return hi[n](e); + if (n in xi) return xi[n](e); }, has(e, t) { - return t in e || t in hi; + return t in e || t in xi; } }) : e.proxy; } -function po(e, t = !0) { +function Co(e, t = !0) { return h(e) ? e.displayName || e.name : e.name || t && e.__name; } -function mo(e) { +function wo(e) { return h(e) && "__vccOpts" in e; } -var ho = (e, t) => /* @__PURE__ */ pn(e, t, io); -function go(e, t, n) { +var To = (e, t) => /* @__PURE__ */ hn(e, t, ho); +function Eo(e, t, n) { try { - Pa(-1); + Ha(-1); let r = arguments.length; - return r === 2 ? v(t) && !d(t) ? Ia(t) ? H(e, null, [t]) : H(e, t) : H(e, null, t) : (r > 3 ? n = Array.prototype.slice.call(arguments, 2) : r === 3 && Ia(n) && (n = [n]), H(e, t, n)); + return r === 2 ? v(t) && !d(t) ? Wa(t) ? U(e, null, [t]) : U(e, t) : U(e, null, t) : (r > 3 ? n = Array.prototype.slice.call(arguments, 2) : r === 3 && Wa(n) && (n = [n]), U(e, t, n)); } finally { - Pa(1); + Ha(1); } } -var _o = "3.5.43", vo = void 0, yo = typeof window < "u" && window.trustedTypes; -if (yo) try { - vo = /* @__PURE__ */ yo.createPolicy("vue", { createHTML: (e) => e }); +var Do = "3.5.44", Oo = void 0, ko = typeof window < "u" && window.trustedTypes; +if (ko) try { + Oo = /* @__PURE__ */ ko.createPolicy("vue", { createHTML: (e) => e }); } catch {} -var bo = vo ? (e) => vo.createHTML(e) : (e) => e, xo = "http://www.w3.org/2000/svg", So = "http://www.w3.org/1998/Math/MathML", Co = typeof document < "u" ? document : null, wo = Co && /* @__PURE__ */ Co.createElement("template"), To = { +var Ao = Oo ? (e) => Oo.createHTML(e) : (e) => e, jo = "http://www.w3.org/2000/svg", Mo = "http://www.w3.org/1998/Math/MathML", No = typeof document < "u" ? document : null, Po = No && /* @__PURE__ */ No.createElement("template"), Fo = { insert: (e, t, n) => { t.insertBefore(e, n || null); }, @@ -2990,11 +3123,11 @@ var bo = vo ? (e) => vo.createHTML(e) : (e) => e, xo = "http://www.w3.org/2000/s t && t.removeChild(e); }, createElement: (e, t, n, r) => { - let i = t === "svg" ? Co.createElementNS(xo, e) : t === "mathml" ? Co.createElementNS(So, e) : n ? Co.createElement(e, { is: n }) : Co.createElement(e); + let i = t === "svg" ? No.createElementNS(jo, e) : t === "mathml" ? No.createElementNS(Mo, e) : n ? No.createElement(e, { is: n }) : No.createElement(e); return e === "select" && r && r.multiple != null && i.setAttribute("multiple", r.multiple), i; }, - createText: (e) => Co.createTextNode(e), - createComment: (e) => Co.createComment(e), + createText: (e) => No.createTextNode(e), + createComment: (e) => No.createComment(e), setText: (e, t) => { e.nodeValue = t; }, @@ -3003,7 +3136,7 @@ var bo = vo ? (e) => vo.createHTML(e) : (e) => e, xo = "http://www.w3.org/2000/s }, parentNode: (e) => e.parentNode, nextSibling: (e) => e.nextSibling, - querySelector: (e) => Co.querySelector(e), + querySelector: (e) => No.querySelector(e), setScopeId(e, t) { e.setAttribute(t, ""); }, @@ -3011,8 +3144,8 @@ var bo = vo ? (e) => vo.createHTML(e) : (e) => e, xo = "http://www.w3.org/2000/s let o = n ? n.previousSibling : t.lastChild; if (i && (i === a || i.nextSibling)) for (; t.insertBefore(i.cloneNode(!0), n), i !== a && (i = i.nextSibling);); else { - wo.innerHTML = bo(r === "svg" ? `${e}` : r === "mathml" ? `${e}` : e); - let i = wo.content; + Po.innerHTML = Ao(r === "svg" ? `${e}` : r === "mathml" ? `${e}` : e); + let i = Po.content; if (r === "svg" || r === "mathml") { let e = i.firstChild; for (; e.firstChild;) i.appendChild(e.firstChild); @@ -3022,7 +3155,7 @@ var bo = vo ? (e) => vo.createHTML(e) : (e) => e, xo = "http://www.w3.org/2000/s } return [o ? o.nextSibling : t.firstChild, n ? n.previousSibling : t.lastChild]; } -}, Eo = "transition", Do = "animation", Oo = /* @__PURE__ */ Symbol("_vtc"), ko = { +}, Io = "transition", Lo = "animation", Ro = /* @__PURE__ */ Symbol("_vtc"), zo = { name: String, type: String, css: { @@ -3043,81 +3176,81 @@ var bo = vo ? (e) => vo.createHTML(e) : (e) => e, xo = "http://www.w3.org/2000/s leaveFromClass: String, leaveActiveClass: String, leaveToClass: String -}, Ao = /* @__PURE__ */ s({}, vr, ko), jo = /* @__PURE__ */ ((e) => (e.displayName = "Transition", e.props = Ao, e))((e, { slots: t }) => go(Sr, Po(e), t)), Mo = (e, t = []) => { +}, Bo = /* @__PURE__ */ s({}, wr, zo), Vo = /* @__PURE__ */ ((e) => (e.displayName = "Transition", e.props = Bo, e))((e, { slots: t }) => Eo(Dr, Wo(e), t)), Ho = (e, t = []) => { d(e) ? e.forEach((e) => e(...t)) : e && e(...t); -}, No = (e) => e ? d(e) ? e.some((e) => e.length > 1) : e.length > 1 : !1; -function Po(e) { +}, Uo = (e) => e ? d(e) ? e.some((e) => e.length > 1) : e.length > 1 : !1; +function Wo(e) { let t = {}; - for (let n in e) n in ko || (t[n] = e[n]); + for (let n in e) n in zo || (t[n] = e[n]); if (e.css === !1) return t; - let { name: n = "v", type: r, duration: i, enterFromClass: a = `${n}-enter-from`, enterActiveClass: o = `${n}-enter-active`, enterToClass: c = `${n}-enter-to`, appearFromClass: l = a, appearActiveClass: u = o, appearToClass: d = c, leaveFromClass: f = `${n}-leave-from`, leaveActiveClass: p = `${n}-leave-active`, leaveToClass: m = `${n}-leave-to` } = e, h = Fo(i), g = h && h[0], _ = h && h[1], { onBeforeEnter: v, onEnter: y, onEnterCancelled: b, onLeave: x, onLeaveCancelled: S, onBeforeAppear: C = v, onAppear: w = y, onAppearCancelled: ee = b } = t, te = (e, t, n, r) => { - e._enterCancelled = r, Ro(e, t ? d : c), Ro(e, t ? u : o), n && n(); + let { name: n = "v", type: r, duration: i, enterFromClass: a = `${n}-enter-from`, enterActiveClass: o = `${n}-enter-active`, enterToClass: c = `${n}-enter-to`, appearFromClass: l = a, appearActiveClass: u = o, appearToClass: d = c, leaveFromClass: f = `${n}-leave-from`, leaveActiveClass: p = `${n}-leave-active`, leaveToClass: m = `${n}-leave-to` } = e, h = Go(i), g = h && h[0], _ = h && h[1], { onBeforeEnter: v, onEnter: y, onEnterCancelled: b, onLeave: x, onLeaveCancelled: S, onBeforeAppear: C = v, onAppear: w = y, onAppearCancelled: ee = b } = t, te = (e, t, n, r) => { + e._enterCancelled = r, Jo(e, t ? d : c), Jo(e, t ? u : o), n && n(); }, ne = (e, t) => { - e._isLeaving = !1, Ro(e, f), Ro(e, m), Ro(e, p), t && t(); + e._isLeaving = !1, Jo(e, f), Jo(e, m), Jo(e, p), t && t(); }, T = (e) => (t, n) => { let i = e ? w : y, o = () => te(t, e, n); - Mo(i, [t, o]), zo(() => { - Ro(t, e ? l : a), Lo(t, e ? d : c), No(i) || Vo(t, r, g, o); + Ho(i, [t, o]), Yo(() => { + Jo(t, e ? l : a), qo(t, e ? d : c), Uo(i) || Zo(t, r, g, o); }); }; return s(t, { onBeforeEnter(e) { - Mo(v, [e]), Lo(e, a), Lo(e, o); + Ho(v, [e]), qo(e, a), qo(e, o); }, onBeforeAppear(e) { - Mo(C, [e]), Lo(e, l), Lo(e, u); + Ho(C, [e]), qo(e, l), qo(e, u); }, onEnter: T(!1), onAppear: T(!0), onLeave(e, t) { e._isLeaving = !0; let n = () => ne(e, t); - Lo(e, f), e._enterCancelled ? (Lo(e, p), Go(e)) : (Go(e), Lo(e, p)), zo(() => { - e._isLeaving && (Ro(e, f), Lo(e, m), No(x) || Vo(e, r, _, n)); - }), Mo(x, [e, n]); + qo(e, f), e._enterCancelled ? (qo(e, p), ts(e)) : (ts(e), qo(e, p)), Yo(() => { + e._isLeaving && (Jo(e, f), qo(e, m), Uo(x) || Zo(e, r, _, n)); + }), Ho(x, [e, n]); }, onEnterCancelled(e) { - te(e, !1, void 0, !0), Mo(b, [e]); + te(e, !1, void 0, !0), Ho(b, [e]); }, onAppearCancelled(e) { - te(e, !0, void 0, !0), Mo(ee, [e]); + te(e, !0, void 0, !0), Ho(ee, [e]); }, onLeaveCancelled(e) { - ne(e), Mo(S, [e]); + ne(e), Ho(S, [e]); } }); } -function Fo(e) { +function Go(e) { if (e == null) return null; - if (v(e)) return [Io(e.enter), Io(e.leave)]; + if (v(e)) return [Ko(e.enter), Ko(e.leave)]; { - let t = Io(e); + let t = Ko(e); return [t, t]; } } -function Io(e) { - return ue(e); +function Ko(e) { + return le(e); } -function Lo(e, t) { - t.split(/\s+/).forEach((t) => t && e.classList.add(t)), (e[Oo] || (e[Oo] = /* @__PURE__ */ new Set())).add(t); +function qo(e, t) { + t.split(/\s+/).forEach((t) => t && e.classList.add(t)), (e[Ro] || (e[Ro] = /* @__PURE__ */ new Set())).add(t); } -function Ro(e, t) { +function Jo(e, t) { t.split(/\s+/).forEach((t) => t && e.classList.remove(t)); - let n = e[Oo]; - n && (n.delete(t), n.size || (e[Oo] = void 0)); + let n = e[Ro]; + n && (n.delete(t), n.size || (e[Ro] = void 0)); } -function zo(e) { +function Yo(e) { requestAnimationFrame(() => { requestAnimationFrame(e); }); } -var Bo = 0; -function Vo(e, t, n, r) { - let i = e._endId = ++Bo, a = () => { +var Xo = 0; +function Zo(e, t, n, r) { + let i = e._endId = ++Xo, a = () => { i === e._endId && r(); }; if (n != null) return setTimeout(a, n); - let { type: o, timeout: s, propCount: c } = Ho(e, t); + let { type: o, timeout: s, propCount: c } = Qo(e, t); if (!o) return r(); let l = o + "end", u = 0, d = () => { e.removeEventListener(l, f), a(); @@ -3128,10 +3261,10 @@ function Vo(e, t, n, r) { u < c && d(); }, s + 1), e.addEventListener(l, f); } -function Ho(e, t) { - let n = window.getComputedStyle(e), r = (e) => (n[e] || "").split(", "), i = r(`${Eo}Delay`), a = r(`${Eo}Duration`), o = Uo(i, a), s = r(`${Do}Delay`), c = r(`${Do}Duration`), l = Uo(s, c), u = null, d = 0, f = 0; - t === Eo ? o > 0 && (u = Eo, d = o, f = a.length) : t === Do ? l > 0 && (u = Do, d = l, f = c.length) : (d = Math.max(o, l), u = d > 0 ? o > l ? Eo : Do : null, f = u ? u === Eo ? a.length : c.length : 0); - let p = u === Eo && /\b(?:transform|all)(?:,|$)/.test(r(`${Eo}Property`).toString()); +function Qo(e, t) { + let n = window.getComputedStyle(e), r = (e) => (n[e] || "").split(", "), i = r(`${Io}Delay`), a = r(`${Io}Duration`), o = $o(i, a), s = r(`${Lo}Delay`), c = r(`${Lo}Duration`), l = $o(s, c), u = null, d = 0, f = 0; + t === Io ? o > 0 && (u = Io, d = o, f = a.length) : t === Lo ? l > 0 && (u = Lo, d = l, f = c.length) : (d = Math.max(o, l), u = d > 0 ? o > l ? Io : Lo : null, f = u ? u === Io ? a.length : c.length : 0); + let p = u === Io && /\b(?:transform|all)(?:,|$)/.test(r(`${Io}Property`).toString()); return { type: u, timeout: d, @@ -3139,100 +3272,100 @@ function Ho(e, t) { hasTransform: p }; } -function Uo(e, t) { +function $o(e, t) { for (; e.length < t.length;) e = e.concat(e); - return Math.max(...t.map((t, n) => Wo(t) + Wo(e[n]))); + return Math.max(...t.map((t, n) => es(t) + es(e[n]))); } -function Wo(e) { +function es(e) { return e === "auto" ? 0 : Number(e.slice(0, -1).replace(",", ".")) * 1e3; } -function Go(e) { +function ts(e) { return (e ? e.ownerDocument : document).body.offsetHeight; } -function Ko(e, t, n) { - let r = e[Oo]; +function ns(e, t, n) { + let r = e[Ro]; r && (t = (t ? [t, ...r] : [...r]).join(" ")), t == null ? e.removeAttribute("class") : n ? e.setAttribute("class", t) : e.className = t; } -var qo = /* @__PURE__ */ Symbol("_vod"), Jo = /* @__PURE__ */ Symbol("_vsh"), Yo = { +var rs = /* @__PURE__ */ Symbol("_vod"), is = /* @__PURE__ */ Symbol("_vsh"), as = { name: "show", beforeMount(e, { value: t }, { transition: n }) { - e[qo] = e.style.display === "none" ? "" : e.style.display, n && t ? n.beforeEnter(e) : Xo(e, t); + e[rs] = e.style.display === "none" ? "" : e.style.display, n && t ? n.beforeEnter(e) : os(e, t); }, mounted(e, { value: t }, { transition: n }) { n && t && n.enter(e); }, updated(e, { value: t, oldValue: n }, { transition: r }) { - !t != !n && (r ? t ? (r.beforeEnter(e), Xo(e, !0), r.enter(e)) : r.leave(e, () => { - Xo(e, !1); - }) : Xo(e, t)); + !t != !n && (r ? t ? (r.beforeEnter(e), os(e, !0), r.enter(e)) : r.leave(e, () => { + os(e, !1); + }) : os(e, t)); }, beforeUnmount(e, { value: t }) { - Xo(e, t); + os(e, t); } }; -function Xo(e, t) { - e.style.display = t ? e[qo] : "none", e[Jo] = !t; +function os(e, t) { + e.style.display = t ? e[rs] : "none", e[is] = !t; } -var Zo = /* @__PURE__ */ Symbol(""), Qo = /(?:^|;)\s*display\s*:/; -function $o(e, t, n) { +var ss = /* @__PURE__ */ Symbol(""), cs = /(?:^|;)\s*display\s*:/; +function ls(e, t, n) { let r = e.style, i = g(n), a = !1; if (n && !i) { if (t) { if (g(t)) for (let e of t.split(";")) { let t = e.slice(0, e.indexOf(":")).trim(); - n[t] ?? ts(r, t, ""); + n[t] ?? ds(r, t, ""); } - else for (let e in t) n[e] ?? ts(r, e, ""); + else for (let e in t) n[e] ?? ds(r, e, ""); } for (let i in n) { i === "display" && (a = !0); let o = n[i]; - o == null ? ts(r, i, "") : as(e, i, !g(t) && t ? t[i] : void 0, o) || ts(r, i, o); + o == null ? ds(r, i, "") : hs(e, i, !g(t) && t ? t[i] : void 0, o) || ds(r, i, o); } } else if (i) { if (t !== n) { - let e = r[Zo]; - e && (n += ";" + e), r.cssText = n, a = Qo.test(n); + let e = r[ss]; + e && (n += ";" + e), r.cssText = n, a = cs.test(n); } } else t && e.removeAttribute("style"); - qo in e && (e[qo] = a ? r.display : "", e[Jo] && (r.display = "none")); + rs in e && (i && t === n || (e[rs] = a ? r.display : ""), e[is] && (r.display = "none")); } -var es = /\s*!important$/; -function ts(e, t, n) { - if (d(n)) n.forEach((n) => ts(e, t, n)); - else if (n ??= "", t.startsWith("--")) es.test(n) ? e.setProperty(t, n.replace(es, ""), "important") : e.setProperty(t, n); +var us = /\s*!important$/; +function ds(e, t, n) { + if (d(n)) n.forEach((n) => ds(e, t, n)); + else if (n ??= "", t.startsWith("--")) us.test(n) ? e.setProperty(t, n.replace(us, ""), "important") : e.setProperty(t, n); else { - let r = is(e, t); - es.test(n) ? e.setProperty(E(r), n.replace(es, ""), "important") : e[r] = n; + let r = ms(e, t); + us.test(n) ? e.setProperty(E(r), n.replace(us, ""), "important") : e[r] = n; } } -var ns = [ +var fs = [ "Webkit", "Moz", "ms" -], rs = {}; -function is(e, t) { - let n = rs[t]; +], ps = {}; +function ms(e, t) { + let n = ps[t]; if (n) return n; let r = T(t); - if (r !== "filter" && r in e) return rs[t] = r; + if (r !== "filter" && r in e) return ps[t] = r; r = ie(r); - for (let n = 0; n < ns.length; n++) { - let i = ns[n] + r; - if (i in e) return rs[t] = i; + for (let n = 0; n < fs.length; n++) { + let i = fs[n] + r; + if (i in e) return ps[t] = i; } return t; } -function as(e, t, n, r) { +function hs(e, t, n, r) { return e.tagName === "TEXTAREA" && (t === "width" || t === "height") && g(r) && n === r; } -var os = "http://www.w3.org/1999/xlink"; -function ss(e, t, n, r, i, a = ye(t)) { - r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(os, t.slice(6, t.length)) : e.setAttributeNS(os, t, n) : n == null || a && !be(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); +var gs = "http://www.w3.org/1999/xlink"; +function _s(e, t, n, r, i, a = ve(t)) { + r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(gs, t.slice(6, t.length)) : e.setAttributeNS(gs, t, n) : n == null || a && !ye(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); } -function cs(e, t, n, r, i) { +function vs(e, t, n, r, i) { if (t === "innerHTML" || t === "textContent") { - n != null && (e[t] = t === "innerHTML" ? bo(n) : n); + n != null && (e[t] = t === "innerHTML" ? Ao(n) : n); return; } let a = e.tagName; @@ -3244,36 +3377,36 @@ function cs(e, t, n, r, i) { let o = !1; if (n === "" || n == null) { let r = typeof e[t]; - r === "boolean" ? n = be(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); + r === "boolean" ? n = ye(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); } try { e[t] = n; } catch {} o && e.removeAttribute(i || t); } -function ls(e, t, n, r) { +function ys(e, t, n, r) { e.addEventListener(t, n, r); } -function us(e, t, n, r) { +function bs(e, t, n, r) { e.removeEventListener(t, n, r); } -var ds = /* @__PURE__ */ Symbol("_vei"); -function fs(e, t, n, r, i = null) { - let a = e[ds] || (e[ds] = {}), o = a[t]; +var xs = /* @__PURE__ */ Symbol("_vei"); +function Ss(e, t, n, r, i = null) { + let a = e[xs] || (e[xs] = {}), o = a[t]; if (r && o) o.value = r; else { - let [n, s] = hs(t); - r ? ls(e, n, a[t] = ys(r, i), s) : o && (us(e, n, o, s), a[t] = void 0); + let [n, s] = Ts(t); + r ? ys(e, n, a[t] = ks(r, i), s) : o && (bs(e, n, o, s), a[t] = void 0); } } -var ps = /(Once|Passive|Capture)$/, ms = /^on:?(?:Once|Passive|Capture)$/; -function hs(e) { +var Cs = /(Once|Passive|Capture)$/, ws = /^on:?(?:Once|Passive|Capture)$/; +function Ts(e) { let t, n; - for (; (n = e.match(ps)) && !ms.test(e);) t ||= {}, e = e.slice(0, e.length - n[1].length), t[n[1].toLowerCase()] = !0; + for (; (n = e.match(Cs)) && !ws.test(e);) t ||= {}, e = e.slice(0, e.length - n[1].length), t[n[1].toLowerCase()] = !0; return [e[2] === ":" ? e.slice(3) : E(e.slice(2)), t]; } -var gs = 0, _s = /* @__PURE__ */ Promise.resolve(), vs = () => gs ||= (_s.then(() => gs = 0), Date.now()); -function ys(e, t) { +var Es = 0, Ds = /* @__PURE__ */ Promise.resolve(), Os = () => Es ||= (Ds.then(() => Es = 0), Date.now()); +function ks(e, t) { let n = (e) => { if (!e._vts) e._vts = Date.now(); else if (e._vts <= n.attached) return; @@ -3286,94 +3419,94 @@ function ys(e, t) { let i = r.slice(), a = [e]; for (let n = 0; n < i.length && !e._stopped; n++) { let e = i[n]; - e && xn(e, t, 5, a); + e && Cn(e, t, 5, a); } - } else xn(r, t, 5, [e]); + } else Cn(r, t, 5, [e]); }; - return n.value = e, n.attached = vs(), n; + return n.value = e, n.attached = Os(), n; } -var bs = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, xs = (e, t, n, r, i, s) => { +var As = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, js = (e, t, n, r, i, s) => { let c = i === "svg"; - t === "class" ? Ko(e, r, c) : t === "style" ? $o(e, n, r) : a(t) ? o(t) || fs(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), 1) : t[0] === "^" ? (t = t.slice(1), 0) : Ss(e, t, r, c)) ? (cs(e, t, r), e.tagName.includes("-") || t !== "value" && t !== "checked" && t !== "selected" || ss(e, t, r, c, s, t !== "value")) : e._isVueCE && (Cs(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? cs(e, T(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), ss(e, t, r, c)); + t === "class" ? ns(e, r, c) : t === "style" ? ls(e, n, r) : a(t) ? o(t) || Ss(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), 1) : t[0] === "^" ? (t = t.slice(1), 0) : Ms(e, t, r, c)) ? (vs(e, t, r), e.tagName.includes("-") || t !== "value" && t !== "checked" && t !== "selected" || _s(e, t, r, c, s, t !== "value")) : e._isVueCE && (Ns(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? vs(e, T(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), _s(e, t, r, c)); }; -function Ss(e, t, n, r) { - if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && bs(t) && h(n)); +function Ms(e, t, n, r) { + if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && As(t) && h(n)); if (t === "spellcheck" || t === "draggable" || t === "translate" || t === "autocorrect" || t === "sandbox" && e.tagName === "IFRAME" || t === "form" || t === "list" && e.tagName === "INPUT" || t === "type" && e.tagName === "TEXTAREA") return !1; if (t === "width" || t === "height") { let t = e.tagName; if (t === "IMG" || t === "VIDEO" || t === "CANVAS" || t === "SOURCE") return !1; } - return bs(t) && g(n) ? !1 : t in e; + return As(t) && g(n) ? !1 : t in e; } -function Cs(e, t) { +function Ns(e, t) { let n = e._def.props; if (!n) return !1; let r = T(t); return Array.isArray(n) ? n.some((e) => T(e) === r) : Object.keys(n).some((e) => T(e) === r); } -var ws = (e) => { +var Ps = (e) => { let t = e.props["onUpdate:modelValue"] || !1; - return d(t) ? (e) => se(t, e) : t; + return d(t) ? (e) => oe(t, e) : t; }; -function Ts(e) { +function Fs(e) { e.target.composing = !0; } -function Es(e) { +function Is(e) { let t = e.target; t.composing && (t.composing = !1, t.dispatchEvent(new Event("input"))); } -var Ds = /* @__PURE__ */ Symbol("_assign"), Os = /* @__PURE__ */ Symbol("_initialValue"); -function ks(e, t, n) { - return t && (e = e.trim()), n && (e = le(e)), e; +var Ls = /* @__PURE__ */ Symbol("_assign"), Rs = /* @__PURE__ */ Symbol("_initialValue"); +function zs(e, t, n) { + return t && (e = e.trim()), n && (e = ce(e)), e; } -var As = { +var Bs = { created(e, { modifiers: { lazy: t, trim: n, number: r } }, i) { - e.parentNode && (e.type === "text" ? e[Os] = e.defaultValue.replace(/[\r\n]/g, "") : e.type === "textarea" && (e[Os] = e.defaultValue.replace(/\r\n?/g, "\n"))), e[Ds] = ws(i); + e.parentNode && (e.type === "text" ? e[Rs] = e.defaultValue.replace(/[\r\n]/g, "") : e.type === "textarea" && (e[Rs] = e.defaultValue.replace(/\r\n?/g, "\n"))), e[Ls] = Ps(i); let a = r || i.props && i.props.type === "number"; - ls(e, t ? "change" : "input", (t) => { - t.target.composing || e[Ds](ks(e.value, n, a)); - }), (n || a) && ls(e, "change", () => { - e.value = ks(e.value, n, a); - }), t || (ls(e, "compositionstart", Ts), ls(e, "compositionend", Es), ls(e, "change", Es)); + ys(e, t ? "change" : "input", (t) => { + t.target.composing || e[Ls](zs(e.value, n, a)); + }), (n || a) && ys(e, "change", () => { + e.value = zs(e.value, n, a); + }), t || (ys(e, "compositionstart", Fs), ys(e, "compositionend", Is), ys(e, "change", Is)); }, mounted(e, { value: t, modifiers: { trim: n, number: r } }) { - let i = t ?? "", a = e[Os]; - delete e[Os], a !== void 0 && (e.type === "text" || e.type === "textarea") && e.value !== a ? e[Ds](ks(e.value, n, r)) : e.value = i; + let i = t ?? "", a = e[Rs]; + delete e[Rs], a !== void 0 && (e.type === "text" || e.type === "textarea") && e.value !== a ? e[Ls](zs(e.value, n, r)) : e.value = i; }, beforeUpdate(e, { value: t, oldValue: n, modifiers: { lazy: r, trim: i, number: a } }, o) { - if (e[Ds] = ws(o), e.composing) return; - let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? le(e.value) : e.value, c = t ?? ""; + if (e[Ls] = Ps(o), e.composing) return; + let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? ce(e.value) : e.value, c = t ?? ""; if (s === c) return; let l = e.getRootNode(); (l instanceof Document || l instanceof ShadowRoot) && l.activeElement === e && e.type !== "range" && (r && t === n || i && e.value.trim() === c) || (e.value = c); } -}, js = { +}, Vs = { deep: !0, created(e, { value: t, modifiers: { number: n } }, r) { - e._modelValue = t, ls(e, "change", () => { - let t = Array.prototype.filter.call(e.options, (e) => e.selected).map((e) => n ? le(Ps(e)) : Ps(e)), r = e.multiple, i = r ? p(e._modelValue) ? new Set(t) : t : t[0], a = e._pendingValue = [r, r ? d(i) ? t.slice() : t : i]; + e._modelValue = t, ys(e, "change", () => { + let t = Array.prototype.filter.call(e.options, (e) => e.selected).map((e) => n ? ce(Ws(e)) : Ws(e)), r = e.multiple, i = r ? p(e._modelValue) ? new Set(t) : t : t[0], a = e._pendingValue = [r, r ? d(i) ? t.slice() : t : i]; try { - e[Ds](i); + e[Ls](i); } finally { - jn(() => { + Nn(() => { e._pendingValue === a && (e._pendingValue = void 0); }); } - }), e[Ds] = ws(r); + }), e[Ls] = Ps(r); }, mounted(e, { value: t }) { - Ns(e, t); + Us(e, t); }, beforeUpdate(e, { value: t }, n) { - e._modelValue = t, e[Ds] = ws(n); + e._modelValue = t, e[Ls] = Ps(n); }, updated(e, { value: t }) { let n = e._pendingValue; - e._pendingValue = void 0, n && n[0] === e.multiple && Ms(t, n[1], n[0]) || Ns(e, t); + e._pendingValue = void 0, n && n[0] === e.multiple && Hs(t, n[1], n[0]) || Us(e, t); } }; -function Ms(e, t, n) { - if (!n || d(e)) return Te(e, t); +function Hs(e, t, n) { + if (!n || d(e)) return we(e, t); if (p(e)) { if (e.size !== t.length) return !1; for (let n of t) if (!e.has(n)) return !1; @@ -3381,17 +3514,17 @@ function Ms(e, t, n) { } return !1; } -function Ns(e, t) { +function Us(e, t) { let n = e.multiple, r = d(t); if (!n || r || p(t)) { for (let i = 0, a = e.options.length; i < a; i++) { - let a = e.options[i], o = Ps(a); + let a = e.options[i], o = Ws(a); if (n) { if (r) { let e = typeof o; - a.selected = e === "string" || e === "number" ? t.some((e) => String(e) === String(o)) : Ee(t, o) > -1; + a.selected = e === "string" || e === "number" ? t.some((e) => String(e) === String(o)) : Te(t, o) > -1; } else a.selected = t.has(o); - } else if (Te(Ps(a), t)) { + } else if (we(Ws(a), t)) { e.selectedIndex !== i && (e.selectedIndex = i); return; } @@ -3399,15 +3532,15 @@ function Ns(e, t) { !n && e.selectedIndex !== -1 && (e.selectedIndex = -1); } } -function Ps(e) { +function Ws(e) { return "_value" in e ? e._value : e.value; } -var Fs = [ +var Gs = [ "ctrl", "shift", "alt", "meta" -], Is = { +], Ks = { stop: (e) => e.stopPropagation(), prevent: (e) => e.preventDefault(), self: (e) => e.target !== e.currentTarget, @@ -3418,18 +3551,18 @@ var Fs = [ left: (e) => "button" in e && e.button !== 0, middle: (e) => "button" in e && e.button !== 1, right: (e) => "button" in e && e.button !== 2, - exact: (e, t) => Fs.some((n) => e[`${n}Key`] && !t.includes(n)) -}, Ls = (e, t) => { + exact: (e, t) => Gs.some((n) => e[`${n}Key`] && !t.includes(n)) +}, qs = (e, t) => { if (!e) return e; let n = e._withMods ||= {}, r = t.join("."); return n[r] || (n[r] = ((n, ...r) => { for (let e = 0; e < t.length; e++) { - let r = Is[t[e]]; + let r = Ks[t[e]]; if (r && r(n, t)) return; } return e(n, ...r); })); -}, Rs = { +}, Js = { esc: "escape", space: " ", up: "arrow-up", @@ -3437,57 +3570,57 @@ var Fs = [ right: "arrow-right", down: "arrow-down", delete: "backspace" -}, zs = (e, t) => { +}, Ys = (e, t) => { let n = e._withKeys ||= {}, r = t.join("."); return n[r] || (n[r] = ((n) => { if (!("key" in n)) return; let r = E(n.key); - if (t.some((e) => e === r || Rs[e] === r)) return e(n); + if (t.some((e) => e === r || Js[e] === r)) return e(n); })); -}, Bs = /* @__PURE__ */ s({ patchProp: xs }, To), Vs; -function Hs() { - return Vs ||= ha(Bs); +}, Xs = /* @__PURE__ */ s({ patchProp: js }, Fo), Zs; +function Qs() { + return Zs ||= wa(Xs); } -var Us = ((...e) => { - let t = Hs().createApp(...e), { mount: n } = t; +var $s = ((...e) => { + let t = Qs().createApp(...e), { mount: n } = t; return t.mount = (e) => { - let r = Gs(e); + let r = tc(e); if (!r) return; let i = t._component; h(i) || i.render || i.template || (i.template = r.innerHTML), r.nodeType === 1 && (r.textContent = ""); - let a = n(r, !1, Ws(r)); + let a = n(r, !1, ec(r)); return r instanceof Element && (r.removeAttribute("v-cloak"), r.setAttribute("data-v-app", "")), a; }, t; }); -function Ws(e) { +function ec(e) { if (e instanceof SVGElement) return "svg"; if (typeof MathMLElement == "function" && e instanceof MathMLElement) return "mathml"; } -function Gs(e) { +function tc(e) { return g(e) ? document.querySelector(e) : e; } // node_modules/@primeuix/utils/dist/object/index.mjs -var Ks = Object.defineProperty, qs = Object.getOwnPropertySymbols, Js = Object.prototype.hasOwnProperty, Ys = Object.prototype.propertyIsEnumerable, Xs = (e, t, n) => t in e ? Ks(e, t, { +var nc = Object.defineProperty, rc = Object.getOwnPropertySymbols, ic = Object.prototype.hasOwnProperty, ac = Object.prototype.propertyIsEnumerable, oc = (e, t, n) => t in e ? nc(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n -}) : e[t] = n, Zs = (e, t) => { - for (var n in t ||= {}) Js.call(t, n) && Xs(e, n, t[n]); - if (qs) for (var n of qs(t)) Ys.call(t, n) && Xs(e, n, t[n]); +}) : e[t] = n, sc = (e, t) => { + for (var n in t ||= {}) ic.call(t, n) && oc(e, n, t[n]); + if (rc) for (var n of rc(t)) ac.call(t, n) && oc(e, n, t[n]); return e; }; -function Qs(e) { +function cc(e) { return e == null || e === "" || Array.isArray(e) && e.length === 0 || !(e instanceof Date) && typeof e == "object" && Object.keys(e).length === 0; } -function $s(e, t, n = /* @__PURE__ */ new WeakSet()) { +function lc(e, t, n = /* @__PURE__ */ new WeakSet()) { if (e === t) return !0; if (!e || !t || typeof e != "object" || typeof t != "object" || n.has(e) || n.has(t)) return !1; n.add(e).add(t); let r = Array.isArray(e), i = Array.isArray(t), a, o, s; if (r && i) { if (o = e.length, o != t.length) return !1; - for (a = o; a-- !== 0;) if (!$s(e[a], t[a], n)) return !1; + for (a = o; a-- !== 0;) if (!lc(e[a], t[a], n)) return !1; return !0; } if (r != i) return !1; @@ -3500,26 +3633,26 @@ function $s(e, t, n = /* @__PURE__ */ new WeakSet()) { let f = Object.keys(e); if (o = f.length, o !== Object.keys(t).length) return !1; for (a = o; a-- !== 0;) if (!Object.prototype.hasOwnProperty.call(t, f[a])) return !1; - for (a = o; a-- !== 0;) if (s = f[a], !$s(e[s], t[s], n)) return !1; + for (a = o; a-- !== 0;) if (s = f[a], !lc(e[s], t[s], n)) return !1; return !0; } -function ec(e, t) { - return $s(e, t); +function uc(e, t) { + return lc(e, t); } -function tc(e) { +function dc(e) { return typeof e == "function" && "call" in e && "apply" in e; } -function G(e) { - return !Qs(e); +function K(e) { + return !cc(e); } -function nc(e, t) { +function fc(e, t) { if (!e || !t) return null; try { let n = e[t]; - if (G(n)) return n; + if (K(n)) return n; } catch {} if (Object.keys(e).length) { - if (tc(t)) return t(e); + if (dc(t)) return t(e); if (t.indexOf(".") === -1) return e[t]; { let n = t.split("."), r = e; @@ -3532,73 +3665,73 @@ function nc(e, t) { } return null; } -function rc(e, t, n) { - return n ? nc(e, n) === nc(t, n) : ec(e, t); +function pc(e, t, n) { + return n ? fc(e, n) === fc(t, n) : uc(e, t); } -function ic(e, t) { +function mc(e, t) { if (e != null && t && t.length) { - for (let n of t) if (rc(e, n)) return !0; + for (let n of t) if (pc(e, n)) return !0; } return !1; } -function ac(e, t = !0) { +function hc(e, t = !0) { return e instanceof Object && e.constructor === Object && (t || Object.keys(e).length !== 0); } -function oc(e = {}, t = {}) { - let n = Zs({}, e); +function gc(e = {}, t = {}) { + let n = sc({}, e); return Object.keys(t).forEach((r) => { let i = r; - ac(t[i]) && i in e && ac(e[i]) ? n[i] = oc(e[i], t[i]) : n[i] = t[i]; + hc(t[i]) && i in e && hc(e[i]) ? n[i] = gc(e[i], t[i]) : n[i] = t[i]; }), n; } -function sc(...e) { - return e.reduce((e, t, n) => n === 0 ? t : oc(e, t), {}); +function _c(...e) { + return e.reduce((e, t, n) => n === 0 ? t : gc(e, t), {}); } -function cc(e, t) { +function vc(e, t) { let n = -1; - if (G(e)) try { + if (K(e)) try { n = e.findLastIndex(t); } catch { n = e.lastIndexOf([...e].reverse().find(t)); } return n; } -function lc(e, ...t) { - return tc(e) ? e(...t) : e; +function yc(e, ...t) { + return dc(e) ? e(...t) : e; } -function uc(e, t = !0) { +function bc(e, t = !0) { return typeof e == "string" && (t || e !== ""); } -function dc(e) { - return uc(e) ? e.replace(/(-|_)/g, "").toLowerCase() : e; +function xc(e) { + return bc(e) ? e.replace(/(-|_)/g, "").toLowerCase() : e; } -function fc(e, t = "", n = {}) { - let r = dc(t).split("."), i = r.shift(); - return i ? ac(e) ? fc(lc(e[Object.keys(e).find((e) => dc(e) === i) || ""], n), r.join("."), n) : void 0 : lc(e, n); +function Sc(e, t = "", n = {}) { + let r = xc(t).split("."), i = r.shift(); + return i ? hc(e) ? Sc(yc(e[Object.keys(e).find((e) => xc(e) === i) || ""], n), r.join("."), n) : void 0 : yc(e, n); } -function pc(e, t = !0) { +function Cc(e, t = !0) { return Array.isArray(e) && (t || e.length !== 0); } -function mc(e) { - return G(e) && !isNaN(e); +function wc(e) { + return K(e) && !isNaN(e); } -function hc(e = "") { - return G(e) && e.length === 1 && !!e.match(/\S| /); +function Tc(e = "") { + return K(e) && e.length === 1 && !!e.match(/\S| /); } -function gc(e, t) { +function Ec(e, t) { if (t) { let n = t.test(e); return t.lastIndex = 0, n; } return !1; } -function _c(...e) { - return sc(...e); +function Dc(...e) { + return _c(...e); } -function vc(e) { +function Oc(e) { return e && e.replace(/\/\*(?:(?!\*\/)[\s\S])*\*\/|[\r\n\t]+/g, "").replace(/ {2,}/g, " ").replace(/ ([{:}]) /g, "$1").replace(/([;,]) /g, "$1").replace(/ !/g, "!").replace(/: /g, ":").trim(); } -function yc(e) { +function kc(e) { if (e && /[\xC0-\xFF\u0100-\u017E]/.test(e)) { let t = { A: /[\xC0-\xC5\u0100\u0102\u0104]/g, @@ -3650,14 +3783,14 @@ function yc(e) { } return e; } -function bc(e) { - return uc(e, !1) ? e[0].toUpperCase() + e.slice(1) : e; +function Ac(e) { + return bc(e, !1) ? e[0].toUpperCase() + e.slice(1) : e; } -function xc(e) { - return uc(e) ? e.replace(/(_)/g, "-").replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase() : e; +function jc(e) { + return bc(e) ? e.replace(/(_)/g, "-").replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase() : e; } // node_modules/@primeuix/utils/dist/eventbus/index.mjs -function Sc() { +function Mc() { let e = /* @__PURE__ */ new Map(); return { on(t, n) { @@ -3680,7 +3813,7 @@ function Sc() { }; } // node_modules/@primeuix/utils/dist/classnames/index.mjs -function K(...e) { +function q(...e) { if (e) { let t = []; for (let n = 0; n < e.length; n++) { @@ -3689,7 +3822,7 @@ function K(...e) { let i = typeof r; if (i === "string" || i === "number") t.push(r); else if (i === "object") { - let e = Array.isArray(r) ? [K(...r)] : Object.entries(r).map(([e, t]) => t ? e : void 0); + let e = Array.isArray(r) ? [q(...r)] : Object.entries(r).map(([e, t]) => t ? e : void 0); t = e.length ? t.concat(e.filter((e) => !!e)) : t; } } @@ -3697,24 +3830,24 @@ function K(...e) { } } // node_modules/@primeuix/utils/dist/dom/index.mjs -function Cc(e, t) { +function Nc(e, t) { return e ? e.classList ? e.classList.contains(t) : RegExp("(^| )" + t + "( |$)", "gi").test(e.className) : !1; } -function wc(e, t) { +function Pc(e, t) { if (e && t) { let n = (t) => { - Cc(e, t) || (e.classList ? e.classList.add(t) : e.className += " " + t); + Nc(e, t) || (e.classList ? e.classList.add(t) : e.className += " " + t); }; [t].flat().filter(Boolean).forEach((e) => e.split(" ").forEach(n)); } } -function Tc() { +function Fc() { return window.innerWidth - document.documentElement.offsetWidth; } -function Ec(e) { - typeof e == "string" ? wc(document.body, e || "p-overflow-hidden") : (e != null && e.variableName && document.body.style.setProperty(e.variableName, Tc() + "px"), wc(document.body, e?.className || "p-overflow-hidden")); +function Ic(e) { + typeof e == "string" ? Pc(document.body, e || "p-overflow-hidden") : (e != null && e.variableName && document.body.style.setProperty(e.variableName, Fc() + "px"), Pc(document.body, e?.className || "p-overflow-hidden")); } -function Dc(e, t) { +function Lc(e, t) { if (e && t) { let n = (t) => { e.classList ? e.classList.remove(t) : e.className = e.className.replace(RegExp("(^|\\b)" + t.split(" ").join("|") + "(\\b|$)", "gi"), " "); @@ -3722,10 +3855,10 @@ function Dc(e, t) { [t].flat().filter(Boolean).forEach((e) => e.split(" ").forEach(n)); } } -function Oc(e) { - typeof e == "string" ? Dc(document.body, e || "p-overflow-hidden") : (e != null && e.variableName && document.body.style.removeProperty(e.variableName), Dc(document.body, e?.className || "p-overflow-hidden")); +function Rc(e) { + typeof e == "string" ? Lc(document.body, e || "p-overflow-hidden") : (e != null && e.variableName && document.body.style.removeProperty(e.variableName), Lc(document.body, e?.className || "p-overflow-hidden")); } -function kc(e) { +function zc(e) { for (let t of document == null ? void 0 : document.styleSheets) try { for (let n of t?.cssRules) for (let t of n?.style) if (e.test(t)) return { name: t, @@ -3734,7 +3867,7 @@ function kc(e) { } catch {} return null; } -function Ac(e) { +function Bc(e) { let t = { width: 0, height: 0 @@ -3745,40 +3878,40 @@ function Ac(e) { } return t; } -function jc() { +function Vc() { let e = window, t = document, n = t.documentElement, r = t.getElementsByTagName("body")[0]; return { width: e.innerWidth || n.clientWidth || r.clientWidth, height: e.innerHeight || n.clientHeight || r.clientHeight }; } -function Mc(e) { +function Hc(e) { return e ? Math.abs(e.scrollLeft) : 0; } -function Nc() { +function Uc() { let e = document.documentElement; - return (window.pageXOffset || Mc(e)) - (e.clientLeft || 0); + return (window.pageXOffset || Hc(e)) - (e.clientLeft || 0); } -function Pc() { +function Wc() { let e = document.documentElement; return (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); } -function Fc(e) { +function Gc(e) { return e ? getComputedStyle(e).direction === "rtl" : !1; } -function Ic(e, t, n = !0) { +function Kc(e, t, n = !0) { if (e) { let r = e.offsetParent ? { width: e.offsetWidth, height: e.offsetHeight - } : Ac(e), i = r.height, a = r.width, o = t.offsetHeight, s = t.offsetWidth, c = t.getBoundingClientRect(), l = Pc(), u = Nc(), d = jc(), f, p, m = "top"; - c.top + o + i > d.height ? (f = c.top + l - i, m = "bottom", f < 0 && (f = l)) : f = o + c.top + l, p = c.left + a > d.width ? Math.max(0, c.left + u + s - a) : c.left + u, Fc(e) ? e.style.insetInlineEnd = p + "px" : e.style.insetInlineStart = p + "px", e.style.top = f + "px", e.style.transformOrigin = m, n && (e.style.marginTop = m === "bottom" ? `calc(${kc(/-anchor-gutter$/)?.value ?? "2px"} * -1)` : kc(/-anchor-gutter$/)?.value ?? ""); + } : Bc(e), i = r.height, a = r.width, o = t.offsetHeight, s = t.offsetWidth, c = t.getBoundingClientRect(), l = Wc(), u = Uc(), d = Vc(), f, p, m = "top"; + c.top + o + i > d.height ? (f = c.top + l - i, m = "bottom", f < 0 && (f = l)) : f = o + c.top + l, p = c.left + a > d.width ? Math.max(0, c.left + u + s - a) : c.left + u, Gc(e) ? e.style.insetInlineEnd = p + "px" : e.style.insetInlineStart = p + "px", e.style.top = f + "px", e.style.transformOrigin = m, n && (e.style.marginTop = m === "bottom" ? `calc(${zc(/-anchor-gutter$/)?.value ?? "2px"} * -1)` : zc(/-anchor-gutter$/)?.value ?? ""); } } -function Lc(e, t) { +function qc(e, t) { e && (typeof t == "string" ? e.style.cssText = t : Object.entries(t || {}).forEach(([t, n]) => e.style[t] = n)); } -function Rc(e, t) { +function Jc(e, t) { if (e instanceof HTMLElement) { let n = e.offsetWidth; if (t) { @@ -3789,33 +3922,33 @@ function Rc(e, t) { } return 0; } -function zc(e, t, n = !0, r = void 0) { +function Yc(e, t, n = !0, r = void 0) { if (e) { let i = e.offsetParent ? { width: e.offsetWidth, height: e.offsetHeight - } : Ac(e), a = t.offsetHeight, o = t.getBoundingClientRect(), s = jc(), c, l, u = r ?? "top"; + } : Bc(e), a = t.offsetHeight, o = t.getBoundingClientRect(), s = Vc(), c, l, u = r ?? "top"; if (!r && o.top + a + i.height > s.height ? (c = -1 * i.height, u = "bottom", o.top + c < 0 && (c = -1 * o.top)) : c = a, l = i.width > s.width ? o.left * -1 : o.left + i.width > s.width ? (o.left + i.width - s.width) * -1 : 0, e.style.top = c + "px", e.style.insetInlineStart = l + "px", e.style.transformOrigin = u, n) { - let t = kc(/-anchor-gutter$/)?.value; + let t = zc(/-anchor-gutter$/)?.value; e.style.marginTop = u === "bottom" ? `calc(${t ?? "2px"} * -1)` : t ?? ""; } } } -function Bc(e) { +function Xc(e) { if (e) { let t = e.parentNode; return t && t instanceof ShadowRoot && t.host && (t = t.host), t; } return null; } -function Vc(e) { - return !!(e != null && e.nodeName && Bc(e)); +function Zc(e) { + return !!(e != null && e.nodeName && Xc(e)); } -function Hc(e) { +function Qc(e) { return typeof Element < "u" ? e instanceof Element : typeof e == "object" && !!e && e.nodeType === 1 && typeof e.nodeName == "string"; } -function Uc(e, t = {}) { - if (Hc(e)) { +function $c(e, t = {}) { + if (Qc(e)) { let n = (t, r) => { var i; let a = (i = e?.$attrs) != null && i[t] ? [e?.$attrs?.[t]] : []; @@ -3834,34 +3967,34 @@ function Uc(e, t = {}) { Object.entries(t).forEach(([t, r]) => { if (r != null) { let i = t.match(/^on(.+)/); - i ? e.addEventListener(i[1].toLowerCase(), r) : t === "p-bind" || t === "pBind" ? Uc(e, r) : (r = t === "class" ? [...new Set(n("class", r))].join(" ").trim() : t === "style" ? n("style", r).join(";").trim() : r, (e.$attrs = e.$attrs || {}) && (e.$attrs[t] = r), e.setAttribute(t, r)); + i ? e.addEventListener(i[1].toLowerCase(), r) : t === "p-bind" || t === "pBind" ? $c(e, r) : (r = t === "class" ? [...new Set(n("class", r))].join(" ").trim() : t === "style" ? n("style", r).join(";").trim() : r, (e.$attrs = e.$attrs || {}) && (e.$attrs[t] = r), e.setAttribute(t, r)); } }); } } -function Wc(e, t = {}, ...n) { +function el(e, t = {}, ...n) { if (e) { let r = document.createElement(e); - return Uc(r, t), r.append(...n), r; + return $c(r, t), r.append(...n), r; } } -function Gc(e, t) { - return Hc(e) ? Array.from(e.querySelectorAll(t)) : []; +function tl(e, t) { + return Qc(e) ? Array.from(e.querySelectorAll(t)) : []; } -function Kc(e, t) { - return Hc(e) ? e.matches(t) ? e : e.querySelector(t) : null; +function nl(e, t) { + return Qc(e) ? e.matches(t) ? e : e.querySelector(t) : null; } -function q(e, t) { +function J(e, t) { e && document.activeElement !== e && e.focus(t); } -function qc(e, t) { - if (Hc(e)) { +function rl(e, t) { + if (Qc(e)) { let n = e.getAttribute(t); return isNaN(n) ? n === "true" || n === "false" ? n === "true" : n : +n; } } -function Jc(e, t = "") { - let n = Gc(e, `button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, +function il(e, t = "") { + let n = tl(e, `button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, [href]:not([tabindex = "-1"]):not([style*="display:none"]):not([hidden])${t}, input:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, select:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, @@ -3871,27 +4004,27 @@ function Jc(e, t = "") { for (let e of n) getComputedStyle(e).display != "none" && getComputedStyle(e).visibility != "hidden" && r.push(e); return r; } -function Yc(e, t) { - let n = Jc(e, t); +function al(e, t) { + let n = il(e, t); return n.length > 0 ? n[0] : null; } -function Xc(e) { +function ol(e) { if (e) { let t = e.offsetHeight, n = getComputedStyle(e); return t -= parseFloat(n.paddingTop) + parseFloat(n.paddingBottom) + parseFloat(n.borderTopWidth) + parseFloat(n.borderBottomWidth), t; } return 0; } -function Zc(e, t) { - let n = Jc(e, t); +function sl(e, t) { + let n = il(e, t); return n.length > 0 ? n[n.length - 1] : null; } -function Qc(e) { +function cl(e) { if (e) { let t = e.getBoundingClientRect(); return { top: t.top + (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0), - left: t.left + (window.pageXOffset || Mc(document.documentElement) || Mc(document.body) || 0) + left: t.left + (window.pageXOffset || Hc(document.documentElement) || Hc(document.body) || 0) }; } return { @@ -3899,7 +4032,7 @@ function Qc(e) { left: "auto" }; } -function $c(e, t) { +function ll(e, t) { if (e) { let n = e.offsetHeight; if (t) { @@ -3910,14 +4043,14 @@ function $c(e, t) { } return 0; } -function el(e, t = []) { - let n = Bc(e); - return n === null ? t : el(n, t.concat([n])); +function ul(e, t = []) { + let n = Xc(e); + return n === null ? t : ul(n, t.concat([n])); } -function tl(e) { +function dl(e) { let t = []; if (e) { - let n = el(e), r = /(auto|scroll)/, i = (e) => { + let n = ul(e), r = /(auto|scroll)/, i = (e) => { try { let t = window.getComputedStyle(e, null); return r.test(t.getPropertyValue("overflow")) || r.test(t.getPropertyValue("overflowX")) || r.test(t.getPropertyValue("overflowY")); @@ -3930,7 +4063,7 @@ function tl(e) { if (n) { let r = n.split(","); for (let n of r) { - let r = Kc(e, n); + let r = nl(e, n); r && i(r) && t.push(r); } } @@ -3939,21 +4072,21 @@ function tl(e) { } return t; } -function nl(e) { +function fl(e) { if (e) { let t = e.offsetWidth, n = getComputedStyle(e); return t -= parseFloat(n.paddingLeft) + parseFloat(n.paddingRight) + parseFloat(n.borderLeftWidth) + parseFloat(n.borderRightWidth), t; } return 0; } -function rl() { +function pl() { return /(android)/i.test(navigator.userAgent); } -function il() { +function ml() { return !!(typeof window < "u" && window.document && window.document.createElement); } -function al(e, t = "") { - return Hc(e) ? e.matches(`button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, +function hl(e, t = "") { + return Qc(e) ? e.matches(`button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, [href][clientHeight][clientWidth]:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, input:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, select:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, @@ -3961,22 +4094,22 @@ function al(e, t = "") { [tabIndex]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}, [contenteditable]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${t}`) : !1; } -function ol(e) { +function gl(e) { return !!(e && e.offsetParent != null); } -function sl() { +function _l() { return "ontouchstart" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; } -function cl(e, t = "", n) { - Hc(e) && n != null && e.setAttribute(t, n); +function vl(e, t = "", n) { + Qc(e) && n != null && e.setAttribute(t, n); } // node_modules/@primeuix/utils/dist/uuid/index.mjs -var ll = {}; -function ul(e = "pui_id_") { - return Object.hasOwn(ll, e) || (ll[e] = 0), ll[e]++, `${e}${ll[e]}`; +var yl = {}; +function bl(e = "pui_id_") { + return Object.hasOwn(yl, e) || (yl[e] = 0), yl[e]++, `${e}${yl[e]}`; } // node_modules/@primeuix/utils/dist/zindex/index.mjs -function dl() { +function xl() { let e = [], t = (t, n, r = 999) => { let a = i(t, n, r), o = a.value + (a.key === t ? 0 : r) + 1; return e.push({ @@ -4000,58 +4133,58 @@ function dl() { getCurrent: (e) => r(e, !0) }; } -var fl = dl(), pl = Object.defineProperty, ml = Object.defineProperties, hl = Object.getOwnPropertyDescriptors, gl = Object.getOwnPropertySymbols, _l = Object.prototype.hasOwnProperty, vl = Object.prototype.propertyIsEnumerable, yl = (e, t, n) => t in e ? pl(e, t, { +var Sl = xl(), Cl = Object.defineProperty, wl = Object.defineProperties, Tl = Object.getOwnPropertyDescriptors, El = Object.getOwnPropertySymbols, Dl = Object.prototype.hasOwnProperty, Ol = Object.prototype.propertyIsEnumerable, kl = (e, t, n) => t in e ? Cl(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n -}) : e[t] = n, bl = (e, t) => { - for (var n in t ||= {}) _l.call(t, n) && yl(e, n, t[n]); - if (gl) for (var n of gl(t)) vl.call(t, n) && yl(e, n, t[n]); +}) : e[t] = n, Al = (e, t) => { + for (var n in t ||= {}) Dl.call(t, n) && kl(e, n, t[n]); + if (El) for (var n of El(t)) Ol.call(t, n) && kl(e, n, t[n]); return e; -}, xl = (e, t) => ml(e, hl(t)), Sl = (e, t) => { +}, jl = (e, t) => wl(e, Tl(t)), Ml = (e, t) => { var n = {}; - for (var r in e) _l.call(e, r) && t.indexOf(r) < 0 && (n[r] = e[r]); - if (e != null && gl) for (var r of gl(e)) t.indexOf(r) < 0 && vl.call(e, r) && (n[r] = e[r]); + for (var r in e) Dl.call(e, r) && t.indexOf(r) < 0 && (n[r] = e[r]); + if (e != null && El) for (var r of El(e)) t.indexOf(r) < 0 && Ol.call(e, r) && (n[r] = e[r]); return n; -}, J = Sc(), Cl = /{([^}]*)}/g, wl = /(\d+\s+[\+\-\*\/]\s+\d+)/g, Tl = /var\([^)]+\)/g; -function El(e) { - return uc(e) ? e.replace(/[A-Z]/g, (e, t) => t === 0 ? e : "." + e.toLowerCase()).toLowerCase() : e; +}, Nl = Mc(), Pl = /{([^}]*)}/g, Fl = /(\d+\s+[\+\-\*\/]\s+\d+)/g, Il = /var\([^)]+\)/g; +function Ll(e) { + return bc(e) ? e.replace(/[A-Z]/g, (e, t) => t === 0 ? e : "." + e.toLowerCase()).toLowerCase() : e; } -function Dl(e) { - return ac(e) && e.hasOwnProperty("$value") && e.hasOwnProperty("$type") ? e.$value : e; +function Rl(e) { + return hc(e) && e.hasOwnProperty("$value") && e.hasOwnProperty("$type") ? e.$value : e; } -function Ol(e) { +function zl(e) { return e.replaceAll(/ /g, "").replace(/[^\w]/g, "-"); } -function kl(e = "", t = "") { - return Ol(`${uc(e, !1) && uc(t, !1) ? `${e}-` : e}${t}`); +function Bl(e = "", t = "") { + return zl(`${bc(e, !1) && bc(t, !1) ? `${e}-` : e}${t}`); } -function Al(e = "", t = "") { - return `--${kl(e, t)}`; +function Vl(e = "", t = "") { + return `--${Bl(e, t)}`; } -function jl(e = "") { +function Hl(e = "") { return ((e.match(/{/g) || []).length + (e.match(/}/g) || []).length) % 2 != 0; } -function Ml(e, t = "", n = "", r = [], i) { - if (uc(e)) { +function Ul(e, t = "", n = "", r = [], i) { + if (bc(e)) { let t = e.trim(); - if (jl(t)) return; - if (gc(t, Cl)) { - let e = t.replaceAll(Cl, (e) => `var(${Al(n, xc(e.replace(/{|}/g, "").split(".").filter((e) => !r.some((t) => gc(e, t))).join("-")))}${G(i) ? `, ${i}` : ""})`); - return gc(e.replace(Tl, "0"), wl) ? `calc(${e})` : e; + if (Hl(t)) return; + if (Ec(t, Pl)) { + let e = t.replaceAll(Pl, (e) => `var(${Vl(n, jc(e.replace(/{|}/g, "").split(".").filter((e) => !r.some((t) => Ec(e, t))).join("-")))}${K(i) ? `, ${i}` : ""})`); + return Ec(e.replace(Il, "0"), Fl) ? `calc(${e})` : e; } return t; } - if (mc(e)) return e; + if (wc(e)) return e; } -function Nl(e, t, n) { - uc(t, !1) && e.push(`${t}:${n};`); +function Wl(e, t, n) { + bc(t, !1) && e.push(`${t}:${n};`); } -function Pl(e, t) { +function Gl(e, t) { return e ? `${e}{${t}}` : ""; } -function Fl(e, t) { +function Kl(e, t) { if (e.indexOf("dt(") === -1) return e; function n(e, t) { let n = [], i = 0, a = "", o = null, s = 0; @@ -4059,7 +4192,7 @@ function Fl(e, t) { let c = e[i]; if ((c === "\"" || c === "'" || c === "`") && e[i - 1] !== "\\" && (o = o === c ? null : c), !o && (c === "(" && s++, c === ")" && s--, (c === "," || i === e.length) && s === 0)) { let e = a.trim(); - e.startsWith("dt(") ? n.push(Fl(e, t)) : n.push(r(e)), a = "", i++; + e.startsWith("dt(") ? n.push(Kl(e, t)) : n.push(r(e)), a = "", i++; } else c !== void 0 && (a += c), i++; } return n; @@ -4083,24 +4216,24 @@ function Fl(e, t) { } return e; } -var Il = (e) => { - let t = Y.getTheme(), n = Rl(t, e, void 0, "variable"); +var ql = (e) => { + let t = Y.getTheme(), n = Yl(t, e, void 0, "variable"); return { name: n?.match(/--[\w-]+/g)?.[0], variable: n, - value: Rl(t, e, void 0, "value") + value: Yl(t, e, void 0, "value") }; -}, Ll = (...e) => Rl(Y.getTheme(), ...e), Rl = (e = {}, t, n, r) => { +}, Jl = (...e) => Yl(Y.getTheme(), ...e), Yl = (e = {}, t, n, r) => { if (t) { - let { variable: i, options: a } = Y.defaults || {}, { prefix: o, transform: s } = e?.options || a || {}, c = gc(t, Cl) ? t : `{${t}}`; - return r === "value" || Qs(r) && s === "strict" ? Y.getTokenValue(t) : Ml(c, void 0, o, [i.excludedKeyRegex], n); + let { variable: i, options: a } = Y.defaults || {}, { prefix: o, transform: s } = e?.options || a || {}, c = Ec(t, Pl) ? t : `{${t}}`; + return r === "value" || cc(r) && s === "strict" ? Y.getTokenValue(t) : Ul(c, void 0, o, [i.excludedKeyRegex], n); } return ""; }; -function zl(e, ...t) { - return e instanceof Array ? Fl(e.reduce((e, n, r) => e + n + (lc(t[r], { dt: Ll }) ?? ""), ""), Ll) : lc(e, { dt: Ll }); +function Xl(e, ...t) { + return e instanceof Array ? Kl(e.reduce((e, n, r) => e + n + (yc(t[r], { dt: Jl }) ?? ""), ""), Jl) : yc(e, { dt: Jl }); } -function Bl(e, t = {}) { +function Zl(e, t = {}) { let n = Y.defaults.variable, { prefix: r = n.prefix, selector: i = n.selector, excludedKeyRegex: a = n.excludedKeyRegex } = t, o = [], s = [], c = [{ node: e, path: r @@ -4108,13 +4241,13 @@ function Bl(e, t = {}) { for (; c.length;) { let { node: e, path: t } = c.pop(); for (let n in e) { - let i = e[n], l = Dl(i), u = gc(n, a) ? kl(t) : kl(t, xc(n)); - if (ac(l)) c.push({ + let i = e[n], l = Rl(i), u = Ec(n, a) ? Bl(t) : Bl(t, jc(n)); + if (hc(l)) c.push({ node: l, path: u }); else { - Nl(s, Al(u), Ml(l, u, r, [a])); + Wl(s, Vl(u), Ul(l, u, r, [a])); let e = u; r && e.startsWith(r + "-") && (e = e.slice(r.length + 1)), o.push(e.replace(/-/g, ".")); } @@ -4125,10 +4258,10 @@ function Bl(e, t = {}) { value: s, tokens: o, declarations: l, - css: Pl(i, l) + css: Gl(i, l) }; } -var Vl = { +var Ql = { regex: { rules: { class: { @@ -4185,21 +4318,21 @@ var Vl = { } }, _toVariables(e, t) { - return Bl(e, { prefix: t?.prefix }); + return Zl(e, { prefix: t?.prefix }); }, getCommon({ name: e = "", theme: t = {}, params: n, set: r, defaults: i }) { let { preset: a, options: o } = t, s, c, l, u, d, f, p; - if (G(a) && o.transform !== "strict") { - let { primitive: t, semantic: n, extend: m } = a, h = n || {}, { colorScheme: g } = h, _ = Sl(h, ["colorScheme"]), v = m || {}, { colorScheme: y } = v, b = Sl(v, ["colorScheme"]), x = g || {}, { dark: S } = x, C = Sl(x, ["dark"]), w = y || {}, { dark: ee } = w, te = Sl(w, ["dark"]), ne = G(t) ? this._toVariables({ primitive: t }, o) : {}, T = G(_) ? this._toVariables({ semantic: _ }, o) : {}, re = G(C) ? this._toVariables({ light: C }, o) : {}, E = G(S) ? this._toVariables({ dark: S }, o) : {}, ie = G(b) ? this._toVariables({ semantic: b }, o) : {}, ae = G(te) ? this._toVariables({ light: te }, o) : {}, oe = G(ee) ? this._toVariables({ dark: ee }, o) : {}, [se, ce] = [ne.declarations ?? "", ne.tokens], [le, ue] = [T.declarations ?? "", T.tokens || []], [de, fe] = [re.declarations ?? "", re.tokens || []], [pe, me] = [E.declarations ?? "", E.tokens || []], [he, ge] = [ie.declarations ?? "", ie.tokens || []], [_e, D] = [ae.declarations ?? "", ae.tokens || []], [ve, ye] = [oe.declarations ?? "", oe.tokens || []]; - s = this.transformCSS(e, se, "light", "variable", o, r, i), c = ce, l = `${this.transformCSS(e, `${le}${de}`, "light", "variable", o, r, i)}${this.transformCSS(e, `${pe}`, "dark", "variable", o, r, i)}`, u = [.../* @__PURE__ */ new Set([ - ...ue, - ...fe, - ...me - ])], d = `${this.transformCSS(e, `${he}${_e}color-scheme:light`, "light", "variable", o, r, i)}${this.transformCSS(e, `${ve}color-scheme:dark`, "dark", "variable", o, r, i)}`, f = [.../* @__PURE__ */ new Set([ - ...ge, - ...D, - ...ye - ])], p = lc(a.css, { dt: Ll }); + if (K(a) && o.transform !== "strict") { + let { primitive: t, semantic: n, extend: m } = a, h = n || {}, { colorScheme: g } = h, _ = Ml(h, ["colorScheme"]), v = m || {}, { colorScheme: y } = v, b = Ml(v, ["colorScheme"]), x = g || {}, { dark: S } = x, C = Ml(x, ["dark"]), w = y || {}, { dark: ee } = w, te = Ml(w, ["dark"]), ne = K(t) ? this._toVariables({ primitive: t }, o) : {}, T = K(_) ? this._toVariables({ semantic: _ }, o) : {}, re = K(C) ? this._toVariables({ light: C }, o) : {}, E = K(S) ? this._toVariables({ dark: S }, o) : {}, ie = K(b) ? this._toVariables({ semantic: b }, o) : {}, ae = K(te) ? this._toVariables({ light: te }, o) : {}, D = K(ee) ? this._toVariables({ dark: ee }, o) : {}, [oe, se] = [ne.declarations ?? "", ne.tokens], [ce, le] = [T.declarations ?? "", T.tokens || []], [ue, de] = [re.declarations ?? "", re.tokens || []], [fe, pe] = [E.declarations ?? "", E.tokens || []], [me, he] = [ie.declarations ?? "", ie.tokens || []], [ge, O] = [ae.declarations ?? "", ae.tokens || []], [_e, ve] = [D.declarations ?? "", D.tokens || []]; + s = this.transformCSS(e, oe, "light", "variable", o, r, i), c = se, l = `${this.transformCSS(e, `${ce}${ue}`, "light", "variable", o, r, i)}${this.transformCSS(e, `${fe}`, "dark", "variable", o, r, i)}`, u = [.../* @__PURE__ */ new Set([ + ...le, + ...de, + ...pe + ])], d = `${this.transformCSS(e, `${me}${ge}color-scheme:light`, "light", "variable", o, r, i)}${this.transformCSS(e, `${_e}color-scheme:dark`, "dark", "variable", o, r, i)}`, f = [.../* @__PURE__ */ new Set([ + ...he, + ...O, + ...ve + ])], p = yc(a.css, { dt: Jl }); } return { primitive: { @@ -4219,17 +4352,17 @@ var Vl = { }, getPreset({ name: e = "", preset: t = {}, options: n, params: r, set: i, defaults: a, selector: o }) { let s, c, l; - if (G(t) && n.transform !== "strict") { - let r = e.replace("-directive", ""), u = t, { colorScheme: d, extend: f, css: p } = u, m = Sl(u, [ + if (K(t) && n.transform !== "strict") { + let r = e.replace("-directive", ""), u = t, { colorScheme: d, extend: f, css: p } = u, m = Ml(u, [ "colorScheme", "extend", "css" - ]), h = f || {}, { colorScheme: g } = h, _ = Sl(h, ["colorScheme"]), v = d || {}, { dark: y } = v, b = Sl(v, ["dark"]), x = g || {}, { dark: S } = x, C = Sl(x, ["dark"]), w = G(m) ? this._toVariables({ [r]: bl(bl({}, m), _) }, n) : {}, ee = G(b) ? this._toVariables({ [r]: bl(bl({}, b), C) }, n) : {}, te = G(y) ? this._toVariables({ [r]: bl(bl({}, y), S) }, n) : {}, [ne, T] = [w.declarations ?? "", w.tokens || []], [re, E] = [ee.declarations ?? "", ee.tokens || []], [ie, ae] = [te.declarations ?? "", te.tokens || []]; + ]), h = f || {}, { colorScheme: g } = h, _ = Ml(h, ["colorScheme"]), v = d || {}, { dark: y } = v, b = Ml(v, ["dark"]), x = g || {}, { dark: S } = x, C = Ml(x, ["dark"]), w = K(m) ? this._toVariables({ [r]: Al(Al({}, m), _) }, n) : {}, ee = K(b) ? this._toVariables({ [r]: Al(Al({}, b), C) }, n) : {}, te = K(y) ? this._toVariables({ [r]: Al(Al({}, y), S) }, n) : {}, [ne, T] = [w.declarations ?? "", w.tokens || []], [re, E] = [ee.declarations ?? "", ee.tokens || []], [ie, ae] = [te.declarations ?? "", te.tokens || []]; s = `${this.transformCSS(r, `${ne}${re}`, "light", "variable", n, i, a, o)}${this.transformCSS(r, ie, "dark", "variable", n, i, a, o)}`, c = [.../* @__PURE__ */ new Set([ ...T, ...E, ...ae - ])], l = lc(p, { dt: Ll }); + ])], l = yc(p, { dt: Jl }); } return { css: s, @@ -4267,7 +4400,7 @@ var Vl = { }, getLayerOrder(e, t = {}, n, r) { let { cssLayer: i } = t; - return i ? `@layer ${lc(i.order || i.name || "primeui", n)}` : ""; + return i ? `@layer ${yc(i.order || i.name || "primeui", n)}` : ""; }, getCommonStyleSheet({ name: e = "", theme: t = {}, params: n, props: r = {}, set: i, defaults: a }) { let o = this.getCommon({ @@ -4278,8 +4411,8 @@ var Vl = { defaults: a }), s = Object.entries(r).reduce((e, [t, n]) => e.push(`${t}="${n}"`) && e, []).join(" "); return Object.entries(o || {}).reduce((e, [t, n]) => { - if (ac(n) && Object.hasOwn(n, "css")) { - let r = vc(n.css), i = `${t}-variables`; + if (hc(n) && Object.hasOwn(n, "css")) { + let r = Oc(n.css), i = `${t}-variables`; e.push(``); } return e; @@ -4293,7 +4426,7 @@ var Vl = { set: i, defaults: a }, s = (e.includes("-directive") ? this.getPresetD(o) : this.getPresetC(o))?.css, c = Object.entries(r).reduce((e, [t, n]) => e.push(`${t}="${n}"`) && e, []).join(" "); - return s ? `` : ""; + return s ? `` : ""; }, createTokens(e = {}, t, n = "", r = "", i = {}) { let a = function(e, t = {}, n = []) { @@ -4305,16 +4438,16 @@ var Vl = { }; n.push(this.path), t.name = this.path, t.binding ||= {}; let r = this.value; - if (typeof this.value == "string" && Cl.test(this.value)) { - let i = this.value.trim().replace(Cl, (r) => { + if (typeof this.value == "string" && Pl.test(this.value)) { + let i = this.value.trim().replace(Pl, (r) => { let i = r.slice(1, -1), a = this.tokens[i]; if (!a) return console.warn(`Token not found for path: ${i}`), "__UNRESOLVED__"; let o = a.computed(e, t, n); return Array.isArray(o) && o.length === 2 ? `light-dark(${o[0].value},${o[1].value})` : o?.value ?? "__UNRESOLVED__"; }); - r = wl.test(i.replace(Tl, "0")) ? `calc(${i})` : i; + r = Fl.test(i.replace(Il, "0")) ? `calc(${i})` : i; } - return Qs(t.binding) && delete t.binding, n.pop(), { + return cc(t.binding) && delete t.binding, n.pop(), { colorScheme: e, path: this.path, paths: t, @@ -4322,8 +4455,8 @@ var Vl = { }; }, o = (e, n, r) => { Object.entries(e).forEach(([e, s]) => { - let c = gc(e, t.variable.excludedKeyRegex) ? n : n ? `${n}.${El(e)}` : El(e), l = r ? `${r}.${e}` : e; - ac(s) ? o(s, c, l) : (i[c] || (i[c] = { + let c = Ec(e, t.variable.excludedKeyRegex) ? n : n ? `${n}.${Ll(e)}` : Ll(e), l = r ? `${r}.${e}` : e; + hc(s) ? o(s, c, l) : (i[c] || (i[c] = { paths: [], computed: (e, t = {}, n = []) => { if (i[c].paths.length === 1) return i[c].paths[0].computed(i[c].paths[0].scheme, t.binding, n); @@ -4345,31 +4478,31 @@ var Vl = { return o(e, n, r), i; }, getTokenValue(e, t, n) { - let r = ((e) => e.split(".").filter((e) => !gc(e.toLowerCase(), n.variable.excludedKeyRegex)).join("."))(t), i = t.includes("colorScheme.light") ? "light" : t.includes("colorScheme.dark") ? "dark" : void 0, a = [e[r]?.computed(i)].flat().filter((e) => e); + let r = ((e) => e.split(".").filter((e) => !Ec(e.toLowerCase(), n.variable.excludedKeyRegex)).join("."))(t), i = t.includes("colorScheme.light") ? "light" : t.includes("colorScheme.dark") ? "dark" : void 0, a = [e[r]?.computed(i)].flat().filter((e) => e); return a.length === 1 ? a[0].value : a.reduce((e = {}, t) => { let n = t, { colorScheme: r } = n; - return e[r] = Sl(n, ["colorScheme"]), e; + return e[r] = Ml(n, ["colorScheme"]), e; }, void 0); }, getSelectorRule(e, t, n, r) { - return n === "class" || n === "attr" ? Pl(G(t) ? `${e}${t},${e} ${t}` : e, r) : Pl(e, Pl(t ?? ":root,:host", r)); + return n === "class" || n === "attr" ? Gl(K(t) ? `${e}${t},${e} ${t}` : e, r) : Gl(e, Gl(t ?? ":root,:host", r)); }, transformCSS(e, t, n, r, i = {}, a, o, s) { - if (G(t)) { + if (K(t)) { let { cssLayer: c } = i; if (r !== "style") { let e = this.getColorSchemeOption(i, o); - t = n === "dark" ? e.reduce((e, { type: n, selector: r }) => (G(r) && (e += r.includes("[CSS]") ? r.replace("[CSS]", t) : this.getSelectorRule(r, s, n, t)), e), "") : Pl(s ?? ":root,:host", t); + t = n === "dark" ? e.reduce((e, { type: n, selector: r }) => (K(r) && (e += r.includes("[CSS]") ? r.replace("[CSS]", t) : this.getSelectorRule(r, s, n, t)), e), "") : Gl(s ?? ":root,:host", t); } if (c) { let n = { name: "primeui", order: "primeui" }; - ac(c) && (n.name = lc(c.name, { + hc(c) && (n.name = yc(c.name, { name: e, type: r - })), G(n.name) && (t = Pl(`@layer ${n.name}`, t), a?.layerNames(n.name)); + })), K(n.name) && (t = Gl(`@layer ${n.name}`, t), a?.layerNames(n.name)); } return t; } @@ -4395,7 +4528,7 @@ var Vl = { _tokens: {}, update(e = {}) { let { theme: t } = e; - t && (this._theme = xl(bl({}, t), { options: bl(bl({}, this.defaults.options), t.options) }), this._tokens = Vl.createTokens(this.preset, this.defaults), this.clearLoadedStyleNames()); + t && (this._theme = jl(Al({}, t), { options: Al(Al({}, this.defaults.options), t.options) }), this._tokens = Ql.createTokens(this.preset, this.defaults), this.clearLoadedStyleNames()); }, get theme() { return this._theme; @@ -4413,19 +4546,19 @@ var Vl = { return this.theme; }, setTheme(e) { - this.update({ theme: e }), J.emit("theme:change", e); + this.update({ theme: e }), Nl.emit("theme:change", e); }, getPreset() { return this.preset; }, setPreset(e) { - this._theme = xl(bl({}, this.theme), { preset: e }), this._tokens = Vl.createTokens(e, this.defaults), this.clearLoadedStyleNames(), J.emit("preset:change", e), J.emit("theme:change", this.theme); + this._theme = jl(Al({}, this.theme), { preset: e }), this._tokens = Ql.createTokens(e, this.defaults), this.clearLoadedStyleNames(), Nl.emit("preset:change", e), Nl.emit("theme:change", this.theme); }, getOptions() { return this.options; }, setOptions(e) { - this._theme = xl(bl({}, this.theme), { options: e }), this.clearLoadedStyleNames(), J.emit("options:change", e), J.emit("theme:change", this.theme); + this._theme = jl(Al({}, this.theme), { options: e }), this.clearLoadedStyleNames(), Nl.emit("options:change", e), Nl.emit("theme:change", this.theme); }, getLayerNames() { return [...this._layerNames]; @@ -4449,10 +4582,10 @@ var Vl = { this._loadedStyleNames.clear(); }, getTokenValue(e) { - return Vl.getTokenValue(this.tokens, e, this.defaults); + return Ql.getTokenValue(this.tokens, e, this.defaults); }, getCommon(e = "", t) { - return Vl.getCommon({ + return Ql.getCommon({ name: e, theme: this.theme, params: t, @@ -4468,7 +4601,7 @@ var Vl = { defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; - return Vl.getPresetC(n); + return Ql.getPresetC(n); }, getDirective(e = "", t) { let n = { @@ -4478,7 +4611,7 @@ var Vl = { defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; - return Vl.getPresetD(n); + return Ql.getPresetD(n); }, getCustomPreset(e = "", t, n, r) { let i = { @@ -4490,16 +4623,16 @@ var Vl = { defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; - return Vl.getPreset(i); + return Ql.getPreset(i); }, getLayerOrderCSS(e = "") { - return Vl.getLayerOrder(e, this.options, { names: this.getLayerNames() }, this.defaults); + return Ql.getLayerOrder(e, this.options, { names: this.getLayerNames() }, this.defaults); }, transformCSS(e = "", t, n = "style", r) { - return Vl.transformCSS(e, t, r, n, this.options, { layerNames: this.setLayerNames.bind(this) }, this.defaults); + return Ql.transformCSS(e, t, r, n, this.options, { layerNames: this.setLayerNames.bind(this) }, this.defaults); }, getCommonStyleSheet(e = "", t, n = {}) { - return Vl.getCommonStyleSheet({ + return Ql.getCommonStyleSheet({ name: e, theme: this.theme, params: t, @@ -4509,7 +4642,7 @@ var Vl = { }); }, getStyleSheet(e, t, n = {}) { - return Vl.getStyleSheet({ + return Ql.getStyleSheet({ name: e, theme: this.theme, params: t, @@ -4525,9 +4658,9 @@ var Vl = { this._loadingStyles.add(e); }, onStyleLoaded(e, { name: t }) { - this._loadingStyles.size && (this._loadingStyles.delete(t), J.emit(`theme:${t}:load`, e), !this._loadingStyles.size && J.emit("theme:load")); + this._loadingStyles.size && (this._loadingStyles.delete(t), Nl.emit(`theme:${t}:load`, e), !this._loadingStyles.size && Nl.emit("theme:load")); } -}, Hl = { +}, $l = { STARTS_WITH: "startsWith", CONTAINS: "contains", NOT_CONTAINS: "notContains", @@ -4545,10 +4678,10 @@ var Vl = { DATE_BEFORE: "dateBefore", DATE_AFTER: "dateAfter" }; -function Ul(e, t) { +function eu(e, t) { var n = typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"]; if (!n) { - if (Array.isArray(e) || (n = Wl(e)) || t) { + if (Array.isArray(e) || (n = tu(e)) || t) { n && (e = n); var r = 0, i = function() {}; return { @@ -4588,23 +4721,23 @@ function Ul(e, t) { } }; } -function Wl(e, t) { +function tu(e, t) { if (e) { - if (typeof e == "string") return Gl(e, t); + if (typeof e == "string") return nu(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Gl(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? nu(e, t) : void 0; } } -function Gl(e, t) { +function nu(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -var Kl = { +var ru = { filter: function(e, t, n, r, i) { var a = []; if (!e) return a; - var o = Ul(e), s; + var o = eu(e), s; try { for (o.s(); !(s = o.n()).done;) { var c = s.value; @@ -4614,10 +4747,10 @@ var Kl = { continue; } } else { - var l = Ul(t), u; + var l = eu(t), u; try { for (l.s(); !(u = l.n()).done;) { - var d = u.value, f = nc(c, d); + var d = u.value, f = fc(c, d); if (this.filters[r](f, n, i)) { a.push(c); break; @@ -4641,36 +4774,36 @@ var Kl = { startsWith: function(e, t, n) { if (t == null || t === "") return !0; if (e == null) return !1; - var r = yc(t.toString()).toLocaleLowerCase(n); - return yc(e.toString()).toLocaleLowerCase(n).slice(0, r.length) === r; + var r = kc(t.toString()).toLocaleLowerCase(n); + return kc(e.toString()).toLocaleLowerCase(n).slice(0, r.length) === r; }, contains: function(e, t, n) { if (t == null || t === "") return !0; if (e == null) return !1; - var r = yc(t.toString()).toLocaleLowerCase(n); - return yc(e.toString()).toLocaleLowerCase(n).indexOf(r) !== -1; + var r = kc(t.toString()).toLocaleLowerCase(n); + return kc(e.toString()).toLocaleLowerCase(n).indexOf(r) !== -1; }, notContains: function(e, t, n) { if (t == null || t === "") return !0; if (e == null) return !1; - var r = yc(t.toString()).toLocaleLowerCase(n); - return yc(e.toString()).toLocaleLowerCase(n).indexOf(r) === -1; + var r = kc(t.toString()).toLocaleLowerCase(n); + return kc(e.toString()).toLocaleLowerCase(n).indexOf(r) === -1; }, endsWith: function(e, t, n) { if (t == null || t === "") return !0; if (e == null) return !1; - var r = yc(t.toString()).toLocaleLowerCase(n), i = yc(e.toString()).toLocaleLowerCase(n); + var r = kc(t.toString()).toLocaleLowerCase(n), i = kc(e.toString()).toLocaleLowerCase(n); return i.indexOf(r, i.length - r.length) !== -1; }, equals: function(e, t, n) { - return t == null || t === "" ? !0 : e == null ? !1 : e.getTime && t.getTime ? e.getTime() === t.getTime() : yc(e.toString()).toLocaleLowerCase(n) == yc(t.toString()).toLocaleLowerCase(n); + return t == null || t === "" ? !0 : e == null ? !1 : e.getTime && t.getTime ? e.getTime() === t.getTime() : kc(e.toString()).toLocaleLowerCase(n) == kc(t.toString()).toLocaleLowerCase(n); }, notEquals: function(e, t, n) { - return t == null || t === "" ? !1 : e == null ? !0 : e.getTime && t.getTime ? e.getTime() !== t.getTime() : yc(e.toString()).toLocaleLowerCase(n) != yc(t.toString()).toLocaleLowerCase(n); + return t == null || t === "" ? !1 : e == null ? !0 : e.getTime && t.getTime ? e.getTime() !== t.getTime() : kc(e.toString()).toLocaleLowerCase(n) != kc(t.toString()).toLocaleLowerCase(n); }, in: function(e, t) { if (t == null || t.length === 0) return !0; - for (var n = 0; n < t.length; n++) if (rc(e, t[n])) return !0; + for (var n = 0; n < t.length; n++) if (pc(e, t[n])) return !0; return !1; }, between: function(e, t) { @@ -4704,17 +4837,17 @@ var Kl = { register: function(e, t) { this.filters[e] = t; } -}, ql = "\n *,\n ::before,\n ::after {\n box-sizing: border-box;\n }\n\n .p-collapsible-enter-active {\n animation: p-animate-collapsible-expand 0.2s ease-out;\n overflow: hidden;\n }\n\n .p-collapsible-leave-active {\n animation: p-animate-collapsible-collapse 0.2s ease-out;\n overflow: hidden;\n }\n\n @keyframes p-animate-collapsible-expand {\n from {\n grid-template-rows: 0fr;\n }\n to {\n grid-template-rows: 1fr;\n }\n }\n\n @keyframes p-animate-collapsible-collapse {\n from {\n grid-template-rows: 1fr;\n }\n to {\n grid-template-rows: 0fr;\n }\n }\n\n .p-disabled,\n .p-disabled * {\n cursor: default;\n pointer-events: none;\n user-select: none;\n }\n\n .p-disabled,\n .p-component:disabled {\n opacity: dt('disabled.opacity');\n }\n\n .pi {\n font-size: dt('icon.size');\n }\n\n .p-icon {\n width: dt('icon.size');\n height: dt('icon.size');\n }\n\n .p-overlay-mask {\n background: var(--px-mask-background, dt('mask.background'));\n color: dt('mask.color');\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .p-overlay-mask-enter-active {\n animation: p-animate-overlay-mask-enter dt('mask.transition.duration') forwards;\n }\n\n .p-overlay-mask-leave-active {\n animation: p-animate-overlay-mask-leave dt('mask.transition.duration') forwards;\n }\n\n @keyframes p-animate-overlay-mask-enter {\n from {\n background: transparent;\n }\n to {\n background: var(--px-mask-background, dt('mask.background'));\n }\n }\n @keyframes p-animate-overlay-mask-leave {\n from {\n background: var(--px-mask-background, dt('mask.background'));\n }\n to {\n background: transparent;\n }\n }\n\n .p-anchored-overlay-enter-active {\n animation: p-animate-anchored-overlay-enter 300ms cubic-bezier(.19,1,.22,1);\n }\n\n .p-anchored-overlay-leave-active {\n animation: p-animate-anchored-overlay-leave 300ms cubic-bezier(.19,1,.22,1);\n }\n\n @keyframes p-animate-anchored-overlay-enter {\n from {\n opacity: 0;\n transform: scale(0.93);\n }\n }\n\n @keyframes p-animate-anchored-overlay-leave {\n to {\n opacity: 0;\n transform: scale(0.93);\n }\n }\n"; +}, iu = "\n *,\n ::before,\n ::after {\n box-sizing: border-box;\n }\n\n .p-collapsible-enter-active {\n animation: p-animate-collapsible-expand 0.2s ease-out;\n overflow: hidden;\n }\n\n .p-collapsible-leave-active {\n animation: p-animate-collapsible-collapse 0.2s ease-out;\n overflow: hidden;\n }\n\n @keyframes p-animate-collapsible-expand {\n from {\n grid-template-rows: 0fr;\n }\n to {\n grid-template-rows: 1fr;\n }\n }\n\n @keyframes p-animate-collapsible-collapse {\n from {\n grid-template-rows: 1fr;\n }\n to {\n grid-template-rows: 0fr;\n }\n }\n\n .p-disabled,\n .p-disabled * {\n cursor: default;\n pointer-events: none;\n user-select: none;\n }\n\n .p-disabled,\n .p-component:disabled {\n opacity: dt('disabled.opacity');\n }\n\n .pi {\n font-size: dt('icon.size');\n }\n\n .p-icon {\n width: dt('icon.size');\n height: dt('icon.size');\n }\n\n .p-overlay-mask {\n background: var(--px-mask-background, dt('mask.background'));\n color: dt('mask.color');\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .p-overlay-mask-enter-active {\n animation: p-animate-overlay-mask-enter dt('mask.transition.duration') forwards;\n }\n\n .p-overlay-mask-leave-active {\n animation: p-animate-overlay-mask-leave dt('mask.transition.duration') forwards;\n }\n\n @keyframes p-animate-overlay-mask-enter {\n from {\n background: transparent;\n }\n to {\n background: var(--px-mask-background, dt('mask.background'));\n }\n }\n @keyframes p-animate-overlay-mask-leave {\n from {\n background: var(--px-mask-background, dt('mask.background'));\n }\n to {\n background: transparent;\n }\n }\n\n .p-anchored-overlay-enter-active {\n animation: p-animate-anchored-overlay-enter 300ms cubic-bezier(.19,1,.22,1);\n }\n\n .p-anchored-overlay-leave-active {\n animation: p-animate-anchored-overlay-leave 300ms cubic-bezier(.19,1,.22,1);\n }\n\n @keyframes p-animate-anchored-overlay-enter {\n from {\n opacity: 0;\n transform: scale(0.93);\n }\n }\n\n @keyframes p-animate-anchored-overlay-leave {\n to {\n opacity: 0;\n transform: scale(0.93);\n }\n }\n"; // node_modules/@primevue/core/usestyle/index.mjs -function Jl(e) { +function au(e) { "@babel/helpers - typeof"; - return Jl = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return au = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Jl(e); + }, au(e); } -function Yl(e, t) { +function ou(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -4724,102 +4857,102 @@ function Yl(e, t) { } return n; } -function Xl(e) { +function su(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? Yl(Object(n), !0).forEach(function(t) { - Zl(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Yl(Object(n)).forEach(function(t) { + t % 2 ? ou(Object(n), !0).forEach(function(t) { + cu(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ou(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function Zl(e, t, n) { - return (t = Ql(t)) in e ? Object.defineProperty(e, t, { +function cu(e, t, n) { + return (t = lu(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Ql(e) { - var t = $l(e, "string"); - return Jl(t) == "symbol" ? t : t + ""; +function lu(e) { + var t = uu(e, "string"); + return au(t) == "symbol" ? t : t + ""; } -function $l(e, t) { - if (Jl(e) != "object" || !e) return e; +function uu(e, t) { + if (au(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Jl(r) != "object") return r; + if (au(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -function eu(e) { +function du(e) { var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0; - Qa() && Qa().components ? Yr(e) : t ? e() : jn(e); + co() && co().components ? ti(e) : t ? e() : Nn(e); } -var tu = 0; -function nu(e) { - var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = /* @__PURE__ */ en(!1), r = /* @__PURE__ */ en(e), i = /* @__PURE__ */ en(null), a = il() ? window.document : void 0, o = t.document, s = o === void 0 ? a : o, c = t.immediate, l = c === void 0 || c, u = t.manual, d = u !== void 0 && u, f = t.name, p = f === void 0 ? `style_${++tu}` : f, m = t.id, h = m === void 0 ? void 0 : m, g = t.media, _ = g === void 0 ? void 0 : g, v = t.nonce, y = v === void 0 ? void 0 : v, b = t.first, x = b !== void 0 && b, S = t.onMounted, C = S === void 0 ? void 0 : S, w = t.onUpdated, ee = w === void 0 ? void 0 : w, te = t.onLoad, ne = te === void 0 ? void 0 : te, T = t.props, re = T === void 0 ? {} : T, E = function() {}, ie = function(t) { +var fu = 0; +function pu(e) { + var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = /* @__PURE__ */ en(!1), r = /* @__PURE__ */ en(e), i = /* @__PURE__ */ en(null), a = ml() ? window.document : void 0, o = t.document, s = o === void 0 ? a : o, c = t.immediate, l = c === void 0 || c, u = t.manual, d = u !== void 0 && u, f = t.name, p = f === void 0 ? `style_${++fu}` : f, m = t.id, h = m === void 0 ? void 0 : m, g = t.media, _ = g === void 0 ? void 0 : g, v = t.nonce, y = v === void 0 ? void 0 : v, b = t.first, x = b !== void 0 && b, S = t.onMounted, C = S === void 0 ? void 0 : S, w = t.onUpdated, ee = w === void 0 ? void 0 : w, te = t.onLoad, ne = te === void 0 ? void 0 : te, T = t.props, re = T === void 0 ? {} : T, E = function() {}, ie = function(t) { var a = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; if (s) { - var o = Xl(Xl({}, re), a), c = o.name || p, l = o.id || h, u = o.nonce || y; - i.value = s.querySelector(`style[data-primevue-style-id="${c}"]`) || s.getElementById(l) || s.createElement("style"), i.value.isConnected || (r.value = t || e, Uc(i.value, { + var o = su(su({}, re), a), c = o.name || p, l = o.id || h, u = o.nonce || y; + i.value = s.querySelector(`style[data-primevue-style-id="${c}"]`) || s.getElementById(l) || s.createElement("style"), i.value.isConnected || (r.value = t || e, $c(i.value, { type: "text/css", id: l, media: _, nonce: u - }), x ? s.head.prepend(i.value) : s.head.appendChild(i.value), cl(i.value, "data-primevue-style-id", c), Uc(i.value, o), i.value.onload = function(e) { + }), x ? s.head.prepend(i.value) : s.head.appendChild(i.value), vl(i.value, "data-primevue-style-id", c), $c(i.value, o), i.value.onload = function(e) { return ne?.(e, { name: c }); - }, C?.(c)), !n.value && (E = Xn(r, function(e) { + }, C?.(c)), !n.value && (E = nr(r, function(e) { i.value.textContent = e, ee?.(c); }, { immediate: !0 }), n.value = !0); } }; - return l && !d && eu(ie), { + return l && !d && du(ie), { id: h, name: p, el: i, css: r, unload: function() { - s && n.value && (E(), Vc(i.value) && s.head.removeChild(i.value), n.value = !1, i.value = null); + s && n.value && (E(), Zc(i.value) && s.head.removeChild(i.value), n.value = !1, i.value = null); }, load: ie, isLoaded: /* @__PURE__ */ Gt(n) }; } // node_modules/@primevue/core/base/style/index.mjs -function ru(e) { +function mu(e) { "@babel/helpers - typeof"; - return ru = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return mu = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, ru(e); + }, mu(e); } -var iu, au, ou, su; -function cu(e, t) { - return pu(e) || fu(e, t) || uu(e, t) || lu(); +var hu, gu, _u, vu; +function yu(e, t) { + return wu(e) || Cu(e, t) || xu(e, t) || bu(); } -function lu() { +function bu() { throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function uu(e, t) { +function xu(e, t) { if (e) { - if (typeof e == "string") return du(e, t); + if (typeof e == "string") return Su(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? du(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Su(e, t) : void 0; } } -function du(e, t) { +function Su(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function fu(e, t) { +function Cu(e, t) { var n = e == null ? null : typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"]; if (n != null) { var r, i, a, o, s = [], c = !0, l = !1; @@ -4837,10 +4970,10 @@ function fu(e, t) { return s; } } -function pu(e) { +function wu(e) { if (Array.isArray(e)) return e; } -function mu(e, t) { +function Tu(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -4850,40 +4983,40 @@ function mu(e, t) { } return n; } -function hu(e) { +function Eu(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? mu(Object(n), !0).forEach(function(t) { - gu(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : mu(Object(n)).forEach(function(t) { + t % 2 ? Tu(Object(n), !0).forEach(function(t) { + Du(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Tu(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function gu(e, t, n) { - return (t = _u(t)) in e ? Object.defineProperty(e, t, { +function Du(e, t, n) { + return (t = Ou(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function _u(e) { - var t = vu(e, "string"); - return ru(t) == "symbol" ? t : t + ""; +function Ou(e) { + var t = ku(e, "string"); + return mu(t) == "symbol" ? t : t + ""; } -function vu(e, t) { - if (ru(e) != "object" || !e) return e; +function ku(e, t) { + if (mu(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (ru(r) != "object") return r; + if (mu(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -function yu(e, t) { +function Au(e, t) { return t ||= e.slice(0), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); } var X = { @@ -4911,14 +5044,14 @@ var X = { } `; }, - style: ql, + style: iu, classes: {}, inlineStyles: {}, load: function(e) { var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = (arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : function(e) { return e; - })(zl(iu ||= yu(["", ""]), e)); - return G(n) ? nu(vc(n), hu({ name: this.name }, t)) : {}; + })(Xl(hu ||= Au(["", ""]), e)); + return K(n) ? pu(Oc(n), Eu({ name: this.name }, t)) : {}; }, loadCSS: function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; @@ -4928,7 +5061,7 @@ var X = { var e = this, t = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, n = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : ""; return this.load(this.style, t, function() { var r = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ""; - return Y.transformCSS(t.name || e.name, `${r}${zl(au ||= yu(["", ""]), n)}`); + return Y.transformCSS(t.name || e.name, `${r}${Xl(gu ||= Au(["", ""]), n)}`); }); }, getCommonTheme: function(e) { @@ -4949,15 +5082,15 @@ var X = { getStyleSheet: function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; if (this.css) { - var n = lc(this.css, { dt: Ll }) || "", r = vc(zl(ou ||= yu([ + var n = yc(this.css, { dt: Jl }) || "", r = Oc(Xl(_u ||= Au([ "", "", "" ]), n, e)), i = Object.entries(t).reduce(function(e, t) { - var n = cu(t, 2), r = n[0], i = n[1]; + var n = yu(t, 2), r = n[0], i = n[1]; return e.push(`${r}="${i}"`) && e; }, []).join(" "); - return G(r) ? `` : ""; + return K(r) ? `` : ""; } return ""; }, @@ -4968,31 +5101,31 @@ var X = { getThemeStyleSheet: function(e) { var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = [Y.getStyleSheet(this.name, e, t)]; if (this.style) { - var r = this.name === "base" ? "global-style" : `${this.name}-style`, i = zl(su ||= yu(["", ""]), lc(this.style, { dt: Ll })), a = vc(Y.transformCSS(r, i)), o = Object.entries(t).reduce(function(e, t) { - var n = cu(t, 2), r = n[0], i = n[1]; + var r = this.name === "base" ? "global-style" : `${this.name}-style`, i = Xl(vu ||= Au(["", ""]), yc(this.style, { dt: Jl })), a = Oc(Y.transformCSS(r, i)), o = Object.entries(t).reduce(function(e, t) { + var n = yu(t, 2), r = n[0], i = n[1]; return e.push(`${r}="${i}"`) && e; }, []).join(" "); - G(a) && n.push(``); + K(a) && n.push(``); } return n.join(""); }, extend: function(e) { - return hu(hu({}, this), {}, { + return Eu(Eu({}, this), {}, { css: void 0, style: void 0 }, e); } -}, bu = Sc(); +}, ju = Mc(); // node_modules/@primevue/core/config/index.mjs -function xu(e) { +function Mu(e) { "@babel/helpers - typeof"; - return xu = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Mu = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, xu(e); + }, Mu(e); } -function Su(e, t) { +function Nu(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -5002,40 +5135,40 @@ function Su(e, t) { } return n; } -function Cu(e) { +function Pu(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? Su(Object(n), !0).forEach(function(t) { - wu(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Su(Object(n)).forEach(function(t) { + t % 2 ? Nu(Object(n), !0).forEach(function(t) { + Fu(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Nu(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function wu(e, t, n) { - return (t = Tu(t)) in e ? Object.defineProperty(e, t, { +function Fu(e, t, n) { + return (t = Iu(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Tu(e) { - var t = Eu(e, "string"); - return xu(t) == "symbol" ? t : t + ""; +function Iu(e) { + var t = Lu(e, "string"); + return Mu(t) == "symbol" ? t : t + ""; } -function Eu(e, t) { - if (xu(e) != "object" || !e) return e; +function Lu(e, t) { + if (Mu(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (xu(r) != "object") return r; + if (Mu(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var Du = { +var Ru = { ripple: !1, inputStyle: null, inputVariant: null, @@ -5222,26 +5355,26 @@ var Du = { }, filterMatchModeOptions: { text: [ - Hl.STARTS_WITH, - Hl.CONTAINS, - Hl.NOT_CONTAINS, - Hl.ENDS_WITH, - Hl.EQUALS, - Hl.NOT_EQUALS + $l.STARTS_WITH, + $l.CONTAINS, + $l.NOT_CONTAINS, + $l.ENDS_WITH, + $l.EQUALS, + $l.NOT_EQUALS ], numeric: [ - Hl.EQUALS, - Hl.NOT_EQUALS, - Hl.LESS_THAN, - Hl.LESS_THAN_OR_EQUAL_TO, - Hl.GREATER_THAN, - Hl.GREATER_THAN_OR_EQUAL_TO + $l.EQUALS, + $l.NOT_EQUALS, + $l.LESS_THAN, + $l.LESS_THAN_OR_EQUAL_TO, + $l.GREATER_THAN, + $l.GREATER_THAN_OR_EQUAL_TO ], date: [ - Hl.DATE_IS, - Hl.DATE_IS_NOT, - Hl.DATE_BEFORE, - Hl.DATE_AFTER + $l.DATE_IS, + $l.DATE_IS_NOT, + $l.DATE_BEFORE, + $l.DATE_AFTER ] }, zIndex: { @@ -5258,59 +5391,59 @@ var Du = { mergeProps: !1 }, csp: { nonce: void 0 } -}, Ou = Symbol(); -function ku(e, t) { +}, zu = Symbol(); +function Bu(e, t) { var n = { config: /* @__PURE__ */ Ut(t) }; - return e.config.globalProperties.$primevue = n, e.provide(Ou, n), ju(), Mu(e, n), n; + return e.config.globalProperties.$primevue = n, e.provide(zu, n), Hu(), Uu(e, n), n; } -var Au = []; -function ju() { - J.clear(), Au.forEach(function(e) { +var Vu = []; +function Hu() { + Nl.clear(), Vu.forEach(function(e) { return e?.(); - }), Au = []; + }), Vu = []; } -function Mu(e, t) { +function Uu(e, t) { var n = /* @__PURE__ */ en(!1), r = function() { if (t.config?.theme !== "none" && !Y.isStyleNameLoaded("common")) { var e, n = X.getCommonTheme?.call(X) || {}, r = n.primitive, i = n.semantic, a = n.global, o = n.style, s = { nonce: (e = t.config) == null || (e = e.csp) == null ? void 0 : e.nonce }; - X.load(r?.css, Cu({ name: "primitive-variables" }, s)), X.load(i?.css, Cu({ name: "semantic-variables" }, s)), X.load(a?.css, Cu({ name: "global-variables" }, s)), X.loadStyle(Cu({ name: "global-style" }, s), o), Y.setLoadedStyleName("common"); + X.load(r?.css, Pu({ name: "primitive-variables" }, s)), X.load(i?.css, Pu({ name: "semantic-variables" }, s)), X.load(a?.css, Pu({ name: "global-variables" }, s)), X.loadStyle(Pu({ name: "global-style" }, s), o), Y.setLoadedStyleName("common"); } }; - J.on("theme:change", function(t) { + Nl.on("theme:change", function(t) { n.value ||= (e.config.globalProperties.$primevue.config.theme = t, !0); }); - var i = Xn(t.config, function(e, t) { - bu.emit("config:change", { + var i = nr(t.config, function(e, t) { + ju.emit("config:change", { newValue: e, oldValue: t }); }, { immediate: !0, deep: !0 - }), a = Xn(function() { + }), a = nr(function() { return t.config.ripple; }, function(e, t) { - bu.emit("config:ripple:change", { + ju.emit("config:ripple:change", { newValue: e, oldValue: t }); }, { immediate: !0, deep: !0 - }), o = Xn(function() { + }), o = nr(function() { return t.config.theme; }, function(e, i) { - n.value || Y.setTheme(e), t.config.unstyled || r(), n.value = !1, bu.emit("config:theme:change", { + n.value || Y.setTheme(e), t.config.unstyled || r(), n.value = !1, ju.emit("config:theme:change", { newValue: e, oldValue: i }); }, { immediate: !0, deep: !1 - }), s = Xn(function() { + }), s = nr(function() { return t.config.unstyled; }, function(e, n) { - !e && t.config.theme && r(), bu.emit("config:unstyled:change", { + !e && t.config.theme && r(), ju.emit("config:unstyled:change", { newValue: e, oldValue: n }); @@ -5318,37 +5451,37 @@ function Mu(e, t) { immediate: !0, deep: !0 }); - Au.push(i), Au.push(a), Au.push(o), Au.push(s); + Vu.push(i), Vu.push(a), Vu.push(o), Vu.push(s); } -var Nu = { install: function(e, t) { - ku(e, _c(Du, t)); -} }, Pu = Sc(), Fu = Symbol(), Iu = { install: function(e) { +var Wu = { install: function(e, t) { + Bu(e, Dc(Ru, t)); +} }, Gu = Mc(), Ku = Symbol(), qu = { install: function(e) { var t = { add: function(e) { - Pu.emit("add", e); + Gu.emit("add", e); }, remove: function(e) { - Pu.emit("remove", e); + Gu.emit("remove", e); }, removeGroup: function(e) { - Pu.emit("remove-group", e); + Gu.emit("remove-group", e); }, removeAllGroups: function() { - Pu.emit("remove-all-groups"); + Gu.emit("remove-all-groups"); } }; - e.config.globalProperties.$toast = t, e.provide(Fu, t); -} }, Lu = Sc(), Ru = Symbol(), zu = { install: function(e) { + e.config.globalProperties.$toast = t, e.provide(Ku, t); +} }, Ju = Mc(), Yu = Symbol(), Xu = { install: function(e) { var t = { require: function(e) { - Lu.emit("confirm", e); + Ju.emit("confirm", e); }, close: function() { - Lu.emit("close"); + Ju.emit("close"); } }; - e.config.globalProperties.$confirm = t, e.provide(Ru, t); -} }, Bu = { + e.config.globalProperties.$confirm = t, e.provide(Yu, t); +} }, Zu = { _loadedStyleNames: /* @__PURE__ */ new Set(), getLoadedStyleNames: function() { return this._loadedStyleNames; @@ -5367,44 +5500,44 @@ var Nu = { install: function(e, t) { } }; // node_modules/@primevue/core/useattrselector/index.mjs -function Vu() { - return `${arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "pc"}${Ar().replace("v-", "").replaceAll("-", "_")}`; +function Qu() { + return `${arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "pc"}${Ir().replace("v-", "").replaceAll("-", "_")}`; } // node_modules/@primevue/core/basecomponent/index.mjs -var Hu = X.extend({ name: "common" }); -function Uu(e) { +var $u = X.extend({ name: "common" }); +function ed(e) { "@babel/helpers - typeof"; - return Uu = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return ed = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Uu(e); + }, ed(e); } -function Wu(e) { - return Zu(e) || Gu(e) || Ju(e) || qu(); +function td(e) { + return cd(e) || nd(e) || ad(e) || id(); } -function Gu(e) { +function nd(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Ku(e, t) { - return Zu(e) || Xu(e, t) || Ju(e, t) || qu(); +function rd(e, t) { + return cd(e) || sd(e, t) || ad(e, t) || id(); } -function qu() { +function id() { throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Ju(e, t) { +function ad(e, t) { if (e) { - if (typeof e == "string") return Yu(e, t); + if (typeof e == "string") return od(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Yu(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? od(e, t) : void 0; } } -function Yu(e, t) { +function od(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function Xu(e, t) { +function sd(e, t) { var n = e == null ? null : typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"]; if (n != null) { var r, i, a, o, s = [], c = !0, l = !1; @@ -5425,10 +5558,10 @@ function Xu(e, t) { return s; } } -function Zu(e) { +function cd(e) { if (Array.isArray(e)) return e; } -function Qu(e, t) { +function ld(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -5441,37 +5574,37 @@ function Qu(e, t) { function Z(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? Qu(Object(n), !0).forEach(function(t) { - $u(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Qu(Object(n)).forEach(function(t) { + t % 2 ? ld(Object(n), !0).forEach(function(t) { + ud(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ld(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function $u(e, t, n) { - return (t = ed(t)) in e ? Object.defineProperty(e, t, { +function ud(e, t, n) { + return (t = dd(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function ed(e) { - var t = td(e, "string"); - return Uu(t) == "symbol" ? t : t + ""; +function dd(e) { + var t = fd(e, "string"); + return ed(t) == "symbol" ? t : t + ""; } -function td(e, t) { - if (Uu(e) != "object" || !e) return e; +function fd(e, t) { + if (ed(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Uu(r) != "object") return r; + if (ed(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var nd = { +var pd = { name: "BaseComponent", props: { pt: { @@ -5496,14 +5629,14 @@ var nd = { isUnstyled: { immediate: !0, handler: function(e) { - J.off("theme:change", this._loadCoreStyles), e || (this._loadCoreStyles(), this._themeChangeListener(this._loadCoreStyles)); + Nl.off("theme:change", this._loadCoreStyles), e || (this._loadCoreStyles(), this._themeChangeListener(this._loadCoreStyles)); } }, dt: { immediate: !0, handler: function(e, t) { var n = this; - J.off("theme:change", this._themeScopedListener), e ? (this._loadScopedThemeStyles(e), this._themeScopedListener = function() { + Nl.off("theme:change", this._themeScopedListener), e ? (this._loadScopedThemeStyles(e), this._themeScopedListener = function() { return n._loadScopedThemeStyles(e); }, this._themeChangeListener(this._themeScopedListener)) : this._unloadScopedThemeStyles(); } @@ -5517,13 +5650,13 @@ var nd = { var e, t, n, r, i, a, o, s, c, l, u = this.pt?._usept, d = u ? (e = this.pt) == null || (e = e.originalValue) == null ? void 0 : e[this.$.type.name] : void 0; (n = (u ? (t = this.pt) == null || (t = t.value) == null ? void 0 : t[this.$.type.name] : this.pt) || d) == null || (n = n.hooks) == null || (r = n.onBeforeCreate) == null || r.call(n); var f = (i = this.$primevueConfig) == null || (i = i.pt) == null ? void 0 : i._usept, p = f ? (a = this.$primevue) == null || (a = a.config) == null || (a = a.pt) == null ? void 0 : a.originalValue : void 0; - (c = (f ? (o = this.$primevue) == null || (o = o.config) == null || (o = o.pt) == null ? void 0 : o.value : (s = this.$primevue) == null || (s = s.config) == null ? void 0 : s.pt) || p) == null || (c = c[this.$.type.name]) == null || (c = c.hooks) == null || (l = c.onBeforeCreate) == null || l.call(c), this.$attrSelector = Vu(), this.uid = this.$attrs.id || this.$attrSelector.replace("pc", "pv_id_"); + (c = (f ? (o = this.$primevue) == null || (o = o.config) == null || (o = o.pt) == null ? void 0 : o.value : (s = this.$primevue) == null || (s = s.config) == null ? void 0 : s.pt) || p) == null || (c = c[this.$.type.name]) == null || (c = c.hooks) == null || (l = c.onBeforeCreate) == null || l.call(c), this.$attrSelector = Qu(), this.uid = this.$attrs.id || this.$attrSelector.replace("pc", "pv_id_"); }, created: function() { this._hook("onCreated"); }, beforeMount: function() { - this.rootEl = Kc(Hc(this.$el) ? this.$el : this.$el?.parentElement, `[${this.$attrSelector}]`), this.rootEl && (this.rootEl.$pc = Z({ + this.rootEl = nl(Qc(this.$el) ? this.$el : this.$el?.parentElement, `[${this.$attrSelector}]`), this.rootEl && (this.rootEl.$pc = Z({ name: this.$.type.name, attrSelector: this.$attrSelector }, this.$params)), this._loadStyles(), this._hook("onBeforeMount"); @@ -5552,21 +5685,21 @@ var nd = { }, _mergeProps: function(e) { var t = [...arguments].slice(1); - return tc(e) ? e.apply(void 0, t) : W.apply(void 0, t); + return dc(e) ? e.apply(void 0, t) : G.apply(void 0, t); }, _load: function() { - Bu.isStyleNameLoaded("base") || (X.loadCSS(this.$styleOptions), this._loadGlobalStyles(), Bu.setLoadedStyleName("base")), this._loadThemeStyles(); + Zu.isStyleNameLoaded("base") || (X.loadCSS(this.$styleOptions), this._loadGlobalStyles(), Zu.setLoadedStyleName("base")), this._loadThemeStyles(); }, _loadStyles: function() { this._load(), this._themeChangeListener(this._load); }, _loadCoreStyles: function() { var e; - !Bu.isStyleNameLoaded(this.$style?.name) && (e = this.$style) != null && e.name && (Hu.loadCSS(this.$styleOptions), this.$options.style && this.$style.loadCSS(this.$styleOptions), Bu.setLoadedStyleName(this.$style.name)); + !Zu.isStyleNameLoaded(this.$style?.name) && (e = this.$style) != null && e.name && ($u.loadCSS(this.$styleOptions), this.$options.style && this.$style.loadCSS(this.$styleOptions), Zu.setLoadedStyleName(this.$style.name)); }, _loadGlobalStyles: function() { var e = this._useGlobalPT(this._getOptionValue, "global.css", this.$params); - G(e) && X.load(e, Z({ name: "global" }, this.$styleOptions)); + K(e) && X.load(e, Z({ name: "global" }, this.$styleOptions)); }, _loadThemeStyles: function() { var e; @@ -5598,10 +5731,10 @@ var nd = { }, _themeChangeListener: function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : function() {}; - Bu.clearLoadedStyleNames(), J.on("theme:change", e); + Zu.clearLoadedStyleNames(), Nl.on("theme:change", e); }, _removeThemeListeners: function() { - J.off("theme:change", this._loadCoreStyles), J.off("theme:change", this._load), J.off("theme:change", this._themeScopedListener); + Nl.off("theme:change", this._loadCoreStyles), Nl.off("theme:change", this._load), Nl.off("theme:change", this._themeScopedListener); }, _getHostInstance: function(e) { return e ? this.$options.hostName ? e.$.type.name === this.$options.hostName ? e : this._getHostInstance(e.$parentInstance) : e.$parentInstance : void 0; @@ -5610,7 +5743,7 @@ var nd = { return this[e] || this._getHostInstance(this)?.[e]; }, _getOptionValue: function(e) { - return fc(e, arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "", arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}); + return Sc(e, arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "", arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}); }, _getPTValue: function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "", n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, r = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : !0, i = /./g.test(t) && !!n[t.split(".")[0]], a = this._getPropValue("ptOptions") || this.$primevueConfig?.ptOptions || {}, o = a.mergeSections, s = o === void 0 || o, c = a.mergeProps, l = c !== void 0 && c, u = r ? i ? this._useGlobalPT(this._getPTClassValue, t, n) : this._useDefaultPT(this._getPTClassValue, t, n) : void 0, d = i ? void 0 : this._getPTSelf(e, this._getPTClassValue, t, Z(Z({}, n), {}, { global: u || {} })), f = this._getPTDatasets(t); @@ -5618,19 +5751,19 @@ var nd = { }, _getPTSelf: function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, t = [...arguments].slice(1); - return W(this._usePT.apply(this, [this._getPT(e, this.$name)].concat(t)), this._usePT.apply(this, [this.$_attrsPT].concat(t))); + return G(this._usePT.apply(this, [this._getPT(e, this.$name)].concat(t)), this._usePT.apply(this, [this.$_attrsPT].concat(t))); }, _getPTDatasets: function() { - var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", t = "data-pc-", n = e === "root" && G(this.pt?.["data-pc-section"]); - return e !== "transition" && Z(Z({}, e === "root" && Z(Z($u({}, `${t}name`, dc(n ? this.pt?.["data-pc-section"] : this.$.type.name)), n && $u({}, `${t}extend`, dc(this.$.type.name))), {}, $u({}, `${this.$attrSelector}`, ""))), {}, $u({}, `${t}section`, dc(e))); + var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", t = "data-pc-", n = e === "root" && K(this.pt?.["data-pc-section"]); + return e !== "transition" && Z(Z({}, e === "root" && Z(Z(ud({}, `${t}name`, xc(n ? this.pt?.["data-pc-section"] : this.$.type.name)), n && ud({}, `${t}extend`, xc(this.$.type.name))), {}, ud({}, `${this.$attrSelector}`, ""))), {}, ud({}, `${t}section`, xc(e))); }, _getPTClassValue: function() { var e = this._getOptionValue.apply(this, arguments); - return uc(e) || pc(e) ? { class: e } : e; + return bc(e) || Cc(e) ? { class: e } : e; }, _getPT: function(e) { var t = this, n = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "", r = arguments.length > 2 ? arguments[2] : void 0, i = function(e) { - var i = arguments.length > 1 && arguments[1] !== void 0 && arguments[1], a = r ? r(e) : e, o = dc(n), s = dc(t.$name); + var i = arguments.length > 1 && arguments[1] !== void 0 && arguments[1], a = r ? r(e) : e, o = xc(n), s = xc(t.$name); return (i && o === s ? void 0 : a?.[o]) ?? a; }; return e != null && e.hasOwnProperty("_usept") ? { @@ -5645,7 +5778,7 @@ var nd = { }; if (e != null && e.hasOwnProperty("_usept")) { var a = e._usept || this.$primevueConfig?.ptOptions || {}, o = a.mergeSections, s = o === void 0 || o, c = a.mergeProps, l = c !== void 0 && c, u = i(e.originalValue), d = i(e.value); - return u === void 0 && d === void 0 ? void 0 : uc(d) ? d : uc(u) ? u : s || !s && d ? l ? this._mergeProps(l, u, d) : Z(Z({}, u), d) : d; + return u === void 0 && d === void 0 ? void 0 : bc(d) ? d : bc(u) ? u : s || !s && d ? l ? this._mergeProps(l, u, d) : Z(Z({}, u), d) : d; } return i(e); }, @@ -5660,7 +5793,7 @@ var nd = { return this._getPTValue(this.pt, e, Z(Z({}, this.$params), t)); }, ptmi: function() { - var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = W(this.$_attrsWithoutPT, this.ptm(e, t)); + var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = G(this.$_attrsWithoutPT, this.ptm(e, t)); return n != null && n.hasOwnProperty("id") && (n.id ??= this.$id), n; }, ptmo: function() { @@ -5675,7 +5808,7 @@ var nd = { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0, n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; if (t) { var r = this._getOptionValue(this.$style.inlineStyles, e, Z(Z({}, this.$params), n)); - return [this._getOptionValue(Hu.inlineStyles, e, Z(Z({}, this.$params), n)), r]; + return [this._getOptionValue($u.inlineStyles, e, Z(Z({}, this.$params), n)), r]; } } }, @@ -5683,13 +5816,13 @@ var nd = { globalPT: function() { var e = this; return this._getPT(this.$primevueConfig?.pt, void 0, function(t) { - return lc(t, { instance: e }); + return yc(t, { instance: e }); }); }, defaultPT: function() { var e = this; return this._getPT(this.$primevueConfig?.pt, void 0, function(t) { - return e._getOptionValue(t, e.$name, Z({}, e.$params)) || lc(t, Z({}, e.$params)); + return e._getOptionValue(t, e.$name, Z({}, e.$params)) || yc(t, Z({}, e.$params)); }); }, isUnstyled: function() { @@ -5701,7 +5834,7 @@ var nd = { $inProps: function() { var e = Object.keys(this.$.vnode?.props || {}); return Object.fromEntries(Object.entries(this.$props).filter(function(t) { - var n = Ku(t, 1)[0]; + var n = rd(t, 1)[0]; return e?.includes(n); })); }, @@ -5744,38 +5877,38 @@ var nd = { }, $_attrsPT: function() { return Object.entries(this.$attrs || {}).filter(function(e) { - return Ku(e, 1)[0]?.startsWith("pt:"); + return rd(e, 1)[0]?.startsWith("pt:"); }).reduce(function(e, t) { - var n = Ku(t, 2), r = n[0], i = n[1]; - return Yu(Wu(r.split(":"))).slice(1)?.reduce(function(e, t, n, r) { + var n = rd(t, 2), r = n[0], i = n[1]; + return od(td(r.split(":"))).slice(1)?.reduce(function(e, t, n, r) { return !e[t] && (e[t] = n === r.length - 1 ? i : {}), e[t]; }, e), e; }, {}); }, $_attrsWithoutPT: function() { return Object.entries(this.$attrs || {}).filter(function(e) { - var t = Ku(e, 1)[0]; + var t = rd(e, 1)[0]; return !(t != null && t.startsWith("pt:")); }).reduce(function(e, t) { - var n = Ku(t, 2), r = n[0]; + var n = rd(t, 2), r = n[0]; return e[r] = n[1], e; }, {}); } } -}, rd = X.extend({ +}, md = X.extend({ name: "baseicon", css: "\n.p-icon {\n display: inline-block;\n vertical-align: baseline;\n flex-shrink: 0;\n}\n\n.p-icon-spin {\n -webkit-animation: p-icon-spin 2s infinite linear;\n animation: p-icon-spin 2s infinite linear;\n}\n\n@-webkit-keyframes p-icon-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n\n@keyframes p-icon-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n" }); // node_modules/@primevue/icons/baseicon/index.mjs -function id(e) { +function hd(e) { "@babel/helpers - typeof"; - return id = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return hd = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, id(e); + }, hd(e); } -function ad(e, t) { +function gd(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -5785,42 +5918,42 @@ function ad(e, t) { } return n; } -function od(e) { +function _d(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? ad(Object(n), !0).forEach(function(t) { - sd(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ad(Object(n)).forEach(function(t) { + t % 2 ? gd(Object(n), !0).forEach(function(t) { + vd(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : gd(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function sd(e, t, n) { - return (t = cd(t)) in e ? Object.defineProperty(e, t, { +function vd(e, t, n) { + return (t = yd(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function cd(e) { - var t = ld(e, "string"); - return id(t) == "symbol" ? t : t + ""; +function yd(e) { + var t = bd(e, "string"); + return hd(t) == "symbol" ? t : t + ""; } -function ld(e, t) { - if (id(e) != "object" || !e) return e; +function bd(e, t) { + if (hd(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (id(r) != "object") return r; + if (hd(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var ud = { +var xd = { name: "BaseIcon", - extends: nd, + extends: pd, props: { label: { type: String, @@ -5831,7 +5964,7 @@ var ud = { default: !1 } }, - style: rd, + style: md, provide: function() { return { $pcIcon: this, @@ -5839,63 +5972,63 @@ var ud = { }; }, methods: { pti: function() { - var e = Qs(this.label); - return od(od({}, !this.isUnstyled && { class: ["p-icon", { "p-icon-spin": this.spin }] }), {}, { + var e = cc(this.label); + return _d(_d({}, !this.isUnstyled && { class: ["p-icon", { "p-icon-spin": this.spin }] }), {}, { role: e ? void 0 : "img", "aria-label": e ? void 0 : this.label, "aria-hidden": e }); } } -}, dd = { +}, Sd = { name: "SpinnerIcon", - extends: ud + extends: xd }; -function fd(e) { - return gd(e) || hd(e) || md(e) || pd(); +function Cd(e) { + return Dd(e) || Ed(e) || Td(e) || wd(); } -function pd() { +function wd() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function md(e, t) { +function Td(e, t) { if (e) { - if (typeof e == "string") return _d(e, t); + if (typeof e == "string") return Od(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? _d(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Od(e, t) : void 0; } } -function hd(e) { +function Ed(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function gd(e) { - if (Array.isArray(e)) return _d(e); +function Dd(e) { + if (Array.isArray(e)) return Od(e); } -function _d(e, t) { +function Od(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function vd(e, t, n, r, i, a) { - return R(), z("svg", W({ +function kd(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), fd(t[0] ||= [V("path", { + }, e.pti()), Cd(t[0] ||= [H("path", { d: "M6.99701 14C5.85441 13.999 4.72939 13.7186 3.72012 13.1832C2.71084 12.6478 1.84795 11.8737 1.20673 10.9284C0.565504 9.98305 0.165424 8.89526 0.041387 7.75989C-0.0826496 6.62453 0.073125 5.47607 0.495122 4.4147C0.917119 3.35333 1.59252 2.4113 2.46241 1.67077C3.33229 0.930247 4.37024 0.413729 5.4857 0.166275C6.60117 -0.0811796 7.76026 -0.0520535 8.86188 0.251112C9.9635 0.554278 10.9742 1.12227 11.8057 1.90555C11.915 2.01493 11.9764 2.16319 11.9764 2.31778C11.9764 2.47236 11.915 2.62062 11.8057 2.73C11.7521 2.78503 11.688 2.82877 11.6171 2.85864C11.5463 2.8885 11.4702 2.90389 11.3933 2.90389C11.3165 2.90389 11.2404 2.8885 11.1695 2.85864C11.0987 2.82877 11.0346 2.78503 10.9809 2.73C9.9998 1.81273 8.73246 1.26138 7.39226 1.16876C6.05206 1.07615 4.72086 1.44794 3.62279 2.22152C2.52471 2.99511 1.72683 4.12325 1.36345 5.41602C1.00008 6.70879 1.09342 8.08723 1.62775 9.31926C2.16209 10.5513 3.10478 11.5617 4.29713 12.1803C5.48947 12.7989 6.85865 12.988 8.17414 12.7157C9.48963 12.4435 10.6711 11.7264 11.5196 10.6854C12.3681 9.64432 12.8319 8.34282 12.8328 7C12.8328 6.84529 12.8943 6.69692 13.0038 6.58752C13.1132 6.47812 13.2616 6.41667 13.4164 6.41667C13.5712 6.41667 13.7196 6.47812 13.8291 6.58752C13.9385 6.69692 14 6.84529 14 7C14 8.85651 13.2622 10.637 11.9489 11.9497C10.6356 13.2625 8.85432 14 6.99701 14Z", fill: "currentColor" }, null, -1)]), 16); } -dd.render = vd; +Sd.render = kd; // node_modules/primevue/badge/style/index.mjs -var yd = X.extend({ +var Ad = X.extend({ name: "badge", style: "\n .p-badge {\n display: inline-flex;\n border-radius: dt('badge.border.radius');\n align-items: center;\n justify-content: center;\n padding: dt('badge.padding');\n background: dt('badge.primary.background');\n color: dt('badge.primary.color');\n font-size: dt('badge.font.size');\n font-weight: dt('badge.font.weight');\n min-width: dt('badge.min.width');\n height: dt('badge.height');\n }\n\n .p-badge-dot {\n width: dt('badge.dot.size');\n min-width: dt('badge.dot.size');\n height: dt('badge.dot.size');\n border-radius: 50%;\n padding: 0;\n }\n\n .p-badge-circle {\n padding: 0;\n border-radius: 50%;\n }\n\n .p-badge-secondary {\n background: dt('badge.secondary.background');\n color: dt('badge.secondary.color');\n }\n\n .p-badge-success {\n background: dt('badge.success.background');\n color: dt('badge.success.color');\n }\n\n .p-badge-info {\n background: dt('badge.info.background');\n color: dt('badge.info.color');\n }\n\n .p-badge-warn {\n background: dt('badge.warn.background');\n color: dt('badge.warn.color');\n }\n\n .p-badge-danger {\n background: dt('badge.danger.background');\n color: dt('badge.danger.color');\n }\n\n .p-badge-contrast {\n background: dt('badge.contrast.background');\n color: dt('badge.contrast.color');\n }\n\n .p-badge-sm {\n font-size: dt('badge.sm.font.size');\n min-width: dt('badge.sm.min.width');\n height: dt('badge.sm.height');\n }\n\n .p-badge-lg {\n font-size: dt('badge.lg.font.size');\n min-width: dt('badge.lg.min.width');\n height: dt('badge.lg.height');\n }\n\n .p-badge-xl {\n font-size: dt('badge.xl.font.size');\n min-width: dt('badge.xl.min.width');\n height: dt('badge.xl.height');\n }\n", classes: { root: function(e) { var t = e.props, n = e.instance; return ["p-badge p-component", { - "p-badge-circle": G(t.value) && String(t.value).length === 1, - "p-badge-dot": Qs(t.value) && !n.$slots.default, + "p-badge-circle": K(t.value) && String(t.value).length === 1, + "p-badge-dot": cc(t.value) && !n.$slots.default, "p-badge-sm": t.size === "small", "p-badge-lg": t.size === "large", "p-badge-xl": t.size === "xlarge", @@ -5907,9 +6040,9 @@ var yd = X.extend({ "p-badge-contrast": t.severity === "contrast" }]; } } -}), bd = { +}), jd = { name: "BaseBadge", - extends: nd, + extends: pd, props: { value: { type: [String, Number], @@ -5924,7 +6057,7 @@ var yd = X.extend({ default: null } }, - style: yd, + style: Ad, provide: function() { return { $pcBadge: this, @@ -5932,84 +6065,84 @@ var yd = X.extend({ }; } }; -function xd(e) { +function Md(e) { "@babel/helpers - typeof"; - return xd = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Md = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, xd(e); + }, Md(e); } -function Sd(e, t, n) { - return (t = Cd(t)) in e ? Object.defineProperty(e, t, { +function Nd(e, t, n) { + return (t = Pd(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Cd(e) { - var t = wd(e, "string"); - return xd(t) == "symbol" ? t : t + ""; +function Pd(e) { + var t = Fd(e, "string"); + return Md(t) == "symbol" ? t : t + ""; } -function wd(e, t) { - if (xd(e) != "object" || !e) return e; +function Fd(e, t) { + if (Md(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (xd(r) != "object") return r; + if (Md(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var Td = { +var Id = { name: "Badge", - extends: bd, + extends: jd, inheritAttrs: !1, computed: { dataP: function() { - return K(Sd(Sd({ + return q(Nd(Nd({ circle: this.value != null && String(this.value).length === 1, empty: this.value == null && !this.$slots.default }, this.severity, this.severity), this.size, this.size)); } } -}, Ed = ["data-p"]; -function Dd(e, t, n, r, i, a) { - return R(), z("span", W({ +}, Ld = ["data-p"]; +function Rd(e, t, n, r, i, a) { + return z(), B("span", G({ class: e.cx("root"), "data-p": a.dataP }, e.ptmi("root")), [I(e.$slots, "default", {}, function() { - return [Ua(O(e.value), 1)]; - })], 16, Ed); + return [Za(k(e.value), 1)]; + })], 16, Ld); } -Td.render = Dd; +Id.render = Rd; // node_modules/@primevue/core/basedirective/index.mjs -function Od(e) { +function zd(e) { "@babel/helpers - typeof"; - return Od = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return zd = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Od(e); + }, zd(e); } -function kd(e, t) { - return Pd(e) || Nd(e, t) || jd(e, t) || Ad(); +function Bd(e, t) { + return Gd(e) || Wd(e, t) || Hd(e, t) || Vd(); } -function Ad() { +function Vd() { throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function jd(e, t) { +function Hd(e, t) { if (e) { - if (typeof e == "string") return Md(e, t); + if (typeof e == "string") return Ud(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Md(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Ud(e, t) : void 0; } } -function Md(e, t) { +function Ud(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function Nd(e, t) { +function Wd(e, t) { var n = e == null ? null : typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"]; if (n != null) { var r, i, a, o, s = [], c = !0, l = !1; @@ -6027,10 +6160,10 @@ function Nd(e, t) { return s; } } -function Pd(e) { +function Gd(e) { if (Array.isArray(e)) return e; } -function Fd(e, t) { +function Kd(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -6043,59 +6176,59 @@ function Fd(e, t) { function Q(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? Fd(Object(n), !0).forEach(function(t) { - Id(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Fd(Object(n)).forEach(function(t) { + t % 2 ? Kd(Object(n), !0).forEach(function(t) { + qd(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Kd(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function Id(e, t, n) { - return (t = Ld(t)) in e ? Object.defineProperty(e, t, { +function qd(e, t, n) { + return (t = Jd(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Ld(e) { - var t = Rd(e, "string"); - return Od(t) == "symbol" ? t : t + ""; +function Jd(e) { + var t = Yd(e, "string"); + return zd(t) == "symbol" ? t : t + ""; } -function Rd(e, t) { - if (Od(e) != "object" || !e) return e; +function Yd(e, t) { + if (zd(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Od(r) != "object") return r; + if (zd(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } var $ = { _getMeta: function() { - return [ac(arguments.length <= 0 ? void 0 : arguments[0]) || arguments.length <= 0 ? void 0 : arguments[0], lc(ac(arguments.length <= 0 ? void 0 : arguments[0]) ? arguments.length <= 0 ? void 0 : arguments[0] : arguments.length <= 1 ? void 0 : arguments[1])]; + return [hc(arguments.length <= 0 ? void 0 : arguments[0]) || arguments.length <= 0 ? void 0 : arguments[0], yc(hc(arguments.length <= 0 ? void 0 : arguments[0]) ? arguments.length <= 0 ? void 0 : arguments[0] : arguments.length <= 1 ? void 0 : arguments[1])]; }, _getConfig: function(e, t) { var n, r; return ((e == null || (n = e.instance) == null ? void 0 : n.$primevue) || (t == null || (r = t.ctx) == null || (r = r.appContext) == null || (r = r.config) == null || (r = r.globalProperties) == null ? void 0 : r.$primevue))?.config; }, - _getOptionValue: fc, + _getOptionValue: Sc, _getPTValue: function() { var e, t = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, n = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "", i = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {}, a = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : !0, o = function() { var e = $._getOptionValue.apply($, arguments); - return uc(e) || pc(e) ? { class: e } : e; + return bc(e) || Cc(e) ? { class: e } : e; }, s = ((e = t.binding) == null || (e = e.value) == null ? void 0 : e.ptOptions) || t.$primevueConfig?.ptOptions || {}, c = s.mergeSections, l = c === void 0 || c, u = s.mergeProps, d = u !== void 0 && u, f = a ? $._useDefaultPT(t, t.defaultPT(), o, r, i) : void 0, p = $._usePT(t, $._getPT(n, t.$name), o, r, Q(Q({}, i), {}, { global: f || {} })), m = $._getPTDatasets(t, r); return l || !l && p ? d ? $._mergeProps(t, d, f, p, m) : Q(Q(Q({}, f), p), m) : Q(Q({}, p), m); }, _getPTDatasets: function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "", n = "data-pc-"; - return Q(Q({}, t === "root" && Id({}, `${n}name`, dc(e.$name))), {}, Id({}, `${n}section`, dc(t))); + return Q(Q({}, t === "root" && qd({}, `${n}name`, xc(e.$name))), {}, qd({}, `${n}section`, xc(t))); }, _getPT: function(e) { var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "", n = arguments.length > 2 ? arguments[2] : void 0, r = function(e) { - var r = n ? n(e) : e, i = dc(t); + var r = n ? n(e) : e, i = xc(t); return r?.[i] ?? r; }; return e && Object.hasOwn(e, "_usept") ? { @@ -6110,7 +6243,7 @@ var $ = { }; if (t && Object.hasOwn(t, "_usept")) { var o = t._usept || e.$primevueConfig?.ptOptions || {}, s = o.mergeSections, c = s === void 0 || s, l = o.mergeProps, u = l !== void 0 && l, d = a(t.originalValue), f = a(t.value); - return d === void 0 && f === void 0 ? void 0 : uc(f) ? f : uc(d) ? d : c || !c && f ? u ? $._mergeProps(e, u, d, f) : Q(Q({}, d), f) : f; + return d === void 0 && f === void 0 ? void 0 : bc(f) ? f : bc(d) ? d : c || !c && f ? u ? $._mergeProps(e, u, d, f) : Q(Q({}, d), f) : f; } return a(t); }, @@ -6126,9 +6259,9 @@ var $ = { }, _loadCoreStyles: function() { var e, t = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, n = arguments.length > 1 ? arguments[1] : void 0; - if (!Bu.isStyleNameLoaded(t.$style?.name) && (e = t.$style) != null && e.name) { + if (!Zu.isStyleNameLoaded(t.$style?.name) && (e = t.$style) != null && e.name) { var r; - X.loadCSS(n), (r = t.$style) == null || r.loadCSS(n), Bu.setLoadedStyleName(t.$style.name); + X.loadCSS(n), (r = t.$style) == null || r.loadCSS(n), Zu.setLoadedStyleName(t.$style.name); } }, _loadThemeStyles: function() { @@ -6160,14 +6293,14 @@ var $ = { }, _themeChangeListener: function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : function() {}; - Bu.clearLoadedStyleNames(), J.on("theme:change", e); + Zu.clearLoadedStyleNames(), Nl.on("theme:change", e); }, _removeThemeListeners: function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; - J.off("theme:change", e.$loadStyles), e.$loadStyles = void 0; + Nl.off("theme:change", e.$loadStyles), e.$loadStyles = void 0; }, _hook: function(e, t, n, r, i, a) { - var o, s, c = `on${bc(t)}`, l = $._getConfig(r, i), u = n?.$instance, d = $._usePT(u, $._getPT(r == null || (o = r.value) == null ? void 0 : o.pt, e), $._getOptionValue, `hooks.${c}`), f = $._useDefaultPT(u, l == null || (s = l.pt) == null || (s = s.directives) == null ? void 0 : s[e], $._getOptionValue, `hooks.${c}`), p = { + var o, s, c = `on${Ac(t)}`, l = $._getConfig(r, i), u = n?.$instance, d = $._usePT(u, $._getPT(r == null || (o = r.value) == null ? void 0 : o.pt, e), $._getOptionValue, `hooks.${c}`), f = $._useDefaultPT(u, l == null || (s = l.pt) == null || (s = s.directives) == null ? void 0 : s[e], $._getOptionValue, `hooks.${c}`), p = { el: n, binding: r, vnode: i, @@ -6177,13 +6310,13 @@ var $ = { }, _mergeProps: function() { var e = arguments.length > 1 ? arguments[1] : void 0, t = [...arguments].slice(2); - return tc(e) ? e.apply(void 0, t) : W.apply(void 0, t); + return dc(e) ? e.apply(void 0, t) : G.apply(void 0, t); }, _extend: function(e) { var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = function(n, r, i, a, o) { var s, c, l; r._$instances = r._$instances || {}; - var u = $._getConfig(i, a), d = r._$instances[e] || {}, f = Qs(d) ? Q(Q({}, t), t?.methods) : {}; + var u = $._getConfig(i, a), d = r._$instances[e] || {}, f = cc(d) ? Q(Q({}, t), t?.methods) : {}; r._$instances[e] = Q(Q({}, d), {}, { $name: e, $host: r, @@ -6249,16 +6382,16 @@ var $ = { a.$watchersCallback = { config: s, "config.ripple": c - }, o == null || (n = o.config) == null || n.call(a, a?.$primevueConfig), bu.on("config:change", s), o == null || (r = o["config.ripple"]) == null || r.call(a, a == null || (i = a.$primevueConfig) == null ? void 0 : i.ripple), bu.on("config:ripple:change", c); + }, o == null || (n = o.config) == null || n.call(a, a?.$primevueConfig), ju.on("config:change", s), o == null || (r = o["config.ripple"]) == null || r.call(a, a == null || (i = a.$primevueConfig) == null ? void 0 : i.ripple), ju.on("config:ripple:change", c); }, i = function(t) { var n = t._$instances[e].$watchersCallback; - n && (bu.off("config:change", n.config), bu.off("config:ripple:change", n["config.ripple"]), t._$instances[e].$watchersCallback = void 0); + n && (ju.off("config:change", n.config), ju.off("config:ripple:change", n["config.ripple"]), t._$instances[e].$watchersCallback = void 0); }; return { created: function(t, r, i, a) { t.$pd ||= {}, t.$pd[e] = { name: e, - attrSelector: ul("pd") + attrSelector: bl("pd") }, n("created", t, r, i, a); }, beforeMount: function(t, i, a, o) { @@ -6283,72 +6416,72 @@ var $ = { }; }, extend: function() { - var e = kd($._getMeta.apply($, arguments), 2), t = e[0], n = e[1]; + var e = Bd($._getMeta.apply($, arguments), 2), t = e[0], n = e[1]; return Q({ extend: function() { - var e = kd($._getMeta.apply($, arguments), 2), t = e[0], r = e[1]; + var e = Bd($._getMeta.apply($, arguments), 2), t = e[0], r = e[1]; return $.extend(t, Q(Q(Q({}, n), n?.methods), r)); } }, $._extend(t, n)); } -}, zd = X.extend({ +}, Xd = X.extend({ name: "ripple-directive", style: "\n .p-ink {\n display: block;\n position: absolute;\n background: dt('ripple.background');\n border-radius: 100%;\n transform: scale(0);\n pointer-events: none;\n }\n\n .p-ink-active {\n animation: ripple 0.4s linear;\n }\n\n @keyframes ripple {\n 100% {\n opacity: 0;\n transform: scale(2.5);\n }\n }\n", classes: { root: "p-ink" } -}), Bd = $.extend({ style: zd }); -function Vd(e) { +}), Zd = $.extend({ style: Xd }); +function Qd(e) { "@babel/helpers - typeof"; - return Vd = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Qd = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Vd(e); + }, Qd(e); } -function Hd(e) { - return Kd(e) || Gd(e) || Wd(e) || Ud(); +function $d(e) { + return rf(e) || nf(e) || tf(e) || ef(); } -function Ud() { +function ef() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Wd(e, t) { +function tf(e, t) { if (e) { - if (typeof e == "string") return qd(e, t); + if (typeof e == "string") return af(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? qd(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? af(e, t) : void 0; } } -function Gd(e) { +function nf(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Kd(e) { - if (Array.isArray(e)) return qd(e); +function rf(e) { + if (Array.isArray(e)) return af(e); } -function qd(e, t) { +function af(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function Jd(e, t, n) { - return (t = Yd(t)) in e ? Object.defineProperty(e, t, { +function of(e, t, n) { + return (t = sf(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Yd(e) { - var t = Xd(e, "string"); - return Vd(t) == "symbol" ? t : t + ""; +function sf(e) { + var t = cf(e, "string"); + return Qd(t) == "symbol" ? t : t + ""; } -function Xd(e, t) { - if (Vd(e) != "object" || !e) return e; +function cf(e, t) { + if (Qd(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Vd(r) != "object") return r; + if (Qd(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var Zd = Bd.extend("ripple", { +var lf = Zd.extend("ripple", { watch: { "config.ripple": function(e) { e ? (this.createRipple(this.$host), this.bindEvents(this.$host), this.$host.setAttribute("data-pd-ripple", !0), this.$host.style.overflow = "hidden", this.$host.style.position = "relative") : (this.remove(this.$host), this.$host.removeAttribute("data-pd-ripple")); } }, @@ -6365,7 +6498,7 @@ var Zd = Bd.extend("ripple", { }, createRipple: function(e) { var t = this.getInk(e); - t || (t = Wc("span", Jd(Jd({ + t || (t = el("span", of(of({ role: "presentation", "aria-hidden": !0, "data-p-ink": !0, @@ -6381,64 +6514,64 @@ var Zd = Bd.extend("ripple", { onMouseDown: function(e) { var t = this, n = e.currentTarget, r = this.getInk(n); if (r && getComputedStyle(r, null).display !== "none") { - if (!this.isUnstyled() && Dc(r, "p-ink-active"), r.setAttribute("data-p-ink-active", "false"), !Xc(r) && !nl(r)) { - var i = Math.max(Rc(n), $c(n)); + if (!this.isUnstyled() && Lc(r, "p-ink-active"), r.setAttribute("data-p-ink-active", "false"), !ol(r) && !fl(r)) { + var i = Math.max(Jc(n), ll(n)); r.style.height = i + "px", r.style.width = i + "px"; } - var a = Qc(n), o = e.pageX - a.left + document.body.scrollTop - nl(r) / 2, s = e.pageY - a.top + document.body.scrollLeft - Xc(r) / 2; - r.style.top = s + "px", r.style.left = o + "px", !this.isUnstyled() && wc(r, "p-ink-active"), r.setAttribute("data-p-ink-active", "true"), this.timeout = setTimeout(function() { - r && (!t.isUnstyled() && Dc(r, "p-ink-active"), r.setAttribute("data-p-ink-active", "false")); + var a = cl(n), o = e.pageX - a.left + document.body.scrollTop - fl(r) / 2, s = e.pageY - a.top + document.body.scrollLeft - ol(r) / 2; + r.style.top = s + "px", r.style.left = o + "px", !this.isUnstyled() && Pc(r, "p-ink-active"), r.setAttribute("data-p-ink-active", "true"), this.timeout = setTimeout(function() { + r && (!t.isUnstyled() && Lc(r, "p-ink-active"), r.setAttribute("data-p-ink-active", "false")); }, 401); } }, onAnimationEnd: function(e) { - this.timeout && clearTimeout(this.timeout), !this.isUnstyled() && Dc(e.currentTarget, "p-ink-active"), e.currentTarget.setAttribute("data-p-ink-active", "false"); + this.timeout && clearTimeout(this.timeout), !this.isUnstyled() && Lc(e.currentTarget, "p-ink-active"), e.currentTarget.setAttribute("data-p-ink-active", "false"); }, getInk: function(e) { - return e && e.children ? Hd(e.children).find(function(e) { - return qc(e, "data-pc-name") === "ripple"; + return e && e.children ? $d(e.children).find(function(e) { + return rl(e, "data-pc-name") === "ripple"; }) : void 0; } } -}), Qd = "\n .p-button {\n display: inline-flex;\n cursor: pointer;\n user-select: none;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n position: relative;\n color: dt('button.primary.color');\n background: dt('button.primary.background');\n border: 1px solid dt('button.primary.border.color');\n padding: dt('button.padding.y') dt('button.padding.x');\n font-size: 1rem;\n font-family: inherit;\n font-feature-settings: inherit;\n transition:\n background dt('button.transition.duration'),\n color dt('button.transition.duration'),\n border-color dt('button.transition.duration'),\n outline-color dt('button.transition.duration'),\n box-shadow dt('button.transition.duration');\n border-radius: dt('button.border.radius');\n outline-color: transparent;\n gap: dt('button.gap');\n }\n\n .p-button:disabled {\n cursor: default;\n }\n\n .p-button-icon-right {\n order: 1;\n }\n\n .p-button-icon-right:dir(rtl) {\n order: -1;\n }\n\n .p-button:not(.p-button-vertical) .p-button-icon:not(.p-button-icon-right):dir(rtl) {\n order: 1;\n }\n\n .p-button-icon-bottom {\n order: 2;\n }\n\n .p-button-icon-only {\n width: dt('button.icon.only.width');\n padding-inline-start: 0;\n padding-inline-end: 0;\n gap: 0;\n }\n\n .p-button-icon-only.p-button-rounded {\n border-radius: 50%;\n height: dt('button.icon.only.width');\n }\n\n .p-button-icon-only .p-button-label {\n visibility: hidden;\n width: 0;\n }\n\n .p-button-icon-only::after {\n content: \"\xA0\";\n visibility: hidden;\n width: 0;\n }\n\n .p-button-sm {\n font-size: dt('button.sm.font.size');\n padding: dt('button.sm.padding.y') dt('button.sm.padding.x');\n }\n\n .p-button-sm .p-button-icon {\n font-size: dt('button.sm.font.size');\n }\n\n .p-button-sm.p-button-icon-only {\n width: dt('button.sm.icon.only.width');\n }\n\n .p-button-sm.p-button-icon-only.p-button-rounded {\n height: dt('button.sm.icon.only.width');\n }\n\n .p-button-lg {\n font-size: dt('button.lg.font.size');\n padding: dt('button.lg.padding.y') dt('button.lg.padding.x');\n }\n\n .p-button-lg .p-button-icon {\n font-size: dt('button.lg.font.size');\n }\n\n .p-button-lg.p-button-icon-only {\n width: dt('button.lg.icon.only.width');\n }\n\n .p-button-lg.p-button-icon-only.p-button-rounded {\n height: dt('button.lg.icon.only.width');\n }\n\n .p-button-vertical {\n flex-direction: column;\n }\n\n .p-button-label {\n font-weight: dt('button.label.font.weight');\n }\n\n .p-button-fluid {\n width: 100%;\n }\n\n .p-button-fluid.p-button-icon-only {\n width: dt('button.icon.only.width');\n }\n\n .p-button:not(:disabled):hover {\n background: dt('button.primary.hover.background');\n border: 1px solid dt('button.primary.hover.border.color');\n color: dt('button.primary.hover.color');\n }\n\n .p-button:not(:disabled):active {\n background: dt('button.primary.active.background');\n border: 1px solid dt('button.primary.active.border.color');\n color: dt('button.primary.active.color');\n }\n\n .p-button:focus-visible {\n box-shadow: dt('button.primary.focus.ring.shadow');\n outline: dt('button.focus.ring.width') dt('button.focus.ring.style') dt('button.primary.focus.ring.color');\n outline-offset: dt('button.focus.ring.offset');\n }\n\n .p-button .p-badge {\n min-width: dt('button.badge.size');\n height: dt('button.badge.size');\n line-height: dt('button.badge.size');\n }\n\n .p-button-raised {\n box-shadow: dt('button.raised.shadow');\n }\n\n .p-button-rounded {\n border-radius: dt('button.rounded.border.radius');\n }\n\n .p-button-secondary {\n background: dt('button.secondary.background');\n border: 1px solid dt('button.secondary.border.color');\n color: dt('button.secondary.color');\n }\n\n .p-button-secondary:not(:disabled):hover {\n background: dt('button.secondary.hover.background');\n border: 1px solid dt('button.secondary.hover.border.color');\n color: dt('button.secondary.hover.color');\n }\n\n .p-button-secondary:not(:disabled):active {\n background: dt('button.secondary.active.background');\n border: 1px solid dt('button.secondary.active.border.color');\n color: dt('button.secondary.active.color');\n }\n\n .p-button-secondary:focus-visible {\n outline-color: dt('button.secondary.focus.ring.color');\n box-shadow: dt('button.secondary.focus.ring.shadow');\n }\n\n .p-button-success {\n background: dt('button.success.background');\n border: 1px solid dt('button.success.border.color');\n color: dt('button.success.color');\n }\n\n .p-button-success:not(:disabled):hover {\n background: dt('button.success.hover.background');\n border: 1px solid dt('button.success.hover.border.color');\n color: dt('button.success.hover.color');\n }\n\n .p-button-success:not(:disabled):active {\n background: dt('button.success.active.background');\n border: 1px solid dt('button.success.active.border.color');\n color: dt('button.success.active.color');\n }\n\n .p-button-success:focus-visible {\n outline-color: dt('button.success.focus.ring.color');\n box-shadow: dt('button.success.focus.ring.shadow');\n }\n\n .p-button-info {\n background: dt('button.info.background');\n border: 1px solid dt('button.info.border.color');\n color: dt('button.info.color');\n }\n\n .p-button-info:not(:disabled):hover {\n background: dt('button.info.hover.background');\n border: 1px solid dt('button.info.hover.border.color');\n color: dt('button.info.hover.color');\n }\n\n .p-button-info:not(:disabled):active {\n background: dt('button.info.active.background');\n border: 1px solid dt('button.info.active.border.color');\n color: dt('button.info.active.color');\n }\n\n .p-button-info:focus-visible {\n outline-color: dt('button.info.focus.ring.color');\n box-shadow: dt('button.info.focus.ring.shadow');\n }\n\n .p-button-warn {\n background: dt('button.warn.background');\n border: 1px solid dt('button.warn.border.color');\n color: dt('button.warn.color');\n }\n\n .p-button-warn:not(:disabled):hover {\n background: dt('button.warn.hover.background');\n border: 1px solid dt('button.warn.hover.border.color');\n color: dt('button.warn.hover.color');\n }\n\n .p-button-warn:not(:disabled):active {\n background: dt('button.warn.active.background');\n border: 1px solid dt('button.warn.active.border.color');\n color: dt('button.warn.active.color');\n }\n\n .p-button-warn:focus-visible {\n outline-color: dt('button.warn.focus.ring.color');\n box-shadow: dt('button.warn.focus.ring.shadow');\n }\n\n .p-button-help {\n background: dt('button.help.background');\n border: 1px solid dt('button.help.border.color');\n color: dt('button.help.color');\n }\n\n .p-button-help:not(:disabled):hover {\n background: dt('button.help.hover.background');\n border: 1px solid dt('button.help.hover.border.color');\n color: dt('button.help.hover.color');\n }\n\n .p-button-help:not(:disabled):active {\n background: dt('button.help.active.background');\n border: 1px solid dt('button.help.active.border.color');\n color: dt('button.help.active.color');\n }\n\n .p-button-help:focus-visible {\n outline-color: dt('button.help.focus.ring.color');\n box-shadow: dt('button.help.focus.ring.shadow');\n }\n\n .p-button-danger {\n background: dt('button.danger.background');\n border: 1px solid dt('button.danger.border.color');\n color: dt('button.danger.color');\n }\n\n .p-button-danger:not(:disabled):hover {\n background: dt('button.danger.hover.background');\n border: 1px solid dt('button.danger.hover.border.color');\n color: dt('button.danger.hover.color');\n }\n\n .p-button-danger:not(:disabled):active {\n background: dt('button.danger.active.background');\n border: 1px solid dt('button.danger.active.border.color');\n color: dt('button.danger.active.color');\n }\n\n .p-button-danger:focus-visible {\n outline-color: dt('button.danger.focus.ring.color');\n box-shadow: dt('button.danger.focus.ring.shadow');\n }\n\n .p-button-contrast {\n background: dt('button.contrast.background');\n border: 1px solid dt('button.contrast.border.color');\n color: dt('button.contrast.color');\n }\n\n .p-button-contrast:not(:disabled):hover {\n background: dt('button.contrast.hover.background');\n border: 1px solid dt('button.contrast.hover.border.color');\n color: dt('button.contrast.hover.color');\n }\n\n .p-button-contrast:not(:disabled):active {\n background: dt('button.contrast.active.background');\n border: 1px solid dt('button.contrast.active.border.color');\n color: dt('button.contrast.active.color');\n }\n\n .p-button-contrast:focus-visible {\n outline-color: dt('button.contrast.focus.ring.color');\n box-shadow: dt('button.contrast.focus.ring.shadow');\n }\n\n .p-button-outlined {\n background: transparent;\n border-color: dt('button.outlined.primary.border.color');\n color: dt('button.outlined.primary.color');\n }\n\n .p-button-outlined:not(:disabled):hover {\n background: dt('button.outlined.primary.hover.background');\n border-color: dt('button.outlined.primary.border.color');\n color: dt('button.outlined.primary.color');\n }\n\n .p-button-outlined:not(:disabled):active {\n background: dt('button.outlined.primary.active.background');\n border-color: dt('button.outlined.primary.border.color');\n color: dt('button.outlined.primary.color');\n }\n\n .p-button-outlined.p-button-secondary {\n border-color: dt('button.outlined.secondary.border.color');\n color: dt('button.outlined.secondary.color');\n }\n\n .p-button-outlined.p-button-secondary:not(:disabled):hover {\n background: dt('button.outlined.secondary.hover.background');\n border-color: dt('button.outlined.secondary.border.color');\n color: dt('button.outlined.secondary.color');\n }\n\n .p-button-outlined.p-button-secondary:not(:disabled):active {\n background: dt('button.outlined.secondary.active.background');\n border-color: dt('button.outlined.secondary.border.color');\n color: dt('button.outlined.secondary.color');\n }\n\n .p-button-outlined.p-button-success {\n border-color: dt('button.outlined.success.border.color');\n color: dt('button.outlined.success.color');\n }\n\n .p-button-outlined.p-button-success:not(:disabled):hover {\n background: dt('button.outlined.success.hover.background');\n border-color: dt('button.outlined.success.border.color');\n color: dt('button.outlined.success.color');\n }\n\n .p-button-outlined.p-button-success:not(:disabled):active {\n background: dt('button.outlined.success.active.background');\n border-color: dt('button.outlined.success.border.color');\n color: dt('button.outlined.success.color');\n }\n\n .p-button-outlined.p-button-info {\n border-color: dt('button.outlined.info.border.color');\n color: dt('button.outlined.info.color');\n }\n\n .p-button-outlined.p-button-info:not(:disabled):hover {\n background: dt('button.outlined.info.hover.background');\n border-color: dt('button.outlined.info.border.color');\n color: dt('button.outlined.info.color');\n }\n\n .p-button-outlined.p-button-info:not(:disabled):active {\n background: dt('button.outlined.info.active.background');\n border-color: dt('button.outlined.info.border.color');\n color: dt('button.outlined.info.color');\n }\n\n .p-button-outlined.p-button-warn {\n border-color: dt('button.outlined.warn.border.color');\n color: dt('button.outlined.warn.color');\n }\n\n .p-button-outlined.p-button-warn:not(:disabled):hover {\n background: dt('button.outlined.warn.hover.background');\n border-color: dt('button.outlined.warn.border.color');\n color: dt('button.outlined.warn.color');\n }\n\n .p-button-outlined.p-button-warn:not(:disabled):active {\n background: dt('button.outlined.warn.active.background');\n border-color: dt('button.outlined.warn.border.color');\n color: dt('button.outlined.warn.color');\n }\n\n .p-button-outlined.p-button-help {\n border-color: dt('button.outlined.help.border.color');\n color: dt('button.outlined.help.color');\n }\n\n .p-button-outlined.p-button-help:not(:disabled):hover {\n background: dt('button.outlined.help.hover.background');\n border-color: dt('button.outlined.help.border.color');\n color: dt('button.outlined.help.color');\n }\n\n .p-button-outlined.p-button-help:not(:disabled):active {\n background: dt('button.outlined.help.active.background');\n border-color: dt('button.outlined.help.border.color');\n color: dt('button.outlined.help.color');\n }\n\n .p-button-outlined.p-button-danger {\n border-color: dt('button.outlined.danger.border.color');\n color: dt('button.outlined.danger.color');\n }\n\n .p-button-outlined.p-button-danger:not(:disabled):hover {\n background: dt('button.outlined.danger.hover.background');\n border-color: dt('button.outlined.danger.border.color');\n color: dt('button.outlined.danger.color');\n }\n\n .p-button-outlined.p-button-danger:not(:disabled):active {\n background: dt('button.outlined.danger.active.background');\n border-color: dt('button.outlined.danger.border.color');\n color: dt('button.outlined.danger.color');\n }\n\n .p-button-outlined.p-button-contrast {\n border-color: dt('button.outlined.contrast.border.color');\n color: dt('button.outlined.contrast.color');\n }\n\n .p-button-outlined.p-button-contrast:not(:disabled):hover {\n background: dt('button.outlined.contrast.hover.background');\n border-color: dt('button.outlined.contrast.border.color');\n color: dt('button.outlined.contrast.color');\n }\n\n .p-button-outlined.p-button-contrast:not(:disabled):active {\n background: dt('button.outlined.contrast.active.background');\n border-color: dt('button.outlined.contrast.border.color');\n color: dt('button.outlined.contrast.color');\n }\n\n .p-button-outlined.p-button-plain {\n border-color: dt('button.outlined.plain.border.color');\n color: dt('button.outlined.plain.color');\n }\n\n .p-button-outlined.p-button-plain:not(:disabled):hover {\n background: dt('button.outlined.plain.hover.background');\n border-color: dt('button.outlined.plain.border.color');\n color: dt('button.outlined.plain.color');\n }\n\n .p-button-outlined.p-button-plain:not(:disabled):active {\n background: dt('button.outlined.plain.active.background');\n border-color: dt('button.outlined.plain.border.color');\n color: dt('button.outlined.plain.color');\n }\n\n .p-button-text {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.primary.color');\n }\n\n .p-button-text:not(:disabled):hover {\n background: dt('button.text.primary.hover.background');\n border-color: transparent;\n color: dt('button.text.primary.color');\n }\n\n .p-button-text:not(:disabled):active {\n background: dt('button.text.primary.active.background');\n border-color: transparent;\n color: dt('button.text.primary.color');\n }\n\n .p-button-text.p-button-secondary {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.secondary.color');\n }\n\n .p-button-text.p-button-secondary:not(:disabled):hover {\n background: dt('button.text.secondary.hover.background');\n border-color: transparent;\n color: dt('button.text.secondary.color');\n }\n\n .p-button-text.p-button-secondary:not(:disabled):active {\n background: dt('button.text.secondary.active.background');\n border-color: transparent;\n color: dt('button.text.secondary.color');\n }\n\n .p-button-text.p-button-success {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.success.color');\n }\n\n .p-button-text.p-button-success:not(:disabled):hover {\n background: dt('button.text.success.hover.background');\n border-color: transparent;\n color: dt('button.text.success.color');\n }\n\n .p-button-text.p-button-success:not(:disabled):active {\n background: dt('button.text.success.active.background');\n border-color: transparent;\n color: dt('button.text.success.color');\n }\n\n .p-button-text.p-button-info {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.info.color');\n }\n\n .p-button-text.p-button-info:not(:disabled):hover {\n background: dt('button.text.info.hover.background');\n border-color: transparent;\n color: dt('button.text.info.color');\n }\n\n .p-button-text.p-button-info:not(:disabled):active {\n background: dt('button.text.info.active.background');\n border-color: transparent;\n color: dt('button.text.info.color');\n }\n\n .p-button-text.p-button-warn {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.warn.color');\n }\n\n .p-button-text.p-button-warn:not(:disabled):hover {\n background: dt('button.text.warn.hover.background');\n border-color: transparent;\n color: dt('button.text.warn.color');\n }\n\n .p-button-text.p-button-warn:not(:disabled):active {\n background: dt('button.text.warn.active.background');\n border-color: transparent;\n color: dt('button.text.warn.color');\n }\n\n .p-button-text.p-button-help {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.help.color');\n }\n\n .p-button-text.p-button-help:not(:disabled):hover {\n background: dt('button.text.help.hover.background');\n border-color: transparent;\n color: dt('button.text.help.color');\n }\n\n .p-button-text.p-button-help:not(:disabled):active {\n background: dt('button.text.help.active.background');\n border-color: transparent;\n color: dt('button.text.help.color');\n }\n\n .p-button-text.p-button-danger {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.danger.color');\n }\n\n .p-button-text.p-button-danger:not(:disabled):hover {\n background: dt('button.text.danger.hover.background');\n border-color: transparent;\n color: dt('button.text.danger.color');\n }\n\n .p-button-text.p-button-danger:not(:disabled):active {\n background: dt('button.text.danger.active.background');\n border-color: transparent;\n color: dt('button.text.danger.color');\n }\n\n .p-button-text.p-button-contrast {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.contrast.color');\n }\n\n .p-button-text.p-button-contrast:not(:disabled):hover {\n background: dt('button.text.contrast.hover.background');\n border-color: transparent;\n color: dt('button.text.contrast.color');\n }\n\n .p-button-text.p-button-contrast:not(:disabled):active {\n background: dt('button.text.contrast.active.background');\n border-color: transparent;\n color: dt('button.text.contrast.color');\n }\n\n .p-button-text.p-button-plain {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.plain.color');\n }\n\n .p-button-text.p-button-plain:not(:disabled):hover {\n background: dt('button.text.plain.hover.background');\n border-color: transparent;\n color: dt('button.text.plain.color');\n }\n\n .p-button-text.p-button-plain:not(:disabled):active {\n background: dt('button.text.plain.active.background');\n border-color: transparent;\n color: dt('button.text.plain.color');\n }\n\n .p-button-link {\n background: transparent;\n border-color: transparent;\n color: dt('button.link.color');\n }\n\n .p-button-link:not(:disabled):hover {\n background: transparent;\n border-color: transparent;\n color: dt('button.link.hover.color');\n }\n\n .p-button-link:not(:disabled):hover .p-button-label {\n text-decoration: underline;\n }\n\n .p-button-link:not(:disabled):active {\n background: transparent;\n border-color: transparent;\n color: dt('button.link.active.color');\n }\n"; +}), uf = "\n .p-button {\n display: inline-flex;\n cursor: pointer;\n user-select: none;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n position: relative;\n color: dt('button.primary.color');\n background: dt('button.primary.background');\n border: 1px solid dt('button.primary.border.color');\n padding: dt('button.padding.y') dt('button.padding.x');\n font-size: 1rem;\n font-family: inherit;\n font-feature-settings: inherit;\n transition:\n background dt('button.transition.duration'),\n color dt('button.transition.duration'),\n border-color dt('button.transition.duration'),\n outline-color dt('button.transition.duration'),\n box-shadow dt('button.transition.duration');\n border-radius: dt('button.border.radius');\n outline-color: transparent;\n gap: dt('button.gap');\n }\n\n .p-button:disabled {\n cursor: default;\n }\n\n .p-button-icon-right {\n order: 1;\n }\n\n .p-button-icon-right:dir(rtl) {\n order: -1;\n }\n\n .p-button:not(.p-button-vertical) .p-button-icon:not(.p-button-icon-right):dir(rtl) {\n order: 1;\n }\n\n .p-button-icon-bottom {\n order: 2;\n }\n\n .p-button-icon-only {\n width: dt('button.icon.only.width');\n padding-inline-start: 0;\n padding-inline-end: 0;\n gap: 0;\n }\n\n .p-button-icon-only.p-button-rounded {\n border-radius: 50%;\n height: dt('button.icon.only.width');\n }\n\n .p-button-icon-only .p-button-label {\n visibility: hidden;\n width: 0;\n }\n\n .p-button-icon-only::after {\n content: \"\xA0\";\n visibility: hidden;\n width: 0;\n }\n\n .p-button-sm {\n font-size: dt('button.sm.font.size');\n padding: dt('button.sm.padding.y') dt('button.sm.padding.x');\n }\n\n .p-button-sm .p-button-icon {\n font-size: dt('button.sm.font.size');\n }\n\n .p-button-sm.p-button-icon-only {\n width: dt('button.sm.icon.only.width');\n }\n\n .p-button-sm.p-button-icon-only.p-button-rounded {\n height: dt('button.sm.icon.only.width');\n }\n\n .p-button-lg {\n font-size: dt('button.lg.font.size');\n padding: dt('button.lg.padding.y') dt('button.lg.padding.x');\n }\n\n .p-button-lg .p-button-icon {\n font-size: dt('button.lg.font.size');\n }\n\n .p-button-lg.p-button-icon-only {\n width: dt('button.lg.icon.only.width');\n }\n\n .p-button-lg.p-button-icon-only.p-button-rounded {\n height: dt('button.lg.icon.only.width');\n }\n\n .p-button-vertical {\n flex-direction: column;\n }\n\n .p-button-label {\n font-weight: dt('button.label.font.weight');\n }\n\n .p-button-fluid {\n width: 100%;\n }\n\n .p-button-fluid.p-button-icon-only {\n width: dt('button.icon.only.width');\n }\n\n .p-button:not(:disabled):hover {\n background: dt('button.primary.hover.background');\n border: 1px solid dt('button.primary.hover.border.color');\n color: dt('button.primary.hover.color');\n }\n\n .p-button:not(:disabled):active {\n background: dt('button.primary.active.background');\n border: 1px solid dt('button.primary.active.border.color');\n color: dt('button.primary.active.color');\n }\n\n .p-button:focus-visible {\n box-shadow: dt('button.primary.focus.ring.shadow');\n outline: dt('button.focus.ring.width') dt('button.focus.ring.style') dt('button.primary.focus.ring.color');\n outline-offset: dt('button.focus.ring.offset');\n }\n\n .p-button .p-badge {\n min-width: dt('button.badge.size');\n height: dt('button.badge.size');\n line-height: dt('button.badge.size');\n }\n\n .p-button-raised {\n box-shadow: dt('button.raised.shadow');\n }\n\n .p-button-rounded {\n border-radius: dt('button.rounded.border.radius');\n }\n\n .p-button-secondary {\n background: dt('button.secondary.background');\n border: 1px solid dt('button.secondary.border.color');\n color: dt('button.secondary.color');\n }\n\n .p-button-secondary:not(:disabled):hover {\n background: dt('button.secondary.hover.background');\n border: 1px solid dt('button.secondary.hover.border.color');\n color: dt('button.secondary.hover.color');\n }\n\n .p-button-secondary:not(:disabled):active {\n background: dt('button.secondary.active.background');\n border: 1px solid dt('button.secondary.active.border.color');\n color: dt('button.secondary.active.color');\n }\n\n .p-button-secondary:focus-visible {\n outline-color: dt('button.secondary.focus.ring.color');\n box-shadow: dt('button.secondary.focus.ring.shadow');\n }\n\n .p-button-success {\n background: dt('button.success.background');\n border: 1px solid dt('button.success.border.color');\n color: dt('button.success.color');\n }\n\n .p-button-success:not(:disabled):hover {\n background: dt('button.success.hover.background');\n border: 1px solid dt('button.success.hover.border.color');\n color: dt('button.success.hover.color');\n }\n\n .p-button-success:not(:disabled):active {\n background: dt('button.success.active.background');\n border: 1px solid dt('button.success.active.border.color');\n color: dt('button.success.active.color');\n }\n\n .p-button-success:focus-visible {\n outline-color: dt('button.success.focus.ring.color');\n box-shadow: dt('button.success.focus.ring.shadow');\n }\n\n .p-button-info {\n background: dt('button.info.background');\n border: 1px solid dt('button.info.border.color');\n color: dt('button.info.color');\n }\n\n .p-button-info:not(:disabled):hover {\n background: dt('button.info.hover.background');\n border: 1px solid dt('button.info.hover.border.color');\n color: dt('button.info.hover.color');\n }\n\n .p-button-info:not(:disabled):active {\n background: dt('button.info.active.background');\n border: 1px solid dt('button.info.active.border.color');\n color: dt('button.info.active.color');\n }\n\n .p-button-info:focus-visible {\n outline-color: dt('button.info.focus.ring.color');\n box-shadow: dt('button.info.focus.ring.shadow');\n }\n\n .p-button-warn {\n background: dt('button.warn.background');\n border: 1px solid dt('button.warn.border.color');\n color: dt('button.warn.color');\n }\n\n .p-button-warn:not(:disabled):hover {\n background: dt('button.warn.hover.background');\n border: 1px solid dt('button.warn.hover.border.color');\n color: dt('button.warn.hover.color');\n }\n\n .p-button-warn:not(:disabled):active {\n background: dt('button.warn.active.background');\n border: 1px solid dt('button.warn.active.border.color');\n color: dt('button.warn.active.color');\n }\n\n .p-button-warn:focus-visible {\n outline-color: dt('button.warn.focus.ring.color');\n box-shadow: dt('button.warn.focus.ring.shadow');\n }\n\n .p-button-help {\n background: dt('button.help.background');\n border: 1px solid dt('button.help.border.color');\n color: dt('button.help.color');\n }\n\n .p-button-help:not(:disabled):hover {\n background: dt('button.help.hover.background');\n border: 1px solid dt('button.help.hover.border.color');\n color: dt('button.help.hover.color');\n }\n\n .p-button-help:not(:disabled):active {\n background: dt('button.help.active.background');\n border: 1px solid dt('button.help.active.border.color');\n color: dt('button.help.active.color');\n }\n\n .p-button-help:focus-visible {\n outline-color: dt('button.help.focus.ring.color');\n box-shadow: dt('button.help.focus.ring.shadow');\n }\n\n .p-button-danger {\n background: dt('button.danger.background');\n border: 1px solid dt('button.danger.border.color');\n color: dt('button.danger.color');\n }\n\n .p-button-danger:not(:disabled):hover {\n background: dt('button.danger.hover.background');\n border: 1px solid dt('button.danger.hover.border.color');\n color: dt('button.danger.hover.color');\n }\n\n .p-button-danger:not(:disabled):active {\n background: dt('button.danger.active.background');\n border: 1px solid dt('button.danger.active.border.color');\n color: dt('button.danger.active.color');\n }\n\n .p-button-danger:focus-visible {\n outline-color: dt('button.danger.focus.ring.color');\n box-shadow: dt('button.danger.focus.ring.shadow');\n }\n\n .p-button-contrast {\n background: dt('button.contrast.background');\n border: 1px solid dt('button.contrast.border.color');\n color: dt('button.contrast.color');\n }\n\n .p-button-contrast:not(:disabled):hover {\n background: dt('button.contrast.hover.background');\n border: 1px solid dt('button.contrast.hover.border.color');\n color: dt('button.contrast.hover.color');\n }\n\n .p-button-contrast:not(:disabled):active {\n background: dt('button.contrast.active.background');\n border: 1px solid dt('button.contrast.active.border.color');\n color: dt('button.contrast.active.color');\n }\n\n .p-button-contrast:focus-visible {\n outline-color: dt('button.contrast.focus.ring.color');\n box-shadow: dt('button.contrast.focus.ring.shadow');\n }\n\n .p-button-outlined {\n background: transparent;\n border-color: dt('button.outlined.primary.border.color');\n color: dt('button.outlined.primary.color');\n }\n\n .p-button-outlined:not(:disabled):hover {\n background: dt('button.outlined.primary.hover.background');\n border-color: dt('button.outlined.primary.border.color');\n color: dt('button.outlined.primary.color');\n }\n\n .p-button-outlined:not(:disabled):active {\n background: dt('button.outlined.primary.active.background');\n border-color: dt('button.outlined.primary.border.color');\n color: dt('button.outlined.primary.color');\n }\n\n .p-button-outlined.p-button-secondary {\n border-color: dt('button.outlined.secondary.border.color');\n color: dt('button.outlined.secondary.color');\n }\n\n .p-button-outlined.p-button-secondary:not(:disabled):hover {\n background: dt('button.outlined.secondary.hover.background');\n border-color: dt('button.outlined.secondary.border.color');\n color: dt('button.outlined.secondary.color');\n }\n\n .p-button-outlined.p-button-secondary:not(:disabled):active {\n background: dt('button.outlined.secondary.active.background');\n border-color: dt('button.outlined.secondary.border.color');\n color: dt('button.outlined.secondary.color');\n }\n\n .p-button-outlined.p-button-success {\n border-color: dt('button.outlined.success.border.color');\n color: dt('button.outlined.success.color');\n }\n\n .p-button-outlined.p-button-success:not(:disabled):hover {\n background: dt('button.outlined.success.hover.background');\n border-color: dt('button.outlined.success.border.color');\n color: dt('button.outlined.success.color');\n }\n\n .p-button-outlined.p-button-success:not(:disabled):active {\n background: dt('button.outlined.success.active.background');\n border-color: dt('button.outlined.success.border.color');\n color: dt('button.outlined.success.color');\n }\n\n .p-button-outlined.p-button-info {\n border-color: dt('button.outlined.info.border.color');\n color: dt('button.outlined.info.color');\n }\n\n .p-button-outlined.p-button-info:not(:disabled):hover {\n background: dt('button.outlined.info.hover.background');\n border-color: dt('button.outlined.info.border.color');\n color: dt('button.outlined.info.color');\n }\n\n .p-button-outlined.p-button-info:not(:disabled):active {\n background: dt('button.outlined.info.active.background');\n border-color: dt('button.outlined.info.border.color');\n color: dt('button.outlined.info.color');\n }\n\n .p-button-outlined.p-button-warn {\n border-color: dt('button.outlined.warn.border.color');\n color: dt('button.outlined.warn.color');\n }\n\n .p-button-outlined.p-button-warn:not(:disabled):hover {\n background: dt('button.outlined.warn.hover.background');\n border-color: dt('button.outlined.warn.border.color');\n color: dt('button.outlined.warn.color');\n }\n\n .p-button-outlined.p-button-warn:not(:disabled):active {\n background: dt('button.outlined.warn.active.background');\n border-color: dt('button.outlined.warn.border.color');\n color: dt('button.outlined.warn.color');\n }\n\n .p-button-outlined.p-button-help {\n border-color: dt('button.outlined.help.border.color');\n color: dt('button.outlined.help.color');\n }\n\n .p-button-outlined.p-button-help:not(:disabled):hover {\n background: dt('button.outlined.help.hover.background');\n border-color: dt('button.outlined.help.border.color');\n color: dt('button.outlined.help.color');\n }\n\n .p-button-outlined.p-button-help:not(:disabled):active {\n background: dt('button.outlined.help.active.background');\n border-color: dt('button.outlined.help.border.color');\n color: dt('button.outlined.help.color');\n }\n\n .p-button-outlined.p-button-danger {\n border-color: dt('button.outlined.danger.border.color');\n color: dt('button.outlined.danger.color');\n }\n\n .p-button-outlined.p-button-danger:not(:disabled):hover {\n background: dt('button.outlined.danger.hover.background');\n border-color: dt('button.outlined.danger.border.color');\n color: dt('button.outlined.danger.color');\n }\n\n .p-button-outlined.p-button-danger:not(:disabled):active {\n background: dt('button.outlined.danger.active.background');\n border-color: dt('button.outlined.danger.border.color');\n color: dt('button.outlined.danger.color');\n }\n\n .p-button-outlined.p-button-contrast {\n border-color: dt('button.outlined.contrast.border.color');\n color: dt('button.outlined.contrast.color');\n }\n\n .p-button-outlined.p-button-contrast:not(:disabled):hover {\n background: dt('button.outlined.contrast.hover.background');\n border-color: dt('button.outlined.contrast.border.color');\n color: dt('button.outlined.contrast.color');\n }\n\n .p-button-outlined.p-button-contrast:not(:disabled):active {\n background: dt('button.outlined.contrast.active.background');\n border-color: dt('button.outlined.contrast.border.color');\n color: dt('button.outlined.contrast.color');\n }\n\n .p-button-outlined.p-button-plain {\n border-color: dt('button.outlined.plain.border.color');\n color: dt('button.outlined.plain.color');\n }\n\n .p-button-outlined.p-button-plain:not(:disabled):hover {\n background: dt('button.outlined.plain.hover.background');\n border-color: dt('button.outlined.plain.border.color');\n color: dt('button.outlined.plain.color');\n }\n\n .p-button-outlined.p-button-plain:not(:disabled):active {\n background: dt('button.outlined.plain.active.background');\n border-color: dt('button.outlined.plain.border.color');\n color: dt('button.outlined.plain.color');\n }\n\n .p-button-text {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.primary.color');\n }\n\n .p-button-text:not(:disabled):hover {\n background: dt('button.text.primary.hover.background');\n border-color: transparent;\n color: dt('button.text.primary.color');\n }\n\n .p-button-text:not(:disabled):active {\n background: dt('button.text.primary.active.background');\n border-color: transparent;\n color: dt('button.text.primary.color');\n }\n\n .p-button-text.p-button-secondary {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.secondary.color');\n }\n\n .p-button-text.p-button-secondary:not(:disabled):hover {\n background: dt('button.text.secondary.hover.background');\n border-color: transparent;\n color: dt('button.text.secondary.color');\n }\n\n .p-button-text.p-button-secondary:not(:disabled):active {\n background: dt('button.text.secondary.active.background');\n border-color: transparent;\n color: dt('button.text.secondary.color');\n }\n\n .p-button-text.p-button-success {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.success.color');\n }\n\n .p-button-text.p-button-success:not(:disabled):hover {\n background: dt('button.text.success.hover.background');\n border-color: transparent;\n color: dt('button.text.success.color');\n }\n\n .p-button-text.p-button-success:not(:disabled):active {\n background: dt('button.text.success.active.background');\n border-color: transparent;\n color: dt('button.text.success.color');\n }\n\n .p-button-text.p-button-info {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.info.color');\n }\n\n .p-button-text.p-button-info:not(:disabled):hover {\n background: dt('button.text.info.hover.background');\n border-color: transparent;\n color: dt('button.text.info.color');\n }\n\n .p-button-text.p-button-info:not(:disabled):active {\n background: dt('button.text.info.active.background');\n border-color: transparent;\n color: dt('button.text.info.color');\n }\n\n .p-button-text.p-button-warn {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.warn.color');\n }\n\n .p-button-text.p-button-warn:not(:disabled):hover {\n background: dt('button.text.warn.hover.background');\n border-color: transparent;\n color: dt('button.text.warn.color');\n }\n\n .p-button-text.p-button-warn:not(:disabled):active {\n background: dt('button.text.warn.active.background');\n border-color: transparent;\n color: dt('button.text.warn.color');\n }\n\n .p-button-text.p-button-help {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.help.color');\n }\n\n .p-button-text.p-button-help:not(:disabled):hover {\n background: dt('button.text.help.hover.background');\n border-color: transparent;\n color: dt('button.text.help.color');\n }\n\n .p-button-text.p-button-help:not(:disabled):active {\n background: dt('button.text.help.active.background');\n border-color: transparent;\n color: dt('button.text.help.color');\n }\n\n .p-button-text.p-button-danger {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.danger.color');\n }\n\n .p-button-text.p-button-danger:not(:disabled):hover {\n background: dt('button.text.danger.hover.background');\n border-color: transparent;\n color: dt('button.text.danger.color');\n }\n\n .p-button-text.p-button-danger:not(:disabled):active {\n background: dt('button.text.danger.active.background');\n border-color: transparent;\n color: dt('button.text.danger.color');\n }\n\n .p-button-text.p-button-contrast {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.contrast.color');\n }\n\n .p-button-text.p-button-contrast:not(:disabled):hover {\n background: dt('button.text.contrast.hover.background');\n border-color: transparent;\n color: dt('button.text.contrast.color');\n }\n\n .p-button-text.p-button-contrast:not(:disabled):active {\n background: dt('button.text.contrast.active.background');\n border-color: transparent;\n color: dt('button.text.contrast.color');\n }\n\n .p-button-text.p-button-plain {\n background: transparent;\n border-color: transparent;\n color: dt('button.text.plain.color');\n }\n\n .p-button-text.p-button-plain:not(:disabled):hover {\n background: dt('button.text.plain.hover.background');\n border-color: transparent;\n color: dt('button.text.plain.color');\n }\n\n .p-button-text.p-button-plain:not(:disabled):active {\n background: dt('button.text.plain.active.background');\n border-color: transparent;\n color: dt('button.text.plain.color');\n }\n\n .p-button-link {\n background: transparent;\n border-color: transparent;\n color: dt('button.link.color');\n }\n\n .p-button-link:not(:disabled):hover {\n background: transparent;\n border-color: transparent;\n color: dt('button.link.hover.color');\n }\n\n .p-button-link:not(:disabled):hover .p-button-label {\n text-decoration: underline;\n }\n\n .p-button-link:not(:disabled):active {\n background: transparent;\n border-color: transparent;\n color: dt('button.link.active.color');\n }\n"; // node_modules/primevue/button/style/index.mjs -function $d(e) { +function df(e) { "@babel/helpers - typeof"; - return $d = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return df = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, $d(e); + }, df(e); } -function ef(e, t, n) { - return (t = tf(t)) in e ? Object.defineProperty(e, t, { +function ff(e, t, n) { + return (t = pf(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function tf(e) { - var t = nf(e, "string"); - return $d(t) == "symbol" ? t : t + ""; +function pf(e) { + var t = mf(e, "string"); + return df(t) == "symbol" ? t : t + ""; } -function nf(e, t) { - if ($d(e) != "object" || !e) return e; +function mf(e, t) { + if (df(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if ($d(r) != "object") return r; + if (df(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var rf = X.extend({ +var hf = X.extend({ name: "button", - style: Qd, + style: uf, classes: { root: function(e) { var t = e.instance, n = e.props; - return ["p-button p-component", ef(ef(ef(ef(ef(ef(ef(ef(ef({ + return ["p-button p-component", ff(ff(ff(ff(ff(ff(ff(ff(ff({ "p-button-icon-only": t.hasIcon && !n.label && !n.badge, "p-button-vertical": (n.iconPos === "top" || n.iconPos === "bottom") && n.label, "p-button-loading": n.loading, @@ -6448,13 +6581,13 @@ var rf = X.extend({ loadingIcon: "p-button-loading-icon", icon: function(e) { var t = e.props; - return ["p-button-icon", ef({}, `p-button-icon-${t.iconPos}`, t.label)]; + return ["p-button-icon", ff({}, `p-button-icon-${t.iconPos}`, t.label)]; }, label: "p-button-label" } -}), af = { +}), gf = { name: "BaseButton", - extends: nd, + extends: pd, props: { label: { type: String, @@ -6541,7 +6674,7 @@ var rf = X.extend({ default: null } }, - style: rf, + style: hf, provide: function() { return { $pcButton: this, @@ -6549,39 +6682,39 @@ var rf = X.extend({ }; } }; -function of(e) { +function _f(e) { "@babel/helpers - typeof"; - return of = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return _f = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, of(e); + }, _f(e); } -function sf(e, t, n) { - return (t = cf(t)) in e ? Object.defineProperty(e, t, { +function vf(e, t, n) { + return (t = yf(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function cf(e) { - var t = lf(e, "string"); - return of(t) == "symbol" ? t : t + ""; +function yf(e) { + var t = bf(e, "string"); + return _f(t) == "symbol" ? t : t + ""; } -function lf(e, t) { - if (of(e) != "object" || !e) return e; +function bf(e, t) { + if (_f(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (of(r) != "object") return r; + if (_f(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var uf = { +var xf = { name: "Button", - extends: af, + extends: gf, inheritAttrs: !1, inject: { $pcFluid: { default: null } }, methods: { getPTOptions: function(e) { @@ -6598,7 +6731,7 @@ var uf = { return this.icon || this.$slots.icon; }, attrs: function() { - return W(this.asAttrs, this.a11yAttrs, this.getPTOptions("root")); + return G(this.asAttrs, this.a11yAttrs, this.getPTOptions("root")); }, asAttrs: function() { return this.as === "BUTTON" ? { @@ -6615,31 +6748,31 @@ var uf = { }; }, hasFluid: function() { - return Qs(this.fluid) ? !!this.$pcFluid : this.fluid; + return cc(this.fluid) ? !!this.$pcFluid : this.fluid; }, dataP: function() { - return K(sf(sf(sf(sf(sf(sf(sf(sf(sf(sf({}, this.size, this.size), "icon-only", this.hasIcon && !this.label && !this.badge), "loading", this.loading), "fluid", this.hasFluid), "rounded", this.rounded), "raised", this.raised), "outlined", this.outlined || this.variant === "outlined"), "text", this.text || this.variant === "text"), "link", this.link || this.variant === "link"), "vertical", (this.iconPos === "top" || this.iconPos === "bottom") && this.label)); + return q(vf(vf(vf(vf(vf(vf(vf(vf(vf(vf({}, this.size, this.size), "icon-only", this.hasIcon && !this.label && !this.badge), "loading", this.loading), "fluid", this.hasFluid), "rounded", this.rounded), "raised", this.raised), "outlined", this.outlined || this.variant === "outlined"), "text", this.text || this.variant === "text"), "link", this.link || this.variant === "link"), "vertical", (this.iconPos === "top" || this.iconPos === "bottom") && this.label)); }, dataIconP: function() { - return K(sf(sf({}, this.iconPos, this.iconPos), this.size, this.size)); + return q(vf(vf({}, this.iconPos, this.iconPos), this.size, this.size)); }, dataLabelP: function() { - return K(sf(sf({}, this.size, this.size), "icon-only", this.hasIcon && !this.label && !this.badge)); + return q(vf(vf({}, this.size, this.size), "icon-only", this.hasIcon && !this.label && !this.badge)); } }, components: { - SpinnerIcon: dd, - Badge: Td + SpinnerIcon: Sd, + Badge: Id }, - directives: { ripple: Zd } -}, df = ["data-p"], ff = ["data-p"]; -function pf(e, t, n, r, i, a) { - var o = F("SpinnerIcon"), s = F("Badge"), c = ci("ripple"); + directives: { ripple: lf } +}, Sf = ["data-p"], Cf = ["data-p"]; +function wf(e, t, n, r, i, a) { + var o = F("SpinnerIcon"), s = F("Badge"), c = mi("ripple"); return e.asChild ? I(e.$slots, "default", { key: 1, - class: D(e.cx("root")), + class: O(e.cx("root")), a11yAttrs: a.a11yAttrs - }) : Hn((R(), B(si(e.as), W({ + }) : qn((z(), V(pi(e.as), G({ key: 0, class: e.cx("root"), "data-p": a.dataP @@ -6647,27 +6780,27 @@ function pf(e, t, n, r, i, a) { default: P(function() { return [I(e.$slots, "default", {}, function() { return [ - e.loading ? I(e.$slots, "loadingicon", W({ + e.loading ? I(e.$slots, "loadingicon", G({ key: 0, class: [e.cx("loadingIcon"), e.cx("icon")] }, e.ptm("loadingIcon")), function() { - return [e.loadingIcon ? (R(), z("span", W({ + return [e.loadingIcon ? (z(), B("span", G({ key: 0, class: [ e.cx("loadingIcon"), e.cx("icon"), e.loadingIcon ] - }, e.ptm("loadingIcon")), null, 16)) : (R(), B(o, W({ + }, e.ptm("loadingIcon")), null, 16)) : (z(), V(o, G({ key: 1, class: [e.cx("loadingIcon"), e.cx("icon")], spin: "" }, e.ptm("loadingIcon")), null, 16, ["class"]))]; - }) : I(e.$slots, "icon", W({ + }) : I(e.$slots, "icon", G({ key: 1, class: [e.cx("icon")] }, e.ptm("icon")), function() { - return [e.icon ? (R(), z("span", W({ + return [e.icon ? (z(), B("span", G({ key: 0, class: [ e.cx("icon"), @@ -6675,16 +6808,16 @@ function pf(e, t, n, r, i, a) { e.iconClass ], "data-p": a.dataIconP - }, e.ptm("icon")), null, 16, df)) : U("", !0)]; + }, e.ptm("icon")), null, 16, Sf)) : W("", !0)]; }), - e.label ? (R(), z("span", W({ + e.label ? (z(), B("span", G({ key: 2, class: e.cx("label") - }, e.ptm("label"), { "data-p": a.dataLabelP }), O(e.label), 17, ff)) : U("", !0), - e.badge ? (R(), B(s, { + }, e.ptm("label"), { "data-p": a.dataLabelP }), k(e.label), 17, Cf)) : W("", !0), + e.badge ? (z(), V(s, { key: 3, value: e.badge, - class: D(e.badgeClass), + class: O(e.badgeClass), severity: e.badgeSeverity, unstyled: e.unstyled, pt: e.ptm("pcBadge") @@ -6694,102 +6827,102 @@ function pf(e, t, n, r, i, a) { "severity", "unstyled", "pt" - ])) : U("", !0) + ])) : W("", !0) ]; })]; }), _: 3 }, 16, ["class", "data-p"])), [[c]]); } -uf.render = pf; +xf.render = wf; // node_modules/@primevue/icons/check/index.mjs -var mf = { +var Tf = { name: "CheckIcon", - extends: ud + extends: xd }; -function hf(e) { - return yf(e) || vf(e) || _f(e) || gf(); +function Ef(e) { + return Af(e) || kf(e) || Of(e) || Df(); } -function gf() { +function Df() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _f(e, t) { +function Of(e, t) { if (e) { - if (typeof e == "string") return bf(e, t); + if (typeof e == "string") return jf(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? bf(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? jf(e, t) : void 0; } } -function vf(e) { +function kf(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function yf(e) { - if (Array.isArray(e)) return bf(e); +function Af(e) { + if (Array.isArray(e)) return jf(e); } -function bf(e, t) { +function jf(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function xf(e, t, n, r, i, a) { - return R(), z("svg", W({ +function Mf(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), hf(t[0] ||= [V("path", { + }, e.pti()), Ef(t[0] ||= [H("path", { d: "M4.86199 11.5948C4.78717 11.5923 4.71366 11.5745 4.64596 11.5426C4.57826 11.5107 4.51779 11.4652 4.46827 11.4091L0.753985 7.69483C0.683167 7.64891 0.623706 7.58751 0.580092 7.51525C0.536478 7.44299 0.509851 7.36177 0.502221 7.27771C0.49459 7.19366 0.506156 7.10897 0.536046 7.03004C0.565935 6.95111 0.613367 6.88 0.674759 6.82208C0.736151 6.76416 0.8099 6.72095 0.890436 6.69571C0.970973 6.67046 1.05619 6.66385 1.13966 6.67635C1.22313 6.68886 1.30266 6.72017 1.37226 6.76792C1.44186 6.81567 1.4997 6.8786 1.54141 6.95197L4.86199 10.2503L12.6397 2.49483C12.7444 2.42694 12.8689 2.39617 12.9932 2.40745C13.1174 2.41873 13.2343 2.47141 13.3251 2.55705C13.4159 2.64268 13.4753 2.75632 13.4938 2.87973C13.5123 3.00315 13.4888 3.1292 13.4271 3.23768L5.2557 11.4091C5.20618 11.4652 5.14571 11.5107 5.07801 11.5426C5.01031 11.5745 4.9368 11.5923 4.86199 11.5948Z", fill: "currentColor" }, null, -1)]), 16); } -mf.render = xf; +Tf.render = Mf; // node_modules/@primevue/icons/minus/index.mjs -var Sf = { +var Nf = { name: "MinusIcon", - extends: ud + extends: xd }; -function Cf(e) { - return Df(e) || Ef(e) || Tf(e) || wf(); +function Pf(e) { + return Rf(e) || Lf(e) || If(e) || Ff(); } -function wf() { +function Ff() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Tf(e, t) { +function If(e, t) { if (e) { - if (typeof e == "string") return Of(e, t); + if (typeof e == "string") return zf(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Of(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? zf(e, t) : void 0; } } -function Ef(e) { +function Lf(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Df(e) { - if (Array.isArray(e)) return Of(e); +function Rf(e) { + if (Array.isArray(e)) return zf(e); } -function Of(e, t) { +function zf(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function kf(e, t, n, r, i, a) { - return R(), z("svg", W({ +function Bf(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), Cf(t[0] ||= [V("path", { + }, e.pti()), Pf(t[0] ||= [H("path", { d: "M13.2222 7.77778H0.777778C0.571498 7.77778 0.373667 7.69584 0.227806 7.54998C0.0819442 7.40412 0 7.20629 0 7.00001C0 6.79373 0.0819442 6.5959 0.227806 6.45003C0.373667 6.30417 0.571498 6.22223 0.777778 6.22223H13.2222C13.4285 6.22223 13.6263 6.30417 13.7722 6.45003C13.9181 6.5959 14 6.79373 14 7.00001C14 7.20629 13.9181 7.40412 13.7722 7.54998C13.6263 7.69584 13.4285 7.77778 13.2222 7.77778Z", fill: "currentColor" }, null, -1)]), 16); } -Sf.render = kf; +Nf.render = Bf; // node_modules/@primevue/core/baseeditableholder/index.mjs -var Af = { +var Vf = { name: "BaseEditableHolder", - extends: nd, + extends: pd, emits: ["update:modelValue", "value-change"], props: { modelValue: { @@ -6873,12 +7006,12 @@ var Af = { }); }, findNonEmpty: function() { - return [...arguments].find(G); + return [...arguments].find(K); } }, computed: { $filled: function() { - return G(this.d_value); + return K(this.d_value); }, $invalid: function() { var e, t; @@ -6908,9 +7041,9 @@ var Af = { return this.$filled; } } -}, jf = { +}, Hf = { name: "BaseInput", - extends: Af, + extends: Vf, props: { size: { type: String, @@ -6940,7 +7073,7 @@ var Af = { return this.$fluid; } } -}, Mf = X.extend({ +}, Uf = X.extend({ name: "checkbox", style: "\n .p-checkbox {\n position: relative;\n display: inline-flex;\n user-select: none;\n vertical-align: bottom;\n width: dt('checkbox.width');\n height: dt('checkbox.height');\n }\n\n .p-checkbox-input {\n cursor: pointer;\n appearance: none;\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n margin: 0;\n opacity: 0;\n z-index: 1;\n outline: 0 none;\n border: 1px solid transparent;\n border-radius: dt('checkbox.border.radius');\n }\n\n .p-checkbox-box {\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: dt('checkbox.border.radius');\n border: 1px solid dt('checkbox.border.color');\n background: dt('checkbox.background');\n width: dt('checkbox.width');\n height: dt('checkbox.height');\n transition:\n background dt('checkbox.transition.duration'),\n color dt('checkbox.transition.duration'),\n border-color dt('checkbox.transition.duration'),\n box-shadow dt('checkbox.transition.duration'),\n outline-color dt('checkbox.transition.duration');\n outline-color: transparent;\n box-shadow: dt('checkbox.shadow');\n }\n\n .p-checkbox-icon {\n transition-duration: dt('checkbox.transition.duration');\n color: dt('checkbox.icon.color');\n font-size: dt('checkbox.icon.size');\n width: dt('checkbox.icon.size');\n height: dt('checkbox.icon.size');\n }\n\n .p-checkbox:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box {\n border-color: dt('checkbox.hover.border.color');\n }\n\n .p-checkbox-checked .p-checkbox-box {\n border-color: dt('checkbox.checked.border.color');\n background: dt('checkbox.checked.background');\n }\n\n .p-checkbox-checked .p-checkbox-icon {\n color: dt('checkbox.icon.checked.color');\n }\n\n .p-checkbox-checked:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box {\n background: dt('checkbox.checked.hover.background');\n border-color: dt('checkbox.checked.hover.border.color');\n }\n\n .p-checkbox-checked:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-icon {\n color: dt('checkbox.icon.checked.hover.color');\n }\n\n .p-checkbox:not(.p-disabled):has(.p-checkbox-input:focus-visible) .p-checkbox-box {\n border-color: dt('checkbox.focus.border.color');\n box-shadow: dt('checkbox.focus.ring.shadow');\n outline: dt('checkbox.focus.ring.width') dt('checkbox.focus.ring.style') dt('checkbox.focus.ring.color');\n outline-offset: dt('checkbox.focus.ring.offset');\n }\n\n .p-checkbox-checked:not(.p-disabled):has(.p-checkbox-input:focus-visible) .p-checkbox-box {\n border-color: dt('checkbox.checked.focus.border.color');\n }\n\n .p-checkbox.p-invalid > .p-checkbox-box {\n border-color: dt('checkbox.invalid.border.color');\n }\n\n .p-checkbox.p-variant-filled .p-checkbox-box {\n background: dt('checkbox.filled.background');\n }\n\n .p-checkbox-checked.p-variant-filled .p-checkbox-box {\n background: dt('checkbox.checked.background');\n }\n\n .p-checkbox-checked.p-variant-filled:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box {\n background: dt('checkbox.checked.hover.background');\n }\n\n .p-checkbox.p-disabled {\n opacity: 1;\n }\n\n .p-checkbox.p-disabled .p-checkbox-box {\n background: dt('checkbox.disabled.background');\n border-color: dt('checkbox.checked.disabled.border.color');\n }\n\n .p-checkbox.p-disabled .p-checkbox-box .p-checkbox-icon {\n color: dt('checkbox.icon.disabled.color');\n }\n\n .p-checkbox-sm,\n .p-checkbox-sm .p-checkbox-box {\n width: dt('checkbox.sm.width');\n height: dt('checkbox.sm.height');\n }\n\n .p-checkbox-sm .p-checkbox-icon {\n font-size: dt('checkbox.icon.sm.size');\n width: dt('checkbox.icon.sm.size');\n height: dt('checkbox.icon.sm.size');\n }\n\n .p-checkbox-lg,\n .p-checkbox-lg .p-checkbox-box {\n width: dt('checkbox.lg.width');\n height: dt('checkbox.lg.height');\n }\n\n .p-checkbox-lg .p-checkbox-icon {\n font-size: dt('checkbox.icon.lg.size');\n width: dt('checkbox.icon.lg.size');\n height: dt('checkbox.icon.lg.size');\n }\n", classes: { @@ -6959,9 +7092,9 @@ var Af = { input: "p-checkbox-input", icon: "p-checkbox-icon" } -}), Nf = { +}), Wf = { name: "BaseCheckbox", - extends: jf, + extends: Hf, props: { value: null, binary: Boolean, @@ -7010,7 +7143,7 @@ var Af = { default: null } }, - style: Mf, + style: Uf, provide: function() { return { $pcCheckbox: this, @@ -7018,63 +7151,63 @@ var Af = { }; } }; -function Pf(e) { +function Gf(e) { "@babel/helpers - typeof"; - return Pf = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Gf = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Pf(e); + }, Gf(e); } -function Ff(e, t, n) { - return (t = If(t)) in e ? Object.defineProperty(e, t, { +function Kf(e, t, n) { + return (t = qf(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function If(e) { - var t = Lf(e, "string"); - return Pf(t) == "symbol" ? t : t + ""; +function qf(e) { + var t = Jf(e, "string"); + return Gf(t) == "symbol" ? t : t + ""; } -function Lf(e, t) { - if (Pf(e) != "object" || !e) return e; +function Jf(e, t) { + if (Gf(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Pf(r) != "object") return r; + if (Gf(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -function Rf(e) { - return Hf(e) || Vf(e) || Bf(e) || zf(); +function Yf(e) { + return $f(e) || Qf(e) || Zf(e) || Xf(); } -function zf() { +function Xf() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Bf(e, t) { +function Zf(e, t) { if (e) { - if (typeof e == "string") return Uf(e, t); + if (typeof e == "string") return ep(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Uf(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? ep(e, t) : void 0; } } -function Vf(e) { +function Qf(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Hf(e) { - if (Array.isArray(e)) return Uf(e); +function $f(e) { + if (Array.isArray(e)) return ep(e); } -function Uf(e, t) { +function ep(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -var Wf = { +var tp = { name: "Checkbox", - extends: Nf, + extends: Wf, inheritAttrs: !1, emits: [ "change", @@ -7107,8 +7240,8 @@ var Wf = { var t = this; if (!this.disabled && !this.readonly) { var n = this.$pcCheckboxGroup ? this.$pcCheckboxGroup.d_value : this.d_value, r = this.binary ? this.d_indeterminate ? this.trueValue : this.checked ? this.falseValue : this.trueValue : this.checked || this.d_indeterminate ? n.filter(function(e) { - return !rc(e, t.value); - }) : n ? [].concat(Rf(n), [this.value]) : [this.value]; + return !pc(e, t.value); + }) : n ? [].concat(Yf(n), [this.value]) : [this.value]; this.d_indeterminate && (this.d_indeterminate = !1, this.$emit("update:indeterminate", this.d_indeterminate)), this.$pcCheckboxGroup ? this.$pcCheckboxGroup.writeValue(r, e) : this.writeValue(r, e), this.$emit("change", e); } }, @@ -7129,10 +7262,10 @@ var Wf = { }, checked: function() { var e = this.$pcCheckboxGroup ? this.$pcCheckboxGroup.d_value : this.d_value; - return this.d_indeterminate ? !1 : this.binary ? e === this.trueValue : ic(this.value, e); + return this.d_indeterminate ? !1 : this.binary ? e === this.trueValue : mc(this.value, e); }, dataP: function() { - return K(Ff({ + return q(Kf({ invalid: this.$invalid, checked: this.checked, disabled: this.disabled, @@ -7141,15 +7274,15 @@ var Wf = { } }, components: { - CheckIcon: mf, - MinusIcon: Sf + CheckIcon: Tf, + MinusIcon: Nf } -}, Gf = [ +}, np = [ "data-p-checked", "data-p-indeterminate", "data-p-disabled", "data-p" -], Kf = [ +], rp = [ "id", "value", "name", @@ -7161,15 +7294,15 @@ var Wf = { "aria-labelledby", "aria-label", "aria-invalid" -], qf = ["data-p"]; -function Jf(e, t, n, r, i, a) { +], ip = ["data-p"]; +function ap(e, t, n, r, i, a) { var o = F("CheckIcon"), s = F("MinusIcon"); - return R(), z("div", W({ class: e.cx("root") }, a.getPTOptions("root"), { + return z(), B("div", G({ class: e.cx("root") }, a.getPTOptions("root"), { "data-p-checked": a.checked, "data-p-indeterminate": i.d_indeterminate || void 0, "data-p-disabled": e.disabled, "data-p": a.dataP - }), [V("input", W({ + }), [H("input", G({ ref: "input", id: e.inputId, type: "checkbox", @@ -7194,26 +7327,26 @@ function Jf(e, t, n, r, i, a) { onChange: t[2] ||= function() { return a.onChange && a.onChange.apply(a, arguments); } - }, a.getPTOptions("input")), null, 16, Kf), V("div", W({ class: e.cx("box") }, a.getPTOptions("box"), { "data-p": a.dataP }), [I(e.$slots, "icon", { + }, a.getPTOptions("input")), null, 16, rp), H("div", G({ class: e.cx("box") }, a.getPTOptions("box"), { "data-p": a.dataP }), [I(e.$slots, "icon", { checked: a.checked, indeterminate: i.d_indeterminate, - class: D(e.cx("icon")), + class: O(e.cx("icon")), dataP: a.dataP }, function() { - return [a.checked ? (R(), B(o, W({ + return [a.checked ? (z(), V(o, G({ key: 0, class: e.cx("icon") - }, a.getPTOptions("icon"), { "data-p": a.dataP }), null, 16, ["class", "data-p"])) : i.d_indeterminate ? (R(), B(s, W({ + }, a.getPTOptions("icon"), { "data-p": a.dataP }), null, 16, ["class", "data-p"])) : i.d_indeterminate ? (z(), V(s, G({ key: 1, class: e.cx("icon") - }, a.getPTOptions("icon"), { "data-p": a.dataP }), null, 16, ["class", "data-p"])) : U("", !0)]; - })], 16, qf)], 16, Gf); + }, a.getPTOptions("icon"), { "data-p": a.dataP }), null, 16, ["class", "data-p"])) : W("", !0)]; + })], 16, ip)], 16, np); } -Wf.render = Jf; +tp.render = ap; // node_modules/primevue/inputtext/index.mjs -var Yf = { +var op = { name: "BaseInputText", - extends: jf, + extends: Hf, style: X.extend({ name: "inputtext", style: "\n .p-inputtext {\n font-family: inherit;\n font-feature-settings: inherit;\n font-size: 1rem;\n color: dt('inputtext.color');\n background: dt('inputtext.background');\n padding-block: dt('inputtext.padding.y');\n padding-inline: dt('inputtext.padding.x');\n border: 1px solid dt('inputtext.border.color');\n transition:\n background dt('inputtext.transition.duration'),\n color dt('inputtext.transition.duration'),\n border-color dt('inputtext.transition.duration'),\n outline-color dt('inputtext.transition.duration'),\n box-shadow dt('inputtext.transition.duration');\n appearance: none;\n border-radius: dt('inputtext.border.radius');\n outline-color: transparent;\n box-shadow: dt('inputtext.shadow');\n }\n\n .p-inputtext:enabled:hover {\n border-color: dt('inputtext.hover.border.color');\n }\n\n .p-inputtext:enabled:focus {\n border-color: dt('inputtext.focus.border.color');\n box-shadow: dt('inputtext.focus.ring.shadow');\n outline: dt('inputtext.focus.ring.width') dt('inputtext.focus.ring.style') dt('inputtext.focus.ring.color');\n outline-offset: dt('inputtext.focus.ring.offset');\n }\n\n .p-inputtext.p-invalid {\n border-color: dt('inputtext.invalid.border.color');\n }\n\n .p-inputtext.p-variant-filled {\n background: dt('inputtext.filled.background');\n }\n\n .p-inputtext.p-variant-filled:enabled:hover {\n background: dt('inputtext.filled.hover.background');\n }\n\n .p-inputtext.p-variant-filled:enabled:focus {\n background: dt('inputtext.filled.focus.background');\n }\n\n .p-inputtext:disabled {\n opacity: 1;\n background: dt('inputtext.disabled.background');\n color: dt('inputtext.disabled.color');\n }\n\n .p-inputtext::placeholder {\n color: dt('inputtext.placeholder.color');\n }\n\n .p-inputtext.p-invalid::placeholder {\n color: dt('inputtext.invalid.placeholder.color');\n }\n\n .p-inputtext-sm {\n font-size: dt('inputtext.sm.font.size');\n padding-block: dt('inputtext.sm.padding.y');\n padding-inline: dt('inputtext.sm.padding.x');\n }\n\n .p-inputtext-lg {\n font-size: dt('inputtext.lg.font.size');\n padding-block: dt('inputtext.lg.padding.y');\n padding-inline: dt('inputtext.lg.padding.x');\n }\n\n .p-inputtext-fluid {\n width: 100%;\n }\n", @@ -7236,67 +7369,67 @@ var Yf = { }; } }; -function Xf(e) { +function sp(e) { "@babel/helpers - typeof"; - return Xf = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return sp = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Xf(e); + }, sp(e); } -function Zf(e, t, n) { - return (t = Qf(t)) in e ? Object.defineProperty(e, t, { +function cp(e, t, n) { + return (t = lp(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Qf(e) { - var t = $f(e, "string"); - return Xf(t) == "symbol" ? t : t + ""; +function lp(e) { + var t = up(e, "string"); + return sp(t) == "symbol" ? t : t + ""; } -function $f(e, t) { - if (Xf(e) != "object" || !e) return e; +function up(e, t) { + if (sp(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Xf(r) != "object") return r; + if (sp(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var ep = { +var dp = { name: "InputText", - extends: Yf, + extends: op, inheritAttrs: !1, methods: { onInput: function(e) { this.writeValue(e.target.value, e); } }, computed: { attrs: function() { - return W(this.ptmi("root", { context: { + return G(this.ptmi("root", { context: { filled: this.$filled, disabled: this.disabled } }), this.formField); }, dataP: function() { - return K(Zf({ + return q(cp({ invalid: this.$invalid, fluid: this.$fluid, filled: this.$variant === "filled" }, this.size, this.size)); } } -}, tp = [ +}, fp = [ "value", "name", "disabled", "aria-invalid", "data-p" ]; -function np(e, t, n, r, i, a) { - return R(), z("input", W({ +function pp(e, t, n, r, i, a) { + return z(), B("input", G({ type: "text", class: e.cx("root"), value: e.d_value, @@ -7307,11 +7440,11 @@ function np(e, t, n, r, i, a) { onInput: t[0] ||= function() { return a.onInput && a.onInput.apply(a, arguments); } - }, a.attrs), null, 16, tp); + }, a.attrs), null, 16, fp); } -ep.render = np; +dp.render = pp; // node_modules/primevue/textarea/style/index.mjs -var rp = X.extend({ +var mp = X.extend({ name: "textarea", style: "\n .p-textarea {\n font-family: inherit;\n font-feature-settings: inherit;\n font-size: 1rem;\n color: dt('textarea.color');\n background: dt('textarea.background');\n padding-block: dt('textarea.padding.y');\n padding-inline: dt('textarea.padding.x');\n border: 1px solid dt('textarea.border.color');\n transition:\n background dt('textarea.transition.duration'),\n color dt('textarea.transition.duration'),\n border-color dt('textarea.transition.duration'),\n outline-color dt('textarea.transition.duration'),\n box-shadow dt('textarea.transition.duration');\n appearance: none;\n border-radius: dt('textarea.border.radius');\n outline-color: transparent;\n box-shadow: dt('textarea.shadow');\n }\n\n .p-textarea:enabled:hover {\n border-color: dt('textarea.hover.border.color');\n }\n\n .p-textarea:enabled:focus {\n border-color: dt('textarea.focus.border.color');\n box-shadow: dt('textarea.focus.ring.shadow');\n outline: dt('textarea.focus.ring.width') dt('textarea.focus.ring.style') dt('textarea.focus.ring.color');\n outline-offset: dt('textarea.focus.ring.offset');\n }\n\n .p-textarea.p-invalid {\n border-color: dt('textarea.invalid.border.color');\n }\n\n .p-textarea.p-variant-filled {\n background: dt('textarea.filled.background');\n }\n\n .p-textarea.p-variant-filled:enabled:hover {\n background: dt('textarea.filled.hover.background');\n }\n\n .p-textarea.p-variant-filled:enabled:focus {\n background: dt('textarea.filled.focus.background');\n }\n\n .p-textarea:disabled {\n opacity: 1;\n background: dt('textarea.disabled.background');\n color: dt('textarea.disabled.color');\n }\n\n .p-textarea::placeholder {\n color: dt('textarea.placeholder.color');\n }\n\n .p-textarea.p-invalid::placeholder {\n color: dt('textarea.invalid.placeholder.color');\n }\n\n .p-textarea-fluid {\n width: 100%;\n }\n\n .p-textarea-resizable {\n overflow: hidden;\n resize: none;\n }\n\n .p-textarea-sm {\n font-size: dt('textarea.sm.font.size');\n padding-block: dt('textarea.sm.padding.y');\n padding-inline: dt('textarea.sm.padding.x');\n }\n\n .p-textarea-lg {\n font-size: dt('textarea.lg.font.size');\n padding-block: dt('textarea.lg.padding.y');\n padding-inline: dt('textarea.lg.padding.x');\n }\n", classes: { root: function(e) { @@ -7326,11 +7459,11 @@ var rp = X.extend({ "p-textarea-fluid": t.$fluid }]; } } -}), ip = { +}), hp = { name: "BaseTextarea", - extends: jf, + extends: Hf, props: { autoResize: Boolean }, - style: rp, + style: mp, provide: function() { return { $pcTextarea: this, @@ -7338,39 +7471,39 @@ var rp = X.extend({ }; } }; -function ap(e) { +function gp(e) { "@babel/helpers - typeof"; - return ap = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return gp = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, ap(e); + }, gp(e); } -function op(e, t, n) { - return (t = sp(t)) in e ? Object.defineProperty(e, t, { +function _p(e, t, n) { + return (t = vp(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function sp(e) { - var t = cp(e, "string"); - return ap(t) == "symbol" ? t : t + ""; +function vp(e) { + var t = yp(e, "string"); + return gp(t) == "symbol" ? t : t + ""; } -function cp(e, t) { - if (ap(e) != "object" || !e) return e; +function yp(e, t) { + if (gp(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (ap(r) != "object") return r; + if (gp(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var lp = { +var bp = { name: "Textarea", - extends: ip, + extends: hp, inheritAttrs: !1, observer: null, mounted: function() { @@ -7400,28 +7533,28 @@ var lp = { }, computed: { attrs: function() { - return W(this.ptmi("root", { context: { + return G(this.ptmi("root", { context: { filled: this.$filled, disabled: this.disabled } }), this.formField); }, dataP: function() { - return K(op({ + return q(_p({ invalid: this.$invalid, fluid: this.$fluid, filled: this.$variant === "filled" }, this.size, this.size)); } } -}, up = [ +}, xp = [ "value", "name", "disabled", "aria-invalid", "data-p" ]; -function dp(e, t, n, r, i, a) { - return R(), z("textarea", W({ +function Sp(e, t, n, r, i, a) { + return z(), B("textarea", G({ class: e.cx("root"), value: e.d_value, name: e.name, @@ -7431,54 +7564,54 @@ function dp(e, t, n, r, i, a) { onInput: t[0] ||= function() { return a.onInput && a.onInput.apply(a, arguments); } - }, a.attrs), null, 16, up); + }, a.attrs), null, 16, xp); } -lp.render = dp; +bp.render = Sp; // node_modules/@primevue/core/utils/index.mjs -function fp(e) { +function Cp(e) { "@babel/helpers - typeof"; - return fp = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Cp = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, fp(e); + }, Cp(e); } -function pp(e, t) { +function wp(e, t) { if (!(e instanceof t)) throw TypeError("Cannot call a class as a function"); } -function mp(e, t) { +function Tp(e, t) { for (var n = 0; n < t.length; n++) { var r = t[n]; - r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, gp(r.key), r); + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, Dp(r.key), r); } } -function hp(e, t, n) { - return t && mp(e.prototype, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; +function Ep(e, t, n) { + return t && Tp(e.prototype, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function gp(e) { - var t = _p(e, "string"); - return fp(t) == "symbol" ? t : t + ""; +function Dp(e) { + var t = Op(e, "string"); + return Cp(t) == "symbol" ? t : t + ""; } -function _p(e, t) { - if (fp(e) != "object" || !e) return e; +function Op(e, t) { + if (Cp(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (fp(r) != "object") return r; + if (Cp(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return String(e); } -var vp = /*#__PURE__*/ function() { +var kp = /*#__PURE__*/ function() { function e(t) { var n = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : function() {}; - pp(this, e), this.element = t, this.listener = n; + wp(this, e), this.element = t, this.listener = n; } - return hp(e, [ + return Ep(e, [ { key: "bindScrollListener", value: function() { - this.scrollableParents = tl(this.element); + this.scrollableParents = dl(this.element); for (var e = 0; e < this.scrollableParents.length; e++) this.scrollableParents[e].addEventListener("scroll", this.listener); } }, @@ -7495,183 +7628,183 @@ var vp = /*#__PURE__*/ function() { } } ]); -}(), yp = { +}(), Ap = { name: "BlankIcon", - extends: ud + extends: xd }; -function bp(e) { - return wp(e) || Cp(e) || Sp(e) || xp(); +function jp(e) { + return Fp(e) || Pp(e) || Np(e) || Mp(); } -function xp() { +function Mp() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Sp(e, t) { +function Np(e, t) { if (e) { - if (typeof e == "string") return Tp(e, t); + if (typeof e == "string") return Ip(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Tp(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Ip(e, t) : void 0; } } -function Cp(e) { +function Pp(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function wp(e) { - if (Array.isArray(e)) return Tp(e); +function Fp(e) { + if (Array.isArray(e)) return Ip(e); } -function Tp(e, t) { +function Ip(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function Ep(e, t, n, r, i, a) { - return R(), z("svg", W({ +function Lp(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), bp(t[0] ||= [V("rect", { + }, e.pti()), jp(t[0] ||= [H("rect", { width: "1", height: "1", fill: "currentColor", "fill-opacity": "0" }, null, -1)]), 16); } -yp.render = Ep; +Ap.render = Lp; // node_modules/@primevue/icons/chevrondown/index.mjs -var Dp = { +var Rp = { name: "ChevronDownIcon", - extends: ud + extends: xd }; -function Op(e) { - return Mp(e) || jp(e) || Ap(e) || kp(); +function zp(e) { + return Up(e) || Hp(e) || Vp(e) || Bp(); } -function kp() { +function Bp() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Ap(e, t) { +function Vp(e, t) { if (e) { - if (typeof e == "string") return Np(e, t); + if (typeof e == "string") return Wp(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Np(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Wp(e, t) : void 0; } } -function jp(e) { +function Hp(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Mp(e) { - if (Array.isArray(e)) return Np(e); +function Up(e) { + if (Array.isArray(e)) return Wp(e); } -function Np(e, t) { +function Wp(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function Pp(e, t, n, r, i, a) { - return R(), z("svg", W({ +function Gp(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), Op(t[0] ||= [V("path", { + }, e.pti()), zp(t[0] ||= [H("path", { d: "M7.01744 10.398C6.91269 10.3985 6.8089 10.378 6.71215 10.3379C6.61541 10.2977 6.52766 10.2386 6.45405 10.1641L1.13907 4.84913C1.03306 4.69404 0.985221 4.5065 1.00399 4.31958C1.02276 4.13266 1.10693 3.95838 1.24166 3.82747C1.37639 3.69655 1.55301 3.61742 1.74039 3.60402C1.92777 3.59062 2.11386 3.64382 2.26584 3.75424L7.01744 8.47394L11.769 3.75424C11.9189 3.65709 12.097 3.61306 12.2748 3.62921C12.4527 3.64535 12.6199 3.72073 12.7498 3.84328C12.8797 3.96582 12.9647 4.12842 12.9912 4.30502C13.0177 4.48162 12.9841 4.662 12.8958 4.81724L7.58083 10.1322C7.50996 10.2125 7.42344 10.2775 7.32656 10.3232C7.22968 10.3689 7.12449 10.3944 7.01744 10.398Z", fill: "currentColor" }, null, -1)]), 16); } -Dp.render = Pp; +Rp.render = Gp; // node_modules/@primevue/icons/search/index.mjs -var Fp = { +var Kp = { name: "SearchIcon", - extends: ud + extends: xd }; -function Ip(e) { - return Bp(e) || zp(e) || Rp(e) || Lp(); +function qp(e) { + return Zp(e) || Xp(e) || Yp(e) || Jp(); } -function Lp() { +function Jp() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Rp(e, t) { +function Yp(e, t) { if (e) { - if (typeof e == "string") return Vp(e, t); + if (typeof e == "string") return Qp(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Vp(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Qp(e, t) : void 0; } } -function zp(e) { +function Xp(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Bp(e) { - if (Array.isArray(e)) return Vp(e); +function Zp(e) { + if (Array.isArray(e)) return Qp(e); } -function Vp(e, t) { +function Qp(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function Hp(e, t, n, r, i, a) { - return R(), z("svg", W({ +function $p(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), Ip(t[0] ||= [V("path", { + }, e.pti()), qp(t[0] ||= [H("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M2.67602 11.0265C3.6661 11.688 4.83011 12.0411 6.02086 12.0411C6.81149 12.0411 7.59438 11.8854 8.32483 11.5828C8.87005 11.357 9.37808 11.0526 9.83317 10.6803L12.9769 13.8241C13.0323 13.8801 13.0983 13.9245 13.171 13.9548C13.2438 13.985 13.3219 14.0003 13.4007 14C13.4795 14.0003 13.5575 13.985 13.6303 13.9548C13.7031 13.9245 13.7691 13.8801 13.8244 13.8241C13.9367 13.7116 13.9998 13.5592 13.9998 13.4003C13.9998 13.2414 13.9367 13.089 13.8244 12.9765L10.6807 9.8328C11.053 9.37773 11.3573 8.86972 11.5831 8.32452C11.8857 7.59408 12.0414 6.81119 12.0414 6.02056C12.0414 4.8298 11.6883 3.66579 11.0268 2.67572C10.3652 1.68564 9.42494 0.913972 8.32483 0.45829C7.22472 0.00260857 6.01418 -0.116618 4.84631 0.115686C3.67844 0.34799 2.60568 0.921393 1.76369 1.76338C0.921698 2.60537 0.348296 3.67813 0.115991 4.84601C-0.116313 6.01388 0.00291375 7.22441 0.458595 8.32452C0.914277 9.42464 1.68595 10.3649 2.67602 11.0265ZM3.35565 2.0158C4.14456 1.48867 5.07206 1.20731 6.02086 1.20731C7.29317 1.20731 8.51338 1.71274 9.41304 2.6124C10.3127 3.51206 10.8181 4.73226 10.8181 6.00457C10.8181 6.95337 10.5368 7.88088 10.0096 8.66978C9.48251 9.45868 8.73328 10.0736 7.85669 10.4367C6.98011 10.7997 6.01554 10.8947 5.08496 10.7096C4.15439 10.5245 3.2996 10.0676 2.62869 9.39674C1.95778 8.72583 1.50089 7.87104 1.31579 6.94046C1.13068 6.00989 1.22568 5.04532 1.58878 4.16874C1.95187 3.29215 2.56675 2.54292 3.35565 2.0158Z", fill: "currentColor" }, null, -1)]), 16); } -Fp.render = Hp; +Kp.render = $p; // node_modules/@primevue/icons/times/index.mjs -var Up = { +var em = { name: "TimesIcon", - extends: ud + extends: xd }; -function Wp(e) { - return Jp(e) || qp(e) || Kp(e) || Gp(); +function tm(e) { + return am(e) || im(e) || rm(e) || nm(); } -function Gp() { +function nm() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Kp(e, t) { +function rm(e, t) { if (e) { - if (typeof e == "string") return Yp(e, t); + if (typeof e == "string") return om(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Yp(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? om(e, t) : void 0; } } -function qp(e) { +function im(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Jp(e) { - if (Array.isArray(e)) return Yp(e); +function am(e) { + if (Array.isArray(e)) return om(e); } -function Yp(e, t) { +function om(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function Xp(e, t, n, r, i, a) { - return R(), z("svg", W({ +function sm(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), Wp(t[0] ||= [V("path", { + }, e.pti()), tm(t[0] ||= [H("path", { d: "M8.01186 7.00933L12.27 2.75116C12.341 2.68501 12.398 2.60524 12.4375 2.51661C12.4769 2.42798 12.4982 2.3323 12.4999 2.23529C12.5016 2.13827 12.4838 2.0419 12.4474 1.95194C12.4111 1.86197 12.357 1.78024 12.2884 1.71163C12.2198 1.64302 12.138 1.58893 12.0481 1.55259C11.9581 1.51625 11.8617 1.4984 11.7647 1.50011C11.6677 1.50182 11.572 1.52306 11.4834 1.56255C11.3948 1.60204 11.315 1.65898 11.2488 1.72997L6.99067 5.98814L2.7325 1.72997C2.59553 1.60234 2.41437 1.53286 2.22718 1.53616C2.03999 1.53946 1.8614 1.61529 1.72901 1.74767C1.59663 1.88006 1.5208 2.05865 1.5175 2.24584C1.5142 2.43303 1.58368 2.61419 1.71131 2.75116L5.96948 7.00933L1.71131 11.2675C1.576 11.403 1.5 11.5866 1.5 11.7781C1.5 11.9696 1.576 12.1532 1.71131 12.2887C1.84679 12.424 2.03043 12.5 2.2219 12.5C2.41338 12.5 2.59702 12.424 2.7325 12.2887L6.99067 8.03052L11.2488 12.2887C11.3843 12.424 11.568 12.5 11.7594 12.5C11.9509 12.5 12.1346 12.424 12.27 12.2887C12.4053 12.1532 12.4813 11.9696 12.4813 11.7781C12.4813 11.5866 12.4053 11.403 12.27 11.2675L8.01186 7.00933Z", fill: "currentColor" }, null, -1)]), 16); } -Up.render = Xp; +em.render = sm; // node_modules/primevue/iconfield/index.mjs -var Zp = { +var cm = { name: "IconField", extends: { name: "BaseIconField", - extends: nd, + extends: pd, style: X.extend({ name: "iconfield", style: "\n .p-iconfield {\n position: relative;\n display: block;\n }\n\n .p-inputicon {\n position: absolute;\n top: 50%;\n margin-top: calc(-1 * (dt('icon.size') / 2));\n color: dt('iconfield.icon.color');\n line-height: 1;\n z-index: 1;\n }\n\n .p-iconfield .p-inputicon:first-child {\n inset-inline-start: dt('form.field.padding.x');\n }\n\n .p-iconfield .p-inputicon:last-child {\n inset-inline-end: dt('form.field.padding.x');\n }\n\n .p-iconfield .p-inputtext:not(:first-child),\n .p-iconfield .p-inputwrapper:not(:first-child) .p-inputtext {\n padding-inline-start: calc((dt('form.field.padding.x') * 2) + dt('icon.size'));\n }\n\n .p-iconfield .p-inputtext:not(:last-child) {\n padding-inline-end: calc((dt('form.field.padding.x') * 2) + dt('icon.size'));\n }\n\n .p-iconfield:has(.p-inputfield-sm) .p-inputicon {\n font-size: dt('form.field.sm.font.size');\n width: dt('form.field.sm.font.size');\n height: dt('form.field.sm.font.size');\n margin-top: calc(-1 * (dt('form.field.sm.font.size') / 2));\n }\n\n .p-iconfield:has(.p-inputfield-lg) .p-inputicon {\n font-size: dt('form.field.lg.font.size');\n width: dt('form.field.lg.font.size');\n height: dt('form.field.lg.font.size');\n margin-top: calc(-1 * (dt('form.field.lg.font.size') / 2));\n }\n", @@ -7686,16 +7819,16 @@ var Zp = { }, inheritAttrs: !1 }; -function Qp(e, t, n, r, i, a) { - return R(), z("div", W({ class: e.cx("root") }, e.ptmi("root")), [I(e.$slots, "default")], 16); +function lm(e, t, n, r, i, a) { + return z(), B("div", G({ class: e.cx("root") }, e.ptmi("root")), [I(e.$slots, "default")], 16); } -Zp.render = Qp; +cm.render = lm; // node_modules/primevue/inputicon/index.mjs -var $p = { +var um = { name: "InputIcon", extends: { name: "BaseInputIcon", - extends: nd, + extends: pd, style: X.extend({ name: "inputicon", classes: { root: "p-inputicon" } @@ -7713,12 +7846,12 @@ var $p = { return [this.cx("root"), this.class]; } } }; -function em(e, t, n, r, i, a) { - return R(), z("span", W({ class: a.containerClass }, e.ptmi("root"), { "aria-hidden": "true" }), [I(e.$slots, "default")], 16); +function dm(e, t, n, r, i, a) { + return z(), B("span", G({ class: a.containerClass }, e.ptmi("root"), { "aria-hidden": "true" }), [I(e.$slots, "default")], 16); } -$p.render = em; +um.render = dm; // node_modules/primevue/overlayeventbus/index.mjs -var tm = Sc(), nm = { +var fm = Mc(), pm = { name: "Portal", props: { appendTo: { @@ -7734,27 +7867,27 @@ var tm = Sc(), nm = { return { mounted: !1 }; }, mounted: function() { - this.mounted = il(); + this.mounted = ml(); }, computed: { inline: function() { return this.disabled || this.appendTo === "self"; } } }; -function rm(e, t, n, r, i, a) { - return a.inline ? I(e.$slots, "default", { key: 0 }) : i.mounted ? (R(), B(dr, { +function mm(e, t, n, r, i, a) { + return a.inline ? I(e.$slots, "default", { key: 0 }) : i.mounted ? (z(), V(_r, { key: 1, to: n.appendTo - }, [I(e.$slots, "default")], 8, ["to"])) : U("", !0); + }, [I(e.$slots, "default")], 8, ["to"])) : W("", !0); } -nm.render = rm; +pm.render = mm; // node_modules/primevue/virtualscroller/style/index.mjs -var im = X.extend({ +var hm = X.extend({ name: "virtualscroller", css: "\n.p-virtualscroller {\n position: relative;\n overflow: auto;\n contain: strict;\n transform: translateZ(0);\n will-change: scroll-position;\n outline: 0 none;\n}\n\n.p-virtualscroller-content {\n position: absolute;\n top: 0;\n left: 0;\n min-height: 100%;\n min-width: 100%;\n will-change: transform;\n}\n\n.p-virtualscroller-spacer {\n position: absolute;\n top: 0;\n left: 0;\n height: 1px;\n width: 1px;\n transform-origin: 0 0;\n pointer-events: none;\n}\n\n.p-virtualscroller-loader {\n position: sticky;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n.p-virtualscroller-loader-mask {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.p-virtualscroller-horizontal > .p-virtualscroller-content {\n display: flex;\n}\n\n.p-virtualscroller-inline .p-virtualscroller-content {\n position: static;\n}\n\n.p-virtualscroller .p-virtualscroller-loading {\n transform: none !important;\n min-height: 0;\n position: sticky;\n inset-block-start: 0;\n inset-inline-start: 0;\n}\n", style: "\n .p-virtualscroller-loader {\n background: dt('virtualscroller.loader.mask.background');\n color: dt('virtualscroller.loader.mask.color');\n }\n\n .p-virtualscroller-loading-icon {\n font-size: dt('virtualscroller.loader.icon.size');\n width: dt('virtualscroller.loader.icon.size');\n height: dt('virtualscroller.loader.icon.size');\n }\n" -}), am = { +}), gm = { name: "BaseVirtualScroller", - extends: nd, + extends: pd, props: { id: { type: String, @@ -7837,7 +7970,7 @@ var im = X.extend({ default: !1 } }, - style: im, + style: hm, provide: function() { return { $pcVirtualScroller: this, @@ -7846,18 +7979,18 @@ var im = X.extend({ }, beforeMount: function() { var e; - im.loadCSS({ nonce: (e = this.$primevueConfig) == null || (e = e.csp) == null ? void 0 : e.nonce }); + hm.loadCSS({ nonce: (e = this.$primevueConfig) == null || (e = e.csp) == null ? void 0 : e.nonce }); } }; -function om(e) { +function _m(e) { "@babel/helpers - typeof"; - return om = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return _m = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, om(e); + }, _m(e); } -function sm(e, t) { +function vm(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -7867,42 +8000,42 @@ function sm(e, t) { } return n; } -function cm(e) { +function ym(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? sm(Object(n), !0).forEach(function(t) { - lm(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : sm(Object(n)).forEach(function(t) { + t % 2 ? vm(Object(n), !0).forEach(function(t) { + bm(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : vm(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function lm(e, t, n) { - return (t = um(t)) in e ? Object.defineProperty(e, t, { +function bm(e, t, n) { + return (t = xm(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function um(e) { - var t = dm(e, "string"); - return om(t) == "symbol" ? t : t + ""; +function xm(e) { + var t = Sm(e, "string"); + return _m(t) == "symbol" ? t : t + ""; } -function dm(e, t) { - if (om(e) != "object" || !e) return e; +function Sm(e, t) { + if (_m(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (om(r) != "object") return r; + if (_m(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var fm = { +var Cm = { name: "VirtualScroller", - extends: am, + extends: gm, inheritAttrs: !1, emits: [ "update:numToleratedItems", @@ -7997,7 +8130,7 @@ var fm = { }, methods: { viewInit: function() { - ol(this.element) && (this.setContentEl(this.content), this.init(), this.calculateAutoSize(), this.defaultWidth = nl(this.element), this.defaultHeight = Xc(this.element), this.defaultContentWidth = nl(this.content), this.defaultContentHeight = Xc(this.content), this.initialized = !0), this.element && this.bindResizeListener(); + gl(this.element) && (this.setContentEl(this.content), this.init(), this.calculateAutoSize(), this.defaultWidth = fl(this.element), this.defaultHeight = ol(this.element), this.defaultContentWidth = fl(this.content), this.defaultContentHeight = ol(this.content), this.initialized = !0), this.element && this.bindResizeListener(); }, init: function() { this.disabled || (this.setSize(), this.calculateOptions(), this.setSpacerSize()); @@ -8135,7 +8268,7 @@ var fm = { if (e.content) { var t = e.isBoth(), n = e.isHorizontal(), r = e.isVertical(); e.content.style.minHeight = e.content.style.minWidth = "auto", e.content.style.position = "relative", e.element.style.contain = "none"; - var i = [nl(e.element), Xc(e.element)], a = i[0], o = i[1]; + var i = [fl(e.element), ol(e.element)], a = i[0], o = i[1]; (t || n) && (e.element.style.width = a < e.defaultWidth ? a + "px" : e.scrollWidth || e.defaultWidth + "px"), (t || r) && (e.element.style.height = o < e.defaultHeight ? o + "px" : e.scrollHeight || e.defaultHeight + "px"), e.content.style.minHeight = e.content.style.minWidth = "", e.content.style.position = "", e.element.style.contain = ""; } }); @@ -8179,7 +8312,7 @@ var fm = { if (t) { var n = this.isBoth(), r = this.isHorizontal(), i = this.getContentPosition(), a = function(t, n, r) { var i = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 0; - return e.spacerStyle = cm(cm({}, e.spacerStyle), lm({}, `${t}`, (n || []).length * r + i + "px")); + return e.spacerStyle = ym(ym({}, e.spacerStyle), bm({}, `${t}`, (n || []).length * r + i + "px")); }; n ? (a("height", t, this.itemSize[0], i.y), a("width", this.columns || t[1], this.itemSize[1], i.x)) : r ? a("width", this.columns || t, this.itemSize, i.x) : a("height", t, this.itemSize, i.y); } @@ -8191,7 +8324,7 @@ var fm = { return e * t; }, o = function() { var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0, n = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; - return t.contentStyle = cm(cm({}, t.contentStyle), { transform: `translate3d(${e}px, ${n}px, 0)` }); + return t.contentStyle = ym(ym({}, t.contentStyle), { transform: `translate3d(${e}px, ${n}px, 0)` }); }; if (n) o(a(i.cols, this.itemSize[1]), a(i.rows, this.itemSize[0])); else { @@ -8278,9 +8411,9 @@ var fm = { onResize: function() { var e = this; this.resizeTimeout && clearTimeout(this.resizeTimeout), this.resizeTimeout = setTimeout(function() { - if (ol(e.element)) { - var t = e.isBoth(), n = e.isVertical(), r = e.isHorizontal(), i = [nl(e.element), Xc(e.element)], a = i[0], o = i[1], s = a !== e.defaultWidth, c = o !== e.defaultHeight; - (t ? s || c : r ? s : n && c) && (e.d_numToleratedItems = e.numToleratedItems, e.defaultWidth = a, e.defaultHeight = o, e.defaultContentWidth = nl(e.content), e.defaultContentHeight = Xc(e.content), e.init()); + if (gl(e.element)) { + var t = e.isBoth(), n = e.isVertical(), r = e.isHorizontal(), i = [fl(e.element), ol(e.element)], a = i[0], o = i[1], s = a !== e.defaultWidth, c = o !== e.defaultHeight; + (t ? s || c : r ? s : n && c) && (e.d_numToleratedItems = e.numToleratedItems, e.defaultWidth = a, e.defaultHeight = o, e.defaultContentWidth = fl(e.content), e.defaultContentHeight = ol(e.content), e.init()); } }, this.resizeDelay); }, @@ -8306,7 +8439,7 @@ var fm = { }, getLoaderOptions: function(e, t) { var n = this.loaderArr.length; - return cm({ + return ym({ index: e, count: n, first: e === 0, @@ -8322,7 +8455,7 @@ var fm = { return this.step && !this.lazy ? this.page !== this.getPageByFirst(e ?? this.first) : !0; }, setContentEl: function(e) { - this.content = e || this.content || Kc(this.element, "[data-pc-section=\"content\"]"); + this.content = e || this.content || nl(this.element, "[data-pc-section=\"content\"]"); }, elementRef: function(e) { this.element = e; @@ -8366,15 +8499,15 @@ var fm = { return this.columns; } }, - components: { SpinnerIcon: dd } -}, pm = ["tabindex"]; -function mm(e, t, n, r, i, a) { + components: { SpinnerIcon: Sd } +}, wm = ["tabindex"]; +function Tm(e, t, n, r, i, a) { var o = F("SpinnerIcon"); - return e.disabled ? (R(), z(L, { key: 1 }, [I(e.$slots, "default"), I(e.$slots, "content", { + return e.disabled ? (z(), B(L, { key: 1 }, [I(e.$slots, "default"), I(e.$slots, "content", { items: e.items, rows: e.items, columns: a.loadedColumns - })], 64)) : (R(), z("div", W({ + })], 64)) : (z(), B("div", G({ key: 0, ref: a.elementRef, class: a.containerClass, @@ -8400,11 +8533,11 @@ function mm(e, t, n, r, i, a) { horizontal: a.isHorizontal(), both: a.isBoth() }, function() { - return [V("div", W({ + return [H("div", G({ ref: a.contentRef, class: a.contentClass, style: i.contentStyle - }, e.ptm("content")), [(R(!0), z(L, null, di(a.loadedItems, function(t, n) { + }, e.ptm("content")), [(z(!0), B(L, null, _i(a.loadedItems, function(t, n) { return I(e.$slots, "item", { key: n, item: t, @@ -8412,30 +8545,30 @@ function mm(e, t, n, r, i, a) { }); }), 128))], 16)]; }), - e.showSpacer ? (R(), z("div", W({ + e.showSpacer ? (z(), B("div", G({ key: 0, class: "p-virtualscroller-spacer", style: i.spacerStyle - }, e.ptm("spacer")), null, 16)) : U("", !0), - !e.loaderDisabled && e.showLoader && i.d_loading ? (R(), z("div", W({ + }, e.ptm("spacer")), null, 16)) : W("", !0), + !e.loaderDisabled && e.showLoader && i.d_loading ? (z(), B("div", G({ key: 1, class: a.loaderClass - }, e.ptm("loader")), [e.$slots && e.$slots.loader ? (R(!0), z(L, { key: 0 }, di(i.loaderArr, function(t, n) { + }, e.ptm("loader")), [e.$slots && e.$slots.loader ? (z(!0), B(L, { key: 0 }, _i(i.loaderArr, function(t, n) { return I(e.$slots, "loader", { key: n, options: a.getLoaderOptions(n, a.isBoth() && { numCols: e.d_numItemsInViewport.cols }) }); - }), 128)) : U("", !0), I(e.$slots, "loadingicon", {}, function() { - return [H(o, W({ + }), 128)) : W("", !0), I(e.$slots, "loadingicon", {}, function() { + return [U(o, G({ spin: "", class: "p-virtualscroller-loading-icon" }, e.ptm("loadingIcon")), null, 16)]; - })], 16)) : U("", !0) - ], 16, pm)); + })], 16)) : W("", !0) + ], 16, wm)); } -fm.render = mm; +Cm.render = Tm; // node_modules/primevue/select/style/index.mjs -var hm = X.extend({ +var Em = X.extend({ name: "select", style: "\n .p-select {\n display: inline-flex;\n cursor: pointer;\n position: relative;\n user-select: none;\n background: dt('select.background');\n border: 1px solid dt('select.border.color');\n transition:\n background dt('select.transition.duration'),\n color dt('select.transition.duration'),\n border-color dt('select.transition.duration'),\n outline-color dt('select.transition.duration'),\n box-shadow dt('select.transition.duration');\n border-radius: dt('select.border.radius');\n outline-color: transparent;\n box-shadow: dt('select.shadow');\n }\n\n .p-select:not(.p-disabled):hover {\n border-color: dt('select.hover.border.color');\n }\n\n .p-select:not(.p-disabled).p-focus {\n border-color: dt('select.focus.border.color');\n box-shadow: dt('select.focus.ring.shadow');\n outline: dt('select.focus.ring.width') dt('select.focus.ring.style') dt('select.focus.ring.color');\n outline-offset: dt('select.focus.ring.offset');\n }\n\n .p-select.p-variant-filled {\n background: dt('select.filled.background');\n }\n\n .p-select.p-variant-filled:not(.p-disabled):hover {\n background: dt('select.filled.hover.background');\n }\n\n .p-select.p-variant-filled:not(.p-disabled).p-focus {\n background: dt('select.filled.focus.background');\n }\n\n .p-select.p-invalid {\n border-color: dt('select.invalid.border.color');\n }\n\n .p-select.p-disabled {\n opacity: 1;\n background: dt('select.disabled.background');\n }\n\n .p-select-clear-icon {\n align-self: center;\n color: dt('select.clear.icon.color');\n inset-inline-end: dt('select.dropdown.width');\n }\n\n .p-select-dropdown {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: transparent;\n color: dt('select.dropdown.color');\n width: dt('select.dropdown.width');\n border-start-end-radius: dt('select.border.radius');\n border-end-end-radius: dt('select.border.radius');\n }\n\n .p-select-label {\n display: block;\n white-space: nowrap;\n overflow: hidden;\n flex: 1 1 auto;\n width: 1%;\n padding: dt('select.padding.y') dt('select.padding.x');\n text-overflow: ellipsis;\n cursor: pointer;\n color: dt('select.color');\n background: transparent;\n border: 0 none;\n outline: 0 none;\n font-size: 1rem;\n }\n\n .p-select-label.p-placeholder {\n color: dt('select.placeholder.color');\n }\n\n .p-select.p-invalid .p-select-label.p-placeholder {\n color: dt('select.invalid.placeholder.color');\n }\n\n .p-select.p-disabled .p-select-label {\n color: dt('select.disabled.color');\n }\n\n .p-select-label-empty {\n overflow: hidden;\n opacity: 0;\n }\n\n input.p-select-label {\n cursor: default;\n }\n\n .p-select-overlay {\n position: absolute;\n top: 0;\n left: 0;\n background: dt('select.overlay.background');\n color: dt('select.overlay.color');\n border: 1px solid dt('select.overlay.border.color');\n border-radius: dt('select.overlay.border.radius');\n box-shadow: dt('select.overlay.shadow');\n min-width: 100%;\n transform-origin: inherit;\n will-change: transform;\n }\n\n .p-select-header {\n padding: dt('select.list.header.padding');\n }\n\n .p-select-filter {\n width: 100%;\n }\n\n .p-select-list-container {\n overflow: auto;\n }\n\n .p-select-option-group {\n cursor: auto;\n margin: 0;\n padding: dt('select.option.group.padding');\n background: dt('select.option.group.background');\n color: dt('select.option.group.color');\n font-weight: dt('select.option.group.font.weight');\n }\n\n .p-select-list {\n margin: 0;\n padding: 0;\n list-style-type: none;\n padding: dt('select.list.padding');\n gap: dt('select.list.gap');\n display: flex;\n flex-direction: column;\n }\n\n .p-select-option {\n cursor: pointer;\n font-weight: normal;\n white-space: nowrap;\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n padding: dt('select.option.padding');\n border: 0 none;\n color: dt('select.option.color');\n background: transparent;\n transition:\n background dt('select.transition.duration'),\n color dt('select.transition.duration'),\n border-color dt('select.transition.duration'),\n box-shadow dt('select.transition.duration'),\n outline-color dt('select.transition.duration');\n border-radius: dt('select.option.border.radius');\n }\n\n .p-select-option:not(.p-select-option-selected):not(.p-disabled).p-focus {\n background: dt('select.option.focus.background');\n color: dt('select.option.focus.color');\n }\n\n .p-select-option:not(.p-select-option-selected):not(.p-disabled):hover {\n background: dt('select.option.focus.background');\n color: dt('select.option.focus.color');\n }\n\n .p-select-option.p-select-option-selected {\n background: dt('select.option.selected.background');\n color: dt('select.option.selected.color');\n }\n\n .p-select-option.p-select-option-selected.p-focus {\n background: dt('select.option.selected.focus.background');\n color: dt('select.option.selected.focus.color');\n }\n \n .p-select-option-blank-icon {\n flex-shrink: 0;\n }\n\n .p-select-option-check-icon {\n position: relative;\n flex-shrink: 0;\n margin-inline-start: dt('select.checkmark.gutter.start');\n margin-inline-end: dt('select.checkmark.gutter.end');\n color: dt('select.checkmark.color');\n }\n\n .p-select-empty-message {\n padding: dt('select.empty.message.padding');\n }\n\n .p-select-fluid {\n display: flex;\n width: 100%;\n }\n\n .p-select-sm .p-select-label {\n font-size: dt('select.sm.font.size');\n padding-block: dt('select.sm.padding.y');\n padding-inline: dt('select.sm.padding.x');\n }\n\n .p-select-sm .p-select-dropdown .p-icon {\n font-size: dt('select.sm.font.size');\n width: dt('select.sm.font.size');\n height: dt('select.sm.font.size');\n }\n\n .p-select-lg .p-select-label {\n font-size: dt('select.lg.font.size');\n padding-block: dt('select.lg.padding.y');\n padding-inline: dt('select.lg.padding.x');\n }\n\n .p-select-lg .p-select-dropdown .p-icon {\n font-size: dt('select.lg.font.size');\n width: dt('select.lg.font.size');\n height: dt('select.lg.font.size');\n }\n\n .p-floatlabel-in .p-select-filter {\n padding-block-start: dt('select.padding.y');\n padding-block-end: dt('select.padding.y');\n }\n", classes: { @@ -8485,9 +8618,9 @@ var hm = X.extend({ optionBlankIcon: "p-select-option-blank-icon", emptyMessage: "p-select-empty-message" } -}), gm = { +}), Dm = { name: "BaseSelect", - extends: jf, + extends: Hf, props: { options: Array, optionLabel: [String, Function], @@ -8653,7 +8786,7 @@ var hm = X.extend({ default: null } }, - style: hm, + style: Em, provide: function() { return { $pcSelect: this, @@ -8661,39 +8794,39 @@ var hm = X.extend({ }; } }; -function _m(e) { +function Om(e) { "@babel/helpers - typeof"; - return _m = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Om = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, _m(e); + }, Om(e); } -function vm(e) { - return Sm(e) || xm(e) || bm(e) || ym(); +function km(e) { + return Nm(e) || Mm(e) || jm(e) || Am(); } -function ym() { +function Am() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function bm(e, t) { +function jm(e, t) { if (e) { - if (typeof e == "string") return Cm(e, t); + if (typeof e == "string") return Pm(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Cm(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Pm(e, t) : void 0; } } -function xm(e) { +function Mm(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Sm(e) { - if (Array.isArray(e)) return Cm(e); +function Nm(e) { + if (Array.isArray(e)) return Pm(e); } -function Cm(e, t) { +function Pm(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function wm(e, t) { +function Fm(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -8703,42 +8836,42 @@ function wm(e, t) { } return n; } -function Tm(e) { +function Im(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? wm(Object(n), !0).forEach(function(t) { - Em(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : wm(Object(n)).forEach(function(t) { + t % 2 ? Fm(Object(n), !0).forEach(function(t) { + Lm(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Fm(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function Em(e, t, n) { - return (t = Dm(t)) in e ? Object.defineProperty(e, t, { +function Lm(e, t, n) { + return (t = Rm(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Dm(e) { - var t = Om(e, "string"); - return _m(t) == "symbol" ? t : t + ""; +function Rm(e) { + var t = zm(e, "string"); + return Om(t) == "symbol" ? t : t + ""; } -function Om(e, t) { - if (_m(e) != "object" || !e) return e; +function zm(e, t) { + if (Om(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (_m(r) != "object") return r; + if (Om(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var km = { +var Bm = { name: "Select", - extends: gm, + extends: Dm, inheritAttrs: !1, emits: [ "change", @@ -8786,20 +8919,20 @@ var km = { this.overlayVisible && this.isModelValueChanged && this.scrollInView(this.findSelectedOptionIndex()), this.isModelValueChanged = !1; }, beforeUnmount: function() { - this.unbindOutsideClickListener(), this.unbindResizeListener(), this.unbindLabelClickListener(), this.unbindMatchMediaOrientationListener(), this.scrollHandler &&= (this.scrollHandler.destroy(), null), this.overlay &&= (fl.clear(this.overlay), null); + this.unbindOutsideClickListener(), this.unbindResizeListener(), this.unbindLabelClickListener(), this.unbindMatchMediaOrientationListener(), this.scrollHandler &&= (this.scrollHandler.destroy(), null), this.overlay &&= (Sl.clear(this.overlay), null); }, methods: { getOptionIndex: function(e, t) { return this.virtualScrollerDisabled ? e : t && t(e).index; }, getOptionLabel: function(e) { - return this.optionLabel ? nc(e, this.optionLabel) : e; + return this.optionLabel ? fc(e, this.optionLabel) : e; }, getOptionValue: function(e) { - return this.optionValue ? nc(e, this.optionValue) : e; + return this.optionValue ? fc(e, this.optionValue) : e; }, getOptionRenderKey: function(e, t) { - return (this.dataKey ? nc(e, this.dataKey) : this.getOptionLabel(e)) + "_" + t; + return (this.dataKey ? fc(e, this.dataKey) : this.getOptionLabel(e)) + "_" + t; }, getPTItemOptions: function(e, t, n, r) { return this.ptm(r, { context: { @@ -8811,16 +8944,16 @@ var km = { } }); }, isOptionDisabled: function(e) { - return this.optionDisabled ? nc(e, this.optionDisabled) : !1; + return this.optionDisabled ? fc(e, this.optionDisabled) : !1; }, isOptionGroup: function(e) { return this.optionGroupLabel && e.optionGroup && e.group; }, getOptionGroupLabel: function(e) { - return nc(e, this.optionGroupLabel); + return fc(e, this.optionGroupLabel); }, getOptionGroupChildren: function(e) { - return nc(e, this.optionGroupChildren); + return fc(e, this.optionGroupChildren); }, getAriaPosInset: function(e) { var t = this; @@ -8829,11 +8962,11 @@ var km = { }).length : e) + 1; }, show: function(e) { - this.$emit("before-show"), this.overlayVisible = !0, this.focusedOptionIndex = this.focusedOptionIndex === -1 ? this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : this.editable ? -1 : this.findSelectedOptionIndex() : this.focusedOptionIndex, e && q(this.$refs.focusInput); + this.$emit("before-show"), this.overlayVisible = !0, this.focusedOptionIndex = this.focusedOptionIndex === -1 ? this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : this.editable ? -1 : this.findSelectedOptionIndex() : this.focusedOptionIndex, e && J(this.$refs.focusInput); }, hide: function(e) { var t = this, n = function() { - t.$emit("before-hide"), t.overlayVisible = !1, t.clicked = !1, t.focusedOptionIndex = -1, t.searchValue = "", t.resetFilterOnHide && (t.filterValue = null), e && q(t.$refs.focusInput); + t.$emit("before-hide"), t.overlayVisible = !1, t.clicked = !1, t.focusedOptionIndex = -1, t.searchValue = "", t.resetFilterOnHide && (t.filterValue = null), e && J(t.$refs.focusInput); }; setTimeout(function() { n(); @@ -8853,7 +8986,7 @@ var km = { var t = this; if (this.disabled) e.preventDefault(); else { - if (rl()) switch (e.code) { + if (pl()) switch (e.code) { case "Backspace": this.onBackspaceKey(e, this.editable); break; @@ -8907,8 +9040,8 @@ var km = { break; case "ShiftLeft": case "ShiftRight": break; - default: !n && hc(e.key) && (!this.overlayVisible && this.show(), !this.editable && this.searchOptions(e, e.key), this.filter && this.$nextTick(function() { - t.$refs.filterInput && q(t.$refs.filterInput.$el); + default: !n && Tc(e.key) && (!this.overlayVisible && this.show(), !this.editable && this.searchOptions(e, e.key), this.filter && this.$nextTick(function() { + t.$refs.filterInput && J(t.$refs.filterInput.$el); })); } this.clicked = !1; @@ -8916,7 +9049,7 @@ var km = { }, onEditableInput: function(e) { var t = e.target.value; - this.searchValue = "", !this.searchOptions(e, t) && (this.focusedOptionIndex = -1), this.updateModel(e, t), !this.overlayVisible && G(t) && this.show(); + this.searchValue = "", !this.searchOptions(e, t) && (this.focusedOptionIndex = -1), this.updateModel(e, t), !this.overlayVisible && K(t) && this.show(); }, onContainerClick: function(e) { this.disabled || this.loading || e.target.tagName === "INPUT" || e.target.getAttribute("data-pc-section") === "clearicon" || e.target.closest("[data-pc-section=\"clearicon\"]") || (this.overlay && this.overlay.contains(e.target) || (this.overlayVisible ? this.hide(!0) : this.show(!0)), this.clicked = !0); @@ -8925,10 +9058,10 @@ var km = { this.updateModel(e, null), this.resetFilterOnClear && (this.filterValue = null); }, onFirstHiddenFocus: function(e) { - q(e.relatedTarget === this.$refs.focusInput ? Yc(this.overlay, ":not([data-p-hidden-focusable=\"true\"])") : this.$refs.focusInput); + J(e.relatedTarget === this.$refs.focusInput ? al(this.overlay, ":not([data-p-hidden-focusable=\"true\"])") : this.$refs.focusInput); }, onLastHiddenFocus: function(e) { - q(e.relatedTarget === this.$refs.focusInput ? Zc(this.overlay, ":not([data-p-hidden-focusable=\"true\"])") : this.$refs.focusInput); + J(e.relatedTarget === this.$refs.focusInput ? sl(this.overlay, ":not([data-p-hidden-focusable=\"true\"])") : this.$refs.focusInput); }, onOptionSelect: function(e, t) { var n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : !0; @@ -8982,7 +9115,7 @@ var km = { this.overlayVisible && this.alignOverlay(); }, onOverlayClick: function(e) { - tm.emit("overlay-click", { + fm.emit("overlay-click", { originalEvent: e, target: this.$el }); @@ -9043,18 +9176,18 @@ var km = { this.overlayVisible && this.hide(!0), e.preventDefault(), e.stopPropagation(); }, onTabKey: function(e) { - arguments.length > 1 && arguments[1] !== void 0 && arguments[1] || (this.overlayVisible && this.hasFocusableElements() ? (q(this.$refs.firstHiddenFocusableElementOnOverlay), e.preventDefault()) : (this.focusedOptionIndex !== -1 && this.onOptionSelect(e, this.visibleOptions[this.focusedOptionIndex]), this.overlayVisible && this.hide(this.filter))); + arguments.length > 1 && arguments[1] !== void 0 && arguments[1] || (this.overlayVisible && this.hasFocusableElements() ? (J(this.$refs.firstHiddenFocusableElementOnOverlay), e.preventDefault()) : (this.focusedOptionIndex !== -1 && this.onOptionSelect(e, this.visibleOptions[this.focusedOptionIndex]), this.overlayVisible && this.hide(this.filter))); }, onBackspaceKey: function(e) { arguments.length > 1 && arguments[1] !== void 0 && arguments[1] && !this.overlayVisible && this.show(); }, onOverlayEnter: function(e) { var t = this; - fl.set("overlay", e, this.$primevue.config.zIndex.overlay), Lc(e, { + Sl.set("overlay", e, this.$primevue.config.zIndex.overlay), qc(e, { position: "absolute", top: "0" }), this.alignOverlay(), this.scrollInView(), this.$attrSelector && e.setAttribute(this.$attrSelector, ""), setTimeout(function() { - t.autoFilterFocus && t.filter && q(t.$refs.filterInput.$el), t.autoUpdateModel(); + t.autoFilterFocus && t.filter && J(t.$refs.filterInput.$el), t.autoUpdateModel(); }, 1); }, onOverlayAfterEnter: function() { @@ -9063,14 +9196,14 @@ var km = { onOverlayLeave: function(e) { var t = this; e.style.pointerEvents = "none", this.unbindOutsideClickListener(), this.unbindScrollListener(), this.unbindResizeListener(), this.autoFilterFocus && this.filter && !this.editable && this.$nextTick(function() { - t.$refs.filterInput && q(t.$refs.filterInput.$el); + t.$refs.filterInput && J(t.$refs.filterInput.$el); }), this.$emit("hide"), this.overlay = null; }, onOverlayAfterLeave: function(e) { - fl.clear(e); + Sl.clear(e); }, alignOverlay: function() { - this.appendTo === "self" ? zc(this.overlay, this.$el) : this.overlay && (this.overlay.style.minWidth = Rc(this.$el) + "px", Ic(this.overlay, this.$el)); + this.appendTo === "self" ? Yc(this.overlay, this.$el) : this.overlay && (this.overlay.style.minWidth = Jc(this.$el) + "px", Kc(this.overlay, this.$el)); }, bindOutsideClickListener: function() { var e = this; @@ -9084,7 +9217,7 @@ var km = { }, bindScrollListener: function() { var e = this; - this.scrollHandler ||= new vp(this.$refs.container, function() { + this.scrollHandler ||= new kp(this.$refs.container, function() { e.overlayVisible && e.hide(); }), this.scrollHandler.bindScrollListener(); }, @@ -9094,7 +9227,7 @@ var km = { bindResizeListener: function() { var e = this; this.resizeListener || (this.resizeListener = function() { - e.overlayVisible && !sl() && e.hide(); + e.overlayVisible && !_l() && e.hide(); }, window.addEventListener("resize", this.resizeListener)); }, unbindResizeListener: function() { @@ -9104,15 +9237,15 @@ var km = { var e = this; if (!this.editable && !this.labelClickListener) { var t = document.querySelector(`label[for="${this.labelId}"]`); - t && ol(t) && (this.labelClickListener = function() { - q(e.$refs.focusInput); + t && gl(t) && (this.labelClickListener = function() { + J(e.$refs.focusInput); }, t.addEventListener("click", this.labelClickListener)); } }, unbindLabelClickListener: function() { if (this.labelClickListener) { var e = document.querySelector(`label[for="${this.labelId}"]`); - e && ol(e) && e.removeEventListener("click", this.labelClickListener); + e && gl(e) && e.removeEventListener("click", this.labelClickListener); } }, bindMatchMediaOrientationListener: function() { @@ -9128,7 +9261,7 @@ var km = { this.matchMediaOrientationListener &&= (this.queryOrientation.removeEventListener("change", this.matchMediaOrientationListener), this.queryOrientation = null, null); }, hasFocusableElements: function() { - return Jc(this.overlay, ":not([data-p-hidden-focusable=\"true\"])").length > 0; + return il(this.overlay, ":not([data-p-hidden-focusable=\"true\"])").length > 0; }, isOptionExactMatched: function(e) { return this.isValidOption(e) && typeof this.getOptionLabel(e) == "string" && this.getOptionLabel(e)?.toLocaleLowerCase(this.filterLocale) == this.searchValue.toLocaleLowerCase(this.filterLocale); @@ -9137,13 +9270,13 @@ var km = { return this.isValidOption(e) && typeof this.getOptionLabel(e) == "string" && this.getOptionLabel(e)?.toLocaleLowerCase(this.filterLocale).startsWith(this.searchValue.toLocaleLowerCase(this.filterLocale)); }, isValidOption: function(e) { - return G(e) && !(this.isOptionDisabled(e) || this.isOptionGroup(e)); + return K(e) && !(this.isOptionDisabled(e) || this.isOptionGroup(e)); }, isValidSelectedOption: function(e) { return this.isValidOption(e) && this.isSelected(e); }, isSelected: function(e) { - return rc(this.d_value, this.getOptionValue(e), this.equalityKey); + return pc(this.d_value, this.getOptionValue(e), this.equalityKey); }, findFirstOptionIndex: function() { var e = this; @@ -9153,7 +9286,7 @@ var km = { }, findLastOptionIndex: function() { var e = this; - return cc(this.visibleOptions, function(t) { + return vc(this.visibleOptions, function(t) { return e.isValidOption(t); }); }, @@ -9164,7 +9297,7 @@ var km = { return n > -1 ? n + e + 1 : e; }, findPrevOptionIndex: function(e) { - var t = this, n = e > 0 ? cc(this.visibleOptions.slice(0, e), function(e) { + var t = this, n = e > 0 ? vc(this.visibleOptions.slice(0, e), function(e) { return t.isValidOption(e); }) : -1; return n > -1 ? n : e; @@ -9187,7 +9320,7 @@ var km = { var n = this; this.searchValue = (this.searchValue || "") + t; var r = -1, i = !1; - return G(this.searchValue) && (r = this.visibleOptions.findIndex(function(e) { + return K(this.searchValue) && (r = this.visibleOptions.findIndex(function(e) { return n.isOptionExactMatched(e); }), r === -1 && (r = this.visibleOptions.findIndex(function(e) { return n.isOptionStartsWith(e); @@ -9201,7 +9334,7 @@ var km = { scrollInView: function() { var e = this, t = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : -1; this.$nextTick(function() { - var n = t === -1 ? e.focusedOptionId : `${e.$id}_${t}`, r = Kc(e.list, `li[id="${n}"]`); + var n = t === -1 ? e.focusedOptionId : `${e.$id}_${t}`, r = nl(e.list, `li[id="${n}"]`); r ? r.scrollIntoView && r.scrollIntoView({ block: "nearest", inline: "nearest" @@ -9245,14 +9378,14 @@ var km = { visibleOptions: function() { var e = this, t = this.optionGroupLabel ? this.flatOptions(this.options) : this.options || []; if (this.filterValue) { - var n = Kl.filter(t, this.searchFields, this.filterValue, this.filterMatchMode, this.filterLocale); + var n = ru.filter(t, this.searchFields, this.filterValue, this.filterMatchMode, this.filterLocale); if (this.optionGroupLabel) { var r = this.options || [], i = []; return r.forEach(function(t) { var r = e.getOptionGroupChildren(t).filter(function(e) { return n.includes(e); }); - r.length > 0 && i.push(Tm(Tm({}, t), {}, Em({}, typeof e.optionGroupChildren == "string" ? e.optionGroupChildren : "items", vm(r)))); + r.length > 0 && i.push(Im(Im({}, t), {}, Lm({}, typeof e.optionGroupChildren == "string" ? e.optionGroupChildren : "items", km(r)))); }), this.flatOptions(i); } return n; @@ -9277,7 +9410,7 @@ var km = { return this.filterFields || [this.optionLabel]; }, filterResultMessageText: function() { - return G(this.visibleOptions) ? this.filterMessageText.replaceAll("{0}", this.visibleOptions.length) : this.emptyFilterMessageText; + return K(this.visibleOptions) ? this.filterMessageText.replaceAll("{0}", this.visibleOptions.length) : this.emptyFilterMessageText; }, filterMessageText: function() { return this.filterMessage || this.$primevue.config.locale.searchMessage || ""; @@ -9313,7 +9446,7 @@ var km = { return !this.virtualScrollerOptions; }, containerDataP: function() { - return K(Em({ + return q(Lm({ invalid: this.$invalid, disabled: this.disabled, focus: this.focused, @@ -9322,7 +9455,7 @@ var km = { }, this.size, this.size)); }, labelDataP: function() { - return K(Em(Em({ + return q(Lm(Lm({ placeholder: !this.editable && this.label === this.placeholder, clearable: this.showClear, disabled: this.disabled, @@ -9330,27 +9463,27 @@ var km = { }, this.size, this.size), "empty", !this.editable && !this.$slots.value && (this.label === "p-emptylabel" || this.label.length === 0))); }, dropdownIconDataP: function() { - return K(Em({}, this.size, this.size)); + return q(Lm({}, this.size, this.size)); }, overlayDataP: function() { - return K(Em({}, "portal-" + this.appendTo, "portal-" + this.appendTo)); + return q(Lm({}, "portal-" + this.appendTo, "portal-" + this.appendTo)); } }, - directives: { ripple: Zd }, + directives: { ripple: lf }, components: { - InputText: ep, - VirtualScroller: fm, - Portal: nm, - InputIcon: $p, - IconField: Zp, - TimesIcon: Up, - ChevronDownIcon: Dp, - SpinnerIcon: dd, - SearchIcon: Fp, - CheckIcon: mf, - BlankIcon: yp + InputText: dp, + VirtualScroller: Cm, + Portal: pm, + InputIcon: um, + IconField: cm, + TimesIcon: em, + ChevronDownIcon: Rp, + SpinnerIcon: Sd, + SearchIcon: Kp, + CheckIcon: Tf, + BlankIcon: Ap } -}, Am = ["id", "data-p"], jm = [ +}, Vm = ["id", "data-p"], Hm = [ "name", "id", "value", @@ -9364,7 +9497,7 @@ var km = { "aria-activedescendant", "aria-invalid", "data-p" -], Mm = [ +], Um = [ "name", "id", "tabindex", @@ -9376,7 +9509,7 @@ var km = { "aria-invalid", "aria-disabled", "data-p" -], Nm = ["data-p"], Pm = ["id"], Fm = ["id"], Im = [ +], Wm = ["data-p"], Gm = ["id"], Km = ["id"], qm = [ "id", "aria-label", "aria-selected", @@ -9389,9 +9522,9 @@ var km = { "data-p-focused", "data-p-disabled" ]; -function Lm(e, t, n, r, i, a) { - var o = F("SpinnerIcon"), s = F("InputText"), c = F("SearchIcon"), l = F("InputIcon"), u = F("IconField"), d = F("CheckIcon"), f = F("BlankIcon"), p = F("VirtualScroller"), m = F("Portal"), h = ci("ripple"); - return R(), z("div", W({ +function Jm(e, t, n, r, i, a) { + var o = F("SpinnerIcon"), s = F("InputText"), c = F("SearchIcon"), l = F("InputIcon"), u = F("IconField"), d = F("CheckIcon"), f = F("BlankIcon"), p = F("VirtualScroller"), m = F("Portal"), h = mi("ripple"); + return z(), B("div", G({ ref: "container", id: e.$id, class: e.cx("root"), @@ -9400,7 +9533,7 @@ function Lm(e, t, n, r, i, a) { }, "data-p": a.containerDataP }, e.ptmi("root")), [ - e.editable ? (R(), z("input", W({ + e.editable ? (z(), B("input", G({ key: 0, ref: "focusInput", name: e.name, @@ -9438,7 +9571,7 @@ function Lm(e, t, n, r, i, a) { return a.onEditableInput && a.onEditableInput.apply(a, arguments); }, "data-p": a.labelDataP - }, e.ptm("label")), null, 16, jm)) : (R(), z("span", W({ + }, e.ptm("label")), null, 16, Hm)) : (z(), B("span", G({ key: 1, ref: "focusInput", name: e.name, @@ -9473,24 +9606,24 @@ function Lm(e, t, n, r, i, a) { value: e.d_value, placeholder: e.placeholder }, function() { - return [Ua(O(a.label === "p-emptylabel" ? "\xA0" : a.label ?? "empty"), 1)]; - })], 16, Mm)), + return [Za(k(a.label === "p-emptylabel" ? "\xA0" : a.label ?? "empty"), 1)]; + })], 16, Um)), a.isClearIconVisible ? I(e.$slots, "clearicon", { key: 2, - class: D(e.cx("clearIcon")), + class: O(e.cx("clearIcon")), clearCallback: a.onClearClick }, function() { - return [(R(), B(si(e.clearIcon ? "i" : "TimesIcon"), W({ + return [(z(), V(pi(e.clearIcon ? "i" : "TimesIcon"), G({ ref: "clearIcon", class: [e.cx("clearIcon"), e.clearIcon], onClick: a.onClearClick }, e.ptm("clearIcon"), { "data-pc-section": "clearicon" }), null, 16, ["class", "onClick"]))]; - }) : U("", !0), - V("div", W({ class: e.cx("dropdown") }, e.ptm("dropdown")), [e.loading ? I(e.$slots, "loadingicon", { + }) : W("", !0), + H("div", G({ class: e.cx("dropdown") }, e.ptm("dropdown")), [e.loading ? I(e.$slots, "loadingicon", { key: 0, - class: D(e.cx("loadingIcon")) + class: O(e.cx("loadingIcon")) }, function() { - return [e.loadingIcon ? (R(), z("span", W({ + return [e.loadingIcon ? (z(), B("span", G({ key: 0, class: [ e.cx("loadingIcon"), @@ -9498,7 +9631,7 @@ function Lm(e, t, n, r, i, a) { e.loadingIcon ], "aria-hidden": "true" - }, e.ptm("loadingIcon")), null, 16)) : (R(), B(o, W({ + }, e.ptm("loadingIcon")), null, 16)) : (z(), V(o, G({ key: 1, class: e.cx("loadingIcon"), spin: "", @@ -9506,17 +9639,17 @@ function Lm(e, t, n, r, i, a) { }, e.ptm("loadingIcon")), null, 16, ["class"]))]; }) : I(e.$slots, "dropdownicon", { key: 1, - class: D(e.cx("dropdownIcon")) + class: O(e.cx("dropdownIcon")) }, function() { - return [(R(), B(si(e.dropdownIcon ? "span" : "ChevronDownIcon"), W({ + return [(z(), V(pi(e.dropdownIcon ? "span" : "ChevronDownIcon"), G({ class: [e.cx("dropdownIcon"), e.dropdownIcon], "aria-hidden": "true", "data-p": a.dropdownIconDataP }, e.ptm("dropdownIcon")), null, 16, ["class", "data-p"]))]; })], 16), - H(m, { appendTo: e.appendTo }, { + U(m, { appendTo: e.appendTo }, { default: P(function() { - return [H(jo, W({ + return [U(Vo, G({ name: "p-anchored-overlay", onEnter: a.onOverlayEnter, onAfterEnter: a.onOverlayAfterEnter, @@ -9524,7 +9657,7 @@ function Lm(e, t, n, r, i, a) { onAfterLeave: a.onOverlayAfterLeave }, e.ptm("transition")), { default: P(function() { - return [i.overlayVisible ? (R(), z("div", W({ + return [i.overlayVisible ? (z(), B("div", G({ key: 0, ref: a.overlayRef, class: [ @@ -9541,7 +9674,7 @@ function Lm(e, t, n, r, i, a) { }, "data-p": a.overlayDataP }, e.ptm("overlay")), [ - V("span", W({ + H("span", G({ ref: "firstHiddenFocusableElementOnOverlay", role: "presentation", "aria-hidden": "true", @@ -9558,21 +9691,21 @@ function Lm(e, t, n, r, i, a) { value: e.d_value, options: a.visibleOptions }), - e.filter ? (R(), z("div", W({ + e.filter ? (z(), B("div", G({ key: 0, class: e.cx("header") - }, e.ptm("header")), [H(u, { + }, e.ptm("header")), [U(u, { unstyled: e.unstyled, pt: e.ptm("pcFilterContainer") }, { default: P(function() { - return [H(s, { + return [U(s, { ref: "filterInput", type: "text", value: i.filterValue, onVnodeMounted: a.onFilterUpdated, onVnodeUpdated: a.onFilterUpdated, - class: D(e.cx("pcFilter")), + class: O(e.cx("pcFilter")), placeholder: e.filterPlaceholder, variant: e.variant, unstyled: e.unstyled, @@ -9599,40 +9732,40 @@ function Lm(e, t, n, r, i, a) { "onBlur", "onInput", "pt" - ]), H(l, { + ]), U(l, { unstyled: e.unstyled, pt: e.ptm("pcFilterIconContainer") }, { default: P(function() { return [I(e.$slots, "filtericon", {}, function() { - return [e.filterIcon ? (R(), z("span", W({ + return [e.filterIcon ? (z(), B("span", G({ key: 0, class: e.filterIcon - }, e.ptm("filterIcon")), null, 16)) : (R(), B(c, ve(W({ key: 1 }, e.ptm("filterIcon"))), null, 16))]; + }, e.ptm("filterIcon")), null, 16)) : (z(), V(c, _e(G({ key: 1 }, e.ptm("filterIcon"))), null, 16))]; })]; }), _: 3 }, 8, ["unstyled", "pt"])]; }), _: 3 - }, 8, ["unstyled", "pt"]), V("span", W({ + }, 8, ["unstyled", "pt"]), H("span", G({ role: "status", "aria-live": "polite", class: "p-hidden-accessible" - }, e.ptm("hiddenFilterResult"), { "data-p-hidden-accessible": !0 }), O(a.filterResultMessageText), 17)], 16)) : U("", !0), - V("div", W({ + }, e.ptm("hiddenFilterResult"), { "data-p-hidden-accessible": !0 }), k(a.filterResultMessageText), 17)], 16)) : W("", !0), + H("div", G({ class: e.cx("listContainer"), style: { "max-height": a.virtualScrollerDisabled ? e.scrollHeight : "" } - }, e.ptm("listContainer")), [H(p, W({ ref: a.virtualScrollerRef }, e.virtualScrollerOptions, { + }, e.ptm("listContainer")), [U(p, G({ ref: a.virtualScrollerRef }, e.virtualScrollerOptions, { items: a.visibleOptions, style: { height: e.scrollHeight }, tabindex: -1, disabled: a.virtualScrollerDisabled, pt: e.ptm("virtualScroller") - }), fi({ + }), vi({ content: P(function(n) { var r = n.styleClass, o = n.contentRef, s = n.items, c = n.getItemOptions, l = n.contentStyle, u = n.itemSize; - return [V("ul", W({ + return [H("ul", G({ ref: function(e) { return a.listRef(e, o); }, @@ -9640,8 +9773,8 @@ function Lm(e, t, n, r, i, a) { class: [e.cx("list"), r], style: l, role: "listbox" - }, e.ptm("list")), [(R(!0), z(L, null, di(s, function(n, r) { - return R(), z(L, { key: a.getOptionRenderKey(n, a.getOptionIndex(r, c)) }, [a.isOptionGroup(n) ? (R(), z("li", W({ + }, e.ptm("list")), [(z(!0), B(L, null, _i(s, function(n, r) { + return z(), B(L, { key: a.getOptionRenderKey(n, a.getOptionIndex(r, c)) }, [a.isOptionGroup(n) ? (z(), B("li", G({ key: 0, id: e.$id + "_" + a.getOptionIndex(r, c), style: { height: u ? u + "px" : void 0 }, @@ -9651,8 +9784,8 @@ function Lm(e, t, n, r, i, a) { option: n.optionGroup, index: a.getOptionIndex(r, c) }, function() { - return [V("span", W({ class: e.cx("optionGroupLabel") }, { ref_for: !0 }, e.ptm("optionGroupLabel")), O(a.getOptionGroupLabel(n.optionGroup)), 17)]; - })], 16, Fm)) : Hn((R(), z("li", W({ + return [H("span", G({ class: e.cx("optionGroupLabel") }, { ref_for: !0 }, e.ptm("optionGroupLabel")), k(a.getOptionGroupLabel(n.optionGroup)), 17)]; + })], 16, Km)) : qn((z(), B("li", G({ key: 1, id: e.$id + "_" + a.getOptionIndex(r, c), class: e.cx("option", { @@ -9672,36 +9805,36 @@ function Lm(e, t, n, r, i, a) { onMousemove: function(e) { return a.onOptionMouseMove(e, a.getOptionIndex(r, c)); }, - onClick: t[8] ||= Ls(function() {}, ["stop"]), + onClick: t[8] ||= qs(function() {}, ["stop"]), "data-p-selected": !e.checkmark && a.isSelected(n), "data-p-focused": i.focusedOptionIndex === a.getOptionIndex(r, c), "data-p-disabled": a.isOptionDisabled(n) - }, { ref_for: !0 }, a.getPTItemOptions(n, c, r, "option")), [e.checkmark ? (R(), z(L, { key: 0 }, [a.isSelected(n) ? (R(), B(d, W({ + }, { ref_for: !0 }, a.getPTItemOptions(n, c, r, "option")), [e.checkmark ? (z(), B(L, { key: 0 }, [a.isSelected(n) ? (z(), V(d, G({ key: 0, class: e.cx("optionCheckIcon") - }, { ref_for: !0 }, e.ptm("optionCheckIcon")), null, 16, ["class"])) : (R(), B(f, W({ + }, { ref_for: !0 }, e.ptm("optionCheckIcon")), null, 16, ["class"])) : (z(), V(f, G({ key: 1, class: e.cx("optionBlankIcon") - }, { ref_for: !0 }, e.ptm("optionBlankIcon")), null, 16, ["class"]))], 64)) : U("", !0), I(e.$slots, "option", { + }, { ref_for: !0 }, e.ptm("optionBlankIcon")), null, 16, ["class"]))], 64)) : W("", !0), I(e.$slots, "option", { option: n, selected: a.isSelected(n), index: a.getOptionIndex(r, c) }, function() { - return [V("span", W({ class: e.cx("optionLabel") }, { ref_for: !0 }, e.ptm("optionLabel")), O(a.getOptionLabel(n)), 17)]; - })], 16, Im)), [[h]])], 64); - }), 128)), i.filterValue && (!s || s && s.length === 0) ? (R(), z("li", W({ + return [H("span", G({ class: e.cx("optionLabel") }, { ref_for: !0 }, e.ptm("optionLabel")), k(a.getOptionLabel(n)), 17)]; + })], 16, qm)), [[h]])], 64); + }), 128)), i.filterValue && (!s || s && s.length === 0) ? (z(), B("li", G({ key: 0, class: e.cx("emptyMessage"), role: "option" }, e.ptm("emptyMessage"), { "data-p-hidden-accessible": !0 }), [I(e.$slots, "emptyfilter", {}, function() { - return [Ua(O(a.emptyFilterMessageText), 1)]; - })], 16)) : !e.options || e.options && e.options.length === 0 ? (R(), z("li", W({ + return [Za(k(a.emptyFilterMessageText), 1)]; + })], 16)) : !e.options || e.options && e.options.length === 0 ? (z(), B("li", G({ key: 1, class: e.cx("emptyMessage"), role: "option" }, e.ptm("emptyMessage"), { "data-p-hidden-accessible": !0 }), [I(e.$slots, "empty", {}, function() { - return [Ua(O(a.emptyMessageText), 1)]; - })], 16)) : U("", !0)], 16, Pm)]; + return [Za(k(a.emptyMessageText), 1)]; + })], 16)) : W("", !0)], 16, Gm)]; }), _: 2 }, [e.$slots.loader ? { @@ -9721,18 +9854,18 @@ function Lm(e, t, n, r, i, a) { value: e.d_value, options: a.visibleOptions }), - !e.options || e.options && e.options.length === 0 ? (R(), z("span", W({ + !e.options || e.options && e.options.length === 0 ? (z(), B("span", G({ key: 1, role: "status", "aria-live": "polite", class: "p-hidden-accessible" - }, e.ptm("hiddenEmptyMessage"), { "data-p-hidden-accessible": !0 }), O(a.emptyMessageText), 17)) : U("", !0), - V("span", W({ + }, e.ptm("hiddenEmptyMessage"), { "data-p-hidden-accessible": !0 }), k(a.emptyMessageText), 17)) : W("", !0), + H("span", G({ role: "status", "aria-live": "polite", class: "p-hidden-accessible" - }, e.ptm("hiddenSelectedMessage"), { "data-p-hidden-accessible": !0 }), O(a.selectedMessageText), 17), - V("span", W({ + }, e.ptm("hiddenSelectedMessage"), { "data-p-hidden-accessible": !0 }), k(a.selectedMessageText), 17), + H("span", G({ ref: "lastHiddenFocusableElementOnOverlay", role: "presentation", "aria-hidden": "true", @@ -9745,7 +9878,7 @@ function Lm(e, t, n, r, i, a) { "data-p-hidden-accessible": !0, "data-p-hidden-focusable": !0 }), null, 16) - ], 16, Nm)) : U("", !0)]; + ], 16, Wm)) : W("", !0)]; }), _: 3 }, 16, [ @@ -9757,11 +9890,11 @@ function Lm(e, t, n, r, i, a) { }), _: 3 }, 8, ["appendTo"]) - ], 16, Am); + ], 16, Vm); } -km.render = Lm; +Bm.render = Jm; // node_modules/primevue/togglebutton/style/index.mjs -var Rm = X.extend({ +var Ym = X.extend({ name: "togglebutton", style: "\n .p-togglebutton {\n display: inline-flex;\n cursor: pointer;\n user-select: none;\n overflow: hidden;\n position: relative;\n color: dt('togglebutton.color');\n background: dt('togglebutton.background');\n border: 1px solid dt('togglebutton.border.color');\n padding: dt('togglebutton.padding');\n font-size: 1rem;\n font-family: inherit;\n font-feature-settings: inherit;\n transition:\n background dt('togglebutton.transition.duration'),\n color dt('togglebutton.transition.duration'),\n border-color dt('togglebutton.transition.duration'),\n outline-color dt('togglebutton.transition.duration'),\n box-shadow dt('togglebutton.transition.duration');\n border-radius: dt('togglebutton.border.radius');\n outline-color: transparent;\n font-weight: dt('togglebutton.font.weight');\n }\n\n .p-togglebutton-content {\n display: inline-flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n gap: dt('togglebutton.gap');\n padding: dt('togglebutton.content.padding');\n background: transparent;\n border-radius: dt('togglebutton.content.border.radius');\n transition:\n background dt('togglebutton.transition.duration'),\n color dt('togglebutton.transition.duration'),\n border-color dt('togglebutton.transition.duration'),\n outline-color dt('togglebutton.transition.duration'),\n box-shadow dt('togglebutton.transition.duration');\n }\n\n .p-togglebutton:not(:disabled):not(.p-togglebutton-checked):hover {\n background: dt('togglebutton.hover.background');\n color: dt('togglebutton.hover.color');\n }\n\n .p-togglebutton.p-togglebutton-checked {\n background: dt('togglebutton.checked.background');\n border-color: dt('togglebutton.checked.border.color');\n color: dt('togglebutton.checked.color');\n }\n\n .p-togglebutton-checked .p-togglebutton-content {\n background: dt('togglebutton.content.checked.background');\n box-shadow: dt('togglebutton.content.checked.shadow');\n }\n\n .p-togglebutton:focus-visible {\n box-shadow: dt('togglebutton.focus.ring.shadow');\n outline: dt('togglebutton.focus.ring.width') dt('togglebutton.focus.ring.style') dt('togglebutton.focus.ring.color');\n outline-offset: dt('togglebutton.focus.ring.offset');\n }\n\n .p-togglebutton.p-invalid {\n border-color: dt('togglebutton.invalid.border.color');\n }\n\n .p-togglebutton:disabled {\n opacity: 1;\n cursor: default;\n background: dt('togglebutton.disabled.background');\n border-color: dt('togglebutton.disabled.border.color');\n color: dt('togglebutton.disabled.color');\n }\n\n .p-togglebutton-label,\n .p-togglebutton-icon {\n position: relative;\n transition: none;\n }\n\n .p-togglebutton-icon {\n color: dt('togglebutton.icon.color');\n }\n\n .p-togglebutton:not(:disabled):not(.p-togglebutton-checked):hover .p-togglebutton-icon {\n color: dt('togglebutton.icon.hover.color');\n }\n\n .p-togglebutton.p-togglebutton-checked .p-togglebutton-icon {\n color: dt('togglebutton.icon.checked.color');\n }\n\n .p-togglebutton:disabled .p-togglebutton-icon {\n color: dt('togglebutton.icon.disabled.color');\n }\n\n .p-togglebutton-sm {\n padding: dt('togglebutton.sm.padding');\n font-size: dt('togglebutton.sm.font.size');\n }\n\n .p-togglebutton-sm .p-togglebutton-content {\n padding: dt('togglebutton.content.sm.padding');\n }\n\n .p-togglebutton-lg {\n padding: dt('togglebutton.lg.padding');\n font-size: dt('togglebutton.lg.font.size');\n }\n\n .p-togglebutton-lg .p-togglebutton-content {\n padding: dt('togglebutton.content.lg.padding');\n }\n\n .p-togglebutton-fluid {\n width: 100%;\n }\n", classes: { @@ -9779,9 +9912,9 @@ var Rm = X.extend({ icon: "p-togglebutton-icon", label: "p-togglebutton-label" } -}), zm = { +}), Xm = { name: "BaseToggleButton", - extends: Af, + extends: Vf, props: { onIcon: String, offIcon: String, @@ -9818,7 +9951,7 @@ var Rm = X.extend({ default: null } }, - style: Rm, + style: Ym, provide: function() { return { $pcToggleButton: this, @@ -9826,39 +9959,39 @@ var Rm = X.extend({ }; } }; -function Bm(e) { +function Zm(e) { "@babel/helpers - typeof"; - return Bm = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Zm = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Bm(e); + }, Zm(e); } -function Vm(e, t, n) { - return (t = Hm(t)) in e ? Object.defineProperty(e, t, { +function Qm(e, t, n) { + return (t = $m(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Hm(e) { - var t = Um(e, "string"); - return Bm(t) == "symbol" ? t : t + ""; +function $m(e) { + var t = eh(e, "string"); + return Zm(t) == "symbol" ? t : t + ""; } -function Um(e, t) { - if (Bm(e) != "object" || !e) return e; +function eh(e, t) { + if (Zm(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Bm(r) != "object") return r; + if (Zm(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var Wm = { +var th = { name: "ToggleButton", - extends: zm, + extends: Xm, inheritAttrs: !1, emits: ["change"], methods: { @@ -9881,20 +10014,20 @@ var Wm = { return this.d_value === !0; }, hasLabel: function() { - return G(this.onLabel) && G(this.offLabel); + return K(this.onLabel) && K(this.offLabel); }, label: function() { return this.hasLabel ? this.d_value ? this.onLabel : this.offLabel : "\xA0"; }, dataP: function() { - return K(Vm({ + return q(Qm({ checked: this.active, invalid: this.$invalid }, this.size, this.size)); } }, - directives: { ripple: Zd } -}, Gm = [ + directives: { ripple: lf } +}, nh = [ "tabindex", "disabled", "aria-pressed", @@ -9903,10 +10036,10 @@ var Wm = { "data-p-checked", "data-p-disabled", "data-p" -], Km = ["data-p"]; -function qm(e, t, n, r, i, a) { - var o = ci("ripple"); - return Hn((R(), z("button", W({ +], rh = ["data-p"]; +function ih(e, t, n, r, i, a) { + var o = mi("ripple"); + return qn((z(), B("button", G({ type: "button", class: e.cx("root"), tabindex: e.tabindex, @@ -9924,21 +10057,21 @@ function qm(e, t, n, r, i, a) { "data-p-checked": a.active, "data-p-disabled": e.disabled, "data-p": a.dataP - }), [V("span", W({ class: e.cx("content") }, a.getPTOptions("content"), { "data-p": a.dataP }), [I(e.$slots, "default", {}, function() { + }), [H("span", G({ class: e.cx("content") }, a.getPTOptions("content"), { "data-p": a.dataP }), [I(e.$slots, "default", {}, function() { return [I(e.$slots, "icon", { value: e.d_value, - class: D(e.cx("icon")) + class: O(e.cx("icon")) }, function() { - return [e.onIcon || e.offIcon ? (R(), z("span", W({ + return [e.onIcon || e.offIcon ? (z(), B("span", G({ key: 0, class: [e.cx("icon"), e.d_value ? e.onIcon : e.offIcon] - }, a.getPTOptions("icon")), null, 16)) : U("", !0)]; - }), V("span", W({ class: e.cx("label") }, a.getPTOptions("label")), O(a.label), 17)]; - })], 16, Km)], 16, Gm)), [[o]]); + }, a.getPTOptions("icon")), null, 16)) : W("", !0)]; + }), H("span", G({ class: e.cx("label") }, a.getPTOptions("label")), k(a.label), 17)]; + })], 16, rh)], 16, nh)), [[o]]); } -Wm.render = qm; +th.render = ih; // node_modules/primevue/tag/style/index.mjs -var Jm = X.extend({ +var ah = X.extend({ name: "tag", style: "\n .p-tag {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: dt('tag.primary.background');\n color: dt('tag.primary.color');\n font-size: dt('tag.font.size');\n font-weight: dt('tag.font.weight');\n padding: dt('tag.padding');\n border-radius: dt('tag.border.radius');\n gap: dt('tag.gap');\n }\n\n .p-tag-icon {\n font-size: dt('tag.icon.size');\n width: dt('tag.icon.size');\n height: dt('tag.icon.size');\n }\n\n .p-tag-rounded {\n border-radius: dt('tag.rounded.border.radius');\n }\n\n .p-tag-success {\n background: dt('tag.success.background');\n color: dt('tag.success.color');\n }\n\n .p-tag-info {\n background: dt('tag.info.background');\n color: dt('tag.info.color');\n }\n\n .p-tag-warn {\n background: dt('tag.warn.background');\n color: dt('tag.warn.color');\n }\n\n .p-tag-danger {\n background: dt('tag.danger.background');\n color: dt('tag.danger.color');\n }\n\n .p-tag-secondary {\n background: dt('tag.secondary.background');\n color: dt('tag.secondary.color');\n }\n\n .p-tag-contrast {\n background: dt('tag.contrast.background');\n color: dt('tag.contrast.color');\n }\n", classes: { @@ -9957,16 +10090,16 @@ var Jm = X.extend({ icon: "p-tag-icon", label: "p-tag-label" } -}), Ym = { +}), oh = { name: "BaseTag", - extends: nd, + extends: pd, props: { value: null, severity: null, rounded: Boolean, icon: String }, - style: Jm, + style: ah, provide: function() { return { $pcTag: this, @@ -9974,158 +10107,158 @@ var Jm = X.extend({ }; } }; -function Xm(e) { +function sh(e) { "@babel/helpers - typeof"; - return Xm = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return sh = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Xm(e); + }, sh(e); } -function Zm(e, t, n) { - return (t = Qm(t)) in e ? Object.defineProperty(e, t, { +function ch(e, t, n) { + return (t = lh(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Qm(e) { - var t = $m(e, "string"); - return Xm(t) == "symbol" ? t : t + ""; +function lh(e) { + var t = uh(e, "string"); + return sh(t) == "symbol" ? t : t + ""; } -function $m(e, t) { - if (Xm(e) != "object" || !e) return e; +function uh(e, t) { + if (sh(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Xm(r) != "object") return r; + if (sh(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var eh = { +var dh = { name: "Tag", - extends: Ym, + extends: oh, inheritAttrs: !1, computed: { dataP: function() { - return K(Zm({ rounded: this.rounded }, this.severity, this.severity)); + return q(ch({ rounded: this.rounded }, this.severity, this.severity)); } } -}, th = ["data-p"]; -function nh(e, t, n, r, i, a) { - return R(), z("span", W({ +}, fh = ["data-p"]; +function ph(e, t, n, r, i, a) { + return z(), B("span", G({ class: e.cx("root"), "data-p": a.dataP - }, e.ptmi("root")), [e.$slots.icon ? (R(), B(si(e.$slots.icon), W({ + }, e.ptmi("root")), [e.$slots.icon ? (z(), V(pi(e.$slots.icon), G({ key: 0, class: e.cx("icon") - }, e.ptm("icon")), null, 16, ["class"])) : e.icon ? (R(), z("span", W({ + }, e.ptm("icon")), null, 16, ["class"])) : e.icon ? (z(), B("span", G({ key: 1, class: [e.cx("icon"), e.icon] - }, e.ptm("icon")), null, 16)) : U("", !0), e.value != null || e.$slots.default ? I(e.$slots, "default", { key: 2 }, function() { - return [V("span", W({ class: e.cx("label") }, e.ptm("label")), O(e.value), 17)]; - }) : U("", !0)], 16, th); + }, e.ptm("icon")), null, 16)) : W("", !0), e.value != null || e.$slots.default ? I(e.$slots, "default", { key: 2 }, function() { + return [H("span", G({ class: e.cx("label") }, e.ptm("label")), k(e.value), 17)]; + }) : W("", !0)], 16, fh); } -eh.render = nh; +dh.render = ph; // node_modules/@primevue/icons/windowmaximize/index.mjs -var rh = { +var mh = { name: "WindowMaximizeIcon", - extends: ud + extends: xd }; -function ih(e) { - return ch(e) || sh(e) || oh(e) || ah(); +function hh(e) { + return yh(e) || vh(e) || _h(e) || gh(); } -function ah() { +function gh() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function oh(e, t) { +function _h(e, t) { if (e) { - if (typeof e == "string") return lh(e, t); + if (typeof e == "string") return bh(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? lh(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? bh(e, t) : void 0; } } -function sh(e) { +function vh(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function ch(e) { - if (Array.isArray(e)) return lh(e); +function yh(e) { + if (Array.isArray(e)) return bh(e); } -function lh(e, t) { +function bh(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function uh(e, t, n, r, i, a) { - return R(), z("svg", W({ +function xh(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), ih(t[0] ||= [V("path", { + }, e.pti()), hh(t[0] ||= [H("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M7 14H11.8C12.3835 14 12.9431 13.7682 13.3556 13.3556C13.7682 12.9431 14 12.3835 14 11.8V2.2C14 1.61652 13.7682 1.05694 13.3556 0.644365C12.9431 0.231785 12.3835 0 11.8 0H2.2C1.61652 0 1.05694 0.231785 0.644365 0.644365C0.231785 1.05694 0 1.61652 0 2.2V7C0 7.15913 0.063214 7.31174 0.175736 7.42426C0.288258 7.53679 0.44087 7.6 0.6 7.6C0.75913 7.6 0.911742 7.53679 1.02426 7.42426C1.13679 7.31174 1.2 7.15913 1.2 7V2.2C1.2 1.93478 1.30536 1.68043 1.49289 1.49289C1.68043 1.30536 1.93478 1.2 2.2 1.2H11.8C12.0652 1.2 12.3196 1.30536 12.5071 1.49289C12.6946 1.68043 12.8 1.93478 12.8 2.2V11.8C12.8 12.0652 12.6946 12.3196 12.5071 12.5071C12.3196 12.6946 12.0652 12.8 11.8 12.8H7C6.84087 12.8 6.68826 12.8632 6.57574 12.9757C6.46321 13.0883 6.4 13.2409 6.4 13.4C6.4 13.5591 6.46321 13.7117 6.57574 13.8243C6.68826 13.9368 6.84087 14 7 14ZM9.77805 7.42192C9.89013 7.534 10.0415 7.59788 10.2 7.59995C10.3585 7.59788 10.5099 7.534 10.622 7.42192C10.7341 7.30985 10.798 7.15844 10.8 6.99995V3.94242C10.8066 3.90505 10.8096 3.86689 10.8089 3.82843C10.8079 3.77159 10.7988 3.7157 10.7824 3.6623C10.756 3.55552 10.701 3.45698 10.622 3.37798C10.5099 3.2659 10.3585 3.20202 10.2 3.19995H7.00002C6.84089 3.19995 6.68828 3.26317 6.57576 3.37569C6.46324 3.48821 6.40002 3.64082 6.40002 3.79995C6.40002 3.95908 6.46324 4.11169 6.57576 4.22422C6.68828 4.33674 6.84089 4.39995 7.00002 4.39995H8.80006L6.19997 7.00005C6.10158 7.11005 6.04718 7.25246 6.04718 7.40005C6.04718 7.54763 6.10158 7.69004 6.19997 7.80005C6.30202 7.91645 6.44561 7.98824 6.59997 8.00005C6.75432 7.98824 6.89791 7.91645 6.99997 7.80005L9.60002 5.26841V6.99995C9.6021 7.15844 9.66598 7.30985 9.77805 7.42192ZM1.4 14H3.8C4.17066 13.9979 4.52553 13.8498 4.78763 13.5877C5.04973 13.3256 5.1979 12.9707 5.2 12.6V10.2C5.1979 9.82939 5.04973 9.47452 4.78763 9.21242C4.52553 8.95032 4.17066 8.80215 3.8 8.80005H1.4C1.02934 8.80215 0.674468 8.95032 0.412371 9.21242C0.150274 9.47452 0.00210008 9.82939 0 10.2V12.6C0.00210008 12.9707 0.150274 13.3256 0.412371 13.5877C0.674468 13.8498 1.02934 13.9979 1.4 14ZM1.25858 10.0586C1.29609 10.0211 1.34696 10 1.4 10H3.8C3.85304 10 3.90391 10.0211 3.94142 10.0586C3.97893 10.0961 4 10.147 4 10.2V12.6C4 12.6531 3.97893 12.704 3.94142 12.7415C3.90391 12.779 3.85304 12.8 3.8 12.8H1.4C1.34696 12.8 1.29609 12.779 1.25858 12.7415C1.22107 12.704 1.2 12.6531 1.2 12.6V10.2C1.2 10.147 1.22107 10.0961 1.25858 10.0586Z", fill: "currentColor" }, null, -1)]), 16); } -rh.render = uh; +mh.render = xh; // node_modules/@primevue/icons/windowminimize/index.mjs -var dh = { +var Sh = { name: "WindowMinimizeIcon", - extends: ud + extends: xd }; -function fh(e) { - return gh(e) || hh(e) || mh(e) || ph(); +function Ch(e) { + return Dh(e) || Eh(e) || Th(e) || wh(); } -function ph() { +function wh() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function mh(e, t) { +function Th(e, t) { if (e) { - if (typeof e == "string") return _h(e, t); + if (typeof e == "string") return Oh(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? _h(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Oh(e, t) : void 0; } } -function hh(e) { +function Eh(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function gh(e) { - if (Array.isArray(e)) return _h(e); +function Dh(e) { + if (Array.isArray(e)) return Oh(e); } -function _h(e, t) { +function Oh(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function vh(e, t, n, r, i, a) { - return R(), z("svg", W({ +function kh(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), fh(t[0] ||= [V("path", { + }, e.pti()), Ch(t[0] ||= [H("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M11.8 0H2.2C1.61652 0 1.05694 0.231785 0.644365 0.644365C0.231785 1.05694 0 1.61652 0 2.2V7C0 7.15913 0.063214 7.31174 0.175736 7.42426C0.288258 7.53679 0.44087 7.6 0.6 7.6C0.75913 7.6 0.911742 7.53679 1.02426 7.42426C1.13679 7.31174 1.2 7.15913 1.2 7V2.2C1.2 1.93478 1.30536 1.68043 1.49289 1.49289C1.68043 1.30536 1.93478 1.2 2.2 1.2H11.8C12.0652 1.2 12.3196 1.30536 12.5071 1.49289C12.6946 1.68043 12.8 1.93478 12.8 2.2V11.8C12.8 12.0652 12.6946 12.3196 12.5071 12.5071C12.3196 12.6946 12.0652 12.8 11.8 12.8H7C6.84087 12.8 6.68826 12.8632 6.57574 12.9757C6.46321 13.0883 6.4 13.2409 6.4 13.4C6.4 13.5591 6.46321 13.7117 6.57574 13.8243C6.68826 13.9368 6.84087 14 7 14H11.8C12.3835 14 12.9431 13.7682 13.3556 13.3556C13.7682 12.9431 14 12.3835 14 11.8V2.2C14 1.61652 13.7682 1.05694 13.3556 0.644365C12.9431 0.231785 12.3835 0 11.8 0ZM6.368 7.952C6.44137 7.98326 6.52025 7.99958 6.6 8H9.8C9.95913 8 10.1117 7.93678 10.2243 7.82426C10.3368 7.71174 10.4 7.55913 10.4 7.4C10.4 7.24087 10.3368 7.08826 10.2243 6.97574C10.1117 6.86321 9.95913 6.8 9.8 6.8H8.048L10.624 4.224C10.73 4.11026 10.7877 3.95982 10.7849 3.80438C10.7822 3.64894 10.7192 3.50063 10.6093 3.3907C10.4994 3.28077 10.3511 3.2178 10.1956 3.21506C10.0402 3.21232 9.88974 3.27002 9.776 3.376L7.2 5.952V4.2C7.2 4.04087 7.13679 3.88826 7.02426 3.77574C6.91174 3.66321 6.75913 3.6 6.6 3.6C6.44087 3.6 6.28826 3.66321 6.17574 3.77574C6.06321 3.88826 6 4.04087 6 4.2V7.4C6.00042 7.47975 6.01674 7.55862 6.048 7.632C6.07656 7.70442 6.11971 7.7702 6.17475 7.82524C6.2298 7.88029 6.29558 7.92344 6.368 7.952ZM1.4 8.80005H3.8C4.17066 8.80215 4.52553 8.95032 4.78763 9.21242C5.04973 9.47452 5.1979 9.82939 5.2 10.2V12.6C5.1979 12.9707 5.04973 13.3256 4.78763 13.5877C4.52553 13.8498 4.17066 13.9979 3.8 14H1.4C1.02934 13.9979 0.674468 13.8498 0.412371 13.5877C0.150274 13.3256 0.00210008 12.9707 0 12.6V10.2C0.00210008 9.82939 0.150274 9.47452 0.412371 9.21242C0.674468 8.95032 1.02934 8.80215 1.4 8.80005ZM3.94142 12.7415C3.97893 12.704 4 12.6531 4 12.6V10.2C4 10.147 3.97893 10.0961 3.94142 10.0586C3.90391 10.0211 3.85304 10 3.8 10H1.4C1.34696 10 1.29609 10.0211 1.25858 10.0586C1.22107 10.0961 1.2 10.147 1.2 10.2V12.6C1.2 12.6531 1.22107 12.704 1.25858 12.7415C1.29609 12.779 1.34696 12.8 1.4 12.8H3.8C3.85304 12.8 3.90391 12.779 3.94142 12.7415Z", fill: "currentColor" }, null, -1)]), 16); } -dh.render = vh; +Sh.render = kh; // node_modules/primevue/focustrap/style/index.mjs -var yh = X.extend({ name: "focustrap-directive" }), bh = $.extend({ style: yh }); -function xh(e) { +var Ah = X.extend({ name: "focustrap-directive" }), jh = $.extend({ style: Ah }); +function Mh(e) { "@babel/helpers - typeof"; - return xh = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Mh = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, xh(e); + }, Mh(e); } -function Sh(e, t) { +function Nh(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -10135,40 +10268,40 @@ function Sh(e, t) { } return n; } -function Ch(e) { +function Ph(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? Sh(Object(n), !0).forEach(function(t) { - wh(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Sh(Object(n)).forEach(function(t) { + t % 2 ? Nh(Object(n), !0).forEach(function(t) { + Fh(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Nh(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function wh(e, t, n) { - return (t = Th(t)) in e ? Object.defineProperty(e, t, { +function Fh(e, t, n) { + return (t = Ih(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Th(e) { - var t = Eh(e, "string"); - return xh(t) == "symbol" ? t : t + ""; +function Ih(e) { + var t = Lh(e, "string"); + return Mh(t) == "symbol" ? t : t + ""; } -function Eh(e, t) { - if (xh(e) != "object" || !e) return e; +function Lh(e, t) { + if (Mh(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (xh(r) != "object") return r; + if (Mh(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var Dh = bh.extend("focustrap", { +var Rh = jh.extend("focustrap", { mounted: function(e, t) { (t.value || {}).disabled || (this.createHiddenFocusableElements(e, t), this.bind(e, t), this.autoElementFocus(e, t)), e.setAttribute("data-pd-focustrap", !0), this.$el = e; }, @@ -10188,10 +10321,10 @@ var Dh = bh.extend("focustrap", { t.forEach(function(t) { if (t.type === "childList" && !e.contains(document.activeElement)) { var r = function(t) { - var i = al(t) ? al(t, n.getComputedSelector(e.$_pfocustrap_focusableselector)) ? t : Yc(e, n.getComputedSelector(e.$_pfocustrap_focusableselector)) : Yc(t); - return G(i) ? i : t.nextSibling && r(t.nextSibling); + var i = hl(t) ? hl(t, n.getComputedSelector(e.$_pfocustrap_focusableselector)) ? t : al(e, n.getComputedSelector(e.$_pfocustrap_focusableselector)) : al(t); + return K(i) ? i : t.nextSibling && r(t.nextSibling); }; - q(r(t.nextSibling)); + J(r(t.nextSibling)); } }); }), e.$_pfocustrap_mutationobserver.disconnect(), e.$_pfocustrap_mutationobserver.observe(e, { childList: !0 }), e.$_pfocustrap_focusinlistener = function(e) { @@ -10204,23 +10337,23 @@ var Dh = bh.extend("focustrap", { e.$_pfocustrap_mutationobserver && e.$_pfocustrap_mutationobserver.disconnect(), e.$_pfocustrap_focusinlistener && e.removeEventListener("focusin", e.$_pfocustrap_focusinlistener) && (e.$_pfocustrap_focusinlistener = null), e.$_pfocustrap_focusoutlistener && e.removeEventListener("focusout", e.$_pfocustrap_focusoutlistener) && (e.$_pfocustrap_focusoutlistener = null); }, autoFocus: function(e) { - this.autoElementFocus(this.$el, { value: Ch(Ch({}, e), {}, { autoFocus: !0 }) }); + this.autoElementFocus(this.$el, { value: Ph(Ph({}, e), {}, { autoFocus: !0 }) }); }, autoElementFocus: function(e, t) { - var n = t.value || {}, r = n.autoFocusSelector, i = r === void 0 ? "" : r, a = n.firstFocusableSelector, o = a === void 0 ? "" : a, s = n.autoFocus, c = s !== void 0 && s, l = Yc(e, `[autofocus]${this.getComputedSelector(i)}`); - c && !l && (l = Yc(e, this.getComputedSelector(o))), q(l); + var n = t.value || {}, r = n.autoFocusSelector, i = r === void 0 ? "" : r, a = n.firstFocusableSelector, o = a === void 0 ? "" : a, s = n.autoFocus, c = s !== void 0 && s, l = al(e, `[autofocus]${this.getComputedSelector(i)}`); + c && !l && (l = al(e, this.getComputedSelector(o))), J(l); }, onFirstHiddenElementFocus: function(e) { var t, n = e.currentTarget, r = e.relatedTarget; - q(r === n.$_pfocustrap_lasthiddenfocusableelement || !((t = this.$el) != null && t.contains(r)) ? Yc(n.parentElement, this.getComputedSelector(n.$_pfocustrap_focusableselector)) : n.$_pfocustrap_lasthiddenfocusableelement); + J(r === n.$_pfocustrap_lasthiddenfocusableelement || !((t = this.$el) != null && t.contains(r)) ? al(n.parentElement, this.getComputedSelector(n.$_pfocustrap_focusableselector)) : n.$_pfocustrap_lasthiddenfocusableelement); }, onLastHiddenElementFocus: function(e) { var t, n = e.currentTarget, r = e.relatedTarget; - q(r === n.$_pfocustrap_firsthiddenfocusableelement || !((t = this.$el) != null && t.contains(r)) ? Zc(n.parentElement, this.getComputedSelector(n.$_pfocustrap_focusableselector)) : n.$_pfocustrap_firsthiddenfocusableelement); + J(r === n.$_pfocustrap_firsthiddenfocusableelement || !((t = this.$el) != null && t.contains(r)) ? sl(n.parentElement, this.getComputedSelector(n.$_pfocustrap_focusableselector)) : n.$_pfocustrap_firsthiddenfocusableelement); }, createHiddenFocusableElements: function(e, t) { var n = this, r = t.value || {}, i = r.tabIndex, a = i === void 0 ? 0 : i, o = r.firstFocusableSelector, s = o === void 0 ? "" : o, c = r.lastFocusableSelector, l = c === void 0 ? "" : c, u = function(e) { - return Wc("span", { + return el("span", { class: "p-hidden-accessible p-hidden-focusable", tabIndex: a, role: "presentation", @@ -10235,14 +10368,14 @@ var Dh = bh.extend("focustrap", { } }); // node_modules/primevue/utils/index.mjs -function Oh() { - Ec({ variableName: Il("scrollbar.width").name }); +function zh() { + Ic({ variableName: ql("scrollbar.width").name }); } -function kh() { - Oc({ variableName: Il("scrollbar.width").name }); +function Bh() { + Rc({ variableName: ql("scrollbar.width").name }); } // node_modules/primevue/dialog/style/index.mjs -var Ah = X.extend({ +var Vh = X.extend({ name: "dialog", style: "\n .p-dialog {\n max-height: 90%;\n transform: scale(1);\n border-radius: dt('dialog.border.radius');\n box-shadow: dt('dialog.shadow');\n background: dt('dialog.background');\n border: 1px solid dt('dialog.border.color');\n color: dt('dialog.color');\n will-change: transform;\n }\n\n .p-dialog-content {\n overflow-y: auto;\n padding: dt('dialog.content.padding');\n flex-grow: 1;\n }\n\n .p-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n padding: dt('dialog.header.padding');\n }\n\n .p-dialog-title {\n font-weight: dt('dialog.title.font.weight');\n font-size: dt('dialog.title.font.size');\n }\n\n .p-dialog-footer {\n flex-shrink: 0;\n padding: dt('dialog.footer.padding');\n display: flex;\n justify-content: flex-end;\n gap: dt('dialog.footer.gap');\n }\n\n .p-dialog-header-actions {\n display: flex;\n align-items: center;\n gap: dt('dialog.header.gap');\n }\n\n .p-dialog-top .p-dialog,\n .p-dialog-bottom .p-dialog,\n .p-dialog-left .p-dialog,\n .p-dialog-right .p-dialog,\n .p-dialog-topleft .p-dialog,\n .p-dialog-topright .p-dialog,\n .p-dialog-bottomleft .p-dialog,\n .p-dialog-bottomright .p-dialog {\n margin: 1rem;\n }\n\n .p-dialog-maximized {\n width: 100vw !important;\n height: 100vh !important;\n top: 0px !important;\n left: 0px !important;\n max-height: 100%;\n height: 100%;\n border-radius: 0;\n }\n\n .p-dialog .p-resizable-handle {\n position: absolute;\n font-size: 0.1px;\n display: block;\n cursor: se-resize;\n width: 12px;\n height: 12px;\n right: 1px;\n bottom: 1px;\n }\n\n .p-dialog-enter-active {\n animation: p-animate-dialog-enter 300ms cubic-bezier(.19,1,.22,1);\n }\n\n .p-dialog-leave-active {\n animation: p-animate-dialog-leave 300ms cubic-bezier(.19,1,.22,1);\n }\n\n @keyframes p-animate-dialog-enter {\n from {\n opacity: 0;\n transform: scale(0.93);\n }\n }\n\n @keyframes p-animate-dialog-leave {\n to {\n opacity: 0;\n transform: scale(0.93);\n }\n }\n", classes: { @@ -10298,11 +10431,11 @@ var Ah = X.extend({ pointerEvents: "auto" } } -}), jh = { +}), Hh = { name: "Dialog", extends: { name: "BaseDialog", - extends: nd, + extends: pd, props: { header: { type: null, @@ -10426,7 +10559,7 @@ var Ah = X.extend({ }, _instance: null }, - style: Ah, + style: Vh, provide: function() { return { $pcDialog: this, @@ -10447,7 +10580,7 @@ var Ah = X.extend({ ], provide: function() { var e = this; - return { dialogRef: ho(function() { + return { dialogRef: To(function() { return e._instance; }) }; }, @@ -10479,7 +10612,7 @@ var Ah = X.extend({ this.visible && (this.containerVisible = this.visible); }, beforeUnmount: function() { - this.unbindDocumentState(), this.unbindGlobalListeners(), this.destroyStyle(), this.mask && this.autoZIndex && fl.clear(this.mask), this.container = null, this.mask = null; + this.unbindDocumentState(), this.unbindGlobalListeners(), this.destroyStyle(), this.mask && this.autoZIndex && Sl.clear(this.mask), this.container = null, this.mask = null; }, mounted: function() { this.breakpoints && this.createStyle(); @@ -10489,19 +10622,19 @@ var Ah = X.extend({ this.$emit("update:visible", !1); }, onEnter: function() { - this.$emit("show"), this.target = document.activeElement, this.enableDocumentSettings(), this.bindGlobalListeners(), this.autoZIndex && fl.set("modal", this.mask, this.baseZIndex || this.$primevue.config.zIndex.modal); + this.$emit("show"), this.target = document.activeElement, this.enableDocumentSettings(), this.bindGlobalListeners(), this.autoZIndex && Sl.set("modal", this.mask, this.baseZIndex || this.$primevue.config.zIndex.modal); }, onAfterEnter: function() { this.focus(); }, onBeforeLeave: function() { - this.modal && !this.isUnstyled && wc(this.mask, "p-overlay-mask-leave-active"), this.dragging && this.documentDragEndListener && this.documentDragEndListener(); + this.modal && !this.isUnstyled && Pc(this.mask, "p-overlay-mask-leave-active"), this.dragging && this.documentDragEndListener && this.documentDragEndListener(); }, onLeave: function() { - this.$emit("hide"), q(this.target), this.target = null, this.focusableClose = null, this.focusableMax = null; + this.$emit("hide"), J(this.target), this.target = null, this.focusableClose = null, this.focusableMax = null; }, onAfterLeave: function() { - this.autoZIndex && fl.clear(this.mask), this.containerVisible = !1, this.unbindDocumentState(), this.unbindGlobalListeners(), this.$emit("after-hide"); + this.autoZIndex && Sl.clear(this.mask), this.containerVisible = !1, this.unbindDocumentState(), this.unbindGlobalListeners(), this.$emit("after-hide"); }, onMaskMouseDown: function(e) { this.maskMouseDownTarget = e.target; @@ -10513,16 +10646,16 @@ var Ah = X.extend({ var e = function(e) { return e && e.querySelector("[autofocus]"); }, t = this.$slots.footer && e(this.footerContainer); - t || (t = this.$slots.header && e(this.headerContainer), t || (t = this.$slots.default && e(this.content), t || (this.maximizable ? (this.focusableMax = !0, t = this.maximizableButton) : (this.focusableClose = !0, t = this.closeButton)))), t && q(t, { focusVisible: !0 }); + t || (t = this.$slots.header && e(this.headerContainer), t || (t = this.$slots.default && e(this.content), t || (this.maximizable ? (this.focusableMax = !0, t = this.maximizableButton) : (this.focusableClose = !0, t = this.closeButton)))), t && J(t, { focusVisible: !0 }); }, maximize: function(e) { - this.maximized ? (this.maximized = !1, this.$emit("unmaximize", e)) : (this.maximized = !0, this.$emit("maximize", e)), this.modal || (this.maximized ? Oh() : kh()); + this.maximized ? (this.maximized = !1, this.$emit("unmaximize", e)) : (this.maximized = !0, this.$emit("maximize", e)), this.modal || (this.maximized ? zh() : Bh()); }, enableDocumentSettings: function() { - (this.modal || !this.modal && this.blockScroll || this.maximizable && this.maximized) && Oh(); + (this.modal || !this.modal && this.blockScroll || this.maximizable && this.maximized) && zh(); }, unbindDocumentState: function() { - (this.modal || !this.modal && this.blockScroll || this.maximizable && this.maximized) && kh(); + (this.modal || !this.modal && this.blockScroll || this.maximizable && this.maximized) && Bh(); }, onKeyDown: function(e) { e.code === "Escape" && this.closeOnEscape && !e.isComposing && this.close(); @@ -10557,7 +10690,7 @@ var Ah = X.extend({ createStyle: function() { if (!this.styleElement && !this.isUnstyled) { var e; - this.styleElement = document.createElement("style"), this.styleElement.type = "text/css", cl(this.styleElement, "nonce", (e = this.$primevue) == null || (e = e.config) == null || (e = e.csp) == null ? void 0 : e.nonce), document.head.appendChild(this.styleElement); + this.styleElement = document.createElement("style"), this.styleElement.type = "text/css", vl(this.styleElement, "nonce", (e = this.$primevue) == null || (e = e.config) == null || (e = e.csp) == null ? void 0 : e.nonce), document.head.appendChild(this.styleElement); var t = ""; for (var n in this.breakpoints) t += ` @media screen and (max-width: ${n}) { @@ -10573,7 +10706,7 @@ var Ah = X.extend({ this.styleElement &&= (document.head.removeChild(this.styleElement), null); }, initDrag: function(e) { - e.target.closest("div").getAttribute("data-pc-section") !== "headeractions" && this.draggable && (this.dragging = !0, this.lastPageX = e.pageX, this.lastPageY = e.pageY, this.container.style.margin = "0", document.body.setAttribute("data-p-unselectable-text", "true"), !this.isUnstyled && Lc(document.body, { "user-select": "none" }), this.$emit("dragstart", e)); + e.target.closest("div").getAttribute("data-pc-section") !== "headeractions" && this.draggable && (this.dragging = !0, this.lastPageX = e.pageX, this.lastPageY = e.pageY, this.container.style.margin = "0", document.body.setAttribute("data-p-unselectable-text", "true"), !this.isUnstyled && qc(document.body, { "user-select": "none" }), this.$emit("dragstart", e)); }, bindGlobalListeners: function() { this.draggable && (this.bindDocumentDragListener(), this.bindDocumentDragEndListener()), this.closeOnEscape && this.bindDocumentKeyDownListener(); @@ -10585,7 +10718,7 @@ var Ah = X.extend({ var e = this; this.documentDragListener = function(t) { if (e.dragging) { - var n = Rc(e.container), r = $c(e.container), i = t.pageX - e.lastPageX, a = t.pageY - e.lastPageY, o = e.container.getBoundingClientRect(), s = o.left + i, c = o.top + a, l = jc(), u = getComputedStyle(e.container), d = parseFloat(u.marginLeft), f = parseFloat(u.marginTop); + var n = Jc(e.container), r = ll(e.container), i = t.pageX - e.lastPageX, a = t.pageY - e.lastPageY, o = e.container.getBoundingClientRect(), s = o.left + i, c = o.top + a, l = Vc(), u = getComputedStyle(e.container), d = parseFloat(u.marginLeft), f = parseFloat(u.marginTop); e.container.style.position = "fixed", e.keepInViewport ? (s >= e.minX && s + n < l.width && (e.lastPageX = t.pageX, e.container.style.left = s - d + "px"), c >= e.minY && c + r < l.height && (e.lastPageY = t.pageY, e.container.style.top = c - f + "px")) : (e.lastPageX = t.pageX, e.container.style.left = s - d + "px", e.lastPageY = t.pageY, e.container.style.top = c - f + "px"); } }, window.document.addEventListener("mousemove", this.documentDragListener); @@ -10614,33 +10747,33 @@ var Ah = X.extend({ return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.close : void 0; }, dataP: function() { - return K({ + return q({ maximized: this.maximized, modal: this.modal }); } }, directives: { - ripple: Zd, - focustrap: Dh + ripple: lf, + focustrap: Rh }, components: { - Button: uf, - Portal: nm, - WindowMinimizeIcon: dh, - WindowMaximizeIcon: rh, - TimesIcon: Up + Button: xf, + Portal: pm, + WindowMinimizeIcon: Sh, + WindowMaximizeIcon: mh, + TimesIcon: em } }; -function Mh(e) { +function Uh(e) { "@babel/helpers - typeof"; - return Mh = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Uh = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, Mh(e); + }, Uh(e); } -function Nh(e, t) { +function Wh(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -10650,49 +10783,49 @@ function Nh(e, t) { } return n; } -function Ph(e) { +function Gh(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? Nh(Object(n), !0).forEach(function(t) { - Fh(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Nh(Object(n)).forEach(function(t) { + t % 2 ? Wh(Object(n), !0).forEach(function(t) { + Kh(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Wh(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function Fh(e, t, n) { - return (t = Ih(t)) in e ? Object.defineProperty(e, t, { +function Kh(e, t, n) { + return (t = qh(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Ih(e) { - var t = Lh(e, "string"); - return Mh(t) == "symbol" ? t : t + ""; +function qh(e) { + var t = Jh(e, "string"); + return Uh(t) == "symbol" ? t : t + ""; } -function Lh(e, t) { - if (Mh(e) != "object" || !e) return e; +function Jh(e, t) { + if (Uh(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (Mh(r) != "object") return r; + if (Uh(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var Rh = ["data-p"], zh = [ +var Yh = ["data-p"], Xh = [ "aria-labelledby", "aria-modal", "data-p" -], Bh = ["id"], Vh = ["data-p"]; -function Hh(e, t, n, r, i, a) { - var o = F("Button"), s = F("Portal"), c = ci("focustrap"); - return R(), B(s, { appendTo: e.appendTo }, { +], Zh = ["id"], Qh = ["data-p"]; +function $h(e, t, n, r, i, a) { + var o = F("Button"), s = F("Portal"), c = mi("focustrap"); + return z(), V(s, { appendTo: e.appendTo }, { default: P(function() { - return [i.containerVisible ? (R(), z("div", W({ + return [i.containerVisible ? (z(), B("div", G({ key: 0, ref: a.maskRef, class: e.cx("mask"), @@ -10707,7 +10840,7 @@ function Hh(e, t, n, r, i, a) { return a.onMaskMouseUp && a.onMaskMouseUp.apply(a, arguments); }, "data-p": a.dataP - }, e.ptm("mask")), [H(jo, W({ + }, e.ptm("mask")), [U(Vo, G({ name: "p-dialog", onEnter: a.onEnter, onAfterEnter: a.onAfterEnter, @@ -10717,7 +10850,7 @@ function Hh(e, t, n, r, i, a) { appear: "" }, e.ptm("transition")), { default: P(function() { - return [e.visible ? Hn((R(), z("div", W({ + return [e.visible ? qn((z(), B("div", G({ key: 0, ref: a.containerRef, class: e.cx("root"), @@ -10733,28 +10866,28 @@ function Hh(e, t, n, r, i, a) { return a.maximize(e); }, initDragCallback: a.initDrag - }) : (R(), z(L, { key: 1 }, [ - e.showHeader ? (R(), z("div", W({ + }) : (z(), B(L, { key: 1 }, [ + e.showHeader ? (z(), B("div", G({ key: 0, ref: a.headerContainerRef, class: e.cx("header"), onMousedown: t[0] ||= function() { return a.initDrag && a.initDrag.apply(a, arguments); } - }, e.ptm("header")), [I(e.$slots, "header", { class: D(e.cx("title")) }, function() { - return [e.header ? (R(), z("span", W({ + }, e.ptm("header")), [I(e.$slots, "header", { class: O(e.cx("title")) }, function() { + return [e.header ? (z(), B("span", G({ key: 0, id: a.ariaLabelledById, class: e.cx("title") - }, e.ptm("title")), O(e.header), 17, Bh)) : U("", !0)]; - }), V("div", W({ class: e.cx("headerActions") }, e.ptm("headerActions")), [e.maximizable ? I(e.$slots, "maximizebutton", { + }, e.ptm("title")), k(e.header), 17, Zh)) : W("", !0)]; + }), H("div", G({ class: e.cx("headerActions") }, e.ptm("headerActions")), [e.maximizable ? I(e.$slots, "maximizebutton", { key: 0, maximized: i.maximized, maximizeCallback: function(e) { return a.maximize(e); } }, function() { - return [H(o, W({ + return [U(o, G({ ref: a.maximizableRef, autofocus: i.focusableMax, class: e.cx("pcMaximizeButton"), @@ -10767,7 +10900,7 @@ function Hh(e, t, n, r, i, a) { }), { icon: P(function(t) { return [I(e.$slots, "maximizeicon", { maximized: i.maximized }, function() { - return [(R(), B(si(a.maximizeIconComponent), W({ class: [t.class, i.maximized ? e.minimizeIcon : e.maximizeIcon] }, e.ptm("pcMaximizeButton").icon), null, 16, ["class"]))]; + return [(z(), V(pi(a.maximizeIconComponent), G({ class: [t.class, i.maximized ? e.minimizeIcon : e.maximizeIcon] }, e.ptm("pcMaximizeButton").icon), null, 16, ["class"]))]; })]; }), _: 3 @@ -10779,11 +10912,11 @@ function Hh(e, t, n, r, i, a) { "unstyled", "pt" ])]; - }) : U("", !0), e.closable ? I(e.$slots, "closebutton", { + }) : W("", !0), e.closable ? I(e.$slots, "closebutton", { key: 1, closeCallback: a.close }, function() { - return [H(o, W({ + return [U(o, G({ ref: a.closeButtonRef, autofocus: i.focusableClose, class: e.cx("pcCloseButton"), @@ -10796,7 +10929,7 @@ function Hh(e, t, n, r, i, a) { }), { icon: P(function(t) { return [I(e.$slots, "closeicon", {}, function() { - return [(R(), B(si(e.closeIcon ? "span" : "TimesIcon"), W({ class: [e.closeIcon, t.class] }, e.ptm("pcCloseButton").icon), null, 16, ["class"]))]; + return [(z(), V(pi(e.closeIcon ? "span" : "TimesIcon"), G({ class: [e.closeIcon, t.class] }, e.ptm("pcCloseButton").icon), null, 16, ["class"]))]; })]; }), _: 3 @@ -10808,21 +10941,21 @@ function Hh(e, t, n, r, i, a) { "unstyled", "pt" ])]; - }) : U("", !0)], 16)], 16)) : U("", !0), - V("div", W({ + }) : W("", !0)], 16)], 16)) : W("", !0), + H("div", G({ ref: a.contentRef, class: [e.cx("content"), e.contentClass], style: e.contentStyle, "data-p": a.dataP - }, Ph(Ph({}, e.contentProps), e.ptm("content"))), [I(e.$slots, "default")], 16, Vh), - e.footer || e.$slots.footer ? (R(), z("div", W({ + }, Gh(Gh({}, e.contentProps), e.ptm("content"))), [I(e.$slots, "default")], 16, Qh), + e.footer || e.$slots.footer ? (z(), B("div", G({ key: 1, ref: a.footerContainerRef, class: e.cx("footer") }, e.ptm("footer")), [I(e.$slots, "footer", {}, function() { - return [Ua(O(e.footer), 1)]; - })], 16)) : U("", !0) - ], 64))], 16, zh)), [[c, { disabled: !e.modal }]]) : U("", !0)]; + return [Za(k(e.footer), 1)]; + })], 16)) : W("", !0) + ], 64))], 16, Xh)), [[c, { disabled: !e.modal }]]) : W("", !0)]; }), _: 3 }, 16, [ @@ -10831,14 +10964,14 @@ function Hh(e, t, n, r, i, a) { "onBeforeLeave", "onLeave", "onAfterLeave" - ])], 16, Rh)) : U("", !0)]; + ])], 16, Yh)) : W("", !0)]; }), _: 3 }, 8, ["appendTo"]); } -jh.render = Hh; +Hh.render = $h; // node_modules/primevue/menu/style/index.mjs -var Uh = X.extend({ +var eg = X.extend({ name: "menu", style: "\n .p-menu {\n background: dt('menu.background');\n color: dt('menu.color');\n border: 1px solid dt('menu.border.color');\n border-radius: dt('menu.border.radius');\n min-width: 12.5rem;\n }\n\n .p-menu-list {\n margin: 0;\n padding: dt('menu.list.padding');\n outline: 0 none;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: dt('menu.list.gap');\n }\n\n .p-menu-item-content {\n transition:\n background dt('menu.transition.duration'),\n color dt('menu.transition.duration');\n border-radius: dt('menu.item.border.radius');\n color: dt('menu.item.color');\n overflow: hidden;\n }\n\n .p-menu-item-link {\n cursor: pointer;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n position: relative;\n color: inherit;\n padding: dt('menu.item.padding');\n gap: dt('menu.item.gap');\n user-select: none;\n outline: 0 none;\n }\n\n .p-menu-item-label {\n line-height: 1;\n }\n\n .p-menu-item-icon {\n color: dt('menu.item.icon.color');\n }\n\n .p-menu-item.p-focus .p-menu-item-content {\n color: dt('menu.item.focus.color');\n background: dt('menu.item.focus.background');\n }\n\n .p-menu-item.p-focus .p-menu-item-icon {\n color: dt('menu.item.icon.focus.color');\n }\n\n .p-menu-item:not(.p-disabled) .p-menu-item-content:hover {\n color: dt('menu.item.focus.color');\n background: dt('menu.item.focus.background');\n }\n\n .p-menu-item:not(.p-disabled) .p-menu-item-content:hover .p-menu-item-icon {\n color: dt('menu.item.icon.focus.color');\n }\n\n .p-menu-overlay {\n box-shadow: dt('menu.shadow');\n }\n\n .p-menu-submenu-label {\n background: dt('menu.submenu.label.background');\n padding: dt('menu.submenu.label.padding');\n color: dt('menu.submenu.label.color');\n font-weight: dt('menu.submenu.label.font.weight');\n }\n\n .p-menu-separator {\n border-block-start: 1px solid dt('menu.separator.border.color');\n }\n", classes: { @@ -10862,9 +10995,9 @@ var Uh = X.extend({ itemIcon: "p-menu-item-icon", itemLabel: "p-menu-item-label" } -}), Wh = { +}), tg = { name: "BaseMenu", - extends: nd, + extends: pd, props: { popup: { type: Boolean, @@ -10899,17 +11032,17 @@ var Uh = X.extend({ default: null } }, - style: Uh, + style: eg, provide: function() { return { $pcMenu: this, $parentInstance: this }; } -}, Gh = { +}, ng = { name: "Menuitem", hostName: "Menu", - extends: nd, + extends: pd, inheritAttrs: !1, emits: ["item-click", "item-mousemove"], props: { @@ -10921,7 +11054,7 @@ var Uh = X.extend({ }, methods: { getItemProp: function(e, t) { - return e && e.item ? lc(e.item[t]) : void 0; + return e && e.item ? yc(e.item[t]) : void 0; }, getPTOptions: function(e) { return this.ptm(e, { context: { @@ -10963,33 +11096,33 @@ var Uh = X.extend({ }, getMenuItemProps: function(e) { return { - action: W({ + action: G({ class: this.cx("itemLink"), tabindex: "-1" }, this.getPTOptions("itemLink")), - icon: W({ class: [this.cx("itemIcon"), e.icon] }, this.getPTOptions("itemIcon")), - label: W({ class: this.cx("itemLabel") }, this.getPTOptions("itemLabel")) + icon: G({ class: [this.cx("itemIcon"), e.icon] }, this.getPTOptions("itemIcon")), + label: G({ class: this.cx("itemLabel") }, this.getPTOptions("itemLabel")) }; } }, computed: { dataP: function() { - return K({ + return q({ focus: this.isItemFocused(), disabled: this.disabled() }); } }, - directives: { ripple: Zd } -}, Kh = [ + directives: { ripple: lf } +}, rg = [ "id", "aria-label", "aria-disabled", "data-p-focused", "data-p-disabled", "data-p" -], qh = ["data-p"], Jh = ["href", "target"], Yh = ["data-p"], Xh = ["data-p"]; -function Zh(e, t, n, r, i, a) { - var o = ci("ripple"); - return a.visible() ? (R(), z("li", W({ +], ig = ["data-p"], ag = ["href", "target"], og = ["data-p"], sg = ["data-p"]; +function cg(e, t, n, r, i, a) { + var o = mi("ripple"); + return a.visible() ? (z(), B("li", G({ key: 0, id: n.id, class: [e.cx("item"), n.item.class], @@ -11000,7 +11133,7 @@ function Zh(e, t, n, r, i, a) { "data-p-focused": a.isItemFocused(), "data-p-disabled": a.disabled() || !1, "data-p": a.dataP - }, a.getPTOptions("item")), [V("div", W({ + }, a.getPTOptions("item")), [H("div", G({ class: e.cx("itemContent"), onClick: t[0] ||= function(e) { return a.onItemClick(e); @@ -11009,7 +11142,7 @@ function Zh(e, t, n, r, i, a) { return a.onItemMouseMove(e); }, "data-p": a.dataP - }, a.getPTOptions("itemContent")), [n.templates.item ? n.templates.item ? (R(), B(si(n.templates.item), { + }, a.getPTOptions("itemContent")), [n.templates.item ? n.templates.item ? (z(), V(pi(n.templates.item), { key: 1, item: n.item, label: a.label(), @@ -11018,53 +11151,53 @@ function Zh(e, t, n, r, i, a) { "item", "label", "props" - ])) : U("", !0) : Hn((R(), z("a", W({ + ])) : W("", !0) : qn((z(), B("a", G({ key: 0, href: n.item.url, class: e.cx("itemLink"), target: n.item.target, tabindex: "-1" - }, a.getPTOptions("itemLink")), [n.templates.itemicon ? (R(), B(si(n.templates.itemicon), { + }, a.getPTOptions("itemLink")), [n.templates.itemicon ? (z(), V(pi(n.templates.itemicon), { key: 0, item: n.item, - class: D(e.cx("itemIcon")) - }, null, 8, ["item", "class"])) : n.item.icon ? (R(), z("span", W({ + class: O(e.cx("itemIcon")) + }, null, 8, ["item", "class"])) : n.item.icon ? (z(), B("span", G({ key: 1, class: [e.cx("itemIcon"), n.item.icon], "data-p": a.dataP - }, a.getPTOptions("itemIcon")), null, 16, Yh)) : U("", !0), V("span", W({ + }, a.getPTOptions("itemIcon")), null, 16, og)) : W("", !0), H("span", G({ class: e.cx("itemLabel"), "data-p": a.dataP - }, a.getPTOptions("itemLabel")), O(a.label()), 17, Xh)], 16, Jh)), [[o]])], 16, qh)], 16, Kh)) : U("", !0); + }, a.getPTOptions("itemLabel")), k(a.label()), 17, sg)], 16, ag)), [[o]])], 16, ig)], 16, rg)) : W("", !0); } -Gh.render = Zh; -function Qh(e) { - return ng(e) || tg(e) || eg(e) || $h(); +ng.render = cg; +function lg(e) { + return pg(e) || fg(e) || dg(e) || ug(); } -function $h() { +function ug() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function eg(e, t) { +function dg(e, t) { if (e) { - if (typeof e == "string") return rg(e, t); + if (typeof e == "string") return mg(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? rg(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? mg(e, t) : void 0; } } -function tg(e) { +function fg(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function ng(e) { - if (Array.isArray(e)) return rg(e); +function pg(e) { + if (Array.isArray(e)) return mg(e); } -function rg(e, t) { +function mg(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -var ig = { +var hg = { name: "Menu", - extends: Wh, + extends: tg, inheritAttrs: !1, emits: [ "show", @@ -11090,7 +11223,7 @@ var ig = { this.popup || (this.bindResizeListener(), this.bindOutsideClickListener()); }, beforeUnmount: function() { - this.unbindResizeListener(), this.unbindOutsideClickListener(), this.scrollHandler &&= (this.scrollHandler.destroy(), null), this.target = null, this.container && this.autoZIndex && fl.clear(this.container), this.container = null; + this.unbindResizeListener(), this.unbindOutsideClickListener(), this.scrollHandler &&= (this.scrollHandler.destroy(), null), this.target = null, this.container && this.autoZIndex && Sl.clear(this.container), this.container = null; }, methods: { itemClick: function(e) { @@ -11127,7 +11260,7 @@ var ig = { case "Space": this.onSpaceKey(e); break; - case "Escape": this.popup && (q(this.target), this.hide()); + case "Escape": this.popup && (J(this.target), this.hide()); case "Tab": this.overlayVisible && this.hide(); } }, @@ -11136,7 +11269,7 @@ var ig = { this.changeFocusedOptionIndex(t), e.preventDefault(); }, onArrowUpKey: function(e) { - if (e.altKey && this.popup) q(this.target), this.hide(), e.preventDefault(); + if (e.altKey && this.popup) J(this.target), this.hide(), e.preventDefault(); else { var t = this.findPrevOptionIndex(this.focusedOptionIndex); this.changeFocusedOptionIndex(t), e.preventDefault(); @@ -11146,29 +11279,29 @@ var ig = { this.changeFocusedOptionIndex(0), e.preventDefault(); }, onEndKey: function(e) { - this.changeFocusedOptionIndex(Gc(this.container, "li[data-pc-section=\"item\"][data-p-disabled=\"false\"]").length - 1), e.preventDefault(); + this.changeFocusedOptionIndex(tl(this.container, "li[data-pc-section=\"item\"][data-p-disabled=\"false\"]").length - 1), e.preventDefault(); }, onEnterKey: function(e) { - var t = Kc(this.list, `li[id="${`${this.focusedOptionIndex}`}"]`), n = t && Kc(t, "a[data-pc-section=\"itemlink\"]"); - this.popup && q(this.target), n ? n.click() : t && t.click(), e.preventDefault(); + var t = nl(this.list, `li[id="${`${this.focusedOptionIndex}`}"]`), n = t && nl(t, "a[data-pc-section=\"itemlink\"]"); + this.popup && J(this.target), n ? n.click() : t && t.click(), e.preventDefault(); }, onSpaceKey: function(e) { this.onEnterKey(e); }, findNextOptionIndex: function(e) { - var t = Qh(Gc(this.container, "li[data-pc-section=\"item\"][data-p-disabled=\"false\"]")).findIndex(function(t) { + var t = lg(tl(this.container, "li[data-pc-section=\"item\"][data-p-disabled=\"false\"]")).findIndex(function(t) { return t.id === e; }); return t > -1 ? t + 1 : 0; }, findPrevOptionIndex: function(e) { - var t = Qh(Gc(this.container, "li[data-pc-section=\"item\"][data-p-disabled=\"false\"]")).findIndex(function(t) { + var t = lg(tl(this.container, "li[data-pc-section=\"item\"][data-p-disabled=\"false\"]")).findIndex(function(t) { return t.id === e; }); return t > -1 ? t - 1 : 0; }, changeFocusedOptionIndex: function(e) { - var t = Gc(this.container, "li[data-pc-section=\"item\"][data-p-disabled=\"false\"]"), n = e >= t.length ? t.length - 1 : e < 0 ? 0 : e; + var t = tl(this.container, "li[data-pc-section=\"item\"][data-p-disabled=\"false\"]"), n = e >= t.length ? t.length - 1 : e < 0 ? 0 : e; n > -1 && (this.focusedOptionIndex = t[n].getAttribute("id")); }, toggle: function(e, t) { @@ -11181,19 +11314,19 @@ var ig = { this.overlayVisible = !1, this.target = null; }, onEnter: function(e) { - Lc(e, { + qc(e, { position: "absolute", top: "0" - }), this.alignOverlay(), this.bindOutsideClickListener(), this.bindResizeListener(), this.bindScrollListener(), this.autoZIndex && fl.set("menu", e, this.baseZIndex || this.$primevue.config.zIndex.menu), this.popup && q(this.list), this.$emit("show"); + }), this.alignOverlay(), this.bindOutsideClickListener(), this.bindResizeListener(), this.bindScrollListener(), this.autoZIndex && Sl.set("menu", e, this.baseZIndex || this.$primevue.config.zIndex.menu), this.popup && J(this.list), this.$emit("show"); }, onLeave: function() { this.unbindOutsideClickListener(), this.unbindResizeListener(), this.unbindScrollListener(), this.$emit("hide"); }, onAfterLeave: function(e) { - this.autoZIndex && fl.clear(e); + this.autoZIndex && Sl.clear(e); }, alignOverlay: function() { - Ic(this.container, this.target), Rc(this.target) > Rc(this.container) && (this.container.style.minWidth = Rc(this.target) + "px"); + Kc(this.container, this.target), Jc(this.target) > Jc(this.container) && (this.container.style.minWidth = Jc(this.target) + "px"); }, bindOutsideClickListener: function() { var e = this; @@ -11207,7 +11340,7 @@ var ig = { }, bindScrollListener: function() { var e = this; - this.scrollHandler ||= new vp(this.target, function() { + this.scrollHandler ||= new kp(this.target, function() { e.overlayVisible && e.hide(); }), this.scrollHandler.bindScrollListener(); }, @@ -11217,7 +11350,7 @@ var ig = { bindResizeListener: function() { var e = this; this.resizeListener || (this.resizeListener = function() { - e.overlayVisible && !sl() && e.hide(); + e.overlayVisible && !_l() && e.hide(); }, window.addEventListener("resize", this.resizeListener)); }, unbindResizeListener: function() { @@ -11233,7 +11366,7 @@ var ig = { return typeof e.label == "function" ? e.label() : e.label; }, onOverlayClick: function(e) { - tm.emit("overlay-click", { + fm.emit("overlay-click", { originalEvent: e, target: this.target }); @@ -11250,35 +11383,35 @@ var ig = { return this.focusedOptionIndex === -1 ? null : this.focusedOptionIndex; }, dataP: function() { - return K({ popup: this.popup }); + return q({ popup: this.popup }); } }, components: { - PVMenuitem: Gh, - Portal: nm + PVMenuitem: ng, + Portal: pm } -}, ag = ["id", "data-p"], og = [ +}, gg = ["id", "data-p"], _g = [ "id", "tabindex", "aria-activedescendant", "aria-label", "aria-labelledby" -], sg = ["id"]; -function cg(e, t, n, r, i, a) { +], vg = ["id"]; +function yg(e, t, n, r, i, a) { var o = F("PVMenuitem"), s = F("Portal"); - return R(), B(s, { + return z(), V(s, { appendTo: e.appendTo, disabled: !e.popup }, { default: P(function() { - return [H(jo, W({ + return [U(Vo, G({ name: "p-anchored-overlay", onEnter: a.onEnter, onLeave: a.onLeave, onAfterLeave: a.onAfterLeave }, e.ptm("transition")), { default: P(function() { - return [!e.popup || i.overlayVisible ? (R(), z("div", W({ + return [!e.popup || i.overlayVisible ? (z(), B("div", G({ key: 0, ref: a.containerRef, id: e.$id, @@ -11288,11 +11421,11 @@ function cg(e, t, n, r, i, a) { }, "data-p": a.dataP }, e.ptmi("root")), [ - e.$slots.start ? (R(), z("div", W({ + e.$slots.start ? (z(), B("div", G({ key: 0, class: e.cx("start") - }, e.ptm("start")), [I(e.$slots, "start")], 16)) : U("", !0), - V("ul", W({ + }, e.ptm("start")), [I(e.$slots, "start")], 16)) : W("", !0), + H("ul", G({ ref: a.listRef, id: e.$id + "_list", class: e.cx("list"), @@ -11310,16 +11443,16 @@ function cg(e, t, n, r, i, a) { onKeydown: t[2] ||= function() { return a.onListKeyDown && a.onListKeyDown.apply(a, arguments); } - }, e.ptm("list")), [(R(!0), z(L, null, di(e.model, function(t, n) { - return R(), z(L, { key: a.label(t) + n.toString() }, [t.items && a.visible(t) && !t.separator ? (R(), z(L, { key: 0 }, [t.items ? (R(), z("li", W({ + }, e.ptm("list")), [(z(!0), B(L, null, _i(e.model, function(t, n) { + return z(), B(L, { key: a.label(t) + n.toString() }, [t.items && a.visible(t) && !t.separator ? (z(), B(L, { key: 0 }, [t.items ? (z(), B("li", G({ key: 0, id: e.$id + "_" + n, class: [e.cx("submenuLabel"), t.class], role: "none" }, { ref_for: !0 }, e.ptm("submenuLabel")), [I(e.$slots, e.$slots.submenulabel ? "submenulabel" : "submenuheader", { item: t }, function() { - return [Ua(O(a.label(t)), 1)]; - })], 16, sg)) : U("", !0), (R(!0), z(L, null, di(t.items, function(r, i) { - return R(), z(L, { key: r.label + n + "_" + i }, [a.visible(r) && !r.separator ? (R(), B(o, { + return [Za(k(a.label(t)), 1)]; + })], 16, vg)) : W("", !0), (z(!0), B(L, null, _i(t.items, function(r, i) { + return z(), B(L, { key: r.label + n + "_" + i }, [a.visible(r) && !r.separator ? (z(), V(o, { key: 0, id: e.$id + "_" + n + "_" + i, item: r, @@ -11338,18 +11471,18 @@ function cg(e, t, n, r, i, a) { "onItemClick", "onItemMousemove", "pt" - ])) : a.visible(r) && r.separator ? (R(), z("li", W({ + ])) : a.visible(r) && r.separator ? (z(), B("li", G({ key: "separator" + n + i, class: [e.cx("separator"), t.class], style: r.style, role: "separator" - }, { ref_for: !0 }, e.ptm("separator")), null, 16)) : U("", !0)], 64); - }), 128))], 64)) : a.visible(t) && t.separator ? (R(), z("li", W({ + }, { ref_for: !0 }, e.ptm("separator")), null, 16)) : W("", !0)], 64); + }), 128))], 64)) : a.visible(t) && t.separator ? (z(), B("li", G({ key: "separator" + n.toString(), class: [e.cx("separator"), t.class], style: t.style, role: "separator" - }, { ref_for: !0 }, e.ptm("separator")), null, 16)) : (R(), B(o, { + }, { ref_for: !0 }, e.ptm("separator")), null, 16)) : (z(), V(o, { key: a.label(t) + n.toString(), id: e.$id + "_" + n, item: t, @@ -11371,12 +11504,12 @@ function cg(e, t, n, r, i, a) { "onItemMousemove", "pt" ]))], 64); - }), 128))], 16, og), - e.$slots.end ? (R(), z("div", W({ + }), 128))], 16, _g), + e.$slots.end ? (z(), B("div", G({ key: 1, class: e.cx("end") - }, e.ptm("end")), [I(e.$slots, "end")], 16)) : U("", !0) - ], 16, ag)) : U("", !0)]; + }, e.ptm("end")), [I(e.$slots, "end")], 16)) : W("", !0) + ], 16, gg)) : W("", !0)]; }), _: 3 }, 16, [ @@ -11388,9 +11521,9 @@ function cg(e, t, n, r, i, a) { _: 3 }, 8, ["appendTo", "disabled"]); } -ig.render = cg; +hg.render = yg; // node_modules/primevue/listbox/style/index.mjs -var lg = X.extend({ +var bg = X.extend({ name: "listbox", style: "\n .p-listbox {\n display: block;\n background: dt('listbox.background');\n color: dt('listbox.color');\n border: 1px solid dt('listbox.border.color');\n border-radius: dt('listbox.border.radius');\n transition:\n background dt('listbox.transition.duration'),\n color dt('listbox.transition.duration'),\n border-color dt('listbox.transition.duration'),\n box-shadow dt('listbox.transition.duration'),\n outline-color dt('listbox.transition.duration');\n outline-color: transparent;\n box-shadow: dt('listbox.shadow');\n }\n\n .p-listbox.p-disabled {\n opacity: 1;\n background: dt('listbox.disabled.background');\n color: dt('listbox.disabled.color');\n }\n\n .p-listbox.p-disabled .p-listbox-option {\n color: dt('listbox.disabled.color');\n }\n\n .p-listbox.p-invalid {\n border-color: dt('listbox.invalid.border.color');\n }\n\n .p-listbox-header {\n padding: dt('listbox.list.header.padding');\n }\n\n .p-listbox-filter {\n width: 100%;\n }\n\n .p-listbox-list-container {\n overflow: auto;\n }\n\n .p-listbox-list {\n list-style-type: none;\n margin: 0;\n padding: dt('listbox.list.padding');\n outline: 0 none;\n display: flex;\n flex-direction: column;\n gap: dt('listbox.list.gap');\n }\n\n .p-listbox-option {\n display: flex;\n align-items: center;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n padding: dt('listbox.option.padding');\n border: 0 none;\n border-radius: dt('listbox.option.border.radius');\n color: dt('listbox.option.color');\n transition:\n background dt('listbox.transition.duration'),\n color dt('listbox.transition.duration'),\n border-color dt('listbox.transition.duration'),\n box-shadow dt('listbox.transition.duration'),\n outline-color dt('listbox.transition.duration');\n }\n\n .p-listbox-striped li:nth-child(even of .p-listbox-option) {\n background: dt('listbox.option.striped.background');\n }\n\n .p-listbox .p-listbox-list .p-listbox-option.p-listbox-option-selected {\n background: dt('listbox.option.selected.background');\n color: dt('listbox.option.selected.color');\n }\n\n .p-listbox:not(.p-disabled) .p-listbox-option.p-listbox-option-selected.p-focus {\n background: dt('listbox.option.selected.focus.background');\n color: dt('listbox.option.selected.focus.color');\n }\n\n .p-listbox:not(.p-disabled) .p-listbox-option:not(.p-listbox-option-selected):not(.p-disabled).p-focus {\n background: dt('listbox.option.focus.background');\n color: dt('listbox.option.focus.color');\n }\n\n .p-listbox:not(.p-disabled) .p-listbox-option:not(.p-listbox-option-selected):not(.p-disabled):hover {\n background: dt('listbox.option.focus.background');\n color: dt('listbox.option.focus.color');\n }\n\n .p-listbox-option-blank-icon {\n flex-shrink: 0;\n }\n\n .p-listbox-option-check-icon {\n position: relative;\n flex-shrink: 0;\n margin-inline-start: dt('listbox.checkmark.gutter.start');\n margin-inline-end: dt('listbox.checkmark.gutter.end');\n color: dt('listbox.checkmark.color');\n }\n\n .p-listbox-option-group {\n margin: 0;\n padding: dt('listbox.option.group.padding');\n color: dt('listbox.option.group.color');\n background: dt('listbox.option.group.background');\n font-weight: dt('listbox.option.group.font.weight');\n }\n\n .p-listbox-empty-message {\n padding: dt('listbox.empty.message.padding');\n }\n\n .p-listbox-fluid {\n width: 100%;\n }\n", classes: { @@ -11420,9 +11553,9 @@ var lg = X.extend({ optionBlankIcon: "p-listbox-option-blank-icon", emptyMessage: "p-listbox-empty-message" } -}), ug = { +}), xg = { name: "BaseListbox", - extends: Af, + extends: Vf, props: { options: Array, optionLabel: null, @@ -11524,7 +11657,7 @@ var lg = X.extend({ default: null } }, - style: lg, + style: bg, provide: function() { return { $pcListbox: this, @@ -11532,33 +11665,33 @@ var lg = X.extend({ }; } }; -function dg(e) { - return hg(e) || mg(e) || pg(e) || fg(); +function Sg(e) { + return Eg(e) || Tg(e) || wg(e) || Cg(); } -function fg() { +function Cg() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function pg(e, t) { +function wg(e, t) { if (e) { - if (typeof e == "string") return gg(e, t); + if (typeof e == "string") return Dg(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? gg(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Dg(e, t) : void 0; } } -function mg(e) { +function Tg(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function hg(e) { - if (Array.isArray(e)) return gg(e); +function Eg(e) { + if (Array.isArray(e)) return Dg(e); } -function gg(e, t) { +function Dg(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -var _g = { +var Og = { name: "Listbox", - extends: ug, + extends: xg, inheritAttrs: !1, emits: [ "change", @@ -11592,13 +11725,13 @@ var _g = { return this.virtualScrollerDisabled ? e : t && t(e).index; }, getOptionLabel: function(e) { - return this.optionLabel ? nc(e, this.optionLabel) : typeof e == "string" || typeof e == "number" || typeof e == "boolean" ? e : null; + return this.optionLabel ? fc(e, this.optionLabel) : typeof e == "string" || typeof e == "number" || typeof e == "boolean" ? e : null; }, getOptionValue: function(e) { - return this.optionValue ? nc(e, this.optionValue) : e; + return this.optionValue ? fc(e, this.optionValue) : e; }, getOptionRenderKey: function(e, t) { - return (this.dataKey ? nc(e, this.dataKey) : this.getOptionLabel(e)) + "_" + t; + return (this.dataKey ? fc(e, this.dataKey) : this.getOptionLabel(e)) + "_" + t; }, getPTOptions: function(e, t, n, r) { return this.ptm(r, { context: { @@ -11608,16 +11741,16 @@ var _g = { } }); }, isOptionDisabled: function(e) { - return this.optionDisabled ? nc(e, this.optionDisabled) : !1; + return this.optionDisabled ? fc(e, this.optionDisabled) : !1; }, isOptionGroup: function(e) { return this.optionGroupLabel && e.optionGroup && e.group; }, getOptionGroupLabel: function(e) { - return nc(e, this.optionGroupLabel); + return fc(e, this.optionGroupLabel); }, getOptionGroupChildren: function(e) { - return nc(e, this.optionGroupChildren); + return fc(e, this.optionGroupChildren); }, getAriaPosInset: function(e) { var t = this; @@ -11626,12 +11759,12 @@ var _g = { }).length : e) + 1; }, onFirstHiddenFocus: function() { - q(this.list); - var e = Yc(this.$el, ":not([data-p-hidden-focusable=\"true\"])"); - this.$refs.lastHiddenFocusableElement.tabIndex = Hc(e) ? void 0 : -1, this.$refs.firstHiddenFocusableElement.tabIndex = -1; + J(this.list); + var e = al(this.$el, ":not([data-p-hidden-focusable=\"true\"])"); + this.$refs.lastHiddenFocusableElement.tabIndex = Qc(e) ? void 0 : -1, this.$refs.firstHiddenFocusableElement.tabIndex = -1; }, onLastHiddenFocus: function(e) { - e.relatedTarget === this.list ? (q(Yc(this.$el, ":not([data-p-hidden-focusable=\"true\"])")), this.$refs.firstHiddenFocusableElement.tabIndex = void 0) : q(this.$refs.firstHiddenFocusableElement), this.$refs.lastHiddenFocusableElement.tabIndex = -1; + e.relatedTarget === this.list ? (J(al(this.$el, ":not([data-p-hidden-focusable=\"true\"])")), this.$refs.firstHiddenFocusableElement.tabIndex = void 0) : J(this.$refs.firstHiddenFocusableElement), this.$refs.lastHiddenFocusableElement.tabIndex = -1; }, onFocusout: function(e) { !this.$el.contains(e.relatedTarget) && this.$refs.lastHiddenFocusableElement && this.$refs.firstHiddenFocusableElement && (this.$refs.lastHiddenFocusableElement.tabIndex = this.$refs.firstHiddenFocusableElement.tabIndex = void 0); @@ -11683,7 +11816,7 @@ var _g = { this.updateModel(e, r), e.preventDefault(); break; } - !n && hc(e.key) && (this.searchOptions(e, e.key), e.preventDefault()); + !n && Tc(e.key) && (this.searchOptions(e, e.key), e.preventDefault()); } }, onOptionSelect: function(e, t) { @@ -11720,8 +11853,8 @@ var _g = { var n = this.isSelected(t), r = null; if (!this.optionTouched && this.metaKeySelection) { var i = e.metaKey || e.ctrlKey; - n ? r = i ? this.removeOption(t) : [this.getOptionValue(t)] : (r = i && this.d_value || [], r = [].concat(dg(r), [this.getOptionValue(t)])); - } else r = n ? this.removeOption(t) : [].concat(dg(this.d_value || []), [this.getOptionValue(t)]); + n ? r = i ? this.removeOption(t) : [this.getOptionValue(t)] : (r = i && this.d_value || [], r = [].concat(Sg(r), [this.getOptionValue(t)])); + } else r = n ? this.removeOption(t) : [].concat(Sg(this.d_value || []), [this.getOptionValue(t)]); this.updateModel(e, r); }, onOptionSelectRange: function(e) { @@ -11822,13 +11955,13 @@ var _g = { return this.isValidOption(e) && typeof this.getOptionLabel(e) == "string" && this.getOptionLabel(e)?.toLocaleLowerCase(this.filterLocale).startsWith(this.searchValue.toLocaleLowerCase(this.filterLocale)); }, isValidOption: function(e) { - return G(e) && !(this.isOptionDisabled(e) || this.isOptionGroup(e)); + return K(e) && !(this.isOptionDisabled(e) || this.isOptionGroup(e)); }, isValidSelectedOption: function(e) { return this.isValidOption(e) && this.isSelected(e); }, isEquals: function(e, t) { - return rc(e, t, this.equalityKey); + return pc(e, t, this.equalityKey); }, isSelected: function(e) { var t = this, n = this.getOptionValue(e); @@ -11844,7 +11977,7 @@ var _g = { }, findLastOptionIndex: function() { var e = this; - return cc(this.visibleOptions, function(t) { + return vc(this.visibleOptions, function(t) { return e.isValidOption(t); }); }, @@ -11855,7 +11988,7 @@ var _g = { return n > -1 ? n + e + 1 : e; }, findPrevOptionIndex: function(e) { - var t = this, n = e > 0 ? cc(this.visibleOptions.slice(0, e), function(e) { + var t = this, n = e > 0 ? vc(this.visibleOptions.slice(0, e), function(e) { return t.isValidOption(e); }) : -1; return n > -1 ? n : e; @@ -11884,7 +12017,7 @@ var _g = { }, findLastSelectedOptionIndex: function() { var e = this; - return this.$filled ? cc(this.visibleOptions, function(t) { + return this.$filled ? vc(this.visibleOptions, function(t) { return e.isValidSelectedOption(t); }) : -1; }, @@ -11895,7 +12028,7 @@ var _g = { return n > -1 ? n + e + 1 : -1; }, findPrevSelectedOptionIndex: function(e) { - var t = this, n = this.$filled && e > 0 ? cc(this.visibleOptions.slice(0, e), function(e) { + var t = this, n = this.$filled && e > 0 ? vc(this.visibleOptions.slice(0, e), function(e) { return t.isValidSelectedOption(e); }) : -1; return n > -1 ? n : -1; @@ -11916,7 +12049,7 @@ var _g = { var n = this; this.searchValue = (this.searchValue || "") + t; var r = -1; - G(this.searchValue) && (this.focusedOptionIndex === -1 ? r = this.visibleOptions.findIndex(function(e) { + K(this.searchValue) && (this.focusedOptionIndex === -1 ? r = this.visibleOptions.findIndex(function(e) { return n.isOptionMatched(e); }) : (r = this.visibleOptions.slice(this.focusedOptionIndex).findIndex(function(e) { return n.isOptionMatched(e); @@ -11929,7 +12062,7 @@ var _g = { removeOption: function(e) { var t = this; return this.d_value.filter(function(n) { - return !rc(n, t.getOptionValue(e), t.equalityKey); + return !pc(n, t.getOptionValue(e), t.equalityKey); }); }, changeFocusedOptionIndex: function(e, t) { @@ -11938,7 +12071,7 @@ var _g = { scrollInView: function() { var e = this, t = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : -1; this.$nextTick(function() { - var n = t === -1 ? e.focusedOptionId : `${e.$id}_${t}`, r = Kc(e.list, `li[id="${n}"]`); + var n = t === -1 ? e.focusedOptionId : `${e.$id}_${t}`, r = nl(e.list, `li[id="${n}"]`); r ? r.scrollIntoView && r.scrollIntoView({ block: "nearest", inline: "nearest", @@ -11964,23 +12097,23 @@ var _g = { }, computed: { optionsListFlat: function() { - return this.filterValue ? Kl.filter(this.options, this.searchFields, this.filterValue, this.filterMatchMode, this.filterLocale) : this.options; + return this.filterValue ? ru.filter(this.options, this.searchFields, this.filterValue, this.filterMatchMode, this.filterLocale) : this.options; }, optionsListGroup: function() { var e = this, t = []; return (this.options || []).forEach(function(n) { - var r = e.getOptionGroupChildren(n) || [], i = e.filterValue ? Kl.filter(r, e.searchFields, e.filterValue, e.filterMatchMode, e.filterLocale) : r; + var r = e.getOptionGroupChildren(n) || [], i = e.filterValue ? ru.filter(r, e.searchFields, e.filterValue, e.filterMatchMode, e.filterLocale) : r; i != null && i.length && t.push.apply(t, [{ optionGroup: n, group: !0 - }].concat(dg(i))); + }].concat(Sg(i))); }), t; }, visibleOptions: function() { return this.optionGroupLabel ? this.optionsListGroup : this.optionsListFlat; }, hasSelectedOption: function() { - return G(this.d_value); + return K(this.d_value); }, equalityKey: function() { return this.optionValue ? null : this.dataKey; @@ -11989,7 +12122,7 @@ var _g = { return this.filterFields || [this.optionLabel]; }, filterResultMessageText: function() { - return G(this.visibleOptions) ? this.filterMessageText.replaceAll("{0}", this.visibleOptions.length) : this.emptyFilterMessageText; + return K(this.visibleOptions) ? this.filterMessageText.replaceAll("{0}", this.visibleOptions.length) : this.emptyFilterMessageText; }, filterMessageText: function() { return this.filterMessage || this.$primevue.config.locale.searchMessage || ""; @@ -12022,30 +12155,30 @@ var _g = { return !this.virtualScrollerOptions; }, containerDataP: function() { - return K({ + return q({ invalid: this.$invalid, disabled: this.disabled }); } }, - directives: { ripple: Zd }, + directives: { ripple: lf }, components: { - InputText: ep, - VirtualScroller: fm, - InputIcon: $p, - IconField: Zp, - SearchIcon: Fp, - CheckIcon: mf, - BlankIcon: yp + InputText: dp, + VirtualScroller: Cm, + InputIcon: um, + IconField: cm, + SearchIcon: Kp, + CheckIcon: Tf, + BlankIcon: Ap } -}, vg = ["id", "data-p"], yg = ["tabindex"], bg = [ +}, kg = ["id", "data-p"], Ag = ["tabindex"], jg = [ "id", "aria-multiselectable", "aria-label", "aria-labelledby", "aria-activedescendant", "aria-disabled" -], xg = ["id"], Sg = [ +], Mg = ["id"], Ng = [ "id", "aria-label", "aria-selected", @@ -12059,10 +12192,10 @@ var _g = { "data-p-selected", "data-p-focused", "data-p-disabled" -], Cg = ["tabindex"]; -function wg(e, t, n, r, i, a) { - var o = F("InputText"), s = F("SearchIcon"), c = F("InputIcon"), l = F("IconField"), u = F("CheckIcon"), d = F("BlankIcon"), f = F("VirtualScroller"), p = ci("ripple"); - return R(), z("div", W({ +], Pg = ["tabindex"]; +function Fg(e, t, n, r, i, a) { + var o = F("InputText"), s = F("SearchIcon"), c = F("InputIcon"), l = F("IconField"), u = F("CheckIcon"), d = F("BlankIcon"), f = F("VirtualScroller"), p = mi("ripple"); + return z(), B("div", G({ id: e.$id, class: e.cx("root"), onFocusout: t[7] ||= function() { @@ -12070,7 +12203,7 @@ function wg(e, t, n, r, i, a) { }, "data-p": a.containerDataP }, e.ptmi("root")), [ - V("span", W({ + H("span", G({ ref: "firstHiddenFocusableElement", role: "presentation", "aria-hidden": "true", @@ -12082,29 +12215,29 @@ function wg(e, t, n, r, i, a) { }, e.ptm("hiddenFirstFocusableEl"), { "data-p-hidden-accessible": !0, "data-p-hidden-focusable": !0 - }), null, 16, yg), - e.$slots.header ? (R(), z("div", W({ + }), null, 16, Ag), + e.$slots.header ? (z(), B("div", G({ key: 0, class: e.cx("header") }, e.ptm("header")), [I(e.$slots, "header", { value: e.d_value, options: a.visibleOptions - })], 16)) : U("", !0), - e.filter ? (R(), z("div", W({ + })], 16)) : W("", !0), + e.filter ? (z(), B("div", G({ key: 1, class: e.cx("header") - }, e.ptm("header")), [H(l, { + }, e.ptm("header")), [U(l, { unstyled: e.unstyled, pt: e.ptm("pcFilterContainer") }, { default: P(function() { - return [H(o, { + return [U(o, { modelValue: i.filterValue, "onUpdate:modelValue": t[1] ||= function(e) { return i.filterValue = e; }, type: "text", - class: D(e.cx("pcFilter")), + class: O(e.cx("pcFilter")), placeholder: e.filterPlaceholder, role: "searchbox", autocomplete: "off", @@ -12128,40 +12261,40 @@ function wg(e, t, n, r, i, a) { "onInput", "onKeydown", "pt" - ]), H(c, { + ]), U(c, { unstyled: e.unstyled, pt: e.ptm("pcFilterIconContainer") }, { default: P(function() { return [I(e.$slots, "filtericon", {}, function() { - return [e.filterIcon ? (R(), z("span", W({ + return [e.filterIcon ? (z(), B("span", G({ key: 0, class: e.filterIcon - }, e.ptm("filterIcon")), null, 16)) : (R(), B(s, ve(W({ key: 1 }, e.ptm("filterIcon"))), null, 16))]; + }, e.ptm("filterIcon")), null, 16)) : (z(), V(s, _e(G({ key: 1 }, e.ptm("filterIcon"))), null, 16))]; })]; }), _: 3 }, 8, ["unstyled", "pt"])]; }), _: 3 - }, 8, ["unstyled", "pt"]), V("span", W({ + }, 8, ["unstyled", "pt"]), H("span", G({ role: "status", "aria-live": "polite", class: "p-hidden-accessible" - }, e.ptm("hiddenFilterResult"), { "data-p-hidden-accessible": !0 }), O(a.filterResultMessageText), 17)], 16)) : U("", !0), - V("div", W({ + }, e.ptm("hiddenFilterResult"), { "data-p-hidden-accessible": !0 }), k(a.filterResultMessageText), 17)], 16)) : W("", !0), + H("div", G({ class: e.cx("listContainer"), style: [{ "max-height": a.virtualScrollerDisabled ? e.scrollHeight : "" }, e.listStyle] - }, e.ptm("listContainer")), [H(f, W({ ref: a.virtualScrollerRef }, e.virtualScrollerOptions, { + }, e.ptm("listContainer")), [U(f, G({ ref: a.virtualScrollerRef }, e.virtualScrollerOptions, { items: a.visibleOptions, style: [{ height: e.scrollHeight }, e.listStyle], tabindex: -1, disabled: a.virtualScrollerDisabled, pt: e.ptm("virtualScroller") - }), fi({ + }), vi({ content: P(function(n) { var r = n.styleClass, o = n.contentRef, s = n.items, c = n.getItemOptions, l = n.contentStyle, f = n.itemSize; - return [V("ul", W({ + return [H("ul", G({ ref: function(e) { return a.listRef(e, o); }, @@ -12184,8 +12317,8 @@ function wg(e, t, n, r, i, a) { onKeydown: t[5] ||= function() { return a.onListKeyDown && a.onListKeyDown.apply(a, arguments); } - }, e.ptm("list")), [(R(!0), z(L, null, di(s, function(n, r) { - return R(), z(L, { key: a.getOptionRenderKey(n, a.getOptionIndex(r, c)) }, [a.isOptionGroup(n) ? (R(), z("li", W({ + }, e.ptm("list")), [(z(!0), B(L, null, _i(s, function(n, r) { + return z(), B(L, { key: a.getOptionRenderKey(n, a.getOptionIndex(r, c)) }, [a.isOptionGroup(n) ? (z(), B("li", G({ key: 0, id: e.$id + "_" + a.getOptionIndex(r, c), style: { height: f ? f + "px" : void 0 }, @@ -12195,8 +12328,8 @@ function wg(e, t, n, r, i, a) { option: n.optionGroup, index: a.getOptionIndex(r, c) }, function() { - return [Ua(O(a.getOptionGroupLabel(n.optionGroup)), 1)]; - })], 16, xg)) : Hn((R(), z("li", W({ + return [Za(k(a.getOptionGroupLabel(n.optionGroup)), 1)]; + })], 16, Mg)) : qn((z(), B("li", G({ key: 1, id: e.$id + "_" + a.getOptionIndex(r, c), style: { height: f ? f + "px" : void 0 }, @@ -12230,32 +12363,32 @@ function wg(e, t, n, r, i, a) { "data-p-selected": !e.checkmark && a.isSelected(n), "data-p-focused": i.focusedOptionIndex === a.getOptionIndex(r, c), "data-p-disabled": a.isOptionDisabled(n) - }), [e.checkmark ? (R(), z(L, { key: 0 }, [a.isSelected(n) ? (R(), B(u, W({ + }), [e.checkmark ? (z(), B(L, { key: 0 }, [a.isSelected(n) ? (z(), V(u, G({ key: 0, class: e.cx("optionCheckIcon") - }, { ref_for: !0 }, e.ptm("optionCheckIcon")), null, 16, ["class"])) : (R(), B(d, W({ + }, { ref_for: !0 }, e.ptm("optionCheckIcon")), null, 16, ["class"])) : (z(), V(d, G({ key: 1, class: e.cx("optionBlankIcon") - }, { ref_for: !0 }, e.ptm("optionBlankIcon")), null, 16, ["class"]))], 64)) : U("", !0), I(e.$slots, "option", { + }, { ref_for: !0 }, e.ptm("optionBlankIcon")), null, 16, ["class"]))], 64)) : W("", !0), I(e.$slots, "option", { option: n, selected: a.isSelected(n), index: a.getOptionIndex(r, c) }, function() { - return [Ua(O(a.getOptionLabel(n)), 1)]; - })], 16, Sg)), [[p]])], 64); - }), 128)), i.filterValue && (!s || s && s.length === 0) ? (R(), z("li", W({ + return [Za(k(a.getOptionLabel(n)), 1)]; + })], 16, Ng)), [[p]])], 64); + }), 128)), i.filterValue && (!s || s && s.length === 0) ? (z(), B("li", G({ key: 0, class: e.cx("emptyMessage"), role: "option" }, e.ptm("emptyMessage")), [I(e.$slots, "emptyfilter", {}, function() { - return [Ua(O(a.emptyFilterMessageText), 1)]; - })], 16)) : !e.options || e.options && e.options.length === 0 ? (R(), z("li", W({ + return [Za(k(a.emptyFilterMessageText), 1)]; + })], 16)) : !e.options || e.options && e.options.length === 0 ? (z(), B("li", G({ key: 1, class: e.cx("emptyMessage"), role: "option" }, e.ptm("emptyMessage")), [I(e.$slots, "empty", {}, function() { - return [Ua(O(a.emptyMessageText), 1)]; - })], 16)) : U("", !0)], 16, bg)]; + return [Za(k(a.emptyMessageText), 1)]; + })], 16)) : W("", !0)], 16, jg)]; }), _: 2 }, [e.$slots.loader ? { @@ -12275,18 +12408,18 @@ function wg(e, t, n, r, i, a) { value: e.d_value, options: a.visibleOptions }), - !e.options || e.options && e.options.length === 0 ? (R(), z("span", W({ + !e.options || e.options && e.options.length === 0 ? (z(), B("span", G({ key: 2, role: "status", "aria-live": "polite", class: "p-hidden-accessible" - }, e.ptm("hiddenEmptyMessage"), { "data-p-hidden-accessible": !0 }), O(a.emptyMessageText), 17)) : U("", !0), - V("span", W({ + }, e.ptm("hiddenEmptyMessage"), { "data-p-hidden-accessible": !0 }), k(a.emptyMessageText), 17)) : W("", !0), + H("span", G({ role: "status", "aria-live": "polite", class: "p-hidden-accessible" - }, e.ptm("hiddenSelectedMessage"), { "data-p-hidden-accessible": !0 }), O(a.selectedMessageText), 17), - V("span", W({ + }, e.ptm("hiddenSelectedMessage"), { "data-p-hidden-accessible": !0 }), k(a.selectedMessageText), 17), + H("span", G({ ref: "lastHiddenFocusableElement", role: "presentation", "aria-hidden": "true", @@ -12298,12 +12431,12 @@ function wg(e, t, n, r, i, a) { }, e.ptm("hiddenLastFocusableEl"), { "data-p-hidden-accessible": !0, "data-p-hidden-focusable": !0 - }), null, 16, Cg) - ], 16, vg); + }), null, 16, Pg) + ], 16, kg); } -_g.render = wg; +Og.render = Fg; // node_modules/primevue/tree/style/index.mjs -var Tg = X.extend({ +var Ig = X.extend({ name: "tree", style: "\n .p-tree {\n display: block;\n background: dt('tree.background');\n color: dt('tree.color');\n padding: dt('tree.padding');\n position: relative;\n }\n\n .p-tree-root-children,\n .p-tree-node-children {\n display: flex;\n list-style-type: none;\n flex-direction: column;\n margin: 0;\n gap: dt('tree.gap');\n }\n\n .p-tree-root-children {\n padding: 0;\n padding-block-start: dt('tree.gap');\n }\n\n .p-tree-node-children {\n padding: 0;\n padding-block-start: dt('tree.gap');\n padding-inline-start: dt('tree.indent');\n }\n\n .p-tree-node {\n padding: 0;\n outline: 0 none;\n }\n\n .p-tree-node-content {\n border-radius: dt('tree.node.border.radius');\n padding: dt('tree.node.padding');\n display: flex;\n align-items: center;\n outline-color: transparent;\n color: dt('tree.node.color');\n gap: dt('tree.node.gap');\n transition:\n background dt('tree.transition.duration'),\n color dt('tree.transition.duration'),\n outline-color dt('tree.transition.duration'),\n box-shadow dt('tree.transition.duration');\n }\n\n .p-tree-node-content[data-p-dragging] {\n outline: 1px dashed dt('primary.color');\n outline-offset: -1px;\n }\n\n .p-tree-node-content[data-pc-section=\"drag-image\"] {\n background: dt('tree.background');\n }\n\n .p-tree-node:focus-visible > .p-tree-node-content {\n box-shadow: dt('tree.node.focus.ring.shadow');\n outline: dt('tree.node.focus.ring.width') dt('tree.node.focus.ring.style') dt('tree.node.focus.ring.color');\n outline-offset: dt('tree.node.focus.ring.offset');\n }\n\n .p-tree-node-content.p-tree-node-selectable:not(.p-tree-node-selected):hover {\n background: dt('tree.node.hover.background');\n color: dt('tree.node.hover.color');\n }\n\n .p-tree-node-content.p-tree-node-selectable:not(.p-tree-node-selected):hover .p-tree-node-icon {\n color: dt('tree.node.icon.hover.color');\n }\n\n .p-tree-node-content.p-tree-node-selected {\n background: dt('tree.node.selected.background');\n color: dt('tree.node.selected.color');\n }\n\n .p-tree-node-content.p-tree-node-selected .p-tree-node-toggle-button {\n color: inherit;\n }\n\n .p-tree-node-content.p-tree-node-dragover {\n background: dt('tree.node.hover.background');\n color: dt('tree.node.hover.color');\n }\n\n .p-tree-node-content:focus-visible,\n .p-tree-node-content.p-tree-node-contextmenu-selected {\n box-shadow: dt('tree.node.focus.ring.shadow');\n outline: dt('tree.node.focus.ring.width') dt('tree.node.focus.ring.style') dt('tree.node.focus.ring.color');\n outline-offset: dt('tree.node.focus.ring.offset');\n }\n\n .p-tree-node-drop-point {\n outline: 1px solid dt('primary.color');\n }\n\n .p-tree-node-toggle-button {\n cursor: pointer;\n user-select: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n position: relative;\n flex-shrink: 0;\n width: dt('tree.node.toggle.button.size');\n height: dt('tree.node.toggle.button.size');\n color: dt('tree.node.toggle.button.color');\n border: 0 none;\n background: transparent;\n border-radius: dt('tree.node.toggle.button.border.radius');\n transition:\n background dt('tree.transition.duration'),\n color dt('tree.transition.duration'),\n border-color dt('tree.transition.duration'),\n outline-color dt('tree.transition.duration'),\n box-shadow dt('tree.transition.duration');\n outline-color: transparent;\n padding: 0;\n }\n\n .p-tree-node-toggle-button:enabled:hover {\n background: dt('tree.node.toggle.button.hover.background');\n color: dt('tree.node.toggle.button.hover.color');\n }\n\n .p-tree-node-content.p-tree-node-selected .p-tree-node-toggle-button:hover {\n background: dt('tree.node.toggle.button.selected.hover.background');\n color: dt('tree.node.toggle.button.selected.hover.color');\n }\n\n .p-tree-root {\n overflow: auto;\n }\n\n .p-tree-node-selectable {\n cursor: pointer;\n user-select: none;\n }\n\n .p-tree-node-leaf > .p-tree-node-content .p-tree-node-toggle-button {\n visibility: hidden;\n }\n\n .p-tree-node-icon {\n color: dt('tree.node.icon.color');\n transition: color dt('tree.transition.duration');\n }\n\n .p-tree-node-content.p-tree-node-selected .p-tree-node-icon {\n color: dt('tree.node.icon.selected.color');\n }\n\n .p-tree-filter {\n margin: dt('tree.filter.margin');\n }\n\n .p-tree-filter-input {\n width: 100%;\n }\n\n .p-tree-loading-icon {\n font-size: dt('tree.loading.icon.size');\n width: dt('tree.loading.icon.size');\n height: dt('tree.loading.icon.size');\n }\n\n .p-tree .p-tree-mask {\n position: absolute;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .p-tree-flex-scrollable {\n display: flex;\n flex: 1;\n height: 100%;\n flex-direction: column;\n }\n\n .p-tree-flex-scrollable .p-tree-root {\n flex: 1;\n }\n", classes: { @@ -12346,51 +12479,51 @@ var Tg = X.extend({ emptyMessage: "p-tree-empty-message", dropPoint: "p-tree-node-drop-point" } -}), Eg = { +}), Lg = { name: "ChevronRightIcon", - extends: ud + extends: xd }; -function Dg(e) { - return jg(e) || Ag(e) || kg(e) || Og(); +function Rg(e) { + return Hg(e) || Vg(e) || Bg(e) || zg(); } -function Og() { +function zg() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function kg(e, t) { +function Bg(e, t) { if (e) { - if (typeof e == "string") return Mg(e, t); + if (typeof e == "string") return Ug(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Mg(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Ug(e, t) : void 0; } } -function Ag(e) { +function Vg(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function jg(e) { - if (Array.isArray(e)) return Mg(e); +function Hg(e) { + if (Array.isArray(e)) return Ug(e); } -function Mg(e, t) { +function Ug(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function Ng(e, t, n, r, i, a) { - return R(), z("svg", W({ +function Wg(e, t, n, r, i, a) { + return z(), B("svg", G({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" - }, e.pti()), Dg(t[0] ||= [V("path", { + }, e.pti()), Rg(t[0] ||= [H("path", { d: "M4.38708 13C4.28408 13.0005 4.18203 12.9804 4.08691 12.9409C3.99178 12.9014 3.9055 12.8433 3.83313 12.7701C3.68634 12.6231 3.60388 12.4238 3.60388 12.2161C3.60388 12.0084 3.68634 11.8091 3.83313 11.6622L8.50507 6.99022L3.83313 2.31827C3.69467 2.16968 3.61928 1.97313 3.62287 1.77005C3.62645 1.56698 3.70872 1.37322 3.85234 1.22959C3.99596 1.08597 4.18972 1.00371 4.3928 1.00012C4.59588 0.996539 4.79242 1.07192 4.94102 1.21039L10.1669 6.43628C10.3137 6.58325 10.3962 6.78249 10.3962 6.99022C10.3962 7.19795 10.3137 7.39718 10.1669 7.54416L4.94102 12.7701C4.86865 12.8433 4.78237 12.9014 4.68724 12.9409C4.59212 12.9804 4.49007 13.0005 4.38708 13Z", fill: "currentColor" }, null, -1)]), 16); } -Eg.render = Ng; +Lg.render = Wg; // node_modules/primevue/tree/index.mjs -var Pg = { +var Gg = { name: "BaseTree", - extends: nd, + extends: pd, props: { value: { type: null, @@ -12485,55 +12618,55 @@ var Pg = { default: null } }, - style: Tg, + style: Ig, provide: function() { return { $pcTree: this, $parentInstance: this }; } -}, Fg = /* @__PURE__ */ Ut({ +}, Kg = /* @__PURE__ */ Ut({ isDragging: !1, dragNode: null, dragScope: null -}), Ig = /* @__PURE__ */ new Set(), Lg = /* @__PURE__ */ new Set(); -function Rg() { +}), qg = /* @__PURE__ */ new Set(), Jg = /* @__PURE__ */ new Set(); +function Yg() { return { - dragState: Fg, + dragState: Kg, startDrag: function(e) { - Fg.isDragging = !0, Fg.dragNode = e.node, Fg.dragScope = e.scope, Ig.forEach(function(t) { + Kg.isDragging = !0, Kg.dragNode = e.node, Kg.dragScope = e.scope, qg.forEach(function(t) { return t(e); }); }, stopDrag: function(e) { - Fg.isDragging = !1, Fg.dragNode = null, Fg.dragScope = null, Lg.forEach(function(t) { + Kg.isDragging = !1, Kg.dragNode = null, Kg.dragScope = null, Jg.forEach(function(t) { return t(e); }); }, onDragStart: function(e) { - return Ig.add(e), function() { - return Ig.delete(e); + return qg.add(e), function() { + return qg.delete(e); }; }, onDragStop: function(e) { - return Lg.add(e), function() { - return Lg.delete(e); + return Jg.add(e), function() { + return Jg.delete(e); }; } }; } -function zg(e) { +function Xg(e) { "@babel/helpers - typeof"; - return zg = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return Xg = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, zg(e); + }, Xg(e); } -function Bg(e, t) { +function Zg(e, t) { var n = typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"]; if (!n) { - if (Array.isArray(e) || (n = Ug(e)) || t) { + if (Array.isArray(e) || (n = e_(e)) || t) { n && (e = n); var r = 0, i = function() {}; return { @@ -12573,31 +12706,31 @@ function Bg(e, t) { } }; } -function Vg(e) { - return Gg(e) || Wg(e) || Ug(e) || Hg(); +function Qg(e) { + return n_(e) || t_(e) || e_(e) || $g(); } -function Hg() { +function $g() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function Ug(e, t) { +function e_(e, t) { if (e) { - if (typeof e == "string") return Kg(e, t); + if (typeof e == "string") return r_(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? Kg(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? r_(e, t) : void 0; } } -function Wg(e) { +function t_(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function Gg(e) { - if (Array.isArray(e)) return Kg(e); +function n_(e) { + if (Array.isArray(e)) return r_(e); } -function Kg(e, t) { +function r_(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function qg(e, t) { +function i_(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -12607,43 +12740,43 @@ function qg(e, t) { } return n; } -function Jg(e) { +function a_(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? qg(Object(n), !0).forEach(function(t) { - Yg(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : qg(Object(n)).forEach(function(t) { + t % 2 ? i_(Object(n), !0).forEach(function(t) { + o_(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : i_(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function Yg(e, t, n) { - return (t = Xg(t)) in e ? Object.defineProperty(e, t, { +function o_(e, t, n) { + return (t = s_(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function Xg(e) { - var t = Zg(e, "string"); - return zg(t) == "symbol" ? t : t + ""; +function s_(e) { + var t = c_(e, "string"); + return Xg(t) == "symbol" ? t : t + ""; } -function Zg(e, t) { - if (zg(e) != "object" || !e) return e; +function c_(e, t) { + if (Xg(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (zg(r) != "object") return r; + if (Xg(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var Qg = { +var l_ = { name: "TreeNode", hostName: "Tree", - extends: nd, + extends: pd, emits: [ "node-toggle", "node-click", @@ -12743,7 +12876,7 @@ var Qg = { } }); }, onClick: function(e) { - this.toggleClicked || qc(e.target, "[data-pc-section=\"nodetogglebutton\"]") || qc(e.target.parentElement, "[data-pc-section=\"nodetogglebutton\"]") ? this.toggleClicked = !1 : (this.isCheckboxSelectionMode() ? this.node.selectable != 0 && this.toggleCheckbox() : this.$emit("node-click", { + this.toggleClicked || rl(e.target, "[data-pc-section=\"nodetogglebutton\"]") || rl(e.target.parentElement, "[data-pc-section=\"nodetogglebutton\"]") ? this.toggleClicked = !1 : (this.isCheckboxSelectionMode() ? this.node.selectable != 0 && this.toggleCheckbox() : this.$emit("node-click", { originalEvent: e, nodeTouched: this.nodeTouched, node: this.node @@ -12803,7 +12936,7 @@ var Qg = { })); }, onArrowLeft: function(e) { - var t = Kc(e.currentTarget, "[data-pc-section=\"nodetogglebutton\"]"); + var t = nl(e.currentTarget, "[data-pc-section=\"nodetogglebutton\"]"); if (this.level === 0 && !this.expanded) return !1; if (this.expanded && !this.leaf) return t.click(), !1; var n = this.findBeforeClickableNode(e.currentTarget); @@ -12821,7 +12954,7 @@ var Qg = { if (r.key === t.key) return e; if (r.children && r.children.length > 0) { var i = n.removeNodeFromTree(r.children, t); - e.push(Jg(Jg({}, r), {}, { children: i })); + e.push(a_(a_({}, r), {}, { children: i })); } else e.push(r); return e; }, []); @@ -12831,13 +12964,13 @@ var Qg = { return e.key === t; }); return a === -1 ? e.map(function(e) { - return e.children && e.children.length > 0 ? Jg(Jg({}, e), {}, { children: i.insertNodeInSiblings(e.children, t, n, r) }) : e; + return e.children && e.children.length > 0 ? a_(a_({}, e), {}, { children: i.insertNodeInSiblings(e.children, t, n, r) }) : e; }) : e.toSpliced(a + r, 0, n); }, addNodeAsChild: function(e, t, n) { var r = this; return e.map(function(e) { - return e.key === t ? Jg(Jg({}, e), {}, { children: [].concat(Vg(e.children || []), [n]) }) : e.children && e.children.length > 0 ? Jg(Jg({}, e), {}, { children: r.addNodeAsChild(e.children, t, n) }) : e; + return e.key === t ? a_(a_({}, e), {}, { children: [].concat(Qg(e.children || []), [n]) }) : e.children && e.children.length > 0 ? a_(a_({}, e), {}, { children: r.addNodeAsChild(e.children, t, n) }) : e; }); }, insertNodeOnDrop: function() { @@ -12894,7 +13027,7 @@ var Qg = { if (this.isNodeDraggable) { e.dataTransfer.effectAllowed = "all", e.dataTransfer.setData("text", "data"); var t = e.currentTarget, n = t.cloneNode(!0), r = n.querySelector("[data-pc-section=\"nodetogglebutton\"]"), i = n.querySelector("[data-pc-name=\"pcnodecheckbox\"]"); - t.setAttribute("data-p-dragging", "true"), n.style.width = Rc(t) + "px", n.style.height = $c(t) + "px", n.setAttribute("data-pc-section", "drag-image"), r.style.visibility = "hidden", i?.remove(), document.body.appendChild(n), e.dataTransfer.setDragImage(n, 0, 0), setTimeout(function() { + t.setAttribute("data-p-dragging", "true"), n.style.width = Jc(t) + "px", n.style.height = ll(t) + "px", n.setAttribute("data-pc-section", "drag-image"), r.style.visibility = "hidden", i?.remove(), document.body.appendChild(n), e.dataTransfer.setDragImage(n, 0, 0), setTimeout(function() { return document.body.removeChild(n); }, 0), this.$pcTree.dragDropService.startDrag({ node: this.node, @@ -12927,21 +13060,21 @@ var Qg = { }); }, setAllNodesTabIndexes: function() { - var e = Gc(this.$refs.currentNode.closest("[data-pc-section=\"rootchildren\"]"), "[role=\"treeitem\"]"), t = Vg(e).some(function(e) { + var e = tl(this.$refs.currentNode.closest("[data-pc-section=\"rootchildren\"]"), "[role=\"treeitem\"]"), t = Qg(e).some(function(e) { return e.getAttribute("aria-selected") === "true" || e.getAttribute("aria-checked") === "true"; }); - if (Vg(e).forEach(function(e) { + if (Qg(e).forEach(function(e) { e.tabIndex = -1; }), t) { - var n = Vg(e).filter(function(e) { + var n = Qg(e).filter(function(e) { return e.getAttribute("aria-selected") === "true" || e.getAttribute("aria-checked") === "true"; }); n[0].tabIndex = 0; - } else Vg(e)[0].tabIndex = 0; + } else Qg(e)[0].tabIndex = 0; }, setTabIndexForSelectionMode: function(e, t) { if (this.selectionMode !== null) { - var n = Vg(Gc(this.$refs.currentNode.parentElement, "[role=\"treeitem\"]")); + var n = Qg(tl(this.$refs.currentNode.parentElement, "[role=\"treeitem\"]")); e.currentTarget.tabIndex = t === !1 ? -1 : 0, n.every(function(e) { return e.tabIndex === -1; }) && (n[0].tabIndex = 0); @@ -12953,13 +13086,13 @@ var Qg = { findBeforeClickableNode: function(e) { var t = e.closest("ul").closest("li"); if (t) { - var n = Kc(t, "button"); + var n = nl(t, "button"); return n && n.style.visibility !== "hidden" ? t : this.findBeforeClickableNode(e.previousElementSibling); } return null; }, toggleCheckbox: function() { - var e = this.selectionKeys ? Jg({}, this.selectionKeys) : {}, t = !this.checked; + var e = this.selectionKeys ? a_({}, this.selectionKeys) : {}, t = !this.checked; this.propagateDown(this.node, t, e), this.$emit("checkbox-change", { node: this.node, check: t, @@ -12971,7 +13104,7 @@ var Qg = { checked: !0, partialChecked: !1 } : delete n[e.key], e.children && e.children.length) { - var r = Bg(e.children), i; + var r = Zg(e.children), i; try { for (r.s(); !(i = r.n()).done;) { var a = i.value; @@ -12985,7 +13118,7 @@ var Qg = { } }, propagateUp: function(e) { - var t = e.check, n = Jg({}, e.selectionKeys), r = 0, i = !1, a = Bg(this.node.children), o; + var t = e.check, n = a_({}, e.selectionKeys), r = 0, i = !1, a = Zg(this.node.children), o; try { for (a.s(); !(o = a.n()).done;) { var s = o.value; @@ -13025,7 +13158,7 @@ var Qg = { }, getParentNodeElement: function(e) { var t = e.parentElement.parentElement; - return qc(t, "role") === "treeitem" ? t : null; + return rl(t, "role") === "treeitem" ? t : null; }, focusNode: function(e) { e.focus(); @@ -13097,15 +13230,15 @@ var Qg = { } }, components: { - Checkbox: Wf, - ChevronDownIcon: Dp, - ChevronRightIcon: Eg, - CheckIcon: mf, - MinusIcon: Sf, - SpinnerIcon: dd + Checkbox: tp, + ChevronDownIcon: Rp, + ChevronRightIcon: Lg, + CheckIcon: Tf, + MinusIcon: Nf, + SpinnerIcon: Sd }, - directives: { ripple: Zd } -}, $g = [ + directives: { ripple: lf } +}, u_ = [ "aria-label", "aria-selected", "aria-expanded", @@ -13114,14 +13247,14 @@ var Qg = { "aria-level", "aria-checked", "tabindex" -], e_ = [ +], d_ = [ "draggable", "data-p-selected", "data-p-selectable" -], t_ = ["data-p-leaf"]; -function n_(e, t, n, r, i, a) { - var o = F("SpinnerIcon"), s = F("Checkbox"), c = F("TreeNode", !0), l = ci("ripple"); - return R(), z("li", W({ +], f_ = ["data-p-leaf"]; +function p_(e, t, n, r, i, a) { + var o = F("SpinnerIcon"), s = F("Checkbox"), c = F("TreeNode", !0), l = mi("ripple"); + return z(), B("li", G({ ref: "currentNode", class: e.cx("node"), role: "treeitem", @@ -13137,12 +13270,12 @@ function n_(e, t, n, r, i, a) { return a.onKeyDown && a.onKeyDown.apply(a, arguments); } }, a.getPTOptions("node")), [ - a.isPrevDropPointActive ? (R(), z("div", { + a.isPrevDropPointActive ? (z(), B("div", { key: 0, - class: D(e.cx("dropPoint")), + class: O(e.cx("dropPoint")), "aria-hidden": "true" - }, null, 2)) : U("", !0), - V("div", W({ + }, null, 2)) : W("", !0), + H("div", G({ class: e.cx("nodeContent"), style: n.node.style, draggable: a.isDraggable, @@ -13174,7 +13307,7 @@ function n_(e, t, n, r, i, a) { "data-p-selected": a.checkboxMode ? a.checked : a.selected, "data-p-selectable": a.selectable }), [ - Hn((R(), z("button", W({ + qn((z(), B("button", G({ type: "button", class: e.cx("nodeToggleButton"), onClick: t[0] ||= function() { @@ -13182,57 +13315,57 @@ function n_(e, t, n, r, i, a) { }, tabindex: "-1", "data-p-leaf": a.leaf - }, a.getPTOptions("nodeToggleButton")), [n.node.loading && n.loadingMode === "icon" ? (R(), z(L, { key: 0 }, [n.templates.nodetoggleicon || n.templates.nodetogglericon ? (R(), B(si(n.templates.nodetoggleicon || n.templates.nodetogglericon), { + }, a.getPTOptions("nodeToggleButton")), [n.node.loading && n.loadingMode === "icon" ? (z(), B(L, { key: 0 }, [n.templates.nodetoggleicon || n.templates.nodetogglericon ? (z(), V(pi(n.templates.nodetoggleicon || n.templates.nodetogglericon), { key: 0, node: n.node, expanded: a.expanded, - class: D(e.cx("nodeToggleIcon")) + class: O(e.cx("nodeToggleIcon")) }, null, 8, [ "node", "expanded", "class" - ])) : (R(), B(o, W({ + ])) : (z(), V(o, G({ key: 1, spin: "", class: e.cx("nodeToggleIcon") - }, a.getPTOptions("nodeToggleIcon")), null, 16, ["class"]))], 64)) : (R(), z(L, { key: 1 }, [n.templates.nodetoggleicon || n.templates.togglericon ? (R(), B(si(n.templates.nodetoggleicon || n.templates.togglericon), { + }, a.getPTOptions("nodeToggleIcon")), null, 16, ["class"]))], 64)) : (z(), B(L, { key: 1 }, [n.templates.nodetoggleicon || n.templates.togglericon ? (z(), V(pi(n.templates.nodetoggleicon || n.templates.togglericon), { key: 0, node: n.node, expanded: a.expanded, - class: D(e.cx("nodeToggleIcon")) + class: O(e.cx("nodeToggleIcon")) }, null, 8, [ "node", "expanded", "class" - ])) : a.expanded ? (R(), B(si(n.node.expandedIcon ? "span" : "ChevronDownIcon"), W({ + ])) : a.expanded ? (z(), V(pi(n.node.expandedIcon ? "span" : "ChevronDownIcon"), G({ key: 1, class: e.cx("nodeToggleIcon") - }, a.getPTOptions("nodeToggleIcon")), null, 16, ["class"])) : (R(), B(si(n.node.collapsedIcon ? "span" : "ChevronRightIcon"), W({ + }, a.getPTOptions("nodeToggleIcon")), null, 16, ["class"])) : (z(), V(pi(n.node.collapsedIcon ? "span" : "ChevronRightIcon"), G({ key: 2, class: e.cx("nodeToggleIcon") - }, a.getPTOptions("nodeToggleIcon")), null, 16, ["class"]))], 64))], 16, t_)), [[l]]), - a.checkboxMode ? (R(), B(s, { + }, a.getPTOptions("nodeToggleIcon")), null, 16, ["class"]))], 64))], 16, f_)), [[l]]), + a.checkboxMode ? (z(), V(s, { key: 0, defaultValue: a.checked, binary: !0, indeterminate: a.partialChecked, - class: D(e.cx("nodeCheckbox")), + class: O(e.cx("nodeCheckbox")), tabindex: -1, unstyled: e.unstyled, pt: a.getPTOptions("pcNodeCheckbox"), "data-p-partialchecked": a.partialChecked }, { icon: P(function(e) { - return [n.templates.checkboxicon ? (R(), B(si(n.templates.checkboxicon), { + return [n.templates.checkboxicon ? (z(), V(pi(n.templates.checkboxicon), { key: 0, checked: e.checked, partialChecked: a.partialChecked, - class: D(e.class) + class: O(e.class) }, null, 8, [ "checked", "partialChecked", "class" - ])) : U("", !0)]; + ])) : W("", !0)]; }), _: 1 }, 8, [ @@ -13242,16 +13375,16 @@ function n_(e, t, n, r, i, a) { "unstyled", "pt", "data-p-partialchecked" - ])) : U("", !0), - n.templates.nodeicon ? (R(), B(si(n.templates.nodeicon), W({ + ])) : W("", !0), + n.templates.nodeicon ? (z(), V(pi(n.templates.nodeicon), G({ key: 1, node: n.node, class: [e.cx("nodeIcon")] - }, a.getPTOptions("nodeIcon")), null, 16, ["node", "class"])) : (R(), z("span", W({ + }, a.getPTOptions("nodeIcon")), null, 16, ["node", "class"])) : (z(), B("span", G({ key: 2, class: [e.cx("nodeIcon"), n.node.icon] }, a.getPTOptions("nodeIcon")), null, 16)), - V("span", W({ class: e.cx("nodeLabel") }, a.getPTOptions("nodeLabel"), { onKeydown: t[1] ||= Ls(function() {}, ["stop"]) }), [n.templates[n.node.type] || n.templates.default ? (R(), B(si(n.templates[n.node.type] || n.templates.default), { + H("span", G({ class: e.cx("nodeLabel") }, a.getPTOptions("nodeLabel"), { onKeydown: t[1] ||= qs(function() {}, ["stop"]) }), [n.templates[n.node.type] || n.templates.default ? (z(), V(pi(n.templates[n.node.type] || n.templates.default), { key: 0, node: n.node, expanded: a.expanded, @@ -13260,19 +13393,19 @@ function n_(e, t, n, r, i, a) { "node", "expanded", "selected" - ])) : (R(), z(L, { key: 1 }, [Ua(O(a.label(n.node)), 1)], 64))], 16) - ], 16, e_), - a.isNextDropPointActive ? (R(), z("div", { + ])) : (z(), B(L, { key: 1 }, [Za(k(a.label(n.node)), 1)], 64))], 16) + ], 16, d_), + a.isNextDropPointActive ? (z(), B("div", { key: 1, - class: D(e.cx("dropPoint")), + class: O(e.cx("dropPoint")), "aria-hidden": "true" - }, null, 2)) : U("", !0), - a.hasChildren && a.expanded ? (R(), z("ul", W({ + }, null, 2)) : W("", !0), + a.hasChildren && a.expanded ? (z(), B("ul", G({ key: 2, class: e.cx("nodeChildren"), role: "group" - }, e.ptm("nodeChildren")), [(R(!0), z(L, null, di(n.node.children, function(r, i) { - return R(), B(c, { + }, e.ptm("nodeChildren")), [(z(!0), B(L, null, _i(n.node.children, function(r, i) { + return z(), V(c, { key: r.key, node: r, parentNode: n.node, @@ -13326,22 +13459,22 @@ function n_(e, t, n, r, i, a) { "unstyled", "pt" ]); - }), 128))], 16)) : U("", !0) - ], 16, $g); + }), 128))], 16)) : W("", !0) + ], 16, u_); } -Qg.render = n_; -function r_(e) { +l_.render = p_; +function m_(e) { "@babel/helpers - typeof"; - return r_ = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return m_ = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, r_(e); + }, m_(e); } -function i_(e, t) { +function h_(e, t) { var n = typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"]; if (!n) { - if (Array.isArray(e) || (n = s_(e)) || t) { + if (Array.isArray(e) || (n = v_(e)) || t) { n && (e = n); var r = 0, i = function() {}; return { @@ -13381,31 +13514,31 @@ function i_(e, t) { } }; } -function a_(e) { - return l_(e) || c_(e) || s_(e) || o_(); +function g_(e) { + return b_(e) || y_(e) || v_(e) || __(); } -function o_() { +function __() { throw TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function s_(e, t) { +function v_(e, t) { if (e) { - if (typeof e == "string") return u_(e, t); + if (typeof e == "string") return x_(e, t); var n = {}.toString.call(e).slice(8, -1); - return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? u_(e, t) : void 0; + return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? x_(e, t) : void 0; } } -function c_(e) { +function y_(e) { if (typeof Symbol < "u" && e[Symbol.iterator] != null || e["@@iterator"] != null) return Array.from(e); } -function l_(e) { - if (Array.isArray(e)) return u_(e); +function b_(e) { + if (Array.isArray(e)) return x_(e); } -function u_(e, t) { +function x_(e, t) { (t == null || t > e.length) && (t = e.length); for (var n = 0, r = Array(t); n < t; n++) r[n] = e[n]; return r; } -function d_(e, t) { +function S_(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -13415,42 +13548,42 @@ function d_(e, t) { } return n; } -function f_(e) { +function C_(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? d_(Object(n), !0).forEach(function(t) { - p_(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : d_(Object(n)).forEach(function(t) { + t % 2 ? S_(Object(n), !0).forEach(function(t) { + w_(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : S_(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function p_(e, t, n) { - return (t = m_(t)) in e ? Object.defineProperty(e, t, { +function w_(e, t, n) { + return (t = T_(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function m_(e) { - var t = h_(e, "string"); - return r_(t) == "symbol" ? t : t + ""; +function T_(e) { + var t = E_(e, "string"); + return m_(t) == "symbol" ? t : t + ""; } -function h_(e, t) { - if (r_(e) != "object" || !e) return e; +function E_(e, t) { + if (m_(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (r_(r) != "object") return r; + if (m_(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var g_ = { +var D_ = { name: "Tree", - extends: Pg, + extends: Gg, inheritAttrs: !1, emits: [ "node-expand", @@ -13499,7 +13632,7 @@ var g_ = { methods: { initDragDropService: function() { var e = this; - this.dragDropService || (this.dragDropService = Rg(), this.dragStartCleanup = this.dragDropService.onDragStart(function(t) { + this.dragDropService || (this.dragDropService = Yg(), this.dragStartCleanup = this.dragDropService.onDragStart(function(t) { e.dragNode = t.node, e.dragNodeSubNodes = t.subNodes, e.dragNodeIndex = t.index, e.dragNodeScope = t.scope; }), this.dragStopCleanup = this.dragDropService.onDragStop(function() { e.dragNode = null, e.dragNodeSubNodes = null, e.dragNodeIndex = null, e.dragNodeScope = null, e.dragHover = !1; @@ -13510,7 +13643,7 @@ var g_ = { }, onNodeToggle: function(e) { var t = e.key; - this.d_expandedKeys[t] ? (delete this.d_expandedKeys[t], this.$emit("node-collapse", e)) : (this.d_expandedKeys[t] = !0, this.$emit("node-expand", e)), this.d_expandedKeys = f_({}, this.d_expandedKeys), this.$emit("update:expandedKeys", this.d_expandedKeys); + this.d_expandedKeys[t] ? (delete this.d_expandedKeys[t], this.$emit("node-collapse", e)) : (this.d_expandedKeys[t] = !0, this.$emit("node-expand", e)), this.d_expandedKeys = C_({}, this.d_expandedKeys), this.$emit("update:expandedKeys", this.d_expandedKeys); }, onNodeClick: function(e) { if (this.selectionMode != null && e.node.selectable !== !1) { @@ -13523,11 +13656,11 @@ var g_ = { }, handleSelectionWithMetaKey: function(e) { var t = e.originalEvent, n = e.node, r = t.metaKey || t.ctrlKey, i = this.isNodeSelected(n), a; - return i && r ? (this.isSingleSelectionMode() ? a = {} : (a = f_({}, this.selectionKeys), delete a[n.key]), this.$emit("node-unselect", n)) : (this.isSingleSelectionMode() ? a = {} : this.isMultipleSelectionMode() && (a = r && this.selectionKeys ? f_({}, this.selectionKeys) : {}), a[n.key] = !0, this.$emit("node-select", n)), a; + return i && r ? (this.isSingleSelectionMode() ? a = {} : (a = C_({}, this.selectionKeys), delete a[n.key]), this.$emit("node-unselect", n)) : (this.isSingleSelectionMode() ? a = {} : this.isMultipleSelectionMode() && (a = r && this.selectionKeys ? C_({}, this.selectionKeys) : {}), a[n.key] = !0, this.$emit("node-select", n)), a; }, handleSelectionWithoutMetaKey: function(e) { var t = e.node, n = this.isNodeSelected(t), r; - return this.isSingleSelectionMode() ? n ? (r = {}, this.$emit("node-unselect", t)) : (r = {}, r[t.key] = !0, this.$emit("node-select", t)) : n ? (r = f_({}, this.selectionKeys), delete r[t.key], this.$emit("node-unselect", t)) : (r = this.selectionKeys ? f_({}, this.selectionKeys) : {}, r[t.key] = !0, this.$emit("node-select", t)), r; + return this.isSingleSelectionMode() ? n ? (r = {}, this.$emit("node-unselect", t)) : (r = {}, r[t.key] = !0, this.$emit("node-select", t)) : n ? (r = C_({}, this.selectionKeys), delete r[t.key], this.$emit("node-unselect", t)) : (r = this.selectionKeys ? C_({}, this.selectionKeys) : {}, r[t.key] = !0, this.$emit("node-select", t)), r; }, isSingleSelectionMode: function() { return this.selectionMode === "single"; @@ -13555,12 +13688,12 @@ var g_ = { if (e) { var n = !1; if (e.children) { - var r = a_(e.children); + var r = g_(e.children); e.children = []; - var i = i_(r), a; + var i = h_(r), a; try { for (i.s(); !(a = i.n()).done;) { - var o = a.value, s = f_({}, o); + var o = a.value, s = C_({}, o); this.isFilterMatched(s, t) && (n = !0, e.children.push(s)); } } catch (e) { @@ -13573,11 +13706,11 @@ var g_ = { } }, isFilterMatched: function(e, t) { - var n = t.searchFields, r = t.filterText, i = t.strict, a = !1, o = i_(n), s; + var n = t.searchFields, r = t.filterText, i = t.strict, a = !1, o = h_(n), s; try { for (o.s(); !(s = o.n()).done;) { var c = s.value; - String(nc(e, c)).toLocaleLowerCase(this.filterLocale).indexOf(r) > -1 && (a = !0); + String(fc(e, c)).toLocaleLowerCase(this.filterLocale).indexOf(r) > -1 && (a = !0); } } catch (e) { o.e(e); @@ -13604,7 +13737,7 @@ var g_ = { }, isDescendantOf: function(e, t) { if (!e || !e.children) return !1; - var n = i_(e.children), r; + var n = h_(e.children), r; try { for (n.s(); !(r = n.n()).done;) { var i = r.value; @@ -13632,7 +13765,7 @@ var g_ = { } else if (Array.isArray(t)) { if (typeof e == "string") return t.indexOf(e) !== -1; if (Array.isArray(e)) { - var n = i_(e), r; + var n = h_(e), r; try { for (n.s(); !(r = n.n()).done;) { var i = r.value; @@ -13678,7 +13811,7 @@ var g_ = { }, processTreeDrop: function(e, t) { this.dragNodeSubNodes.splice(t, 1); - var n = [].concat(a_(this.value || []), [e]); + var n = [].concat(g_(this.value || []), [e]); this.$emit("update:value", n), this.dragDropService.stopDrag({ node: e }); }, onDrop: function(e) { @@ -13714,10 +13847,10 @@ var g_ = { }, computed: { filteredValue: function() { - var e = [], t = tc(this.filterBy) ? [this.filterBy] : this.filterBy.split(","), n = this.filterValue.trim().toLocaleLowerCase(this.filterLocale), r = this.filterMode === "strict", i = i_(this.value), a; + var e = [], t = dc(this.filterBy) ? [this.filterBy] : this.filterBy.split(","), n = this.filterValue.trim().toLocaleLowerCase(this.filterLocale), r = this.filterMode === "strict", i = h_(this.value), a; try { for (i.s(); !(a = i.n()).done;) { - var o = a.value, s = f_({}, o), c = { + var o = a.value, s = C_({}, o), c = { searchFields: t, filterText: n, strict: r @@ -13742,33 +13875,33 @@ var g_ = { return ((e = this.$primevue.config) == null || (e = e.locale) == null ? void 0 : e.emptyMessage) || ""; }, containerDataP: function() { - return K({ + return q({ loading: this.loading, scrollable: this.scrollHeight === "flex" }); }, wrapperDataP: function() { - return K({ scrollable: this.scrollHeight === "flex" }); + return q({ scrollable: this.scrollHeight === "flex" }); } }, components: { - TreeNode: Qg, - InputText: ep, - InputIcon: $p, - IconField: Zp, - SearchIcon: Fp, - SpinnerIcon: dd + TreeNode: l_, + InputText: dp, + InputIcon: um, + IconField: cm, + SearchIcon: Kp, + SpinnerIcon: Sd } }; -function __(e) { +function O_(e) { "@babel/helpers - typeof"; - return __ = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { + return O_ = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; - }, __(e); + }, O_(e); } -function v_(e, t) { +function k_(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); @@ -13778,43 +13911,43 @@ function v_(e, t) { } return n; } -function y_(e) { +function A_(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] == null ? {} : arguments[t]; - t % 2 ? v_(Object(n), !0).forEach(function(t) { - b_(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : v_(Object(n)).forEach(function(t) { + t % 2 ? k_(Object(n), !0).forEach(function(t) { + j_(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : k_(Object(n)).forEach(function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); } return e; } -function b_(e, t, n) { - return (t = x_(t)) in e ? Object.defineProperty(e, t, { +function j_(e, t, n) { + return (t = M_(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } -function x_(e) { - var t = S_(e, "string"); - return __(t) == "symbol" ? t : t + ""; +function M_(e) { + var t = N_(e, "string"); + return O_(t) == "symbol" ? t : t + ""; } -function S_(e, t) { - if (__(e) != "object" || !e) return e; +function N_(e, t) { + if (O_(e) != "object" || !e) return e; var n = e[Symbol.toPrimitive]; if (n !== void 0) { var r = n.call(e, t); - if (__(r) != "object") return r; + if (O_(r) != "object") return r; throw TypeError("@@toPrimitive must return a primitive value."); } return (t === "string" ? String : Number)(e); } -var C_ = ["data-p"], w_ = ["data-p"], T_ = ["aria-labelledby", "aria-label"]; -function E_(e, t, n, r, i, a) { +var P_ = ["data-p"], F_ = ["data-p"], I_ = ["aria-labelledby", "aria-label"]; +function L_(e, t, n, r, i, a) { var o = F("SpinnerIcon"), s = F("InputText"), c = F("SearchIcon"), l = F("InputIcon"), u = F("IconField"), d = F("TreeNode"); - return R(), z("div", W({ + return z(), B("div", G({ class: e.cx("root"), onDragover: t[1] ||= function() { return a.onDragOver && a.onDragOver.apply(a, arguments); @@ -13830,42 +13963,42 @@ function E_(e, t, n, r, i, a) { }, "data-p": a.containerDataP }, e.ptmi("root")), [ - H(jo, { name: "p-overlay-mask" }, { + U(Vo, { name: "p-overlay-mask" }, { default: P(function() { - return [e.loading && e.loadingMode === "mask" ? (R(), z("div", W({ + return [e.loading && e.loadingMode === "mask" ? (z(), B("div", G({ key: 0, class: e.cx("mask") - }, e.ptm("mask")), [I(e.$slots, "loadingicon", { class: D(e.cx("loadingIcon")) }, function() { - return [e.loadingIcon ? (R(), z("i", W({ + }, e.ptm("mask")), [I(e.$slots, "loadingicon", { class: O(e.cx("loadingIcon")) }, function() { + return [e.loadingIcon ? (z(), B("i", G({ key: 0, class: [ e.cx("loadingIcon"), "pi-spin", e.loadingIcon ] - }, e.ptm("loadingIcon")), null, 16)) : (R(), B(o, W({ + }, e.ptm("loadingIcon")), null, 16)) : (z(), V(o, G({ key: 1, spin: "", class: e.cx("loadingIcon") }, e.ptm("loadingIcon")), null, 16, ["class"]))]; - })], 16)) : U("", !0)]; + })], 16)) : W("", !0)]; }), _: 3 }), - e.filter ? (R(), B(u, { + e.filter ? (z(), V(u, { key: 0, unstyled: e.unstyled, - pt: y_(y_({}, e.ptm("pcFilter")), e.ptm("pcFilterContainer")), - class: D(e.cx("pcFilterContainer")) + pt: A_(A_({}, e.ptm("pcFilter")), e.ptm("pcFilterContainer")), + class: O(e.cx("pcFilterContainer")) }, { default: P(function() { - return [H(s, { + return [U(s, { modelValue: i.filterValue, "onUpdate:modelValue": t[0] ||= function(e) { return i.filterValue = e; }, autocomplete: "off", - class: D(e.cx("pcFilterInput")), + class: O(e.cx("pcFilterInput")), placeholder: e.filterPlaceholder, unstyled: e.unstyled, onKeyup: a.onFilterKeyup, @@ -13877,13 +14010,13 @@ function E_(e, t, n, r, i, a) { "unstyled", "onKeyup", "pt" - ]), H(l, { + ]), U(l, { unstyled: e.unstyled, pt: e.ptm("pcFilterIconContainer") }, { default: P(function() { - return [I(e.$slots, e.$slots.filtericon ? "filtericon" : "searchicon", { class: D(e.cx("filterIcon")) }, function() { - return [H(c, W({ class: e.cx("filterIcon") }, e.ptm("filterIcon")), null, 16, ["class"])]; + return [I(e.$slots, e.$slots.filtericon ? "filtericon" : "searchicon", { class: O(e.cx("filterIcon")) }, function() { + return [U(c, G({ class: e.cx("filterIcon") }, e.ptm("filterIcon")), null, 16, ["class"])]; })]; }), _: 3 @@ -13894,8 +14027,8 @@ function E_(e, t, n, r, i, a) { "unstyled", "pt", "class" - ])) : U("", !0), - V("div", W({ + ])) : W("", !0), + H("div", G({ class: e.cx("wrapper"), style: { maxHeight: e.scrollHeight }, "data-p": a.wrapperDataP @@ -13905,19 +14038,19 @@ function E_(e, t, n, r, i, a) { expandedKeys: e.expandedKeys, selectionKeys: e.selectionKeys }), - a.empty ? a.empty && !a.$pcTreeSelect ? (R(), z("div", W({ + a.empty ? a.empty && !a.$pcTreeSelect ? (z(), B("div", G({ key: 1, class: e.cx("emptyMessage") }, e.ptm("emptyMessage")), [I(e.$slots, "empty", {}, function() { - return [Ua(O(a.emptyMessageText), 1)]; - })], 16)) : U("", !0) : (R(), z("ul", W({ + return [Za(k(a.emptyMessageText), 1)]; + })], 16)) : W("", !0) : (z(), B("ul", G({ key: 0, class: e.cx("rootChildren"), role: "tree", "aria-labelledby": e.ariaLabelledby, "aria-label": e.ariaLabel - }, e.ptm("rootChildren")), [(R(!0), z(L, null, di(a.valueToRender, function(t, n) { - return R(), B(d, { + }, e.ptm("rootChildren")), [(z(!0), B(L, null, _i(a.valueToRender, function(t, n) { + return z(), V(d, { key: t.key, node: t, rootNodes: a.valueToRender, @@ -13965,14 +14098,14 @@ function E_(e, t, n, r, i, a) { "unstyled", "pt" ]); - }), 128))], 16, T_)), + }), 128))], 16, I_)), I(e.$slots, "footer", { value: e.value, expandedKeys: e.expandedKeys, selectionKeys: e.selectionKeys }) - ], 16, w_) - ], 16, C_); + ], 16, F_) + ], 16, P_); } -g_.render = E_; -export { M as $, Ua as A, $r as B, L as C, B as D, V as E, Kn as F, F as G, Wn as H, Gn as I, P as J, Xn as K, jn as L, zr as M, kr as N, U as O, Qa as P, qt as Q, Qr as R, Ls as S, ho as T, di as U, R as V, I as W, je as X, Hn as Y, Me as Z, Us as _, eh as a, tn as at, Yo as b, fm as c, an as ct, Wf as d, pe as dt, Zt as et, uf as f, O as ft, Nu as g, Iu as h, jh as i, Wt as it, H as j, z as k, lp as l, on as lt, zu as m, _g as n, Ut as nt, Wm as o, j as ot, Td as p, Yn as q, ig as r, en as rt, km as s, ln as st, g_ as t, Ne as tt, ep as u, D as ut, js as v, dr as w, zs as x, As as y, Yr as z }; +D_.render = L_; +export { qn as $, Qa as A, Nn as B, L as C, V as D, H as E, co as F, Yn as G, ti as H, Eo as I, F as J, _i as K, Zn as L, U as M, Gr as N, W as O, Fr as P, P as Q, Xn as R, qs as S, To as T, ai as U, ii as V, z as W, nr as X, Gi as Y, er as Z, $s as _, dh as a, Me as at, as as b, Cm as c, Wt as ct, tp as d, dn as dt, Ae as et, xf as f, an as ft, Wu as g, k as gt, qu as h, fe as ht, Hh as i, Zt as it, Za as j, B as k, bp as l, tn as lt, Xu as m, O as mt, Og as n, qt as nt, th as o, Ut as ot, Id as p, on as pt, I as q, hg as r, N as rt, Bm as s, en as st, D_ as t, je as tt, dp as u, M as ut, Vs as v, _r as w, Ys as x, Bs as y, Ti as z }; diff --git a/dist/chunks/mjr-vue-vendor-mHY_eIVE.js b/dist/chunks/mjr-vue-vendor-CEDOnn2t.js similarity index 69% rename from dist/chunks/mjr-vue-vendor-mHY_eIVE.js rename to dist/chunks/mjr-vue-vendor-CEDOnn2t.js index f0b98348..4cbe46f1 100644 --- a/dist/chunks/mjr-vue-vendor-mHY_eIVE.js +++ b/dist/chunks/mjr-vue-vendor-CEDOnn2t.js @@ -1,4 +1,4 @@ -import { $ as e, F as t, I as n, K as r, L as i, Q as a, T as o, X as s, Z as c, et as l, nt as u, ot as d, rt as f, st as p, tt as m } from "./mjr-primevue-BRqtdXzb.js"; +import { B as e, L as t, R as n, T as r, X as i, at as a, dt as o, et as s, it as c, nt as l, ot as u, rt as d, st as f, tt as p, ut as m } from "./mjr-primevue-C07IsEdU.js"; // node_modules/pinia/dist/pinia.js var h = typeof window < "u", g, _ = (e) => g = e, v = () => t() && n(y) || g, y = Symbol(); function b(e) { @@ -86,7 +86,7 @@ function j(e, t, n, r) { } var { assign: M } = Object; function N() { - let e = s(!0), t = e.run(() => f({})), n = [], r = [], i = l({ + let e = s(!0), t = e.run(() => f({})), n = [], r = [], i = c({ install(e) { _(i), i._a = e, e.provide(y, i), e.config.globalProperties.$pinia = i, r.forEach((e) => n.push(e)), r = []; }, @@ -107,7 +107,7 @@ function F(e, t, n, r = P) { let i = () => { e.delete(t) && r(); }; - return !n && c() && m(i), i; + return !n && p() && a(i), i; } function I(e, ...t) { e.forEach((e) => { @@ -115,136 +115,136 @@ function I(e, ...t) { }); } var L = (e) => e(), R = Symbol(), z = Symbol(); -function B(t, n) { - t instanceof Map && n instanceof Map ? n.forEach((e, n) => t.set(n, e)) : t instanceof Set && n instanceof Set && n.forEach(t.add, t); - for (let r in n) { - if (!Object.hasOwn(n, r)) continue; - let i = n[r], o = t[r]; - t[r] = b(o) && b(i) && Object.hasOwn(t, r) && !e(i) && !a(i) ? B(o, i) : i; +function B(e, t) { + e instanceof Map && t instanceof Map ? t.forEach((t, n) => e.set(n, t)) : e instanceof Set && t instanceof Set && t.forEach(e.add, e); + for (let n in t) { + if (!Object.hasOwn(t, n)) continue; + let r = t[n], i = e[n]; + e[n] = b(i) && b(r) && Object.hasOwn(e, n) && !d(r) && !l(r) ? B(i, r) : r; } - return t; + return e; } var V = Symbol(); function H(e) { return !e || typeof e != "object" || !Object.hasOwn(e, V); } var { assign: U } = Object; -function W(t) { - return !!(e(t) && t.effect); +function W(e) { + return !!(d(e) && e.effect); } -function G(e, t, n, r) { - let { state: i, actions: a, getters: s } = t, c = n.state.value[e], u; - function d() { - return c || +function G(e, t, n, i) { + let { state: a, actions: s, getters: l } = t, u = n.state.value[e], d; + function f() { + return u || /* istanbul ignore if */ - (n.state.value[e] = i ? i() : {}), U(p(n.state.value[e]), a, Object.keys(s || {}).reduce((t, r) => (t[r] = l(o(() => { + (n.state.value[e] = a ? a() : {}), U(o(n.state.value[e]), s, Object.keys(l || {}).reduce((t, i) => (t[i] = c(r(() => { _(n); let t = n._s.get(e); - return s[r].call(t, t); + return l[i].call(t, t); })), t), {})); } - return u = K(e, d, t, n, r, !0), u; + return d = K(e, f, t, n, i, !0), d; } -function K(t, n, o = {}, c, l, f) { - let p, m = U({ actions: {} }, o), h = { deep: !0 }, g, v, y = /* @__PURE__ */ new Set(), b = /* @__PURE__ */ new Set(), x, S = c.state.value[t]; - !f && !S && +function K(t, n, r = {}, a, o, c) { + let f, p = U({ actions: {} }, r), h = { deep: !0 }, g, v, y = /* @__PURE__ */ new Set(), b = /* @__PURE__ */ new Set(), x, S = a.state.value[t]; + !c && !S && /* istanbul ignore if */ - (c.state.value[t] = {}); + (a.state.value[t] = {}); let C; - function w(e) { - let n; - g = v = !1, typeof e == "function" ? (e(c.state.value[t]), n = { + function w(n) { + let r; + g = v = !1, typeof n == "function" ? (n(a.state.value[t]), r = { type: "patch function", storeId: t, events: x - }) : (B(c.state.value[t], e), n = { + }) : (B(a.state.value[t], n), r = { type: "patch object", - payload: e, + payload: n, storeId: t, events: x }); - let r = C = Symbol(); - i().then(() => { - C === r && (g = !0); - }), v = !0, I(y, n, c.state.value[t]); + let i = C = Symbol(); + e().then(() => { + C === i && (g = !0); + }), v = !0, I(y, r, a.state.value[t]); } - let T = f ? function() { - let { state: e } = o, t = e ? e() : {}; + let T = c ? function() { + let { state: e } = r, t = e ? e() : {}; this.$patch((e) => { U(e, t); }); } : P; function E() { - p.stop(), y.clear(), b.clear(), c._s.delete(t); + f.stop(), y.clear(), b.clear(), a._s.delete(t); } let D = (e, n = "") => { if (R in e) return e[z] = n, e; let r = function() { - _(c); - let n = Array.from(arguments), i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(); - function o(e) { + _(a); + let n = Array.from(arguments), i = /* @__PURE__ */ new Set(), o = /* @__PURE__ */ new Set(); + function s(e) { i.add(e); } - function s(e) { - a.add(e); + function c(e) { + o.add(e); } I(b, { args: n, name: r[z], store: k, - after: o, - onError: s + after: s, + onError: c }); let l; try { l = e.apply(this && this.$id === t ? this : k, n); } catch (e) { - throw I(a, e), e; + throw I(o, e), e; } - return l instanceof Promise ? l.then((e) => (I(i, e), e)).catch((e) => (I(a, e), Promise.reject(e))) : (I(i, l), l); + return l instanceof Promise ? l.then((e) => (I(i, e), e)).catch((e) => (I(o, e), Promise.reject(e))) : (I(i, l), l); }; return r[R] = !0, r[z] = n, r; }, O = { - _p: c, + _p: a, $id: t, $onAction: F.bind(null, b), $patch: w, $reset: T, $subscribe(e, n = {}) { if (y.has(e)) return P; - let i = F(y, e, n.detached, () => a()), a = p.run(() => r(() => c.state.value[t], (r) => { + let r = F(y, e, n.detached, () => o()), o = f.run(() => i(() => a.state.value[t], (r) => { (n.flush === "sync" ? v : g) && e({ storeId: t, type: "direct", events: x }, r); }, U({}, h, n))); - return i; + return r; }, $dispose: E }, k = u(O); - c._s.set(t, k); - let A = (c._a && c._a.runWithContext || L)(() => c._e.run(() => (p = s()).run(() => n({ action: D })))); - for (let n in A) { - let r = A[n]; - e(r) && !W(r) || a(r) ? f || (S && H(r) && (e(r) ? r.value = S[n] : ((r instanceof Set || r instanceof Map) && r.clear(), B(r, S[n]))), c.state.value[t][n] = r) : typeof r == "function" && (A[n] = D(r, n), m.actions[n] = r); + a._s.set(t, k); + let A = (a._a && a._a.runWithContext || L)(() => a._e.run(() => (f = s()).run(() => n({ action: D })))); + for (let e in A) { + let n = A[e]; + d(n) && !W(n) || l(n) ? c || (S && H(n) && (d(n) ? n.value = S[e] : ((n instanceof Set || n instanceof Map) && n.clear(), B(n, S[e]))), a.state.value[t][e] = n) : typeof n == "function" && (A[e] = D(n, e), p.actions[e] = n); } - return U(k, A), U(d(k), A), Object.defineProperty(k, "$state", { - get: () => c.state.value[t], + return U(k, A), U(m(k), A), Object.defineProperty(k, "$state", { + get: () => a.state.value[t], set: (e) => { w((t) => { U(t, e); }); } - }), c._p.forEach((e) => { - let t = p.run(() => e({ + }), a._p.forEach((e) => { + let t = f.run(() => e({ store: k, - app: c._a, - pinia: c, - options: m + app: a._a, + pinia: a, + options: p })); U(k, t); - }), S && f && o.hydrate && o.hydrate(k.$state, S), g = !0, v = !0, k; + }), S && c && r.hydrate && r.hydrate(k.$state, S), g = !0, v = !0, k; } function q(e, r, i) { let a, o = typeof r == "function"; diff --git a/dist/chunks/model3dRenderer-BnFOXFbn.js b/dist/chunks/model3dRenderer-BnFOXFbn.js deleted file mode 100644 index 255406b4..00000000 --- a/dist/chunks/model3dRenderer-BnFOXFbn.js +++ /dev/null @@ -1,1466 +0,0 @@ -import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, mt as n, o as r, r as i } from "./events-C65wdOHm.js"; -import { n as a } from "./state-D0Gu1AgG.js"; -// ui/features/viewer/model3dCore.ts -function o(e, t) { - if (e && typeof t == "function") try { - e.traverse?.((e) => { - (e?.isMesh || e?.isPoints || e?.isLine) && t(e); - }); - } catch (e) { - console.debug?.(e); - } -} -function s(e) { - let t = !1; - try { - e.traverse?.((e) => { - !t && e?.isSkinnedMesh && (e.skeleton?.bones?.length ?? 0) > 0 && (t = !0); - }); - } catch (e) { - console.debug?.(e); - } - return t; -} -function c(e) { - let t = /* @__PURE__ */ new Map(); - return o(e, (e) => { - t.set(e.uuid, e.material); - }), t; -} -function l(e, t, n, r, i) { - o(t, (t) => { - try { - if (n === "original") { - let e = r?.get(t.uuid); - e !== void 0 && (t.material = e); - } else if (n === "normal" && t.isMesh) { - let n = new e.MeshNormalMaterial({ side: e.DoubleSide }); - i?.add(n), t.material = n; - } else if (n === "depth" && t.isMesh) { - let n = new e.MeshDepthMaterial(); - i?.add(n), t.material = n; - } else if (n === "wireframe" && t.isMesh) { - let n = new e.MeshBasicMaterial({ - color: 9489145, - wireframe: !0 - }); - i?.add(n), t.material = n; - } else if (n === "pointcloud") { - let n = !!t.geometry?.getAttribute?.("color"), r = new e.PointsMaterial({ - size: .012, - sizeAttenuation: !0, - vertexColors: n, - color: n ? 16777215 : 9489145 - }); - i?.add(r), t.material = r; - } - } catch (e) { - console.debug?.(e); - } - }); -} -function u(e) { - if (e) { - for (let t of e) try { - t?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - e.clear(); - } -} -function d(e, t) { - try { - if (t === "gltf" || t === "fbx") return Array.isArray(e?.animations) ? e.animations : []; - } catch (e) { - console.debug?.(e); - } - return []; -} -function f(e, t) { - let n = new e.Box3().setFromObject(t); - if (n.isEmpty()) return null; - let r = n.getSize(new e.Vector3()), i = n.getCenter(new e.Vector3()), a = Math.max(r.x, r.y, r.z, .01); - return { - box: n, - size: r, - center: i, - maxDim: a, - radius: Math.max(a * .72, .5) - }; -} -function p(e, t, n, r) { - if (!r || !t || !n) return; - let i = t.fov * (Math.PI / 180), a = r.maxDim / (2 * Math.tan(i / 2)) * 1.55, o = new e.Vector3(1, .8, 1).normalize(); - t.position.copy(r.center).addScaledVector(o, a), t.near = Math.max(.01, a / 250), t.far = Math.max(1e3, a * 60), t.updateProjectionMatrix(), n.target.copy(r.center), n.minDistance = Math.max(.01, a / 25), n.maxDistance = Math.max(10, a * 12), n.minZoom = .25, n.maxZoom = 12, n.update(); -} -function m(e, t, n, r) { - if (!n || !e || !t) return null; - let i = Math.max(1e-4, Number(r) || 1), a = Math.max(n.maxDim * 1.9, 2), o = a * i; - return e.left = -o / 2, e.right = o / 2, e.top = a / 2, e.bottom = -a / 2, e.near = -Math.max(1e3, n.maxDim * 40), e.far = Math.max(1e3, n.maxDim * 40), e.zoom = 1, e.position.copy(n.center).add({ - x: n.radius * 2.1, - y: n.radius * 1.6, - z: n.radius * 2.1 - }), e.updateProjectionMatrix(), t.target.copy(n.center), t.minZoom = .25, t.maxZoom = 12, t.minDistance = 0, t.maxDistance = Math.max(10, n.maxDim * 12), t.update(), a; -} -function h(e, t, n) { - if (!n) return null; - if (t === "gltf") return n.scene || null; - if (t === "obj" || t === "fbx") return n; - if (t === "stl" || t === "ply") { - let r = n; - if (r?.computeVertexNormals) try { - r.computeVertexNormals(); - } catch (e) { - console.debug?.(e); - } - let i = !!r?.getAttribute?.("normal"), a = !!r?.getAttribute?.("color"); - return t === "ply" && !i ? new e.Points(r, new e.PointsMaterial({ - size: .02, - sizeAttenuation: !0, - vertexColors: a, - color: a ? 16777215 : 9489145 - })) : new e.Mesh(r, new e.MeshStandardMaterial({ - color: a ? 16777215 : 14212841, - metalness: .08, - roughness: .72, - vertexColors: a - })); - } - return null; -} -// ui/features/viewer/model3dLoaders.ts -var g = "/mjr/am/vendor/three", _ = null; -function v(e, t, n) { - switch (t) { - case "gltf": return new e.GLTFLoader(n); - case "obj": return new e.OBJLoader(n); - case "fbx": return new e.FBXLoader(n); - case "stl": return new e.STLLoader(n); - case "ply": return new e.PLYLoader(n); - default: return null; - } -} -function ee(e, t, n) { - return new Promise((t, r) => { - !e || !n ? r(/* @__PURE__ */ Error("Missing loader or URL")) : typeof e.loadAsync == "function" ? e.loadAsync(n).then(t).catch(r) : e.load(n, t, void 0, r); - }); -} -function te() { - return _ || (_ = Promise.all([ - import( - /* @vite-ignore */ - `${g}/three.module.js` -), - import( - /* @vite-ignore */ - `${g}/addons/controls/OrbitControls.js` -), - import( - /* @vite-ignore */ - `${g}/addons/loaders/GLTFLoader.js` -), - import( - /* @vite-ignore */ - `${g}/addons/loaders/FBXLoader.js` -), - import( - /* @vite-ignore */ - `${g}/addons/loaders/OBJLoader.js` -), - import( - /* @vite-ignore */ - `${g}/addons/loaders/MTLLoader.js` -), - import( - /* @vite-ignore */ - `${g}/addons/loaders/STLLoader.js` -), - import( - /* @vite-ignore */ - `${g}/addons/loaders/PLYLoader.js` -) - ]).then(([e, t, n, r, i, a, o, s]) => ({ - THREE: e, - OrbitControls: t.OrbitControls, - GLTFLoader: n.GLTFLoader, - FBXLoader: r.FBXLoader, - OBJLoader: i.OBJLoader, - MTLLoader: a.MTLLoader, - STLLoader: o.STLLoader, - PLYLoader: s.PLYLoader - })), _); -} -// ui/features/viewer/processorUtils.ts -function y(e, t, n) { - try { - let r = Number(e) || 0, i = (Number(t) || 0) * (Number(n) || 0); - return !(i > 0) || !(r > 0) || i <= r ? 1 : Math.max(.05, Math.min(1, Math.sqrt(r / i))); - } catch { - return 1; - } -} -// ui/features/viewer/imageProcessor.ts -function b(e, t, n) { - if (!e) return; - try { - e.width > 1 && e.height > 1 || (e.width = 960, e.height = 540); - } catch (e) { - console.debug?.(e); - } - let r = (() => { - try { - return e.getContext?.("2d"); - } catch { - return null; - } - })(); - if (r) { - try { - r.save(); - } catch (e) { - console.debug?.(e); - } - try { - r.fillStyle = "rgba(0,0,0,0.85)", r.fillRect(0, 0, e.width, e.height); - } catch (e) { - console.debug?.(e); - } - try { - r.fillStyle = "rgba(255, 120, 120, 0.95)", r.font = "14px system-ui, -apple-system, Segoe UI, Roboto, sans-serif", r.textBaseline = "top"; - let e = t ? String(t) : "Failed to load media"; - r.fillText(e, 14, 14), r.fillStyle = "rgba(255,255,255,0.7)"; - let i = n == null ? "Check file permissions / path, or try re-indexing." : String(n); - r.fillText(i, 14, 34); - } catch (e) { - console.debug?.(e); - } - try { - r.restore(); - } catch (e) { - console.debug?.(e); - } - } -} -function x({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: i, maxProcPixels: o, onReady: s } = {}) { - let c = new Image(); - try { - c.decoding = "async"; - } catch (e) { - console.debug?.(e); - } - try { - c.crossOrigin = "anonymous"; - } catch (e) { - console.debug?.(e); - } - let l = (() => { - try { - return e.getContext("2d", { willReadFrequently: !0 }); - } catch { - return null; - } - })(), u = document.createElement("canvas"), d = (() => { - try { - return u.getContext("2d", { willReadFrequently: !0 }); - } catch { - return null; - } - })(), f = { - jobId: 0, - lastParams: null, - ready: !1, - _destroyed: !1, - _rafId: null, - _connectRAF: null, - _connectTries: 0, - _pendingParams: null, - _buffer: null - }, p = () => { - if (!f._destroyed) { - try { - if (e?.isConnected) { - f._connectRAF = null, f._connectTries = 0; - let e = f._pendingParams; - f._pendingParams = null, e && v(e); - return; - } - } catch (e) { - console.debug?.(e); - } - if (f._connectRAF == null) { - if (f._connectTries = (Number(f._connectTries) || 0) + 1, f._connectTries > 20) f._connectRAF = null, f._connectTries = 0, f._pendingParams = null; - else try { - f._connectRAF = requestAnimationFrame(() => { - f._connectRAF = null, p(); - }); - } catch { - f._connectRAF = null; - } - } - } - }, m = (e, t) => y(o, e, t), h = () => { - if (f.srcData) return f.srcData; - if (!d || !f.ready) return null; - try { - let e = u.width, t = u.height; - return e > 0 && t > 0 ? (f.srcData = d.getImageData(0, 0, e, t), f.srcData) : null; - } catch { - return null; - } - }, g = (e, t) => { - try { - let n = Number(e) || 0, r = Number(t) || 0; - if (!(f.naturalW > 0 && f.naturalH > 0)) return null; - let i = Math.max(0, Math.min(u.width - 1, Math.floor(n * f.scale))), a = Math.max(0, Math.min(u.height - 1, Math.floor(r * f.scale))), o = h(); - if (!o?.data) return null; - let s = (a * u.width + i) * 4, c = o.data[s] ?? 0, l = o.data[s + 1] ?? 0, d = o.data[s + 2] ?? 0, p = o.data[s + 3] ?? 255, m = [ - c / 255, - l / 255, - d / 255, - p / 255 - ], g = 2 ** (Number(f.lastParams?.exposureEV) || 0); - return { - r: c, - g: l, - b: d, - a: p, - raw: m, - lin: [ - m[0] * g, - m[1] * g, - m[2] * g, - m[3] - ], - scale: f.scale - }; - } catch { - return null; - } - }, _ = (t, i) => { - if (!l || f._destroyed) return; - if (!e?.isConnected) { - try { - f._pendingParams = i || f.lastParams || n?.() || null; - } catch (e) { - console.debug?.(e); - } - p(); - return; - } - if (t !== f.jobId) return; - let o = h(); - if (!o?.data) return; - let s = u.width, c = u.height; - if (!(s > 0 && c > 0)) return; - try { - let t = i || n?.() || {}; - if (typeof r == "function" && r(t)) { - l.clearRect(0, 0, e.width, e.height), l.drawImage(u, 0, 0); - return; - } - } catch (e) { - console.debug?.(e); - } - let d = f._buffer; - if (!d || d.width !== s || d.height !== c) try { - d = l.createImageData(s, c), f._buffer = d; - } catch { - try { - d = new ImageData(s, c), f._buffer = d; - } catch { - return; - } - } - if (!d) return; - let m = i || n?.() || {}, g = Number(m.exposureEV) || 0, _ = 1 / Math.max(.1, Math.min(3, Number(m.gamma) || 1)), v = String(m.channel || "rgb"), ee = String(m.analysisMode || "none"), te = a(m.zebraThreshold ?? .95), y = 2 ** g, b = /* @__PURE__ */ new Float32Array(256); - for (let e = 0; e < 256; e++) b[e] = (e / 255) ** _; - let x = d.data, S = o.data, C = s * c * 4, w = 0, T = () => { - if (f._destroyed || !e?.isConnected || t !== f.jobId) return; - let n = Math.min(C, w + 22e4); - for (; w < n; w += 4) { - let e = (S[w] ?? 0) / 255, t = (S[w + 1] ?? 0) / 255, n = (S[w + 2] ?? 0) / 255, r = (S[w + 3] ?? 255) / 255, i = e * y, o = t * y, c = n * y, l = .2126 * i + .7152 * o + .0722 * c; - if (ee === "zebra") { - if (a(l) >= te) { - let e = (Math.floor(w / 4) % s + Math.floor(w / 4 / s) & 7) < 3; - i = +!!e, o = +!!e, c = +!!e; - } else i = b[a(i) * 255 + .5 | 0], o = b[a(o) * 255 + .5 | 0], c = b[a(c) * 255 + .5 | 0]; - } else i = b[a(i) * 255 + .5 | 0], o = b[a(o) * 255 + .5 | 0], c = b[a(c) * 255 + .5 | 0]; - if (v === "r") o = i, c = i; - else if (v === "g") i = o, c = o; - else if (v === "b") i = c, o = c; - else if (v === "a") i = r, o = r, c = r; - else if (v === "l") { - let e = a(l), t = b[e * 255 + .5 | 0]; - i = t, o = t, c = t; - } - x[w] = Math.round(a(i) * 255), x[w + 1] = Math.round(a(o) * 255), x[w + 2] = Math.round(a(c) * 255), x[w + 3] = 255; - } - if (w < C) try { - f._rafId = requestAnimationFrame(T); - } catch (e) { - console.debug?.(e); - } - else try { - l.putImageData(d, 0, 0); - } catch (e) { - console.debug?.(e); - } - }; - try { - f._rafId = requestAnimationFrame(T); - } catch (e) { - console.debug?.(e); - } - }, v = (t) => { - if (f._destroyed) return; - if (f.lastParams = t || f.lastParams || n?.() || null, !e?.isConnected) { - try { - f._pendingParams = f.lastParams; - } catch (e) { - console.debug?.(e); - } - p(); - return; - } - f.jobId++; - let r = f.jobId; - try { - _(r, f.lastParams); - } catch (e) { - console.debug?.(e); - } - }, ee = () => { - if (!f._destroyed) try { - if (f.naturalW = Number(c.naturalWidth) || 0, f.naturalH = Number(c.naturalHeight) || 0, !(f.naturalW > 0 && f.naturalH > 0)) return; - f.scale = m(f.naturalW, f.naturalH); - let t = Math.max(1, Math.round(f.naturalW * f.scale)), r = Math.max(1, Math.round(f.naturalH * f.scale)); - u.width = t, u.height = r, e.width = t, e.height = r, e._mjrNaturalW = f.naturalW, e._mjrNaturalH = f.naturalH, e._mjrPixelScale = f.scale; - try { - d?.clearRect(0, 0, t, r), d?.drawImage(c, 0, 0, t, r); - } catch (e) { - console.debug?.(e); - } - f.ready = !0, f.srcData = null, h(), v(f.lastParams || n?.()); - } finally { - try { - s?.({ - naturalW: f.naturalW, - naturalH: f.naturalH, - pixelScale: f.scale - }); - } catch (e) { - console.debug?.(e); - } - } - }, te = () => { - f.ready = !1; - try { - b(e, "Failed to load image"); - } catch (e) { - console.debug?.(e); - } - }; - try { - c.onload = ee, c.onerror = te; - } catch (e) { - console.debug?.(e); - } - try { - c.src = t; - } catch (e) { - console.debug?.(e); - } - return { - setParams: v, - sampleAtOriginal: g, - getInfo: () => ({ ...f }), - destroy: () => { - f._destroyed = !0; - try { - f.jobId++; - } catch (e) { - console.debug?.(e); - } - try { - f._rafId != null && cancelAnimationFrame(f._rafId); - } catch (e) { - console.debug?.(e); - } - try { - f._connectRAF != null && cancelAnimationFrame(f._connectRAF); - } catch (e) { - console.debug?.(e); - } - f._connectRAF = null, f._connectTries = 0, f._pendingParams = null; - try { - c.onload = null, c.onerror = null; - } catch (e) { - console.debug?.(e); - } - try { - c.src = ""; - } catch (e) { - console.debug?.(e); - } - try { - u.width = 0, u.height = 0; - } catch (e) { - console.debug?.(e); - } - try { - e.width = 0, e.height = 0; - } catch (e) { - console.debug?.(e); - } - f.srcData = null, f._buffer = null; - } - }; -} -// ui/features/viewer/model3dSupport.ts -var S = [ - .25, - .5, - 1, - 1.5, - 2 -], C = 44; -function w(e, { preventDefault: t = !1, immediate: n = !1 } = {}) { - if (e) { - try { - t && e.preventDefault?.(); - } catch (e) { - console.debug?.(e); - } - try { - e.stopPropagation?.(), n && e.stopImmediatePropagation?.(); - } catch (e) { - console.debug?.(e); - } - } -} -function T(e) { - let t = Math.max(0, Number(e) || 0), n = Math.floor(t / 60), r = Math.floor(t % 60); - return n > 0 ? `${n}:${String(r).padStart(2, "0")}` : `${Math.floor(t)}s`; -} -function E(e, n) { - let r = document.createElement("button"); - return r.type = "button", r.textContent = String(e || ""), r.title = String(n || e || ""), r.setAttribute("aria-label", String(n || e || t("model3d.viewportAction", "3D viewport action"))), r.style.cssText = "height:28px;padding:0 10px;border-radius:999px;border:1px solid rgba(255,255,255,0.16);background:rgba(13,15,20,0.78);color:rgba(255,255,255,0.92);font:600 11px system-ui,sans-serif;letter-spacing:0.02em;cursor:pointer;backdrop-filter:blur(8px);display:inline-flex;align-items:center;justify-content:center;box-shadow:0 4px 18px rgba(0,0,0,0.24)", r; -} -function D(e, t) { - if (!e) return; - let n = !!t; - e.dataset.active = n ? "1" : "0", e.style.background = n ? "rgba(76,175,80,0.18)" : "rgba(13,15,20,0.78)", e.style.borderColor = n ? "rgba(76,175,80,0.42)" : "rgba(255,255,255,0.16)", e.style.color = n ? "rgba(230,255,235,0.96)" : "rgba(255,255,255,0.92)"; -} -function O(e, n, r = "", i = "#4CAF50") { - if (!e) return; - try { - let t = Math.max(480, Number(e.width) || 960), n = Math.max(270, Number(e.height) || 540); - e.width = t, e.height = n; - } catch (e) { - console.debug?.(e); - } - let a = (() => { - try { - return e.getContext("2d"); - } catch { - return null; - } - })(); - if (!a) return; - let o = Number(e.width) || 960, s = Number(e.height) || 540, c = o / 2, l = s / 2; - try { - let e = a.createLinearGradient(0, 0, o, s); - e.addColorStop(0, "#0f1419"), e.addColorStop(1, "#11181f"), a.fillStyle = e, a.fillRect(0, 0, o, s), a.save(), a.translate(c, l - 32), a.strokeStyle = i, a.lineWidth = 3, a.globalAlpha = .95, a.beginPath(), a.moveTo(0, -44), a.lineTo(42, -22), a.lineTo(42, 22), a.lineTo(0, 44), a.lineTo(-42, 22), a.lineTo(-42, -22), a.closePath(), a.stroke(), a.beginPath(), a.moveTo(0, -44), a.lineTo(0, 0), a.lineTo(42, 22), a.moveTo(0, 0), a.lineTo(-42, 22), a.moveTo(-42, -22), a.lineTo(0, 0), a.moveTo(42, -22), a.lineTo(0, 0), a.stroke(), a.restore(), a.fillStyle = "rgba(255,255,255,0.94)", a.font = "600 18px system-ui, sans-serif", a.textAlign = "center", a.textBaseline = "middle", a.fillText(String(n || t("model3d.preview", "3D preview")), c, l + 44), r && (a.fillStyle = "rgba(255,255,255,0.62)", a.font = "13px system-ui, sans-serif", a.fillText(String(r), c, l + 72)); - } catch (i) { - console.debug?.(i); - try { - b(e, n, r || t("model3d.unavailable", "3D viewer unavailable")); - } catch (e) { - console.debug?.(e); - } - } -} -function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSkeleton: i } = {}) { - let a = document.createElement("div"); - a.className = "mjr-model3d-settings", a.style.cssText = "position:absolute;right:0;top:44px;width:210px;max-height:calc(100% - 100px);overflow-y:auto;background:rgba(14,18,26,0.96);border:1px solid rgba(255,255,255,0.10);border-right:none;border-radius:10px 0 0 10px;padding:10px 10px 12px 10px;z-index:4;display:none;box-shadow:-6px 4px 24px rgba(0,0,0,0.5);backdrop-filter:blur(12px);font:13px system-ui,sans-serif;color:rgba(255,255,255,0.88);scrollbar-width:thin", [ - "pointerdown", - "pointermove", - "pointerup", - "mousedown", - "mousemove", - "mouseup", - "wheel", - "click", - "contextmenu", - "dragstart", - "dragover", - "drop" - ].forEach((e) => { - a.addEventListener(e, (e) => w(e, { preventDefault: !1 })); - }); - let o = (e) => { - let t = document.createElement("div"); - t.style.cssText = "font:700 10px system-ui,sans-serif;letter-spacing:0.08em;color:rgba(255,255,255,0.40);text-transform:uppercase;margin:10px 0 6px 0", t.textContent = e, a.appendChild(t); - let n = document.createElement("div"); - n.style.cssText = "height:1px;background:rgba(255,255,255,0.07);margin-bottom:8px;", a.appendChild(n); - }, s = (e, t) => { - let n = document.createElement("div"); - n.style.cssText = "display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;gap:6px;"; - let r = document.createElement("span"); - return r.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.65);white-space:nowrap;flex-shrink:0;", r.textContent = e, n.appendChild(r), n.appendChild(t), a.appendChild(n), n; - }, c = (e, t) => { - let n = document.createElement("select"); - n.style.cssText = "background:rgba(25,30,42,0.95);color:rgba(255,255,255,0.88);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 5px;font:11px system-ui,sans-serif;cursor:pointer;flex:1;min-width:0"; - for (let [r, i] of e) { - let e = document.createElement("option"); - e.value = r, e.textContent = i, r === t && (e.selected = !0), n.appendChild(e); - } - return n; - }, l = (e, t, n, r) => { - let i = document.createElement("div"); - i.style.cssText = "display:flex;align-items:center;gap:5px;flex:1;"; - let a = document.createElement("input"); - a.type = "range", a.min = String(e), a.max = String(t), a.step = String(n), a.value = String(r), a.style.cssText = "flex:1;cursor:pointer;accent-color:#4CAF50;height:3px;"; - let o = document.createElement("span"); - return o.style.cssText = "font:11px system-ui,sans-serif;color:rgba(255,255,255,0.45);min-width:26px;text-align:right;", o.textContent = String(r), a.addEventListener("input", () => { - o.textContent = a.value; - }), i.appendChild(a), i.appendChild(o), { - wrap: i, - slider: a, - valLbl: o - }; - }; - o("Scene"); - let u = document.createElement("input"); - u.type = "color", u.value = e || "#282828", u.style.cssText = "width:34px;height:24px;cursor:pointer;border:1px solid rgba(255,255,255,0.18);border-radius:4px;padding:1px;background:none;flex-shrink:0;", s(t("model3d.background", "Background"), u), o("Model"); - let d = c([ - ["original", "Original"], - ["normal", "Normal map"], - ["depth", "Depth"], - ["wireframe", "Wireframe"], - ["pointcloud", "Point cloud"] - ], "original"); - s(t("model3d.material", "Material"), d); - let f = c([ - ["original", "Original"], - ["+y", "+Y (default)"], - ["-y", "-Y"], - ["+z", "+Z (CAD)"], - ["-z", "-Z"], - ["+x", "+X"], - ["-x", "-X"] - ], "original"); - s("Up", f); - let p = null, m = null; - i && (m = document.createElement("input"), m.type = "checkbox", m.checked = !1, m.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;", p = s(t("model3d.skeleton", "Skeleton"), m)), o("Camera"); - let h = l(15, 120, 1, n ?? 75); - s("FOV", h.wrap), o(t("model3d.lights", "Lights")); - let g = l(0, 5, .1, r ?? 1); - return s(t("model3d.intensity", "Intensity"), g.wrap), { - panel: a, - bgInput: u, - materialSel: d, - upSel: f, - skeletonToggle: m, - skeletonRow: p, - fovSlider: h.slider, - fovValLbl: h.valLbl, - lightSlider: g.slider, - lightValLbl: g.valLbl - }; -} -function re() { - let e = document.createElement("div"); - e.className = "mjr-model3d-anim-bar", e.style.cssText = [ - "position:absolute", - "bottom:0", - "left:0", - "right:0", - `height:${C}px`, - "display:none", - "align-items:center", - "gap:7px", - "padding:0 10px", - "background:rgba(10,13,20,0.90)", - "backdrop-filter:blur(10px)", - "border-top:1px solid rgba(255,255,255,0.07)", - "z-index:3" - ].join(";"), [ - "pointerdown", - "pointermove", - "pointerup", - "mousedown", - "mousemove", - "mouseup", - "wheel", - "click" - ].forEach((t) => { - e.addEventListener(t, (e) => w(e, { preventDefault: !1 })); - }); - let n = document.createElement("button"); - n.type = "button", n.textContent = t("model3d.play", "Play"), n.title = t("model3d.playPause", "Play / Pause"), n.style.cssText = "width:28px;height:28px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(76,175,80,0.14);color:rgba(255,255,255,0.92);font:600 12px system-ui,sans-serif;cursor:pointer;flex-shrink:0;padding:0;line-height:1;display:flex;align-items:center;justify-content:center"; - let r = document.createElement("select"); - r.title = t("model3d.playbackSpeed", "Playback speed"), r.style.cssText = "background:rgba(20,24,34,0.9);color:rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 4px;font:11px system-ui,sans-serif;cursor:pointer;width:52px;flex-shrink:0"; - for (let e of S) { - let t = document.createElement("option"); - t.value = String(e), t.textContent = `${e}x`, e === 1 && (t.selected = !0), r.appendChild(t); - } - let i = document.createElement("select"); - i.title = "Animation clip", i.style.cssText = "background:rgba(20,24,34,0.9);color:rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 5px;font:11px system-ui,sans-serif;cursor:pointer;max-width:130px;flex-shrink:1;min-width:0"; - let a = document.createElement("input"); - a.type = "range", a.min = "0", a.max = "1000", a.value = "0", a.style.cssText = "flex:1;min-width:50px;cursor:pointer;accent-color:#4CAF50;height:3px;"; - let o = document.createElement("span"); - return o.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.45);white-space:nowrap;flex-shrink:0", o.textContent = "0s / 0s", e.appendChild(n), e.appendChild(r), e.appendChild(i), e.appendChild(a), e.appendChild(o), { - bar: e, - playBtn: n, - speedSel: r, - animSel: i, - progressSlider: a, - timeLbl: o - }; -} -// ui/features/viewer/model3dRenderer.impl.ts -var ie = Object.freeze({ - ".gltf": "gltf", - ".glb": "gltf", - ".obj": "obj", - ".fbx": "fbx", - ".stl": "stl", - ".ply": "ply", - ".splat": "splat", - ".ksplat": "splat", - ".spz": "splat" -}), k = new Set(Object.keys(ie)), ae = /* @__PURE__ */ new Set([ - "gltf", - "obj", - "fbx", - "stl", - "ply" -]), oe = "#282828", se = t("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"), A = Object.freeze({ - PERSPECTIVE: "perspective", - ORTHOGRAPHIC: "orthographic" -}); -Object.freeze({ - ORIGINAL: "original", - NORMAL: "normal", - DEPTH: "depth", - WIREFRAME: "wireframe", - POINTCLOUD: "pointcloud" -}); -var ce = Object.freeze({ - original: [ - 0, - 0, - 0 - ], - "+y": [ - 0, - 0, - 0 - ], - "-y": [ - Math.PI, - 0, - 0 - ], - "+z": [ - -Math.PI / 2, - 0, - 0 - ], - "-z": [ - Math.PI / 2, - 0, - 0 - ], - "+x": [ - 0, - 0, - Math.PI / 2 - ], - "-x": [ - 0, - 0, - -Math.PI / 2 - ] -}), le = 75, ue = 1, j = Object.freeze({ - ambient: .5, - main: .8, - fill: .3, - back: .3, - rim: .3, - bottom: .2 -}); -function de(e) { - try { - let t = String(e?.ext || "").trim().toLowerCase(); - if (t) return t.startsWith(".") ? t : `.${t}`; - } catch (e) { - console.debug?.(e); - } - try { - let t = String(e?.filename || e?.filepath || e?.path || "").trim(), n = t.lastIndexOf("."); - return n >= 0 ? t.slice(n).toLowerCase() : ""; - } catch (e) { - console.debug?.(e); - } - return ""; -} -function fe(e) { - let t = String(e || "").trim(); - return t ? t.startsWith("/") || /^[a-z][\w+\-.]*:/i.test(t) : !1; -} -function pe(e) { - return String(e?.loader || e?.viewer_info?.loader || "").trim().toLowerCase() || ie[de(e)] || ""; -} -function me(e) { - return String(e?.kind || "").toLowerCase() === "model3d" || k.has(de(e)); -} -function he(e) { - return pe(e) || "gltf"; -} -function M() { - return se; -} -function N(e) { - try { - if (e?.classList?.contains?.("mjr-model3d-render-canvas")) return e; - } catch (e) { - console.debug?.(e); - } - try { - return e?.querySelector?.(".mjr-model3d-render-canvas") || null; - } catch { - return null; - } -} -function P(e) { - try { - return !!e?.closest?.(".mjr-model3d-host, .mjr-viewer-model3d-host, .mjr-mfv-model3d-host"); - } catch { - return !1; - } -} -function ge(e, t) { - let n = t || { - ROTATE: 0, - DOLLY: 1, - PAN: 2 - }; - return { - LEFT: n.ROTATE, - MIDDLE: n.DOLLY, - RIGHT: n.PAN - }; -} -function F(e, a, o = {}) { - let g = o?.pauseDuringExecution == null ? !!r?.VIEWER_PAUSE_DURING_EXECUTION : !!o.pauseDuringExecution, _ = document.createElement("div"); - _.className = o.hostClassName || "mjr-model3d-host mjr-viewer-model3d-host", _.style.cssText = o.hostStyle || "width:100%;height:100%;display:flex;align-items:stretch;justify-content:stretch;position:relative;overflow:hidden;border-radius:12px;background:radial-gradient(circle at top, rgba(76,175,80,0.10), rgba(0,0,0,0) 42%), linear-gradient(180deg, rgba(40,40,40,0.98), rgba(19,22,28,0.99));box-shadow:inset 0 0 0 1px rgba(255,255,255,0.06)", _.setAttribute("data-capture-wheel", "true"), _.tabIndex = -1; - let y = document.createElement("canvas"); - y.className = o.canvasClassName || "mjr-viewer-media mjr-model3d-render-canvas", y.style.cssText = o.canvasStyle || "display:block;width:100%;height:100%;max-width:100%;max-height:100%;outline:none;touch-action:none", y.tabIndex = 0, y._mjrDisableViewerTransform = o.disableViewerTransform !== !1; - try { - e?.id != null && (y.dataset.mjrAssetId = String(e.id)); - } catch (e) { - console.debug?.(e); - } - _.appendChild(y); - let b = document.createElement("canvas"); - b.className = "mjr-model3d-status", b.style.cssText = "position:absolute;inset:0;display:block;width:100%;height:100%;pointer-events:none;z-index:1", _.appendChild(b); - let x = de(e).replace(".", "").toUpperCase(); - if (x) { - let e = document.createElement("div"); - e.className = "mjr-model3d-badge", e.textContent = x, e.style.cssText = "position:absolute;top:10px;left:10px;padding:4px 8px;border-radius:999px;font:700 10px system-ui,sans-serif;letter-spacing:0.08em;color:#fff;background:rgba(76,175,80,0.9);pointer-events:none;z-index:2", _.appendChild(e); - } - let S = document.createElement("div"); - S.className = "mjr-model3d-toolbar", S.style.cssText = "position:absolute;top:10px;right:10px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:none;z-index:5"; - let C = document.createElement("div"); - C.style.cssText = "display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:auto;"; - let ie = E(t("model3d.reset", "Reset"), t("model3d.resetView", "Reset 3D view")), k = E(t("model3d.grid", "Grid"), t("model3d.toggleGrid", "Toggle grid")), pe = E(t("model3d.persp", "Persp"), t("model3d.switchCamera", "Switch perspective / orthographic")), me = E(t("model3d.settings", "Settings"), t("model3d.settings", "Settings")); - C.append(ie, k, pe, me), S.appendChild(C), _.appendChild(S); - let M = document.createElement("div"); - M.className = "mjr-model3d-hint", M.textContent = o.hintText || se, M.style.cssText = "position:absolute;right:10px;bottom:10px;padding:5px 10px;border-radius:999px;font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.75);background:rgba(0,0,0,0.35);backdrop-filter:blur(6px);pointer-events:none;z-index:2;transition:bottom 0.2s", _.appendChild(M); - let N = ne({ - defaultBgColor: oe, - defaultFov: le, - defaultLightIntensity: ue, - hasSkeleton: !1 - }); - _.appendChild(N.panel); - let P = re(); - _.appendChild(P.bar); - let F = !1, _e = null, I = null, L = null, R = null, z = null, B = null, V = null, H = null, U = null, ve = null, ye = !1, be = null, xe = null, W = null, G = null, Se = null, K = null, Ce = 0, q = A.PERSPECTIVE, we = /* @__PURE__ */ new Map(), Te = /* @__PURE__ */ new Set(), J = null, Ee = !1, De = null, Oe = [], Y = ue, X = null, ke = null, Z = [], Q = [], $ = 0, Ae = 1, je = !1, Me = !1, Ne = !1, Pe = String(e?.filename || "3D model"), Fe = () => { - try { - o.scheduleOverlayRedraw?.(); - } catch (e) { - console.debug?.(e); - } - }, Ie = (e, t = "", n = "#4CAF50") => { - be = { - title: e, - hintText: t, - accent: n - }, b.style.display = "block", O(b, e, t, n); - }, Le = () => { - be = null, b.style.display = "none"; - }, Re = () => { - try { - let e = _.getBoundingClientRect(); - y._mjrNaturalW = Math.max(1, Math.round(e.width || y.width || 1)), y._mjrNaturalH = Math.max(1, Math.round(e.height || y.height || 1)); - } catch (e) { - console.debug?.(e); - } - try { - be && O(b, be.title, be.hintText, be.accent); - } catch (e) { - console.debug?.(e); - } - }, ze = (e, t) => { - if (!V || !(Ce > 0)) return; - let n = Math.max(1e-4, (Number(e) || 1) / Math.max(1, Number(t) || 1)), r = Ce * n; - V.left = -r / 2, V.right = r / 2, V.top = Ce / 2, V.bottom = -Ce / 2, V.updateProjectionMatrix(); - }, Be = () => { - if (G && H && K) { - if (q === A.ORTHOGRAPHIC) { - let e = _.getBoundingClientRect(); - Ce = m(V, H, K, Math.max(1e-4, (e.width || 1) / Math.max(1, e.height || 1))) || Ce, z = V; - } else p(I, B, H, K), z = B; - try { - H.object = z, H.update(); - } catch (e) { - console.debug?.(e); - } - } - }, Ve = (e, { refit: t = !0 } = {}) => { - q = e === A.ORTHOGRAPHIC ? A.ORTHOGRAPHIC : A.PERSPECTIVE, z = q === A.ORTHOGRAPHIC ? V : B; - try { - H && (H.object = z); - } catch (e) { - console.debug?.(e); - } - if (t) Be(); - else { - try { - z?.updateProjectionMatrix?.(); - } catch (e) { - console.debug?.(e); - } - try { - H?.update?.(); - } catch (e) { - console.debug?.(e); - } - } - Xe(), Fe(); - }, He = (e) => { - Y = Math.max(0, Math.min(10, Number(e) || 0)); - try { - De && (De.intensity = j.ambient * Y); - } catch (e) { - console.debug?.(e); - } - let t = [ - j.main, - j.back, - j.fill, - j.fill, - j.bottom - ]; - Oe.forEach((e, n) => { - try { - e && (e.intensity = (t[n] ?? j.fill) * Y); - } catch (e) { - console.debug?.(e); - } - }); - }, Ue = (e) => { - Se && I && (u(Te), l(I, Se, e, we, Te), Fe()); - }, We = (e) => { - if (!G) return; - let t = ce[e] || [ - 0, - 0, - 0 - ]; - try { - G.rotation.set(t[0], t[1], t[2]), G.updateMatrixWorld(!0); - } catch (e) { - console.debug?.(e); - } - I && (K = f(I, G)), Be(); - }, Ge = (e) => { - if (J) try { - J.visible = !!e; - } catch (e) { - console.debug?.(e); - } - }, Ke = () => { - if (!X || Z.length === 0) return; - let e = Q[$]; - if (!e) return; - let t = Z[$]?.duration || 0, n = e.time || 0; - try { - P.timeLbl.textContent = `${T(n)} / ${T(t)}`; - } catch (e) { - console.debug?.(e); - } - if (!Me && t > 0) try { - let e = Number(P.progressSlider.max) || 1e3; - P.progressSlider.value = String(Math.round(n / t * e)); - } catch (e) { - console.debug?.(e); - } - }, qe = (e) => { - if (!X || !Z.length) return; - let n = Z[e]; - if (!n) return; - Q.forEach((e) => { - try { - e?.stop(); - } catch (e) { - console.debug?.(e); - } - }); - let r = X.clipAction(n); - r.timeScale = Ae, r.clampWhenFinished = !1, r.loop = I?.LoopRepeat ?? 2201, r.play(), Q[e] = r, $ = e, je = !0, P.playBtn.textContent = t("model3d.pause", "Pause"); - try { - let e = Math.max(100, Math.min(1e4, Math.round((n.duration || 1) * 100))); - P.progressSlider.max = String(e); - } catch {} - }, Je = () => { - X && Z.length && (je ? (X.timeScale = 0, je = !1, P.playBtn.textContent = t("model3d.play", "Play")) : (X.timeScale = Ae, Q[$]?.isRunning?.() ? (je = !0, P.playBtn.textContent = t("model3d.pause", "Pause")) : qe($))); - }, Ye = (e, t) => { - e && e.length !== 0 && I && (Z = e, X = new I.AnimationMixer(t), ke = new I.Clock(), Q = Array(e.length).fill(null), P.animSel.innerHTML = "", e.forEach((e, t) => { - let n = document.createElement("option"); - n.value = String(t), n.textContent = e.name || `Animation ${t + 1}`, P.animSel.appendChild(n); - }), P.animSel.style.display = e.length > 1 ? "" : "none", P.bar.style.display = "flex", M.style.bottom = "54px", qe(0), P.playBtn.addEventListener("click", (e) => { - w(e), Je(); - }), P.speedSel.addEventListener("change", () => { - Ae = Number(P.speedSel.value) || 1, X.timeScale = je ? Ae : 0; - let e = Q[$]; - e && (e.timeScale = Ae); - }), P.animSel.addEventListener("change", () => { - let e = Number(P.animSel.value) || 0; - qe(e); - }), P.progressSlider.addEventListener("pointerdown", () => { - Me = !0; - }), P.progressSlider.addEventListener("pointerup", () => { - Me = !1; - let e = Q[$], t = Z[$]; - if (e && t) { - let n = Number(P.progressSlider.max) || 1e3, r = Number(P.progressSlider.value) / n * t.duration; - e.time = Math.max(0, Math.min(r, t.duration)); - } - }), P.progressSlider.addEventListener("input", () => { - let e = Q[$], t = Z[$]; - if (e && t && Me) { - let n = Number(P.progressSlider.max) || 1e3, r = Number(P.progressSlider.value) / n * t.duration; - e.time = Math.max(0, Math.min(r, t.duration)), P.timeLbl.textContent = `${T(r)} / ${T(t.duration)}`; - } - })); - }, Xe = () => { - D(k, !!W?.visible), D(pe, q === A.ORTHOGRAPHIC), pe.textContent = q === A.ORTHOGRAPHIC ? t("model3d.ortho", "Ortho") : t("model3d.persp", "Persp"), D(me, Ne); - }; - N.bgInput.addEventListener("input", () => { - let e = N.bgInput.value; - try { - R && (R.background = new ((I?.Color) || Object)(e)); - } catch (e) { - console.debug?.(e); - } - }), N.materialSel.addEventListener("change", () => { - Ue(N.materialSel.value); - }), N.upSel.addEventListener("change", () => { - We(N.upSel.value); - }), N.skeletonToggle && N.skeletonToggle.addEventListener("change", () => { - Ge(N.skeletonToggle.checked); - }), N.fovSlider.addEventListener("input", () => { - let e = Math.max(1, Math.min(179, Number(N.fovSlider.value) || le)); - try { - B && (B.fov = e, B.updateProjectionMatrix()); - } catch (e) { - console.debug?.(e); - } - }), N.lightSlider.addEventListener("input", () => { - He(Number(N.lightSlider.value)); - }); - let Ze = () => { - let e = [], t = (t, n, r, i) => { - t.addEventListener(n, r, i), e.push(() => t.removeEventListener(n, r, i)); - }; - return t(_, "pointerdown", () => { - try { - y.focus?.(); - } catch (e) { - console.debug?.(e); - } - }), t(_, "wheel", (e) => w(e)), t(_, "contextmenu", (e) => w(e, { preventDefault: !0 })), t(_, "dragstart", (e) => w(e, { preventDefault: !0 })), t(_, "dragover", (e) => w(e, { preventDefault: !0 })), t(_, "dragleave", (e) => w(e)), t(_, "drop", (e) => w(e, { preventDefault: !0 })), () => { - for (let t of e) try { - t(); - } catch (e) { - console.debug?.(e); - } - }; - }, Qe = () => { - F = !0; - try { - window.removeEventListener(i.RUNTIME_STATUS, tt); - } catch {} - try { - _._mjr3D = null; - } catch {} - try { - U != null && cancelAnimationFrame(U); - } catch (e) { - console.debug?.(e); - } - U = null; - try { - xe?.(); - } catch (e) { - console.debug?.(e); - } - xe = null; - try { - _e?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - _e = null; - try { - H?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - H = null; - try { - X?.stopAllAction?.(), X?.uncacheRoot?.(X.getRoot?.()); - } catch (e) { - console.debug?.(e); - } - try { - for (let e of Q) try { - X?.uncacheAction?.(e); - } catch {} - } catch (e) { - console.debug?.(e); - } - try { - for (let e of Z) try { - e?.dispose?.(); - } catch {} - } catch (e) { - console.debug?.(e); - } - X = null, Q = [], Z = [], u(Te); - try { - J && (R?.remove?.(J), J.dispose?.()); - } catch (e) { - console.debug?.(e); - } - J = null; - try { - R?.traverse?.((e) => { - try { - e.geometry?.dispose?.(); - } catch {} - try { - let t = Array.isArray(e.material) ? e.material : e.material ? [e.material] : []; - for (let e of t) try { - if (e) { - for (let t of Object.keys(e)) try { - let n = e[t]; - n && typeof n == "object" && typeof n.dispose == "function" && n.isTexture && n.dispose(); - } catch {} - e.dispose?.(); - } - } catch {} - } catch {} - }); - } catch (e) { - console.debug?.(e); - } - try { - _._mjrAxisScene &&= (_._mjrAxisScene.traverse?.((e) => { - try { - e.geometry?.dispose?.(); - } catch {} - try { - e.material?.dispose?.(); - } catch {} - }), null); - } catch (e) { - console.debug?.(e); - } - try { - L?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - L = null, R = null, z = null, B = null, V = null, Se = null, G = null, K = null, ve = null; - try { - let e = y.getContext("webgl2") || y.getContext("webgl"); - e && e.getExtension("WEBGL_lose_context")?.loseContext?.(); - } catch (e) { - console.debug?.(e); - } - }, $e = () => { - ye = !0; - try { - U != null && cancelAnimationFrame(U); - } catch (e) { - console.debug?.(e); - } - U = null; - }, et = () => { - if (ye = !1, !(F || U != null || typeof ve != "function")) try { - U = requestAnimationFrame(ve); - } catch (e) { - console.debug?.(e); - } - }, tt = (e) => { - g && (String(e?.detail?.active_prompt_id || "").trim() ? $e() : et()); - }; - y._mjrProc = { - setParams: () => {}, - destroy: Qe, - captureCanvas: () => y, - pause: $e, - resume: et - }; - try { - g && (window.addEventListener(i.RUNTIME_STATUS, tt), String(window.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (ye = !0)); - } catch (e) { - console.debug?.(e); - } - return Ie("Preparing 3D preview", Pe), Promise.resolve().then(async () => { - let r = he(e); - if (ae.has(r)) try { - let t = await te(); - if (F) return; - let i = t.THREE; - I = i; - let l = new i.LoadingManager(); - l.setURLModifier((t) => { - if (!t || fe(t)) return t; - let r = n(e, t); - if (r) return r; - try { - return new URL(t, a).href; - } catch { - return t; - } - }), L = new i.WebGLRenderer({ - canvas: y, - antialias: !0, - alpha: !0, - preserveDrawingBuffer: !0 - }), L.outputColorSpace = i.SRGBColorSpace, L.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)), R = new i.Scene(), R.background = new i.Color(oe), B = new i.PerspectiveCamera(le, 16 / 9, .01, 1e4), V = new i.OrthographicCamera(-1, 1, 1, -1, -1e4, 1e4), z = B, H = new t.OrbitControls(z, y), H.enableDamping = !0, H.dampingFactor = .08, H.rotateSpeed = .82, H.zoomSpeed = 1, H.panSpeed = .9, H.screenSpacePanning = !0, H.mouseButtons = ge(null, i.MOUSE), xe = Ze(), De = new i.AmbientLight(16777215, j.ambient * Y), R.add(De); - let u = new i.DirectionalLight(16777215, j.main * Y); - u.position.set(0, 10, 10); - let p = new i.DirectionalLight(16777215, j.back * Y); - p.position.set(-10, 0, -10); - let m = new i.DirectionalLight(15266047, j.fill * Y); - m.position.set(10, 5, -5); - let g = new i.DirectionalLight(16773352, j.fill * Y); - g.position.set(-10, 5, 5); - let b = new i.DirectionalLight(16777215, j.bottom * Y); - b.position.set(0, -10, 0), Oe = [ - u, - p, - m, - g, - b - ], Oe.forEach((e) => R.add(e)), W = new i.GridHelper(20, 20, 5068128, 3094338), R.add(W); - let x = () => { - if (F || !L || !z) return; - let e = _.getBoundingClientRect(), t = Math.max(1, Math.round(e.width || y.clientWidth || 1)), n = Math.max(1, Math.round(e.height || y.clientHeight || 1)); - L.setSize(t, n, !1), B && (B.aspect = t / n, B.updateProjectionMatrix()), ze(t, n), Re(), Fe(); - }; - typeof ResizeObserver < "u" && (_e = new ResizeObserver(() => x()), _e.observe(_)); - let S = v(t, r, l); - if (!S) { - Ie("3D loader unavailable", `${r.toUpperCase()} loader could not be created.`), M.style.display = "none"; - return; - } - if (r === "obj" && t.MTLLoader) try { - let e = a.replace(/\.obj(\?.*)?$/i, (e, t) => `.mtl${t || ""}`), n = new t.MTLLoader(l), r = await new Promise((t) => { - n.load(e, t, void 0, () => t(null)); - }); - r && !F && (r.preload(), S.setMaterials(r)); - } catch (e) { - console.debug?.("[MJR 3D] MTL load skipped:", e?.message); - } - let C = await ee(S, r, a); - if (F) return; - let T = h(i, r, C); - if (!T) { - Ie("Empty 3D scene", "The loader returned no renderable object."), M.style.display = "none"; - return; - } - try { - let e = new i.Box3().setFromObject(T); - if (!e.isEmpty()) { - let t = e.getSize(new i.Vector3()), n = e.getCenter(new i.Vector3()), r = 5 / Math.max(t.x, t.y, t.z, .001); - T.scale.multiplyScalar(r), e.setFromObject(T), e.getCenter(n), T.position.set(-n.x, -e.min.y, -n.z); - } - } catch (e) { - console.debug?.("[MJR 3D] normalize skipped:", e); - } - if (Se = T, G = new i.Group(), G.add(T), R.add(G), we = c(T), Ee = s(T), Ee) { - J = new i.SkeletonHelper(T), J.visible = !1, R.add(J); - let e = ne({ - defaultBgColor: oe, - defaultFov: le, - defaultLightIntensity: ue, - hasSkeleton: !0 - }); - _.replaceChild(e.panel, N.panel), Object.assign(N, e), N.bgInput.addEventListener("input", () => { - try { - R && (R.background = new i.Color(N.bgInput.value)); - } catch (e) { - console.debug?.(e); - } - }), N.materialSel.addEventListener("change", () => { - Ue(N.materialSel.value); - }), N.upSel.addEventListener("change", () => { - We(N.upSel.value); - }), N.skeletonToggle && N.skeletonToggle.addEventListener("change", () => { - Ge(N.skeletonToggle.checked); - }), N.fovSlider.addEventListener("input", () => { - let e = Math.max(1, Math.min(179, Number(N.fovSlider.value) || le)); - try { - B && (B.fov = e, B.updateProjectionMatrix()); - } catch (e) { - console.debug?.(e); - } - }), N.lightSlider.addEventListener("input", () => { - He(Number(N.lightSlider.value)); - }); - } - K = f(i, G), K && (W.position.y = K.box.min.y), q = A.PERSPECTIVE, Be(), x(), Le(), Xe(); - let E = d(C, r); - E.length > 0 && Ye(E, T); - let D = new i.Scene(); - _._mjrAxisScene = D; - let O = new i.PerspectiveCamera(50, 1, .1, 100); - O.position.set(0, 0, 3.2), O.lookAt(0, 0, 0); - let re = [ - { - dir: [ - 1, - 0, - 0 - ], - color: 16724787 - }, - { - dir: [ - 0, - 1, - 0 - ], - color: 3407667 - }, - { - dir: [ - 0, - 0, - 1 - ], - color: 5605631 - } - ], ae = new i.SphereGeometry(.1, 12, 8), se = new i.SphereGeometry(.08, 10, 6), ce = new i.MeshBasicMaterial({ color: 13421772 }); - D.add(new i.Mesh(se, ce)); - for (let { dir: e, color: t } of re) { - let n = new i.LineBasicMaterial({ color: t }), r = [new i.Vector3(0, 0, 0), new i.Vector3(e[0], e[1], e[2])], a = new i.BufferGeometry().setFromPoints(r); - D.add(new i.Line(a, n)); - let o = new i.MeshBasicMaterial({ color: t }), s = new i.Mesh(ae, o); - s.position.set(e[0], e[1], e[2]), D.add(s); - } - _._mjr3D = { - controls: H, - get camera() { - return z; - } - }; - try { - o.onReady?.({ - canvas: y, - host: _, - object: G, - renderer: L, - camera: z, - controls: H - }); - } catch (e) { - console.debug?.(e); - } - Fe(); - let de = () => { - if (!F && !ye && L && R && z) { - try { - if (H?.update?.(), X && ke) { - let e = ke.getDelta(); - je && X.update(e), Ke(); - } - L.setScissorTest(!1), L.setViewport(0, 0, y.width, y.height), L.render(R, z); - let e = Math.min(2, window.devicePixelRatio || 1), t = Math.round(96 * e); - L.setScissorTest(!0), L.setScissor(0, 0, t, t), L.setViewport(0, 0, t, t), L.setClearColor(0, 0), L.clear(!0, !0, !1); - let n = z.quaternion; - O.position.set(0, 0, 3.2).applyQuaternion(n), O.quaternion.copy(n), L.render(D, O), L.setScissorTest(!1); - try { - L.setClearColor(R.background || 0, 1); - } catch {} - Re(); - } catch (e) { - console.debug?.(e); - } - ye || (U = requestAnimationFrame(de)); - } - }; - ve = de; - let he = (e) => w(e, { preventDefault: !0 }); - ie.addEventListener("click", (e) => { - he(e), Be(), Xe(); - }), k.addEventListener("click", (e) => { - he(e), W && (W.visible = !W.visible), Xe(), Fe(); - }), pe.addEventListener("click", (e) => { - he(e), Ve(q === A.PERSPECTIVE ? A.ORTHOGRAPHIC : A.PERSPECTIVE); - }), me.addEventListener("click", (e) => { - he(e), Ne = !Ne, N.panel.style.display = Ne ? "block" : "none", Xe(); - }), ye || de(); - } catch (e) { - console.warn("[MJR 3D] preview init failed", e), Ie("Failed to load 3D preview", String(e?.message || "Three.js initialization failed.")), M.style.display = "none"; - } - else if (Ie("3D preview unavailable", `${r.toUpperCase()} is not supported in the embedded viewer.`), M.style.display = "none", a) try { - let n = document.createElement("a"); - n.href = a, n.download = String(e?.filename || "model"), n.textContent = t("model3d.downloadFile", "Download {file}", { file: String(e?.filename || "file") }), n.style.cssText = "position:absolute;bottom:18px;left:50%;transform:translateX(-50%);padding:7px 16px;border-radius:8px;font:600 12px system-ui,sans-serif;color:#fff;background:rgba(76,175,80,0.85);text-decoration:none;pointer-events:auto;z-index:3", _.appendChild(n); - } catch {} - }).catch((e) => { - if (!F) { - console.warn("[MJR 3D] preview init unhandled error", e); - try { - Ie("Failed to load 3D preview", String(e?.message || "Initialization failed.")); - } catch {} - try { - M.style.display = "none"; - } catch {} - } - }), _; -} -// ui/features/viewer/model3dRenderer.ts -var _e = /* @__PURE__ */ e({ - MODEL3D_EXTS: () => k, - MODEL3D_EXT_TO_LOADER: () => ie, - PREVIEWABLE_MODEL3D_LOADERS: () => ae, - buildModel3DMouseButtons: () => ge, - createModel3DMediaElement: () => F, - findModel3DCanvas: () => N, - getModel3DDefaultControlHint: () => M, - isModel3DAsset: () => me, - isModel3DInteractionTarget: () => P, - resolveModel3DLoader: () => he -}); -export { P as a, y as c, me as i, k as n, x as o, F as r, b as s, _e as t }; diff --git a/dist/chunks/scopes-bvTRS68K.js b/dist/chunks/scopes-bvTRS68K.js deleted file mode 100644 index faa7079d..00000000 --- a/dist/chunks/scopes-bvTRS68K.js +++ /dev/null @@ -1,187 +0,0 @@ -import { n as e } from "./state-D0Gu1AgG.js"; -// ui/features/viewer/scopes.ts -function t(e, t, n) { - return .2126 * e + .7152 * t + .0722 * n; -} -var n = 256, r = 3, i = 220, a = 110, o = 2, s = 10, c = 1, l = "12px var(--comfy-font, ui-sans-serif, system-ui)", u = 10, d = 8, f = 10, p = 28, m = 10, h = 1.2, g = 1, _ = 420, v = 240, y = 32, b = 24, x = .06, S = .9, C = .9, w = null, T = null; -function E(e, t) { - try { - let n = Math.max(1, Math.floor(Number(e) || 1)), r = Math.max(1, Math.floor(Number(t) || 1)); - return w ||= document.createElement("canvas"), w.width !== n && (w.width = n), w.height !== r && (w.height = r), T ||= w.getContext("2d", { willReadFrequently: !0 }), T || null; - } catch { - return null; - } -} -function D(e, t, n) { - try { - return e.getImageData(0, 0, t, n); - } catch { - return null; - } -} -function O(e, { x: t, y: n, w: r, h: i, title: a }) { - try { - e.save(), e.fillStyle = "rgba(0,0,0,0.55)", e.strokeStyle = "rgba(255,255,255,0.14)", e.lineWidth = c; - let o = s; - e.beginPath(), e.moveTo(t + o, n), e.arcTo(t + r, n, t + r, n + i, o), e.arcTo(t + r, n + i, t, n + i, o), e.arcTo(t, n + i, t, n, o), e.arcTo(t, n, t + r, n, o), e.closePath(), e.fill(), e.stroke(), a && (e.font = l, e.textAlign = "left", e.textBaseline = "top", e.fillStyle = "rgba(255,255,255,0.86)", e.fillText(String(a), t + u, n + d)), e.restore(); - } catch (e) { - console.debug?.(e); - } -} -function k(e, { sampleStep: i = r } = {}) { - let a = n, o = new Uint32Array(a), s = new Uint32Array(a), c = new Uint32Array(a), l = new Uint32Array(a); - try { - let n = e?.data; - if (!n) return { - hr: o, - hg: s, - hb: c, - hl: l, - max: 1 - }; - let r = Math.max(1, Math.floor(i)); - for (let e = 0; e < n.length; e += 4 * r) { - let r = n[e] ?? 0, i = n[e + 1] ?? 0, a = n[e + 2] ?? 0; - o[r] += 1, s[i] += 1, c[a] += 1; - let u = Math.max(0, Math.min(255, Math.round(t(r, i, a)))); - l[u] += 1; - } - let u = 1; - for (let e = 0; e < a; e++) u = Math.max(u, o[e], s[e], c[e], l[e]); - return { - hr: o, - hg: s, - hb: c, - hl: l, - max: u - }; - } catch { - return { - hr: o, - hg: s, - hb: c, - hl: l, - max: 1 - }; - } -} -function A(e, t, r, { channel: i = "rgb" } = {}) { - try { - let { x: a, y: o, w: s, h: l } = t, u = p, d = f, _ = a + d, v = o + u, y = s - 20, b = l - u - d; - if (!(y > m && b > m)) return; - e.save(), e.globalCompositeOperation = "source-over", e.strokeStyle = "rgba(255,255,255,0.10)", e.lineWidth = c, e.beginPath(), e.rect(_, v, y, b), e.stroke(); - let x = Number(r?.max) || 1, S = (t, r) => { - e.strokeStyle = r, e.beginPath(); - for (let r = 0; r < n; r++) { - let n = (t?.[r] || 0) / x, i = _ + r / 255 * y, a = v + b - n * b; - r === 0 ? e.moveTo(i, a) : e.lineTo(i, a); - } - e.stroke(); - }, C = String(i || "rgb"); - e.lineWidth = h, C === "r" ? S(r.hr, "rgba(255,90,90,0.95)") : C === "g" ? S(r.hg, "rgba(90,255,140,0.95)") : C === "b" ? S(r.hb, "rgba(90,160,255,0.95)") : C === "l" ? S(r.hl, "rgba(255,210,90,0.95)") : (S(r.hr, "rgba(255,90,90,0.95)"), S(r.hg, "rgba(90,255,140,0.95)"), S(r.hb, "rgba(90,160,255,0.95)")), C !== "l" && (e.lineWidth = g, S(r.hl, "rgba(255,255,255,0.45)")), e.restore(); - } catch (e) { - console.debug?.(e); - } -} -function j(n, { columns: r = i, rows: s = a, sampleStep: c = o } = {}) { - let l = Math.max(y, Math.floor(r)), u = Math.max(b, Math.floor(s)), d = new Uint16Array(l * u); - try { - let r = n?.data, i = n?.width || 0, a = n?.height || 0; - if (!r || !(i > 0 && a > 0)) return { - out: d, - gridW: l, - gridH: u, - max: 1 - }; - let o = Math.max(1, Math.floor(c)); - for (let n = 0; n < a; n += o) { - let a = n * i * 4; - for (let n = 0; n < i; n += o) { - let o = n / (i - 1 || 1), s = Math.max(0, Math.min(l - 1, Math.floor(o * (l - 1)))), c = a + n * 4, f = r[c] ?? 0, p = r[c + 1] ?? 0, m = r[c + 2] ?? 0, h = e(t(f / 255, p / 255, m / 255)), g = Math.max(0, Math.min(u - 1, Math.round((1 - h) * (u - 1)))); - d[g * l + s] += 1; - } - } - let s = 1; - for (let e = 0; e < d.length; e++) s = Math.max(s, d[e]); - return { - out: d, - gridW: l, - gridH: u, - max: s - }; - } catch { - return { - out: d, - gridW: l, - gridH: u, - max: 1 - }; - } -} -function M(e, t, n) { - try { - let { x: r, y: i, w: a, h: o } = t, s = p, l = f, u = r + l, d = i + s, h = a - 20, g = o - s - l; - if (!(h > m && g > m)) return; - e.save(), e.strokeStyle = "rgba(255,255,255,0.10)", e.lineWidth = c, e.beginPath(), e.rect(u, d, h, g), e.stroke(); - let _ = n?.gridW || 0, v = n?.gridH || 0, y = n?.out, b = Number(n?.max) || 1; - if (!y || !(_ > 0 && v > 0)) return; - for (let t = 0; t < v; t++) for (let n = 0; n < _; n++) { - let r = (y[t * _ + n] || 0) / b; - if (r <= 0) continue; - let i = u + n / (_ - 1 || 1) * h, a = d + t / (v - 1 || 1) * g; - e.fillStyle = `rgba(255,255,255,${Math.min(S, x + r * C)})`, e.fillRect(i, a, Math.max(1, h / _), Math.max(1, g / v)); - } - e.restore(); - } catch (e) { - console.debug?.(e); - } -} -function N(e, t, n, r = {}) { - try { - let i = String(r?.mode || "both"), a = String(r?.channel || "rgb"); - if (!e || !t || !n || i === "off") return; - let o = Number(n.width) || 0, s = Number(n.height) || 0; - if (!(o > 1 && s > 1)) return; - let c = Math.max(o / _, s / v, 1), l = Math.max(1, Math.floor(o / c)), u = Math.max(1, Math.floor(s / c)), d = E(l, u); - if (!d) return; - try { - d.clearRect(0, 0, l, u), d.drawImage(n, 0, 0, l, u); - } catch { - return; - } - let f = D(d, l, u); - if (!f) return; - let p = Math.min(520, Math.max(320, Math.floor(t.w * .36))), m = Math.min(260, Math.max(160, Math.floor(t.h * .22))), h = t.w - p - 10, g = t.h - m - 10; - if (i === "hist" || i === "both") { - let t = { - x: h, - y: g, - w: p, - h: m - }, n = a === "r" ? "Histogram (R)" : a === "g" ? "Histogram (G)" : a === "b" ? "Histogram (B)" : a === "l" ? "Histogram (Luma)" : "Histogram (RGB + Luma)"; - O(e, { - ...t, - title: n - }), A(e, t, k(f, { sampleStep: Math.max(2, Math.floor(Math.max(l, u) / 180)) }), { channel: a }); - } - if (i === "wave" || i === "both") { - let t = { - x: h, - y: i === "both" ? g - m - 8 : g, - w: p, - h: m - }; - O(e, { - ...t, - title: "Waveform (Luma)" - }), M(e, t, j(f, { - columns: 180, - rows: 96, - sampleStep: Math.max(2, Math.floor(Math.max(l, u) / 180)) - })); - } - } catch (e) { - console.debug?.(e); - } -} -export { N as drawScopesLight }; diff --git a/dist/chunks/sideBySide-Dahw1GfU.js b/dist/chunks/sideBySide-Dahw1GfU.js deleted file mode 100644 index 8cf4fbcd..00000000 --- a/dist/chunks/sideBySide-Dahw1GfU.js +++ /dev/null @@ -1,256 +0,0 @@ -import { i as e } from "./model3dRenderer-BnFOXFbn.js"; -import { i as t, o as n } from "./geninfoParser-CgHp-y-n.js"; -// ui/features/viewer/sideBySide.ts -function r(e) { - if (!e) return null; - try { - let r = e.geninfo ? { geninfo: e.geninfo } : e.metadata || e.metadata_raw || e, i = t(r) || null; - if (i && typeof i == "object") { - let t = { - prompt: n(i.prompt) || (r?.prompt ? n(String(r.prompt)) : "") || "", - seed: i.seed == null ? "" : String(i.seed), - sampler: i.sampler ? String(i.sampler) : "", - scheduler: i.scheduler ? String(i.scheduler) : "", - cfg: i.cfg == null ? "" : String(i.cfg), - step: i.steps == null ? "" : String(i.steps), - genTime: "" - }, a = e.generation_time_ms ?? r?.generation_time_ms ?? 0; - return a && Number.isFinite(Number(a)) && a > 0 && a < 864e5 && (t.genTime = (Number(a) / 1e3).toFixed(1) + "s"), t; - } - } catch {} - let r = e.meta || e.metadata || e.parsed_meta || e, i = e.generation_time_ms ?? r?.generation_time_ms ?? 0; - return { - prompt: n(r?.prompt || r?.text || ""), - seed: r?.seed == null ? r?.noise_seed == null ? "" : String(r.noise_seed) : String(r.seed), - sampler: r?.sampler || r?.sampler_name || "", - scheduler: r?.scheduler || "", - cfg: r?.cfg == null ? r?.cfg_scale == null ? "" : String(r.cfg_scale) : String(r.cfg), - step: r?.steps == null ? "" : String(r.steps), - genTime: i && Number.isFinite(Number(i)) && i > 0 && i < 864e5 ? (Number(i) / 1e3).toFixed(1) + "s" : "" - }; -} -function i(e, t) { - let n = r(e); - if (!n) return null; - let { prompt: i, seed: a, sampler: o, scheduler: s, cfg: c, step: l, genTime: u } = n, d = [ - a ? `Seed: ${a}` : "", - c ? `CFG: ${c}` : "", - o ? `Sampler: ${o}` : "", - s ? `Sched: ${s}` : "", - l ? `Steps: ${l}` : "", - u ? `Gen: ${u}` : "" - ].filter(Boolean).join(" - "); - if (!i && !d) return null; - let f = document.createElement("div"); - f.style.cssText = "position:absolute;left:6px;right:6px;bottom:6px;background:rgba(0,0,0,0.68);color:#fff;padding:5px 8px;border-radius:6px;font-size:10px;line-height:1.4;max-height:38%;overflow:hidden;word-break:break-word;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);border:1px solid rgba(255,255,255,0.12);box-shadow:0 2px 6px rgba(0,0,0,0.45);pointer-events:none;z-index:2;box-sizing:border-box"; - let p = i.length > 160 ? i.slice(0, 160) + "..." : i, m = document.createElement("div"); - m.style.cssText = `display:flex;align-items:baseline;gap:5px;flex-wrap:wrap;margin-bottom:${d ? "3" : "0"}px;`; - let h = document.createElement("span"); - if (h.style.cssText = "background:rgba(255,255,255,0.2);border-radius:3px;padding:0 4px;font-weight:700;font-size:9px;letter-spacing:0.06em;flex-shrink:0;", h.textContent = t, m.appendChild(h), i) { - let e = document.createElement("span"), t = document.createElement("span"); - t.style.cssText = "color:#7ec8ff;font-weight:600;", t.textContent = "Prompt:", e.appendChild(t), e.appendChild(document.createTextNode(" " + p)), m.appendChild(e); - } - if (f.appendChild(m), d) { - let e = document.createElement("div"); - e.style.cssText = "color:rgba(255,255,255,0.65);font-size:9px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;", e.textContent = d, f.appendChild(e); - } - return f; -} -function a(e, t) { - let n = 0, r = () => { - n++; - let i = e?.querySelector?.(".mjr-model3d-host"), a = t?.querySelector?.(".mjr-model3d-host"), o = i?._mjr3D?.controls, s = a?._mjr3D?.controls; - if (!o || !s) { - n < 60 && setTimeout(r, 50); - return; - } - let c = !1, l = () => { - if (!c) { - c = !0; - try { - let e = i._mjr3D.camera, t = a._mjr3D.camera; - e && t && (t.position.copy(e.position), t.quaternion.copy(e.quaternion), e.zoom !== void 0 && (t.zoom = e.zoom), t.updateProjectionMatrix()), s.target.copy(o.target), s.update(); - } catch (e) { - console.debug?.(e); - } - c = !1; - } - }, u = () => { - if (!c) { - c = !0; - try { - let e = i._mjr3D.camera, t = a._mjr3D.camera; - e && t && (e.position.copy(t.position), e.quaternion.copy(t.quaternion), t.zoom !== void 0 && (e.zoom = t.zoom), e.updateProjectionMatrix()), o.target.copy(s.target), o.update(); - } catch (e) { - console.debug?.(e); - } - c = !1; - } - }; - o.addEventListener("change", l), s.addEventListener("change", u); - try { - let t = e.parentElement; - t && (t._mjr3DSyncCleanup = () => { - try { - o.removeEventListener("change", l); - } catch {} - try { - s.removeEventListener("change", u); - } catch {} - }); - } catch (e) { - console.debug?.(e); - } - }; - setTimeout(r, 50); -} -function o(e) { - let t = 0, n = () => { - t++; - let r = Array.from(e?.querySelectorAll?.(".mjr-model3d-host") || []).filter((e) => e._mjr3D?.controls); - if (r.length < 2) { - t < 60 && setTimeout(n, 50); - return; - } - let i = !1, a = []; - for (let e = 0; e < r.length; e++) { - let t = r[e], n = () => { - if (!i) { - i = !0; - try { - let n = t._mjr3D.camera, i = t._mjr3D.controls; - for (let t = 0; t < r.length; t++) { - if (t === e) continue; - let a = r[t], o = a._mjr3D.camera, s = a._mjr3D.controls; - o && s && (o.position.copy(n.position), o.quaternion.copy(n.quaternion), n.zoom !== void 0 && (o.zoom = n.zoom), o.updateProjectionMatrix(), s.target.copy(i.target), s.update()); - } - } catch (e) { - console.debug?.(e); - } - i = !1; - } - }; - t._mjr3D.controls.addEventListener("change", n), a.push(() => { - try { - t._mjr3D?.controls?.removeEventListener?.("change", n); - } catch {} - }); - } - e._mjr3DSyncCleanup = () => { - for (let e of a) e(); - }; - }; - setTimeout(n, 50); -} -function s({ sideView: t, state: n, currentAsset: r, viewUrl: s, buildAssetViewURL: c, createMediaElement: l, destroyMediaProcessorsIn: u } = {}) { - try { - t?._mjr3DSyncCleanup?.(); - } catch (e) { - console.debug?.(e); - } - try { - t && (t._mjr3DSyncCleanup = null); - } catch (e) { - console.debug?.(e); - } - try { - u?.(t); - } catch (e) { - console.debug?.(e); - } - try { - t && (t.innerHTML = ""); - } catch (e) { - console.debug?.(e); - } - if (!t || !n || !r) return; - let d = (e, t) => { - try { - let n = e?.querySelector?.(".mjr-viewer-video-src") || e?.querySelector?.("video"), r = e?.querySelector?.(".mjr-viewer-audio-src") || e?.querySelector?.("audio"); - if (n?.dataset && (n.dataset.mjrCompareRole = t), r?.dataset && (r.dataset.mjrCompareRole = t), r) { - let e = String(t || "").toUpperCase() === "A"; - if (r.muted = !e, !e) try { - r.pause?.(); - } catch (e) { - console.debug?.(e); - } - } - } catch (e) { - console.debug?.(e); - } - }, f = Array.isArray(n.assets) ? n.assets.slice(0, 4) : [], p = f.length, m = !!n.compareAsset; - if (p > 2 && !m) { - try { - t.style.display = "grid", t.style.gridTemplateColumns = "1fr 1fr", t.style.gridTemplateRows = "1fr 1fr", t.style.gap = "2px", t.style.padding = "2px"; - } catch (e) { - console.debug?.(e); - } - let n = [ - "A", - "B", - "C", - "D" - ]; - for (let e = 0; e < 4; e++) { - let r = document.createElement("div"); - r.style.cssText = "\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255,255,255,0.05);\n overflow: hidden;\n "; - let a = f[e]; - if (a) { - let t = ""; - try { - t = c?.(a) || ""; - } catch (e) { - console.debug?.(e); - } - try { - let i = l?.(a, t); - i && r.appendChild(i), d(i, n[e]); - } catch (e) { - console.debug?.(e); - } - try { - let t = i(a, n[e]); - t && r.appendChild(t); - } catch (e) { - console.debug?.(e); - } - } else { - let t = document.createElement("div"); - t.style.cssText = "position:absolute;top:6px;left:6px;background:rgba(255,255,255,0.12);border-radius:3px;padding:1px 6px;font-size:9px;font-weight:700;color:rgba(255,255,255,0.4);letter-spacing:0.06em;", t.textContent = n[e], r.appendChild(t); - } - try { - t.appendChild(r); - } catch (e) { - console.debug?.(e); - } - } - f.some((t) => t && e(t)) && o(t); - return; - } - let h = n.compareAsset || (Array.isArray(n.assets) && n.assets.length === 2 ? n.assets[1 - (n.currentIndex || 0)] : null) || r, g = (() => { - try { - return c?.(h); - } catch { - return ""; - } - })(), _ = document.createElement("div"); - _.style.cssText = "\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255,255,255,0.05);\n overflow: hidden;\n "; - let v = l?.(r, s); - v && _.appendChild(v); - let y = document.createElement("div"); - y.style.cssText = "\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255,255,255,0.05);\n overflow: hidden;\n "; - let b = l?.(h, g); - b && y.appendChild(b); - try { - t.style.display = "flex", t.style.flexDirection = "row", t.style.gap = "2px", t.style.padding = "0"; - } catch (e) { - console.debug?.(e); - } - try { - t.appendChild(_), t.appendChild(y); - } catch (e) { - console.debug?.(e); - } - d(v, "A"), d(b, "B"), e(r) && e(h) && a(_, y); -} -export { s as renderSideBySideView }; diff --git a/dist/chunks/state-D0Gu1AgG.js b/dist/chunks/state-D0Gu1AgG.js deleted file mode 100644 index 4258a923..00000000 --- a/dist/chunks/state-D0Gu1AgG.js +++ /dev/null @@ -1,58 +0,0 @@ -// ui/features/viewer/state.ts -function e(e) { - let t = Number(e); - return Number.isFinite(t) ? Math.max(0, Math.min(1, t)) : 0; -} -function t(e, t, n) { - let r = Number(e); - return Number.isFinite(r) ? Math.max(Number(t), Math.min(Number(n), r)) : Number(t); -} -function n() { - return { - assets: [], - currentIndex: 0, - mode: "single", - zoom: 1, - panX: 0, - panY: 0, - targetZoom: 1, - compareAsset: null, - channel: "rgb", - exposureEV: 0, - gamma: 1, - analysisMode: "none", - zebraThreshold: .95, - abCompareMode: "wipe", - scopesMode: "off", - gridMode: 0, - overlayMaskEnabled: !1, - overlayMaskOpacity: .65, - overlayFormat: "image", - probeEnabled: !1, - loupeEnabled: !1, - hudEnabled: !0, - distractionFree: !1, - loupeSize: 120, - loupeMagnification: 8, - genInfoOpen: !0, - audioVisualizerMode: "artistic", - _userInteracted: !1, - _panHintAt: 0, - _panHintX: null, - _panHintY: null, - _panHintTimer: null, - _prevBodyOverflow: "", - _prevFocusedElement: null, - _lastPointerX: null, - _lastPointerY: null, - _mediaW: 0, - _mediaH: 0, - _viewportCache: null, - _probe: null, - _videoControlsDestroy: null, - _activeVideoEl: null, - _abWipePercent: 50, - _scopesLastAt: 0 - }; -} -export { e as n, n as r, t }; diff --git a/dist/chunks/openMajoorSettings-2yBqYLc0.js b/dist/chunks/tooltipShortcuts-Ury2eTek.js similarity index 72% rename from dist/chunks/openMajoorSettings-2yBqYLc0.js rename to dist/chunks/tooltipShortcuts-Ury2eTek.js index cd28f685..a6cce0d2 100644 --- a/dist/chunks/openMajoorSettings-2yBqYLc0.js +++ b/dist/chunks/tooltipShortcuts-Ury2eTek.js @@ -1,17 +1,19 @@ -import { A as e, E as t, J as n, R as r, S as i, Y as a, b as o, j as s, m as c } from "./events-C65wdOHm.js"; -import { a as l, n as u } from "./graphTraversal-DTdQWkn5.js"; -import { S as d, Y as f, b as p, x as m, y as h } from "./SidebarWorkflowSection-DrCNoS04.js"; +import { Vn as e, bn as t, fn as n, gn as r, in as i, kn as a, un as o, xn as s } from "./config-C9a-wT5M.js"; +import { a as c, n as l } from "./graphTraversal-DTdQWkn5.js"; +import { C as u, S as d, b as f, x as p, y as m } from "./generationSectionState-DuXxSw-j.js"; +import { _ as ee, a as te, c as ne, d as re, f as ie, g as ae, h as oe, i as se, l as ce, m as le, n as ue, o as de, p as fe, r as pe, s as me, t as he, u as ge } from "./mjr-primevue-C07IsEdU.js"; +import { t as _e } from "./mjr-vue-vendor-CEDOnn2t.js"; // ui/features/viewer/floatingViewerProgress.ts -var g = "progress-update", _ = "__MJR_MFV_PROGRESS_SERVICE__"; -function ee() { +var h = "progress-update", g = "__MJR_MFV_PROGRESS_SERVICE__"; +function ve() { return typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : {}; } -function v(e, t) { +function ye(e, t) { if (typeof CustomEvent == "function") return new CustomEvent(e, { detail: t }); let n = typeof Event == "function" ? new Event(e) : { type: e }; return n.detail = t, n; } -var te = class { +var be = class { constructor(e, t = () => s()) { this.id = String(e || ""), this.promptApi = null, this.executedNodeIds = [], this.totalNodes = 0, this.currentlyExecuting = null, this.errorDetails = null, this._getApp = typeof t == "function" ? t : () => null; } @@ -25,7 +27,7 @@ var te = class { getNodeLabel(e) { let t = this.getApiNode(e), n = t?._meta?.title || t?.class_type || ""; if (!n) { - let t = this._getApp?.(), r = u(l(t), e); + let t = this._getApp?.(), r = l(c(t), e); n = r?.title || r?.type || ""; } return String(n || "").trim(); @@ -60,9 +62,9 @@ var te = class { error(e) { this.errorDetails = e || null; } -}, ne = class extends EventTarget { - constructor({ getApi: t = (t) => e(t), getApp: r = () => s(), waitForApi: i = (e) => n(e) } = {}) { - super(), this._getApi = t, this._getApp = r, this._waitForApi = i, this.promptsMap = /* @__PURE__ */ new Map(), this.currentExecution = null, this.lastQueueRemaining = 0, this._api = null, this._listenerEntries = [], this._initPromise = null, this._queuePromptBinding = null; +}, xe = class extends EventTarget { + constructor({ getApi: n = (e) => t(e), getApp: r = () => s(), waitForApi: i = (t) => e(t) } = {}) { + super(), this._getApi = n, this._getApp = r, this._waitForApi = i, this.promptsMap = /* @__PURE__ */ new Map(), this.currentExecution = null, this.lastQueueRemaining = 0, this._api = null, this._listenerEntries = [], this._initPromise = null, this._hydrations = /* @__PURE__ */ new Map(); } getSnapshot() { return { @@ -76,7 +78,7 @@ var te = class { } getOrMakePrompt(e) { let t = String(e || "").trim() || "unknown", n = this.promptsMap.get(t); - return n || (n = new te(t, this._getApp), this.promptsMap.set(t, n)), n; + return n || (n = new be(t, this._getApp), this.promptsMap.set(t, n)), n; } async ensureInitialized({ api: e = null, app: t = null, timeoutMs: n = 0 } = {}) { return e && this._api === e ? e : !e && this._api ? this._api : (this._initPromise ||= this._ensureInitializedInternal({ @@ -100,45 +102,51 @@ var te = class { return r ? (this._attachApi(r), r) : null; } _attachApi(e) { - e && typeof e.addEventListener == "function" && this._api !== e && (this.dispose({ - resetPatchedQueuePrompt: !1, - keepState: !0 - }), this._api = e, this._patchQueuePrompt(e), this._attachApiListeners(e)); + e && typeof e.addEventListener == "function" && this._api !== e && (this.dispose({ keepState: !0 }), this._api = e, this._attachApiListeners(e)); } - _patchQueuePrompt(e) { - let t = this; - this._queuePromptBinding = a({ - api: e, - owner: this, - createWrapper(e) { - return async function(n, r, ...i) { - let a; - try { - a = await e.apply(this, [ - n, - r, - ...i - ]); - } catch (e) { - let n = t.getOrMakePrompt("error"); - throw n.error({ exception_type: "Unknown." }), t.currentExecution = n, t.dispatchProgressUpdate(), e; - } - let o = String(a?.prompt_id || a?.promptId || "").trim(); - if (o) { - let e = t.getOrMakePrompt(o); - e.setPrompt(r), t.currentExecution ||= e, t.dispatchEvent(v("queue-prompt", { prompt: e })), t.dispatchProgressUpdate(); - } - return a; - }; + async _hydratePrompt(e, t) { + let n = String(t?.id || "").trim(); + if (!n || n === "unknown" || t.promptApi || !e) return; + if (this._hydrations.has(n)) return this._hydrations.get(n); + let r = (async () => { + let r = await this._findPromptInJob(e, n) || await this._findPromptInQueue(e, n) || await this._findPromptInHistory(e, n); + if (r && !t.promptApi) { + t.setPrompt({ output: r }); + let e = t.currentlyExecuting; + e?.nodeId && (e.nodeLabel = t.getNodeLabel(e.nodeId) || e.nodeLabel), this.promptsMap.get(n) === t && this.dispatchProgressUpdate(); } - }); + })().catch((e) => console.debug?.(e)).finally(() => this._hydrations.delete(n)); + return this._hydrations.set(n, r), r; + } + async _findPromptInJob(e, t) { + if (typeof e.getJobDetail != "function") return null; + try { + let n = (await e.getJobDetail(t))?.workflow?.prompt; + return n && typeof n == "object" && !Array.isArray(n) ? n : null; + } catch (e) { + return console.debug?.(e), null; + } + } + async _fetchJson(e, t) { + if (typeof e.fetchApi != "function") return null; + let n = await e.fetchApi(t, { cache: "no-store" }); + return !n?.ok || typeof n.json != "function" ? null : n.json(); + } + async _findPromptInQueue(e, t) { + let n = await this._fetchJson(e, "/queue"), r = [...Array.isArray(n?.queue_running) ? n.queue_running : [], ...Array.isArray(n?.queue_pending) ? n.queue_pending : []]; + for (let e of r) if (Array.isArray(e) && String(e[1] || "") === t) return e[2] && typeof e[2] == "object" ? e[2] : null; + return null; + } + async _findPromptInHistory(e, t) { + let n = (await this._fetchJson(e, `/history/${encodeURIComponent(t)}`))?.[t]?.prompt; + return Array.isArray(n) && n[2] && typeof n[2] == "object" ? n[2] : null; } _attachApiListeners(e) { this._attachListener(e, "status", (e) => { e?.detail?.exec_info && (this.lastQueueRemaining = Number(e.detail.exec_info.queue_remaining) || 0, this.dispatchProgressUpdate()); - }), this._attachListener(e, "execution_start", (e) => { - let t = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); - t && (this.currentExecution = this.getOrMakePrompt(t), this.dispatchProgressUpdate()); + }), this._attachListener(e, "execution_start", (t) => { + let n = String(t?.detail?.prompt_id || t?.detail?.promptId || "").trim(); + n && (this.currentExecution = this.getOrMakePrompt(n), this.dispatchProgressUpdate(), this._hydratePrompt(e, this.currentExecution)); }), this._attachListener(e, "executing", (e) => { this.currentExecution ||= this.getOrMakePrompt("unknown"), this.currentExecution.executing(e?.detail), e?.detail ?? (this.currentExecution = null), this.dispatchProgressUpdate(); }), this._attachListener(e, "progress", (e) => { @@ -172,27 +180,22 @@ var te = class { }); } dispatchProgressUpdate() { - this.dispatchEvent(v(g, this.getSnapshot())); + this.dispatchEvent(ye(h, this.getSnapshot())); } - dispose({ resetPatchedQueuePrompt: e = !1, keepState: t = !1 } = {}) { + dispose({ keepState: e = !1 } = {}) { for (let { api: e, type: t, handler: n } of this._listenerEntries.splice(0)) try { e?.removeEventListener?.(t, n); } catch (e) { console.debug?.(e); } - if (e && this._queuePromptBinding?.owner === this) try { - this._queuePromptBinding.restore?.(); - } catch (e) { - console.debug?.(e); - } - this._queuePromptBinding = null, this._api = null, t || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0); + this._api = null, e || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0); } -}, y = ee(), b = y[_] || new ne(); -y[_] || (y[_] = b); -function x(e = {}) { - return b.ensureInitialized(e); +}, _ = ve(), v = _[g] || new xe(); +_[g] || (_[g] = v); +function y(e = {}) { + return v.ensureInitialized(e); } -function re(e) { +function Se(e) { let t = Math.max(0, Number(e?.queue) || 0), n = e?.prompt || null; if (n?.errorDetails) return [ String(n.errorDetails?.exception_type || "Execution error").trim(), @@ -216,7 +219,7 @@ function re(e) { } return t > 0 ? `(${t}) Running... in another tab` : "Idle"; } -function ie(e) { +function Ce(e) { let t = e?.prompt || null; if (t?.errorDetails) { let e = t?.errorDetails || {}, n = String(t?.currentlyExecuting?.nodeLabel || e?.node_type || e?.node_id || "Execution").trim(), r = e?.exception_message ?? e?.error ?? e?.message ?? e?.detail ?? e?.reason ?? "", i = (Array.isArray(r) ? r.map((e) => String(e || "").trim()).filter(Boolean).join(" | ") : String(r || "").trim()).replace(/\s+/g, " ").trim(); @@ -227,7 +230,7 @@ function ie(e) { let r = String(n.nodeLabel || n.nodeId || "Node").trim(), i = Number(n.step), a = Number(n.maxSteps); return Number.isFinite(i) && Number.isFinite(a) && a > 0 ? n.pass > 1 ? `${r} #${n.pass} - ${i}/${a}` : `${r} - ${i}/${a}` : r; } -function S(e, t) { +function b(e, t) { if (!e?._progressEl && !e?._mediaProgressEl) return; let n = t?.prompt || null, r = String(n?.errorDetails?.node_id || n?.currentlyExecuting?.nodeId || "").trim(), i = "0%", a = "0%", o = !!n?.errorDetails; if (n?.currentlyExecuting) { @@ -238,12 +241,12 @@ function S(e, t) { let e = Number(n.currentlyExecuting?.step), t = Number(n.currentlyExecuting?.maxSteps); Number.isFinite(e) && Number.isFinite(t) && t > 0 && (a = `${Math.max(0, Math.min(100, e / t * 100))}%`); } else o && (i = "100%", a = "100%"); - if (e._progressCurrentNodeId = r || null, e._progressEl && (e._progressNodesEl.style.width = i, e._progressStepsEl.style.width = a, e._progressTextEl.textContent = re(t), e._progressEl.classList.toggle("is-error", o), e._progressEl.classList.toggle("is-clickable", !!r), e._progressEl.title = r ? "Execution progress - click to center active node" : "Execution progress"), e._mediaProgressEl) { - let n = ie(t); + if (e._progressCurrentNodeId = r || null, e._progressEl && (e._progressNodesEl.style.width = i, e._progressStepsEl.style.width = a, e._progressTextEl.textContent = Se(t), e._progressEl.classList.toggle("is-error", o), e._progressEl.classList.toggle("is-clickable", !!r), e._progressEl.title = r ? "Execution progress - click to center active node" : "Execution progress"), e._mediaProgressEl) { + let n = Ce(t); e._mediaProgressTextEl.textContent = n, e._mediaProgressEl.title = n || "", e._mediaProgressEl.classList.toggle("is-error", o), e._mediaProgressEl.classList.toggle("is-visible", !!n); } } -function ae(e, t) { +function we(e, t) { let n = String(t || "").trim(); if (!n) return !1; try { @@ -252,7 +255,7 @@ function ae(e, t) { return console.debug?.(e), !1; } } -function oe(e) { +function Te(e) { let t = document.createElement("div"); t.className = "mjr-mfv-progress", t.setAttribute("role", "status"), t.setAttribute("aria-live", "polite"); let n = document.createElement("div"); @@ -263,104 +266,133 @@ function oe(e) { i.className = "mjr-mfv-progress-overlay", i.setAttribute("aria-hidden", "true"); let a = document.createElement("span"); return a.className = "mjr-mfv-progress-text", a.textContent = "Idle", t.appendChild(n), t.appendChild(r), t.appendChild(i), t.appendChild(a), t.addEventListener("pointerdown", (t) => { - t.button === 0 && ae(e, e._progressCurrentNodeId) && (t.preventDefault(), t.stopPropagation()); - }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && b.removeEventListener(g, e._progressUpdateHandler), e._progressUpdateHandler = (t) => { - S(e, t?.detail || b.getSnapshot()); - }, b.addEventListener(g, e._progressUpdateHandler), x({ timeoutMs: 4e3 }).catch((e) => { + t.button === 0 && we(e, e._progressCurrentNodeId) && (t.preventDefault(), t.stopPropagation()); + }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && v.removeEventListener(h, e._progressUpdateHandler), e._progressUpdateHandler = (t) => { + b(e, t?.detail || v.getSnapshot()); + }, v.addEventListener(h, e._progressUpdateHandler), y({ timeoutMs: 4e3 }).catch((e) => { console.debug?.(e); - }), S(e, b.getSnapshot()), t; + }), b(e, v.getSnapshot()), t; } -function se(e) { +function Ee(e) { let t = document.createElement("div"); t.className = "mjr-mfv-media-progress", t.setAttribute("aria-hidden", "true"); let n = document.createElement("span"); - return n.className = "mjr-mfv-media-progress-text", t.appendChild(n), e._mediaProgressEl = t, e._mediaProgressTextEl = n, S(e, b.getSnapshot()), t; + return n.className = "mjr-mfv-media-progress-text", t.appendChild(n), e._mediaProgressEl = t, e._mediaProgressTextEl = n, b(e, v.getSnapshot()), t; } -function ce(e) { +function De(e) { if (e?._progressUpdateHandler) try { - b.removeEventListener(g, e._progressUpdateHandler); + v.removeEventListener(h, e._progressUpdateHandler); } catch (e) { console.debug?.(e); } e._progressUpdateHandler = null, e._progressCurrentNodeId = null, e._progressEl = null, e._progressNodesEl = null, e._progressStepsEl = null, e._progressTextEl = null, e._mediaProgressEl = null, e._mediaProgressTextEl = null; } -// ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts -var C = /* @__PURE__ */ new Map(), w = null; -async function le(e) { - let t = Array.from(new Set(T(e).map((e) => O(e)).filter(Boolean))); - if (t.length && t.filter((e) => !C.has(e)).length) try { - w ||= i("/object_info").then((e) => e?.ok ? e.json() : null).then((e) => { - if (e && typeof e == "object") for (let [t, n] of Object.entries(e)) C.set(String(t), n); - return e; - }).catch(() => null), await w; - } catch {} -} -function ue(e) { - let t = be(e), n = xe(e); - for (let e of t) { - let t = Se(L(e)); - if (t) return we(t, n), R(t), t; +// ui/utils/dom.ts +function Oe(e, t) { + if (!t) return null; + try { + if (!e) return null; + if (e instanceof Element && typeof e.closest == "function") return e.closest(t); + let n = e?.parentElement; + if (n && typeof n.closest == "function") return n.closest(t); + } catch (e) { + console.debug?.(e); } return null; } -function T(e, t = null) { +function ke(e) { + let t = String(e ?? ""); + try { + if (typeof CSS?.escape == "function") return CSS.escape(t); + } catch (e) { + console.debug?.(e); + } + return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); +} +async function Ae(e) { + try { + return navigator?.clipboard?.writeText ? (await navigator.clipboard.writeText(String(e ?? "")), !0) : !1; + } catch { + return !1; + } +} +// ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts +var x = /* @__PURE__ */ new Map(), S = null; +async function C(e) { + let t = Array.from(new Set(w(e).map((e) => D(e)).filter(Boolean))); + if (t.length && t.filter((e) => !x.has(e)).length) try { + S ||= n("/object_info").then((e) => e?.ok ? e.json() : null).then((e) => { + if (e && typeof e == "object") for (let [t, n] of Object.entries(e)) x.set(String(t), n); + return e; + }).catch(() => null), await S; + } catch {} +} +function je(e) { + let t = Ue(e), n = We(e); + for (let e of t) { + let t = Ge(P(e)); + if (t) return qe(t, n), F(t), t; + } + return null; +} +function w(e, t = null) { let n = t?.includeSubgraphs !== !1, r = Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : []; if (!n) return r; - let i = [...r], a = H(e); + let i = [...r], a = B(e); for (let n of r) { - let r = W(e, n, a); - r && i.push(...T(r, t)); + let r = H(e, n, a); + r && i.push(...w(r, t)); } return i; } -function E(e, t, n = null) { +function T(e, t, n = null) { let r = n?.includeSubgraphs !== !1, i = String(t ?? ""); if (!i) return null; if (!r) return (Array.isArray(e?.nodes) ? e.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === i) || null; - if (i.includes("::")) return Pe(e, i.split("::").filter(Boolean)); + if (i.includes("::")) return nt(e, i.split("::").filter(Boolean)); let a = (Array.isArray(e?.nodes) ? e.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === i) || null; if (a) return a; for (let t of Array.isArray(e?.nodes) ? e.nodes : []) { - let n = W(e, t, H(e)), r = n ? E(n, i) : null; + let n = H(e, t, B(e)), r = n ? T(n, i) : null; if (r) return r; } return null; } +function E(e) { + return f(e); +} function D(e) { return p(e); } -function O(e) { - return m(e); -} -function de(e) { +function Me(e) { return d(e); } -function k(e) { - let t = fe(e), n = e?.properties && typeof e.properties == "object" ? e.properties : null; +function O(e) { + let t = Ne(e), n = e?.properties && typeof e.properties == "object" ? e.properties : null; if (Array.isArray(e?._mjrSubgraphProxyParams)) for (let n of e._mjrSubgraphProxyParams) { let e = String(n?.label || n?.key || "").trim(); e && !t.some(([t]) => String(t) === e) && t.push([e, n?.value]); } - if (n) for (let [e, r] of Object.entries(n)) ge(e) || r != null && typeof r != "object" && t.push([e, r]); + if (n) for (let [e, r] of Object.entries(n)) Le(e) || r != null && typeof r != "object" && t.push([e, r]); return t.slice(0, 160); } -function fe(e) { +function Ne(e) { let t = [], n = e?._mjrPromptInputs && typeof e._mjrPromptInputs == "object" ? e._mjrPromptInputs : null, r = e?.inputs && typeof e.inputs == "object" ? e.inputs : null; - if (n && !Array.isArray(n)) for (let [e, r] of Object.entries(n)) M(r) || t.push([e, r]); - if (r && !Array.isArray(r)) for (let [e, n] of Object.entries(r)) M(n) || t.some(([t]) => String(t) === String(e)) || t.push([e, n]); - for (let { label: n, value: r } of A(e)) t.some(([e]) => String(e) === String(n)) || t.push([n, r]); + if (n && !Array.isArray(n)) for (let [e, r] of Object.entries(n)) j(r) || t.push([e, r]); + if (r && !Array.isArray(r)) for (let [e, n] of Object.entries(r)) j(n) || t.some(([t]) => String(t) === String(e)) || t.push([e, n]); + for (let { label: n, value: r } of k(e)) t.some(([e]) => String(e) === String(n)) || t.push([n, r]); return t; } -function A(e) { +function k(e) { let t = e?.widgets_values; - if (pe(t)) return Object.entries(t).map(([e, t], n) => ({ + if (Pe(t)) return Object.entries(t).map(([e, t], n) => ({ label: e, value: t, index: n })); - let n = me(t), r = Array.isArray(e?.widgets) ? e.widgets : [], i = P(_e(e)), a = he(e); + let n = Fe(t), r = Array.isArray(e?.widgets) ? e.widgets : [], i = ze(Re(e)), a = Ie(e); return n.map((t, n) => { - let o = ye(e, n, t); + let o = He(e, n, t); return { label: a[n] || r[n]?.name || r[n]?.label || i[n] || o || `param ${n + 1}`, value: t, @@ -368,70 +400,70 @@ function A(e) { }; }); } -function pe(e) { - return !(!e || typeof e != "object" || Array.isArray(e) || j(e)); +function Pe(e) { + return !(!e || typeof e != "object" || Array.isArray(e) || A(e)); } -function me(e) { +function Fe(e) { if (Array.isArray(e)) return e; - if (!j(e)) return []; + if (!A(e)) return []; let t = Math.max(0, Math.floor(Number(e.length) || 0)), n = []; for (let r = 0; r < t; r += 1) n.push(e[r]); return n; } -function j(e) { +function A(e) { if (!e || typeof e != "object" || Array.isArray(e)) return !1; let t = Number(e.length); return !(!Number.isFinite(t) || t < 0); } -function he(e) { - let t = (Array.isArray(e?.inputs) ? e.inputs : []).filter(F), n = [], r = /* @__PURE__ */ new Set(), i = (e) => { +function Ie(e) { + let t = (Array.isArray(e?.inputs) ? e.inputs : []).filter(N), n = [], r = /* @__PURE__ */ new Set(), i = (e) => { let t = `${String(e?.name || "")}\u0000${String(e?.label || "")}\u0000${String(e?.link ?? "")}`; r.has(t) || (r.add(t), n.push(e)); }; for (let e of t) i(e); return n.map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); } -function M(e) { +function j(e) { return Array.isArray(e) && e.length === 2 && String(e[0] ?? "").trim() !== "" && Number.isFinite(Number(e[1])); } -function ge(e) { - let t = V(String(e ?? "").trim()); +function Le(e) { + let t = z(String(e ?? "").trim()); return !t || t === "cnr_id" || t === "ver" || t === "node_name_for_s&r" || t === "subgraph_name" || t === "subgraph_id" || t === "enabletabs" || t === "tabwidth" || t === "tabxoffset" || t === "hassecondtab" || t === "secondtabtext" || t === "secondtaboffset" || t === "secondtabwidth" || t.startsWith("ue_"); } -function _e(e) { - let t = O(e); - return t && C.get(t) || null; +function Re(e) { + let t = D(e); + return t && x.get(t) || null; } -function N(e) { +function M(e) { let t = e?.input_order; if (t && typeof t == "object") return [...Array.isArray(t.required) ? t.required : [], ...Array.isArray(t.optional) ? t.optional : []].filter(Boolean); let n = e?.input; return n && typeof n == "object" ? ["required", "optional"].flatMap((e) => n[e] && typeof n[e] == "object" ? Object.keys(n[e]) : []).filter(Boolean) : []; } -function P(e) { +function ze(e) { let t = e?.input; - if (!t || typeof t != "object") return N(e); + if (!t || typeof t != "object") return M(e); let n = []; for (let e of ["required", "optional"]) { let r = t[e]; - if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) I(t) && n.push(e); + if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) Be(t) && n.push(e); } - return n.length ? n : N(e); + return n.length ? n : M(e); } -function F(e) { +function N(e) { return !e || typeof e != "object" ? !1 : !!(e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim() || e.widget_index != null || e.widgetIndex != null); } -function I(e) { +function Be(e) { let t = Array.isArray(e) ? e : [], n = t[0], r = t[1] && typeof t[1] == "object" && !Array.isArray(t[1]) ? t[1] : null; - return r?.forceInput === !0 || r?.rawLink === !0 ? !1 : r?.widgetType && String(r.widgetType).trim() ? !0 : ve(n); + return r?.forceInput === !0 || r?.rawLink === !0 ? !1 : r?.widgetType && String(r.widgetType).trim() ? !0 : Ve(n); } -function ve(e) { +function Ve(e) { if (Array.isArray(e)) return !0; let t = String(e || "").trim().toUpperCase(); return t ? t === "INT" || t === "FLOAT" || t === "STRING" || t === "BOOLEAN" || t === "BOOL" || t === "COMBO" || t === "ENUM" : !1; } -function ye(e, t, n) { - let r = O(e), i = D(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase(); +function He(e, t, n) { + let r = D(e), i = E(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase(); if (a.includes("ksamplerselect")) return "sampler_name"; if (a.includes("ksampler")) return [ "seed", @@ -459,8 +491,8 @@ function ye(e, t, n) { if (t === 2) return "device"; } if (/primitive(?:int|float|string|boolean)|constant/.test(a) && t === 0) { - let e = V(i); - return e && e !== V(r) ? e : "value"; + let e = z(i); + return e && e !== z(r) ? e : "value"; } if (a.includes("cliptext") || a.includes("prompt")) return t === 0 ? "text" : null; if (o.includes(".safetensors") || o.includes(".ckpt")) return "model"; @@ -472,8 +504,8 @@ function ye(e, t, n) { } return null; } -function be(e) { - let t = L(e?.metadata_raw), n = L(e?.metadata); +function Ue(e) { + let t = P(e?.metadata_raw), n = P(e?.metadata); return [ e?.workflow, e?.Workflow, @@ -514,8 +546,8 @@ function be(e) { n?.Prompt ].filter((e) => e != null); } -function xe(e) { - let t = L(e?.metadata_raw), n = L(e?.metadata), r = [ +function We(e) { + let t = P(e?.metadata_raw), n = P(e?.metadata), r = [ e?.prompt, e?.Prompt, t?.prompt, @@ -524,12 +556,12 @@ function xe(e) { n?.Prompt ]; for (let e of r) { - let t = L(e); + let t = P(e); if (t && typeof t == "object" && !Array.isArray(t)) return t; } return null; } -function L(e) { +function P(e) { if (!e) return null; if (typeof e == "object") return e; if (typeof e != "string") return null; @@ -541,16 +573,16 @@ function L(e) { return null; } } -function Se(e) { +function Ge(e) { if (!e || typeof e != "object") return null; if (Array.isArray(e.nodes)) return e; - let t = Ce(e); + let t = Ke(e); if (t) return t; - if (e.prompt && typeof e.prompt == "object") return h(e.prompt); - let n = h(e); + if (e.prompt && typeof e.prompt == "object") return m(e.prompt); + let n = m(e); return n && Array.isArray(n.nodes) ? n : null; } -function Ce(e) { +function Ke(e) { for (let t of [ "workflow", "Workflow", @@ -566,33 +598,33 @@ function Ce(e) { } return null; } -function R(e, t = /* @__PURE__ */ new WeakSet()) { +function F(e, t = /* @__PURE__ */ new WeakSet()) { if (!e || typeof e != "object" || t.has(e)) return; t.add(e); - let n = H(e); + let n = B(e); for (let r of Array.isArray(e?.nodes) ? e.nodes : []) { - De(r, n); - let i = W(e, r, n); - i && (Oe(r, i), R(i, t)); + Xe(r, n); + let i = H(e, r, n); + i && (Ze(r, i), F(i, t)); } } -function we(e, t) { +function qe(e, t) { if (!e || typeof e != "object" || !t || typeof t != "object") return; - let n = Te(t); - n.length && z(e, n, /* @__PURE__ */ new WeakSet()); + let n = Je(t); + n.length && I(e, n, /* @__PURE__ */ new WeakSet()); } -function z(e, t, n) { +function I(e, t, n) { if (!e || typeof e != "object" || n.has(e)) return; n.add(e); - let r = H(e); + let r = B(e); for (let i of Array.isArray(e?.nodes) ? e.nodes : []) { - let a = Ee(i, t); + let a = Ye(i, t); a?.inputs && typeof a.inputs == "object" && !Array.isArray(a.inputs) && (i._mjrPromptInputs = a.inputs); - let o = W(e, i, r); - o && z(o, t, n); + let o = H(e, i, r); + o && I(o, t, n); } } -function Te(e) { +function Je(e) { if (!e || typeof e != "object" || Array.isArray(e)) return []; let t = []; for (let [n, r] of Object.entries(e)) { @@ -609,39 +641,39 @@ function Te(e) { } return t; } -function Ee(e, t) { - let n = String(e?.id ?? e?.ID ?? "").trim(), r = B(O(e)); +function Ye(e, t) { + let n = String(e?.id ?? e?.ID ?? "").trim(), r = L(D(e)); if (!n || !r) return null; - let i = t.find((e) => e.id === n && B(e.classType) === r); + let i = t.find((e) => e.id === n && L(e.classType) === r); if (i) return i; - let a = t.filter((e) => e.leafId === n && B(e.classType) === r); + let a = t.filter((e) => e.leafId === n && L(e.classType) === r); return a.length === 1 ? a[0] : null; } -function B(e) { +function L(e) { return String(e || "").trim().toLowerCase(); } -function De(e, t) { +function Xe(e, t) { if (!e || typeof e != "object") return; - let n = U(e).find((e) => t.has(String(e))); + let n = V(e).find((e) => t.has(String(e))); if (!n) return; let r = t.get(String(n)), i = String(r?.name || r?.title || e?.subgraph?.name || e?.subgraph_instance?.name || "").trim(); if (!i) return; let a = e?.properties && typeof e.properties == "object" ? e.properties : e.properties = {}; String(a.subgraph_name || "").trim() || (a.subgraph_name = i), String(a.subgraph_id || "").trim() || (a.subgraph_id = n); } -function Oe(e, t) { +function Ze(e, t) { let n = Array.isArray(e?.properties?.proxyWidgets) ? e.properties.proxyWidgets : []; if (!n.length || !Array.isArray(t?.nodes)) return; - let r = new Map(t.nodes.filter(Boolean).map((e) => [String(e?.id ?? e?.ID ?? ""), e])), i = ke(e), a = Ae(t), o = []; + let r = new Map(t.nodes.filter(Boolean).map((e) => [String(e?.id ?? e?.ID ?? ""), e])), i = Qe(e), a = R(t), o = []; for (let e = 0; e < n.length; e += 1) { let t = n[e], s = Array.isArray(t) ? t[0] : t?.nodeId ?? t?.node_id ?? t?.id, c = Array.isArray(t) ? t[1] : t?.widget ?? t?.name ?? t?.widgetName, l = r.get(String(s ?? "")); if (!l) continue; - let u = k(l); + let u = O(l); if (!u.length) continue; - let d = u.find(([e]) => V(e) === V(c)) || u.find(([e]) => V(e) === "value") || (u.length === 1 ? u[0] : null); + let d = u.find(([e]) => z(e) === z(c)) || u.find(([e]) => z(e) === "value") || (u.length === 1 ? u[0] : null); if (!d) continue; - let f = `${String(s)}:${je(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || Me(l, d[0], c); - (!i.size || i.has(V(p))) && o.push({ + let f = `${String(s)}:${$e(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || et(l, d[0], c); + (!i.size || i.has(z(p))) && o.push({ label: p, value: d[1], innerNodeId: s, @@ -650,49 +682,49 @@ function Oe(e, t) { } o.length && (e._mjrSubgraphProxyParams = o); } -function ke(e) { +function Qe(e) { let t = Array.isArray(e?.inputs) ? e.inputs : [], n = /* @__PURE__ */ new Set(); for (let e of t) { - if (!F(e)) continue; + if (!N(e)) continue; let t = String(e?.label || e?.localized_name || e?.name || "").trim(); - t && n.add(V(t)); + t && n.add(z(t)); } return n; } -function Ae(e) { +function R(e) { let t = Array.isArray(e?.inputs) ? e.inputs : [], n = Array.isArray(e?.links) ? e.links : [], r = /* @__PURE__ */ new Map(); for (let e of n) { let n = Array.isArray(e) ? e[1] : e?.origin_id ?? e?.originId ?? e?.from; if (String(n) !== "-10") continue; let i = Number(Array.isArray(e) ? e[2] : e?.origin_slot ?? e?.originSlot ?? e?.fromSlot), a = Array.isArray(e) ? e[3] : e?.target_id ?? e?.targetId ?? e?.to, o = Number(Array.isArray(e) ? e[4] : e?.target_slot ?? e?.targetSlot ?? e?.toSlot), s = Number.isFinite(i) ? t[i] : null, c = String(s?.label || s?.localized_name || s?.name || "").trim(); - c && a != null && V(c) !== "value" && (r.set(String(a), c), Number.isFinite(o) && r.set(`${String(a)}:${o}`, c)); + c && a != null && z(c) !== "value" && (r.set(String(a), c), Number.isFinite(o) && r.set(`${String(a)}:${o}`, c)); } return r; } -function je(e, t, n) { +function $e(e, t, n) { if (e && typeof e == "object" && !Array.isArray(e)) { let t = e.target_slot ?? e.targetSlot ?? e.slot; if (Number.isFinite(Number(t))) return Number(t); } return 0; } -function Me(e, t, n) { - let r = String(D(e) || "").trim(), i = String(t || n || "").trim(); - return r && i && V(i) !== "value" ? `${r} ${i}` : r || i || "param"; +function et(e, t, n) { + let r = String(E(e) || "").trim(), i = String(t || n || "").trim(); + return r && i && z(i) !== "value" ? `${r} ${i}` : r || i || "param"; } -function V(e) { +function z(e) { return String(e ?? "").trim().toLowerCase().replace(/\s+/g, "_"); } -function H(e) { +function B(e) { let t = [ ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] ], n = /* @__PURE__ */ new Map(); - for (let e of t) for (let t of Ne(e)) t != null && n.set(String(t), e); + for (let e of t) for (let t of tt(e)) t != null && n.set(String(t), e); return n; } -function Ne(e) { +function tt(e) { let t = e?.properties && typeof e.properties == "object" ? e.properties : {}; return [ e?.id, @@ -706,7 +738,7 @@ function Ne(e) { t.subgraphId ].filter((e) => e != null && String(e).trim()); } -function U(e) { +function V(e) { let t = e?.properties && typeof e.properties == "object" ? e.properties : {}; return [ e?.type, @@ -718,7 +750,7 @@ function U(e) { t.subgraph_name ].filter((e) => e != null && String(e).trim()); } -function W(e, t, n = H(e)) { +function H(e, t, n = B(e)) { let r = [ t?.subgraph, t?._subgraph, @@ -729,60 +761,138 @@ function W(e, t, n = H(e)) { t?.subgraph_instance?.graph, t?.inner_graph, t?.subgraph_graph, - ...U(t).map((e) => n.get(String(e))) + ...V(t).map((e) => n.get(String(e))) ]; for (let e of r) if (e && typeof e == "object" && Array.isArray(e.nodes)) return e; return Array.isArray(t?.nodes) ? { nodes: t.nodes } : null; } -function Pe(e, t) { +function nt(e, t) { let n = e, r = null; for (let e = 0; e < t.length; e += 1) { let i = String(t[e] ?? "").trim(); if (!i || (r = (Array.isArray(n?.nodes) ? n.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === i) || null, !r)) return null; if (e >= t.length - 1) break; - let a = W(n, r, H(n)); + let a = H(n, r, B(n)); if (!a) return null; n = a; } return r; } +// ui/vue/majoorPrimeVue.ts +var rt = { + Button: ie, + Checkbox: re, + InputText: ge, + Textarea: ce, + Select: me, + ToggleButton: de, + Badge: fe, + Tag: te, + Dialog: se, + Menu: pe, + Listbox: ue, + Tree: he, + VirtualScroller: ne +}; +function it(e) { + return e.use(ae, { + ripple: !1, + unstyled: !0, + zIndex: { overlay: 10100 } + }), e.use(oe), e.use(le), Object.entries(rt).forEach(([t, n]) => { + e.component(`M${t}`, n); + }), e; +} +// ui/vue/createVueApp.ts +function U(e, t = void 0) { + let n = _e(), r = ee(e, t); + return r.use(n), it(r), { + app: r, + pinia: n + }; +} +var W = /* @__PURE__ */ new Map(); +function at(e, t, n) { + try { + window.dispatchEvent(new CustomEvent("mjr:keepalive-attached", { detail: { + mountKey: String(e || "_mjrVueApp"), + host: t || null, + container: n || null + } })); + } catch {} +} +function ot(e) { + let t = document.createElement("div"); + return t.dataset.mjrKeepAliveHost = String(e || "_mjrVueApp"), t.style.height = "100%", t.style.width = "100%", t.style.minHeight = "0", t.style.display = "flex", t.style.flexDirection = "column", t.style.overflow = "hidden", t; +} +function st(e, t) { + e && t && (e.style.height = "100%", e.style.minHeight = "0", e.style.display = "flex", e.style.flexDirection = "column", e.style.overflow = "hidden", (e.firstChild !== t || e.childNodes.length !== 1) && (e.replaceChildren(t), at(t?.dataset?.mjrKeepAliveHost, t, e))); +} +function ct(e, t, n = "_mjrVueApp", { attachIfExists: r = !0 } = {}) { + if (!e) return !1; + let i = W.get(n), a = !1; + if (!i) { + let e = ot(n), { app: r } = U(t); + r.mount(e), i = { + app: r, + host: e, + container: null + }, W.set(n, i), a = !0; + } + return (a || r) && (st(e, i.host), i.container = e), a; +} +function lt(e = "_mjrVueApp") { + return W.has(e); +} +function ut(e, t = "_mjrVueApp") { + let n = W.get(t); + if (n?.app) { + try { + n.app.unmount(); + } catch {} + try { + n.host?.remove?.(); + } catch {} + W.delete(t); + } +} // ui/features/viewer/workflowSidebar/widgetAdapters.ts -function Fe(e, t, n = null) { +function dt(e, t, n = null) { switch (String(e?.type || "").toLowerCase()) { case "number": case "int": - case "float": return Le(e, t, n); - case "combo": return Re(e, t, n); + case "float": return pt(e, t, n); + case "combo": return mt(e, t, n); case "text": case "string": - case "customtext": return ze(e, t, n); + case "customtext": return ht(e, t, n); case "toggle": - case "boolean": return Be(e, t, n); - default: return Ve(e); + case "boolean": return gt(e, t, n); + default: return _t(e); } } -function G(e, n, i = null) { +function G(e, t, n = null) { if (!e) return !1; - let a = String(e.type || "").toLowerCase(); - if (a === "number" || a === "int" || a === "float") { - let t = Number(n); - if (Number.isNaN(t)) return !1; - let r = e.options ?? {}, i = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(i, t)); - (a === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s; - } else e.value = a === "toggle" || a === "boolean" ? !!n : n; + let i = String(e.type || "").toLowerCase(); + if (i === "number" || i === "int" || i === "float") { + let n = Number(t); + if (Number.isNaN(n)) return !1; + let r = e.options ?? {}, a = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(a, n)); + (i === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s; + } else e.value = i === "toggle" || i === "boolean" ? !!t : t; try { - let n = t(), o = i ?? e?.parent ?? null, s = e.value; - e.callback?.(e.value, n, o, null, e), (a === "number" || a === "int" || a === "float") && (e.value = s), Ie(e), r(o); + let t = r(), o = n ?? e?.parent ?? null, s = e.value; + e.callback?.(e.value, t, o, null, e), (i === "number" || i === "int" || i === "float") && (e.value = s), ft(e), a(o); } catch (e) { console.debug?.("[MFV] writeWidgetValue", e); } return !0; } -function Ie(e) { +function ft(e) { let t = String(e.value ?? ""), n = e?.inputEl ?? e?.element ?? e?.el ?? e?.cachedDeepestByFrame?.widget?.inputEl ?? e?.cachedDeepestByFrame?.widget?.element ?? e?.cachedDeepestByFrame?.widget?.el ?? null; n != null && "value" in n && n.value !== t && (n.value = t); } -function Le(e, t, n = null) { +function pt(e, t, n = null) { let r = document.createElement("input"); r.type = "number", r.className = "mjr-ws-input", r.value = e.value ?? ""; let i = e.options ?? {}, a = String(e?.type || "").toLowerCase() === "int" || i.precision === 0 || i.round === 1; @@ -798,7 +908,7 @@ function Le(e, t, n = null) { G(e, r.value, n) && (r.value = String(e.value), t?.(e.value)); }), r; } -function Re(e, t, n = null) { +function mt(e, t, n = null) { let r = document.createElement("select"); r.className = "mjr-ws-input"; let i = e.options?.values ?? []; @@ -816,7 +926,7 @@ function Re(e, t, n = null) { G(e, r.value, n) && t?.(e.value); }), r; } -function ze(e, t, n = null) { +function ht(e, t, n = null) { let r = document.createElement("div"); r.className = "mjr-ws-text-wrapper"; let i = document.createElement("textarea"); @@ -830,7 +940,7 @@ function ze(e, t, n = null) { G(e, i.value, n), t?.(e.value), a(); }), r.appendChild(i), r._mjrAutoFit = a, i._mjrAutoFit = a, requestAnimationFrame(a), r; } -function Be(e, t, n = null) { +function gt(e, t, n = null) { let r = document.createElement("label"); r.className = "mjr-ws-toggle-label"; let i = document.createElement("input"); @@ -838,12 +948,12 @@ function Be(e, t, n = null) { G(e, i.checked, n) && t?.(e.value); }), r.appendChild(i), r; } -function Ve(e) { +function _t(e) { let t = document.createElement("input"); return t.type = "text", t.className = "mjr-ws-input mjr-ws-readonly", t.value = e.value == null ? "" : String(e.value), t.readOnly = !0, t.tabIndex = -1, t; } // ui/app/settings/MajoorSettingsDialog.ts -var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:settings-dialog-visibility", Y = null, He = { +var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:settings-dialog-visibility", Y = null, vt = { Cards: { icon: "pi pi-th-large", label: "Cards" @@ -897,7 +1007,7 @@ var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:setting label: "General" } }; -function Ue() { +function yt() { if (typeof document > "u" || document.getElementById(q)) return; let e = document.createElement("style"); e.id = q, e.textContent = ` @@ -1078,23 +1188,23 @@ function Ue() { } `, document.head.appendChild(e); } -function We(e) { +function bt(e) { return String(e || "").replace(/^\s*Majoor:\s*/i, "").trim(); } -function Ge(e) { +function xt(e) { let t = Array.isArray(e?.category) ? e.category : []; return String(t[1] || "General").trim() || "General"; } -function Ke(e) { +function St(e) { return (Array.isArray(e?.category) ? e.category : []).slice(2).filter(Boolean).join(" / ") || "General"; } -function qe(e) { - return He[e] || { +function Ct(e) { + return vt[e] || { icon: "pi pi-sliders-h", label: e || "General" }; } -function X(e, t) { +function wt(e, t) { return !t || [ e?.id, e?.name, @@ -1102,7 +1212,7 @@ function X(e, t) { ...Array.isArray(e?.category) ? e.category : [] ].join(" ").toLowerCase().includes(t); } -function Z(e, t) { +function X(e, t) { if (typeof e?.onChange == "function") { e.defaultValue = t; try { @@ -1115,38 +1225,38 @@ function Z(e, t) { } } } -function Je(e) { +function Tt(e) { let t = String(e?.type || "text").toLowerCase(), n = e?.defaultValue, r; - if (t === "boolean") return r = document.createElement("input"), r.type = "checkbox", r.checked = !!n, r.addEventListener("change", () => Z(e, r.checked)), r; + if (t === "boolean") return r = document.createElement("input"), r.type = "checkbox", r.checked = !!n, r.addEventListener("change", () => X(e, r.checked)), r; if (t === "combo") { r = document.createElement("select"); for (let t of e?.options || []) { let e = document.createElement("option"), n = t && typeof t == "object" ? t.value ?? t.text ?? t.label : t; e.value = String(n ?? ""), e.textContent = String(t && typeof t == "object" ? t.text ?? t.label ?? t.value : t), r.appendChild(e); } - return r.value = String(n ?? ""), r.addEventListener("change", () => Z(e, r.value)), r; + return r.value = String(n ?? ""), r.addEventListener("change", () => X(e, r.value)), r; } if (r = document.createElement("input"), r.type = t === "color" ? "color" : t === "number" ? "number" : t === "password" ? "password" : "text", e?.attrs && typeof e.attrs == "object") for (let [t, n] of Object.entries(e.attrs)) n != null && r.setAttribute(t, String(n)); r.value = String(n ?? ""); let i = t === "color" ? "input" : "change"; return r.addEventListener(i, () => { - Z(e, t === "number" ? Number(r.value) : r.value); + X(e, t === "number" ? Number(r.value) : r.value); }), r; } -function Ye(e, t, n = "") { +function Et(e, t, n = "") { e.replaceChildren(); let r = document.createElement("div"); r.className = "mjr-settings-stack", e.appendChild(r); let i = /* @__PURE__ */ new Map(); for (let e of t || []) { - if (!X(e, n)) continue; - let t = Ge(e), r = Ke(e); + if (!wt(e, n)) continue; + let t = xt(e), r = St(e); i.has(t) || i.set(t, /* @__PURE__ */ new Map()); let a = i.get(t); a.has(r) || a.set(r, []), a.get(r).push(e); } for (let [e, t] of i.entries()) { - let i = Array.from(t.values()).flat(), a = qe(e), o = document.createElement("details"); + let i = Array.from(t.values()).flat(), a = Ct(e), o = document.createElement("details"); o.className = "mjr-settings-group", o.open = !!n; let s = document.createElement("summary"), c = document.createElement("span"); c.className = "mjr-settings-group-icon"; @@ -1169,43 +1279,43 @@ function Ye(e, t, n = "") { let n = document.createElement("label"); n.className = "mjr-settings-row"; let r = document.createElement("div"), i = document.createElement("div"); - if (i.className = "mjr-settings-name", i.textContent = We(e?.name) || e?.id || "Setting", r.appendChild(i), e?.tooltip) { + if (i.className = "mjr-settings-name", i.textContent = bt(e?.name) || e?.id || "Setting", r.appendChild(i), e?.tooltip) { let t = document.createElement("div"); t.className = "mjr-settings-tip", t.textContent = String(e.tooltip), r.appendChild(t); } - n.appendChild(r), n.appendChild(Je(e)), t.appendChild(n); + n.appendChild(r), n.appendChild(Tt(e)), t.appendChild(n); } p.appendChild(t); } o.appendChild(p), r.appendChild(o); } } -function Xe() { - Ue(); +function Dt() { + yt(); let e = document.createElement("div"); e.id = K, e.hidden = !0, e.addEventListener("click", (t) => { - t.target === e && Q(); + t.target === e && Z(); }); let t = document.createElement("div"); t.className = "mjr-settings-panel", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "true"); let n = document.createElement("div"); n.className = "mjr-settings-head"; let r = document.createElement("div"); - r.className = "mjr-settings-title", r.textContent = c("settings.majoor.title", "Majoor Assets Manager Settings"); - let i = document.createElement("button"); - i.type = "button", i.className = "mjr-settings-close", i.textContent = "X", i.setAttribute("aria-label", c("btn.close", "Close")), i.addEventListener("click", Q), n.append(r, i); - let a = document.createElement("div"); - a.className = "mjr-settings-tools"; - let o = document.createElement("input"); - o.type = "search", o.className = "mjr-settings-search", o.placeholder = c("placeholder.searchSettings", "Search settings"), a.appendChild(o); - let s = document.createElement("div"); - return s.className = "mjr-settings-body", t.append(n, a, s), e.appendChild(t), document.body.appendChild(e), { - body: s, + r.className = "mjr-settings-title", r.textContent = i("settings.majoor.title", "Majoor Assets Manager Settings"); + let a = document.createElement("button"); + a.type = "button", a.className = "mjr-settings-close", a.textContent = "X", a.setAttribute("aria-label", i("btn.close", "Close")), a.addEventListener("click", Z), n.append(r, a); + let o = document.createElement("div"); + o.className = "mjr-settings-tools"; + let s = document.createElement("input"); + s.type = "search", s.className = "mjr-settings-search", s.placeholder = i("placeholder.searchSettings", "Search settings"), o.appendChild(s); + let c = document.createElement("div"); + return c.className = "mjr-settings-body", t.append(n, o, c), e.appendChild(t), document.body.appendChild(e), { + body: c, root: e, - search: o + search: s }; } -function Q() { +function Z() { if (Y?.root) { Y.root.hidden = !0; try { @@ -1215,10 +1325,10 @@ function Q() { } } } -function Ze(e = s()) { +function Ot(e = s()) { if (typeof document > "u") return !1; - Y?.root?.isConnected || (Y = Xe()); - let t = f(e), n = () => Ye(Y.body, t, String(Y.search.value || "").trim().toLowerCase()); + Y?.root?.isConnected || (Y = Dt()); + let t = u(e), n = () => Et(Y.body, t, String(Y.search.value || "").trim().toLowerCase()); Y.search.oninput = n, Y.search.value = "", n(), Y.root.hidden = !1; try { window.dispatchEvent(new CustomEvent(J, { detail: { open: !0 } })); @@ -1228,12 +1338,32 @@ function Ze(e = s()) { return setTimeout(() => Y?.search?.focus?.(), 0), !0; } // ui/app/openMajoorSettings.ts -function $(e = s()) { - return Ze(e); +function Q(e = s()) { + return Ot(e); } try { - typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.openSettings = $); + typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.openSettings = Q); } catch (e) { console.debug?.(e); } -export { x as _, le as a, k as c, A as d, T as f, ce as g, oe as h, G as i, O as l, se as m, J as n, E as o, ue as p, Fe as r, D as s, $ as t, de as u, b as v }; +// ui/utils/tooltipShortcuts.ts +function $(e, t) { + let n = String(e || "").trim(), r = String(t || "").trim(); + if (!r) return n; + if (!n) return r; + if (r.length === 1) { + let e = r.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + if (RegExp(`\\(${e}\\)|\\b${e}\\b`, "i").test(n)) return n; + } else if (n.toLowerCase().includes(r.toLowerCase())) return n; + return `${n} (${r})`; +} +function kt(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) { + if (!e) return ""; + let a = $(t, n); + if (e.title = a, r) { + let r = i ?? t; + e.setAttribute("aria-label", $(r, n)); + } + return a; +} +export { Ee as C, v as D, y as E, ke as S, De as T, k as _, dt as a, Ae as b, lt as c, C as d, T as f, Me as g, D as h, J as i, ct as l, O as m, kt as n, G as o, E as p, Q as r, U as s, $ as t, ut as u, w as v, Te as w, Oe as x, je as y }; diff --git a/dist/chunks/viewerOpenRequest-WCeGPIlE.js b/dist/chunks/viewerOpenRequest-WCeGPIlE.js deleted file mode 100644 index bcf99f5d..00000000 --- a/dist/chunks/viewerOpenRequest-WCeGPIlE.js +++ /dev/null @@ -1,36 +0,0 @@ -import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { r as t } from "./events-C65wdOHm.js"; -import { t as n } from "./Viewer-W-G40j3K.js"; -// ui/features/viewer/viewerOpenRequest.ts -var r = /* @__PURE__ */ e({ requestViewerOpen: () => o }); -function i(e) { - let t = String(e || "").trim().toLowerCase(); - return t === "ab" || t === "sidebyside" ? t : ""; -} -function a(e, t) { - let n = Array.isArray(e) ? e.filter(Boolean) : []; - return n.length ? n : t ? [t] : []; -} -function o({ assets: e = [], asset: r = null, index: o = 0, mode: s = "" } = {}) { - let c = a(e, r); - if (!c.length) return !1; - let l = Math.max(0, Math.min(Number(o) || 0, c.length - 1)), u = i(s), d = { - assets: c, - index: l, - mode: u, - handled: !1 - }; - try { - if (window.dispatchEvent(new CustomEvent(t.OPEN_VIEWER, { detail: d })), d.handled === !0) return !0; - } catch (e) { - console.debug?.(e); - } - try { - let e = n(); - return e.open(c, l), u && e.setMode?.(u), !0; - } catch (e) { - console.debug?.(e); - } - return !1; -} -export { r as n, o as t }; diff --git a/dist/chunks/viewerOpenRequest-WOJE90Gn.js b/dist/chunks/viewerOpenRequest-WOJE90Gn.js new file mode 100644 index 00000000..4fd60787 --- /dev/null +++ b/dist/chunks/viewerOpenRequest-WOJE90Gn.js @@ -0,0 +1,29 @@ +import { t as e } from "./rolldown-runtime-CGnMp29N.js"; +import { r as t } from "./events-1iwo5blr.js"; +// ui/features/viewer/viewerOpenRequest.ts +var n = /* @__PURE__ */ e({ requestViewerOpen: () => a }); +function r(e) { + let t = String(e || "").trim().toLowerCase(); + return t === "ab" || t === "sidebyside" ? t : ""; +} +function i(e, t) { + let n = Array.isArray(e) ? e.filter(Boolean) : []; + return n.length ? n : t ? [t] : []; +} +function a({ assets: e = [], asset: n = null, index: a = 0, mode: o = "" } = {}) { + let s = i(e, n); + if (!s.length) return !1; + let c = { + assets: s, + index: Math.max(0, Math.min(Number(a) || 0, s.length - 1)), + mode: r(o), + handled: !1 + }; + try { + window.dispatchEvent(new CustomEvent(t.OPEN_VIEWER, { detail: c })); + } catch (e) { + console.debug?.(e); + } + return c.handled === !0; +} +export { n, a as t }; diff --git a/dist/chunks/viewerRuntimeHosts-n0pKLECw.js b/dist/chunks/viewerRuntimeHosts-n0pKLECw.js deleted file mode 100644 index b4d266ce..00000000 --- a/dist/chunks/viewerRuntimeHosts-n0pKLECw.js +++ /dev/null @@ -1,1891 +0,0 @@ -import { Ct as e, St as t, _t as n, gt as r, ht as i, k as a, m as o, nt as s, o as c, tt as l, vt as u, xt as d } from "./events-C65wdOHm.js"; -// ui/app/settingsStore.ts -var f = "mjrSettings", p = "mjrMinimapSettings", m = /* @__PURE__ */ new Set([ - "POST", - "PUT", - "DELETE", - "PATCH" -]), h = 2e4, ee = 3e5, g = 3, _ = 400, v = 1e4, y = "/mjr/am/settings/security/bootstrap-token", b = "/mjr/am/", x = /* @__PURE__ */ new Map(); -function S(e) { - return new Promise((t) => setTimeout(t, e)); -} -function C(e) { - return m.has(String(e || "").trim().toUpperCase()); -} -function te(e) { - try { - let t = String(e || "").trim(); - if (!t) return ""; - if (t.startsWith("http://") || t.startsWith("https://")) { - let e = typeof globalThis < "u" && globalThis?.location?.origin ? String(globalThis.location.origin) : "http://localhost"; - return new URL(t, e).pathname || ""; - } - return t.split("?")[0] || ""; - } catch { - return ""; - } -} -function w(e) { - return te(e).startsWith(b); -} -function T(e) { - return te(e) === y; -} -function ne(e) { - try { - if (!e) return !1; - let t = String(e.name || ""); - if (t === "AbortError") return !1; - let n = String(e.message || "").toLowerCase(); - return t === "TypeError" ? n.includes("failed to fetch") || n.includes("networkerror") || n.includes("load failed") || n.includes("fetch") || n.includes("network") : n.includes("fetch") || n.includes("network") || n.includes("failed"); - } catch { - return !1; - } -} -function re(e) { - try { - let t = String(e?.headers?.get?.("x-request-id") || "").trim(), n = String(e?.headers?.get?.("retry-after") || "").trim(), r = null; - if (n) { - let e = Number(n); - if (Number.isFinite(e) && e >= 0) r = e; - else { - let e = Date.parse(n); - Number.isFinite(e) && (r = Math.max(0, (e - Date.now()) / 1e3)); - } - } - return { - requestId: t, - retryAfterSeconds: r - }; - } catch { - return { - requestId: "", - retryAfterSeconds: null - }; - } -} -function ie(e, t) { - if (!e || typeof e != "object") return e; - let { requestId: n, retryAfterSeconds: r } = re(t); - return n && !("request_id" in e) && (e.request_id = n), r !== null && !("retry_after" in e) && (e.retry_after = r), e; -} -function ae(e = {}) { - try { - let t = Number(e?.timeoutMs); - return Number.isFinite(t) ? Math.max(1e3, Math.min(ee, Math.floor(t))) : h; - } catch { - return h; - } -} -function oe(e = {}) { - let t = e?.signal || null; - if (typeof AbortController > "u") return { - signal: t || void 0, - timeoutMs: ae(e), - cleanup: () => {} - }; - let n = ae(e), r = new AbortController(), i = null, a = () => { - try { - i &&= (clearTimeout(i), null); - } catch (e) { - console.debug?.(e); - } - try { - r.abort(); - } catch (e) { - console.debug?.(e); - } - }; - try { - i = setTimeout(() => { - try { - r.abort(); - } catch (e) { - console.debug?.(e); - } - }, n); - } catch (e) { - console.debug?.(e); - } - try { - t && (t.aborted ? a() : t.addEventListener("abort", a, { once: !0 })); - } catch (e) { - console.debug?.(e); - } - return { - signal: r.signal, - timeoutMs: n, - cleanup: () => { - try { - i && clearTimeout(i); - } catch (e) { - console.debug?.(e); - } - try { - t && t.removeEventListener("abort", a); - } catch (e) { - console.debug?.(e); - } - } - }; -} -function se(e, t, n = {}) { - let r = String(e || "GET").trim().toUpperCase(), i = String(t || "").trim(); - return !r || !i ? "" : `${r}:${i}:timeout=${ae(n)}`; -} -function ce(e, t) { - let n = String(e || "").trim(); - if (!n) return t(); - if (x.has(n)) return x.get(n); - let r = Promise.resolve().then(() => t()).finally(() => { - try { - x.delete(n); - } catch (e) { - console.debug?.(e); - } - }); - return x.set(n, r), r; -} -function le(e, t, n) { - if (C(t)) try { - e instanceof Headers ? e.has("X-Requested-With") || e.set("X-Requested-With", "XMLHttpRequest") : e["X-Requested-With"] ||= "XMLHttpRequest"; - } catch (e) { - console.debug?.(e); - } - try { - e instanceof Headers ? e.has("X-MJR-OBS") || e.set("X-MJR-OBS", n ? "on" : "off") : "X-MJR-OBS" in e || (e["X-MJR-OBS"] = n ? "on" : "off"); - } catch (e) { - console.debug?.(e); - } -} -function ue(e, t) { - if (t) try { - e instanceof Headers ? (e.has("X-MJR-Token") || e.set("X-MJR-Token", t), e.has("Authorization") || e.set("Authorization", `Bearer ${t}`)) : ("X-MJR-Token" in e || (e["X-MJR-Token"] = t), "Authorization" in e || (e.Authorization = `Bearer ${t}`)); - } catch (e) { - console.debug?.(e); - } -} -async function de(e, t, n, r, { ensureWriteAuthToken: i, normalizeWriteAuthFailure: a, fetchAPI: o, options: s, retryCount: c }) { - let l = e.headers.get("content-type") || ""; - if (!l.includes("application/json")) return !r && C(n) && w(t) && !T(t) && Number(e.status || 0) === 401 && await i({ - force: !0, - allowCookieRefresh: !0 - }) ? await o(t, { - ...s, - _authRetryDone: !0 - }, c) : ie({ - ok: !1, - error: `Server returned non-JSON response (${e.status})`, - code: "INVALID_RESPONSE", - status: e.status, - content_type: l, - data: null - }, e); - let u = await e.json().catch((e) => (console.debug?.("[MJR API] JSON parse error:", e), null)); - if (typeof u != "object" || !u || Array.isArray(u) || typeof u.ok != "boolean") return ie({ - ok: !1, - error: "Invalid response structure", - code: "INVALID_RESPONSE", - status: e.status, - data: null - }, e); - if (u.ok === !0 && Number(e.status || 0) >= 400 && (u = { - ...u, - ok: !1, - error: u.error || `Server reported success with an HTTP error status (${e.status})`, - code: "INVALID_RESPONSE" - }), !("status" in u)) try { - u.status = e.status; - } catch (e) { - console.debug?.(e); - } - ie(u, e); - let d = Number(u?.status || e.status || 0), f = d === 429 || d === 503 || d === 504; - if (!u?.ok && f && n === "GET" && c < g && !s?.signal?.aborted) { - let e = Number(u?.retry_after); - return await S(Number.isFinite(e) ? Math.min(v, Math.max(0, e * 1e3)) : _ * (c + 1)), await o(t, s, c + 1); - } - return !r && C(n) && !T(t) && !u?.ok && (String(u?.code || "").toUpperCase() === "AUTH_REQUIRED" || Number(u?.status || 0) === 401) && await i({ - force: !0, - allowCookieRefresh: !0 - }) ? await o(t, { - ...s, - _authRetryDone: !0 - }, c) : (C(n) && w(t) && !T(t) && (u = a(u)), u); -} -function fe({ readObsEnabled: e = () => !1, readAuthToken: t = () => "", ensureWriteAuthToken: n = async () => "", normalizeWriteAuthFailure: r = (e) => e, trackApiCall: i = null } = {}) { - async function a(o, s = {}, c = 0) { - let l = typeof performance < "u" ? performance.now() : Date.now(), u = oe(s), d = null; - try { - let i = (s.method || "GET").toUpperCase(), l = !!s?._authRetryDone, f = typeof Headers < "u" ? new Headers(s.headers || {}) : { ...s.headers }; - le(f, i, !!e()); - let p = t(); - if (!p && C(i) && w(o) && !T(o)) { - try { - await n(); - } catch (e) { - console.debug?.(e); - } - p = t(); - } - ue(f, p); - let m = { - ...s, - headers: f, - signal: u.signal - }; - try { - delete m._authRetryDone, delete m.timeoutMs; - } catch (e) { - console.debug?.(e); - } - return d = await de(await fetch(o, m), o, i, l, { - ensureWriteAuthToken: n, - normalizeWriteAuthFailure: r, - fetchAPI: a, - options: s, - retryCount: c - }), d; - } catch (e) { - try { - if (String(e?.name || "") === "AbortError") return s?.signal && s.signal.aborted ? { - ok: !1, - error: "Aborted", - code: "ABORTED", - data: null - } : { - ok: !1, - error: `Request timed out after ${u.timeoutMs}ms`, - code: "TIMEOUT", - data: null, - timeout_ms: u.timeoutMs - }; - } catch (e) { - console.debug?.(e); - } - let t = String(s?.method || "GET").toUpperCase(); - if ((t === "GET" || t === "HEAD") && c < g && ne(e)) { - try { - await S(_ * (c + 1)); - } catch (e) { - console.debug?.(e); - } - return await a(o, s, c + 1); - } - return { - ok: !1, - error: e?.message || String(e || "Network error"), - code: "NETWORK_ERROR", - data: null, - retries: c - }; - } finally { - try { - let e = (typeof performance < "u" ? performance.now() : Date.now()) - l; - typeof i == "function" ? i(e, !d?.ok) : typeof window < "u" && window.MajoorMetrics && window.MajoorMetrics.trackApiCall(e, !d?.ok); - } catch (e) { - console.debug?.(e); - } - try { - u.cleanup?.(); - } catch (e) { - console.debug?.(e); - } - } - } - async function o(e, t = {}) { - return ce(t?.dedupe === !1 || t?.signal ? "" : String(t?.dedupeKey || "").trim() || se("GET", e, t), () => a(e, { - ...t, - method: "GET" - })); - } - async function s(e, t, n = {}) { - return a(e, { - ...n, - method: "POST", - headers: { - "Content-Type": "application/json", - ...n.headers - }, - body: JSON.stringify(t) - }); - } - return { - fetchAPI: a, - get: o, - post: s - }; -} -// ui/utils/ttlCache.ts -function E({ ttlMs: e = 0, maxSize: t = 100, now: n = () => Date.now() } = {}) { - let r = /* @__PURE__ */ new Map(); - function i() { - try { - let e = Number(n()); - return Number.isFinite(e) ? e : Date.now(); - } catch { - return Date.now(); - } - } - function a() { - try { - let t = Number(typeof e == "function" ? e() : e); - return Number.isFinite(t) ? Math.max(0, Math.floor(t)) : 0; - } catch { - return 0; - } - } - function o() { - try { - let e = Number(t); - return Number.isFinite(e) ? Math.max(1, Math.floor(e)) : 1; - } catch { - return 1; - } - } - function s(e, t, n) { - return !e || n > 0 && t - Number(e.at || 0) > n; - } - function c(e = i(), t = a()) { - if (t > 0) for (let [n, i] of r.entries()) s(i, e, t) && r.delete(n); - } - function l() { - let e = o(); - for (; r.size > e;) { - let e = r.keys().next().value; - if (e === void 0) break; - r.delete(e); - } - } - function u(e, t) { - r.delete(e), r.set(e, t); - } - return { - get(e) { - let t = i(), n = a(); - c(t, n); - let o = r.get(e); - if (o) { - if (s(o, t, n)) r.delete(e); - else return o.value; - } - }, - has(e) { - return this.get(e) !== void 0; - }, - set(e, t, n = {}) { - let o = Number(n?.at), s = { - value: t, - at: Number.isFinite(o) ? o : i() - }; - return r.has(e) ? u(e, s) : r.set(e, s), c(i(), a()), l(), t; - }, - delete(e) { - return r.delete(e); - }, - clear() { - r.clear(); - }, - prune() { - return c(i(), a()), l(), r.size; - }, - keys() { - return this.prune(), Array.from(r.keys()); - }, - entries() { - return this.prune(), Array.from(r.entries()).map(([e, t]) => [e, t.value]); - }, - get size() { - return this.prune(), r.size; - } - }; -} -// ui/features/panel/messages/toastHistory.ts -var pe = "mjr_toast_history_v1", me = "mjr_toast_history_last_read_v1", he = 60, ge = "mjr:toast-history-changed", D = null; -function O(e) { - return String(e || "").trim(); -} -function _e(e) { - let t = O(e).toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : t || "info"; -} -function ve(e) { - let t = Number(e); - return Number.isFinite(t) ? t : null; -} -function ye(e) { - if (!e || typeof e != "object") return null; - let t = Number(e.percent), n = Number.isFinite(t) ? Math.max(0, Math.min(100, Math.round(t))) : null, r = Number(e.current), i = Number(e.total), a = Number.isFinite(r) ? Math.max(0, Math.floor(r)) : null, o = Number.isFinite(i) ? Math.max(0, Math.floor(i)) : null, s = Number(e.indexed), c = Number(e.skipped), l = Number(e.errors), u = Number.isFinite(s) ? Math.max(0, Math.floor(s)) : null, d = Number.isFinite(c) ? Math.max(0, Math.floor(c)) : null, f = Number.isFinite(l) ? Math.max(0, Math.floor(l)) : null, p = O(e.label); - return n === null && a === null && o === null && u === null && d === null && f === null && !p ? null : { - percent: n, - current: a, - total: o, - indexed: u, - skipped: d, - errors: f, - label: p - }; -} -function be(e, t, n) { - return e && t ? `${e}: ${t}` : t || e || n || ""; -} -function k(e, t = "info", n = null) { - if (!e || typeof e != "object") return null; - let r = O(e.title || e.summary), i = O(e.detail), a = O(e.message || be(r, i, O(e.fallbackMessage))); - if (!a) return null; - let o = ve(e.durationMs ?? e.duration ?? n), s = Number(e.createdAt), c = Number.isFinite(s) && s > 0 ? s : Date.now(), l = typeof e.persistent == "boolean" ? e.persistent : !(Number.isFinite(o) && (o ?? 0) > 0); - return { - id: O(e.id) || d(`th-${c}-`, 4), - message: a, - title: r, - detail: i, - type: _e(e.type || t), - createdAt: c, - durationMs: o, - persistent: l, - source: O(e.source), - trackId: O(e.trackId), - status: O(e.status), - operation: O(e.operation), - progress: ye(e.progress), - forceStore: !!e.forceStore, - actionLabel: O(e.actionLabel), - actionUrl: O(e.actionUrl) - }; -} -function A() { - if (D === null) try { - let e = localStorage.getItem(pe), t = e ? JSON.parse(e) : []; - D = Array.isArray(t) ? t.map((e) => { - if (e && typeof e == "object") return k(e); - let t = O(e); - return t ? k({ message: t }) : null; - }).filter(Boolean) : []; - } catch { - D = []; - } -} -function xe() { - try { - localStorage.setItem(pe, JSON.stringify(D)); - } catch {} -} -function j() { - try { - window.dispatchEvent(new CustomEvent(ge)); - } catch {} -} -function Se() { - try { - return Number(localStorage.getItem(me)) || 0; - } catch { - return 0; - } -} -function Ce(e) { - try { - localStorage.setItem(me, String(Number(e) || 0)); - } catch {} -} -function we(e, t, n) { - A(); - let r = k(e && typeof e == "object" ? e : { - message: O(e), - type: t, - durationMs: n - }, t, n); - if (!r || !r.forceStore && !r.trackId && r.type === "info" && Number.isFinite(r.durationMs) && r.durationMs != null && r.durationMs > 0 && r.durationMs < 2500) return; - let i = String(r.trackId || "").trim(); - if (i) { - let e = D.findIndex((e) => String(e?.trackId || "").trim() === i); - if (e >= 0) { - let t = D[e] || {}; - D.splice(e, 1), r.id = String(t.id || r.id || "").trim() || r.id; - } - } - D.unshift(r), D.length > he && (D = D.slice(0, he)), xe(), j(); -} -function Te() { - return A(), D.map((e) => ({ ...e })); -} -function Ee() { - A(); - let e = Se(); - return D.filter((t) => t.createdAt > e).length; -} -function De() { - Ce(Date.now()), j(); -} -function Oe() { - A(), D = [], xe(), Ce(Date.now()), j(); -} -// ui/app/toast.ts -function ke(e) { - let t = String(e || "info").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : t === "success" || t === "warning" || t === "error" ? t : "info"; -} -function M(e) { - if (typeof e == "string") return e; - if (e && typeof e == "object") { - let t = String(e.summary || "").trim(), n = String(e.detail || e.message || "").trim(); - if (t && n) return `${t}: ${n}`; - if (n) return n; - if (t) return t; - } - try { - return String(e?.message || e || "").trim() || "Unknown message"; - } catch { - return "Unknown message"; - } -} -function Ae(e, t, n, r) { - let i = r?.history && typeof r.history == "object" ? r.history : null, a = { - persistent: !(Number.isFinite(Number(n)) && Number(n) > 0), - source: String(i?.source || r?.source || "").trim(), - trackId: String(i?.trackId || "").trim(), - status: String(i?.status || "").trim(), - operation: String(i?.operation || "").trim(), - progress: i?.progress && typeof i.progress == "object" ? { ...i.progress } : null, - forceStore: !!i?.forceStore, - actionLabel: String(i?.actionLabel || "").trim(), - actionUrl: String(i?.actionUrl || "").trim() - }; - return e && typeof e == "object" ? (a.title = String(i?.title || e.summary || "").trim(), a.detail = String(i?.detail || e.detail || e.message || "").trim(), a.message = M(e), a) : (a.title = String(i?.title || "").trim(), a.detail = String(i?.detail || "").trim(), a.message = M(e), a); -} -function je(e, t = "info", n, r) { - try { - let i = Ae(e, t, n, r); - i.forceStore = !0, we(i, t, n ?? void 0); - } catch {} -} -function Me(e) { - switch (e) { - case "success": return 2e3; - case "info": return 3e3; - case "warning": return 4e3; - case "error": return 5e3; - default: return 5e3; - } -} -function Ne(e) { - if (typeof e != "string") return e; - let t = e.trim(), n = { - "Failed to update rating": o("toast.ratingUpdateFailed", "Failed to update rating"), - "Error updating rating": o("toast.ratingUpdateError", "Error updating rating"), - "Rating cleared": o("toast.ratingCleared", "Rating cleared"), - "Failed to update tags": o("toast.tagsUpdateFailed", "Failed to update tags"), - "Tags updated": o("toast.tagsUpdated", "Tags updated"), - "Failed to toggle watcher": o("toast.watcherToggleFailed", "Failed to toggle watcher"), - "No valid assets selected.": o("toast.noValidAssetsSelected", "No valid assets selected."), - "Name collision in current view": o("toast.nameCollisionInView", "Name collision in current view"), - "Failed to create collection.": o("toast.failedCreateCollectionDot", "Failed to create collection."), - "Failed to add assets to collection.": o("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), - "Failed to remove from collection.": o("toast.removeFromCollectionFailed", "Failed to remove from collection."), - "Collection created": o("toast.collectionCreated", "Collection created"), - "Added to collection": o("toast.addedToCollection", "Added to collection"), - "Removed from collection": o("toast.removedFromCollection", "Removed from collection"), - "File renamed successfully!": o("toast.fileRenamedSuccess", "File renamed successfully!"), - "Failed to rename file": o("toast.fileRenameFailed", "Failed to rename file"), - "Failed to rename file.": o("toast.fileRenameFailed", "Failed to rename file."), - "File deleted successfully!": o("toast.fileDeletedSuccess", "File deleted successfully!"), - "Failed to delete file.": o("toast.fileDeleteFailed", "Failed to delete file."), - "Failed to delete file. ": o("toast.fileDeleteFailed", "Failed to delete file."), - "File deleted": o("toast.deleted", "File deleted"), - "File renamed": o("toast.renamed", "File renamed"), - "Folder created": o("toast.folderCreated", "Folder created"), - "Folder renamed": o("toast.folderRenamed", "Folder renamed"), - "Folder moved": o("toast.folderMoved", "Folder moved"), - "Folder deleted": o("toast.folderDeleted", "Folder deleted"), - "Failed to create folder": o("toast.createFolderFailed", "Failed to create folder"), - "Failed to rename folder": o("toast.renameFolderFailed", "Failed to rename folder"), - "Failed to move folder": o("toast.moveFolderFailed", "Failed to move folder"), - "Failed to delete folder": o("toast.deleteFolderFailed", "Failed to delete folder"), - "Failed to pin folder": o("toast.pinFolderFailed", "Failed to pin folder"), - "Failed to unpin folder": o("toast.unpinFolderFailed", "Failed to unpin folder"), - "Folder pinned as browser root": o("toast.folderPinnedAsBrowserRoot", "Folder pinned as browser root"), - "Folder added": o("toast.folderAdded", "Folder added"), - "Folder removed": o("toast.folderRemoved", "Folder removed"), - "Folder linked successfully": o("toast.folderLinked", "Folder linked successfully"), - "An error occurred while adding the custom folder": o("toast.errorAddingFolder", "An error occurred while adding the custom folder"), - "An error occurred while removing the custom folder": o("toast.errorRemovingFolder", "An error occurred while removing the custom folder"), - "Failed to add custom folder": o("toast.failedAddFolder", "Failed to add custom folder"), - "Failed to remove custom folder": o("toast.failedRemoveFolder", "Failed to remove custom folder"), - "Native folder browser unavailable. Please enter path manually.": o("toast.nativeBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), - "Opened in folder": o("toast.openedInFolder", "Opened in folder"), - "Failed to open folder": o("toast.openFolderFailed", "Failed to open folder"), - "Failed to open folder.": o("toast.openFolderFailed", "Failed to open folder."), - "File path copied to clipboard": o("toast.pathCopied", "File path copied to clipboard"), - "Failed to copy path": o("toast.pathCopyFailed", "Failed to copy path"), - "Failed to copy to clipboard": o("toast.copyClipboardFailed", "Failed to copy to clipboard"), - "No file path available for this asset.": o("toast.noFilePath", "No file path available for this asset."), - "Failed to refresh metadata.": o("toast.metadataRefreshFailed", "Failed to refresh metadata."), - "Metadata refreshed": o("toast.metadataRefreshed", "Metadata refreshed"), - "Duplicate analysis started": o("toast.dupAnalysisStarted", "Duplicate analysis started"), - "Tags merged": o("toast.tagsMerged", "Tags merged"), - "Duplicates deleted": o("toast.duplicatesDeleted", "Duplicates deleted"), - "Rescanning file...": o("toast.rescanningFile", "Rescanning file..."), - "Metadata enrichment complete": o("toast.enrichmentComplete", "Metadata enrichment complete"), - "Playback speed is available for video media only": o("toast.playbackVideoOnly", "Playback speed is available for video media only"), - "DB backup saved": o("toast.dbSaveSuccess", "DB backup saved"), - "Failed to save DB backup": o("toast.dbSaveFailed", "Failed to save DB backup"), - "DB restore started": o("toast.dbRestoreStarted", "DB restore started"), - "Failed to restore DB backup": o("toast.dbRestoreFailed", "Failed to restore DB backup"), - "Select a DB backup first": o("toast.dbRestoreSelect", "Select a DB backup first"), - "Stopping running workers": o("toast.dbRestoreStopping", "Stopping running workers"), - "Unlocking and resetting database": o("toast.dbRestoreResetting", "Unlocking and resetting database"), - "Recreating database": o("toast.dbRestoreReplacing", "Recreating database"), - "Replacing database files": o("toast.dbRestoreReplacing", "Replacing database files"), - "Restarting scan": o("toast.dbRestoreRescan", "Restarting scan"), - "Deleting database and rebuilding...": o("toast.dbDeleteTriggered", "Deleting database and rebuilding..."), - "Database deleted and rebuilt. Files are being reindexed.": o("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed."), - "Failed to delete database": o("toast.dbDeleteFailed", "Failed to delete database"), - "Database backup restored": o("toast.dbRestoreSuccess", "Database backup restored"), - "Index reset started. Files will be reindexed in the background.": o("toast.resetStarted", "Index reset started. Files will be reindexed in the background."), - "Failed to reset index": o("toast.resetFailed", "Failed to reset index"), - "Reset triggered: Reindexing all files...": o("toast.resetTriggered", "Reset triggered: Reindexing all files..."), - "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild.": o("toast.resetFailedCorrupt", "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild."), - "Scan started": o("toast.scanStarted", "Scan started"), - "Scan complete": o("toast.scanComplete", "Scan complete"), - "Scan failed": o("toast.scanFailed", "Scan failed"), - "Permission denied": o("toast.permissionDenied", "Permission denied"), - "Language changed. Reload the page for full effect.": o("toast.languageChanged", "Language changed. Reload the page for full effect."), - "Tag added": o("toast.tagAdded", "Tag added"), - "Tag removed": o("toast.tagRemoved", "Tag removed"), - "Rating saved": o("toast.ratingSaved", "Rating saved"), - "Failed to create collection": o("toast.failedCreateCollection", "Failed to create collection"), - "Failed to delete collection": o("toast.failedDeleteCollection", "Failed to delete collection") - }; - if (n[t]) return n[t]; - let r; - if (r = t.match(/Rating set to (\d+) star(?:s)?/i), r) return o("toast.ratingSetN", "Rating set to {n} stars", { n: Number(r[1]) }); - if (r = t.match(/Downloading (.+?)\.\.\./i), r) return o("toast.downloadingFile", "Downloading {filename}...", { filename: r[1] }); - if (r = t.match(/Playback ([0-9]+(?:\.[0-9]+)?)x/i), r) return o("toast.playbackRate", "Playback {rate}x", { rate: Number(r[1]).toFixed(2) }); - if (r = t.match(/Metadata refreshed(?:\s*(.*))?/i), r) return o("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: r[1] ? " (" + r[1] + ")" : "" }); - if (r = t.match(/Error renaming(?: file)?:\s*(.+)/i), r) return o("toast.errorRenaming", "Error renaming file: {error}", { error: r[1] }); - if (r = t.match(/Error deleting(?: files?| file)?:\s*(.+)/i), r) return o("toast.errorDeleting", "Error deleting file: {error}", { error: r[1] }); - if (r = t.match(/Tag merge failed:\s*(.+)/i), r) return o("toast.tagMergeFailed", "Tag merge failed: {error}", { error: r[1] }); - if (r = t.match(/Delete failed:\s*(.+)/i), r) return o("toast.deleteFailed", "Delete failed: {error}", { error: r[1] }); - if (r = t.match(/Analysis not started:\s*(.+)/i), r) return o("toast.analysisNotStarted", "Analysis not started: {error}", { error: r[1] }); - if (r = t.match(/(\d+)\s+files deleted successfully!/i), r) return o("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: Number(r[1]) }); - if (r = t.match(/(\d+)\s+files deleted,\s+(\d+)\s+failed\./i), r) return o("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { - success: Number(r[1]), - failed: Number(r[2]) - }); - if (r = t.match(/(\d+)\s+files?\s+deleted/i), r) return o("toast.filesDeletedShort", "{n} files deleted", { n: Number(r[1]) }); - if (r = t.match(/(\d+)\s+deleted,\s+(\d+)\s+failed/i), r) return o("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { - success: Number(r[1]), - failed: Number(r[2]) - }); - if (r = t.match(/^(.+?)\s+copied to clipboard!$/i), r) return o("toast.copiedToClipboardNamed", "{name} copied to clipboard!", { name: r[1] }); - if (r = t.match(/Folder created:\s*(.+)/i), r) return o("toast.folderCreated", "Folder created: {name}", { name: r[1] }); - if (r = t.match(/Failed to create folder:\s*(.+)/i), r) return o("toast.createFolderFailedDetail", "Failed to create folder: {error}", { error: r[1] }); - if (r = t.match(/Failed to rename folder:\s*(.+)/i), r) return o("toast.renameFolderFailedDetail", "Failed to rename folder: {error}", { error: r[1] }); - if (r = t.match(/Failed to move folder:\s*(.+)/i), r) return o("toast.moveFolderFailedDetail", "Failed to move folder: {error}", { error: r[1] }); - if (r = t.match(/Failed to delete folder:\s*(.+)/i), r) return o("toast.deleteFolderFailedDetail", "Failed to delete folder: {error}", { error: r[1] }); - if (r = t.match(/Error removing from collection:\s*(.+)/i), r) return o("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: r[1] }); - if (r = t.match(/^Failed to (.+)$/i), r) { - let e = r[1].toLowerCase(), t = { - "add folder": o("toast.failedAddFolder", "Failed to add custom folder"), - "remove folder": o("toast.failedRemoveFolder", "Failed to remove custom folder"), - "create collection": o("toast.failedCreateCollection", "Failed to create collection"), - "delete collection": o("toast.failedDeleteCollection", "Failed to delete collection") - }; - for (let [n, r] of Object.entries(t)) if (e.includes(n)) return r; - } - return t; -} -function N(e, t = "info", n, r) { - if (t = ke(t), e = Ne(e), n ??= Me(t), !r?.noHistory) try { - we(Ae(e, t, n, r), t, n ?? void 0); - } catch {} - let i = !(Number.isFinite(Number(n)) && Number(n) > 0); - try { - let r = a(); - if (r && typeof r.add == "function") { - let a = t; - a === "warning" && (a = "warn"); - let s = o("manager.title"), c = e; - if (typeof e == "object" && e?.summary) s = e.summary, c = e.detail || ""; - else if (typeof e != "string") try { - c = e.message || String(e); - } catch (e) { - console.debug?.(e); - } - let l = { - severity: a, - summary: s, - detail: c - }; - i || (l.life = n), r.add(l); - return; - } - } catch (e) { - console.debug("Majoor: extensionManager.toast failed", e); - } - let s = globalThis?.app || (typeof window < "u" ? window?.app : null); - if (s?.ui?.toast) try { - return s.ui.toast(e, t); - } catch (e) { - console.debug("Native app.ui.toast failed", e); - } - console.warn("[Majoor Toast] Native toast API unavailable", { - type: t, - message: M(e), - duration: i ? 0 : n - }); -} -// ui/api/clientAuth.ts -var Pe = 2e3, Fe = 15e3, Ie = 8e3, P = "token", F = null, I = null, Le = null, Re = "", L = E({ - ttlMs: Pe, - maxSize: 1 -}); -function ze() { - return String(Re || "").trim(); -} -function R(e) { - return Re = String(e || "").trim(), !0; -} -function Be() { - try { - let e = localStorage?.getItem?.(f), t = e ? JSON.parse(e) : {}, n = t && typeof t == "object" ? t : {}, r = n?.data && typeof n.data == "object" ? n.data : n; - r?.security && typeof r.security == "object" && String(r.security.apiToken || "").trim() && (r.security.apiToken = "", localStorage?.setItem?.(f, JSON.stringify(n))); - } catch (e) { - console.debug?.(e); - } -} -function Ve() { - try { - L.delete(P); - } catch (e) { - console.debug?.(e); - } - R(""), Be(); -} -function z() { - let e = L.get(P); - if (e !== void 0) return e; - let t = Date.now(), n = ze(); - if (n) return L.set(P, n, { at: t }), n; - try { - let e = localStorage?.getItem?.(f), n = e ? JSON.parse(e) : null, r = n?.data && typeof n.data == "object" ? n.data : n, i = String(r?.security?.apiToken || "").trim(); - if (i) { - R(i); - try { - let e = n && typeof n == "object" ? n : {}, t = e?.data && typeof e.data == "object" ? e.data : e; - t?.security && typeof t.security == "object" && (t.security.apiToken = "", localStorage?.setItem?.(f, JSON.stringify(e)), window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } }))); - } catch (e) { - console.debug?.(e); - } - } - return L.set(P, i, { at: t }), i; - } catch { - return L.set(P, "", { at: t }), ""; - } -} -function B(e) { - let t = String(e || "").trim(); - if (!t) return !1; - try { - L.set(P, t), I = null, R(t), Be(); - try { - window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } })); - } catch (e) { - console.debug?.(e); - } - return !0; - } catch { - return !1; - } -} -var He = /^[A-Za-z0-9._\-~+/]+=*$/; -function Ue(e) { - let t = String(e || "").trim(); - return t ? He.test(t) ? B(t) : (console.debug?.("[MJR auth] Rejected malformed security token (invalid characters)"), !1) : !1; -} -function We() { - return !!z(); -} -function V(e = {}) { - I = { - code: String(e?.code || "").trim().toUpperCase(), - error: String(e?.error || "").trim(), - status: Number(e?.status || 0) || 0, - at: Date.now() - }; -} -function Ge() { - let e = I; - if (!e) return null; - let t = Date.now() - (Number(e.at || 0) || 0); - return t < 0 || t > Fe ? (I = null, null) : e; -} -function Ke(e) { - let t = Ge(), n = String(e?.code || "").trim().toUpperCase(), r = String(e?.error || "").trim(), i = String(t?.code || "").trim().toUpperCase(), a = String(t?.error || "").trim().toLowerCase(), s = r.toLowerCase(); - return n === "FORBIDDEN" && (s.includes("api token over insecure transport") || s.includes("allow http token transport")) ? o("toast.writeAuthInsecureTransport", "Write access is blocked because the Majoor API token is being sent over plain HTTP from a remote machine. Use HTTPS, or enable Settings -> Security -> Allow HTTP Token Transport for a trusted LAN.") : i === "FORBIDDEN" && (a.includes("already configured") || a.includes("rotate-token")) ? o("toast.writeAuthConfiguredTokenRequired", "Write access requires the Majoor API token already configured on the server. Open Settings -> Security -> API Token and enter the matching token.") : i === "AUTH_REQUIRED" && (a.includes("sign in to comfyui") || a.includes("authenticated comfyui user")) ? o("toast.writeAuthSignInRequired", "Write access is blocked. Sign in to ComfyUI first, then retry so Majoor can bootstrap the remote session token automatically.") : i === "BOOTSTRAP_DISABLED" || i === "AUTH_REQUIRED" && a.includes("bootstrap") || n === "AUTH_REQUIRED" && s.includes("api token") ? o("toast.writeAuthBootstrapHelp", "Write access is blocked. Sign in to ComfyUI and retry so Majoor can bootstrap the remote session automatically, or set a Majoor API token in Settings -> Security.") : ""; -} -function qe(e) { - let t = String(e || "").trim(); - if (!t) return; - let n = Date.now(), r = Le; - if (!(r && r.message === t && n - (Number(r.at || 0) || 0) < Ie)) { - Le = { - message: t, - at: n - }; - try { - N({ - summary: o("toast.writeAuthTitle", "Majoor remote write access"), - detail: t - }, "warning", 6500, { noHistory: !0 }); - } catch (e) { - console.debug?.(e); - } - } -} -function Je(e) { - let t = String(e?.code || "").trim().toUpperCase(), n = String(e?.error || "").trim().toLowerCase(), r = t === "FORBIDDEN" && n.includes("write operation blocked"); - if (t !== "AUTH_REQUIRED" && !r) return e; - let i = Ke(e); - return i ? (qe(i), { - ...e, - error: i - }) : e; -} -async function Ye() { - try { - let e = await fetch("/mjr/am/settings/security/bootstrap-token", { - method: "POST", - headers: { - "Content-Type": "application/json", - "X-Requested-With": "XMLHttpRequest" - }, - body: "{}" - }); - if (!(e.headers.get("content-type") || "").includes("application/json")) return V({ - code: "INVALID_RESPONSE", - error: `Bootstrap token request returned non-JSON response (${e.status})`, - status: e.status - }), { - ok: !1, - token: !1 - }; - let t = await e.json().catch((e) => (console.debug?.("[MJR auth] JSON parse error:", e), null)); - if (!t || typeof t != "object") return V({ - code: "INVALID_RESPONSE", - error: "Bootstrap token response was invalid.", - status: e.status - }), { - ok: !1, - token: !1 - }; - if (!t.ok) return V({ - code: t?.code, - error: t?.error, - status: e.status - }), { - ok: !1, - token: !1 - }; - let n = String(t?.data?.token || "").trim(); - return n ? { - ok: B(n), - token: !0 - } : (I = null, { - ok: !0, - token: !1 - }); - } catch (e) { - return V({ - code: "NETWORK_ERROR", - error: e?.message || "Bootstrap token request failed.", - status: 0 - }), { - ok: !1, - token: !1 - }; - } -} -async function Xe({ force: e = !1, allowCookieRefresh: t = !1 } = {}) { - let n = z(); - if (n && !e) return n; - let r = { - ok: !1, - token: !1 - }; - F ||= (async () => { - try { - return await Ye(); - } finally { - F = null; - } - })(); - try { - r = await F || r; - } catch (e) { - console.debug?.(e); - } - if (e && r?.ok && !r?.token && n) Ve(); - else if (e && !r?.ok) { - let e = Ge(), t = String(e?.code || "").trim().toUpperCase(); - t && ["NETWORK_ERROR", "INVALID_RESPONSE"].includes(t) || Ve(); - } - let i = z(); - return !i && t && r?.ok ? !0 : i; -} -function Ze() { - L.clear(); -} -// ui/api/clientOps.ts -async function Qe(e) { - return !e || typeof e != "string" ? { - ok: !1, - error: "Missing mode", - code: "INVALID_INPUT" - } : Y("/mjr/am/settings/probe-backend", { mode: e }); -} -async function $e() { - return J(l.SETTINGS_METADATA_FALLBACK); -} -async function et({ image: e, media: t } = {}) { - return Y(l.SETTINGS_METADATA_FALLBACK, { - image: e, - media: t - }); -} -async function tt() { - return J(l.SETTINGS_VECTOR_SEARCH); -} -async function nt(e = !0) { - if (e && typeof e == "object") { - let t = {}; - return "enabled" in e && (t.enabled = !!e.enabled), "caption_on_index" in e && (t.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (t.caption_on_index = !!e.captionOnIndex), "index_on_scan" in e && (t.index_on_scan = !!e.index_on_scan), "indexOnScan" in e && (t.index_on_scan = !!e.indexOnScan), "unload_after_use" in e && (t.unload_after_use = !!e.unload_after_use), "unloadAfterUse" in e && (t.unload_after_use = !!e.unloadAfterUse), "concurrency" in e && (t.concurrency = Number(e.concurrency) || 1), "vectorConcurrency" in e && (t.concurrency = Number(e.vectorConcurrency) || 1), Y(l.SETTINGS_VECTOR_SEARCH, t); - } - return Y(l.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); -} -async function rt() { - return Y(l.SETTINGS_VECTOR_SEARCH_UNLOAD, {}); -} -async function it() { - return J(l.SETTINGS_EXECUTION_GROUPING); -} -async function at(e = !0) { - return Y(l.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); -} -async function ot(e = !0) { - return Y(l.SETTINGS_BROWSER_SHOW_FOLDERS, { enabled: !!e }); -} -async function st() { - return J(l.SETTINGS_HUGGINGFACE); -} -async function ct(e = "") { - return Y(l.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); -} -async function lt() { - return J(l.SETTINGS_AI_LOGGING); -} -async function ut(e = !1) { - return Y(l.SETTINGS_AI_LOGGING, { enabled: !!e }); -} -async function dt() { - return J(l.SETTINGS_ROUTE_LOGGING); -} -async function ft(e = !1) { - return Y(l.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); -} -async function pt() { - return J(l.SETTINGS_STARTUP_LOGGING); -} -async function mt(e = !1) { - return Y(l.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); -} -async function ht() { - return J(l.SETTINGS_LTXAV_RGB_FALLBACK); -} -async function gt(e = !1) { - return Y(l.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); -} -async function _t() { - return J(l.SETTINGS_JXL); -} -async function vt(e = !1) { - return Y(l.SETTINGS_JXL, { enabled: !!e }); -} -async function yt() { - return J(l.SETTINGS_OUTPUT_DIRECTORY); -} -async function bt() { - return J(l.SETTINGS_INPUT_DIRECTORY); -} -async function xt(e, t = {}) { - let n = String(e ?? "").trim(); - return Y(l.SETTINGS_INPUT_DIRECTORY, { input_directory: n }, t); -} -async function St(e, t = {}) { - let n = String(e ?? "").trim(); - return Y(l.SETTINGS_OUTPUT_DIRECTORY, { output_directory: n }, t); -} -async function Ct() { - return J(l.SETTINGS_INDEX_DIRECTORY); -} -async function wt(e, t = {}) { - let n = String(e ?? "").trim(); - return Y(l.SETTINGS_INDEX_DIRECTORY, { index_directory: n }, t); -} -async function Tt(e = {}) { - return J(l.SETTINGS_WORKFLOW_ROOTS, e); -} -async function Et(e, t = {}) { - let n = Array.isArray(e) ? e.map((e) => String(e ?? "").trim()).filter(Boolean) : String(e ?? "").trim(); - return Y(l.SETTINGS_WORKFLOW_ROOTS, { workflow_roots: n }, t); -} -async function Dt() { - return J("/mjr/am/settings/security"); -} -async function Ot(e) { - return Y("/mjr/am/settings/security", e && typeof e == "object" ? e : {}); -} -async function kt() { - let e = await Y("/mjr/am/settings/security/bootstrap-token", {}); - if (e?.ok) try { - let t = String(e?.data?.token || "").trim(); - t && B(t); - } catch (e) { - console.debug?.(e); - } - return e; -} -async function At(e) { - if (e && typeof e == "object") { - let n = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - return n ? Y("/mjr/am/open-in-folder", { filepath: n }) : Y("/mjr/am/open-in-folder", { asset_id: t(e.id) }); - } - return Y("/mjr/am/open-in-folder", { asset_id: t(e) }); -} -async function jt(e) { - let t = ""; - return t = e && typeof e == "object" ? String(e.filepath || e.path || e?.file_info?.filepath || "").trim() : String(e || "").trim(), t ? Y(l.COLLECT_FILES, { filepath: t }) : { - ok: !1, - data: null, - error: "Missing file path", - code: "INVALID_INPUT" - }; -} -async function Mt({ op: e = "", path: t = "", name: n = "", destination: r = "", recursive: i = !0 } = {}, a = {}) { - let o = { - op: String(e || "").trim().toLowerCase(), - path: String(t || "").trim() - }; - return n != null && String(n).trim() && (o.name = String(n).trim()), r != null && String(r).trim() && (o.destination = String(r).trim()), o.op === "delete" && (o.recursive = !!i), Y(l.BROWSER_FOLDER_OP, o, a); -} -async function Nt(e = {}) { - let t = (e, t) => e == null ? t : !!e, n = String(e.scope || "output").trim().toLowerCase() || "output", r = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, i = { - scope: n, - reindex: t(e.reindex, !0), - hard_reset_db: t(e.hardResetDb ?? e.hard_reset_db ?? e.deleteDbFiles ?? e.delete_db_files ?? e.deleteDb ?? e.delete_db ?? void 0, n === "all"), - clear_scan_journal: t(e.clearScanJournal ?? e.clear_scan_journal, !0), - clear_metadata_cache: t(e.clearMetadataCache ?? e.clear_metadata_cache, !0), - clear_asset_metadata: t(e.clearAssetMetadata ?? e.clear_asset_metadata, !0), - clear_assets: t(e.clearAssets ?? e.clear_assets, !0), - preserve_vectors: t(e.preserveVectors ?? e.preserve_vectors ?? e.keepVectors ?? e.keep_vectors, !1), - rebuild_fts: t(e.rebuildFts ?? e.rebuild_fts, !0), - incremental: t(e.incremental, !1), - fast: t(e.fast, !0), - background_metadata: t(e.backgroundMetadata ?? e.background_metadata, !0), - maintenance_force: t(e.maintenanceForce ?? e.maintenance_force, !1) - }; - return r && (i.custom_root_id = String(r)), Y(l.INDEX_RESET, i); -} -async function Pt({ scope: e = "output", customRootId: t = "" } = {}) { - let n = String(e || "output").trim().toLowerCase() || "output", r = String(t || "").trim(), i = { scope: n }; - return r && (i.custom_root_id = r), Y(l.WATCHER_SCOPE, i); -} -async function Ft(e = {}) { - return J(l.WATCHER_STATUS, e); -} -async function It(e = !0) { - return Y(l.WATCHER_TOGGLE, { enabled: !!e }); -} -async function Lt() { - return J(l.WATCHER_SETTINGS); -} -async function Rt(e = {}) { - return Y(l.WATCHER_SETTINGS, e); -} -async function zt(e = {}) { - return J(l.TOOLS_STATUS, e); -} -async function Bt(e = {}) { - return J(l.STATUS, e); -} -async function Vt() { - return Y("/mjr/am/db/force-delete", {}); -} -async function Ht(e = {}) { - return J(l.DB_BACKUPS, e); -} -async function Ut() { - return Y(l.DB_BACKUP_SAVE, {}); -} -async function Wt({ name: e = "", useLatest: t = !1 } = {}) { - let n = {}; - return e && (n.name = String(e)), t && (n.use_latest = !0), Y(l.DB_BACKUP_RESTORE, n); -} -async function Gt(e = 250) { - return Y("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) }); -} -async function Kt({ scope: e = "output", customRootId: t = "", maxGroups: n = 6, maxPairs: r = 10 } = {}, i = {}) { - let a = `/mjr/am/duplicates/alerts?scope=${encodeURIComponent(String(e || "output"))}`; - return t && (a += `&custom_root_id=${encodeURIComponent(String(t))}`), a += `&max_groups=${encodeURIComponent(String(Math.max(1, Number(n) || 6)))}`, a += `&max_pairs=${encodeURIComponent(String(Math.max(1, Number(r) || 10)))}`, J(a, i); -} -async function qt(e, t = []) { - return Y("/mjr/am/duplicates/merge-tags", { - keep_asset_id: Number(e) || 0, - merge_asset_ids: Array.isArray(t) ? t.map((e) => Number(e) || 0).filter((e) => e > 0) : [] - }); -} -async function Jt(e) { - let n, r; - if (e && typeof e == "object") { - n = t(e.id); - let i = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - r = n ? { asset_id: n } : { filepath: i }; - } else n = t(e), r = { asset_id: n }; - let i = await Y("/mjr/am/asset/delete", r); - return i?.ok && n && Xt([n]), i; -} -async function Yt(e) { - let n = Array.isArray(e) ? e.map((e) => t(e)).filter(Boolean) : [], r = await Y("/mjr/am/assets/delete", { ids: n }); - return r?.ok && Xt(n), r; -} -function Xt(e) { - try { - let t = (Array.isArray(e) ? e : [e]).map((e) => String(e || "").trim()).filter(Boolean); - if (!t.length) return; - window.dispatchEvent(new CustomEvent("mjr:assets-deleted", { detail: { ids: t } })); - } catch (e) { - console.debug?.(e); - } -} -async function Zt(e, n) { - let r; - if (e && typeof e == "object") { - r = t(e.id); - let i = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), a = r ? await Y("/mjr/am/asset/rename", { - asset_id: r, - new_name: n - }) : await Y("/mjr/am/asset/rename", { - filepath: i, - new_name: n - }); - if (a?.ok && r) try { - let e = await Ln(r); - e?.ok && e?.data && (a.data = { - ...a.data || {}, - asset: e.data - }); - } catch (e) { - console.debug?.(e); - } - return a; - } - r = t(e); - let i = await Y("/mjr/am/asset/rename", { - asset_id: r, - new_name: n - }); - if (i?.ok && r) try { - let e = await Ln(r); - e?.ok && e?.data && (i.data = { - ...i.data || {}, - asset: e.data - }); - } catch (e) { - console.debug?.(e); - } - return i; -} -async function Qt() { - let e = typeof AbortController < "u" ? new AbortController() : null, t = null; - try { - return e && (t = setTimeout(() => e.abort(), 1e4)), await J("/mjr/am/collections", e ? { signal: e.signal } : {}); - } finally { - t && clearTimeout(t); - } -} -async function $t(e) { - return Y("/mjr/am/collections", { name: String(e || "").trim() }); -} -async function en(e) { - let t = String(e || "").trim(); - return Y(`/mjr/am/collections/${encodeURIComponent(t)}/delete`, {}); -} -async function tn(e, t) { - let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; - return Y(`/mjr/am/collections/${encodeURIComponent(n)}/add`, { assets: r }); -} -async function nn(e, t) { - let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; - return Y(`/mjr/am/collections/${encodeURIComponent(n)}/remove`, { filepaths: r }); -} -async function rn(e) { - let t = String(e || "").trim(); - return J(`/mjr/am/collections/${encodeURIComponent(t)}/assets`); -} -async function an(e, t = 20) { - let n = String(e || "").trim(); - if (!n) return { - ok: !1, - error: "Empty query" - }; - let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), c = `${l.VECTOR_SEARCH}?q=${encodeURIComponent(n)}&top_k=${i}`; - return a && (c += `&scope=${encodeURIComponent(a)}`), o && (c += `&custom_root_id=${encodeURIComponent(o)}`), c = s(c, { - subfolder: r?.subfolder ?? null, - kind: r?.kind ?? null, - hasWorkflow: r?.hasWorkflow ?? null, - minRating: r?.minRating ?? null, - minSizeMB: r?.minSizeMB ?? null, - maxSizeMB: r?.maxSizeMB ?? null, - minWidth: r?.minWidth ?? null, - minHeight: r?.minHeight ?? null, - maxWidth: r?.maxWidth ?? null, - maxHeight: r?.maxHeight ?? null, - workflowType: r?.workflowType ?? null, - workflowId: r?.workflowId ?? null, - dateRange: r?.dateRange ?? null, - dateExact: r?.dateExact ?? null - }), J(c, { timeoutMs: 12e4 }); -} -async function on(e, t = 20) { - let n = String(e || "").trim(); - if (!n) return { - ok: !1, - error: "Missing asset ID" - }; - let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), s = `${l.VECTOR_SIMILAR}/${encodeURIComponent(n)}?top_k=${i}`; - return a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`), J(s, { dedupeKey: `vec:${n}:${i}:${a}:${o}` }); -} -async function sn(e) { - let t = String(e || "").trim(); - return t ? J(`${l.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : { - ok: !1, - error: "Missing asset ID" - }; -} -async function cn(e) { - let t = String(e || "").trim(); - return t ? Y(`${l.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : { - ok: !1, - error: "Missing asset ID" - }; -} -async function ln() { - return J(l.VECTOR_STATS); -} -async function un(e = 64, t = {}) { - let n = Math.max(1, Math.min(200, e)), r = typeof t?.onProgress == "function" ? t.onProgress : null, i = String(t?.scope || "").trim().toLowerCase(), a = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), o = `${l.VECTOR_BACKFILL}?batch_size=${n}&async=1`; - i && (o += `&scope=${encodeURIComponent(i)}`), a && (o += `&custom_root_id=${encodeURIComponent(a)}`); - let s = await Y(o, {}, { timeoutMs: 3e4 }); - if (!s?.ok) return s; - let c = s?.data || {}, u = String(c?.status || "").toLowerCase(), d = String(c?.backfill_id || "").trim(); - try { - r?.(c); - } catch (e) { - console.debug?.(e); - } - if (!d || ![ - "queued", - "running", - "pending" - ].includes(u)) return s; - let f = Number(t?.pollIntervalMs), p = Number(t?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : vn, h = Number.isFinite(p) ? Math.max(1e4, Math.min(bn, Math.floor(p))) : yn, ee = Date.now(), g = null; - for (; Date.now() - ee < h;) { - await S(m); - let e = await J(`${l.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }); - if (!e?.ok) { - g = e; - continue; - } - let t = e?.data || {}, n = String(t?.status || "").toLowerCase(); - g = e; - try { - r?.(t); - } catch (e) { - console.debug?.(e); - } - if (n === "succeeded") return { - ok: !0, - data: t?.result || {}, - code: null, - status: 200 - }; - if (n === "failed") return { - ok: !1, - error: String(t?.error || "Vector backfill failed"), - code: String(t?.code || "DB_ERROR"), - data: t, - status: 500 - }; - } - let _ = await J(`${l.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), v = _?.data || g?.data || {}, y = String(v?.status || "").toLowerCase(); - if (_?.ok && [ - "queued", - "running", - "pending" - ].includes(y)) { - try { - r?.(v); - } catch (e) { - console.debug?.(e); - } - return { - ok: !0, - code: "PENDING", - status: 202, - data: { - ...v, - pending: !0, - timed_out: !0, - poll_timeout_ms: h, - backfill_id: String(v?.backfill_id || d), - status: y || "running" - }, - meta: { pending: !0 } - }; - } - return _?.ok && y === "failed" ? { - ok: !1, - error: String(v?.error || "Vector backfill failed"), - code: String(v?.code || "DB_ERROR"), - data: v, - status: 500 - } : { - ok: !1, - error: `Vector backfill polling timed out after ${h}ms`, - code: "TIMEOUT", - data: v || null, - status: 408 - }; -} -async function dn(e) { - let t = String(e || "").trim(); - return t ? Y(`${l.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : { - ok: !1, - error: "Missing asset ID" - }; -} -async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", subfolder: i = null, kind: a = null, hasWorkflow: o = null, minRating: c = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: ee = null, workflowId: g = null, dateRange: _ = null, dateExact: v = null } = {}) { - let y = String(e || "").trim(); - if (!y) return { - ok: !1, - error: "Empty query" - }; - let b = `${l.HYBRID_SEARCH}?q=${encodeURIComponent(y)}&top_k=${Math.max(1, Math.min(200, t))}&scope=${encodeURIComponent(n)}`; - return r && (b += `&custom_root_id=${encodeURIComponent(r)}`), b = s(b, { - subfolder: i, - kind: a, - hasWorkflow: o, - minRating: c, - minSizeMB: u, - maxSizeMB: d, - minWidth: f, - minHeight: p, - maxWidth: m, - maxHeight: h, - workflowType: ee, - workflowId: g, - dateRange: _, - dateExact: v - }), J(b, { timeoutMs: 12e4 }); -} -async function pn(e = 8) { - return Y(l.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); -} -// ui/api/client.ts -var mn = 3e4, hn = "__MJR_API_CLIENT__", gn = 2e3, _n = 200, vn = 1e3, yn = 18e5, bn = 432e5, H = "settings", xn = "available-tags", U = E({ - ttlMs: gn, - maxSize: 1 -}), W = E({ - ttlMs: gn, - maxSize: 1 -}), G = E({ - ttlMs: () => Tn(), - maxSize: 1 -}), Sn = /* @__PURE__ */ new Set([ - "1", - "true", - "yes", - "on" -]), Cn = /* @__PURE__ */ new Set([ - "0", - "false", - "no", - "off" -]); -function wn(e, t = !1) { - if (typeof e == "boolean") return e; - if (typeof e == "number") return e !== 0; - if (typeof e == "string") { - let t = e.trim().toLowerCase(); - if (Sn.has(t)) return !0; - if (Cn.has(t)) return !1; - } - return !!t; -} -function Tn() { - try { - let e = localStorage?.getItem?.("mjrSettings") || "{}", t = JSON.parse(e), n = t?.cache?.tagsTTLms ?? t?.cache?.tagsTTL ?? t?.cache?.tags_ttl_ms ?? null, r = Number(n); - return Number.isFinite(r) ? Math.max(1e3, Math.min(6e5, Math.floor(r))) : mn; - } catch { - return mn; - } -} -function En() { - U.clear(); -} -function Dn() { - W.clear(); -} -function K() { - G.clear(); -} -function On(e) { - return String(e ?? "").trim().toLowerCase() || ""; -} -function kn(e) { - let t = [], n = /* @__PURE__ */ new Set(); - for (let r of Array.isArray(e) ? e : []) { - let e = String(r ?? "").trim(); - if (!e) continue; - let i = On(e); - i && !n.has(i) && (n.add(i), t.push(e)); - } - return t; -} -try { - let e = typeof window < "u" ? window : null; - e && !e[hn] && (e[hn] = { initialized: !0 }, e.addEventListener?.("storage", (e) => { - try { - e?.key === "mjrSettings" && (En(), Dn(), K(), Ze()); - } catch (e) { - console.debug?.(e); - } - }), e.addEventListener?.("mjr-settings-changed", () => { - En(), Dn(), K(), Ze(); - })); -} catch (e) { - console.debug?.(e); -} -var An = () => { - let e = U.get(H); - if (e !== void 0) return e; - let t = Date.now(); - try { - let e = localStorage?.getItem?.(f); - if (!e) return U.set(H, !1, { at: t }), !1; - let n = !!JSON.parse(e)?.observability?.enabled; - return U.set(H, n, { at: t }), n; - } catch { - return U.set(H, !1, { at: t }), !1; - } -}, q = () => { - let e = W.get(H); - if (e !== void 0) return e; - let t = Date.now(); - try { - let e = localStorage?.getItem?.(f); - if (!e) return W.set(H, !0, { at: t }), !0; - let n = JSON.parse(e)?.ratingTagsSync?.enabled, r = n == null || wn(n, !0); - return W.set(H, r, { at: t }), r; - } catch { - return W.set(H, !0, { at: t }), !0; - } -}, jn = fe({ - readObsEnabled: An, - readAuthToken: z, - ensureWriteAuthToken: Xe, - normalizeWriteAuthFailure: Je -}), Mn = jn.fetchAPI; -async function J(e, t = {}) { - return jn.get(e, t); -} -async function Y(e, t, n = {}) { - return jn.post(e, t, n); -} -async function Nn(n, r, i = {}) { - let a = q(), o = n && typeof n == "object" ? n : null, s = o ? o.id : n, c = t(s), l = { rating: Math.max(0, Math.min(5, Number(r) || 0)) }; - return c ? l.asset_id = c : o && (l.filepath = o.filepath || o.path || o?.file_info?.filepath || "", l.type = o.type || "output", l.root_id = e(o)), Mn("/mjr/am/asset/rating", { - ...i, - method: "POST", - headers: { - "Content-Type": "application/json", - ...a ? { "X-MJR-RTSYNC": "on" } : {} - }, - body: JSON.stringify(l) - }); -} -async function Pn(n, r, i = {}) { - let a = q(), o = n && typeof n == "object" ? n : null, s = o ? o.id : n, c = t(s), u = String(o?.kind || o?.type || "").trim().toLowerCase() === "workflow", d = String(o?.filepath || o?.path || o?.file_info?.filepath || "").trim(), f = { tags: Array.isArray(r) ? r : [] }; - u && d ? f.filepath = d : c ? f.asset_id = c : o && (f.filepath = o.filepath || o.path || o?.file_info?.filepath || "", f.type = o.type || "output", f.root_id = e(o)); - let p = await Mn(u && d ? l.WORKFLOWS_TAGS : "/mjr/am/asset/tags", { - ...i, - method: "POST", - headers: { - "Content-Type": "application/json", - ...a ? { "X-MJR-RTSYNC": "on" } : {} - }, - body: JSON.stringify(f) - }); - return p?.ok && K(), p; -} -async function Fn(e, { add: t = [], remove: n = [] } = {}, r = {}) { - let i = [], a = /* @__PURE__ */ new Set(); - for (let t of Array.isArray(e) ? e : []) { - let e = Number(t); - if (!Number.isFinite(e) || Math.trunc(e) <= 0) continue; - let n = Math.trunc(e); - a.has(n) || (a.add(n), i.push(n)); - } - let o = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string" && e.trim()).map((e) => e.trim()) : [], s = { - ids: i, - add: o(t), - remove: o(n) - }; - if (!s.ids.length || !s.add.length && !s.remove.length) return { - ok: !1, - data: null, - error: "Nothing to update", - code: "INVALID_INPUT" - }; - let c = q(), u = await Mn(l.ASSETS_TAGS, { - ...r, - method: "POST", - headers: { - "Content-Type": "application/json", - ...c ? { "X-MJR-RTSYNC": "on" } : {} - }, - body: JSON.stringify(s) - }); - return u?.ok && K(), u; -} -async function In() { - let e = G.get(xn); - if (Array.isArray(e)) return { - ok: !0, - data: e, - error: null, - code: "OK", - meta: { cached: !0 } - }; - let t = await J("/mjr/am/tags"); - if (t?.ok && Array.isArray(t.data)) { - let e = kn(t.data); - return G.set(xn, e), { - ...t, - data: e - }; - } - return t; -} -async function Ln(e, n = {}) { - let r = encodeURIComponent(t(e)); - return J(`/mjr/am/asset/${r}`, { - ...n, - dedupeKey: n?.dedupeKey || `meta:${r}` - }); -} -async function Rn(e, n = {}) { - let r = t(e); - if (!r) return { - ok: !1, - data: null, - error: "Missing assetId", - code: "INVALID_INPUT" - }; - let i = `/mjr/am/viewer/info?asset_id=${encodeURIComponent(r)}`; - n.refresh && (i += "&refresh=1"); - let { refresh: a, ...o } = n; - return J(i, o); -} -async function zn(e, t = {}) { - let n = Array.isArray(e) ? e : [], r = []; - for (let e of n) { - let t = Number(e); - if (Number.isFinite(t) && (r.push(Math.trunc(t)), r.length >= _n)) break; - } - return r.length ? Y("/mjr/am/assets/batch", { asset_ids: r }, t) : { - ok: !0, - data: [], - error: null, - code: "OK" - }; -} -async function Bn(e, t = {}) { - let n = i(e); - return n ? J(n, t) : { - ok: !1, - data: null, - error: "Missing workflow filepath", - code: "INVALID_INPUT" - }; -} -async function Vn(e, t = {}) { - let r = n(e); - return r ? J(r, t) : { - ok: !1, - data: null, - error: "Missing workflow filepath", - code: "INVALID_INPUT" - }; -} -async function Hn(e, t = {}) { - let n = u(e); - return n ? J(n, t) : { - ok: !1, - data: null, - error: "Missing workflow filepath", - code: "INVALID_INPUT" - }; -} -async function Un(e, t = "", n = {}) { - let i = r(e, t); - return i ? J(i, n) : { - ok: !1, - data: null, - error: "Missing workflow filepath", - code: "INVALID_INPUT" - }; -} -async function Wn({ workflow: e = null, name: t = "", category: n = "", overwrite: r = !1, filepath: i = "", task: a = "", model_family: o = "", provider: s = "", runs_on: c = "", notes: u = "" } = {}, d = {}) { - return Y(l.WORKFLOWS_SAVE, { - workflow: e, - name: t, - category: n, - overwrite: r, - filepath: i, - task: a, - model_family: o, - provider: s, - runs_on: c, - notes: u - }, d); -} -async function Gn({ filepath: e = "", name: t = "" } = {}, n = {}) { - return Y(l.WORKFLOWS_DUPLICATE, { - filepath: e, - name: t - }, n); -} -async function Kn({ filepath: e = "", name: t = "", category: n = "" } = {}, r = {}) { - return Y(l.WORKFLOWS_MOVE, { - filepath: e, - name: t, - category: n - }, r); -} -async function qn({ filepath: e = "" } = {}, t = {}) { - return Y(l.WORKFLOWS_DELETE, { filepath: e }, t); -} -async function Jn({ filepath: e = "" } = {}, t = {}) { - return Y(l.WORKFLOWS_MARK_LOADED, { filepath: e }, t); -} -async function Yn({ filepath: e = "", favorite: t = !1 } = {}, n = {}) { - return Y(l.WORKFLOWS_FAVORITE, { - filepath: e, - favorite: !!t - }, n); -} -async function Xn({ filepath: e = "", task: t = "", model_family: n = "", provider: r = "", runs_on: i = "", notes: a = "" } = {}, o = {}) { - return Y(l.WORKFLOWS_INFO, { - filepath: e, - task: t, - model_family: n, - provider: r, - runs_on: i, - notes: a - }, o); -} -async function Zn({ filepath: e = "", limit: t = 12 } = {}, n = {}) { - let r = Math.max(1, Math.min(50, Number(t) || 12)); - return J(`${l.WORKFLOWS_THUMBNAIL_CANDIDATES}?filepath=${encodeURIComponent(String(e || "").trim())}&limit=${encodeURIComponent(String(r))}`, n); -} -async function Qn(e = {}) { - return J(l.WORKFLOWS_MODEL_FAMILIES, e); -} -async function $n({ q: e = "*", limit: t = 100, offset: n = 0, sort: r = "mtime" } = {}, i = {}) { - let a = Math.max(1, Math.min(500, Number(t) || 100)), o = Math.max(0, Number(n) || 0); - return J(`${l.LIST}?scope=workflow&q=${encodeURIComponent(String(e || "*"))}&limit=${encodeURIComponent(String(a))}&offset=${encodeURIComponent(String(o))}&sort=${encodeURIComponent(String(r || "mtime"))}`, i); -} -async function er({ filepath: e = "", source_filepath: t = "" } = {}, n = {}) { - return Y(l.WORKFLOWS_THUMBNAIL_SET, { - filepath: e, - source_filepath: t - }, n); -} -async function tr({ type: e = "output", filename: t = "", subfolder: n = "", root_id: r = "", rootId: i = "", filepath: a = "" } = {}, o = {}) { - let s = String(e || "output").trim().toLowerCase() || "output", c = String(t || "").trim(), l = String(n || "").trim(), u = String(r || i || "").trim(), d = String(a || "").trim(); - if (!c) return { - ok: !1, - data: null, - error: "Missing filename", - code: "INVALID_INPUT" - }; - let f = `/mjr/am/metadata?type=${encodeURIComponent(s)}&filename=${encodeURIComponent(c)}`; - return d && (f += `&filepath=${encodeURIComponent(d)}`), l && (f += `&subfolder=${encodeURIComponent(l)}`), u && (f += `&root_id=${encodeURIComponent(u)}`), J(f, o); -} -async function nr({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, r = {}) { - try { - if (globalThis.__mjrFolderInfoSupported === !1) return { - ok: !1, - data: null, - error: "Folder info endpoint unavailable", - code: "UNAVAILABLE" - }; - if (globalThis.__mjrFolderInfoSupported == null) { - let e = await J("/mjr/am/routes"); - if (e?.ok && Array.isArray(e.data)) { - let t = e.data.some((e) => String(e?.path || "").trim() === "/mjr/am/folder-info"); - if (globalThis.__mjrFolderInfoSupported = !!t, !t) return { - ok: !1, - data: null, - error: "Folder info endpoint unavailable", - code: "UNAVAILABLE" - }; - } else globalThis.__mjrFolderInfoSupported = null; - } - } catch (e) { - console.debug?.(e); - } - let i = String(e || "").trim(), a = String(t || "").trim(), o = String(n || "").trim(), s = l.FOLDER_INFO, c = []; - i ? (c.push(`filepath=${encodeURIComponent(i)}`), c.push("browser_mode=1")) : (a && c.push(`root_id=${encodeURIComponent(a)}`), o && c.push(`subfolder=${encodeURIComponent(o)}`)), c.length && (s += `?${c.join("&")}`); - let u = await J(s, r); - try { - !u?.ok && Number(u?.status || 0) === 404 && (globalThis.__mjrFolderInfoSupported = !1); - } catch (e) { - console.debug?.(e); - } - return u; -} -// ui/utils/logging.ts -function rr(e, ...t) { - try { - c.DEBUG_VERBOSE_ERRORS && console.debug(e, ...t); - } catch {} -} -function ir(e, t = "Majoor", { showToast: n = !1, toastType: r = "error" } = {}) { - let i = e?.message || String(e || "Unknown error"); - try { - c.DEBUG_VERBOSE_ERRORS ? console.error(`[Majoor][${t}]`, i, e) : console.debug(`[Majoor][${t}]`, i); - } catch (e) { - console.debug?.(e); - } - if (n && c.DEBUG_VERBOSE_ERRORS) try { - N(`${t}: ${i}`, r, 4e3); - } catch (e) { - console.debug?.(e); - } -} -// ui/features/panel/controllers/hotkeysState.ts -var X = { - suspended: !1, - scope: null, - ratingHotkeysActive: !1 -}; -function ar() { - return X; -} -function or(e) { - X.scope = e == null ? null : String(e); -} -function sr() { - return !!X.suspended; -} -function cr(e) { - X.ratingHotkeysActive = !!e; -} -// ui/features/viewer/viewerRuntimeHosts.ts -var Z = null, Q = null, lr = ".mjr-viewer-overlay", ur = ".mjr-mfv"; -function dr(e) { - return !!e && typeof e.appendChild == "function"; -} -function fr() { - return typeof document > "u" ? null : document?.body || null; -} -function pr() { - return typeof document > "u" ? null : document?.body || document?.documentElement || null; -} -function mr(e) { - return dr(e) ? e === fr() || typeof e?.isConnected != "boolean" || e.isConnected : !1; -} -function hr(e) { - return dr(e) ? e : null; -} -function $(e) { - return mr(e) ? e : fr(); -} -function gr(e) { - let t = pr(); - return mr(t) ? t : $(e); -} -function _r(e, t, n = $) { - let r = [], i = /* @__PURE__ */ new Set(); - for (let a of [ - n(t), - fr(), - t - ]) { - if (!a || i.has(a)) continue; - i.add(a); - let t = []; - try { - t = Array.from(a.querySelectorAll?.(e) || []); - } catch (e) { - console.debug?.(e); - } - for (let e of t) e && !r.includes(e) && r.push(e); - } - return r; -} -function vr(e, t, n = $) { - let r = n(t); - if (!r) return; - let i = _r(e, t, n); - for (let e of i) if (e && e.parentNode !== r) try { - r.appendChild(e); - } catch (e) { - console.debug?.(e); - } -} -function yr(e) { - return Z = hr(e), vr(lr, Z), () => br(e); -} -function br(e) { - e && Z !== e || (Z = null); -} -function xr(e) { - return Q = hr(e), vr(ur, Q, gr), () => Sr(e); -} -function Sr(e) { - e && Q !== e || (Q = null); -} -function Cr(e) { - let t = $(Z); - try { - t?.appendChild?.(e); - } catch (e) { - console.debug?.(e); - } - return t; -} -function wr(e) { - let t = gr(Q); - try { - t?.appendChild?.(e); - } catch (e) { - console.debug?.(e); - } - return t; -} -function Tr() { - return _r(lr, Z); -} -export { bt as $, Ue as $t, Wn as A, gt as At, Mt as B, Gt as Bt, Qn as C, ut as Ct, Jn as D, wt as Dt, $n as E, ct as Et, Pn as F, Ot as Ft, en as G, on as Gt, $t as H, rt as Ht, Fn as I, mt as It, rn as J, cn as Jt, Vt as K, dn as Kt, Vn as L, nt as Lt, Xn as M, St as Mt, er as N, Qe as Nt, Kn as O, xt as Ot, Nn as P, ft as Pt, Ct as Q, We as Qt, tn as R, Pt as Rt, Bn as S, Ut as St, Hn as T, at as Tt, Jt as U, Rt as Ut, jt as V, It as Vt, Yt as W, un as Wt, it as X, ln as Xt, Kt as Y, an as Yt, st as Z, pn as Zt, zn as _, At as _t, yr as a, Te as an, Bt as at, nr as b, Nt as bt, or as c, p as cn, zt as ct, ir as d, Ft as dt, N as en, _t as et, qn as f, Tt as ft, Ln as g, qt as gt, J as h, Ht as ht, xr as i, Ee as in, dt as it, Yn as j, et as jt, Y as k, vt as kt, cr as l, f as ln, tt as lt, Gn as m, Qt as mt, Cr as n, ge as nn, $e as nt, ar as o, De as on, Dt as ot, Un as p, fn as pt, lt as q, sn as qt, Tr as r, Oe as rn, yt as rt, sr as s, E as sn, pt as st, wr as t, je as tn, ht as tt, rr as u, Lt as ut, In as v, nn as vt, Zn as w, ot as wt, Rn as x, Wt as xt, tr as y, Zt as yt, kt as z, Et as zt }; diff --git a/dist/entry.js b/dist/entry.js index c93ee2da..8add150f 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,25 +1,24 @@ -import { A as e, B as t, Bt as n, C as r, D as i, Dt as a, E as o, G as s, Gt as c, H as l, Ht as u, I as d, J as f, Jt as p, K as m, M as h, Mt as g, N as _, O as v, P as y, R as b, Rt as x, S, St as C, U as w, V as T, Vt as E, W as D, Wt as O, Xt as k, Y as A, Yt as j, Zt as M, _ as N, _t as ee, an as te, b as P, bt as ne, c as F, ct as re, d as ie, dt as ae, en as I, f as oe, g as se, gt as ce, h as le, ht as ue, in as de, j as fe, k as pe, l as me, m as he, mt as ge, nn as _e, o as ve, on as ye, pt as be, rn as xe, s as Se, sn as Ce, tn as we, u as Te, vt as Ee, w as De, xt as Oe, y as ke, yt as Ae, zt as je } from "./chunks/viewerRuntimeHosts-n0pKLECw.js"; -import { $ as Me, A as Ne, Ct as Pe, F as Fe, G as Ie, H as Le, K as Re, L as ze, Q as Be, St as Ve, U as He, W as Ue, X as We, Z as Ge, _ as Ke, at as qe, bt as Je, ct as Ye, dt as Xe, et as Ze, ft as Qe, g as $e, it as et, j as tt, lt as L, m as R, n as nt, o as z, ot as rt, pt as it, q as at, r as B, rt as ot, st, t as ct, tt as lt, ut, xt as dt, yt as ft } from "./chunks/events-C65wdOHm.js"; -import { a as pt, i as mt, n as ht, t as gt } from "./chunks/graphTraversal-DTdQWkn5.js"; -import { A as _t, B as vt, C as yt, D as bt, E as xt, F as St, G as Ct, H as wt, I as Tt, J as Et, L as Dt, M as Ot, N as kt, O as At, P as jt, R as Mt, S as Nt, T as Pt, U as Ft, V as It, W as Lt, Y as Rt, _ as zt, b as Bt, d as Vt, g as Ht, j as Ut, k as Wt, q as Gt, v as Kt, x as qt, y as Jt, z as Yt } from "./chunks/Viewer-W-G40j3K.js"; -import { $ as Xt, A as Zt, B as Qt, C as $t, D as en, E as tn, F as nn, G as rn, H as an, I as on, J as sn, K as cn, L as ln, M as un, N as dn, O as fn, P as pn, Q as mn, R as hn, T as gn, U as _n, V as vn, W as yn, X as bn, Y as xn, Z as Sn, _ as Cn, a as wn, c as Tn, d as En, et as Dn, f as On, g as kn, h as An, i as jn, j as Mn, k as Nn, l as Pn, m as Fn, n as In, o as Ln, p as Rn, q as zn, s as Bn, t as Vn, u as Hn, w as Un, z as Wn } from "./chunks/SidebarWorkflowSection-DrCNoS04.js"; -import { _ as Gn, i as Kn, n as qn, p as Jn, t as Yn } from "./chunks/openMajoorSettings-2yBqYLc0.js"; -import { a as Xn, c as Zn, l as Qn, o as $n, s as er, u as tr } from "./chunks/floatingViewerManager-BzaQii21.js"; -import { A as nr, B as rr, C as V, D as ir, E as H, G as ar, H as or, I as sr, J as U, K as cr, L as lr, M as ur, N as dr, O as W, P as fr, R as pr, S as mr, T as G, U as hr, V as K, W as gr, Y as _r, at as vr, b as yr, ct as br, dt as xr, ft as q, it as Sr, j as J, k as Y, lt as X, nt as Cr, q as wr, rt as Z, tt as Tr, ut as Q, v as Er, w as Dr, x as Or, y as kr, z as Ar } from "./chunks/mjr-primevue-BRqtdXzb.js"; -import { n as jr, r as Mr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; -import { t as Nr } from "./chunks/TagsEditor-2AmCKykg.js"; -import { app as Pr } from "../../scripts/app.js"; -function Fr(e = null) { +import { $n as e, A as t, At as n, Bt as r, C as i, Dn as a, F as o, Ft as s, Gn as c, Gt as l, Hn as u, I as d, In as f, Jn as p, Jt as m, Kn as h, Kt as g, Ln as _, M as v, Mt as y, N as b, Nn as x, O as S, Ot as C, P as w, Pn as T, Pt as E, Q as D, Qn as O, R as k, Rn as A, Rt as ee, S as j, St as M, T as N, Tn as te, Un as ne, Vt as P, Wn as re, Wt as F, Xn as I, Xt as ie, Yn as ae, Yt as oe, Zn as se, Zt as ce, _ as le, _t as ue, a as de, ar as fe, at as pe, b as me, bn as he, c as ge, cr as _e, ct as ve, d as ye, dr as be, dt as xe, er as Se, ft as Ce, h as we, in as L, ir as Te, it as Ee, j as De, jt as Oe, kt as ke, lr as Ae, lt as je, m as Me, nr as Ne, o as Pe, on as Fe, ot as Ie, p as Le, qn as Re, qt as ze, r as Be, rr as Ve, rt as He, s as Ue, sn as We, sr as Ge, st as Ke, t as R, tr as qe, tt as Je, u as Ye, ut as Xe, v as Ze, w as Qe, x as z, xn as $e, y as et, z as tt, zn as nt, zt as rt } from "./chunks/config-C9a-wT5M.js"; +import { a as it, i as at, n as ot, t as st } from "./chunks/graphTraversal-DTdQWkn5.js"; +import { _ as ct, c as lt, d as ut, f as dt, g as ft, h as pt, l as mt, m as ht, o as gt, p as _t, s as vt, u as yt } from "./chunks/floatingViewerManager-B_I-SRbd.js"; +import { A as bt, C as xt, D as St, E as Ct, M as wt, N as Tt, O as Et, T as Dt, _ as Ot, g as kt, h as At, j as jt, k as Mt, w as Nt } from "./chunks/generationSectionState-DuXxSw-j.js"; +import { n as Pt, r as B, t as Ft } from "./chunks/events-1iwo5blr.js"; +import { E as It, S as Lt, c as Rt, i as zt, l as Bt, n as Vt, o as Ht, r as Ut, s as Wt, t as Gt, u as Kt, x as qt, y as Jt } from "./chunks/tooltipShortcuts-Ury2eTek.js"; +import { A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, R as fn, S as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, _ as bn, a as xn, b as Sn, c as Cn, d as wn, f as Tn, g as En, h as Dn, i as On, j as kn, k as An, l as jn, m as Mn, n as Nn, o as Pn, p as Fn, q as In, r as Ln, s as Rn, t as zn, u as Bn, v as Vn, w as Hn, x as Un, y as Wn, z as Gn } from "./chunks/TagsEditor-MUk741GH.js"; +import { $ as Kn, B as qn, C as V, D as Jn, E as H, F as Yn, G as Xn, H as Zn, J as Qn, K as $n, M as U, N as er, O as W, P as tr, Q as G, R as nr, S as rr, T as K, U as ir, V as ar, W as q, X as or, Z as sr, at as cr, b as lr, ct as ur, ft as dr, gt as J, ht as fr, j as pr, k as Y, lt as mr, mt as X, ot as hr, pt as Z, q as gr, st as Q, ut as _r, v as vr, w as yr, x as br, y as xr } from "./chunks/mjr-primevue-C07IsEdU.js"; +import { n as Sr, r as Cr } from "./chunks/mjr-vue-vendor-CEDOnn2t.js"; +import { app as wr } from "../../scripts/app.js"; +function Tr(e = null) { return null; } -function Ir() { +function Er() { return null; } try { - typeof window < "u" && lt && lt.LIST; + typeof window < "u" && p && p.LIST; } catch {} // ui/integration/comfy_send_to_am.ts -var Lr = "MajoorAssetsManager.SendTo", Rr = "Send to Asset Manager", zr = /* @__PURE__ */ new Set([ +var Dr = "MajoorAssetsManager.SendTo", Or = "Send to Asset Manager", kr = /* @__PURE__ */ new Set([ "SaveImage", "PreviewImage", "VHS_VideoCombine", @@ -29,11 +28,11 @@ var Lr = "MajoorAssetsManager.SendTo", Rr = "Send to Asset Manager", zr = /* @__ "SaveAnimatedPNG", "SaveAudio" ]); -function Br(e) { +function Ar(e) { let t = String(e?.comfyClass || e?.type || "").trim(); - return zr.has(t); + return kr.has(t); } -function Vr(e) { +function jr(e) { let t = []; try { let n = e?.imgs && Array.isArray(e.imgs) ? e.imgs : null, r = []; @@ -61,15 +60,15 @@ function Vr(e) { } catch {} return t; } -async function Hr(e) { - let t = tt(), n = Ne(t); - if (!e.length) at({ +async function Mr(e) { + let t = $e(), n = he(t); + if (!e.length) nt({ severity: "warn", summary: "Majoor Assets Manager", detail: "No output to send (run the node first).", life: 3500 }); - else if (!n || typeof n.fetchApi != "function") at({ + else if (!n || typeof n.fetchApi != "function") nt({ severity: "error", summary: "Majoor Assets Manager", detail: "ComfyUI API unavailable.", @@ -82,14 +81,14 @@ async function Hr(e) { body: JSON.stringify({ items: e }) }); if (!r.ok && r.status !== 404) throw Error(`HTTP ${r.status}`); - Ke(t, "majoor-assets"), at({ + We(t, "majoor-assets"), nt({ severity: "success", summary: "Majoor Assets Manager", detail: `Sent ${e.length} item(s) to the asset grid.`, life: 2500 }); } catch (e) { - at({ + nt({ severity: "error", summary: "Majoor Assets Manager", detail: `Failed to send: ${e?.message || e}`, @@ -97,16 +96,16 @@ async function Hr(e) { }); } } -function Ur() { - let e = tt(); - !e || typeof e.registerExtension != "function" ? setTimeout(Ur, 100) : e.registerExtension({ - name: Lr, +function Nr() { + let e = $e(); + !e || typeof e.registerExtension != "function" ? setTimeout(Nr, 100) : e.registerExtension({ + name: Dr, getNodeMenuItems(e) { try { - return Br(e) ? [{ - content: Rr, + return Ar(e) ? [{ + content: Or, callback: () => { - Hr(Vr(e)); + Mr(jr(e)); } }] : []; } catch { @@ -115,11 +114,11 @@ function Ur() { } }); } -Ur(); +Nr(); // ui/integration/majoor_save_placeholders.ts -var Wr = "MajoorAssetsManager.SavePlaceholders", Gr = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), Kr = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; -function qr(e, t) { - return e.replace(Kr, (e) => { +var Pr = "MajoorAssetsManager.SavePlaceholders", Fr = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), Ir = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; +function Lr(e, t) { + return e.replace(Ir, (e) => { if (e === "yyyy") return String(t.getFullYear()); if (e === "yy") return String(t.getFullYear()).substring(2, 4); let n; @@ -144,51 +143,51 @@ function qr(e, t) { return String(n).padStart(e.length, "0"); }); } -var Jr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; -function Yr(e) { +var Rr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; +function zr(e) { let t = e?.nodes ?? e?._nodes; return Array.isArray(t) ? t : []; } -function Xr(e, t) { +function Br(e, t) { return String(t ?? "").replace(/%([^%]+)%/g, (t, n) => { let r = String(n).split("."); - if (r.length !== 2) return r[0].startsWith("date:") ? qr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; - let i = Yr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); + if (r.length !== 2) return r[0].startsWith("date:") ? Lr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; + let i = zr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); a.length || (a = i.filter((e) => e?.title === r[0])); let o = a[0]; if (!o) return t; let s = Array.isArray(o.widgets) ? o.widgets.find((e) => e?.name === r[1]) : null; - return s ? String(s.value ?? "").replace(Jr, "_") : t; + return s ? String(s.value ?? "").replace(Rr, "_") : t; }); } -function Zr(e, t) { +function Vr(e, t) { try { let n = Array.isArray(e?.widgets) ? e.widgets.find((e) => e?.name === "filename_prefix") : null; if (!n) return; let r = n.serializeValue; n.serializeValue = () => { let i = typeof r == "function" ? r.call(n) : n.value; - return Xr(e?.graph || t?.graph, i); + return Br(e?.graph || t?.graph, i); }; } catch {} } -function Qr() { - let e = tt(); - !e || typeof e.registerExtension != "function" ? setTimeout(Qr, 100) : e.registerExtension({ - name: Wr, +function Hr() { + let e = $e(); + !e || typeof e.registerExtension != "function" ? setTimeout(Hr, 100) : e.registerExtension({ + name: Pr, nodeCreated(t) { try { let n = String(t?.comfyClass || t?.type || ""); - if (!Gr.has(n)) return; - Zr(t, e); + if (!Fr.has(n)) return; + Vr(t, e); } catch {} } }); } -Qr(); +Hr(); // ui/app/bootstrap.ts -var $r = !1, ei = null, ti = !1, ni = null; -function ri() { +var Ur = !1, Wr = null, Gr = !1, Kr = null; +function qr() { try { let e = window?.__MJR_EXECUTION_RUNTIME__; return !String(e?.active_prompt_id || "").trim(); @@ -196,26 +195,26 @@ function ri() { return console.debug?.(e), !0; } } -async function ii(e = {}) { - if (!z || typeof z != "object" || !z.AUTO_SCAN_ON_STARTUP || $r) return; +async function Jr(e = {}) { + if (!R || typeof R != "object" || !R.AUTO_SCAN_ON_STARTUP || Ur) return; let t = Math.max(0, Number(e?.delayMs) || 0), n = e?.idleOnly !== !1; - if (t > 0) ei && clearTimeout(ei), ei = setTimeout(() => { - ei = null, ii({ + if (t > 0) Wr && clearTimeout(Wr), Wr = setTimeout(() => { + Wr = null, Jr({ ...e, delayMs: 0 }); }, t); - else if (n && !ri()) ei && clearTimeout(ei), ei = setTimeout(() => { - ei = null, ii({ + else if (n && !qr()) Wr && clearTimeout(Wr), Wr = setTimeout(() => { + Wr = null, Jr({ ...e, delayMs: 0 }); }, 5e3); else { - $r = !0; + Ur = !0; try { - Te("[Majoor] Starting startup scan of output directory..."); - let e = await pe(lt.SCAN, { + ft("[Majoor] Starting startup scan of output directory..."); + let e = await me(p.SCAN, { recursive: !0, incremental: !0, fast: !0, @@ -223,30 +222,30 @@ async function ii(e = {}) { }); if (e.ok) { let t = e.data; - Te(`[Majoor] Startup scan complete - added: ${t.added}, updated: ${t.updated}, skipped: ${t.skipped}`); + ft(`[Majoor] Startup scan complete - added: ${t.added}, updated: ${t.updated}, skipped: ${t.skipped}`); } else console.warn("[Majoor] Majoor [WARN]: Startup scan failed:", e.error); } catch (e) { console.error("[Majoor] ERROR: Startup scan error:", e); } } } -async function ai() { +async function Yr() { try { await Promise.allSettled([ - le(lt.HEALTH), - le(`${lt.HEALTH_COUNTERS}?scope=output`), - le(lt.HEALTH_DB) + Pe(p.HEALTH), + Pe(`${p.HEALTH_COUNTERS}?scope=output`), + Pe(p.HEALTH_DB) ]); } catch (e) { console.debug?.(e); } } -async function oi(e = {}) { - return ti ? ni || Promise.resolve() : (ti = !0, ni = (async () => { - await si(), await ai(), await ii(e); - })(), ni); +async function Xr(e = {}) { + return Gr ? Kr || Promise.resolve() : (Gr = !0, Kr = (async () => { + await Zr(), await Yr(), await Jr(e); + })(), Kr); } -function si() { +function Zr() { return new Promise((e) => { try { if (typeof window > "u") { @@ -265,28 +264,28 @@ function si() { } }); } -async function ci() { +async function Qr() { try { - Te("[Majoor] Testing API connection..."); - let e = await le(lt.HEALTH); - e?.ok ? Te("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error); + ft("[Majoor] Testing API connection..."); + let e = await Pe(p.HEALTH); + e?.ok ? ft("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error); } catch (e) { console.error("[Majoor] ERROR: Failed to connect to API:", e); } } // ui/app/style.ts -function li() { +function $r() { let e = "mjr-feed-selection-override"; if (typeof document > "u" || document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-bottom-feed .mjr-asset-card.is-selected,\n .mjr-bottom-feed .mjr-card.is-selected {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 78%, #ffffff 22%), 0 0 0 6px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 34%, transparent), 0 0 24px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 52%, transparent), 0 10px 28px rgba(0, 0, 0, 0.32) !important;\n outline: 2px solid color-mix(in srgb, var(--mjr-accent, #5fb3ff) 85%, #ffffff 15%) !important;\n outline-offset: 0 !important;\n border-color: color-mix(in srgb, var(--mjr-accent, #5fb3ff) 62%, var(--mjr-border, rgba(255, 255, 255, 0.12))) !important;\n overflow: visible !important;\n z-index: 12 !important;\n }\n ", document.head.appendChild(t); } -function ui({ enabled: e = !0 } = {}) { +function ei({ enabled: e = !0 } = {}) { if (!e) return; let t = "mjr-theme-comfy-css"; - if (document.getElementById(t)) li(); + if (document.getElementById(t)) $r(); else try { - let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciAtIENvbWZ5LWxpa2UgdGhlbWUgbGF5ZXIKICoKICogUlVMRVM6CiAqIC0gRG8gTk9UIGhhcmRjb2RlIGEgY3VzdG9tIHBhbGV0dGU7IHVzZSBleGlzdGluZyBDb21meVVJIENTUyB2YXJpYWJsZXMgdmlhIHZhciguLi4pLgogKiAtIEtlZXAgZXZlcnl0aGluZyBzY29wZWQgdW5kZXIgYC5tanItYXNzZXRzLW1hbmFnZXJgIHRvIGF2b2lkIGxlYWtpbmcgc3R5bGVzIHRvIENvbWZ5VUkgKGV4Y2VwdCBgLm1qci1wb3BvdmVyKmAgd2hpY2ggY2FuIGJlIHBvcnRhbGVkIHRvIGBkb2N1bWVudC5ib2R5YCkuCiAqLwoKLm1qci1hc3NldHMtbWFuYWdlciB7CiAgICAvKiBUeXBvZ3JhcGh5ICovCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qCiAgICAgKiBTdXJmYWNlcyAtIHByaW9yaXR5OiBDb21meVVJIHYxLjQyIGRlc2lnbi1zeXN0ZW0gdG9rZW4gLT4gbGVnYWN5IHRva2VuIC0+IGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkgLSB1c2UgQ29tZnlVSSBkZXNpZ24tc3lzdGVtIHJhZGl1cyB0b2tlbnMgd2hlbiBhdmFpbGFibGUgKi8KICAgIC0tbWpyLXItc206IHZhcigtLXJhZGl1cy1zbSwgOHB4KTsKICAgIC0tbWpyLXItbWQ6IHZhcigtLXJhZGl1cy1tZCwgMTBweCk7CiAgICAtLW1qci1yLWxnOiB2YXIoLS1yYWRpdXMtbGcsIDEycHgpOwoKICAgIC8qIFNwYWNpbmcgKi8KICAgIC0tbWpyLXBhZC1zbTogOHB4OwogICAgLS1tanItcGFkLW1kOiAxMnB4OwogICAgLS1tanItcGFkLWxnOiAxNnB4OwoKICAgIC8qIFNlbWFudGljIFN0YXR1cyBDb2xvcnMgLSBwcmVmZXIgQ29tZnlVSSB2MS40MiBzZW1hbnRpYyB0b2tlbnMgKi8KICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1zdWNjZXNzLWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci1zdGF0dXMtd2FybmluZzogdmFyKC0td2FybmluZy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItc3RhdHVzLWVycm9yOiB2YXIoLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKICAgIC0tbWpyLXN0YXR1cy1pbmZvOiB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMyk7CiAgICAtLW1qci1zdGF0dXMtbmV1dHJhbDogdmFyKC0tY29tZnktc3RhdHVzLW5ldXRyYWwsICM5ZTllOWUpOwogICAgLS1tanItc3Rhci1hY3RpdmU6ICNmZmQ0NWE7CgogICAgLyogQmFkZ2UgY29sb3JzIChvdmVycmlkZGVuIGJ5IHNldHRpbmdzKSAqLwogICAgLS1tanItYmFkZ2UtaW1hZ2U6ICMyMTk2ZjM7CiAgICAtLW1qci1iYWRnZS12aWRlbzogIzljMjdiMDsKICAgIC0tbWpyLWJhZGdlLWF1ZGlvOiAjZmY5ODAwOwogICAgLS1tanItYmFkZ2UtbW9kZWwzZDogIzRjYWY1MDsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjM2QzZDNkKTsKICAgIC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgIzRhOTBlMik7CiAgICAtLW1qci1yYXRpbmctY29sb3I6ICNmZjk1MDA7CiAgICAtLW1qci10YWctY29sb3I6ICM0YTkwZTI7Cn0KCi8qIE1ha2UgdGhlIHRoZW1lIHZpc2libHkgYXBwbHkgZXZlbiB3aXRoIGlubGluZSBzdHlsZXMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIubWpyLWFtLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXIgewogICAgcGFkZGluZzogMTRweCAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIHJvdy1nYXA6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItbGVmdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWhlYWRlci10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYnMgewogICAgLyogUXVldWUtbGlrZSB0YWJzIChhY3RpdmUgcGlsbCwgb3RoZXJzIGFzIHRleHQpICovCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBnYXA6IDEwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjUlLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiLmlzLWFjdGl2ZSB7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItY29udGV4dC1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItcG9wb3Zlci1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24gLSB0ZWFsIGdsb3cgd2hlbiB2aWV3ZXIgaXMgb3BlbiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIHsKICAgIGNvbG9yOiAjNGRkOWMwOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC4xKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDc3LCAyMTcsIDE5MiwgMC4yNSk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZnYtYnRuLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWJ0biB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWhhcy11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzIlLCB2YXIoLS1tanItYWNjZW50KSAxMSUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVzc2FnZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICByaWdodDogLTZweDsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykpOwogICAgYmFja2dyb3VuZDogI2VmNTM1MDsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46ZGlzYWJsZWQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1haS1jb250cm9sOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgOTIlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkIC5tanItYWktY29udHJvbDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIHsKICAgIG9wYWNpdHk6IDAuNTg7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIC5tanItYWktY29udHJvbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIGJ1dHRvbiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogUG9wb3ZlcnMgY2FuIGJlIG1vdmVkIHRvIGBkb2N1bWVudC5ib2R5YCAocG9ydGFsKSB0byBhdm9pZCBiZWluZyBjbGlwcGVkLiAqLwoubWpyLXBvcG92ZXIgewogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdmFyKAogICAgICAgICAgICAtLWZvbnQtaW50ZXIsCiAgICAgICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgICAgIHN5c3RlbS11aSwKICAgICAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICAgICAgUm9ib3RvLAogICAgICAgICAgICBBcmlhbCwKICAgICAgICAgICAgc2Fucy1zZXJpZgogICAgICAgICkKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpKTsKCiAgICAvKiBQcm92aWRlIGZhbGxiYWNrcyB3aGVuIG91dHNpZGUgYC5tanItYXNzZXRzLW1hbmFnZXJgIHNjb3BlICovCiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgLS1tanItcG9wb3Zlci16LWluZGV4OiAyMTQ3NDgzNjQ3OwoKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aWR0aDogbWluKDI4MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXBvcG92ZXItLWhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMzQwcHg7CiAgICB3aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1zb3J0LXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIHdpZHRoOiBtaW4oMjYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzQwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVycy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlcnMtZW1wdHkgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3BlbiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE5MCwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMSkpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3Blbjpob3ZlciwKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1vcGVuOmZvY3VzLXZpc2libGUgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0NSwgMjA1LCAyNTUsIDAuNCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDgwLCAxNDAsIDI1NSwgMC4xOCksIHJnYmEoMzIsIDEwMCwgMjAwLCAwLjE0KSk7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItbGFiZWwgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXBhdGggewogICAgZmxleDogMCAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuNjg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItdW5waW4gewogICAgd2lkdGg6IDQycHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgOTUsIDk1LCAwLjM1KTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KSwgcmdiYSgxNjAsIDIwLCAyMCwgMC4xMikpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXVucGluIC5waSB7CiAgICBvcGFjaXR5OiAwLjg4OwogICAgY29sb3I6IHJnYmEoMjU1LCAxMzAsIDEzMCwgMC45Nik7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiAtIHVucmVhZCBpbmRpY2F0b3IgZG90ICovCi5tanItdGFiLXVucmVhZC1kb3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBIaXN0b3J5IHBhbmVsICovCi5tanItbWVzc2FnZXMtaGlzdG9yeS1wYW5lbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWhpc3RvcnktaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDRweCAwIDZweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWhpc3RvcnktaGVhZC1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgb3BhY2l0eTogMC42MjsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvcGFjaXR5OiAwLjcyOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTIlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaGlzdG9yeS1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwp9CgoubWpyLWhpc3RvcnktaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXdhcm5pbmcgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YwYjg1YSA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0taWNvbiB7CiAgICBmbGV4LXNocmluazogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNvbnRlbnQgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1tc2cgewogICAgb3BhY2l0eTogMC45MjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvcGFjaXR5OiAwLjk2OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWRldGFpbCB7CiAgICBvcGFjaXR5OiAwLjg0OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGltZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBvcGFjaXR5OiAwLjUyOwp9CgoubWpyLWhpc3RvcnktaXRlbS1jaGlwIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzY7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbjpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1zdW1tYXJ5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuNzQ7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1iYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MtZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDcyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikpCiAgICApOwp9CgoubWpyLXNob3J0Y3V0LWd1aWRlIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKfQoKLm1qci1zaG9ydGN1dC1ndWlkZS1pbnRybyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIG9wYWNpdHk6IDAuODQ7Cn0KCi5tanItc2hvcnRjdXQtc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg0JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSkgODglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItc2hvcnRjdXQtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItc2hvcnRjdXQtcm93IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxMzJweCwgMTYwcHgpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7Cn0KCi5tanItc2hvcnRjdXQta2V5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzOCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTAlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9CgoubWpyLXNob3J0Y3V0LWRlc2MgewogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgewogICAgLm1qci1zaG9ydGN1dC1yb3cgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItc2hvcnRjdXQta2V5IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCAxMHB4OwogICAgcGFkZGluZzogNHB4IDJweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWxlZnQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWtpY2tlciB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDllbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDY1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXN1YnRpdGxlIHsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjIlLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zdGFjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWFjdGl2ZS1jb3VudCB7CiAgICBtaW4td2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2xlYXItYWxsIHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3ctLTNjb2wgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItcm93LS0zY29sIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBncmlkLWNvbHVtbjogMSAvIC0xOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA3MCUsIHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cCB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiB2YXIoLS1tanItYWNjZW50LCAjN2FhMmZmKTsKICAgIHBhZGRpbmc6IDEwcHggMCA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtLWNvcmUgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzU2YThmZjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tbWVkaWEgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzM1ZDA4YjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tdGltZSB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiAjZjBiODRmOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRvZ2dsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgMTBweDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogMnB4IDRweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDYyJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRpdGxlOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBmbGV4OiAwIDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudCk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtY2hldnJvbiB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDc4JSwgdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtYm9keSB7CiAgICBwYWRkaW5nLXRvcDogNHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWNhcmQgewogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHRyYW5zcGFyZW50KSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCB0cmFuc3BhcmVudCkKICAgICk7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZDpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZC0tYWdlbmRhIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICNmMGI4NGYgOSUsIHZhcigtLW1qci1zdXJmYWNlLTIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCB0cmFuc3BhcmVudCkKICAgICk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bm90KC5pcy1vcGVuKSB7CiAgICBwYWRkaW5nLWJvdHRvbTogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwOm5vdCguaXMtb3BlbikgLm1qci1maWx0ZXItZ3JvdXAtdG9nZ2xlIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA0NDBweCkgewogICAgLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgfQoKICAgIC5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZC1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYiB7CiAgICAtLW1qci1icmVhZGNydW1iLWFjY2VudDogIzU2YThmZjsKICAgIC0tbWpyLWJyZWFkY3J1bWItY3VycmVudDogIzM1ZDA4YjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgbWFyZ2luOiAxcHggMCAzcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgMjIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA5JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWIuaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA0MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDc4JSwgI2ZmZmZmZik7CiAgICBmb250OiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uOmRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNTg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYi1hY3Rpb246bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA2MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudCB7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA3NiUsICNmZmZmZmYpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlZ21lbnQ6bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudC5pcy1jdXJyZW50LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudDpkaXNhYmxlZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAxNCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItY3VycmVudCkgNzQlLCAjZmZmZmZmKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlcGFyYXRvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgNTglLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MikpKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZHVwLWFsZXJ0IHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICM1NTUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2VlZSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLyogU2Nyb2xsYmFycyAobWF0Y2ggQ29tZnlVSSBmZWVsKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpIHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jdXN0b20tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgovKiBDYXJkIE1ldGFkYXRhIENvbG9ycyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBjb2xvcjogI2ZmYTcyNjsgLyogT3JhbmdlIGZvciBkdXJhdGlvbiAqLwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtcmVzIHsKICAgIGNvbG9yOiAjNGZjM2Y3OyAvKiBMaWdodCBCbHVlIGZvciByZXNvbHV0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kYXRlIHsKICAgIGNvbG9yOiAjYjlmNmNhOyAvKiBQYWxlIEdyZWVuIGZvciBkYXRlICovCiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtdGltZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgNnB4IDA7CiAgICBwYWRkaW5nOiAwIDAgNHB4IDA7CiAgICBtaW4taGVpZ2h0OiAxNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFRvYXN0cyAoZ2xvYmFsOiBjYW4gYmUgbW91bnRlZCB1bmRlciBkb2N1bWVudC5ib2R5KSAqLwoubWpyLXRvYXN0LWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDE2cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICB6LWluZGV4OiAxMDAwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdG9hc3QgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdmFyKC0tbWpyLXRvYXN0LXN0cmlwKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgI2VmZWZlZik7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMnMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMnMgZWFzZS1vdXQ7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgbWluLXdpZHRoOiBtaW4oMjUwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbig0MDBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdG9hc3QuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLXRvYXN0LXRleHQgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi8qIFRvYXN0IGljb24gc3R5bGluZyAqLwoubWpyLXRvYXN0LXRleHQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiBhdHRyKGRhdGEtaWNvbik7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGNvbG9yOiB2YXIoLS1tanItdG9hc3QtaWNvbi1jb2xvcik7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG1pbi13aWR0aDogMTZweDsKfQoKLm1qci10b2FzdC1zdWNjZXNzIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7Cn0KCi5tanItdG9hc3QtZXJyb3IgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtZXJyb3IsIHZhcigtLWNvbWZ5LXN0YXR1cy1lcnJvciwgI2Y0NDMzNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7Cn0KCi5tanItdG9hc3Qtd2FybmluZyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwp9CgoubWpyLXRvYXN0LWluZm8gewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWNvbnRleHQtcGlsbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICByb3ctZ2FwOiA0cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEwLjVweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWluLWhlaWdodDogMjJweDsKICAgIG1heC13aWR0aDogMjIwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGw6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTAlLCB2YXIoLS1tanItYWNjZW50KSAxNCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwteCB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14OmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgaGVpZ2h0OiAxLjc1cmVtOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXRvb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1wb3BvdmVyLWFuY2hvciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYWdlbmRhLWlucHV0IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjJzIGVhc2UsCiAgICAgICAgY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjJzIGVhc2U7Cn0KLm1qci1hZ2VuZGEtaW5wdXQubWpyLWFnZW5kYS1maWxsZWQgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZW1wdHkgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg1JSwgdHJhbnNwYXJlbnQgMTUlKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKfQoKLm1qci1hZ2VuZGEtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLWFnZW5kYS1jYWxlbmRhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYWdlbmRhLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWFnZW5kYS1tb250aCB7CiAgICBmbGV4OiAxOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1uYXYgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKfQoKLm1qci1hZ2VuZGEtZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNywgbWlubWF4KDAsIDFmcikpOwogICAgZ2FwOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtd2Vla2RheSB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXkgewogICAgaGVpZ2h0OiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAwOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFnZW5kYS1kYXktYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtNXB4OwogICAgcmlnaHQ6IC01cHg7CiAgICBtaW4td2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogI2U1MzkzNTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsICNlNTM5MzUgNjUlLCAjZmZmZmZmIDM1JSk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYWdlbmRhLWRheTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpIDU1JSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA0NSUKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA0NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTAlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXk6YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxcHgpOwp9CgoubWpyLWFnZW5kYS1kYXktLWJsYW5rIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXktLWhhcy1hc3NldHMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgODIlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXktLXNlbGVjdGVkIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHgKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItYWdlbmRhLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItYWdlbmRhLWNsZWFyLAoubWpyLWFnZW5kYS1yZWZyZXNoIHsKICAgIGZsZXg6IDE7Cn0KCi5tanItbWVudSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKfQoKLm1qci1wcmltZS1tZW51LWxpc3QsCi5tanItc29ydC1tZW51IFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1wcmltZS1tZW51IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSwKLm1qci1wcmltZS1tZW51LWxpc3QgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbSJdIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtY29udGVudCJdIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1lbnUtaXRlbSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbSB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbTpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZW51LWl0ZW06YWN0aXZlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tbGFiZWwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbSAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1jb2xsZWN0aW9ucy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gLnBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgZmxleDogMCAwIDE2cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLW1lbnUtaXRlbS1oaW50IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNjIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG9wYWNpdHk6IDAuNzI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjay0tdmlzaWJsZSwKLm1qci1tZW51LWl0ZW0uaXMtYWN0aXZlIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWVudS1kaXZpZGVyIHsKICAgIGhlaWdodDogMXB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tdXRlZCB7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLXN0YXRlLWJsb2NrIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBib3JkZXI6IDFweCBkYXNoZWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBtYXJnaW46IDRweCAwOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXN0YXRlLWJsb2NrLmlzLWVycm9yLAoubWpyLWNvbnRleHQtbWVudS1ub3RlLmlzLWVycm9yIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgODIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jb2xsZWN0aW9uLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDQ4cHg7Cn0KCi5tanItY29sbGVjdGlvbnMtdmlydHVhbC1saXN0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZGVsZXRlLWJ0biB7CiAgICB3aWR0aDogNDJweDsKICAgIGZsZXg6IDAgMCA0MnB4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlKTsKfQoKLm1qci1kZWxldGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDQwJSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNjUlKTsKfQoKLm1qci1kZWxldGUtYnRuIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24tdGl0bGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4IDJweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC42cHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgb3BhY2l0eTogMC44ODsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS1jeWFuIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS12aW9sZXQgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjYzQ4ZGZmIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24taGludCB7CiAgICBwYWRkaW5nOiAwIDEwcHggNHB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTUlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0LAoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLW1lbnUtaXRlbS0tc21hcnQgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpLAoubWpyLW1lbnUtaXRlbS0tY2x1c3Rlcjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItdGh1bWJzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDNweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWNsdXN0ZXItdGh1bWIgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1pbmZvIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItY2x1c3Rlci1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLWNsdXN0ZXItY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA1OCUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0biB7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2U7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNjI7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIC5waSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIC5tanItaW5wdXQgewogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbDpmb2N1cy13aXRoaW4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tYnJvd3NlIHsKICAgIG1hcmdpbi10b3A6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbCB7CiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7Cn0KCi8qIEdyaWQgbGF5b3V0ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAvKiBBdm9pZCBvdmVyZmxvdyB3aGVuIHRoZSBwYW5lbCBiZWNvbWVzIG5hcnJvd2VyIHRoYW4gdGhlIG1pbiBjYXJkIHNpemUgKi8KICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KAogICAgICAgIGF1dG8tZmlsbCwKICAgICAgICBtaW5tYXgobWluKDEwMCUsIHZhcigtLW1qci1ncmlkLW1pbi1zaXplLCAxODBweCkpLCAxZnIpCiAgICApOwogICAgZ2FwOiB2YXIoLS1tanItZ3JpZC1nYXAsIDEwcHgpOwogICAgbWFyZ2luLXRvcDogNnB4OwogICAgbWluLWhlaWdodDogMDsKfQoKLyogQ2FyZCBzZWxlY3Rpb24gKyBmb2N1cyAoa2VlcHMgYSB2aXNpYmxlIGluZGljYXRvciB3aGVuIHNpZGViYXIgaXMgb3BlbikgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMTBweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICAvKiBzY2FsZSgwLjk3KSBpbnN0ZWFkIG9mIDAuOTI6IHN1YnRsZSBpbnNldCBmZWVsIHdpdGhvdXQgdGhlIGFnZ3Jlc3NpdmUKICAgICAgIHNocmluayB0aGF0IGNhdXNlZCBhIHZpc2libGUgYmxpbmsgb24gcmFwaWQgc2VsZWN0aW9uIGNoYW5nZXMuICovCiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTcpICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMDsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpmb2N1cy12aXNpYmxlIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gewogICAgMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTglKTsKICAgICAgICBvcGFjaXR5OiAwLjE4OwogICAgfQogICAgNTAlIHsKICAgICAgICBvcGFjaXR5OiAwLjM0OwogICAgfQogICAgMTAwJSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KfQoKQGtleWZyYW1lcyBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSB7CiAgICAwJSwKICAgIDEwMCUgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDFweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpLAogICAgICAgICAgICAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgfQogICAgNTAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjUyKSwKICAgICAgICAgICAgMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xMiksCiAgICAgICAgICAgIDAgMTJweCAzMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSAubWpyLXRodW1iIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBsYWNlaG9sZGVyLXdhc2ggewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IC04JTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMTVkZWcsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjA4KSAzMCUsCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSA1MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDAuMTIpIDcwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMCkgMTAwJQogICAgKTsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gMi4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBpbGwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA2cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4zNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsLWRvdCB7CiAgICB3aWR0aDogN3B4OwogICAgaGVpZ2h0OiA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICM3NmQ2ZmY7CiAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjE2KTsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci1hc3NldC1zdGF0dXMtZG90IHsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgMS45cyBlYXNlLWluLW91dCBpbmZpbml0ZTsKfQoKLyogR3JpZCBsb2FkaW5nIG92ZXJsYXkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtbG9hZGluZy1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjMDAwIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuM3B4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tbGF5b3V0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMzJweCwgMWZyKSk7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE5MiwgMTk4LCAyMDYsIDAuMik7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgLyogbWluLWhlaWdodCByZW1vdmVkOiBWdWUgc2tlbGV0b25DYXJkU3R5bGUgc2V0cyBhbiBleHBsaWNpdCBoZWlnaHQgZGVyaXZlZAogICAgICAgZnJvbSBlc3RpbWF0ZVJvd0hlaWdodC4gQSBjb25mbGljdGluZyBtaW4taGVpZ2h0IGNhdXNlZCBza2VsZXRvbiBjYXJkcyB0bwogICAgICAgYmUgdGFsbGVyIHRoYW4gdGhlIGFjdHVhbCBjYXJkcyB0aGV5IHJlcGxhY2UsIGNhdXNpbmcgYSBsYXlvdXQganVtcCB3aGVuCiAgICAgICBhc3NldHMgZmlyc3QgbG9hZC4gKi8KICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHJnYmEoMTU2LCAxNjIsIDE3MSwgMC41MikgMCUsCiAgICAgICAgcmdiYSgyMjAsIDIyNSwgMjMyLCAwLjcyKSA0NSUsCiAgICAgICAgcmdiYSgxNTYsIDE2MiwgMTcxLCAwLjUyKSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUgewogICAgaGVpZ2h0OiAxMHB4OwogICAgbWFyZ2luOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICByZ2JhKDE2NCwgMTcwLCAxNzksIDAuNDgpIDAlLAogICAgICAgIHJnYmEoMjE0LCAyMTksIDIyNiwgMC43KSA0NSUsCiAgICAgICAgcmdiYSgxNjQsIDE3MCwgMTc5LCAwLjQ4KSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLXRpdGxlIHsKICAgIHdpZHRoOiA3MiU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLW1ldGEgewogICAgd2lkdGg6IDQ4JTsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSAwOwogICAgfQogICAgMTAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwMCUgMDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICB3aWxsLWNoYW5nZTogYmFja2dyb3VuZC1wb3NpdGlvbjsKfQoKLyogR2VuZXJpYyBoZWFkaW5ncyBpbnNpZGUgcGFuZWwgKi8KLm1qci1hc3NldHMtbWFuYWdlciBoMywKLm1qci1hc3NldHMtbWFuYWdlciBoNCB7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07Cn0KCi8qIFBhbmVscyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItcGFuZWwgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIGJveC1zaGFkb3c6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ib3gtc2hhZG93LCAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSkpOwp9CgovKiBUb29sYmFyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogdmFyKC0tbWpyLXBhZC1tZCk7Cn0KCi8qIEJ1dHRvbnMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDdweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICAvKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIGlmIHByZXNlbnQgKi8KICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2NhbiB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIHBhZGRpbmc6IDRweCAxMHB4OwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtY29sb3IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDE0JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2Nhbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1zdGF0dXMtY29sb3IpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDI0JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2Nhbjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKTsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7Cn0KCi8qIElucHV0cyAvIHNlbGVjdHMgKHVzZWQgaW5zaWRlIHBvcnRhbGVkIHBvcG92ZXJzIHRvbykgKi8KLm1qci1pbnB1dCwKLm1qci1zZWxlY3QsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdCB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaW5wdXQ6Zm9jdXMsCi5tanItc2VsZWN0OmZvY3VzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQ6Zm9jdXMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3Q6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWlucHV0LAoubWpyLXNlbGVjdCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0IHsKICAgIC8qIE92ZXJyaWRlIGlubGluZSBzdHlsZXMgaWYgcHJlc2VudCAqLwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBtaW4taGVpZ2h0OiAzNHB4OwogICAgcGFkZGluZzogMCA5cHg7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdFtkYXRhLXAtZGlzYWJsZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCBbZGF0YS1wYy1zZWN0aW9uPSJsYWJlbCJdIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgW2RhdGEtcGMtc2VjdGlvbj0iZHJvcGRvd24iXSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIHsKICAgIG1pbi13aWR0aDogdmFyKC0tcC1zZWxlY3Qtb3ZlcmxheS13aWR0aCwgMTJyZW0pOwogICAgbWF4LXdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAzMnB4KSk7CiAgICBtYXgtaGVpZ2h0OiBtaW4oMzIwcHgsIGNhbGMoMTAwdmggLSAzMnB4KSk7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zOCk7CiAgICB6LWluZGV4OiBjYWxjKHZhcigtLW1qci1wb3BvdmVyLXotaW5kZXgsIDIxNDc0ODM2NDcpICsgMSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW46IDA7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl0gewogICAgbWluLWhlaWdodDogMjhweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tbWpyLXItbWQpIC0gMnB4KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI1OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Im9wdGlvbiJdOmhvdmVyLAoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcC1oaWdobGlnaHQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi8qIFRhYnM6IG92ZXJyaWRkZW4gYWJvdmUgd2l0aCBxdWV1ZS1saWtlIHN0eWxlICovCgovKiBSZW1vdmVkIHJlZHVuZGFudCB0YWIgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSB1c2luZyAhaW1wb3J0YW50ICovCgovKiBNdXRlZCB0ZXh0IGhlbHBlciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbXV0ZWQgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi8qIEdyaWQgKyBjYXJkcyAob3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBmcm9tIENhcmQuanMpICovCi5tanItYXNzZXRzLW1hbmFnZXIgI21qci1hc3NldHMtZ3JpZCB7CiAgICBnYXA6IDEwcHggIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICBtaW4td2lkdGg6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMTIwbXMgZWFzZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQ6aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgNTUlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tanItY2FyZC1ob3Zlci1jb2xvcikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjI1KSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCBpbWcsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHZpZGVvLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWItbWVkaWEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICBvYmplY3QtZml0OiBjb3ZlciAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgewogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogMTAwJTsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODAlLCB0cmFuc3BhcmVudCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTRweCAxMnB4IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDE4JSAyMCUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjMyKSwgdHJhbnNwYXJlbnQgMzglKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDg4JSA3MiUsIHJnYmEoODIsIDIyMCwgMTU2LCAwLjI0KSwgdHJhbnNwYXJlbnQgNDIlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDE4LCAyNiwgMzYsIDAuOTgpLCByZ2JhKDgsIDEyLCAxOCwgMC45OCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWIuaGFzLXBvc3RlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLmhhcy1wb3N0ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDQsIDYsIDEwLCAwLjI4KSwgcmdiYSg0LCA2LCAxMCwgMC44NikpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDQyJSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMiksIHRyYW5zcGFyZW50IDU0JSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IHNhdHVyYXRlKDEuMSk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogc2F0dXJhdGUoMS4xKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLWhlYWQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1pY29uLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItaWNvbiB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLWtpbmQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1raW5kIHsKICAgIG1heC13aWR0aDogNjJweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItd2F2ZWZvcm0gewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDQycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiBjbGFtcCgycHgsIDIuMiUsIDVweCk7CiAgICBwYWRkaW5nOiA0cHggMDsKICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMCA0cHggMTRweCByZ2JhKDAsIDAsIDAsIDAuMzQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtIHNwYW4sCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSBzcGFuIHsKICAgIHdpZHRoOiAzcHg7CiAgICBtaW4td2lkdGg6IDJweDsKICAgIG1heC13aWR0aDogNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTgpLCByZ2JhKDE2MCwgMjI0LCAyNTUsIDAuNzIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLW1ldGEsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1tZXRhIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNjIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItdGl0bGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi10aXRsZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1zdWJ0aXRsZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLXN1YnRpdGxlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDY1MDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgcGFkZGluZzogMTRweCAxMnB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDQ3LCA1OCwgNzYsIDAuOTQpLCByZ2JhKDE4LCAyMywgMzIsIDAuOTgpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDMwJSAyNSUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIyKSwgdHJhbnNwYXJlbnQgNDIlKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggOHB4IHJnYmEoMCwgMCwgMCwgMC43Mik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItdGh1bWIubWpyLXRodW1iLXdvcmtmbG93LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXRodW1iLm1qci10aHVtYi13b3JrZmxvdyB7CiAgICBhc3BlY3QtcmF0aW86IDEuMDggLyAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWNhcmQtYWN0aW9ucywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1jYXJkLWFjdGlvbnMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA3cHg7CiAgICByaWdodDogN3B4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDRweDsKICAgIHotaW5kZXg6IDEyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0biB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBtaW4td2lkdGg6IDI0cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDgsIDEyLCAxOCwgMC41OCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoM3B4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDNweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bjpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1hY3Rpb24tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjksIDQwLCA1OCwgMC43OCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bi5pcy1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bi5pcy1hY3RpdmUgewogICAgY29sb3I6ICNmZmQ0NWE7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyMTIsIDkwLCAwLjcpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iIC5waSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYiAucGkgewogICAgZm9udC1zaXplOiAxLjc1cmVtOwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtdGh1bWJuYWlsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgdHJhbnNwYXJlbnQgMjQlLCByZ2JhKDAsIDAsIDAsIDAuMjgpIDU4JSwgcmdiYSgwLCAwLCAwLCAwLjc4KSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDAsIDAsIDAsIDAuMzQpLCB0cmFuc3BhcmVudCAzNCUsIHRyYW5zcGFyZW50IDY2JSwgcmdiYSgwLCAwLCAwLCAwLjM0KSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItdGh1bWItbWVkaWEubWpyLXdvcmtmbG93LWdyYXBoLW1hcC1wcmV2aWV3LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXRodW1iLW1lZGlhLm1qci13b3JrZmxvdy1ncmFwaC1tYXAtcHJldmlldyB7CiAgICBvYmplY3QtZml0OiBjb3ZlciAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC40NjsKICAgIGZpbHRlcjogc2F0dXJhdGUoMC43NSkgY29udHJhc3QoMC44MikgYnJpZ2h0bmVzcygwLjcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA2KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy1ncmFwaC1tYXAgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoOCwgMTAsIDE0LCAwLjMpLCByZ2JhKDgsIDEwLCAxNCwgMC44MikpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDQyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSwgcmdiYSgwLCAwLCAwLCAwLjY4KSA3MiUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy1ncmFwaC1tYXAgLm1qci13b3JrZmxvdy10aHVtYi10aXRsZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUgewogICAgcGFkZGluZzogMnB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCAucGkgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5waSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5waSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgIGZvbnQtc2l6ZTogMS4xNXJlbTsKICAgIG9wYWNpdHk6IDAuNTU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMC44NHJlbTsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMS4xOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgZmxleC13cmFwOiB3cmFwOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZvbnQtc2l6ZTogMC42OHJlbTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW4sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSBzcGFuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctdGFzaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1zdWJncmFwaHMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1zdWJncmFwaHMgewogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIHBhZGRpbmc6IDJweCA1cHg7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbjpudGgtY2hpbGQobiArIDQpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbjpudGgtY2hpbGQobiArIDQpIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gewogICAgcGFkZGluZzogN3B4IDlweCAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1maWxlbmFtZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgbWFyZ2luLWJvdHRvbTogM3B4ICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDAuNzhyZW0gIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxLjE1ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBmb250LXNpemU6IDAuNzJyZW0gIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNzQgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtbWV0YS1yb3cgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93IC5tanItbWV0YS13b3JrZmxvdy10YXNrIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctbWlzc2luZy1jaGlwLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LW1pc3NpbmctY2hpcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LW1pc3NpbmcsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1taXNzaW5nIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxOTAsIDY2LCAwLjI4KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjM2LCAxODAsIDAuOTgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDIwNiwgMTAxLCAwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvciB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBtYXJnaW46IDAgMCA4cHg7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC40Mik7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTM1ZGVnLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjIyKSwKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4wOCkKICAgICAgICApLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250OiBpbmhlcml0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC42Nik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTM1ZGVnLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjMpLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjEyKQogICAgICAgICksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNTUpOwogICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTAgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogOTUsIDE3OSwgMjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtMSB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiA1NSwgMjExLCAxNTY7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0yIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDI0NiwgMTc3LCA3NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTMgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMjM4LCAxMDQsIDEzNjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTQgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMTU3LCAxMzIsIDIzODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTUgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogNzEsIDE5NywgMjIyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtNiB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAxNDksIDIwNywgODE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC03IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDI0MiwgMTMwLCA3ODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci1jaGV2cm9uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHJnYih2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjE0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci1jaGV2cm9uID4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogODAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBpbnNldDogMDsKICAgIHotaW5kZXg6IDk5OTk5OTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU4KTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWRpYWxvZyB7CiAgICB3aWR0aDogbWluKDkyMHB4LCA5NnZ3KTsKICAgIG1heC1oZWlnaHQ6IG1pbig3NjBweCwgOTJ2aCk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExNDE4KSA5NiUsICMwMDApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwogICAgYm94LXNoYWRvdzogMCAxOHB4IDYwcHggcmdiYSgwLCAwLCAwLCAwLjQ4KTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWRpYWxvZyB7CiAgICB3aWR0aDogbWluKDU2MHB4LCA5NnZ3KTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDE0cHggMThweCA0cHg7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIGxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIGxhYmVsLmlzLXdpZGUgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gc3BhbiB7CiAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjY0KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3NTA7CiAgICBsZXR0ZXItc3BhY2luZzogLjA0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBpbnB1dCwKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gc2VsZWN0LAoubWpyLXdvcmtmbG93LWluZm8tZm9ybSB0ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMjYpOwogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC45Mik7CiAgICBmb250OiBpbmhlcml0OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgcGFkZGluZzogOXB4IDEwcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSB0ZXh0YXJlYSB7CiAgICByZXNpemU6IHZlcnRpY2FsOwogICAgbWluLWhlaWdodDogOTZweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItaGVhZGVyLAoubWpyLXdvcmtmbG93LXBpY2tlci1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxMnB4IDE0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1mb290ZXIgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXItYm90dG9tOiAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDlweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtc2l6ZTogMTVweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWljb24tYnRuLAoubWpyLXdvcmtmbG93LXBpY2tlci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzI1MjgyZCkgODglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjVmNSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWljb24tYnRuIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG4gewogICAgbWluLWhlaWdodDogMzJweDsKICAgIHBhZGRpbmc6IDAgMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJ0bi5pcy1wcmltYXJ5IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NywgMTcxLCAyNDcsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAxNzEsIDI0NywgMC4yMik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJ0bjpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc291cmNlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc291cmNlIHN0cm9uZyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxODBweCwgMWZyKSByZXBlYXQoMywgbWlubWF4KDExMHB4LCAxNTBweCkpOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4IDE0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWRpYWxvZy5pcy1hc3NldC1tb2RlIC5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMTgwcHgsIDFmcik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCwKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciBzZWxlY3QgewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzE3MWExZikgOTIlLCAjMDAwKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc2VhcmNoIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAwIDEwcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCBpbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKICAgIGJvcmRlcjogMDsKICAgIG91dGxpbmU6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBpbmhlcml0Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHNlbGVjdCB7CiAgICBwYWRkaW5nOiAwIDhweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYm9keSB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDI2MHB4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTgwcHgsIDFmcikpOwogICAgYWxpZ24tY29udGVudDogc3RhcnQ7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAwIDE0cHggMTRweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZCB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNjhweCBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDg0cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMxNzFhMWYpIDkyJSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cuaXMtYXNzZXQtbW9kZSAubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNzZweCBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZDpob3ZlciwKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC5pcy1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjcyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjEyKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGh1bWIgewogICAgd2lkdGg6IDY4cHg7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10aHVtYiBpbWcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHN0cm9uZywKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHNwYW4sCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzbWFsbCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc3Ryb25nIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHNwYW4sCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzbWFsbCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCAjYWViM2JkKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZW1wdHkgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIHBhZGRpbmc6IDMycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCAjYWViM2JkKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZW1wdHkuaXMtZXJyb3IgewogICAgY29sb3I6ICNmZmI0YjQ7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkgewogICAgLm1qci13b3JrZmxvdy1waWNrZXItYmFja2Ryb3AgewogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICB9CgogICAgLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgfQoKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCB7CiAgICAgICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIH0KfQoKLyogS2VlcCBnZW5lcmF0aW9uLXRpbWUgYmFkZ2UgcGlubmVkIHRvIHRoZSB0aHVtYm5haWwgY29ybmVyIGFjcm9zcyBncmlkL2ZlZWQgdmFyaWFudHMuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci1nZW50aW1lLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgcmlnaHQ6IDZweCAhaW1wb3J0YW50OwogICAgYm90dG9tOiA2cHggIWltcG9ydGFudDsKICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgIHRvcDogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDJweCA2cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICBsaW5lLWhlaWdodDogMS4xOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgdGV4dC1zaGFkb3c6CiAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC45KSwKICAgICAgICAwIDAgMTBweCBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOwp9CgovKiBLZWVwIHJhdGluZy90YWdzIGJhZGdlcyBhbmNob3JlZC4gRG8gbm90IGZvcmNlIGRpc3BsYXkgaGVyZSBzbyBncmlkIHZpc2liaWxpdHkgdG9nZ2xlcyBzdGlsbCBjb250cm9sIHNob3cvaGlkZS4gKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iID4gLm1qci1yYXRpbmctYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItcmF0aW5nLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgdG9wOiA2cHggIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgIGJvdHRvbTogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBhbmltYXRpb246IG1qci1mYWRlLWluIDAuMnMgZWFzZS1vdXQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItdGFncy1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci10YWdzLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgbGVmdDogNnB4ICFpbXBvcnRhbnQ7CiAgICBib3R0b206IDZweCAhaW1wb3J0YW50OwogICAgcmlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgIHRvcDogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDNweCA2cHg7CiAgICBmb250LXNpemU6IDlweDsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNTZweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjJzIGVhc2Utb3V0Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWItcGxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwbGFjZS1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiAyOHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIHRleHQtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuNyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTsKfQoKLyogLS0tIEhvdmVyIGluZm8gb3ZlcmxheSAocG9zaXRpdmUgcHJvbXB0ICsgZ2VuIHRpbWUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNsaWRlcyB1cCBmcm9tIHRoZSBib3R0b20gb2YgLm1qci10aHVtYiBvbiBjYXJkIGhvdmVyLgogICBwb2ludGVyLWV2ZW50czogbm9uZSAgLT4gbmV2ZXIgYmxvY2tzIHZpZGVvIG1vdXNlZW50ZXIgLyBwbGF5LW9uLWhvdmVyLgogICB6LWluZGV4OiAyICAgICAgICAgICAtPiBzaXRzIGFib3ZlIHRoZSB0aHVtYm5haWwgaW1hZ2UsIGJlbG93IHRoZSBwbGF5IGljb24uCiAgIENvbnRyb2xsZWQgYnkgdGhlIC5tanItc2hvdy1ob3Zlci1pbmZvIGNsYXNzIG9uIHRoZSBncmlkIGNvbnRhaW5lciwgd2hpY2gKICAgaXMgdG9nZ2xlZCB2aWEgdGhlICJTaG93IHByb21wdCBvbiBob3ZlciIgc2V0dGluZy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgcGFkZGluZzogMjJweCA4cHggN3B4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQgMCUsIHJnYmEoMCwgMCwgMCwgMC43OCkgMTAwJSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNXB4KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAxNTBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSAxNTBtcyBlYXNlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDNweDsKICAgIHotaW5kZXg6IDI7Cn0KLyogT25seSByZXZlYWwgb24gaG92ZXIgd2hlbiB0aGUgc2V0dGluZyBpcyBlbmFibGVkIChjbGFzcyBvbiBncmlkIGNvbnRhaW5lcikgKi8KLm1qci1ncmlkLm1qci1zaG93LWhvdmVyLWluZm8gLm1qci1jYXJkOmhvdmVyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyAubWpyLWhvdmVyLXByb21wdCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDI7CiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIG9wYWNpdHk6IDAuOTsKICAgIGZvbnQtc2l6ZTogOS41cHg7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyAubWpyLWhvdmVyLWdlbnRpbWUgewogICAgY29sb3I6IHJnYmEoMjU1LCAyMTAsIDEyMCwgMC45NSk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwp9CkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDBtczsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICB9Cn0KCi8qIC0tLSBDYXJkIGRldGFpbHMgcGFuZWwgc2hvdy9oaWRlIHZpYSBncmlkIGNvbnRhaW5lciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tCiAgIC5tanItc2hvdy1kZXRhaWxzIGlzIHRvZ2dsZWQgYnkgYXBwbHlHcmlkU2V0dGluZ3NDbGFzc2VzKCkgd2hlbiB0aGUKICAgIlNob3cgbWV0YWRhdGEgcGFuZWwiIHNldHRpbmcgY2hhbmdlcy4gIERlZmF1bHQgPSBPRkYg4oaSIHBhbmVsIGhpZGRlbi4KICAgSGlkaW5nIGhlcmUga2VlcHMgYWN0dWFsIHJvdyBoZWlnaHQgPSBlc3RpbWF0ZVJvd0hlaWdodChtZXRhSGVpZ2h0PTApLAogICBwcmV2ZW50aW5nIHRoZSB2aXJ0dWFsaXplciBmcm9tIHJlcG9zaXRpb25pbmcgYWxsIHJvd3Mgb24gbWVhc3VyZQogICAod2hpY2ggd2FzIHRoZSByb290IGNhdXNlIG9mIHRoZSAicmVsb2FkIGltcHJlc3Npb24iIGJsaW5rKS4KICAgTWF0Y2ggdGhlIGJvdHRvbS1mZWVkIHBhdHRlcm4gYXQgLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtaW5mby4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQubWpyLXNob3ctZGV0YWlscyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtbWV0YSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1kZXRhaWxzIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG9wYWNpdHk6IDAuODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBSYXRpbmcgJiBUYWdzIEVkaXRvcnMgKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KLyoqCiAqIEFyY2hpdmVkIENTUyBTdHlsZXMgLSBSYXRpbmcgYW5kIFRhZ3MKICogVGhlc2Ugc3R5bGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZW1lLWNvbWZ5LmNzcwogKi8KCi8qIEFuaW1hdGlvbnMgKi8KQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KCi8qIFBvcG92ZXJzICovCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZTsKfQoKLm1qci1yYXRpbmctcG9wb3ZlciwKLm1qci10YWdzLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHBhZGRpbmc6IDhweDsKfQoKLyogUmF0aW5nIEVkaXRvciAqLwoubWpyLXJhdGluZy1lZGl0b3IgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHg7Cn0KCi5tanItcmF0aW5nLXN0YXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXJhdGluZy1zdGFyOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikgMzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpIDY1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3Rhcjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMikgIWltcG9ydGFudDsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tZm9jdXMtb3V0bGluZS1jb2xvciwgIzRkYWJmNyk7CiAgICBvdXRsaW5lLW9mZnNldDogMnB4OwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3RhcjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSAhaW1wb3J0YW50Owp9CgovKiBUYWdzIEVkaXRvciAqLwoubWpyLXRhZ3MtZWRpdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgbWluLXdpZHRoOiAyNTBweDsKICAgIG1heC13aWR0aDogbWluKDM1MHB4LCBjYWxjKDEwMHZ3IC0gMjBweCkpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KCi5tanItdGFncy1lZGl0b3IuaXMtZGlzYWJsZWQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdGFncy1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDMycHg7Cn0KCi5tanItdGFncy1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLm1qci10YWctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMjQlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLm1qci10YWctY2hpcC1yZW1vdmUgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZy1jaGlwLXJlbW92ZTpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItdGFncy1pbnB1dC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci10YWctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXRhZy1pbnB1dDpmb2N1cyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCkgIWltcG9ydGFudDsKfQoKLm1qci10YWctY2hpcDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMzQlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFncy1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwMCU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHotaW5kZXg6IDEwMDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXRhZy1zdWdnZXN0aW9uIHsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci10YWctc3VnZ2VzdGlvbi5pcy1hY3RpdmUsCi5tanItdGFnLXN1Z2dlc3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cn0KCi8qIEJhZGdlcyBJbnRlcmFjdGl2ZSAqLwoubWpyLXJhdGluZy1iYWRnZSwKLm1qci10YWdzLWJhZGdlIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItcmF0aW5nLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtYmFkZ2UgewogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWJhZGdlOmhvdmVyLAoubWpyLXRhZ3MtYmFkZ2U6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFNjcm9sbGJhciBmb3IgdGFncyBkcm9wZG93biAqLwoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA2cHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA0OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi8qIFNpZGViYXIgKGNhbiBiZSBsZWZ0IG9yIHJpZ2h0KSAqLwoubWpyLXNpZGViYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMzsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXdyYXAgewogICAgbWFyZ2luOiAwIDAgMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kLCA4cHgpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNlYWVhZWEpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtc2Nyb2xsIHsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDRweCA2cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtLCA2cHgpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZSB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NCkpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtdG9nZ2xlW2RhdGEtcC1sZWFmPSJ0cnVlIl0gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtaWNvbiB7CiAgICB3aWR0aDogOHB4OwogICAgZmxleDogMCAwIDhweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzAlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBmb250LXNpemU6IDdweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLWxhYmVsIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1ub2RlLXR5cGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDc1JSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1zaWRlYmFyLmlzLW9wZW4gewogICAgLyogQm9yZGVyIGlzIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiBwb3NpdGlvbiAqLwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Cn0KCi8qIEN1c3RvbSBSb290cyBQb3BvdmVyIFN0eWxpbmcgKi8KLm1qci1jdXN0b20tcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICB3aWR0aDogNjBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItYnRuIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1zZWN0aW9uIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKfQoKLyogSW5saW5lIFNpZGViYXIgKHdpZHRoLWJhc2VkIHRyYW5zaXRpb25zIGxpa2UgYXJjaGl2ZWQgdmVyc2lvbikgKi8KLm1qci1pbmxpbmUtc2lkZWJhciB7CiAgICB3aWR0aDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgd2lkdGggMC4zcyBlYXNlLAogICAgICAgIG1pbi13aWR0aCAwLjNzIGVhc2U7Cn0KCi5tanItaW5saW5lLXNpZGViYXIuaXMtb3BlbiB7CiAgICB3aWR0aDogNDAwcHg7CiAgICBtaW4td2lkdGg6IDI2MHB4Owp9CgovKiBTcGFjZSBiZXR3ZWVuIHNpZGViYXIgYW5kIGdyaWQgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBnYXA6IDA7Cn0KCi8qIEJvcmRlciBiYXNlZCBvbiBwb3NpdGlvbiAqLwoubWpyLWlubGluZS1zaWRlYmFyW2RhdGEtcG9zaXRpb249ImxlZnQiXSB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJyaWdodCJdIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi8qIFNpZGViYXIgcGxhY2Vob2xkZXIgKi8KLm1qci1zaWRlYmFyLXBsYWNlaG9sZGVyIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qID09PT09PT09PT0gVmlld2VyIENvbXBvbmVudCA9PT09PT09PT09ICovCi5tanItdmlld2VyLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjk1KTsKICAgIC8qIFNpdCBhYm92ZSBNRlYgKDEwMDAwKSBzbyB0aGUgZnVsbCB2aWV3ZXIgYWx3YXlzIGNvdmVycyB0aGUgZmxvYXRpbmcgcGFuZWwgKi8KICAgIHotaW5kZXg6IDEwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQovKiBGYWRlLWluOiBhbmltYXRpb24gcmUtdHJpZ2dlcnMgZWFjaCB0aW1lIEpTIHN3aXRjaGVzIGRpc3BsYXkgYmFjayB0byBmbGV4ICovCi5tanItdmlld2VyLW92ZXJsYXlbc3R5bGUqPSJmbGV4Il0gewogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjE4cyBlYXNlLW91dDsKfQoKQGtleWZyYW1lcyBtanItZmFkZS1pbiB7CiAgICBmcm9tIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIH0KfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE3MGRlZywgcmdiYSgyNCwgMjcsIDMzLCAwLjk2KSwgcmdiYSgxNywgMTksIDI1LCAwLjk3KSk7CiAgICBib3JkZXItYm90dG9tOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4xKSwgcmdiYSgyMDYsIDIxMSwgMjE4LCAwLjAzKSk7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4zKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTZzOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4xNCksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNDIpOwp9CgovKiBWaWV3ZXIgY2xvc2UgYnV0dG9uIHBpbm5lZCB0byBvdmVybGF5IGNvcm5lciAqLwoubWpyLXZpZXdlci1jbG9zZSwKLm1qci12aWV3ZXItZnMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjYpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wOCksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMikpLAogICAgICAgIHJnYmEoMjAsIDIzLCAyOSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1jbG9zZSB7CiAgICBjb2xvcjogI2ZmZjRmNCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwNSwgODIsIDgyLCAwLjUpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA1LCA4MiwgODIsIDAuMyksIHJnYmEoMjA1LCA4MiwgODIsIDAuMTIpKSwKICAgICAgICByZ2JhKDU4LCAxOCwgMTgsIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDIxOSwgMjE5LCAwLjE2KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyMDUsIDgyLCA4MiwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMzgpLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMTYpKSwKICAgICAgICByZ2JhKDcwLCAxOCwgMTgsIDAuOTcpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjM1LCAxMzgsIDEzOCwgMC42NCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItZnM6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKSwKICAgICAgICByZ2JhKDIzLCAyNiwgMzIsIDAuOTUpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC4zOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZXdlci1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItc2luZ2xlLAoubWpyLXZpZXdlci1hYiwKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLm1qci12aWV3ZXItc2luZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSBpbWcsCi5tanItdmlld2VyLXNpbmdsZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzOwp9CgoubWpyLXZpZXdlci1hdWRpby1zaGVsbCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxNHB4OwogICAgcGFkZGluZzogMThweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMTglIDIyJSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMiksIHRyYW5zcGFyZW50IDMyJSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4MiUgNzQlLCByZ2JhKDgyLCAyMjAsIDE1NiwgMC4xNSksIHRyYW5zcGFyZW50IDM2JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxMiwgMTgsIDI2LCAwLjk4KSwgcmdiYSg0LCA3LCAxMSwgMC45OSkpOwp9CgoubWpyLXZpZXdlci1hdWRpby1oZWFkZXIgewogICAgd2lkdGg6IG1pbigxMDgwcHgsIDg4JSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMXB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMCA4cHg7Cn0KCi5tanItdmlld2VyLWF1ZGlvLWljb24gewogICAgd2lkdGg6IDM0cHg7CiAgICBoZWlnaHQ6IDM0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMjYpOwp9CgoubWpyLXZpZXdlci1hdWRpby10aXRsZS13cmFwIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7Cn0KCi5tanItdmlld2VyLWF1ZGlvLXRpdGxlIHsKICAgIG1heC13aWR0aDogbWluKDc2MHB4LCA3MnZ3KTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7Cn0KCi5tanItdmlld2VyLWF1ZGlvLW1ldGEgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41OCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KCi5tanItdmlld2VyLWF1ZGlvLXZpeiB7CiAgICB3aWR0aDogbWluKDE5MjBweCwgOTYlKTsKICAgIGFzcGVjdC1yYXRpbzogMTYgLyA5OwogICAgaGVpZ2h0OiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDEwODBweCwgNjh2aCk7CiAgICBtaW4taGVpZ2h0OiAyNjBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDEpKSwKICAgICAgICByZ2JhKDIsIDUsIDksIDAuMjIpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCAxOHB4IDcwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXZpZXdlci1hdWRpby1zcmMgewogICAgd2lkdGg6IG1pbig2ODBweCwgOTAlKTsKfQoKLm1qci12aWV3ZXItYWIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGdhcDogMnB4Owp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlID4gZGl2IHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSBpbWcsCi5tanItdmlld2VyLXNpZGVieXNpZGUgdmlkZW8gewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47Cn0KCi5tanItdmlld2VyLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGdhcDogMjBweDsKfQoKLm1qci12aWV3ZXItZm9vdGVyIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgY29sb3I6IHdoaXRlOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7Cn0KCi5tanItdmlld2VyLWZvb3RlciBidXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLXZpZXdlci1uYXYgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDE0cHg7Cn0KCi5tanItdmlld2VyLW5hdi1idG4gewogICAgd2lkdGg6IDQwcHggIWltcG9ydGFudDsKICAgIGhlaWdodDogNDBweCAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogMTBweCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjQyKSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMTgpLCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMDcpKSwKICAgICAgICByZ2JhKDM0LCAzOCwgNDQsIDAuOTIpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMzQsIDIzNiwgMjQwLCAwLjk2KSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogNzAwICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50OwogICAgdGV4dC1zaGFkb3c6IG5vbmU7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAwLjE0cyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNHMgZWFzZSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjU2KSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNywgMjEyLCAyMTksIDAuMiksIHJnYmEoMjA3LCAyMTIsIDIxOSwgMC4xKSksCiAgICAgICAgcmdiYSgzOSwgNDMsIDQ5LCAwLjk0KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7Cn0KCi5tanItdmlld2VyLW5hdi1idG46YWN0aXZlOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgwLjk4KTsKICAgIGZpbHRlcjogbm9uZTsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjM0ICFpbXBvcnRhbnQ7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjI1KTsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItaW5kZXggewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbWluLXdpZHRoOiA3NHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICBjb2xvcjogcmdiYSgyMjYsIDIyOCwgMjMzLCAwLjk0KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4xNSksIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4wNikpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTcsIDIwMywgMjExLCAwLjM0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgcGFkZGluZzogNXB4IDExcHg7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKfQoKLm1qci12aWV3ZXItcGxheWVyYmFyIHsKICAgIGJvcmRlci1yYWRpdXM6IDE4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMTYpOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IHRvcCBsZWZ0LCByZ2JhKDkwLCAxNTAsIDI1NSwgMC4wOCksIHRyYW5zcGFyZW50IDM2JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE2MGRlZywgcmdiYSgyMCwgMjQsIDMwLCAwLjk0KSwgcmdiYSgxMiwgMTUsIDIxLCAwLjk4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDE2cHggMzZweCByZ2JhKDAsIDAsIDAsIDAuMjIpOwogICAgLyogb3ZlcmZsb3cgbXVzdCBzdGF5IHZpc2libGUgc28gdGhlIHNlZWsgcnVsZXIgdGlja3MvbGFiZWxzICh0b3A6LTE2cHggLyB0b3A6LTM0cHgpCiAgICAgICB0aGF0IGFyZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYWJvdmUgdGhlIHNlZWsgYmFyIGFyZSBub3QgY2xpcHBlZC4gKi8KICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoubWpyLXZpZXdlci10b29scyB7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICBnYXA6IDhweDsKfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci12aWV3ZXItaGVhZGVyOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDE4cHg7CiAgICByaWdodDogMThweDsKICAgIHRvcDogNDRweDsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwgdHJhbnNwYXJlbnQpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhIHsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1yaWdodDogODRweDsKICAgIHBhZGRpbmctbGVmdDogMTJweDsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWxlZnQgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxIDEgYXV0bzsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBmbGV4OiAxIDEgMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLXRpdGxlLXdyYXAgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IG1pbigxMDAlLCBjYWxjKDEwMHZ3IC0gMjIwcHgpKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItdmlld2VyLXRpdGxlLWxpbmUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci1maWxlbmFtZSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luOiAwIGF1dG87CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLWJhZGdlcyB7CiAgICBnYXA6IDRweDsKfQoKLm1qci12aWV3ZXItdGl0bGUtbGluZSAubWpyLXZpZXdlci1iYWRnZXMgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLWxlZnQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgd2lkdGg6IGZpdC1jb250ZW50OwogICAgbWF4LXdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdDplbXB0eSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAganVzdGlmeS1zZWxmOiBlbmQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlld2VyLW1vZGUtYnV0dG9ucyB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBhZGRpbmc6IDNweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICByZ2JhKDEwLCAxMiwgMTYsIDAuMjQpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCA2cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgcGFkZGluZzogNXB4IDZweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDAgMCBhdXRvIDA7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNiksIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1oZWFkIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWhlYWRpbmcgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDFweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtZXllYnJvdyB7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4xNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDYpOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGNvbG9yOiByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTYpOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iZ3JhZGUiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Im92ZXJsYXkiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Imluc3BlY3QiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5LAoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJhY3Rpb25zIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSwKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iaW5mbyJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzUpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICByZ2JhKDEwLCAxMiwgMTYsIDAuMTgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwogICAgbWluLXdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7CiAgICBsZXR0ZXItc3BhY2luZzogMC4xNXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtzdHlsZSo9Ii0tbWpyLWdyb3VwLWFjY2VudCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjkpOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtzdHlsZSo9Ii0tbWpyLWdyb3VwLWFjY2VudCJdIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4zNSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNoYW5uZWwiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgbWluLXdpZHRoOiA0MnB4Owp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJvdmVybGF5Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gewogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY2hhbm5lbCJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJleHBvc3VyZSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJnYW1tYSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImF1ZGlvLXZpeiJdIHsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucywKLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbi0tcHJpbWFyeSB7CiAgICBtYXJnaW4tbGVmdDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uICsgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uIHsKICAgIG1hcmdpbi1sZWZ0OiA0cHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBtaW4taGVpZ2h0OiAyNHB4Owp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZS1pbnB1dCB7CiAgICB3aWR0aDogOTJweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZSBzcGFuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDE0ODBweCkgewogICAgLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMjIwcHgpIHsKICAgIC5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4NHB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMDsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyLAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktc2VsZjogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBvdmVyZmxvdy14OiB2aXNpYmxlOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLAogICAgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucywKICAgIC5tanItdmlld2VyLXRvb2xzLW1ldGEsCiAgICAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl1bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjEpOwogICAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuNik7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4yMik7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXVtkYXRhLWFjdGl2ZT0iMSJdIC5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuNik7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4xOCk7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjIyKTsKfQoKLyogTmF0aXZlIGRyb3Bkb3duczogaGludCBkYXJrIFVJIGFuZCBzdHlsZSBvcHRpb25zIHdoZW4gdGhlIGJyb3dzZXIgYWxsb3dzIGl0LiAqLwoubWpyLXZpZXdlci1oZWFkZXIgewogICAgY29sb3Itc2NoZW1lOiBkYXJrOwp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3QgewogICAgbWluLWhlaWdodDogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40NikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3Qgb3B0aW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcmFuZ2UtaW5wdXQ6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbC1idG4tLXJlc2V0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0biB7CiAgICBtaW4taGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsKICAgIGJvcmRlci13aWR0aDogMXB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNzUpLAogICAgICAgIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMjUpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xNikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgIGZvbnQtc2l6ZTogMTFweCAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMCA4cHggIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMjQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4xKSwKICAgICAgICByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMDM1KQogICAgKSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDI1NSwgMTY2LCA5MiwgMC4yMiksCiAgICAgICAgcmdiYSgyNTUsIDExNiwgNjQsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxNjAsIDkyLCAwLjM0KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyMzYsIDIyNCwgMC45NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyNTUsIDE4MCwgMTA4LCAwLjI4KSwKICAgICAgICByZ2JhKDI1NSwgMTI4LCA3MiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE4NCwgMTE2LCAwLjQ2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDkyLCAyMTksIDE4NiwgMC4yMiksCiAgICAgICAgcmdiYSg0NCwgMTcwLCAxNDQsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTIsIDIxOSwgMTg2LCAwLjM0KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjI0LCAyNTUsIDI0OCwgMC45NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMDIsIDIzMCwgMTk2LCAwLjI4KSwKICAgICAgICByZ2JhKDUyLCAxODIsIDE1NiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMTAsIDIzNiwgMjAyLCAwLjQ2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMjQsIDE2NiwgMjU1LCAwLjIyKSwKICAgICAgICByZ2JhKDEwOSwgODgsIDIyMiwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMzIsIDE3MCwgMjU1LCAwLjM2KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjM2LCAyNDIsIDI1NSwgMC45NykgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMTM4LCAxODAsIDI1NSwgMC4zKSwKICAgICAgICByZ2JhKDEyNCwgMTAwLCAyMzIsIDAuMTQpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTQ4LCAxODgsIDI1NSwgMC40OCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBmaWx0ZXI6IHNhdHVyYXRlKDEuMTIpIGJyaWdodG5lc3MoMS4wNCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1oZWxwIHsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTMsIDE3LCAyMiwgMC45NiksIHJnYmEoOCwgMTEsIDE2LCAwLjk4KSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgMThweCAzNHB4IHJnYmEoMCwgMCwgMCwgMC4zNCkgIWltcG9ydGFudDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEyMjBweCkgewogICAgLm1qci12aWV3ZXItdG9vbHMgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWxlZnQsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyLAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdCwKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtYm9keSB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7CiAgICB9Cn0KCi8qID09PT09PT09PT0gQ3VzdG9tIFZpZGVvIENvbnRyb2xzIChubyBuYXRpdmUgYmFyKSA9PT09PT09PT09ICovCi5tanItdmlkZW8taG9zdCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTJweDsKICAgIHJpZ2h0OiAxMnB4OwogICAgYm90dG9tOiAxMnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICBvcGFjaXR5OiAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICB6LWluZGV4OiA1Owp9CgoubWpyLXZpZGVvLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBnYXA6IDEycHg7CiAgICBkaXNwbGF5OiBncmlkOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXByZXZpZXcgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWdyb3VwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1udW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItdmlkZW8tbnVtOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM4KTsKfQoKLm1qci12aWRlby1udW0tLWZwcy5pcy1vdmVycmlkZGVuIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNDUsIDE1OCwgMTEsIDAuODIpOwogICAgY29sb3I6ICNmYmJmMjQ7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4xNCk7Cn0KCi5tanItdmlkZW8tbnVtLS1mcHMuaXMtb3ZlcnJpZGRlbjpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjUxLCAxOTEsIDM2LCAwLjk2KTsKfQoKLm1qci12aWRlby1udW0tLXNwZWVkIHsKICAgIGNvbG9yLXNjaGVtZTogZGFyazsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci12aWRlby1udW0tLXNwZWVkIG9wdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKfQoKLm1qci12aWRlby1mcmFtZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgbWluLXdpZHRoOiA1MnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1mcmFtZS5pcy1zdGVwIHsKICAgIGNvbG9yOiAjZmZkMjRkOwp9CgoubWpyLXZpZGVvLWJvdHRvbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMTsKfQoKLm1qci12aWRlby1ib3R0b20tLWxlZnQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0Owp9CgoubWpyLXZpZGVvLWJvdHRvbS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci12aWRlby10cmFuc3BvcnQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgovKiBTaG93IGNvbnRyb2xzIG9uIGhvdmVyL2ZvY3VzICh2aWV3ZXIpLiAqLwoubWpyLXZpZGVvLWhvc3Q6aG92ZXIgLm1qci12aWRlby1jb250cm9scywKLm1qci12aWRlby1jb250cm9sczpmb2N1cy13aXRoaW4gewogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgovKiBQcmV2aWV3OiBrZWVwIGNvbnRyb2xzIHZpc2libGUgYmVjYXVzZSB0aGUgYXJlYSBpcyBzbWFsbC4gKi8KLm1qci12aWRlby1jb250cm9scy0tcHJldmlldyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IGF1dG87CiAgICBib3R0b206IDEwcHg7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiBhdXRvOwogICAgYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IG5vbmU7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG4gewogICAgd2lkdGg6IDM4cHg7CiAgICBoZWlnaHQ6IDM4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNDIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWJ0biB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoKLm1qci12aWRlby1idG4uaXMtb24gewogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTYwLCAyNTUsIDAuMjUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDY0LCAxNjAsIDI1NSwgMC41NSk7Cn0KCi5tanItdmlkZW8tYnRuLS1pbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjEyKTsKfQoKLm1qci12aWRlby1idG4tLWluOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjE4KTsKfQoKLm1qci12aWRlby1idG4tLW91dCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCA3MCwgNzAsIDAuNTUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xKTsKfQoKLm1qci12aWRlby1idG4tLW91dDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KTsKfQoKLm1qci12aWRlby10aW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBtaW4td2lkdGg6IDkycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby10aW1lZ3JvdXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogMTBweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWRlby1yYW5nZS1jb3VudCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSg2NCwgMTkwLCAyNTUsIDAuOTIpOwogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTkwLCAyNTUsIDAuMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDY0LCAxOTAsIDI1NSwgMC4yNSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHBhZGRpbmc6IDFweCA4cHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZSB7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2VlayB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA4MHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMTsKICAgIC8qIFdlIGRyYXcgb3VyIG93biBwbGF5aGVhZC9tYXJrZXJzOyBoaWRlIHRoZSBuYXRpdmUgdGh1bWIgImRvdCIuICovCiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWs6Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1pbi13aWR0aDogODBweDsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci12aWRlby1zZWVrLXpvbmVzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogNTAlOwogICAgaGVpZ2h0OiAxMHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7Cn0KCi8qIDAuLkluOiB0cmltbWVkLW91dCByYW5nZS4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLWxlZnRUcmltIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMTgpOwp9CgovKiBJbi4uT3V0OiBzZWxlY3RlZCBwbGF5YmFjayByYW5nZSBoaWdobGlnaHQuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC41NSk7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lcy5pcy1mdWxscmFuZ2UgLm1qci12aWRlby1zZWVrLXpvbmUtLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7Cn0KCi8qIE91dC4uRW5kOiBzaG93IG91dC1vZi1yYW5nZSBmcmFtZXMgYXMgYSBkaWZmZXJlbnQgY29sb3IuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1yaWdodFRyaW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4yKTsKfQoKLm1qci12aWRlby1zZWVrLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDM7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMzJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgei1pbmRleDogNDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm94LXNoYWRvdzogMCA0cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmFmdGVyLAoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMnB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmFmdGVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmJlZm9yZSwKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmJlZm9yZSB7CiAgICB0b3A6IDRweDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YmVmb3JlIHsKICAgIGJvdHRvbTogNHB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstdGlja3MgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAtMTZweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItdmlkZW8tc2Vlay1sYWJlbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAtMzRweDsKICAgIGhlaWdodDogMTRweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuNTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWRlby1zZWVrLXBsYXloZWFkLWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmsgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMTBweDsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgei1pbmRleDogNDsKICAgIC0tbWpyLW1hcmstY29sb3I6IHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0taW4gewogICAgLS1tanItbWFyay1jb2xvcjogcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyazo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1tYXJrLWNvbG9yKTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyazo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCB2YXIoLS1tanItbWFyay1jb2xvcik7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1pbjo6YWZ0ZXIgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tbWpyLW1hcmstY29sb3IpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0tb3V0OjphZnRlciB7CiAgICB0b3A6IGF1dG87CiAgICBib3R0b206IC01cHg7CiAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHZhcigtLW1qci1tYXJrLWNvbG9yKTsKfQoKLm1qci12aWRlby1zZWVrLXBsYXloZWFkIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTEycHg7CiAgICB3aWR0aDogMnB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDIwMCwgNzAsIDAuOTUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTFweCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciB7CiAgICBwb3NpdGlvbjogc3RhdGljOwogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiBhdXRvOwogICAgYm90dG9tOiBhdXRvOwogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAxNHB4OwogICAgYm9yZGVyLXJhZGl1czogMThweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wIGxlZnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHRyYW5zcGFyZW50IDM0JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTgsIDIwMywgMjEwLCAwLjAyNSksIHJnYmEoMTk4LCAyMDMsIDIxMCwgMC4wMDgpKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTY1ZGVnLCByZ2JhKDE4LCAyMiwgMjgsIDAuODIpLCByZ2JhKDEyLCAxNSwgMjEsIDAuOSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAxMHB4IDMwcHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogbm9uZTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4gewogICAgbWluLWhlaWdodDogMzhweDsKICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNyksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NCwgMjAxLCAyMDgsIDAuMTgpOwogICAgYm9yZGVyLXdpZHRoOiAxcHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAwLjEycyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xMnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTJzIGVhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0bjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4yNik7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0bi5pcy1vbiB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDEwMCwgMTcwLCAyNTUsIDAuMiksIHJnYmEoMTAwLCAxNzAsIDI1NSwgMC4wOCkpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEyMCwgMTg2LCAyNTUsIDAuNDIpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMTIwLCAxODYsIDI1NSwgMC4xMikgaW5zZXQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1oZWFkLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBhdXRvIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiAxMnB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXN0YXR1cywKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1jZW50ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIG1pbm1heCgwLCAxZnIpIGF1dG87CiAgICBnYXA6IDEycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyLm1qci12aWRlby1jb250cm9scy0tYXVkaW8gLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIGdyaWQtcm93OiAxOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhci5tanItdmlkZW8tY29udHJvbHMtLWF1ZGlvIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWdyb3VwLS1vdXQgewogICAgZ3JpZC1yb3c6IDI7CiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLW1lZGlhLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSg3OCwgMjI0LCAxOTYsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OCwgMjI0LCAxOTYsIDAuMjIpOwogICAgY29sb3I6IHJnYmEoMjIwLCAyNDcsIDI0MSwgMC45Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWUsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBjb2xvcjogcmdiYSgyMjgsIDIzMCwgMjM0LCAwLjkyKTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IDk0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgY29sb3I6IHJnYmEoMjIyLCAyMjUsIDIzMCwgMC45NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4yNik7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxOTQsIDIwMSwgMjA5LCAwLjA4KTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cCB7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtbGVmdCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLWFkanVzdC1yaWdodCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLXNwZWVkIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1udW0gewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDksIDEyLCAxNiwgMC41NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4tLXBsYXkgewogICAgbWluLXdpZHRoOiA4OHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi1oZWlnaHQ6IDQ0cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdm9sdW1lLXdyYXAgewogICAgcGFkZGluZzogMCA0cHg7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXZvbHVtZSB7CiAgICB3aWR0aDogOTBweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDk4MHB4KSB7CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGdhcDogMTBweDsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgfQp9CgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwIHsKICAgIGNvbG9yOiAjZjVjNTQyOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lIHsKICAgIGNvbG9yOiAjNWRhOWZmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlIHsKICAgIGNvbG9yOiAjZmY1ZjVmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyIHsKICAgIGNvbG9yOiAjNWZkMzhkOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE5NywgNjYsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSg5MywgMTY5LCAyNTUsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDk1LCA5NSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAyMTEsIDE0MSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQgewogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWNvbnRleHQtbWVudS1zZXBhcmF0b3IgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXItY29sb3IpOwogICAgbWFyZ2luOiA0cHggMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0LAoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0IHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWFyZ2luLWxlZnQ6IDE2cHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMC44MjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaGludCB7CiAgICBvcGFjaXR5OiAwLjU4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc3VibWVudS1hcnJvdyB7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYWRkLXRvLWNvbGxlY3Rpb24tbWVudSB7CiAgICBtaW4td2lkdGg6IDI2MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7Cn0KCi5tanItY29udGV4dC1tZW51LXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxNHB4IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItY29udGV4dC1tZW51LW5vdGUgewogICAgcGFkZGluZzogMTBweCAxNHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA3MiUsIHZhcigtLW1qci1tdXRlZCkpOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7Cn0KCi5tanItZ3JpZC1wb3BvdmVyLAoubWpyLXZpZXdlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMjUwcHg7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDE2cHgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci12aWV3ZXItb3ZlcmxheSAqLAogICAgLm1qci12aWRlby1jb250cm9scywKICAgIC5tanItY29udGV4dC1tZW51IHsKICAgICAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB9Cn0KCi8qIEhpZGUgaGVhZGVyICh0b29sYmFyKSB3aGVuIHZpZXdlciBvdmVybGF5IGlzIGluIGZ1bGxzY3JlZW4gKi8KLm1qci12aWV3ZXItb3ZlcmxheTpmdWxsc2NyZWVuIC5tanItdmlld2VyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBNYWpvb3IgRmxvYXRpbmcgVmlld2VyIChNRlYpIC0gcG9ydGFsZWQgdG8gZG9jdW1lbnQuYm9keQogICBSZWRlY2xhcmVzIENTUyB2YXJpYWJsZXMgc28gdGhlIHBhbmVsIHdvcmtzIG91dHNpZGUgLm1qci1hc3NldHMtbWFuYWdlcgogICAoc2FtZSBwYXR0ZXJuIGFzIC5tanItcG9wb3ZlcikKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItbWZ2IHsKICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0tY29udGVudC1iZywgIzFlMWUxZSk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1jb21meS1tZW51LXNlY29uZGFyeS1iZywgIzMzMyk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKTsKICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1jb21meS1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCk7CgogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICBzeXN0ZW0tdWksCiAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgIFJvYm90bywKICAgICAgICBBcmlhbCwKICAgICAgICBzYW5zLXNlcmlmCiAgICApOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAvKiBWaXN1YWwgY2hyb21lICovCiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDhweCAzMnB4IHJnYmEoMCwgMCwgMCwgMC41NSksCiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci1tZnYgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpodG1sLm1qci1tZnYtcG9wb3V0LWRvY3VtZW50IHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KAogICAgICAgICAgICAxMjAwcHggNDIwcHggYXQgNTAlIDAlLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxMCUsCiAgICAgICAgICAgICAgICB0cmFuc3BhcmVudAogICAgICAgICAgICApLAogICAgICAgICAgICB0cmFuc3BhcmVudCA2MiUKICAgICAgICApLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTgwZGVnLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxNjE5MWYpKSA4MiUsCiAgICAgICAgICAgICAgICAjMDAwIDE4JQogICAgICAgICAgICApLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzFmMjIyNykpIDg0JSwKICAgICAgICAgICAgICAgICMwMDAgMTYlCiAgICAgICAgICAgICkKICAgICAgICApOwp9Cgpib2R5Lm1qci1tZnYtcG9wb3V0LWJvZHkgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCiNtanItbWZ2LXBvcG91dC1yb290LAoubWpyLW1mdi1wb3BvdXQtcm9vdCB7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi8qIC0tIEhlYWRlciAoZHJhZyBoYW5kbGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjdXJzb3I6IG1vdmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9CgoubWpyLW1mdi1oZWFkZXItdGl0bGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG9wYWNpdHk6IDAuNzg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBmbGV4OiAxOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMjhweDsKfQoKLyogLS0gVG9vbGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzZweDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKfQoubWpyLW1mdi10b29sYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW46IDAgM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBoZWlnaHQ6IDIycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjAzKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB3aWR0aDogMCU7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCA3MG1zIGVhc2UtaW4tb3V0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzIHsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjglLCAjMGIzNTEzIDMyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NCUsICMwYjIzNDAgMzYlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcywKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2Q5NTM0ZiA3OCUsICM0YTE0MTQgMjIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3Mtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC4xOCkpOwogICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtc2hhZG93OiAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0MiUsIHZhcigtLW1qci1hY2NlbnQpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIC0tIFBpbiBncm91cDogbm93IGEgZHJvcGRvd24gbWVudSAoZGlzcGxheTpub25lIGJ5IGRlZmF1bHQsIGZsZXggd2hlbiAuaXMtb3BlbikgLS0gKi8KLm1qci1tZnYtcGluLWdyb3VwIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IGNhbGMoMTAwJSArIDRweCk7CiAgICBsZWZ0OiAwOwogICAgei1pbmRleDogMTAwMTA7CiAgICBtaW4td2lkdGg6IDcwcHg7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwp9Ci5tanItbWZ2LXBpbi1ncm91cC5pcy1vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzNSUsIHRyYW5zcGFyZW50KTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA0MiUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKfQoKLyogLS0gSWNvbiBEcm9wZG93biBjb21wb25lbnQgKC5tanItbWZ2LWlkcm9wKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtaWRyb3AgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LWlkcm9wLW1lbnUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItbWZ2LWlkcm9wLW1lbnUuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLW1mdi1pZHJvcC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbS5pcy1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1pZHJvcC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogQ2hhbm5lbCB0cmlnZ2VyOiBzbGlnaHRseSB3aWRlciB0byBmaXQgIlJHQiIgKi8KLm1qci1tZnYtY2gtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBUb29sYmFyIGljb24tYnV0dG9uIHBvcG92ZXJzIChjaGFubmVsLCBndWlkZXMsIHBpbiwgZm9ybWF0IC0gc29ydC1zdHlsZSBjb250ZXh0IG1lbnVzKSAqLwoubWpyLW1mdi1jaC1wb3BvdmVyLAoubWpyLW1mdi1ndWlkZXMtcG9wb3ZlciwKLm1qci1tZnYtcGluLXBvcG92ZXIsCi5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLW1mdi1jaC1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LXBpbi1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LWZvcm1hdC1wb3BvdmVyLmlzLW9wZW4gewogICAgZGlzcGxheTogYmxvY2s7Cn0KLyogVG9vbGJhciBpY29uIGltYWdlcyAtIGNoIGljb24gaXMgYmxhY2sgKGludmVydGVkKSwgZ3VpZGVzIGljb24gaXMgbmF0aXZlIHdoaXRlICovCi5tanItbWZ2LWNoLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBmaWx0ZXI6IGludmVydCgxKTsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLW1mdi1ndWlkZXMtaWNvbiB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLW1mdi1jaC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtZ3VpZGVzLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1waW4tdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWZvcm1hdC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogUGluIHNsb3QgYWN0aXZlIHN0YXRlICovCi5tanItbWZ2LXBpbi1wb3BvdmVyIC5tanItbWVudS1pdGVtLmlzLXBpbm5lZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgb3BhY2l0eTogMSAhaW1wb3J0YW50Owp9Ci8qIEZvcm1hdCBwb3BvdmVyOiBzZXBhcmF0b3IgKyBvcGFjaXR5IHNsaWRlciByb3cgKi8KLm1qci1tZnYtZm9ybWF0LXNlcCB7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7CiAgICBtYXJnaW46IDRweCAycHg7Cn0KLm1qci1tZnYtZm9ybWF0LXNsaWRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDRweCA4cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItbGFiZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgb3BhY2l0eTogMC42NTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmbGV4LXNocmluazogMDsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDcwcHg7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9Ci5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIC5tanItbWZ2LXRvb2xiYXItcmFuZ2Utb3V0IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG46Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLyogVW5pdmVyc2FsIGFjdGl2ZSBoaWdobGlnaHQgLSBhbnkgYXJpYS1wcmVzc2VkPSJ0cnVlIiBidXR0b24gZ2V0cyBhY2NlbnQgZ2xvdy4KICAgUGxhY2VkIGJlZm9yZSB0aGUgY29sb3JlZCBhY3RpdmUgY2xhc3NlcyBzbyB0aGV5IGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBjb2xvci4gKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAxMiUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiBQb3AtaW4gbW9kZSAodmlld2VyIHBvcHBlZCBvdXQpOiByYWlzZSBidXR0b24gY29udHJhc3QvYnJpZ2h0bmVzcyAqLwoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDI0cHggNTZweCByZ2JhKDAsIDAsIDAsIDAuNDIpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBvcGFjaXR5OiAwLjk4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzBhMTExOCAxOCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsICMwMDAgOCUpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIGNpcmNsZSBhdCB0b3AsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNDIlCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMDAwIDE4JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB2YXIoLS1tanItYWNjZW50KSA0MiUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2MiUsIHZhcigtLW1qci1hY2NlbnQpIDM4JSkKICAgICk7CiAgICBjb2xvcjogI2Y0ZjhmZiAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biAucGkgewogICAgb3BhY2l0eTogMTsKICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgI2ZmZmZmZiA0MCUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg3NiwgMTc1LCA4MCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDI1NSwgMTUyLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTYlLCB2YXIoLS1tanItYWNjZW50KSA0NCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUsIHZhcigtLW1qci1hY2NlbnQpIDM2JSkKICAgICk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDk0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDk0JSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA4MiUsIHZhcigtLW1qci1tdXRlZCkgMTglKTsKICAgIG9wYWNpdHk6IDAuODg7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4NiUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSksCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4NiUsIHJnYmEoMCwgMCwgMCwgMC4xNCkpCiAgICAgICAgKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXdpZGdldC1sYWJlbCwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1lbXB0eSwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODQlLCAjZmZmZmZmIDE2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3NCUsICMwNTA3MGEgMjYlKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMCUpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcG9waW4tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQ1JSwgdmFyKC0tbWpyLWFjY2VudCkgNTUlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiAtLSBDb250ZW50IHdyYXBwZXIgKGhvcml6b250YWwgZmxleDogY29udGVudCArIHNpZGViYXIpIC0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwp9CgovKiAtLSBTaWRlYmFyIHBvc2l0aW9uIHZhcmlhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93Owp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBoZWlnaHQgMC4ycyBlYXNlLAogICAgICAgIHdpZHRoIDBzOwp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMjIwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgbWluLWhlaWdodDogMTIwcHg7CiAgICBtYXgtaGVpZ2h0OiA2NSU7Cn0KCi8qIC0tIENvbnRlbnQgYXJlYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMCAwIDMyMHB4OwogICAgd2lkdGg6IDMyMHB4OwogICAgbWluLXdpZHRoOiAyMTBweDsKICAgIG1heC13aWR0aDogbWluKDQyJSwgNDIwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMTgsIDIwLCAwLjk2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBmbGV4OiAwIDAgY2xhbXAoMTkwcHgsIDMyJSwgMjgwcHgpOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtaGVpZ2h0OiA0NiU7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItdGl0bGUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb24gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgcGFkZGluZy10b3A6IDA7CiAgICBib3JkZXItdG9wOiBub25lOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1oZWFkaW5nIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLm9wZW4gewogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb24gewogICAgZmxleDogMCAwIGF1dG87CiAgICBtaW4taGVpZ2h0OiBhdXRvOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBjb2x1bW5zOiAzIDE3MHB4OwogICAgY29sdW1uLWdhcDogMTBweDsKICAgIGNvbHVtbi1maWxsOiBiYWxhbmNlOwogICAgbWluLWhlaWdodDogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gKiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYnJlYWstaW5zaWRlOiBhdm9pZDsKICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBtYXJnaW4tYmxvY2s6IDAgMTBweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2UgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjI0LCAyNTUsIDEyMiwgMC40Mik7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjI0LCAyNTUsIDEyMiwgMC4xNiksIHJnYmEoNzYsIDE3NSwgODAsIDAuMSkpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjI0LCAyNTUsIDEyMiwgMC4xMikgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBib3JkZXItcmFkaXVzOiA2cHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLXZhbHVlIHsKICAgIGNvbG9yOiAjZTBmZjdhOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgTW9uYWNvLCBtb25vc3BhY2U7Cn0KCi5tanItbWZ2LWdlbi1jYXJkIHsKICAgIC0tbWpyLW1mdi1nZW4tYWNjZW50OiAjMjE5NmYzOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA0NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMzVkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTYlLCB0cmFuc3BhcmVudCkgMCUsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KSAxMDAlCiAgICApOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpIGluc2V0OwogICAgY3Vyc29yOiBjb3B5OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTZzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTZzIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAwLjE2cyBlYXNlOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQgewogICAgbWluLWhlaWdodDogMDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tcG9zaXRpdmUtcHJvbXB0LAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLW5lZ2F0aXZlLXByb21wdCwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1wcm9tcHQgewogICAgbWluLWhlaWdodDogMTEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0td29ya2Zsb3cgewogICAgbWluLWhlaWdodDogNThweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1tb2RlbC1hbmQtbG9yYSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1tb2RlbHMsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tc2FtcGxpbmcsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tZ2VuZXJhdGlvbi1waXBlbGluZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS10ZXh0LXRvLWltYWdlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWltYWdlLXRvLWltYWdlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWlucGFpbnQsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tdXBzY2FsZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1yZWZpbmUgewogICAgbWluLWhlaWdodDogODZweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLXNlZWQgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBib3JkZXItd2lkdGg6IDJweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCB7CiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IC5tanItbWZ2LWdlbi1jYXJkLXRpdGxlLAoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZDpob3ZlciwKLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2U6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50LCAjZTBmZjdhKSA3MCUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50LCAjZTBmZjdhKSAyNCUsIHRyYW5zcGFyZW50KQogICAgICAgIGluc2V0Owp9CgoubWpyLW1mdi1nZW4tY29weS1mbGFzaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc2LCAxNzUsIDgwLCAwLjI4KSAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi1nZW4tY2FyZC10aXRsZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45MikpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogNTsKICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtY29tcGFjdCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1tdWx0aWxpbmUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA3cHg7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IHVuc2V0Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1icmFuY2gtZ3JvdXBzIHsKICAgIGdhcDogMTBweDsKfQoKLm1qci1tZnYtZ2VuLWJyYW5jaC1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogN3B4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7Cn0KCi5tanItbWZ2LWdlbi1icmFuY2gtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg3OHB4LCBhdXRvKSAxZnI7CiAgICBnYXA6IDEwcHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tZmllbGQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNTRweCwgYXV0bykgbWlubWF4KDAsIDFmcik7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tZmllbGQtdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMTgwLCAxODAsIDE4MCwgMC43MikpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSk7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSA+IGRpdiwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiBzZWN0aW9uIHsKICAgIG1hcmdpbi1ibG9jazogMCAxMHB4Owp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogNzYwcHgpIHsKICAgIC5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgICAgICBjb2x1bW5zOiBhdXRvOwogICAgICAgIGNvbHVtbi1jb3VudDogMTsKICAgICAgICBjb2x1bW4td2lkdGg6IGF1dG87CiAgICB9CgogICAgLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiAqIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKLm1qci1tZnYtb3ZlcmxheS1jYW52YXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTI7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VsZWN0IHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICB3aWR0aDogNzJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgovKiBFViBzbGlkZXIgYWN0aXZlIHN0YXRlICh2YWx1ZSAhPSAwKSAqLwoubWpyLW1mdi10b29sYmFyLXJhbmdlLmlzLWFjdGl2ZSBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIGFjY2VudC1jb2xvcjogI2Y1Yzg0MjsKfQoubWpyLW1mdi10b29sYmFyLXJhbmdlLmlzLWFjdGl2ZSAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBjb2xvcjogI2Y1Yzg0MjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTBweDsKICAgIGxlZnQ6IDEwcHg7CiAgICB6LWluZGV4OiA2OwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgIHBhZGRpbmc6IDVweCA5cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCByZ2JhKDUsIDgsIDE0LCAwLjg2KSA4NiUsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxMTEpIDE0JSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjdmYSk7CiAgICBib3gtc2hhZG93OiAwIDJweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xNnMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy5pcy1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yLCAjZmY1YzdhKSA3MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCByZ2JhKDYwLCAxMCwgMTgsIDAuOSkgODIlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxOCUpOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy10ZXh0IHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgovKiAtLSBXb3JrZmxvdyBTaWRlYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtc2lkZWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMgZWFzZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMjYwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWluLXdpZHRoOiAxODBweDsKICAgIG1heC13aWR0aDogNjUlOwogICAgdHJhbnNpdGlvbjogbm9uZTsKfQoKLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9Ci5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KLm1qci13cy1zaWRlYmFyLWJvZHkgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMDsKfQoubWpyLXdzLXNpZGViYXItZW1wdHkgewogICAgcGFkZGluZzogMjRweCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgovKiAtLSBUYWIgYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLXRhYi1iYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13cy10YWIgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICBjb2xvciAwLjE1czsKfQoKLm1qci13cy10YWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA3KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwp9CgoubWpyLXdzLXRhYi5pcy1hY3RpdmUgewogICAgYmFja2dyb3VuZDogcmdiYSg5OSwgMTU1LCAyNTUsIDAuMTUpOwogICAgY29sb3I6ICM2MzliZmY7Cn0KCi8qIC0tIE5vZGVzIHRhYiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtbm9kZXMtdGFiIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBHcmFwaCBNYXAgdGFiICovCi5tanItd2dtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMTAwJTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwp9CgoubWpyLXdnbS1tYXAtd3JhcCB7CiAgICBoZWlnaHQ6IDE5MHB4OwogICAgbWluLWhlaWdodDogMTUwcHg7CiAgICBtYXJnaW46IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIyKTsKfQoKLm1qci13Z20tcHJldmlldyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpOwp9CgoubWpyLXdnbS1wcmV2aWV3IC5tanItbWZ2LW1lZGlhLAoubWpyLXdnbS1wcmV2aWV3IC5tanItbWZ2LXBsYXllci1ob3N0LAoubWpyLXdnbS1wcmV2aWV3IC5tanItbW9kZWwzZC1ob3N0LAoubWpyLXdnbS1wcmV2aWV3LW1lZGlhIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47Cn0KCi5tanItd2dtLXByZXZpZXctZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLWNhbnZhcyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgY3Vyc29yOiBncmFiOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwp9CgoubWpyLXdnbS1jYW52YXM6YWN0aXZlIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7Cn0KCi5tanItd2dtLS1sYXJnZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tbWFwLXdyYXAgewogICAgZmxleDogMTsKICAgIGhlaWdodDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBtYXJnaW46IDA7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiAwOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tc3RhdHVzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDEwcHg7CiAgICB6LWluZGV4OiAyOwogICAgbWF4LXdpZHRoOiBtaW4oNDIwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KCi5tanItd2dtLXRvb2xiYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTBweDsKICAgIHRvcDogNDZweDsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogNnB4OwogICAgbWF4LXdpZHRoOiBtaW4oNDIwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKfQoKLm1qci13Z20tbW9kZSB7CiAgICBtaW4taGVpZ2h0OiAyNnB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1tb2RlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNDksIDE4MywgMjU1LCAwLjQ1KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW1vZGUuaXMtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMjQsIDE4NiwgMjU1LCAwLjYyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDEyMywgMjE0LCAwLjI2KTsKICAgIGNvbG9yOiByZ2JhKDIzNSwgMjQ1LCAyNTUsIDAuOTYpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tZGV0YWlscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTBweDsKICAgIHRvcDogMTBweDsKICAgIGJvdHRvbTogMTBweDsKICAgIHotaW5kZXg6IDI7CiAgICB3aWR0aDogbWluKDMyMHB4LCAzOCUpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjAsIDI2LCAwLjg0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWFjdGlvbiB7CiAgICBtaW4taGVpZ2h0OiAzMHB4Owp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tcGFyYW0gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1zdGF0dXMgewogICAgcGFkZGluZzogMCAxMHB4IDhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7Cn0KCi5tanItd2dtLWRldGFpbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDAgOHB4IDEwcHg7Cn0KCi5tanItd2dtLW5vZGUtdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLW1ldGEgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1hcmdpbi10b3A6IC00cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luOiAtMnB4IDAgMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41OCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLWJyZWFkY3J1bWItaXRlbSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDE0MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYi1zZXAgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zMik7Cn0KCi5tanItd2dtLWFjdGlvbnMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLWFjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzYpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1hY3Rpb246aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC40NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKfQoKLm1qci13Z20tYWN0aW9uLmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NiwgMTc1LCA4MCwgMC41NSk7CiAgICBjb2xvcjogcmdiYSgxOTAsIDI1NSwgMTk2LCAwLjk2KTsKfQoKLm1qci13Z20tcGFyYW1zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLm1qci13Z20tcGFyYW0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDY0cHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLXdnbS1wYXJhbTpob3ZlciwKLm1qci13Z20tcGFyYW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tcGFyYW0uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0uaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLXBhcmFtLWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7Cn0KCi5tanItd2dtLXBhcmFtLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDExNSwgMTU1LCAyNTUsIDAuODgpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTE1LCAxNTUsIDI1NSwgMC4yMik7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCkgMzQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdCkgMTAwJSwgdHJhbnNwYXJlbnQpLCByZ2JhKDQ0LCA1NiwgODgsIDAuMikpLAogICAgICAgIHJnYmEoMTMsIDE2LCAyNCwgMC44NSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogMnB4OwogICAgbWFyZ2luOiAtOHB4IC04cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbW9kZWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDEyNCwgMTg2LCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg3MCwgMTIzLCAxODEsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1zYW1wbGVyIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxNDMsIDIyOCwgMTY3LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoNjQsIDEzMywgODgsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy10ZXh0IHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgyNTUsIDE5MiwgMTE0LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTU0LCAxMDIsIDQ5LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbWVkaWEgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDE1NCwgMTcwLCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg4MywgOTMsIDE2NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWNvbnRyb2wgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDI1NSwgMTM5LCAxNjksIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxNDUsIDcwLCA5NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWxvZ2ljIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxODgsIDE2OCwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTA1LCA4NiwgMTUzLCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSAyNSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC10eXBlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0NCwgMjU1LCAwLjk0KTsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLWlkIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDE5NCwgMjEzLCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBnYXA6IDhweDsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy1jb2wgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLXRpdGxlIHsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40NSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiAzcHg7Cn0KCi5tanItd2dtLW5vZGUtcG9ydCwKLm1qci13Z20tbm9kZS1wb3J0LWVtcHR5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjQpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNik7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QgewogICAgd2lkdGg6IDhweDsKICAgIGhlaWdodDogOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpIGluc2V0Owp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90LmlzLWluIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTM1LCAxOTYsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdC5pcy1vdXQgewogICAgYmFja2dyb3VuZDogcmdiYSgxNDQsIDIzOCwgMTc0LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtbmFtZSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtdHlwZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogNDUlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGNvbG9yOiByZ2JhKDIyNCwgMjM2LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cy10aXRsZSB7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCwKLm1qci13Z20tbm9kZS13aWRnZXQtZW1wdHkgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDcwcHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQ6aG92ZXIsCi5tanItd2dtLW5vZGUtd2lkZ2V0OmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWVtcHR5IHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41Mik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSAubWpyLXdnbS1ub2RlLXdpZGdldC1rZXkgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIC5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWF4LWhlaWdodDogOS4yZW07CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZy1yaWdodDogMnB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUuaXMtdGV4dC1maWVsZCAubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICBtYXgtaGVpZ2h0OiAxNmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQtbW9yZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ2KTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogODIwcHgpIHsKICAgIC5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1kZXRhaWxzIHsKICAgICAgICB3aWR0aDogbWluKDM4MHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICB9CgogICAgLm1qci13Z20tbm9kZS1wb3J0cyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9Cn0KCi5tanItd3Mtc2VhcmNoLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItd3Mtc2VhcmNoLWljb24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci13cy1zZWFyY2ggewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDRweCAyOHB4IDRweCAyNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci13cy1zZWFyY2g6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC41KTsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDE0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXdzLXNlYXJjaC1jbGVhcjpob3ZlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13cy1ub2Rlcy1saXN0IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi5tanItd3Mtbm9kZS1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItd3Mtbm9kZS1yb3ctdHlwZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgoubWpyLXdzLW5vZGUtcm93LXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWF4LXdpZHRoOiA4MHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgZmxleC1zaHJpbms6IDA7CiAgICB3aWR0aDogMjJweDsKICAgIGhlaWdodDogMjJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzLAogICAgICAgIGNvbG9yIDAuMXMsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIC5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1ub2RlLWxvY2F0ZTpob3ZlciB7CiAgICBjb2xvcjogIzYzOWJmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKfQoKLyogLS0gTm9kZSBzZWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy10cmVlLWl0ZW0gewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci5tanItd3MtdHJlZS1pdGVtID4gLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KLm1qci13cy10cmVlLWl0ZW0tLXN1YmdyYXBoIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA0JSwgdHJhbnNwYXJlbnQgOTYlKTsKfQoubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci8qIFN1YnRsZSBoaWdobGlnaHQgd2hlbiB0aGlzIG5vZGUgbWF0Y2hlcyB0aGUgY3VycmVudCBncmFwaCBzZWxlY3Rpb24uICovCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyMTAsIDkwLCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDJweCAwIDAgMCByZ2JhKDI1NSwgMjEwLCA5MCwgMC43NSk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2ZmZDQ1YSAxOCUsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDgyJSk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXR5cGUgewogICAgY29sb3I6ICNmZmQ0NWE7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjI0LCAxMzAsIDAuODgpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10b2dnbGUsCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3MtbG9jYXRlLAoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUta2luZCB7CiAgICBjb2xvcjogI2ZmZDQ1YTsKfQoubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMTRweDsKICAgIHotaW5kZXg6IDI7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgoubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogNHB4OwogICAgaGVpZ2h0OiA1NnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xNXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7Cn0KCi5tanItd3Mtc2lkZWJhci5vcGVuOmhvdmVyIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci5pcy1yZXNpemluZyAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplci5pcy1kcmFnZ2luZzo6YmVmb3JlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItd3Mtc2lkZWJhci5pcy1yZXNpemluZyAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplcjpob3Zlcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplci5pcy1kcmFnZ2luZzo6YmVmb3JlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJyaWdodCJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIHJpZ2h0OiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIGxlZnQ6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDYwJQogICAgKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjEycyBlYXNlOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZSAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSAyOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgNzIlCiAgICApOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZS5pcy1jb2xsYXBzZWQgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA4JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5MiUKICAgICk7Cn0KLm1qci13cy1ub2RlLXRvZ2dsZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoubWpyLXdzLW5vZGUtdGl0bGUtd3JhcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDFweDsKfQoubWpyLXdzLW5vZGUtdHlwZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLW5vZGUtdGl0bGUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtbm9kZS1raW5kIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBtYXgtd2lkdGg6IDExMHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAzOCUsIHRyYW5zcGFyZW50IDYyJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsIHRyYW5zcGFyZW50IDg4JSk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDc4JSwgI2ZmZmZmZiAyMiUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItd3Mtbm9kZS1raW5kIC5waSB7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KLm1qci13cy1ub2RlLWtpbmQtY291bnQgewogICAgbWluLXdpZHRoOiAxNHB4OwogICAgcGFkZGluZzogMCAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2VkIC5tanItd3Mtbm9kZS1ib2R5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci13cy1ub2RlLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4Owp9Ci5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi8qIC0tIE5lc3RlZCBub2RlcyAoaW5zaWRlIHN1YmdyYXBocykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1ub2RlLS1uZXN0ZWQgewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4zNSk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA1JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NSUKICAgICk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTAlCiAgICApOwp9CgovKiAtLSBTdWJncmFwaCBjaGlsZHJlbiBncm91cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMjBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDYlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDk0JQogICAgKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBvcGFjaXR5OiAwLjg7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xcyBlYXNlOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlLS1uZXN0ZWQgewogICAgcGFkZGluZy1sZWZ0OiAyOHB4Owp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgODglCiAgICApOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAxOwp9Ci5tanItd3MtY2hpbGRyZW4gewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4yNSk7CiAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgcGFkZGluZy1sZWZ0OiA2cHg7Cn0KCi5tanItd3Mtd2lkZ2V0LXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IG5vbmU7CiAgICBwYWRkaW5nLXRvcDogMDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IDAgMCA4MHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU1KSk7CiAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLXdpZGdldC1pbnB1dCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KLm1qci13cy10ZXh0YXJlYSB7CiAgICByZXNpemU6IG5vbmU7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKfQoubWpyLXdzLXRleHQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLXdzLXRleHQtd3JhcHBlciAubWpyLXdzLXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3MtZXhwYW5kLWJ0biB7CiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG9wYWNpdHk6IDAuODsKfQoubWpyLXdzLWV4cGFuZC1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9Ci5tanItd3MtcmVhZG9ubHkgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5tanItd3MtY2hlY2tib3ggewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgbWFyZ2luLXRvcDogNHB4Owp9Ci5tanItd3MtdG9nZ2xlLWxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgovKiAtLSBMb2NhdGUgYnV0dG9uIGluc2lkZSBub2RlIGhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLWxvY2F0ZSB7CiAgICB3aWR0aDogMjRweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjU7Cn0KLm1qci13cy1sb2NhdGU6aG92ZXIgewogICAgb3BhY2l0eTogMTsKfQoKLyogLS0gUnVuIGJ1dHRvbiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtcnVuLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4Owp9Ci5tanItbWZ2LXJ1bi1idG4gLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApOwp9Ci5tanItbWZ2LXJ1bi1idG4ucnVubmluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5zdG9wcGluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmYTcyNik7Cn0KLm1qci1tZnYtcnVuLWJ0bi5lcnJvciAucGkgewogICAgY29sb3I6ICNmNDQzMzY7Cn0KCi5tanItbWZ2LXN0b3AtYnRuIC5waSB7CiAgICBjb2xvcjogI2VmNTM1MDsKfQoubWpyLW1mdi1zdG9wLWJ0bi5hY3RpdmUgLnBpIHsKICAgIGNvbG9yOiAjZmY4YTY1Owp9Ci5tanItbWZ2LXN0b3AtYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoKLyogLS0gRmxvYXRpbmcgVmlld2VyIHNpbXBsZSB2aWRlbyBwbGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1zaW1wbGUtcGxheWVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIuaXMtYXVkaW8gewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgMjAlLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yKSwgcmdiYSgxOCwgMjAsIDI4LCAwLjk1KSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYXVkaW8tYmFja2Ryb3AgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4ycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBwYWRkaW5nOiAxOHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWNvbnRyb2xzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEycHg7CiAgICByaWdodDogMTJweDsKICAgIGJvdHRvbTogMTJweDsKICAgIHotaW5kZXg6IDMwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDEwLCAxMCwgMTQsIDAuNzYpLCByZ2JhKDE2LCAxNiwgMjQsIDAuNTUpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItcm93IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsgewogICAgLS1tanItc2Vlay1wY3Q6IDAlOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgdG8gcmlnaHQsCiAgICAgICAgI2ZmMmY1MiAwJSwKICAgICAgICAjZmYyZjUyIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSB2YXIoLS1tanItc2Vlay1wY3QpLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgMTAwJQogICAgKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0bi5pcy1kaXNhYmxlZCwKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrLmlzLWRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNDU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItdGltZSB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1mcmFtZSB7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0LS1hdWRpbyB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDIwJSAyMCUsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjIpLCByZ2JhKDE4LCAyMCwgMjgsIDAuOTUpKTsKfQoKLm1qci1tZnYtcGxheWVyLWF1ZGlvLWJhY2tkcm9wIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogMThweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgIHotaW5kZXg6IDMwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIHsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tcm93LS10b3AsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBnYXA6IDhweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXRpbWVncm91cCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJvdy0tYm90dG9tLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1ib3R0b20sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1ib3R0b20gewogICAgZmxleC1zaHJpbms6IDE7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXRyYW5zcG9ydCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWdyb3VwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tZ3JvdXAgewogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1zZWVrLXdyYXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgbWluLXdpZHRoOiAwOwp9CgovKiBUaGUgTUZWIHVzZXMgdGhlICItLXZpZXdlciIgY29udHJvbCB2YXJpYW50LCB3aGljaCAodW5saWtlICItLXZpZXdlcmJhciIpCiAgIGRvZXMgbm90IHNpemUgdGhlIG5hdGl2ZSBzZWVrIGlucHV0IGFuZCBwYWNrcyBmcmFtZS9pbi9zZWVrL291dC90aW1lIGludG8gYQogICBzaW5nbGUgcm93LiBJbiB0aGUgbmFycm93IE1GViB0aGUgc2VlayB3cmFwIHRoZW4gY29sbGFwc2VzIHRvIH4wcHggd2lkZSBhbmQKICAgdGhlIG5hdGl2ZSBpbnB1dCB0byAwcHggdGFsbCwgbGVhdmluZyBhbG1vc3Qgbm8gY2xpY2sgLyBkcmFnIHRhcmdldCBmb3IKICAgc2NydWJiaW5nLiBHaXZlIHRoZSBzZWVrIGl0cyBvd24gZnVsbC13aWR0aCByb3cgd2l0aCBhIHVzYWJsZSBoaXQgYXJlYS4gKi8KLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICByb3ctZ2FwOiA0MnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXIgLm1qci12aWRlby1yb3ctLXRvcCAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBvcmRlcjogMTA7CiAgICBmbGV4OiAxIDEgMTAwJTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogNDJweDsKICAgIHBhZGRpbmctdG9wOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjBweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tc2Vlay16b25lcyB7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXNlZWstaGFuZGxlIHsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgdG9wOiAyMHB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tc2Vlay13cmFwLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG9yZGVyOiAtMTsKICAgIGZsZXg6IDEgMSAxMDAlOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0tb3V0LAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLW91dCB7CiAgICBmbGV4OiAwIDEgYXV0bzsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJhbmdlLWNvdW50LAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiBhdXRvOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiBhdXRvOwogICAgcGFkZGluZzogM3B4IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLW91dCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0tbWFyayB7CiAgICBtaW4td2lkdGg6IDMycHg7Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogOTAwcHgpIHsKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgICAgIGxlZnQ6IDhweDsKICAgICAgICByaWdodDogOHB4OwogICAgICAgIGJvdHRvbTogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgICAgICBnYXA6IDhweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1ib3R0b20gewogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWdyb3VwIHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhcgogICAgICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAgICAgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgICAgIG9yZGVyOiAtMTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKQGNvbnRhaW5lciAobWF4LXdpZHRoOiA2ODBweCkgewogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICAgICAgcGFkZGluZzogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tYnRuIHsKICAgICAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLW51bSB7CiAgICAgICAgcGFkZGluZzogNHB4IDZweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10aW1lLAogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1mcmFtZSwKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIH0KfQoKLyogLS0gU2V0dGluZ3MgYnV0dG9uIGFjdGl2ZSBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKQogICAgKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDcwJSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxOCUKICAgICk7Cn0KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiAtLSBDbG9zZSBidXR0b24gKHJlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2IC5tanItbWZ2LWNsb3NlLWJ0biB7CiAgICBjb2xvcjogI2U4NTA1MDsKfQoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG46aG92ZXIgewogICAgY29sb3I6ICNmZjZiNmI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzMiwgODAsIDgwLCAwLjE1KTsKfQoKLyogLS0gRW1wdHkgc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1lbXB0eSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMTJweDsKfQoKLyogLS0gQ29tcGFyZSBsYWJlbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBwYWRkaW5nOiAycHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKfQoKLm1qci1tZnYtbGFiZWwubGFiZWwtbGVmdCB7CiAgICBsZWZ0OiA4cHg7Cn0KLm1qci1tZnYtbGFiZWwubGFiZWwtcmlnaHQgewogICAgcmlnaHQ6IDhweDsKfQoKLyogLS0gQUIgZGl2aWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1hYi1kaXZpZGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAwLjVweDsKICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgIHotaW5kZXg6IDEwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgMC41cHggcmdiYSgwLCAwLCAwLCAwLjQpLAogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLW1mdi1hYi1kaXZpZGVyOmhvdmVyLAoubWpyLW1mdi1hYi1kaXZpZGVyOmFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgTUZWIEdlb21ldHJ5ICYgTGF5b3V0IENsYXNzZXMgKHJlcGxhY2VzIGlubGluZSBzdHlsZXMgaW4gRmxvYXRpbmdWaWV3ZXIuanMpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBNYWluIE1GViBjb250YWluZXIgZ2VvbWV0cnkgKi8KLm1qci1tZnYgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiB2YXIoLS1tanItbWZ2LXRvcC1vZmZzZXQsIDYwcHgpOwogICAgcmlnaHQ6IDIwcHg7CiAgICB3aWR0aDogNjQwcHg7CiAgICBoZWlnaHQ6IDM2MHB4OwogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIG1pbi1oZWlnaHQ6IDE2MHB4OwogICAgLyogQWx3YXlzIGZsZXg7IHZpc2liaWxpdHkgKyBvcGFjaXR5IGNvbnRyb2wgc2hvdy9oaWRlIHNvIENTUyB0cmFuc2l0aW9ucyB3b3JrLgogICAgICAgcG9pbnRlci1ldmVudHM6bm9uZSB3aGlsZSBoaWRkZW4gcHJldmVudHMgYWNjaWRlbnRhbCBpbnRlcmFjdGlvbi4gKi8KICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgcmVzaXplOiBib3RoOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHotaW5kZXg6IDEwMDAwOwogICAgLyogSGlkZGVuIHN0YXRlICovCiAgICBvcGFjaXR5OiAwOwogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTZweCkgc2NhbGUoMC45OCk7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMThzIGVhc2Utb3V0LAogICAgICAgIHZpc2liaWxpdHkgMHMgbGluZWFyIDAuMThzOwp9CgoubWpyLW1mdi5tanItbWZ2LS1yZXNpemluZyB7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1tZnYuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMThzIGVhc2Utb3V0LAogICAgICAgIHRyYW5zZm9ybSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB2aXNpYmlsaXR5IDBzIGxpbmVhciAwczsKfQoKLyogTWVkaWEgZWxlbWVudHMgKGltZy92aWRlbykgc2l6aW5nIHZhcmlhbnRzICovCi5tanItbWZ2LW1lZGlhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwp9CgoubWpyLW1mdi1tZWRpYS0tZml0LWhlaWdodCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7Cn0KCi5tanItbWZ2LW1lZGlhLS1maWxsIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgovKiBBdWRpbyBjYXJkIGluc2lkZSBNRlYgKi8KLm1qci1tZnYtYXVkaW8tY2FyZCB7CiAgICB3aWR0aDogbWluKDkyJSwgNTYwcHgpOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci1tZnYtYXVkaW8taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1mdi1hdWRpby1pY29uIHsKICAgIGNvbG9yOiB2YXIoLS1tanItYmFkZ2UtYXVkaW8sICNmZjk4MDApOwogICAgb3BhY2l0eTogMC45NTsKfQoKLm1qci1tZnYtYXVkaW8tdGl0bGUgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItbWZ2LWF1ZGlvLXBsYXllciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZnYtc2lkZS1wYW5lbCAubWpyLW1mdi1hdWRpby1jYXJkLAoubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1hdWRpby1jYXJkLAoubWpyLW1mdi1ncmlkLWNlbGwgLm1qci1tZnYtYXVkaW8tY2FyZCB7CiAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7Cn0KCi8qIFZpZGVvIGVsZW1lbnQgc3BlY2lmaWMgc3R5bGVzICovCi5tanItbWZ2LW1lZGlhLXZpZGVvIHsKICAgIC8qIEluaGVyaXRzIGZyb20gLm1qci1tZnYtbWVkaWEgb3IgLm1qci1tZnYtbWVkaWEtLWZpbGwgKi8KfQoKLyogTm9kZSBTdHJlYW0gLSBjdXJyZW50bHktc3RyZWFtZWQgbm9kZSBiYWRnZSAodG9wLWxlZnQgb2YgY29udGVudCBhcmVhLAogICBmb2xsb3dpbmcgdGhlIHNhbWUgb3ZlcmxheSBwYXR0ZXJuIGFzIC5tanItbWZ2LWdlbmluZm8pLiAqLwoubWpyLW1mdi1ub2RlLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBsZWZ0OiA4cHg7CiAgICB6LWluZGV4OiAxMjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgY29sb3I6ICNlNmYzZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE3MCwgMjQwLCAwLjQ1KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDE2cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQovKiBHZW4gaW5mbyBvdmVybGF5IC0gYWxsIG1vZGVzIHNoYXJlIGJhc2UgbGF5b3V0ICovCi5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwp9CgovKiBLZWVwIEdlbiBJbmZvIGFib3ZlIGN1c3RvbSBzaW1wbGUtcGxheWVyIGNvbnRyb2xzIHdoZW4gcHJlc2VudC4gKi8KLm1qci1tZnYtZ2VuaW5mby5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciwKLm1qci1tZnYtZ2VuaW5mby1hLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWIubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBGYWxsYmFjazogd2hlbiBzaW1wbGUtcGxheWVyIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgZ2VuaW5mbyBvdmVybGF5LAogICBtb3ZlIGl0IHVwIGV2ZW4gaWYgdGhlIG1vZGlmaWVyIGNsYXNzIHdhcyBub3QgYXR0YWNoZWQuICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogQUIgbW9kZSBvdmVybGF5cyBhcmUgYXR0YWNoZWQgYXQgY29udGFpbmVyIGxldmVsOyBzaGlmdCB0aGVtIHdoZW4gQUIgbGF5ZXJzIHVzZSBzaW1wbGUtcGxheWVyLiAqLwoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtYWItY29udGFpbmVyOmhhcygubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1zaW1wbGUtcGxheWVyKSAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBTaGFyZWQgc3R5bGUgZm9yIGFsbCBnZW4gaW5mbyBvdmVybGF5IHZhcmlhbnRzICovCi5tanItbWZ2LWdlbmluZm8gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyAvKiBkZWZhdWx0IC0gb3ZlcnJpZGRlbiBwZXIgZmllbGQgYmVsb3cgKi8KfQoKLyogUGVyLWZpZWxkIGxhYmVsIGNvbG9ycyAqLwoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfSAvKiBibHVlICAgLSBQcm9tcHQgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9IC8qIGFtYmVyICAtIFNlZWQgICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0gLyogZ3JlZW4gIC0gTW9kZWwgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfSAvKiB2aW9sZXQgLSBMb1JBICAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9IC8qIG9yYW5nZSAtIFNhbXBsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9IC8qIHBpbmsgICAtIFNjaGVkdWxlciAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0gLyogaW5kaWdvIC0gQ0ZHICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfSAvKiB0ZWFsICAgLSBTdGVwICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2UwZmY3YTsKfSAvKiBsaW1lICAgLSBHZW4gVGltZSAqLwoKLm1qci1tZnYtZ2VuaW5mbyBkaXYsCi5tanItbWZ2LWdlbmluZm8tYSBkaXYsCi5tanItbWZ2LWdlbmluZm8tYiBkaXYgewogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBtYXJnaW4tYm90dG9tOiAzcHg7Cn0KCi5tanItbWZ2LWdlbmluZm8gZGl2Omxhc3QtY2hpbGQsCi5tanItbWZ2LWdlbmluZm8tYSBkaXY6bGFzdC1jaGlsZCwKLm1qci1tZnYtZ2VuaW5mby1iIGRpdjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi8qIFNpbXBsZSBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1zaW1wbGUtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi8qIEFCIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LWFiLWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjMDAwOwp9CgovKiBBQiBtb2RlIGxheWVycyAqLwoubWpyLW1mdi1hYi1sYXllciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItbWZ2LWFiLWxheWVyLS1iIHsKICAgIC8qIGNsaXAtcGF0aCBhcHBsaWVkIGlubGluZSBmb3IgZHluYW1pYyBkaXZpZGVyIHBvc2l0aW9uICovCn0KCi8qIFNpZGUtYnktc2lkZSBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1zaWRlLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBnYXA6IDJweDsKICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBTaWRlLWJ5LXNpZGUgaGFsZiBwYW5lbHMgKi8KLm1qci1tZnYtc2lkZS1wYW5lbCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwp9CgovKiBHcmlkIGNvbXBhcmUgKDItMikgY29udGFpbmVyICovCi5tanItbWZ2LWdyaWQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmciAxZnI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIEdyaWQgY2VsbHMgKi8KLm1qci1tZnYtZ3JpZC1jZWxsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIEdlbiBpbmZvIG92ZXJsYXlzIGZvciBncmlkIGNlbGxzIEMgYW5kIEQgKi8KLm1qci1tZnYtZ2VuaW5mby1jLAoubWpyLW1mdi1nZW5pbmZvLWQgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi5tanItbWZ2LWdlbmluZm8tYyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgZm9yIEMvRCBnZW4gaW5mbyBvdmVybGF5cyAqLwoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2FmZmQ0Owp9CgovKiBHZW4gaW5mbyBhY3RpdmUgc3RhdGUgLSBidXR0b24gZ2xvd3Mgd2hlbiBhdCBsZWFzdCBvbmUgZmllbGQgaXMgc2VsZWN0ZWQgKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0bi5pcy1vbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCwgOTUsIDE3OSwgMjU1KSwgMC41NSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgODAlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxNSUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5pcy1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDYyJSwgI2ZmZmZmZiAxMiUpOwogICAgY29sb3I6ICNlZWY3ZmY7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yOCksIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE0KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjYlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLmlzLW9wZW4gewogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKfQoKLyogR2VuIGluZm8gZHJvcGRvd24gcGFuZWwgKi8KLm1qci1tZnYtZ2VuLWRyb3Bkb3duIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDk2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgcGFkZGluZzogNnB4IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xOCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgZGlzcGxheTogbm9uZTsKICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJHRU4gSU5GTyI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgcGFkZGluZzogMnB4IDEwcHggNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xKTsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLmlzLXZpc2libGUgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMDBtcyBlYXNlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3c6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA3KTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdyBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIHdpZHRoOiAxM3B4OwogICAgaGVpZ2h0OiAxM3B4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBUcmFuc2Zvcm0gZm9yIHBhbi96b29tIC0gYXBwbGllZCBpbmxpbmUgZm9yIGR5bmFtaWMgdmFsdWVzICovCi5tanItbWZ2LW1lZGlhLS10cmFuc2Zvcm0gewogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwp9CgovKiBDdXJzb3IgZmVlZGJhY2sgZm9yIHBhbi96b29tIGludGVyYWN0aW9ucyAqLwoubWpyLW1mdi1jb250ZW50LS1ncmFiIHsKICAgIGN1cnNvcjogZ3JhYjsKfQoKLm1qci1tZnYtY29udGVudC0tZ3JhYmJpbmcgewogICAgY3Vyc29yOiBncmFiYmluZzsKfQoKLyogU2lkZWJhciB0YWIgYnV0dG9uOiBhbGxvdyAyLWxpbmUgbGFiZWwgdmlhIFxuIGluIGxhYmVsIHN0cmluZyAqLwoubWFqb29yLWFzc2V0cy10YWItYnV0dG9uIC5zaWRlLWJhci1idXR0b24tbGFiZWwgewogICAgd2hpdGUtc3BhY2U6IHByZS1saW5lOwp9CgovKiBCb3R0b20tcGFuZWwgZ2VuZXJhdGVkIGZlZWQ6IGNvbXBhY3QgY2FyZHMgd2l0aCBvbmx5IHRoZSBnZW5lcmF0aW9uLXRpbWUgcGlsbCAqLwoubWpyLWJvdHRvbS1mZWVkIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKQogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciwKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQgewogICAgZ2FwOiA2cHggIWltcG9ydGFudDsKICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KG1pbigxMDAlLCAxMzJweCksIDFmcikpICFpbXBvcnRhbnQ7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiBhdXRvOwogICAgYWxpZ24tY29udGVudDogc3RhcnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZCB7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgIzAwMCA4JSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjIyKSAhaW1wb3J0YW50OwogICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkOmhvdmVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgMTBweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yOCkgIWltcG9ydGFudDsKCiAgICAubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZC5pcy1zZWxlY3RlZCB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgMzAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpICFpbXBvcnRhbnQ7CiAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgIWltcG9ydGFudDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0sCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWIgewogICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IC0xOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTQwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDE0MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNXB4LCA1cHgpIHNjYWxlKDAuOTg1KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzIwMjQyYikgODQlLCAjMDAwIDE2JSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTYpOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMHB4LCAxMHB4KSBzY2FsZSgwLjk3KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDgyJSwgIzAwMCAxOCUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDZweCwgNnB4KSBzY2FsZSgwLjk4NSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDEycHgsIDEycHgpIHNjYWxlKDAuOTcpOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAwLjk1IC8gMSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDcyJSwgIzAwMCAyOCUpICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYi1wbGF5IHsKICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudCgKICAgICAgICBjaXJjbGUgYXQgY2VudGVyLAogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4xOCksCiAgICAgICAgcmdiYSgwLCAwLCAwLCAwLjA0KSAzOCUsCiAgICAgICAgdHJhbnNwYXJlbnQgNzAlCiAgICApOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtZXh0LAoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtcmF0aW5nLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtdGFncyB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTIpOwogICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7Cn0KCi8qIC0tIEZlZWQgY2FyZCBpbmZvOiBkZWZhdWx0IGhpZGRlbiwgdG9nZ2xlZCB2aWEgbWpyLWZlZWQtc2hvdy0qIGNsYXNzZXMgb24gLm1qci1ncmlkIC0tICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogNHB4IDZweCAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctaW5mbyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGZpbGVuYW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWZpbGVuYW1lIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGRpbWVuc2lvbnMgLyBkdXJhdGlvbiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRpbWVuc2lvbnMgLm1qci1tZXRhLXJlcywKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkYXRlL3RpbWUgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kYXRlIC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBnZW5lcmF0aW9uIHRpbWUgYmFkZ2UgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1nZW50aW1lIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgd29ya2Zsb3cgZG90ICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRvdCAubWpyLWNhcmQtZG90LXdyYXBwZXIgewogICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBiYWRnZXMgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtZXh0IC5tanItYmFkZ2UtZXh0IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtcmF0aW5nIC5tanItYmFkZ2UtcmF0aW5nIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXRhZ3MgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBtZXRhIHJvdyBzdHlsaW5nIC0gZmxleCBsYXlvdXQgc28gdmlzaWJsZSBpdGVtcyBzdGF5IHNlcGFyYXRlZCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7CiAgICBmbGV4LXdyYXA6IG5vd3JhcCAhaW1wb3J0YW50OwogICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgZ2FwOiA1cHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC43OCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjhlbSAhaW1wb3J0YW50OwogICAgLyogdGV4dC1vdmVyZmxvdyBlbGxpcHNpcyBkb2Vzbid0IGFwcGx5IG9uIGEgZmxleCBjb250YWluZXIgaXRzZWxmICovCn0KLyogRWFjaCBtZXRhIHNwYW4gdHJ1bmNhdGVzIGluZGl2aWR1YWxseSBpZiB0b28gbG9uZyAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IHNwYW4gewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtc2hyaW5rOiAxOwp9Ci8qIEdlbnRpbWUgYmFkZ2UgYW5kIHRpbWUgdmFsdWUgc2hvdWxkIHN0YXkgdmlzaWJsZSAoZG9uJ3Qgc2hyaW5rIGF3YXkpICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLWdlbnRpbWUsCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWdlbnRpbWUgLm1qci1tZXRhLWdlbnRpbWUgewogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogM3B4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45OCk7CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7Cn0KCi8qIC0tIEF1ZGlvIC8gM0QgcGxhY2Vob2xkZXIgdGh1bWJuYWlscyBpbiB0aGUgZmVlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBBdWRpbyBjYXJkcyBzaG93IHRoZSB3YXZlZm9ybSBzcHJpdGU7IGdpdmUgaXQgYSBkaXN0aW5jdCBiYWNrZ3JvdW5kIHNvIGl0CiAgIGRvZXNuJ3QgbG9vayBsaWtlIGEgYnJva2VuIGltYWdlIHBsYWNlaG9sZGVyIGluIHRoZSBmZWVkLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJhdWRpbyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ibXAzIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJ3YXYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9nZyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmxhYyJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDYwJSwgIzFhMWYyYiA0MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIDNEIG1vZGVsIGNhcmRzIHVzZSBhbiBpY29uIHBsYWNlaG9sZGVyIC0gYWRkIGEgc3VidGxlIGdyYWRpZW50IHNvIHRoZXkgcmVhZAogICBhcyBpbnRlbnRpb25hbCByYXRoZXIgdGhhbiBtaXNzaW5nLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJtb2RlbDNkIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJnbGIiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImdsdGYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9iaiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmJ4Il0gLm1qci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNTAlLCAjMGQxMTE3IDUwJSkgIWltcG9ydGFudDsKfQoKLyogLS0gRmVlZCBncm91cCBidXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLWJvdHRvbS1mZWVkIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiAtLSBGZWVkIGdyb3VwIHBvcG92ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyMjIpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnLCA4cHgpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItdGl0bGUgewogICAgcGFkZGluZzogOHB4IDEwcHggNHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQgewogICAgcGFkZGluZzogNHB4IDhweCAxMHB4OwogICAgbWF4LWhlaWdodDogMzYwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwp9CgoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWljb24sCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDM0cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDI0LCAzNCwgMC45KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiA+ICogewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNHB4OwogICAgaGVpZ2h0OiA0cHg7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoKLm1qci1maWxtc3RyaXA6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXRodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHBhZGRpbmc6IDdweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMjQlIDI0JSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMjgpLCB0cmFuc3BhcmVudCA0MiUpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgODQlIDcwJSwgcmdiYSg4MiwgMjIwLCAxNTYsIDAuMTgpLCB0cmFuc3BhcmVudCA0MCUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMTgsIDI1LCAzNSwgMC45NiksIHJnYmEoNywgMTAsIDE1LCAwLjk4KSk7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXdhdmVmb3JtIHsKICAgIHdpZHRoOiA3NiU7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAycHg7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXdhdmVmb3JtIHNwYW4gewogICAgd2lkdGg6IDJweDsKICAgIG1pbi1oZWlnaHQ6IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KSwgcmdiYSgxNDgsIDIxOCwgMjU1LCAwLjY4KSk7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLWxhYmVsIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgZm9udC1zaXplOiA3cHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiAtLSBEdXBsaWNhdGUgc3RhY2sgYnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBTaG93cyBvbiB0aGUgcHJpbWFyeSBjYXJkIHdoZW4gc2FtZS1maWxlbmFtZSBkdXBsaWNhdGVzIGV4aXN0LiAgICAgICAgICAgICAqLwovKiBQb3NpdGlvbmVkIGF0IGJvdHRvbS1yaWdodCB0byBub3Qgb3ZlcmxhcCB0aGUgc3RhY2stZ3JvdXAgYnV0dG9uICh0b3AtcmlnaHQpLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDMwcHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMTgwLCAwLCAwLjM4KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgzMCwgMTgsIDAsIDAuODIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyMDAsIDYwLCAwLjk2KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzIpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDUwLCAzMCwgMCwgMC45NCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxODAsIDAsIDAuNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl0gLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMiksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAxODAsIDAsIDAuMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1kdXAtc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiAtLSBWaXN1YWwgc3RhY2tpbmcgZWZmZWN0IC0gbGF5ZXJlZCBjYXJkcyBiZWhpbmQgdGhlIG1haW4gY2FyZCAtLS0tLS0tLS0tLS0gKi8KLyogQ3JlYXRlcyBwc2V1ZG8tZWxlbWVudCAiY2FyZHMiIG9mZnNldCBiZWhpbmQgdGhlIHByaW1hcnkgY2FyZCB0byB2aXN1YWxseSAgICAqLwovKiBjb21tdW5pY2F0ZSB0aGF0IHRoaXMgY2FyZCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbXVsdGlwbGUgaW1hZ2VzLiAgICAgICAgICAgICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMxYTFhMmUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxODBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoM3B4LCAzcHgpIHJvdGF0ZSgxZGVnKTsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHJvdGF0ZSgyLjJkZWcpOwogICAgb3BhY2l0eTogMC4yNTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNHB4LCA0cHgpIHJvdGF0ZSgxLjVkZWcpOwogICAgb3BhY2l0eTogMC41NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg4cHgsIDhweCkgcm90YXRlKDNkZWcpOwogICAgb3BhY2l0eTogMC4zNTsKfQoKLm1qci1zdGFjay1ncm91cC1wb3BvdmVyIHsKICAgIHdpZHRoOiBtaW4oNDQwcHgsIDkydncpOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBMaWdodCBtb2RlIG92ZXJyaWRlcyAoQ29tZnlVSSB2MS40MisgaW1wcm92ZWQgbGlnaHQgdGhlbWUpCiAqIFVzZXMgQ29tZnlVSSBkYXRhLXRoZW1lIGF0dHJpYnV0ZSB3aGVuIHNldCwgd2l0aAogKiBwcmVmZXJzLWNvbG9yLXNjaGVtZSBhcyBhIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucy4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiBDb21meVVJIHNldHMgZGF0YS10aGVtZT0ibGlnaHQiIG9uIDxodG1sPiBvciA8Ym9keT4gKi8KOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItYXNzZXRzLW1hbmFnZXIsCjppcyhbZGF0YS10aGVtZT0ibGlnaHQiXSwgW2RhdGEtY29sb3Itc2NoZW1lPSJsaWdodCJdKSAubWpyLXBvcG92ZXIgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2U4ZThlOCk7CiAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCByZ2JhKDAsIDAsIDAsIDAuNTUpKTsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKICAgIC8qIEZhbGxiYWNrOiBvbmx5IGFwcGx5IGlmIENvbWZ5VUkgaGFzbid0IHNldCBhbiBleHBsaWNpdCBkYXRhLXRoZW1lICovCiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyOm5vdChbZGF0YS10aGVtZS1hcHBsaWVkXSksCiAgICAubWpyLXBvcG92ZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSB7CiAgICAgICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAgICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCAjZmFmYWZhKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgICAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgcmdiYSgwLCAwLCAwLCAwLjE0KSk7CiAgICAgICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKICAgIH0KfQoKLyogLS0tIFNrZWxldG9uIGxvYWRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItY2FyZC1za2VsZXRvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogTWF0Y2ggLm1qci10aHVtYiBhc3BlY3QgcmF0aW8gc28gc2tlbGV0b25zIGhhdmUgdGhlIHNhbWUgZm9vdHByaW50IGFzIHJlYWwgY2FyZHMuICovCiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwp9CgovKiBTaGltbWVyIHN3ZWVwICovCi5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICB0cmFuc3BhcmVudCAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzNhM2EzYSkgODAlLCB0cmFuc3BhcmVudCkgNTAlLAogICAgICAgIHRyYW5zcGFyZW50IDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1zaGltbWVyIDEuNHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwp9CgpAa2V5ZnJhbWVzIG1qci1zaGltbWVyIHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgfQp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1jYXJkLXNrZWxldG9uOjphZnRlciB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lOwogICAgfQp9CgovKiAtLS0gUmVzcG9uc2l2ZSBzdW1tYXJ5IGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogRW5hYmxlIGNvbnRhaW5lciBxdWVyaWVzIG9uIHRoZSBzdW1tYXJ5IGJhciBzbyBjaGlsZHJlbiBjYW4gcmVzcG9uZCB0byBpdHMKICogYWN0dWFsIHJlbmRlcmVkIHdpZHRoIChlLmcuIHdoZW4gdGhlIHBhbmVsIGlzIGRvY2tlZCBpbiBhIG5hcnJvdyBzaWRlYmFyKS4KICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKICAgIGNvbnRhaW5lci1uYW1lOiBtanItc3VtbWFyeS1iYXI7Cn0KCi8qIEJlbG93IH4zODAgcHg6IGhpZGUgdGhlIHBpbGxzL3JpZ2h0IHNlY3Rpb24gdG8gcHJldmVudCBvdmVyZmxvdy4gKi8KQGNvbnRhaW5lciBtanItc3VtbWFyeS1iYXIgKG1heC13aWR0aDogMzgwcHgpIHsKICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXJpZ2h0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgfQp9Cg==", "" + import.meta.url).toString(), n = document.createElement("link"); + let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciAtIENvbWZ5LWxpa2UgdGhlbWUgbGF5ZXIKICoKICogUlVMRVM6CiAqIC0gRG8gTk9UIGhhcmRjb2RlIGEgY3VzdG9tIHBhbGV0dGU7IHVzZSBleGlzdGluZyBDb21meVVJIENTUyB2YXJpYWJsZXMgdmlhIHZhciguLi4pLgogKiAtIEtlZXAgZXZlcnl0aGluZyBzY29wZWQgdW5kZXIgYC5tanItYXNzZXRzLW1hbmFnZXJgIHRvIGF2b2lkIGxlYWtpbmcgc3R5bGVzIHRvIENvbWZ5VUkgKGV4Y2VwdCBgLm1qci1wb3BvdmVyKmAgd2hpY2ggY2FuIGJlIHBvcnRhbGVkIHRvIGBkb2N1bWVudC5ib2R5YCkuCiAqLwoKLm1qci1hc3NldHMtbWFuYWdlciB7CiAgICAvKiBUeXBvZ3JhcGh5ICovCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qCiAgICAgKiBTdXJmYWNlcyAtIHByaW9yaXR5OiBDb21meVVJIHYxLjQyIGRlc2lnbi1zeXN0ZW0gdG9rZW4gLT4gbGVnYWN5IHRva2VuIC0+IGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkgLSB1c2UgQ29tZnlVSSBkZXNpZ24tc3lzdGVtIHJhZGl1cyB0b2tlbnMgd2hlbiBhdmFpbGFibGUgKi8KICAgIC0tbWpyLXItc206IHZhcigtLXJhZGl1cy1zbSwgOHB4KTsKICAgIC0tbWpyLXItbWQ6IHZhcigtLXJhZGl1cy1tZCwgMTBweCk7CiAgICAtLW1qci1yLWxnOiB2YXIoLS1yYWRpdXMtbGcsIDEycHgpOwoKICAgIC8qIFNwYWNpbmcgKi8KICAgIC0tbWpyLXBhZC1zbTogOHB4OwogICAgLS1tanItcGFkLW1kOiAxMnB4OwogICAgLS1tanItcGFkLWxnOiAxNnB4OwoKICAgIC8qIFNlbWFudGljIFN0YXR1cyBDb2xvcnMgLSBwcmVmZXIgQ29tZnlVSSB2MS40MiBzZW1hbnRpYyB0b2tlbnMgKi8KICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1zdWNjZXNzLWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci1zdGF0dXMtd2FybmluZzogdmFyKC0td2FybmluZy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItc3RhdHVzLWVycm9yOiB2YXIoLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKICAgIC0tbWpyLXN0YXR1cy1pbmZvOiB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMyk7CiAgICAtLW1qci1zdGF0dXMtbmV1dHJhbDogdmFyKC0tY29tZnktc3RhdHVzLW5ldXRyYWwsICM5ZTllOWUpOwogICAgLS1tanItc3Rhci1hY3RpdmU6ICNmZmQ0NWE7CgogICAgLyogQmFkZ2UgY29sb3JzIChvdmVycmlkZGVuIGJ5IHNldHRpbmdzKSAqLwogICAgLS1tanItYmFkZ2UtaW1hZ2U6ICMyMTk2ZjM7CiAgICAtLW1qci1iYWRnZS12aWRlbzogIzljMjdiMDsKICAgIC0tbWpyLWJhZGdlLWF1ZGlvOiAjZmY5ODAwOwogICAgLS1tanItYmFkZ2UtbW9kZWwzZDogIzRjYWY1MDsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjM2QzZDNkKTsKICAgIC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgIzRhOTBlMik7CiAgICAtLW1qci1yYXRpbmctY29sb3I6ICNmZjk1MDA7CiAgICAtLW1qci10YWctY29sb3I6ICM0YTkwZTI7Cn0KCi8qIE1ha2UgdGhlIHRoZW1lIHZpc2libHkgYXBwbHkgZXZlbiB3aXRoIGlubGluZSBzdHlsZXMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIubWpyLWFtLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXIgewogICAgcGFkZGluZzogMTRweCAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIHJvdy1nYXA6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItbGVmdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWhlYWRlci10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYnMgewogICAgLyogUXVldWUtbGlrZSB0YWJzIChhY3RpdmUgcGlsbCwgb3RoZXJzIGFzIHRleHQpICovCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBnYXA6IDEwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjUlLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiLmlzLWFjdGl2ZSB7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItY29udGV4dC1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItcG9wb3Zlci1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24gLSB0ZWFsIGdsb3cgd2hlbiB2aWV3ZXIgaXMgb3BlbiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIHsKICAgIGNvbG9yOiAjNGRkOWMwOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC4xKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDc3LCAyMTcsIDE5MiwgMC4yNSk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZnYtYnRuLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWJ0biB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWhhcy11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzIlLCB2YXIoLS1tanItYWNjZW50KSAxMSUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVzc2FnZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICByaWdodDogLTZweDsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykpOwogICAgYmFja2dyb3VuZDogI2VmNTM1MDsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46ZGlzYWJsZWQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1haS1jb250cm9sOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgOTIlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkIC5tanItYWktY29udHJvbDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIHsKICAgIG9wYWNpdHk6IDAuNTg7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIC5tanItYWktY29udHJvbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIGJ1dHRvbiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogUG9wb3ZlcnMgY2FuIGJlIG1vdmVkIHRvIGBkb2N1bWVudC5ib2R5YCAocG9ydGFsKSB0byBhdm9pZCBiZWluZyBjbGlwcGVkLiAqLwoubWpyLXBvcG92ZXIgewogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdmFyKAogICAgICAgICAgICAtLWZvbnQtaW50ZXIsCiAgICAgICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgICAgIHN5c3RlbS11aSwKICAgICAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICAgICAgUm9ib3RvLAogICAgICAgICAgICBBcmlhbCwKICAgICAgICAgICAgc2Fucy1zZXJpZgogICAgICAgICkKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpKTsKCiAgICAvKiBQcm92aWRlIGZhbGxiYWNrcyB3aGVuIG91dHNpZGUgYC5tanItYXNzZXRzLW1hbmFnZXJgIHNjb3BlICovCiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgLS1tanItcG9wb3Zlci16LWluZGV4OiAyMTQ3NDgzNjQ3OwoKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aWR0aDogbWluKDI4MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXBvcG92ZXItLWhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMzQwcHg7CiAgICB3aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1zb3J0LXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIHdpZHRoOiBtaW4oMjYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzQwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVycy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlcnMtZW1wdHkgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3BlbiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE5MCwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMSkpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3Blbjpob3ZlciwKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1vcGVuOmZvY3VzLXZpc2libGUgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0NSwgMjA1LCAyNTUsIDAuNCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDgwLCAxNDAsIDI1NSwgMC4xOCksIHJnYmEoMzIsIDEwMCwgMjAwLCAwLjE0KSk7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItbGFiZWwgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXBhdGggewogICAgZmxleDogMCAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuNjg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItdW5waW4gewogICAgd2lkdGg6IDQycHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgOTUsIDk1LCAwLjM1KTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KSwgcmdiYSgxNjAsIDIwLCAyMCwgMC4xMikpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXVucGluIC5waSB7CiAgICBvcGFjaXR5OiAwLjg4OwogICAgY29sb3I6IHJnYmEoMjU1LCAxMzAsIDEzMCwgMC45Nik7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiAtIHVucmVhZCBpbmRpY2F0b3IgZG90ICovCi5tanItdGFiLXVucmVhZC1kb3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBIaXN0b3J5IHBhbmVsICovCi5tanItbWVzc2FnZXMtaGlzdG9yeS1wYW5lbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWhpc3RvcnktaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDRweCAwIDZweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWhpc3RvcnktaGVhZC1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgb3BhY2l0eTogMC42MjsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvcGFjaXR5OiAwLjcyOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTIlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaGlzdG9yeS1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwp9CgoubWpyLWhpc3RvcnktaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXdhcm5pbmcgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YwYjg1YSA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0taWNvbiB7CiAgICBmbGV4LXNocmluazogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNvbnRlbnQgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1tc2cgewogICAgb3BhY2l0eTogMC45MjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvcGFjaXR5OiAwLjk2OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWRldGFpbCB7CiAgICBvcGFjaXR5OiAwLjg0OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGltZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBvcGFjaXR5OiAwLjUyOwp9CgoubWpyLWhpc3RvcnktaXRlbS1jaGlwIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzY7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbjpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1zdW1tYXJ5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuNzQ7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1iYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MtZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDcyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikpCiAgICApOwp9CgoubWpyLXNob3J0Y3V0LWd1aWRlIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKfQoKLm1qci1zaG9ydGN1dC1ndWlkZS1pbnRybyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIG9wYWNpdHk6IDAuODQ7Cn0KCi5tanItc2hvcnRjdXQtc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg0JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSkgODglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItc2hvcnRjdXQtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItc2hvcnRjdXQtcm93IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxMzJweCwgMTYwcHgpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7Cn0KCi5tanItc2hvcnRjdXQta2V5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzOCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTAlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9CgoubWpyLXNob3J0Y3V0LWRlc2MgewogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgewogICAgLm1qci1zaG9ydGN1dC1yb3cgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItc2hvcnRjdXQta2V5IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCAxMHB4OwogICAgcGFkZGluZzogNHB4IDJweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWxlZnQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWtpY2tlciB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDllbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDY1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXN1YnRpdGxlIHsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjIlLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zdGFjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWFjdGl2ZS1jb3VudCB7CiAgICBtaW4td2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2xlYXItYWxsIHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3ctLTNjb2wgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItcm93LS0zY29sIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBncmlkLWNvbHVtbjogMSAvIC0xOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA3MCUsIHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cCB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiB2YXIoLS1tanItYWNjZW50LCAjN2FhMmZmKTsKICAgIHBhZGRpbmc6IDEwcHggMCA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtLWNvcmUgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzU2YThmZjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tbWVkaWEgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzM1ZDA4YjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tdGltZSB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiAjZjBiODRmOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRvZ2dsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgMTBweDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogMnB4IDRweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDYyJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRpdGxlOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBmbGV4OiAwIDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudCk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtY2hldnJvbiB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDc4JSwgdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtYm9keSB7CiAgICBwYWRkaW5nLXRvcDogNHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWNhcmQgewogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHRyYW5zcGFyZW50KSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCB0cmFuc3BhcmVudCkKICAgICk7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZDpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZC0tYWdlbmRhIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICNmMGI4NGYgOSUsIHZhcigtLW1qci1zdXJmYWNlLTIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCB0cmFuc3BhcmVudCkKICAgICk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bm90KC5pcy1vcGVuKSB7CiAgICBwYWRkaW5nLWJvdHRvbTogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwOm5vdCguaXMtb3BlbikgLm1qci1maWx0ZXItZ3JvdXAtdG9nZ2xlIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA0NDBweCkgewogICAgLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgfQoKICAgIC5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZC1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYiB7CiAgICAtLW1qci1icmVhZGNydW1iLWFjY2VudDogIzU2YThmZjsKICAgIC0tbWpyLWJyZWFkY3J1bWItY3VycmVudDogIzM1ZDA4YjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgbWFyZ2luOiAxcHggMCAzcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgMjIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA5JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWIuaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA0MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDc4JSwgI2ZmZmZmZik7CiAgICBmb250OiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uOmRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNTg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYi1hY3Rpb246bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA2MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudCB7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA3NiUsICNmZmZmZmYpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlZ21lbnQ6bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudC5pcy1jdXJyZW50LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudDpkaXNhYmxlZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAxNCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItY3VycmVudCkgNzQlLCAjZmZmZmZmKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlcGFyYXRvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgNTglLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MikpKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZHVwLWFsZXJ0IHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICM1NTUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2VlZSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLyogU2Nyb2xsYmFycyAobWF0Y2ggQ29tZnlVSSBmZWVsKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpIHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jdXN0b20tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgovKiBDYXJkIE1ldGFkYXRhIENvbG9ycyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBjb2xvcjogI2ZmYTcyNjsgLyogT3JhbmdlIGZvciBkdXJhdGlvbiAqLwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtcmVzIHsKICAgIGNvbG9yOiAjNGZjM2Y3OyAvKiBMaWdodCBCbHVlIGZvciByZXNvbHV0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kYXRlIHsKICAgIGNvbG9yOiAjYjlmNmNhOyAvKiBQYWxlIEdyZWVuIGZvciBkYXRlICovCiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtdGltZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgNnB4IDA7CiAgICBwYWRkaW5nOiAwIDAgNHB4IDA7CiAgICBtaW4taGVpZ2h0OiAxNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktcmlnaHQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jb250ZXh0LXBpbGxzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgcm93LWdhcDogNHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDNweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLW1qci1hY2NlbnQpIDEwJSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMC41cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1pbi1oZWlnaHQ6IDIycHg7CiAgICBtYXgtd2lkdGg6IDIyMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDc1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDUwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTQlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC10ZXh0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvcGFjaXR5OiAwLjkyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXggewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwteDpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLW1qci1hY2NlbnQpIDEwJSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGhlaWdodDogMS43NXJlbTsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsIHJnYmEoMCwgMCwgMCwgMC4yNSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItcG9wb3Zlci1hbmNob3IgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLWFnZW5kYS1pbnB1dCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGNvbG9yIDAuMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4ycyBlYXNlOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZmlsbGVkIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA2MCUKICAgICk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDgwJSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoubWpyLWFnZW5kYS1pbnB1dC5tanItYWdlbmRhLWVtcHR5IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NSUsIHRyYW5zcGFyZW50IDE1JSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KCi5tanItYWdlbmRhLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtY2FsZW5kYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFnZW5kYS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1hZ2VuZGEtbW9udGggewogICAgZmxleDogMTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtbmF2IHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0KCi5tanItYWdlbmRhLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItYWdlbmRhLXdlZWtkYXkgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5IHsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hZ2VuZGEtZGF5LWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNXB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICNlNTM5MzU7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAjZTUzOTM1IDY1JSwgI2ZmZmZmZiAzNSUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFnZW5kYS1kYXk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDUlCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDUlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5OmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1ibGFuayB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1oYXMtYXNzZXRzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDgyJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4CiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDU1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFnZW5kYS1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFnZW5kYS1jbGVhciwKLm1qci1hZ2VuZGEtcmVmcmVzaCB7CiAgICBmbGV4OiAxOwp9CgoubWpyLW1lbnUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItcHJpbWUtbWVudS1saXN0LAoubWpyLXNvcnQtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtIl0sCi5tanItcHJpbWUtbWVudS1saXN0IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXByaW1lLW1lbnUgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbWNvbnRlbnQiXSB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZW51LWl0ZW0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW06aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVudS1pdGVtOmFjdGl2ZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtLWxhYmVsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBmbGV4OiAwIDAgMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW0gLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItY29sbGVjdGlvbnMtbWVudSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIC5waSB7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1tZW51LWl0ZW0taGludCB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDYyJSwgdmFyKC0tbWpyLW11dGVkKSk7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2stLXZpc2libGUsCi5tanItbWVudS1pdGVtLmlzLWFjdGl2ZSAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1lbnUtZGl2aWRlciB7CiAgICBoZWlnaHQ6IDFweDsKICAgIG1hcmdpbjogNHB4IDA7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbXV0ZWQgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1zdGF0ZS1ibG9jayB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgYm9yZGVyOiAxcHggZGFzaGVkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zdGF0ZS1ibG9jay5pcy1lcnJvciwKLm1qci1jb250ZXh0LW1lbnUtbm90ZS5pcy1lcnJvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDgyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY29sbGVjdGlvbi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiA0OHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXZpcnR1YWwtbGlzdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLWRlbGV0ZS1idG4gewogICAgd2lkdGg6IDQycHg7CiAgICBmbGV4OiAwIDAgNDJweDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA2NSUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDQ1JSk7Cn0KCi5tanItZGVsZXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA0MCUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDY1JSk7Cn0KCi5tanItZGVsZXRlLWJ0biAucGkgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweCAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG9wYWNpdHk6IDAuODg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDcyJSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tY3lhbiB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzglLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tdmlvbGV0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLWhpbnQgewogICAgcGFkZGluZzogMCAxMHB4IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDU1JSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydCwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgewogICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0IC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICNjNDhkZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydDpob3Zlcjpub3QoOmRpc2FibGVkKSwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXI6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXRodW1icyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAzcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1jbHVzdGVyLXRodW1iIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItaW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNsdXN0ZXItbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1jbHVzdGVyLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTglLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1jbHVzdGVyLWNyZWF0ZS1idG4gewogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtaWNvbiAucGkgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbCAubWpyLWlucHV0IHsKICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGw6Zm9jdXMtd2l0aGluIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBtYXJnaW4tdG9wOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwp9CgovKiBHcmlkIGxheW91dCAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogQXZvaWQgb3ZlcmZsb3cgd2hlbiB0aGUgcGFuZWwgYmVjb21lcyBuYXJyb3dlciB0aGFuIHRoZSBtaW4gY2FyZCBzaXplICovCiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgKICAgICAgICBhdXRvLWZpbGwsCiAgICAgICAgbWlubWF4KG1pbigxMDAlLCB2YXIoLS1tanItZ3JpZC1taW4tc2l6ZSwgMTgwcHgpKSwgMWZyKQogICAgKTsKICAgIGdhcDogdmFyKC0tbWpyLWdyaWQtZ2FwLCAxMHB4KTsKICAgIG1hcmdpbi10b3A6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIENhcmQgc2VsZWN0aW9uICsgZm9jdXMgKGtlZXBzIGEgdmlzaWJsZSBpbmRpY2F0b3Igd2hlbiBzaWRlYmFyIGlzIG9wZW4pICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgLyogc2NhbGUoMC45NykgaW5zdGVhZCBvZiAwLjkyOiBzdWJ0bGUgaW5zZXQgZmVlbCB3aXRob3V0IHRoZSBhZ2dyZXNzaXZlCiAgICAgICBzaHJpbmsgdGhhdCBjYXVzZWQgYSB2aXNpYmxlIGJsaW5rIG9uIHJhcGlkIHNlbGVjdGlvbiBjaGFuZ2VzLiAqLwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NykgIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwOwp9CgpAa2V5ZnJhbWVzIG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIHsKICAgIDAlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgb3BhY2l0eTogMC4zNDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1OCUpOwogICAgICAgIG9wYWNpdHk6IDAuMTg7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgewogICAgMCUsCiAgICAxMDAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjM0KSwKICAgICAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgMXB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC41MiksCiAgICAgICAgICAgIDAgMCAwIDRweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMTIpLAogICAgICAgICAgICAwIDEycHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gewogICAgYW5pbWF0aW9uOiBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSAxLjlzIGVhc2UtaW4tb3V0IGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1wbGFjZWhvbGRlci13YXNoIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAtOCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTE1ZGVnLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwKSAwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMC4wOCkgMzAlLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgNTAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjEyKSA3MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIDIuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNnB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDEyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43OCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWxpdmUtcGlsbC1kb3QgewogICAgd2lkdGg6IDdweDsKICAgIGhlaWdodDogN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiAjNzZkNmZmOwogICAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xNik7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItbGl2ZS1wbGFjZWhvbGRlcj0idHJ1ZSJdIC5tanItYXNzZXQtc3RhdHVzLWRvdCB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi8qIEdyaWQgbG9hZGluZyBvdmVybGF5ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLWxvYWRpbmctb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzAwMCAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjNweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxheW91dCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTMycHgsIDFmcikpOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZC1za2VsZXRvbi1jYXJkIHsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOTIsIDE5OCwgMjA2LCAwLjIpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIC8qIG1pbi1oZWlnaHQgcmVtb3ZlZDogVnVlIHNrZWxldG9uQ2FyZFN0eWxlIHNldHMgYW4gZXhwbGljaXQgaGVpZ2h0IGRlcml2ZWQKICAgICAgIGZyb20gZXN0aW1hdGVSb3dIZWlnaHQuIEEgY29uZmxpY3RpbmcgbWluLWhlaWdodCBjYXVzZWQgc2tlbGV0b24gY2FyZHMgdG8KICAgICAgIGJlIHRhbGxlciB0aGFuIHRoZSBhY3R1YWwgY2FyZHMgdGhleSByZXBsYWNlLCBjYXVzaW5nIGEgbGF5b3V0IGp1bXAgd2hlbgogICAgICAgYXNzZXRzIGZpcnN0IGxvYWQuICovCiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICByZ2JhKDE1NiwgMTYyLCAxNzEsIDAuNTIpIDAlLAogICAgICAgIHJnYmEoMjIwLCAyMjUsIDIzMiwgMC43MikgNDUlLAogICAgICAgIHJnYmEoMTU2LCAxNjIsIDE3MSwgMC41MikgMTAwJQogICAgKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMjQwJSAxMDAlOwogICAgYW5pbWF0aW9uOiBtanItZ3JpZC1za2VsZXRvbi1zaGltbWVyIDEuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZC1za2VsZXRvbi1saW5lIHsKICAgIGhlaWdodDogMTBweDsKICAgIG1hcmdpbjogOHB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgcmdiYSgxNjQsIDE3MCwgMTc5LCAwLjQ4KSAwJSwKICAgICAgICByZ2JhKDIxNCwgMjE5LCAyMjYsIDAuNykgNDUlLAogICAgICAgIHJnYmEoMTY0LCAxNzAsIDE3OSwgMC40OCkgMTAwJQogICAgKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMjQwJSAxMDAlOwogICAgYW5pbWF0aW9uOiBtanItZ3JpZC1za2VsZXRvbi1zaGltbWVyIDEuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZC1za2VsZXRvbi1saW5lLS10aXRsZSB7CiAgICB3aWR0aDogNzIlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZC1za2VsZXRvbi1saW5lLS1tZXRhIHsKICAgIHdpZHRoOiA0OCU7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgpAa2V5ZnJhbWVzIG1qci1za2VsZXRvbi1zaGltbWVyIHsKICAgIDAlIHsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMjAlIDA7CiAgICB9CiAgICAxMDAlIHsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTIwJSAwOwogICAgfQp9CgpAa2V5ZnJhbWVzIG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMDAlIDA7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgewogICAgd2lsbC1jaGFuZ2U6IGJhY2tncm91bmQtcG9zaXRpb247Cn0KCi8qIEdlbmVyaWMgaGVhZGluZ3MgaW5zaWRlIHBhbmVsICovCi5tanItYXNzZXRzLW1hbmFnZXIgaDMsCi5tanItYXNzZXRzLW1hbmFnZXIgaDQgewogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgovKiBQYW5lbHMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBhbmVsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICBib3gtc2hhZG93OiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtYm94LXNoYWRvdywgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKfQoKLyogVG9vbGJhciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IHZhcigtLW1qci1wYWQtbWQpOwp9CgovKiBCdXR0b25zICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTQlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItc3RhdHVzLXNjYW4gewogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKSAxNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItc3RhdHVzLXNjYW46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLWNvbG9yKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKSAyNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItc3RhdHVzLXNjYW46Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLXN0YXR1cy1jb2xvcik7CiAgICBvdXRsaW5lLW9mZnNldDogMnB4Owp9CgovKiBJbnB1dHMgLyBzZWxlY3RzICh1c2VkIGluc2lkZSBwb3J0YWxlZCBwb3BvdmVycyB0b28pICovCi5tanItaW5wdXQsCi5tanItc2VsZWN0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3QgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsIHJnYmEoMCwgMCwgMCwgMC4yNSkpOwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDgwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWlucHV0OmZvY3VzLAoubWpyLXNlbGVjdDpmb2N1cywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0OmZvY3VzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1pbnB1dCwKLm1qci1zZWxlY3QsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdCB7CiAgICAvKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIGlmIHByZXNlbnQgKi8KICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsIHJnYmEoMCwgMCwgMCwgMC4yNSkpOwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgcGFkZGluZzogOHB4IDEwcHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgbWluLWhlaWdodDogMzRweDsKICAgIHBhZGRpbmc6IDAgOXB4OwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3RbZGF0YS1wLWRpc2FibGVkPSJ0cnVlIl0gewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgW2RhdGEtcGMtc2VjdGlvbj0ibGFiZWwiXSB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IFtkYXRhLXBjLXNlY3Rpb249ImRyb3Bkb3duIl0gewogICAgZmxleDogMCAwIGF1dG87CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxOHB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCB7CiAgICBtaW4td2lkdGg6IHZhcigtLXAtc2VsZWN0LW92ZXJsYXktd2lkdGgsIDEycmVtKTsKICAgIG1heC13aWR0aDogbWluKDMyMHB4LCBjYWxjKDEwMHZ3IC0gMzJweCkpOwogICAgbWF4LWhlaWdodDogbWluKDMyMHB4LCBjYWxjKDEwMHZoIC0gMzJweCkpOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBwYWRkaW5nOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzgpOwogICAgei1pbmRleDogY2FsYyh2YXIoLS1tanItcG9wb3Zlci16LWluZGV4LCAyMTQ3NDgzNjQ3KSArIDEpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ibGlzdCJdIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwogICAgbGlzdC1zdHlsZTogbm9uZTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Im9wdGlvbiJdIHsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLW1qci1yLW1kKSAtIDJweCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS4yNTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXTpob3ZlciwKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXAtaGlnaGxpZ2h0PSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9CgovKiBUYWJzOiBvdmVycmlkZGVuIGFib3ZlIHdpdGggcXVldWUtbGlrZSBzdHlsZSAqLwoKLyogUmVtb3ZlZCByZWR1bmRhbnQgdGFiIGRlY2xhcmF0aW9ucyB0aGF0IHdlcmUgdXNpbmcgIWltcG9ydGFudCAqLwoKLyogTXV0ZWQgdGV4dCBoZWxwZXIgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW11dGVkIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwp9CgovKiBHcmlkICsgY2FyZHMgKG92ZXJyaWRlIGlubGluZSBzdHlsZXMgZnJvbSBDYXJkLmpzKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyICNtanItYXNzZXRzLWdyaWQgewogICAgZ2FwOiAxMHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcikgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKSAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2UgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWpyLWNhcmQtaG92ZXItY29sb3IpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDhweCAyMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSkgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgaW1nLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCB2aWRlbywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iLW1lZGlhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgb2JqZWN0LWZpdDogY292ZXIgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgd2lkdGg6IDEwMCU7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDE0cHggMTJweCAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAxOCUgMjAlLCByZ2JhKDc4LCAxODQsIDI1NSwgMC4zMiksIHRyYW5zcGFyZW50IDM4JSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4OCUgNzIlLCByZ2JhKDgyLCAyMjAsIDE1NiwgMC4yNCksIHRyYW5zcGFyZW50IDQyJSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxOCwgMjYsIDM2LCAwLjk4KSwgcmdiYSg4LCAxMiwgMTgsIDAuOTgpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLmhhcy1wb3N0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi5oYXMtcG9zdGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSg0LCA2LCAxMCwgMC4yOCksIHJnYmEoNCwgNiwgMTAsIDAuODYpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA0MiUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIpLCB0cmFuc3BhcmVudCA1NCUpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBzYXR1cmF0ZSgxLjEpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IHNhdHVyYXRlKDEuMSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1oZWFkLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItaWNvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLWljb24gewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1raW5kLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWIta2luZCB7CiAgICBtYXgtd2lkdGg6IDYycHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMyk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtIHsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiA0MnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogY2xhbXAoMnB4LCAyLjIlLCA1cHgpOwogICAgcGFkZGluZzogNHB4IDA7CiAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDAgNHB4IDE0cHggcmdiYSgwLCAwLCAwLCAwLjM0KSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSBzcGFuLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItd2F2ZWZvcm0gc3BhbiB7CiAgICB3aWR0aDogM3B4OwogICAgbWluLXdpZHRoOiAycHg7CiAgICBtYXgtd2lkdGg6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk4KSwgcmdiYSgxNjAsIDIyNCwgMjU1LCAwLjcyKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1tZXRhLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItbWV0YSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjYyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXRpdGxlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItc3VidGl0bGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1zdWJ0aXRsZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA2NTA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDdweDsKICAgIHBhZGRpbmc6IDE0cHggMTJweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg0NywgNTgsIDc2LCAwLjk0KSwgcmdiYSgxOCwgMjMsIDMyLCAwLjk4KSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAzMCUgMjUlLCByZ2JhKDc4LCAxODQsIDI1NSwgMC4yMiksIHRyYW5zcGFyZW50IDQyJSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNzIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXRodW1iLm1qci10aHVtYi13b3JrZmxvdywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci10aHVtYi5tanItdGh1bWItd29ya2Zsb3cgewogICAgYXNwZWN0LXJhdGlvOiAxLjA4IC8gMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy1jYXJkLWFjdGlvbnMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctY2FyZC1hY3Rpb25zIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogN3B4OwogICAgcmlnaHQ6IDdweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgZ2FwOiA0cHg7CiAgICB6LWluZGV4OiAxMjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy1hY3Rpb24tYnRuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4gewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgbWluLXdpZHRoOiAyNHB4OwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogcmdiYSg4LCAxMiwgMTgsIDAuNTgpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDNweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigzcHgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG46aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI5LCA0MCwgNTgsIDAuNzgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4uaXMtYWN0aXZlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4uaXMtYWN0aXZlIHsKICAgIGNvbG9yOiAjZmZkNDVhOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjEyLCA5MCwgMC43KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYiAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIgLnBpIHsKICAgIGZvbnQtc2l6ZTogMS43NXJlbTsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtdGh1bWJuYWlsIHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHRyYW5zcGFyZW50IDI0JSwgcmdiYSgwLCAwLCAwLCAwLjI4KSA1OCUsIHJnYmEoMCwgMCwgMCwgMC43OCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCg5MGRlZywgcmdiYSgwLCAwLCAwLCAwLjM0KSwgdHJhbnNwYXJlbnQgMzQlLCB0cmFuc3BhcmVudCA2NiUsIHJnYmEoMCwgMCwgMCwgMC4zNCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXRodW1iLW1lZGlhLm1qci13b3JrZmxvdy1ncmFwaC1tYXAtcHJldmlldywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci10aHVtYi1tZWRpYS5tanItd29ya2Zsb3ctZ3JhcGgtbWFwLXByZXZpZXcgewogICAgb2JqZWN0LWZpdDogY292ZXIgIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNDY7CiAgICBmaWx0ZXI6IHNhdHVyYXRlKDAuNzUpIGNvbnRyYXN0KDAuODIpIGJyaWdodG5lc3MoMC43KTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDgsIDEwLCAxNCwgMC4zKSwgcmdiYSg4LCAxMCwgMTQsIDAuODIpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA0MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC42OCkgNzIlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlIHsKICAgIHBhZGRpbmc6IDJweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgLnBpIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAucGkgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEuMTVyZW07CiAgICBvcGFjaXR5OiAwLjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDAuODRyZW07CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDEuMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBmb250LXNpemU6IDAuNjhyZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSBzcGFuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbiwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy10YXNrLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctc3ViZ3JhcGhzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctc3ViZ3JhcGhzIHsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW46bnRoLWNoaWxkKG4gKyA0KSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW46bnRoLWNoaWxkKG4gKyA0KSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIHsKICAgIHBhZGRpbmc6IDdweCA5cHggIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtZmlsZW5hbWUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIG1hcmdpbi1ib3R0b206IDNweCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjc4cmVtICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4xNSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtbWV0YS1yb3cgewogICAgZm9udC1zaXplOiAwLjcycmVtICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjc0ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93IC5tanItbWV0YS13b3JrZmxvdy10YXNrLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdyAubWpyLW1ldGEtd29ya2Zsb3ctdGFzayB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LW1pc3NpbmctY2hpcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1taXNzaW5nLWNoaXAsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1taXNzaW5nLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctbWlzc2luZyB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTkwLCA2NiwgMC4yOCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIzNiwgMTgwLCAwLjk4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyMDYsIDEwMSwgMC40NSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3IgewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgbWFyZ2luOiAwIDAgOHB4OwogICAgcGFkZGluZzogNXB4IDlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNDIpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDEzNWRlZywKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4yMiksCiAgICAgICAgICAgIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuMDgpCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNmZmYpIDkyJSwgdHJhbnNwYXJlbnQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udDogaW5oZXJpdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvcjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNjYpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDEzNWRlZywKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4zKSwKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4xMikKICAgICAgICApLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvcjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjU1KTsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0wIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDk1LCAxNzksIDI1NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTEgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogNTUsIDIxMSwgMTU2Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtMiB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAyNDYsIDE3NywgNzU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0zIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDIzOCwgMTA0LCAxMzY7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC00IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDE1NywgMTMyLCAyMzg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC01IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDcxLCAxOTcsIDIyMjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTYgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMTQ5LCAyMDcsIDgxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtNyB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAyNDIsIDEzMCwgNzg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItY2hldnJvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGNvbG9yOiByZ2IodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSkpOwogICAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4xNCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItY2hldnJvbiA+IC5waSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci10aXRsZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYmFja2Ryb3AgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgaW5zZXQ6IDA7CiAgICB6LWluZGV4OiA5OTk5OTk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cgewogICAgd2lkdGg6IG1pbig5MjBweCwgOTZ2dyk7CiAgICBtYXgtaGVpZ2h0OiBtaW4oNzYwcHgsIDkydmgpOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMTQxOCkgOTYlLCAjMDAwKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKICAgIGJveC1zaGFkb3c6IDAgMThweCA2MHB4IHJnYmEoMCwgMCwgMCwgMC40OCk7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1kaWFsb2cgewogICAgd2lkdGg6IG1pbig1NjBweCwgOTZ2dyk7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxNHB4IDE4cHggNHB4Owp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBsYWJlbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBsYWJlbC5pcy13aWRlIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHNwYW4gewogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC42NCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzUwOwogICAgbGV0dGVyLXNwYWNpbmc6IC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gaW5wdXQsCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHNlbGVjdCwKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gdGV4dGFyZWEgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjI2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOTIpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gdGV4dGFyZWEgewogICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgIG1pbi1oZWlnaHQ6IDk2cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWhlYWRlciwKLm1qci13b3JrZmxvdy1waWNrZXItZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMTJweCAxNHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZm9vdGVyIHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyLWJvdHRvbTogMDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGl0bGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA5cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmb250LXdlaWdodDogODAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1pY29uLWJ0biwKLm1qci13b3JrZmxvdy1waWNrZXItYnRuIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyNTI4MmQpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDMycHg7CiAgICBwYWRkaW5nOiAwIDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG4uaXMtcHJpbWFyeSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSg3NywgMTcxLCAyNDcsIDAuMjIpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG46ZGlzYWJsZWQgewogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNvdXJjZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA4cHggMTRweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsICNhZWIzYmQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNvdXJjZSBzdHJvbmcgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMTgwcHgsIDFmcikgcmVwZWF0KDMsIG1pbm1heCgxMTBweCwgMTUwcHgpKTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweCAxNHB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cuaXMtYXNzZXQtbW9kZSAubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDE4MHB4LCAxZnIpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2gsCi5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMxNzFhMWYpIDkyJSwgIzAwMCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjVmNSk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMCAxMHB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2ggaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7CiAgICBib3JkZXI6IDA7CiAgICBvdXRsaW5lOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogaW5oZXJpdDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciBzZWxlY3QgewogICAgcGFkZGluZzogMCA4cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJvZHkgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4taGVpZ2h0OiAyNjBweDsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDE4MHB4LCAxZnIpKTsKICAgIGFsaWduLWNvbnRlbnQ6IHN0YXJ0OwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMCAxNHB4IDE0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDY4cHggbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4taGVpZ2h0OiA4NHB4OwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMTcxYTFmKSA5MiUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZGlhbG9nLmlzLWFzc2V0LW1vZGUgLm1qci13b3JrZmxvdy1waWNrZXItY2FyZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDc2cHggbWlubWF4KDAsIDFmcik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQ6aG92ZXIsCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQuaXMtc2VsZWN0ZWQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAxNzEsIDI0NywgMC43Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAxNzEsIDI0NywgMC4xMik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXRodW1iIHsKICAgIHdpZHRoOiA2OHB4OwogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGh1bWIgaW1nIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY292ZXI7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzdHJvbmcsCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzcGFuLAoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc21hbGwgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHN0cm9uZyB7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzcGFuLAoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc21hbGwgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWVtcHR5IHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICBwYWRkaW5nOiAzMnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWVtcHR5LmlzLWVycm9yIHsKICAgIGNvbG9yOiAjZmZiNGI0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHsKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLWJhY2tkcm9wIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgfQoKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIH0KCiAgICAubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2ggewogICAgICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICB9Cn0KCi8qIEtlZXAgZ2VuZXJhdGlvbi10aW1lIGJhZGdlIHBpbm5lZCB0byB0aGUgdGh1bWJuYWlsIGNvcm5lciBhY3Jvc3MgZ3JpZC9mZWVkIHZhcmlhbnRzLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLWdlbnRpbWUtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAycHggNnB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIHRleHQtc2hhZG93OgogICAgICAgIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuOSksCiAgICAgICAgMCAwIDEwcHggY29sb3ItbWl4KGluIHNyZ2IsIGN1cnJlbnRDb2xvciAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTsKfQoKLyogS2VlcCByYXRpbmcvdGFncyBiYWRnZXMgYW5jaG9yZWQuIERvIG5vdCBmb3JjZSBkaXNwbGF5IGhlcmUgc28gZ3JpZCB2aXNpYmlsaXR5IHRvZ2dsZXMgc3RpbGwgY29udHJvbCBzaG93L2hpZGUuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItcmF0aW5nLWJhZGdlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgPiAubWpyLXJhdGluZy1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHRvcDogNnB4ICFpbXBvcnRhbnQ7CiAgICByaWdodDogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBib3R0b206IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIHRleHQtc2hhZG93OiAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjJzIGVhc2Utb3V0Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLXRhZ3MtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItdGFncy1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIGxlZnQ6IDZweCAhaW1wb3J0YW50OwogICAgYm90dG9tOiA2cHggIWltcG9ydGFudDsKICAgIHJpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgZm9udC1zaXplOiA5cHg7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDU2cHgpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIGFuaW1hdGlvbjogbWpyLWZhZGUtaW4gMC4ycyBlYXNlLW91dDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iLXBsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMjhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICB0ZXh0LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLCAwLCAwLCAwLjcpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7Cn0KCi8qIC0tLSBIb3ZlciBpbmZvIG92ZXJsYXkgKHBvc2l0aXZlIHByb21wdCArIGdlbiB0aW1lKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTbGlkZXMgdXAgZnJvbSB0aGUgYm90dG9tIG9mIC5tanItdGh1bWIgb24gY2FyZCBob3Zlci4KICAgcG9pbnRlci1ldmVudHM6IG5vbmUgIC0+IG5ldmVyIGJsb2NrcyB2aWRlbyBtb3VzZWVudGVyIC8gcGxheS1vbi1ob3Zlci4KICAgei1pbmRleDogMiAgICAgICAgICAgLT4gc2l0cyBhYm92ZSB0aGUgdGh1bWJuYWlsIGltYWdlLCBiZWxvdyB0aGUgcGxheSBpY29uLgogICBDb250cm9sbGVkIGJ5IHRoZSAubWpyLXNob3ctaG92ZXItaW5mbyBjbGFzcyBvbiB0aGUgZ3JpZCBjb250YWluZXIsIHdoaWNoCiAgIGlzIHRvZ2dsZWQgdmlhIHRoZSAiU2hvdyBwcm9tcHQgb24gaG92ZXIiIHNldHRpbmcuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHBhZGRpbmc6IDIycHggOHB4IDdweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHRyYW5zcGFyZW50IDAlLCByZ2JhKDAsIDAsIDAsIDAuNzgpIDEwMCUpOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDVweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMTUwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMTUwbXMgZWFzZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAzcHg7CiAgICB6LWluZGV4OiAyOwp9Ci8qIE9ubHkgcmV2ZWFsIG9uIGhvdmVyIHdoZW4gdGhlIHNldHRpbmcgaXMgZW5hYmxlZCAoY2xhc3Mgb24gZ3JpZCBjb250YWluZXIpICovCi5tanItZ3JpZC5tanItc2hvdy1ob3Zlci1pbmZvIC5tanItY2FyZDpob3ZlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gLm1qci1ob3Zlci1wcm9tcHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwogICAgLXdlYmtpdC1saW5lLWNsYW1wOiAyOwogICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvcGFjaXR5OiAwLjk7CiAgICBmb250LXNpemU6IDkuNXB4Owp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gLm1qci1ob3Zlci1nZW50aW1lIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjEwLCAxMjAsIDAuOTUpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKfQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwbXM7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgfQp9CgovKiAtLS0gQ2FyZCBkZXRhaWxzIHBhbmVsIHNob3cvaGlkZSB2aWEgZ3JpZCBjb250YWluZXIgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLQogICAubWpyLXNob3ctZGV0YWlscyBpcyB0b2dnbGVkIGJ5IGFwcGx5R3JpZFNldHRpbmdzQ2xhc3NlcygpIHdoZW4gdGhlCiAgICJTaG93IG1ldGFkYXRhIHBhbmVsIiBzZXR0aW5nIGNoYW5nZXMuICBEZWZhdWx0ID0gT0ZGIOKGkiBwYW5lbCBoaWRkZW4uCiAgIEhpZGluZyBoZXJlIGtlZXBzIGFjdHVhbCByb3cgaGVpZ2h0ID0gZXN0aW1hdGVSb3dIZWlnaHQobWV0YUhlaWdodD0wKSwKICAgcHJldmVudGluZyB0aGUgdmlydHVhbGl6ZXIgZnJvbSByZXBvc2l0aW9uaW5nIGFsbCByb3dzIG9uIG1lYXN1cmUKICAgKHdoaWNoIHdhcyB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgInJlbG9hZCBpbXByZXNzaW9uIiBibGluaykuCiAgIE1hdGNoIHRoZSBib3R0b20tZmVlZCBwYXR0ZXJuIGF0IC5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLm1qci1zaG93LWRldGFpbHMgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLW1ldGEgewogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1hcmdpbi1ib3R0b206IDJweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZGV0YWlscyB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBvcGFjaXR5OiAwLjg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWZpbGVuYW1lLXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLyogUmF0aW5nICYgVGFncyBFZGl0b3JzICovCkBrZXlmcmFtZXMgZmFkZUluIHsKICAgIGZyb20gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgfQp9Ci8qKgogKiBBcmNoaXZlZCBDU1MgU3R5bGVzIC0gUmF0aW5nIGFuZCBUYWdzCiAqIFRoZXNlIHN0eWxlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGVtZS1jb21meS5jc3MKICovCgovKiBBbmltYXRpb25zICovCkBrZXlmcmFtZXMgc2xpZGVJblJpZ2h0IHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgfQogICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgfQp9CgovKiBQb3BvdmVycyAqLwoubWpyLXJhdGluZy1wb3BvdmVyLAoubWpyLXRhZ3MtcG9wb3ZlciB7CiAgICBhbmltYXRpb246IGZhZGVJbiAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi8qIFJhdGluZyBFZGl0b3IgKi8KLm1qci1yYXRpbmctZWRpdG9yIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogMnB4Owp9CgoubWpyLXJhdGluZy1zdGFyIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBmb250LXNpemU6IDIwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1yYXRpbmctc3Rhcjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbWZ5LW1lbnUtc2Vjb25kYXJ5LWJnLCAjMzMzKSA2NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWVkaXRvciAubWpyLXJhdGluZy1zdGFyOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWZvY3VzLW91dGxpbmUtY29sb3IsICM0ZGFiZjcpOwogICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSkgIWltcG9ydGFudDsKfQoKLyogVGFncyBFZGl0b3IgKi8KLm1qci10YWdzLWVkaXRvciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIG1pbi13aWR0aDogMjUwcHg7CiAgICBtYXgtd2lkdGg6IG1pbigzNTBweCwgY2FsYygxMDB2dyAtIDIwcHgpKTsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0Owp9CgoubWpyLXRhZ3MtZWRpdG9yLmlzLWRpc2FibGVkIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZ3MtZGlzcGxheSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAzMnB4Owp9CgoubWpyLXRhZ3MtZW1wdHkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5tanItdGFnLWNoaXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI0JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDQwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItdGFnLWNoaXAtcmVtb3ZlIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG9wYWNpdHk6IDAuNzsKfQoKLm1qci10YWctY2hpcC1yZW1vdmU6ZGlzYWJsZWQgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLXRhZ3MtaW5wdXQtd3JhcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdGFnLWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci10YWctaW5wdXQ6Zm9jdXMgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFnLWNoaXA6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDM0JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtZHJvcGRvd24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMDAlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgbWFyZ2luLXRvcDogNHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBtYXgtaGVpZ2h0OiAxNTBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICB6LWluZGV4OiAxMDAwOwp9CgoubWpyLXRhZ3MtZHJvcGRvd24gW2RhdGEtcGMtc2VjdGlvbj0ibGlzdCJdIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXRhZ3MtZHJvcGRvd24gW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKfQoKLm1qci10YWctc3VnZ2VzdGlvbiB7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLXRhZy1jb2xvcik7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5tanItdGFnLXN1Z2dlc3Rpb24uaXMtYWN0aXZlLAoubWpyLXRhZy1zdWdnZXN0aW9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSAyOCUsIHRyYW5zcGFyZW50KSAhaW1wb3J0YW50Owp9CgovKiBCYWRnZXMgSW50ZXJhY3RpdmUgKi8KLm1qci1yYXRpbmctYmFkZ2UsCi5tanItdGFncy1iYWRnZSB7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgoubWpyLXJhdGluZy1iYWRnZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXJhdGluZy1jb2xvcikgIWltcG9ydGFudDsKfQoKLm1qci10YWdzLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXJhdGluZy1iYWRnZTpob3ZlciwKLm1qci10YWdzLWJhZGdlOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNSk7CiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjUpOwp9CgovKiBTY3JvbGxiYXIgZm9yIHRhZ3MgZHJvcGRvd24gKi8KLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNnB4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgovKiBTaWRlYmFyIChjYW4gYmUgbGVmdCBvciByaWdodCkgKi8KLm1qci1zaWRlYmFyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDM7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS13cmFwIHsKICAgIG1hcmdpbjogMCAwIDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODIlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCwgOHB4KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlIHsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZWFlYWVhKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLXNjcm9sbCB7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDJweCA0cHggNnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtbGlzdCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtY29udGVudCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSwgNnB4KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtY29udGVudDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS10b2dnbGUgewogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjQpKTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZVtkYXRhLXAtbGVhZj0idHJ1ZSJdIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLm1qci13b3JrZmxvdy10cmVlLWljb24gewogICAgd2lkdGg6IDhweDsKICAgIGZsZXg6IDAgMCA4cHg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcwJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiA3cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1sYWJlbCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxIDEgYXV0bzsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS10eXBlIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW11dGVkKSA3NSUsIHZhcigtLWNvbnRlbnQtZmcpKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItc2lkZWJhci5pcy1vcGVuIHsKICAgIC8qIEJvcmRlciBpcyBzZXQgZHluYW1pY2FsbHkgYmFzZWQgb24gcG9zaXRpb24gKi8KfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1oZWFkZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMyk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogOHB4Owp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwp9CgovKiBDdXN0b20gUm9vdHMgUG9wb3ZlciBTdHlsaW5nICovCi5tanItY3VzdG9tLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAzMDBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHotaW5kZXg6IHZhcigtLW1qci1wb3BvdmVyLXotaW5kZXgpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItcm93Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItbGFiZWwgewogICAgd2lkdGg6IDYwcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1zZWxlY3QgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0biB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG46bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tcmlnaHQ6IDA7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG4ubWpyLXByaW1hcnk6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI1JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbiB7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLXNlY3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpICFpbXBvcnRhbnQ7Cn0KCi8qIElubGluZSBTaWRlYmFyICh3aWR0aC1iYXNlZCB0cmFuc2l0aW9ucyBsaWtlIGFyY2hpdmVkIHZlcnNpb24pICovCi5tanItaW5saW5lLXNpZGViYXIgewogICAgd2lkdGg6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDQ4MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHdpZHRoIDAuM3MgZWFzZSwKICAgICAgICBtaW4td2lkdGggMC4zcyBlYXNlOwp9CgoubWpyLWlubGluZS1zaWRlYmFyLmlzLW9wZW4gewogICAgd2lkdGg6IDQwMHB4OwogICAgbWluLXdpZHRoOiAyNjBweDsKfQoKLyogU3BhY2UgYmV0d2VlbiBzaWRlYmFyIGFuZCBncmlkICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1icm93c2UgewogICAgZ2FwOiAwOwp9CgovKiBCb3JkZXIgYmFzZWQgb24gcG9zaXRpb24gKi8KLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJsZWZ0Il0gewogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItaW5saW5lLXNpZGViYXJbZGF0YS1wb3NpdGlvbj0icmlnaHQiXSB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgovKiBTaWRlYmFyIHBsYWNlaG9sZGVyICovCi5tanItc2lkZWJhci1wbGFjZWhvbGRlciB7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgpAa2V5ZnJhbWVzIG1qci1mYWRlLWluIHsKICAgIGZyb20gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk5NSk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgfQp9CgoKLyogTmF0aXZlIGRyb3Bkb3duczogaGludCBkYXJrIFVJIGFuZCBzdHlsZSBvcHRpb25zIHdoZW4gdGhlIGJyb3dzZXIgYWxsb3dzIGl0LiAqLwoKLyogPT09PT09PT09PSBDdXN0b20gVmlkZW8gQ29udHJvbHMgKG5vIG5hdGl2ZSBiYXIpID09PT09PT09PT0gKi8KCi5tanItdmlkZW8tY29udHJvbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTJweDsKICAgIHJpZ2h0OiAxMnB4OwogICAgYm90dG9tOiAxMnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICBvcGFjaXR5OiAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICB6LWluZGV4OiA1Owp9CgovKiBTaG93IGNvbnRyb2xzIG9uIGhvdmVyL2ZvY3VzICh2aWV3ZXIpLiAqLwoubWpyLXZpZGVvLWNvbnRyb2xzOmZvY3VzLXdpdGhpbiB7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi8qIFByZXZpZXc6IGtlZXAgY29udHJvbHMgdmlzaWJsZSBiZWNhdXNlIHRoZSBhcmVhIGlzIHNtYWxsLiAqLwoubWpyLXZpZGVvLWNvbnRyb2xzLS1wcmV2aWV3IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMTBweDsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogMTBweDsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IGF1dG87CiAgICBiYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogbm9uZTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biB7CiAgICB3aWR0aDogMzhweDsKICAgIGhlaWdodDogMzhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi8qIDAuLkluOiB0cmltbWVkLW91dCByYW5nZS4gKi8KCi8qIEluLi5PdXQ6IHNlbGVjdGVkIHBsYXliYWNrIHJhbmdlIGhpZ2hsaWdodC4gKi8KCi8qIE91dC4uRW5kOiBzaG93IG91dC1vZi1yYW5nZSBmcmFtZXMgYXMgYSBkaWZmZXJlbnQgY29sb3IuICovCgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwIHsKICAgIGNvbG9yOiAjZjVjNTQyOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lIHsKICAgIGNvbG9yOiAjNWRhOWZmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlIHsKICAgIGNvbG9yOiAjZmY1ZjVmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyIHsKICAgIGNvbG9yOiAjNWZkMzhkOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE5NywgNjYsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSg5MywgMTY5LCAyNTUsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDk1LCA5NSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAyMTEsIDE0MSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQgewogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWNvbnRleHQtbWVudS1zZXBhcmF0b3IgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXItY29sb3IpOwogICAgbWFyZ2luOiA0cHggMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0LAoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0IHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWFyZ2luLWxlZnQ6IDE2cHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMC44MjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaGludCB7CiAgICBvcGFjaXR5OiAwLjU4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc3VibWVudS1hcnJvdyB7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYWRkLXRvLWNvbGxlY3Rpb24tbWVudSB7CiAgICBtaW4td2lkdGg6IDI2MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7Cn0KCi5tanItY29udGV4dC1tZW51LXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxNHB4IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItY29udGV4dC1tZW51LW5vdGUgewogICAgcGFkZGluZzogMTBweCAxNHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA3MiUsIHZhcigtLW1qci1tdXRlZCkpOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7Cn0KCi5tanItZ3JpZC1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMjUwcHg7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDE2cHgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci12aWRlby1jb250cm9scywKICAgIC5tanItY29udGV4dC1tZW51IHsKICAgICAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIE1ham9vciBGbG9hdGluZyBWaWV3ZXIgKE1GVikgLSBwb3J0YWxlZCB0byBkb2N1bWVudC5ib2R5CiAgIFJlZGVjbGFyZXMgQ1NTIHZhcmlhYmxlcyBzbyB0aGUgcGFuZWwgd29ya3Mgb3V0c2lkZSAubWpyLWFzc2V0cy1tYW5hZ2VyCiAgIChzYW1lIHBhdHRlcm4gYXMgLm1qci1wb3BvdmVyKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLm1qci1tZnYgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1jb250ZW50LWJnLCAjMWUxZTFlKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWNvbWZ5LW1lbnUtc2Vjb25kYXJ5LWJnLCAjMzMzKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpOwogICAgLS1tanItc3RhdHVzLXN1Y2Nlc3M6IHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKTsKCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgIC8qIFZpc3VhbCBjaHJvbWUgKi8KICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLW1mdiAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCmh0bWwubWpyLW1mdi1wb3BvdXQtZG9jdW1lbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIDEyMDBweCA0MjBweCBhdCA1MCUgMCUsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJSwKICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50CiAgICAgICAgICAgICksCiAgICAgICAgICAgIHRyYW5zcGFyZW50IDYyJQogICAgICAgICksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgdmFyKC0tY29udGVudC1iZywgIzE2MTkxZikpIDgyJSwKICAgICAgICAgICAgICAgICMwMDAgMTglCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMWYyMjI3KSkgODQlLAogICAgICAgICAgICAgICAgIzAwMCAxNiUKICAgICAgICAgICAgKQogICAgICAgICk7Cn0KCmJvZHkubWpyLW1mdi1wb3BvdXQtYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKI21qci1tZnYtcG9wb3V0LXJvb3QsCi5tanItbWZ2LXBvcG91dC1yb290IHsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLyogLS0gSGVhZGVyIChkcmFnIGhhbmRsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGN1cnNvcjogbW92ZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7Cn0KCi5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgb3BhY2l0eTogMC43ODsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGZsZXg6IDE7CiAgICBsZXR0ZXItc3BhY2luZzogMC4yOHB4Owp9CgovKiAtLSBUb29sYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LXRvb2xiYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNTAlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA1MCUpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwp9Ci5tanItbWZ2LXRvb2xiYXI6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VwIHsKICAgIHdpZHRoOiAxcHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYm9yZGVyKTsKICAgIG1hcmdpbjogMCAzcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGhlaWdodDogMjJweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3MiUsICMwMDAgMjglKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy5pcy1jbGlja2FibGUgewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLW1mdi1wcm9ncmVzcy5pcy1jbGlja2FibGU6aG92ZXIgewogICAgZmlsdGVyOiBicmlnaHRuZXNzKDEuMDMpOwp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHdpZHRoOiAwJTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDcwbXMgZWFzZS1pbi1vdXQ7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tbm9kZXMgewogICAgdG9wOiAwOwogICAgaGVpZ2h0OiA1MCU7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2OCUsICMwYjM1MTMgMzIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICB0b3A6IDUwJTsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY0JSwgIzBiMjM0MCAzNiUpOwp9CgoubWpyLW1mdi1wcm9ncmVzcy5pcy1lcnJvciAubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzLAoubWpyLW1mdi1wcm9ncmVzcy5pcy1lcnJvciAubWpyLW1mdi1wcm9ncmVzcy1iYXItLXN0ZXBzIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZDk1MzRmIDc4JSwgIzRhMTQxNCAyMiUpOwp9CgoubWpyLW1mdi1wcm9ncmVzcy1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSwgcmdiYSgwLCAwLCAwLCAwLjE4KSk7CiAgICBtaXgtYmxlbmQtbW9kZTogc2NyZWVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItbWZ2LXByb2dyZXNzLXRleHQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgaGVpZ2h0OiAxMDAlOwogICAgcGFkZGluZzogMCA4cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC1zaGFkb3c6IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjkpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci1tZnYtcGluLWdyb3VwIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDJweDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoubWpyLW1mdi1waW4tYnRuIHsKICAgIHdpZHRoOiAyNnB4OwogICAgaGVpZ2h0OiAyNnB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMTIwbXMgZWFzZTsKfQoubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwp9Ci5tanItbWZ2LXBpbi1idG4uaXMtcGlubmVkIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMiUpOwogICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQyJSwgdmFyKC0tbWpyLWFjY2VudCkgNTglKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KTsKfQoKLyogLS0gUGluIGdyb3VwOiBub3cgYSBkcm9wZG93biBtZW51IChkaXNwbGF5Om5vbmUgYnkgZGVmYXVsdCwgZmxleCB3aGVuIC5pcy1vcGVuKSAtLSAqLwoubWpyLW1mdi1waW4tZ3JvdXAgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogY2FsYygxMDAlICsgNHB4KTsKICAgIGxlZnQ6IDA7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIG1pbi13aWR0aDogNzBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KLm1qci1tZnYtcGluLWdyb3VwLmlzLW9wZW4gewogICAgZGlzcGxheTogZmxleDsKfQoubWpyLW1mdi1waW4tYnRuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9Ci5tanItbWZ2LXBpbi1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2LXBpbi1idG4uaXMtcGlubmVkIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDQyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNTglKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiAtLSBJY29uIERyb3Bkb3duIGNvbXBvbmVudCAoLm1qci1tZnYtaWRyb3ApIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1pZHJvcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1tZnYtaWRyb3AtbWVudSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgei1pbmRleDogMTAwMTA7CiAgICBtaW4td2lkdGg6IDExMHB4OwogICAgcGFkZGluZzogNHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLm1qci1tZnYtaWRyb3AtbWVudS5pcy1vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItbWZ2LWlkcm9wLWl0ZW0gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xcyBlYXNlOwp9Ci5tanItbWZ2LWlkcm9wLWl0ZW06aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtLmlzLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE2KTsKICAgIGNvbG9yOiAjYThkOGZmOwp9Ci5tanItbWZ2LWlkcm9wLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMikgIWltcG9ydGFudDsKfQovKiBDaGFubmVsIHRyaWdnZXI6IHNsaWdodGx5IHdpZGVyIHRvIGZpdCAiUkdCIiAqLwoubWpyLW1mdi1jaC1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi8qIFRvb2xiYXIgaWNvbi1idXR0b24gcG9wb3ZlcnMgKGNoYW5uZWwsIGd1aWRlcywgcGluLCBmb3JtYXQgLSBzb3J0LXN0eWxlIGNvbnRleHQgbWVudXMpICovCi5tanItbWZ2LWNoLXBvcG92ZXIsCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLAoubWpyLW1mdi1waW4tcG9wb3ZlciwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbWluLXdpZHRoOiAxMjBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgei1pbmRleDogMTAwMTA7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItbWZ2LWNoLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZ3VpZGVzLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtcGluLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKfQovKiBUb29sYmFyIGljb24gaW1hZ2VzIC0gY2ggaWNvbiBpcyBibGFjayAoaW52ZXJ0ZWQpLCBndWlkZXMgaWNvbiBpcyBuYXRpdmUgd2hpdGUgKi8KLm1qci1tZnYtY2gtaWNvbiB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIGZpbHRlcjogaW52ZXJ0KDEpOwogICAgb3BhY2l0eTogMC44NTsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Ci5tanItbWZ2LWd1aWRlcy1pY29uIHsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgb3BhY2l0eTogMC44NTsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Ci5tanItbWZ2LWNoLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1ndWlkZXMtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LXBpbi10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtZm9ybWF0LXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMikgIWltcG9ydGFudDsKfQovKiBQaW4gc2xvdCBhY3RpdmUgc3RhdGUgKi8KLm1qci1tZnYtcGluLXBvcG92ZXIgLm1qci1tZW51LWl0ZW0uaXMtcGlubmVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE2KTsKICAgIGNvbG9yOiAjYThkOGZmOwp9Ci5tanItbWZ2LXBpbi1wb3BvdmVyIC5tanItbWVudS1pdGVtLmlzLXBpbm5lZCAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7Cn0KLyogRm9ybWF0IHBvcG92ZXI6IHNlcGFyYXRvciArIG9wYWNpdHkgc2xpZGVyIHJvdyAqLwoubWpyLW1mdi1mb3JtYXQtc2VwIHsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpKTsKICAgIG1hcmdpbjogNHB4IDJweDsKfQoubWpyLW1mdi1mb3JtYXQtc2xpZGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweCAycHg7Cn0KLm1qci1tZnYtZm9ybWF0LXNsaWRlci1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBvcGFjaXR5OiAwLjY1OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9Ci5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIGlucHV0W3R5cGU9InJhbmdlIl0gewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogNzBweDsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgb3BhY2l0eTogMC42NTsKICAgIG1pbi13aWR0aDogMzBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4gewogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDdweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgZmxleC1zaHJpbms6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMTIwbXMgZWFzZTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC45Owp9CgovKiBVbml2ZXJzYWwgYWN0aXZlIGhpZ2hsaWdodCAtIGFueSBhcmlhLXByZXNzZWQ9InRydWUiIGJ1dHRvbiBnZXRzIGFjY2VudCBnbG93LgogICBQbGFjZWQgYmVmb3JlIHRoZSBjb2xvcmVkIGFjdGl2ZSBjbGFzc2VzIHNvIHRoZXkgY2FuIG92ZXJyaWRlIHdpdGggdGhlaXIgb3duIGNvbG9yLiAqLwoubWpyLW1mdiAubWpyLWljb24tYnRuW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5NSwgMTc5LCAyNTUsIDAuNTUpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMTUlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjUlLCB0cmFuc3BhcmVudCk7Cn0KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAxMiUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDI1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcHJldmlldy1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSAxMiUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcHJldmlldy1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwKICAgICAgICB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDEyJQogICAgKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbm9kZXN0cmVhbS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi8qIFBvcC1pbiBtb2RlICh2aWV3ZXIgcG9wcGVkIG91dCk6IHJhaXNlIGJ1dHRvbiBjb250cmFzdC9icmlnaHRuZXNzICovCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLAogICAgICAgIDAgMjRweCA1NnB4IHJnYmEoMCwgMCwgMCwgMC40Mik7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1oZWFkZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTAlLCByZ2JhKDAsIDAsIDAsIDAuMjQpKQogICAgKTsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyLXRpdGxlIHsKICAgIG9wYWNpdHk6IDAuOTg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXRvb2xiYXItc2VwIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCkpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtcHJvZ3Jlc3MgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMGExMTE4IDE4JSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDkyJSwgIzAwMCA4JSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzLXRleHQgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtY29udGVudCB7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudCgKICAgICAgICAgICAgY2lyY2xlIGF0IHRvcCwKICAgICAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDEwJSwgdHJhbnNwYXJlbnQpIDAlLAogICAgICAgICAgICB0cmFuc3BhcmVudCA0MiUKICAgICAgICApLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4MiUsICMwMDAgMTglKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTIlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHZhcigtLW1qci1hY2NlbnQpIDQyJSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDYyJSwgdmFyKC0tbWpyLWFjY2VudCkgMzglKQogICAgKTsKICAgIGNvbG9yOiAjZjRmOGZmICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIC5waSB7CiAgICBvcGFjaXR5OiAxOwogICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCAjZmZmZmZmIDQwJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDc2LCAxNzUsIDgwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTgpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5tanItbm9kZXN0cmVhbS1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNjIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAzNiUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDY0JSkKICAgICk7CiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksCiAgICAgICAgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoMjU1LCAxNTIsIDAsIDAuMTgpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtcGluLWJ0biB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgOTIlLCAjZmZmZmZmIDglKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTIlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NiUsIHZhcigtLW1qci1hY2NlbnQpIDQ0JSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDY0JSwgdmFyKC0tbWpyLWFjY2VudCkgMzYlKQogICAgKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4uaXMtcGlubmVkIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmY7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTQlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDFweCAwIDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1yaWdodC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDgyJSwgdmFyKC0tbWpyLW11dGVkKSAxOCUpOwogICAgb3BhY2l0eTogMC44ODsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZSB7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDApKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDE4MGRlZywKICAgICAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDg2JSwgdmFyKC0tbWpyLWFjY2VudCkgMTQlKSwKICAgICAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDg2JSwgcmdiYSgwLCAwLCAwLCAwLjE0KSkKICAgICAgICApOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtd2lkZ2V0LWxhYmVsLAoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWVtcHR5LAoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1ub2RlLWVtcHR5IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW11dGVkKSA4NCUsICNmZmZmZmYgMTYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3MtaW5wdXQgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDc0JSwgIzA1MDcwYSAyNiUpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3MtaW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDEwJSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1wb3Bpbi1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDUlLCB2YXIoLS1tanItYWNjZW50KSA1NSUpOwogICAgY29sb3I6ICNlZWY3ZmY7Cn0KCi8qIC0tIENvbnRlbnQgd3JhcHBlciAoaG9yaXpvbnRhbCBmbGV4OiBjb250ZW50ICsgc2lkZWJhcikgLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7Cn0KCi8qIC0tIFNpZGViYXIgcG9zaXRpb24gdmFyaWFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGhlaWdodCAwLjJzIGVhc2UsCiAgICAgICAgd2lkdGggMHM7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhci5vcGVuIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAyMjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgIG1heC1oZWlnaHQ6IDY1JTsKfQoKLyogLS0gQ29udGVudCBhcmVhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4OiAwIDAgMzIwcHg7CiAgICB3aWR0aDogMzIwcHg7CiAgICBtaW4td2lkdGg6IDIxMHB4OwogICAgbWF4LXdpZHRoOiBtaW4oNDIlLCA0MjBweCk7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgcGFkZGluZzogMTBweDsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAxOCwgMjAsIDAuOTYpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44OCk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLm9wZW4gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci1tZnYtZ2VuLXNpZGViYXIgewogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yaWdodDogbm9uZTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGZsZXg6IDAgMCBjbGFtcCgxOTBweCwgMzIlLCAyODBweCk7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC1oZWlnaHQ6IDQ2JTsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZy10b3A6IDhweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICBwYWRkaW5nLXRvcDogMDsKICAgIGJvcmRlci10b3A6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXIub3BlbiB7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLXRpdGxlIHsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItc2VjdGlvbiB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1pbi1oZWlnaHQ6IGF1dG87CiAgICBwYWRkaW5nLXRvcDogNHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItaGVhZGluZyB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGNvbHVtbnM6IDMgMTcwcHg7CiAgICBjb2x1bW4tZ2FwOiAxMHB4OwogICAgY29sdW1uLWZpbGw6IGJhbGFuY2U7CiAgICBtaW4taGVpZ2h0OiBhdXRvOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcmZsb3cteTogdmlzaWJsZTsKICAgIHBhZGRpbmctcmlnaHQ6IDJweDsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiAqIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBicmVhay1pbnNpZGU6IGF2b2lkOwogICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogMDsKICAgIG1hcmdpbi1ibG9jazogMCAxMHB4Owp9CgoubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjQyKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjE2KSwgcmdiYSg3NiwgMTc1LCA4MCwgMC4xKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjEyKSBpbnNldDsKICAgIGN1cnNvcjogY29weTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE2cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE2cyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi10aW1lLWJhZGdlIHsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtdmFsdWUgewogICAgY29sb3I6ICNlMGZmN2E7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKfQoKLm1qci1tZnYtZ2VuLWNhcmQgewogICAgLS1tanItbWZ2LWdlbi1hY2NlbnQ6ICMyMTk2ZjM7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDQ1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDEzNWRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSAxNiUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpIDEwMCUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTQlLCB0cmFuc3BhcmVudCkgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZCB7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgcGFkZGluZzogMTBweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1wb3NpdGl2ZS1wcm9tcHQsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tbmVnYXRpdmUtcHJvbXB0LAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXByb21wdCB7CiAgICBtaW4taGVpZ2h0OiAxMTBweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS13b3JrZmxvdyB7CiAgICBtaW4taGVpZ2h0OiA1OHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLW1vZGVsLWFuZC1sb3JhLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLW1vZGVscywKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1zYW1wbGluZywKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1nZW5lcmF0aW9uLXBpcGVsaW5lLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXRleHQtdG8taW1hZ2UsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0taW1hZ2UtdG8taW1hZ2UsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0taW5wYWludCwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS11cHNjYWxlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXJlZmluZSB7CiAgICBtaW4taGVpZ2h0OiA4NnB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGJvcmRlci13aWR0aDogMnB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTJweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IHsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgLm1qci1tZnYtZ2VuLWNhcmQtdGl0bGUsCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWZ2LWdlbi1jYXJkOmhvdmVyLAoubWpyLW1mdi1nZW4tdGltZS1iYWRnZTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQsICNlMGZmN2EpIDcwJSwgdHJhbnNwYXJlbnQpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQsICNlMGZmN2EpIDI0JSwgdHJhbnNwYXJlbnQpCiAgICAgICAgaW5zZXQ7Cn0KCi5tanItbWZ2LWdlbi1jb3B5LWZsYXNoIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzYsIDE3NSwgODAsIDAuMjgpICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXRpdGxlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKSk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwogICAgLXdlYmtpdC1saW5lLWNsYW1wOiA1OwogICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtY29tcGFjdCB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1jb21wYWN0IHsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLW11bHRpbGluZSB7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1zZWVkIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlIHsKICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBmb250LWZhbWlseTogQ29uc29sYXMsIE1vbmFjbywgbW9ub3NwYWNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICAgIGNvbG9yOiAjZmZmOwp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1maWVsZHMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1maWVsZHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDdweDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogdW5zZXQ7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWJyYW5jaC1ncm91cHMgewogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1nZW4tYnJhbmNoLWdyb3VwIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA3cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKfQoKLm1qci1tZnYtZ2VuLWJyYW5jaC10aXRsZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC42cHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLW1mdi1nZW4tZmllbGQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDc4cHgsIGF1dG8pIDFmcjsKICAgIGdhcDogMTBweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1maWVsZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg1NHB4LCBhdXRvKSBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1maWVsZC12YWx1ZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1mdi1nZW4tZmllbGQtbGFiZWwgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgxODAsIDE4MCwgMTgwLCAwLjcyKSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgoubWpyLW1mdi1nZW4tZmllbGQtdmFsdWUgewogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpKTsKICAgIG1pbi13aWR0aDogMDsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmZDQ3YTsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZDQ4Y2ZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjlmN2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhOWZmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2FmZmQ0Owp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcgewogICAgY29sb3I6ICNlMGZmN2E7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgZGl2IHsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgZGl2IHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gZGl2LAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSA+IHNlY3Rpb24gewogICAgbWFyZ2luLWJsb2NrOiAwIDEwcHg7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgZGl2Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKQGNvbnRhaW5lciAobWF4LXdpZHRoOiA3NjBweCkgewogICAgLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgewogICAgICAgIGNvbHVtbnM6IGF1dG87CiAgICAgICAgY29sdW1uLWNvdW50OiAxOwogICAgICAgIGNvbHVtbi13aWR0aDogYXV0bzsKICAgIH0KCiAgICAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSA+ICogewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgfQp9CgoubWpyLW1mdi1vdmVybGF5LWNhbnZhcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAxMjsKfQoKLm1qci1tZnYtdG9vbGJhci1zZWxlY3QgewogICAgaGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4yNCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDIpKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZSBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIHdpZHRoOiA3MnB4OwogICAgYWNjZW50LWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpOwp9CgoubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi8qIEVWIHNsaWRlciBhY3RpdmUgc3RhdGUgKHZhbHVlICE9IDApICovCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UuaXMtYWN0aXZlIGlucHV0W3R5cGU9InJhbmdlIl0gewogICAgYWNjZW50LWNvbG9yOiAjZjVjODQyOwp9Ci5tanItbWZ2LXRvb2xiYXItcmFuZ2UuaXMtYWN0aXZlIC5tanItbWZ2LXRvb2xiYXItcmFuZ2Utb3V0IHsKICAgIGNvbG9yOiAjZjVjODQyOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMHB4OwogICAgbGVmdDogMTBweDsKICAgIHotaW5kZXg6IDY7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgcGFkZGluZzogNXB4IDlweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCkpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHJnYmEoNSwgOCwgMTQsIDAuODYpIDg2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMSkgMTQlKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmN2ZhKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNHB4KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE2cyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSAwLjE2cyBlYXNlOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy5pcy12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzLmlzLWVycm9yIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IsICNmZjVjN2EpIDcyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHJnYmEoNjAsIDEwLCAxOCwgMC45KSA4MiUsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxMTEpIDE4JSk7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzLXRleHQgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi8qIC0tIFdvcmtmbG93IFNpZGViYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1zaWRlYmFyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgd2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgdHJhbnNpdGlvbjogd2lkdGggMC4ycyBlYXNlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItd3Mtc2lkZWJhci5vcGVuIHsKICAgIHdpZHRoOiAyNjBweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBtaW4td2lkdGg6IDE4MHB4OwogICAgbWF4LXdpZHRoOiA2NSU7CiAgICB0cmFuc2l0aW9uOiBub25lOwp9CgoubWpyLXdzLXNpZGViYXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7Cn0KLm1qci13cy1zaWRlYmFyLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgb3BhY2l0eTogMC42NTsKfQoubWpyLXdzLXNpZGViYXItYm9keSB7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nOiAwOwp9Ci5tanItd3Mtc2lkZWJhci1lbXB0eSB7CiAgICBwYWRkaW5nOiAyNHB4IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi8qIC0tIFRhYiBiYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3MtdGFiLWJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1zaHJpbms6IDA7CiAgICBnYXA6IDJweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwp9CgoubWpyLXdzLXRhYiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40NSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTVzLAogICAgICAgIGNvbG9yIDAuMTVzOwp9CgoubWpyLXdzLXRhYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDcpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7Cn0KCi5tanItd3MtdGFiLmlzLWFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xNSk7CiAgICBjb2xvcjogIzYzOWJmZjsKfQoKLyogLS0gTm9kZXMgdGFiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1ub2Rlcy10YWIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIEdyYXBoIE1hcCB0YWIgKi8KLm1qci13Z20gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBtaW4taGVpZ2h0OiAxMDAlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Mik7Cn0KCi5tanItd2dtLW1hcC13cmFwIHsKICAgIGhlaWdodDogMTkwcHg7CiAgICBtaW4taGVpZ2h0OiAxNTBweDsKICAgIG1hcmdpbjogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjIpOwp9CgoubWpyLXdnbS1wcmV2aWV3IHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zMik7Cn0KCi5tanItd2dtLXByZXZpZXcgLm1qci1tZnYtbWVkaWEsCi5tanItd2dtLXByZXZpZXcgLm1qci1tZnYtcGxheWVyLWhvc3QsCi5tanItd2dtLXByZXZpZXcgLm1qci1tb2RlbDNkLWhvc3QsCi5tanItd2dtLXByZXZpZXctbWVkaWEgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKfQoKLm1qci13Z20tcHJldmlldy1lbXB0eSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM0KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13Z20tY2FudmFzIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBjdXJzb3I6IGdyYWI7CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7Cn0KCi5tanItd2dtLWNhbnZhczphY3RpdmUgewogICAgY3Vyc29yOiBncmFiYmluZzsKfQoKLm1qci13Z20tLWxhcmdlIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWluLWhlaWdodDogMDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1tYXAtd3JhcCB7CiAgICBmbGV4OiAxOwogICAgaGVpZ2h0OiBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIG1hcmdpbjogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDA7Cn0KCi5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1zdGF0dXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTBweDsKICAgIHRvcDogMTBweDsKICAgIHotaW5kZXg6IDI7CiAgICBtYXgtd2lkdGg6IG1pbig0MjBweCwgY2FsYygxMDAlIC0gMjBweCkpOwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKfQoKLm1qci13Z20tdG9vbGJhciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMHB4OwogICAgdG9wOiA0NnB4OwogICAgei1pbmRleDogMjsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgZ2FwOiA2cHg7CiAgICBtYXgtd2lkdGg6IG1pbig0MjBweCwgY2FsYygxMDAlIC0gMjBweCkpOwp9CgoubWpyLXdnbS1tb2RlIHsKICAgIG1pbi1oZWlnaHQ6IDI2cHg7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItd2dtLW1vZGU6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0OSwgMTgzLCAyNTUsIDAuNDUpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbW9kZS5pcy1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEyNCwgMTg2LCAyNTUsIDAuNjIpOwogICAgYmFja2dyb3VuZDogcmdiYSg3OSwgMTIzLCAyMTQsIDAuMjYpOwogICAgY29sb3I6IHJnYmEoMjM1LCAyNDUsIDI1NSwgMC45Nik7Cn0KCi5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1kZXRhaWxzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAxMHB4OwogICAgdG9wOiAxMHB4OwogICAgYm90dG9tOiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIHdpZHRoOiBtaW4oMzIwcHgsIDM4JSk7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyMCwgMjYsIDAuODQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tYWN0aW9uIHsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7Cn0KCi5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1wYXJhbSB7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLXN0YXR1cyB7CiAgICBwYWRkaW5nOiAwIDEwcHggOHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKfQoKLm1qci13Z20tZGV0YWlscyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogMCA4cHggMTBweDsKfQoKLm1qci13Z20tbm9kZS10aXRsZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtbWV0YSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWFyZ2luLXRvcDogLTRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDIpOwogICAgZm9udC1zaXplOiAxMHB4Owp9CgoubWpyLXdnbS1icmVhZGNydW1iIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW46IC0ycHggMCAycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU4KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYi1pdGVtIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogMTQwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdnbS1icmVhZGNydW1iLXNlcCB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMyKTsKfQoKLm1qci13Z20tYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDRweDsKfQoKLm1qci13Z20tYWN0aW9uIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA3cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItd2dtLWFjdGlvbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjQ1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjEyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwp9CgoubWpyLXdnbS1hY3Rpb24uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc2LCAxNzUsIDgwLCAwLjU1KTsKICAgIGNvbG9yOiByZ2JhKDE5MCwgMjU1LCAxOTYsIDAuOTYpOwp9CgoubWpyLXdnbS1wYXJhbXMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLXRvcDogMnB4Owp9CgoubWpyLXdnbS1wYXJhbSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNjRweCwgMC40MmZyKSBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItd2dtLXBhcmFtOmhvdmVyLAoubWpyLXdnbS1wYXJhbTpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdnbS1wYXJhbS5pcy1vayB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSg3OSwgMjEwLCAxMjUsIDAuMTYpOwp9CgoubWpyLXdnbS1wYXJhbS5pcy1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCA5MCwgOTAsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0ta2V5IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ4KTsKfQoKLm1qci13Z20tcGFyYW0tdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbCB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMTE1LCAxNTUsIDI1NSwgMC44OCk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxMTUsIDE1NSwgMjU1LCAwLjIyKTsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSAzNCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0KSAxMDAlLCB0cmFuc3BhcmVudCksIHJnYmEoNDQsIDU2LCA4OCwgMC4yKSksCiAgICAgICAgcmdiYSgxMywgMTYsIDI0LCAwLjg1KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWw6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgaGVpZ2h0OiAycHg7CiAgICBtYXJnaW46IC04cHggLThweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHggNnB4IDAgMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1tb2RlbCB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMTI0LCAxODYsIDI1NSwgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDcwLCAxMjMsIDE4MSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLXNhbXBsZXIgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDE0MywgMjI4LCAxNjcsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg2NCwgMTMzLCA4OCwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLXRleHQgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDI1NSwgMTkyLCAxMTQsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxNTQsIDEwMiwgNDksIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1tZWRpYSB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMTU0LCAxNzAsIDI1NSwgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDgzLCA5MywgMTY1LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtY29udHJvbCB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMjU1LCAxMzksIDE2OSwgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDE0NSwgNzAsIDk1LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbG9naWMgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDE4OCwgMTY4LCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxMDUsIDg2LCAxNTMsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpIDI1JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLXR5cGUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiByZ2JhKDIzNiwgMjQ0LCAyNTUsIDAuOTQpOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtaWQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMTk0LCAyMTMsIDI1NSwgMC43OCk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLWNvbCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtdGl0bGUgewogICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDNweDsKfQoKLm1qci13Z20tbm9kZS1wb3J0LAoubWpyLXdnbS1ub2RlLXBvcnQtZW1wdHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDE4cHg7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNCk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1lbXB0eSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI2KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdCB7CiAgICB3aWR0aDogOHB4OwogICAgaGVpZ2h0OiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCkgaW5zZXQ7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QuaXMtaW4gewogICAgYmFja2dyb3VuZDogcmdiYSgxMzUsIDE5NiwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90LmlzLW91dCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE0NCwgMjM4LCAxNzQsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1uYW1lIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43OCk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC10eXBlIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWF4LXdpZHRoOiA0NSU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIHBhZGRpbmc6IDFweCA1cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgY29sb3I6IHJnYmEoMjI0LCAyMzYsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXRzLXRpdGxlIHsKICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40NSk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LAoubWpyLXdnbS1ub2RlLXdpZGdldC1lbXB0eSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNzBweCwgMC40MmZyKSBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0IHsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldDpob3ZlciwKLm1qci13Z20tbm9kZS13aWRnZXQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDkpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1vayB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSg3OSwgMjEwLCAxMjUsIDAuMTYpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCA5MCwgOTAsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjE2KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQtZW1wdHkgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQta2V5IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUyKTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQtdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBnYXA6IDRweDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIC5tanItd2dtLW5vZGUtd2lkZ2V0LWtleSB7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUgLm1qci13Z20tbm9kZS13aWRnZXQtdmFsdWUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBtYXgtaGVpZ2h0OiA5LjJlbTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nLXJpZ2h0OiAycHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZS5pcy10ZXh0LWZpZWxkIC5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIG1heC1oZWlnaHQ6IDE2ZW07CiAgICBsaW5lLWhlaWdodDogMS40Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC1tb3JlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDYpOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA4MjBweCkgewogICAgLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWRldGFpbHMgewogICAgICAgIHdpZHRoOiBtaW4oMzgwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKICAgIH0KCiAgICAubWpyLXdnbS1ub2RlLXBvcnRzIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KfQoKLm1qci13cy1zZWFyY2gtd3JhcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci13cy1zZWFyY2gtaWNvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXdzLXNlYXJjaCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogNHB4IDI4cHggNHB4IDI2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13cy1zZWFyY2g6OnBsYWNlaG9sZGVyIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjgpOwp9CgoubWpyLXdzLXNlYXJjaDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjUpOwp9CgoubWpyLXdzLXNlYXJjaC1jbGVhciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5tanItd3Mtc2VhcmNoLWNsZWFyOmhvdmVyIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXdzLW5vZGVzLWxpc3QgewogICAgZmxleDogMTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nOiA0cHggMDsKfQoKLm1qci13cy1ub2RlLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEycHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgIG1pbi1oZWlnaHQ6IDMycHg7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7Cn0KCi5tanItd3Mtbm9kZS1yb3c6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci13cy1ub2RlLXJvdy10eXBlIHsKICAgIGZsZXg6IDE7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc4KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItd3Mtbm9kZS1yb3ctdGl0bGUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci13cy1ub2RlLWxvY2F0ZSB7CiAgICBmbGV4LXNocmluazogMDsKICAgIHdpZHRoOiAyMnB4OwogICAgaGVpZ2h0OiAyMnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMXMsCiAgICAgICAgY29sb3IgMC4xcywKICAgICAgICBiYWNrZ3JvdW5kIDAuMXM7Cn0KCi5tanItd3Mtbm9kZS1yb3c6aG92ZXIgLm1qci13cy1ub2RlLWxvY2F0ZSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLXdzLW5vZGUtbG9jYXRlOmhvdmVyIHsKICAgIGNvbG9yOiAjNjM5YmZmOwogICAgYmFja2dyb3VuZDogcmdiYSg5OSwgMTU1LCAyNTUsIDAuMTUpOwp9CgovKiAtLSBOb2RlIHNlY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLXRyZWUtaXRlbSB7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLm1qci13cy10cmVlLWl0ZW0gPiAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoubWpyLXdzLXRyZWUtaXRlbS0tc3ViZ3JhcGggewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDQlLCB0cmFuc3BhcmVudCA5NiUpOwp9Ci5tanItd3Mtbm9kZSB7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLyogU3VidGxlIGhpZ2hsaWdodCB3aGVuIHRoaXMgbm9kZSBtYXRjaGVzIHRoZSBjdXJyZW50IGdyYXBoIHNlbGVjdGlvbi4gKi8KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDIxMCwgOTAsIDAuMDgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMnB4IDAgMCAwIHJnYmEoMjU1LCAyMTAsIDkwLCAwLjc1KTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZmZkNDVhIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgODIlKTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdHlwZSB7CiAgICBjb2xvcjogI2ZmZDQ1YTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdGl0bGUgewogICAgY29sb3I6IHJnYmEoMjU1LCAyMjQsIDEzMCwgMC44OCk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXRvZ2dsZSwKLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1sb2NhdGUsCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS1raW5kIHsKICAgIGNvbG9yOiAjZmZkNDVhOwp9Ci5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAxNHB4OwogICAgei1pbmRleDogMjsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiA0cHg7CiAgICBoZWlnaHQ6IDU2cHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE1cyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xNXMgZWFzZTsKfQoKLm1qci13cy1zaWRlYmFyLm9wZW46aG92ZXIgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLmlzLXJlc2l6aW5nIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyLmlzLWRyYWdnaW5nOjpiZWZvcmUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1zaWRlYmFyLmlzLXJlc2l6aW5nIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyOmhvdmVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyLmlzLWRyYWdnaW5nOjpiZWZvcmUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM0KTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9InJpZ2h0Il0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgcmlnaHQ6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgbGVmdDogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSA0MCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgNjAlCiAgICApOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZSAubWpyLXdzLW5vZGUtaGVhZGVyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDI4JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA3MiUKICAgICk7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlLmlzLWNvbGxhcHNlZCAubWpyLXdzLW5vZGUtaGVhZGVyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDkyJQogICAgKTsKfQoubWpyLXdzLW5vZGUtdG9nZ2xlIHsKICAgIGZsZXg6IDAgMCBhdXRvOwp9Ci5tanItd3Mtbm9kZS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMXB4Owp9Ci5tanItd3Mtbm9kZS10eXBlIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ4KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy1ub2RlLWtpbmQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogMTEwcHg7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDM4JSwgdHJhbnNwYXJlbnQgNjIlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDEyJSwgdHJhbnNwYXJlbnQgODglKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNzglLCAjZmZmZmZmIDIyJSk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLm1qci13cy1ub2RlLWtpbmQgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoubWpyLXdzLW5vZGUta2luZC1jb3VudCB7CiAgICBtaW4td2lkdGg6IDE0cHg7CiAgICBwYWRkaW5nOiAwIDNweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzZWQgLm1qci13cy1ub2RlLWJvZHkgewogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLXdzLW5vZGUtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7Cn0KLm1qci13cy1ub2RlLWVtcHR5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwYWRkaW5nOiA0cHggMDsKfQoKLyogLS0gTmVzdGVkIG5vZGVzIChpbnNpZGUgc3ViZ3JhcGhzKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLW5vZGUtLW5lc3RlZCB7CiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHJnYmEoOTEsIDEzOCwgMjQwLCAwLjM1KTsKfQoubWpyLXdzLW5vZGUtLW5lc3RlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIHBhZGRpbmctbGVmdDogMTZweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDUlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDk1JQogICAgKTsKfQoubWpyLXdzLW5vZGUtLW5lc3RlZC5pcy1jb2xsYXBzaWJsZSAubWpyLXdzLW5vZGUtaGVhZGVyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDEwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5MCUKICAgICk7Cn0KCi8qIC0tIFN1YmdyYXBoIGNoaWxkcmVuIGdyb3VwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3MtY2hpbGRyZW4tdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAyMHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgOTQlCiAgICApOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIG9wYWNpdHk6IDAuODsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzIGVhc2U7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGUtLW5lc3RlZCB7CiAgICBwYWRkaW5nLWxlZnQ6IDI4cHg7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGU6aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDEyJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSA4OCUKICAgICk7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGVbYXJpYS1leHBhbmRlZD0idHJ1ZSJdIHsKICAgIG9wYWNpdHk6IDE7Cn0KLm1qci13cy1jaGlsZHJlbiB7CiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHJnYmEoOTEsIDEzOCwgMjQwLCAwLjI1KTsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDZweDsKfQoKLm1qci13cy13aWRnZXQtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogOHB4Owp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4Owp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgLm1qci13cy13aWRnZXQtbGFiZWwgewogICAgZmxleDogbm9uZTsKICAgIHBhZGRpbmctdG9wOiAwOwp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgLm1qci13cy13aWRnZXQtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7Cn0KLm1qci13cy13aWRnZXQtbGFiZWwgewogICAgZmxleDogMCAwIDgwcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTUpKTsKICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KLm1qci13cy1pbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCAjMjIyKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9Ci5tanItd3MtaW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLXdzLXRleHRhcmVhIHsKICAgIHJlc2l6ZTogbm9uZTsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwp9Ci5tanItd3MtdGV4dC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtdGV4dC13cmFwcGVyIC5tanItd3MtdGV4dGFyZWEgewogICAgd2lkdGg6IDEwMCU7Cn0KLm1qci13cy1leHBhbmQtYnRuIHsKICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgb3BhY2l0eTogMC44Owp9Ci5tanItd3MtZXhwYW5kLWJ0bjpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KLm1qci13cy1yZWFkb25seSB7CiAgICBvcGFjaXR5OiAwLjU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KLm1qci13cy1jaGVja2JveCB7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgd2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBtYXJnaW4tdG9wOiA0cHg7Cn0KLm1qci13cy10b2dnbGUtbGFiZWwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi8qIC0tIExvY2F0ZSBidXR0b24gaW5zaWRlIG5vZGUgaGVhZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3MtbG9jYXRlIHsKICAgIHdpZHRoOiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNTsKfQoubWpyLXdzLWxvY2F0ZTpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiAtLSBSdW4gYnV0dG9uIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1ydW4tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7Cn0KLm1qci1tZnYtcnVuLWJ0biAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5ydW5uaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKfQoubWpyLW1mdi1ydW4tYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoubWpyLW1mdi1ydW4tYnRuLmVycm9yIC5waSB7CiAgICBjb2xvcjogI2Y0NDMzNjsKfQoKLm1qci1tZnYtc3RvcC1idG4gLnBpIHsKICAgIGNvbG9yOiAjZWY1MzUwOwp9Ci5tanItbWZ2LXN0b3AtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6ICNmZjhhNjU7Cn0KLm1qci1tZnYtc3RvcC1idG4uc3RvcHBpbmcgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpOwp9CgovKiAtLSBGbG9hdGluZyBWaWV3ZXIgc2ltcGxlIHZpZGVvIHBsYXllciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci5pcy1hdWRpbyB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDIwJSAyMCUsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjIpLCByZ2JhKDE4LCAyMCwgMjgsIDAuOTUpKTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1hdWRpby1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjJweDsKICAgIHRleHQtc2hhZG93OiAwIDJweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDE4cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItY29udHJvbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTJweDsKICAgIHJpZ2h0OiAxMnB4OwogICAgYm90dG9tOiAxMnB4OwogICAgei1pbmRleDogMzA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogOXB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiAxNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byB0b3AsIHJnYmEoMTAsIDEwLCAxNCwgMC43NiksIHJnYmEoMTYsIDE2LCAyNCwgMC41NSkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1yb3cgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2VlayB7CiAgICAtLW1qci1zZWVrLXBjdDogMCU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICB0byByaWdodCwKICAgICAgICAjZmYyZjUyIDAlLAogICAgICAgICNmZjJmNTIgdmFyKC0tbWpyLXNlZWstcGN0KSwKICAgICAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSAxMDAlCiAgICApOwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWs6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgYmFja2dyb3VuZDogI2ZmMmY1MjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotbW96LXJhbmdlLXRodW1iIHsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgYmFja2dyb3VuZDogI2ZmMmY1MjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gewogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuLmlzLWRpc2FibGVkLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsuaXMtZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC40NTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci10aW1lIHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWZyYW1lIHsKICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKfQoKLyogVGhlIE1GViB1c2VzIHRoZSAiLS12aWV3ZXIiIGNvbnRyb2wgdmFyaWFudCwgd2hpY2ggKHVubGlrZSAiLS12aWV3ZXJiYXIiKQogICBkb2VzIG5vdCBzaXplIHRoZSBuYXRpdmUgc2VlayBpbnB1dCBhbmQgcGFja3MgZnJhbWUvaW4vc2Vlay9vdXQvdGltZSBpbnRvIGEKICAgc2luZ2xlIHJvdy4gSW4gdGhlIG5hcnJvdyBNRlYgdGhlIHNlZWsgd3JhcCB0aGVuIGNvbGxhcHNlcyB0byB+MHB4IHdpZGUgYW5kCiAgIHRoZSBuYXRpdmUgaW5wdXQgdG8gMHB4IHRhbGwsIGxlYXZpbmcgYWxtb3N0IG5vIGNsaWNrIC8gZHJhZyB0YXJnZXQgZm9yCiAgIHNjcnViYmluZy4gR2l2ZSB0aGUgc2VlayBpdHMgb3duIGZ1bGwtd2lkdGggcm93IHdpdGggYSB1c2FibGUgaGl0IGFyZWEuICovCgovKiAtLSBTZXR0aW5ncyBidXR0b24gYWN0aXZlIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1zZXR0aW5ncy1idG4uYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNTUlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpCiAgICApOwogICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgNzAlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JQogICAgKTsKfQoubWpyLW1mdi1zZXR0aW5ncy1idG4uYWN0aXZlIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KCi8qIC0tIENsb3NlIGJ1dHRvbiAocmVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYgLm1qci1tZnYtY2xvc2UtYnRuIHsKICAgIGNvbG9yOiAjZTg1MDUwOwp9Ci5tanItbWZ2IC5tanItbWZ2LWNsb3NlLWJ0bjpob3ZlciB7CiAgICBjb2xvcjogI2ZmNmI2YjsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjMyLCA4MCwgODAsIDAuMTUpOwp9CgovKiAtLSBFbXB0eSBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWVtcHR5IHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgovKiAtLSBDb21wYXJlIGxhYmVscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU4KTsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHBhZGRpbmc6IDJweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDIwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNHB4Owp9CgoubWpyLW1mdi1sYWJlbC5sYWJlbC1sZWZ0IHsKICAgIGxlZnQ6IDhweDsKfQoubWpyLW1mdi1sYWJlbC5sYWJlbC1yaWdodCB7CiAgICByaWdodDogOHB4Owp9CgovKiAtLSBBQiBkaXZpZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWFiLWRpdmlkZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDAuNXB4OwogICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgei1pbmRleDogMTA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDAgMCAwLjVweCByZ2JhKDAsIDAsIDAsIDAuNCksCiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTAwbXMgZWFzZTsKfQoKLm1qci1tZnYtYWItZGl2aWRlcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDEycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6aG92ZXIsCi5tanItbWZ2LWFiLWRpdmlkZXI6YWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBNRlYgR2VvbWV0cnkgJiBMYXlvdXQgQ2xhc3NlcyAocmVwbGFjZXMgaW5saW5lIHN0eWxlcyBpbiBGbG9hdGluZ1ZpZXdlci5qcykKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIE1haW4gTUZWIGNvbnRhaW5lciBnZW9tZXRyeSAqLwoubWpyLW1mdiB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IHZhcigtLW1qci1tZnYtdG9wLW9mZnNldCwgNjBweCk7CiAgICByaWdodDogMjBweDsKICAgIHdpZHRoOiA2NDBweDsKICAgIGhlaWdodDogMzYwcHg7CiAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgbWluLWhlaWdodDogMTYwcHg7CiAgICAvKiBBbHdheXMgZmxleDsgdmlzaWJpbGl0eSArIG9wYWNpdHkgY29udHJvbCBzaG93L2hpZGUgc28gQ1NTIHRyYW5zaXRpb25zIHdvcmsuCiAgICAgICBwb2ludGVyLWV2ZW50czpub25lIHdoaWxlIGhpZGRlbiBwcmV2ZW50cyBhY2NpZGVudGFsIGludGVyYWN0aW9uLiAqLwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICByZXNpemU6IGJvdGg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgei1pbmRleDogMTAwMDA7CiAgICAvKiBIaWRkZW4gc3RhdGUgKi8KICAgIG9wYWNpdHk6IDA7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNnB4KSBzY2FsZSgwLjk4KTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdmlzaWJpbGl0eSAwcyBsaW5lYXIgMC4xOHM7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXJlc2l6aW5nIHsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLW1mdi5pcy12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgc2NhbGUoMSk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMThzIGVhc2Utb3V0LAogICAgICAgIHZpc2liaWxpdHkgMHMgbGluZWFyIDBzOwp9CgovKiBNZWRpYSBlbGVtZW50cyAoaW1nL3ZpZGVvKSBzaXppbmcgdmFyaWFudHMgKi8KLm1qci1tZnYtbWVkaWEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7Cn0KCi5tanItbWZ2LW1lZGlhLS1maXQtaGVpZ2h0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKfQoKLm1qci1tZnYtbWVkaWEtLWZpbGwgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwogICAgZGlzcGxheTogYmxvY2s7Cn0KCi8qIEF1ZGlvIGNhcmQgaW5zaWRlIE1GViAqLwoubWpyLW1mdi1hdWRpby1jYXJkIHsKICAgIHdpZHRoOiBtaW4oOTIlLCA1NjBweCk7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxNjBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpOwogICAgYm94LXNoYWRvdzogMCA2cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLW1mdi1hdWRpby1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LWF1ZGlvLWljb24gewogICAgY29sb3I6IHZhcigtLW1qci1iYWRnZS1hdWRpbywgI2ZmOTgwMCk7CiAgICBvcGFjaXR5OiAwLjk1Owp9CgoubWpyLW1mdi1hdWRpby10aXRsZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci1tZnYtYXVkaW8tcGxheWVyIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1mdi1zaWRlLXBhbmVsIC5tanItbWZ2LWF1ZGlvLWNhcmQsCi5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LWF1ZGlvLWNhcmQsCi5tanItbWZ2LWdyaWQtY2VsbCAubWpyLW1mdi1hdWRpby1jYXJkIHsKICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKfQoKLyogVmlkZW8gZWxlbWVudCBzcGVjaWZpYyBzdHlsZXMgKi8KLm1qci1tZnYtbWVkaWEtdmlkZW8gewogICAgLyogSW5oZXJpdHMgZnJvbSAubWpyLW1mdi1tZWRpYSBvciAubWpyLW1mdi1tZWRpYS0tZmlsbCAqLwp9CgovKiBOb2RlIFN0cmVhbSAtIGN1cnJlbnRseS1zdHJlYW1lZCBub2RlIGJhZGdlICh0b3AtbGVmdCBvZiBjb250ZW50IGFyZWEsCiAgIGZvbGxvd2luZyB0aGUgc2FtZSBvdmVybGF5IHBhdHRlcm4gYXMgLm1qci1tZnYtZ2VuaW5mbykuICovCi5tanItbWZ2LW5vZGUtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDhweDsKICAgIGxlZnQ6IDhweDsKICAgIHotaW5kZXg6IDEyOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM7CiAgICBjb2xvcjogI2U2ZjNmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEyMCwgMTcwLCAyNDAsIDAuNDUpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMTZweCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci8qIEdlbiBpbmZvIG92ZXJsYXkgLSBhbGwgbW9kZXMgc2hhcmUgYmFzZSBsYXlvdXQgKi8KLm1qci1tZnYtZ2VuaW5mbywKLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1nZW5pbmZvLWIgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi8qIEtlZXAgR2VuIEluZm8gYWJvdmUgY3VzdG9tIHNpbXBsZS1wbGF5ZXIgY29udHJvbHMgd2hlbiBwcmVzZW50LiAqLwoubWpyLW1mdi1nZW5pbmZvLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWEubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIsCi5tanItbWZ2LWdlbmluZm8tYi5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciB7CiAgICB0b3A6IDhweDsKICAgIGJvdHRvbTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbig0NSUsIGNhbGMoMTAwJSAtIDEyNHB4KSk7Cn0KCi8qIEZhbGxiYWNrOiB3aGVuIHNpbXBsZS1wbGF5ZXIgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBnZW5pbmZvIG92ZXJsYXksCiAgIG1vdmUgaXQgdXAgZXZlbiBpZiB0aGUgbW9kaWZpZXIgY2xhc3Mgd2FzIG5vdCBhdHRhY2hlZC4gKi8KLm1qci1tZnYtc2ltcGxlLXBsYXllciArIC5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLWEsCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBBQiBtb2RlIG92ZXJsYXlzIGFyZSBhdHRhY2hlZCBhdCBjb250YWluZXIgbGV2ZWw7IHNoaWZ0IHRoZW0gd2hlbiBBQiBsYXllcnMgdXNlIHNpbXBsZS1wbGF5ZXIuICovCi5tanItbWZ2LWFiLWNvbnRhaW5lcjpoYXMoLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtc2ltcGxlLXBsYXllcikgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYiB7CiAgICB0b3A6IDhweDsKICAgIGJvdHRvbTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbig0NSUsIGNhbGMoMTAwJSAtIDEyNHB4KSk7Cn0KCi8qIFNoYXJlZCBzdHlsZSBmb3IgYWxsIGdlbiBpbmZvIG92ZXJsYXkgdmFyaWFudHMgKi8KLm1qci1tZnYtZ2VuaW5mbyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7IC8qIGRlZmF1bHQgLSBvdmVycmlkZGVuIHBlciBmaWVsZCBiZWxvdyAqLwp9CgovKiBQZXItZmllbGQgbGFiZWwgY29sb3JzICovCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9IC8qIGJsdWUgICAtIFByb21wdCAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0gLyogYW1iZXIgIC0gU2VlZCAgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfSAvKiBncmVlbiAgLSBNb2RlbCAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZDQ4Y2ZmOwp9IC8qIHZpb2xldCAtIExvUkEgICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjlmN2E7Cn0gLyogb3JhbmdlIC0gU2FtcGxlciAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0gLyogcGluayAgIC0gU2NoZWR1bGVyICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhOWZmZjsKfSAvKiBpbmRpZ28gLSBDRkcgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2FmZmQ0Owp9IC8qIHRlYWwgICAtIFN0ZXAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9IC8qIGxpbWUgICAtIEdlbiBUaW1lICovCgoubWpyLW1mdi1nZW5pbmZvIGRpdiwKLm1qci1tZnYtZ2VuaW5mby1hIGRpdiwKLm1qci1tZnYtZ2VuaW5mby1iIGRpdiB7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKfQoKLm1qci1tZnYtZ2VuaW5mbyBkaXY6bGFzdC1jaGlsZCwKLm1qci1tZnYtZ2VuaW5mby1hIGRpdjpsYXN0LWNoaWxkLAoubWpyLW1mdi1nZW5pbmZvLWIgZGl2Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLyogU2ltcGxlIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LXNpbXBsZS1jb250YWluZXIgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLyogQUIgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtYWItY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6ICMwMDA7Cn0KCi8qIEFCIG1vZGUgbGF5ZXJzICovCi5tanItbWZ2LWFiLWxheWVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci1tZnYtYWItbGF5ZXItLWIgewogICAgLyogY2xpcC1wYXRoIGFwcGxpZWQgaW5saW5lIGZvciBkeW5hbWljIGRpdmlkZXIgcG9zaXRpb24gKi8KfQoKLyogU2lkZS1ieS1zaWRlIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LXNpZGUtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIFNpZGUtYnktc2lkZSBoYWxmIHBhbmVscyAqLwoubWpyLW1mdi1zaWRlLXBhbmVsIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7Cn0KCi8qIEdyaWQgY29tcGFyZSAoMi0yKSBjb250YWluZXIgKi8KLm1qci1tZnYtZ3JpZC1jb250YWluZXIgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIGdyaWQtdGVtcGxhdGUtcm93czogMWZyIDFmcjsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZ2FwOiAycHg7CiAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JpZCBjZWxscyAqLwoubWpyLW1mdi1ncmlkLWNlbGwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogMDsKfQoKLyogR2VuIGluZm8gb3ZlcmxheXMgZm9yIGdyaWQgY2VsbHMgQyBhbmQgRCAqLwoubWpyLW1mdi1nZW5pbmZvLWMsCi5tanItbWZ2LWdlbmluZm8tZCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogOHB4OwogICAgcmlnaHQ6IDhweDsKICAgIGJvdHRvbTogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGNvbG9yOiAjZmZmOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBtYXgtaGVpZ2h0OiA0MCU7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKfQoKLm1qci1tZnYtZ2VuaW5mby1jIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLyogUGVyLWZpZWxkIGxhYmVsIGNvbG9ycyBmb3IgQy9EIGdlbiBpbmZvIG92ZXJsYXlzICovCi5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmZDQ3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2RkYThhOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZDQ4Y2ZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0KCi8qIEdlbiBpbmZvIGFjdGl2ZSBzdGF0ZSAtIGJ1dHRvbiBnbG93cyB3aGVuIGF0IGxlYXN0IG9uZSBmaWVsZCBpcyBzZWxlY3RlZCAqLwoubWpyLW1mdiAubWpyLWljb24tYnRuLmlzLW9uIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50LCA5NSwgMTc5LCAyNTUpLCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLmlzLW9wZW4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNjIlLCAjZmZmZmZmIDEyJSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjI4KSwgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4uaXMtb3BlbiB7CiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50Owp9CgovKiBHZW4gaW5mbyBkcm9wZG93biBwYW5lbCAqLwoubWpyLW1mdi1nZW4tZHJvcGRvd24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgei1pbmRleDogMTAwMDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTYlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBwYWRkaW5nOiA2cHggNHB4OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjE4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpLAogICAgICAgIDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICBkaXNwbGF5OiBub25lOwogICAgbWluLXdpZHRoOiAxNTBweDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duOjpiZWZvcmUgewogICAgY29udGVudDogIkdFTiBJTkZPIjsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuOHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7CiAgICBwYWRkaW5nOiAycHggMTBweCA2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEpOwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24uaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgcGFkZGluZzogNXB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDcpOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93IGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgd2lkdGg6IDEzcHg7CiAgICBoZWlnaHQ6IDEzcHg7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIFRyYW5zZm9ybSBmb3IgcGFuL3pvb20gLSBhcHBsaWVkIGlubGluZSBmb3IgZHluYW1pYyB2YWx1ZXMgKi8KLm1qci1tZnYtbWVkaWEtLXRyYW5zZm9ybSB7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7Cn0KCi8qIEN1cnNvciBmZWVkYmFjayBmb3IgcGFuL3pvb20gaW50ZXJhY3Rpb25zICovCi5tanItbWZ2LWNvbnRlbnQtLWdyYWIgewogICAgY3Vyc29yOiBncmFiOwp9CgoubWpyLW1mdi1jb250ZW50LS1ncmFiYmluZyB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgovKiBTaWRlYmFyIHRhYiBidXR0b246IGFsbG93IDItbGluZSBsYWJlbCB2aWEgXG4gaW4gbGFiZWwgc3RyaW5nICovCi5tYWpvb3ItYXNzZXRzLXRhYi1idXR0b24gLnNpZGUtYmFyLWJ1dHRvbi1sYWJlbCB7CiAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7Cn0KCi8qIEJvdHRvbS1wYW5lbCBnZW5lcmF0ZWQgZmVlZDogY29tcGFjdCBjYXJkcyB3aXRoIG9ubHkgdGhlIGdlbmVyYXRpb24tdGltZSBwaWxsICovCi5tanItYm90dG9tLWZlZWQgewogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMTBweDsKICAgIGhlaWdodDogMTBweDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiwKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2ssCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZCB7CiAgICBnYXA6IDZweCAhaW1wb3J0YW50OwogICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgobWluKDEwMCUsIDEzMnB4KSwgMWZyKSkgIWltcG9ydGFudDsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBhbGlnbi1jb250ZW50OiBzdGFydDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkIHsKICAgIGJvcmRlci1yYWRpdXM6IDEycHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCAjMDAwIDglKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjIpICFpbXBvcnRhbnQ7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQ6aG92ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI4KSAhaW1wb3J0YW50OwoKICAgIC5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgICAgMCAwIDIwcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAgIDAgMTBweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCkgIWltcG9ydGFudDsKICAgICAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAhaW1wb3J0YW50OwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgaXNvbGF0aW9uOiBpc29sYXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxNDBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTQwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg1cHgsIDVweCkgc2NhbGUoMC45ODUpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMykpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMjAyNDJiKSA4NCUsICMwMDAgMTYlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNik7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDEwcHgsIDEwcHgpIHNjYWxlKDAuOTcpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODIlLCAjMDAwIDE4JSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKICAgIG9wYWNpdHk6IDAuNzU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHNjYWxlKDAuOTg1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTJweCwgMTJweCkgc2NhbGUoMC45Nyk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDAuOTUgLyAxICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSkgIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iLXBsYXkgewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KAogICAgICAgIGNpcmNsZSBhdCBjZW50ZXIsCiAgICAgICAgcmdiYSgwLCAwLCAwLCAwLjE4KSwKICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMDQpIDM4JSwKICAgICAgICB0cmFuc3BhcmVudCA3MCUKICAgICk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1leHQsCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1yYXRpbmcsCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS10YWdzIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45Mik7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKfQoKLyogLS0gRmVlZCBjYXJkIGluZm86IGRlZmF1bHQgaGlkZGVuLCB0b2dnbGVkIHZpYSBtanItZmVlZC1zaG93LSogY2xhc3NlcyBvbiAubWpyLWdyaWQgLS0gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiA0cHggNnB4ICFpbXBvcnRhbnQ7CiAgICBtaW4td2lkdGg6IDA7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1pbmZvIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZmlsZW5hbWUgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZmlsZW5hbWUgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZGltZW5zaW9ucyAvIGR1cmF0aW9uICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLXJlcywKLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZHVyYXRpb24gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGltZW5zaW9ucyAubWpyLW1ldGEtcmVzLAoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRpbWVuc2lvbnMgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGRhdGUvdGltZSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1kYXRlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kYXRlIC5tanItbWV0YS1kYXRlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRhdGUgLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGdlbmVyYXRpb24gdGltZSBiYWRnZSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWdlbnRpbWUgLm1qci1tZXRhLWdlbnRpbWUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCB3b3JrZmxvdyBkb3QgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtZG90LXdyYXBwZXIgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZG90IC5tanItY2FyZC1kb3Qtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleCAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGJhZGdlcyAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtZXh0IHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWJhZGdlcy1leHQgLm1qci1iYWRnZS1leHQgewogICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtcmF0aW5nIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWJhZGdlcy1yYXRpbmcgLm1qci1iYWRnZS1yYXRpbmcgewogICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtdGFncyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtdGFncyAubWpyLWJhZGdlLXRhZ3MgewogICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50Owp9CgovKiBGZWVkIG1ldGEgcm93IHN0eWxpbmcgLSBmbGV4IGxheW91dCBzbyB2aXNpYmxlIGl0ZW1zIHN0YXkgc2VwYXJhdGVkICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKICAgIGZsZXgtd3JhcDogbm93cmFwICFpbXBvcnRhbnQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7CiAgICBnYXA6IDVweCAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4zICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjc4ICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDAuOGVtICFpbXBvcnRhbnQ7CiAgICAvKiB0ZXh0LW92ZXJmbG93IGVsbGlwc2lzIGRvZXNuJ3QgYXBwbHkgb24gYSBmbGV4IGNvbnRhaW5lciBpdHNlbGYgKi8KfQovKiBFYWNoIG1ldGEgc3BhbiB0cnVuY2F0ZXMgaW5kaXZpZHVhbGx5IGlmIHRvbyBsb25nICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gc3BhbiB7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC1zaHJpbms6IDE7Cn0KLyogR2VudGltZSBiYWRnZSBhbmQgdGltZSB2YWx1ZSBzaG91bGQgc3RheSB2aXNpYmxlIChkb24ndCBzaHJpbmsgYXdheSkgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgPiAubWpyLW1ldGEtZ2VudGltZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgPiAubWpyLW1ldGEtdGltZS12YWwgewogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZ2VudGltZSAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk4KTsKICAgIHRleHQtc2hhZG93OgogICAgICAgIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuOSksCiAgICAgICAgMCAwIDEwcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKfQoKLyogLS0gQXVkaW8gLyAzRCBwbGFjZWhvbGRlciB0aHVtYm5haWxzIGluIHRoZSBmZWVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIEF1ZGlvIGNhcmRzIHNob3cgdGhlIHdhdmVmb3JtIHNwcml0ZTsgZ2l2ZSBpdCBhIGRpc3RpbmN0IGJhY2tncm91bmQgc28gaXQKICAgZG9lc24ndCBsb29rIGxpa2UgYSBicm9rZW4gaW1hZ2UgcGxhY2Vob2xkZXIgaW4gdGhlIGZlZWQuICovCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWtpbmQ9ImF1ZGlvIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJtcDMiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9IndhdiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ib2dnIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJmbGFjIl0gLm1qci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNjAlLCAjMWExZjJiIDQwJSkgIWltcG9ydGFudDsKfQoKLyogM0QgbW9kZWwgY2FyZHMgdXNlIGFuIGljb24gcGxhY2Vob2xkZXIgLSBhZGQgYSBzdWJ0bGUgZ3JhZGllbnQgc28gdGhleSByZWFkCiAgIGFzIGludGVudGlvbmFsIHJhdGhlciB0aGFuIG1pc3NpbmcuICovCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWtpbmQ9Im1vZGVsM2QiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImdsYiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZ2x0ZiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ib2JqIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJmYngiXSAubWpyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA1MCUsICMwZDExMTcgNTAlKSAhaW1wb3J0YW50Owp9CgovKiAtLSBGZWVkIGdyb3VwIGJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDM0cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWZlZWQtZ3JvdXAtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDI0LCAzNCwgMC45KTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1pY29uIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi8qIC0tIEZlZWQgZ3JvdXAgcG9wb3ZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZCB7CiAgICBwYWRkaW5nOiA0cHggOHB4IDEwcHg7CiAgICBtYXgtaGVpZ2h0OiAzNjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSkKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiwKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMSAhaW1wb3J0YW50Owp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMzRweDsKICAgIHJpZ2h0OiA2cHg7CiAgICB6LWluZGV4OiAxMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDI4cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43NCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjQsIDM0LCAwLjkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA0cHg7CiAgICBoZWlnaHQ6IDRweDsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwp9CgoubWpyLWZpbG1zdHJpcDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKfQoKLm1qci1maWxtc3RyaXAtYXVkaW8tdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgcGFkZGluZzogN3B4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Mik7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyNCUgMjQlLCByZ2JhKDc4LCAxODQsIDI1NSwgMC4yOCksIHRyYW5zcGFyZW50IDQyJSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4NCUgNzAlLCByZ2JhKDgyLCAyMjAsIDE1NiwgMC4xOCksIHRyYW5zcGFyZW50IDQwJSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxOCwgMjUsIDM1LCAwLjk2KSwgcmdiYSg3LCAxMCwgMTUsIDAuOTgpKTsKfQoKLm1qci1maWxtc3RyaXAtYXVkaW8td2F2ZWZvcm0gewogICAgd2lkdGg6IDc2JTsKICAgIGhlaWdodDogMjRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDJweDsKfQoKLm1qci1maWxtc3RyaXAtYXVkaW8td2F2ZWZvcm0gc3BhbiB7CiAgICB3aWR0aDogMnB4OwogICAgbWluLWhlaWdodDogNHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTQpLCByZ2JhKDE0OCwgMjE4LCAyNTUsIDAuNjgpKTsKfQoKLm1qci1maWxtc3RyaXAtYXVkaW8tbGFiZWwgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHBhZGRpbmc6IDJweCA1cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBmb250LXNpemU6IDdweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi8qIC0tIER1cGxpY2F0ZSBzdGFjayBidXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIFNob3dzIG9uIHRoZSBwcmltYXJ5IGNhcmQgd2hlbiBzYW1lLWZpbGVuYW1lIGR1cGxpY2F0ZXMgZXhpc3QuICAgICAgICAgICAgICovCi8qIFBvc2l0aW9uZWQgYXQgYm90dG9tLXJpZ2h0IHRvIG5vdCBvdmVybGFwIHRoZSBzdGFjay1ncm91cCBidXR0b24gKHRvcC1yaWdodCkuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMzBweDsKICAgIHJpZ2h0OiA2cHg7CiAgICB6LWluZGV4OiAxMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDI4cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAxODAsIDAsIDAuMzgpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAxOCwgMCwgMC44Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIwMCwgNjAsIDAuOTYpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTVzLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNTAsIDMwLCAwLCAwLjk0KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE4MCwgMCwgMC42KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1idXR0b24gPiAqIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZHVwLXN0YWNrZWQ9InRydWUiXSAubWpyLWR1cC1zdGFjay1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMyKSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDE4MCwgMCwgMC4yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci1mZWVkLWdyb3VwLWJ1dHRvbiB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl06aG92ZXIgewogICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qIC0tIFZpc3VhbCBzdGFja2luZyBlZmZlY3QgLSBsYXllcmVkIGNhcmRzIGJlaGluZCB0aGUgbWFpbiBjYXJkIC0tLS0tLS0tLS0tLSAqLwovKiBDcmVhdGVzIHBzZXVkby1lbGVtZW50ICJjYXJkcyIgb2Zmc2V0IGJlaGluZCB0aGUgcHJpbWFyeSBjYXJkIHRvIHZpc3VhbGx5ICAgICovCi8qIGNvbW11bmljYXRlIHRoYXQgdGhpcyBjYXJkIHJlcHJlc2VudHMgYSBncm91cCBvZiBtdWx0aXBsZSBpbWFnZXMuICAgICAgICAgICAgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YmVmb3JlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzFhMWEyZSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAtMTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDE4MG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgzcHgsIDNweCkgcm90YXRlKDFkZWcpOwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg2cHgsIDZweCkgcm90YXRlKDIuMmRlZyk7CiAgICBvcGFjaXR5OiAwLjI1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg0cHgsIDRweCkgcm90YXRlKDEuNWRlZyk7CiAgICBvcGFjaXR5OiAwLjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDhweCwgOHB4KSByb3RhdGUoM2RlZyk7CiAgICBvcGFjaXR5OiAwLjM1Owp9CgoubWpyLXN0YWNrLWdyb3VwLXBvcG92ZXIgewogICAgd2lkdGg6IG1pbig0NDBweCwgOTJ2dyk7Cn0KCi5tanItc3RhY2stZ3JvdXAtbWVtYmVyLWNhcmQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMSAhaW1wb3J0YW50Owp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIExpZ2h0IG1vZGUgb3ZlcnJpZGVzIChDb21meVVJIHYxLjQyKyBpbXByb3ZlZCBsaWdodCB0aGVtZSkKICogVXNlcyBDb21meVVJIGRhdGEtdGhlbWUgYXR0cmlidXRlIHdoZW4gc2V0LCB3aXRoCiAqIHByZWZlcnMtY29sb3Itc2NoZW1lIGFzIGEgZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qIENvbWZ5VUkgc2V0cyBkYXRhLXRoZW1lPSJsaWdodCIgb24gPGh0bWw+IG9yIDxib2R5PiAqLwo6aXMoW2RhdGEtdGhlbWU9ImxpZ2h0Il0sIFtkYXRhLWNvbG9yLXNjaGVtZT0ibGlnaHQiXSkgLm1qci1hc3NldHMtbWFuYWdlciwKOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItcG9wb3ZlciB7CiAgICAtLW1qci1zdXJmYWNlLTA6IHZhcigtLWludGVyZmFjZS1wYW5lbC1zdXJmYWNlLCAjZjBmMGYwKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgI2ZhZmFmYSk7CiAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAjZmZmZmZmKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHJnYmEoMCwgMCwgMCwgMC4xNCkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgLS1tanItY2FyZC1ob3Zlci1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlMGUwZTApOwp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewogICAgLyogRmFsbGJhY2s6IG9ubHkgYXBwbHkgaWYgQ29tZnlVSSBoYXNuJ3Qgc2V0IGFuIGV4cGxpY2l0IGRhdGEtdGhlbWUgKi8KICAgIC5tanItYXNzZXRzLW1hbmFnZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSwKICAgIC5tanItcG9wb3Zlcjpub3QoW2RhdGEtdGhlbWUtYXBwbGllZF0pIHsKICAgICAgICAtLW1qci1zdXJmYWNlLTA6IHZhcigtLWludGVyZmFjZS1wYW5lbC1zdXJmYWNlLCAjZjBmMGYwKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgICAgIC0tbWpyLXN1cmZhY2UtMjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlOGU4ZTgpOwogICAgICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAjZmZmZmZmKTsKICAgICAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgICAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgcmdiYSgwLCAwLCAwLCAwLjU1KSk7CiAgICAgICAgLS1tanItY2FyZC1ob3Zlci1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlMGUwZTApOwogICAgfQp9CgovKiAtLS0gU2tlbGV0b24gbG9hZGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLm1qci1jYXJkLXNrZWxldG9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgIzNhM2EzYSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZywgOHB4KTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAvKiBNYXRjaCAubWpyLXRodW1iIGFzcGVjdCByYXRpbyBzbyBza2VsZXRvbnMgaGF2ZSB0aGUgc2FtZSBmb290cHJpbnQgYXMgcmVhbCBjYXJkcy4gKi8KICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7Cn0KCi8qIFNoaW1tZXIgc3dlZXAgKi8KLm1qci1jYXJkLXNrZWxldG9uOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHRyYW5zcGFyZW50IDAlLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjM2EzYTNhKSA4MCUsIHRyYW5zcGFyZW50KSA1MCUsCiAgICAgICAgdHJhbnNwYXJlbnQgMTAwJQogICAgKTsKICAgIGFuaW1hdGlvbjogbWpyLXNoaW1tZXIgMS40cyBlYXNlLWluLW91dCBpbmZpbml0ZTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7Cn0KCkBrZXlmcmFtZXMgbWpyLXNoaW1tZXIgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgIH0KICAgIHRvIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7CiAgICB9Cn0KCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgICAubWpyLWNhcmQtc2tlbGV0b246OmFmdGVyIHsKICAgICAgICBhbmltYXRpb246IG5vbmU7CiAgICB9Cn0KCi8qIC0tLSBSZXNwb25zaXZlIHN1bW1hcnkgYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBFbmFibGUgY29udGFpbmVyIHF1ZXJpZXMgb24gdGhlIHN1bW1hcnkgYmFyIHNvIGNoaWxkcmVuIGNhbiByZXNwb25kIHRvIGl0cwogKiBhY3R1YWwgcmVuZGVyZWQgd2lkdGggKGUuZy4gd2hlbiB0aGUgcGFuZWwgaXMgZG9ja2VkIGluIGEgbmFycm93IHNpZGViYXIpLgogKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnkgewogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwogICAgY29udGFpbmVyLW5hbWU6IG1qci1zdW1tYXJ5LWJhcjsKfQoKLyogQmVsb3cgfjM4MCBweDogaGlkZSB0aGUgcGlsbHMvcmlnaHQgc2VjdGlvbiB0byBwcmV2ZW50IG92ZXJmbG93LiAqLwpAY29udGFpbmVyIG1qci1zdW1tYXJ5LWJhciAobWF4LXdpZHRoOiAzODBweCkgewogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktcmlnaHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS10ZXh0IHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICB9Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFN0dWRpbyB2aWV3ZXIgKG1haW4gdmlld2VyKSAtIC5tanItc3R1ZGlvCiAqIE5ldXRyYWwgZGFyayBzdGFnZSBzbyBnZW5lcmF0ZWQgY29sb3VycyBhcmUganVkZ2VkIGFjY3VyYXRlbHk7IGNocm9tZSB1c2VzCiAqIENvbWZ5VUkgdG9rZW5zIHRocm91Z2ggdGhlIC0tbWpyLSogYWxpYXNlcy4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi5tanItc3R1ZGlvIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIGluc2V0OiAwOwogICAgLyogQWJvdmUgdGhlIGZsb2F0aW5nIHZpZXdlciAoMTAwMDApICovCiAgICB6LWluZGV4OiAxMDAwMTsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gbWlubWF4KDAsIDFmcikgYXV0bzsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGY7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmU2ZTYpOwogICAgb3V0bGluZTogbm9uZTsKICAgIC0tbWpyLXN0dWRpby1jaHJvbWU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMjMyMzI3KSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIC0tbWpyLXN0dWRpby1saW5lOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlciwgI2ZmZjIpIDcwJSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItc3R1ZGlvX19oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdHVkaW8tY2hyb21lKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItc3R1ZGlvLWxpbmUpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItc3R1ZGlvX19uYXYsCi5tanItc3R1ZGlvX19hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoubWpyLXN0dWRpb19fY291bnRlciB7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBtaW4td2lkdGg6IDU0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLm1qci1zdHVkaW9fX3RpdGxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KLm1qci1zdHVkaW9fX2ZpbGVuYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEzLjVweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci1zdHVkaW9fX3N1bW1hcnkgewogICAgZm9udC1zaXplOiAxMS41cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci1zdHVkaW8tYnRuIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiAwIDdweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQ6IGluaGVyaXQ7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzLCBib3JkZXItY29sb3IgMC4xMnMsIGNvbG9yIDAuMTJzOwp9Ci5tanItc3R1ZGlvLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZmctY29sb3IsICNmZmYpIDEwJSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItc3R1ZGlvLWJ0bjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItYWNjZW50KTsKICAgIG91dGxpbmUtb2Zmc2V0OiAxcHg7Cn0KLm1qci1zdHVkaW8tYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuMzU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KLm1qci1zdHVkaW8tYnRuLmlzLW9uIHsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxNiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQwJSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItc3R1ZGlvLWJ0bi5pcy10ZXh0IHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwp9Ci5tanItc3R1ZGlvLWJ0bi5pcy1jbG9zZTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgI2U1NDg0ZCkgMjglLCB0cmFuc3BhcmVudCk7Cn0KLm1qci1zdHVkaW8tY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1mZy1jb2xvciwgI2ZmZikgOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubWpyLXN0dWRpby1zZWxlY3QgewogICAgaGVpZ2h0OiAyNnB4OwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLXN0dWRpby1saW5lKTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBmb250OiBpbmhlcml0OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgcGFkZGluZzogMCA0cHg7Cn0KLm1qci1zdHVkaW9fX2JvZHkgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcikgbWlubWF4KDMwMHB4LCAzODBweCk7CiAgICBtaW4taGVpZ2h0OiAwOwp9Ci5tanItc3R1ZGlvLmlzLWluc3BlY3Rvci1jbG9zZWQgLm1qci1zdHVkaW9fX2JvZHkgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKTsKfQoubWpyLXN0dWRpb19fc3RhZ2UgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KLm1qci1zdHVkaW9fX3Vuc3VwcG9ydGVkIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoubWpyLXN0dWRpb19fdW5zdXBwb3J0ZWQgLnBpIHsKICAgIGZvbnQtc2l6ZTogNDBweDsKfQoubWpyLXN0dWRpb19faW5zcGVjdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTAsICMxYjFiMWUpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItc3R1ZGlvLWxpbmUpOwp9Ci5tanItc3R1ZGlvX19yZXZpZXcgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDEycHggMTRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItc3R1ZGlvLWxpbmUpOwp9Ci5tanItc3R1ZGlvX19yZXZpZXctcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4Owp9Ci5tanItc3R1ZGlvX19sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwp9Ci5tanItc3R1ZGlvX190YWJzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDJweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4IDA7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLXN0dWRpby1saW5lKTsKfQoubWpyLXN0dWRpb19fdGFicyBidXR0b24gewogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQ6IGluaGVyaXQ7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubWpyLXN0dWRpb19fdGFicyBidXR0b24uaXMtYWN0aXZlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgI2ZmZik7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tanItYWNjZW50KTsKfQoubWpyLXN0dWRpb19fdGFiLWJvZHkgewogICAgZmxleDogMSAxIGF1dG87CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDEycHggMTRweCAxOHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDE0cHg7Cn0KLm1qci1zdHVkaW9fX2ZpbG1zdHJpcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3R1ZGlvLWNocm9tZSk7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tbWpyLXN0dWRpby1saW5lKTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKfQoubWpyLXN0dWRpb19fdGh1bWIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogNjRweDsKICAgIGhlaWdodDogNjRweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgb3BhY2l0eTogMC42OwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjEycywgYm9yZGVyLWNvbG9yIDAuMTJzLCB0cmFuc2Zvcm0gMC4xMnM7Cn0KLm1qci1zdHVkaW9fX3RodW1iOmhvdmVyIHsKICAgIG9wYWNpdHk6IDAuOTsKfQoubWpyLXN0dWRpb19fdGh1bWIuaXMtY3VycmVudCB7CiAgICBvcGFjaXR5OiAxOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tanItYWNjZW50KTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKfQoubWpyLXN0dWRpb19fdGh1bWIgaW1nIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLXN0dWRpb19fdGh1bWItYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDRweDsKICAgIGJvdHRvbTogNHB4OwogICAgZm9udC1zaXplOiA5cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7Cn0KCi8qIEltYWdlIHN0YWdlICovCi5tanItc3R1ZGlvLXN0YWdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGN1cnNvcjogZ3JhYjsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKfQoubWpyLXN0dWRpby1zdGFnZS5pcy1kcmFnZ2luZyB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9Ci5tanItc3R1ZGlvLXN0YWdlLmlzLWNoZWNrZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzJhMmEyYTsKICAgIGJhY2tncm91bmQtaW1hZ2U6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjM2EzYTNhIDI1JSwgdHJhbnNwYXJlbnQgMjUlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCAjM2EzYTNhIDI1JSwgdHJhbnNwYXJlbnQgMjUlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHRyYW5zcGFyZW50IDc1JSwgIzNhM2EzYSA3NSUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgtNDVkZWcsIHRyYW5zcGFyZW50IDc1JSwgIzNhM2EzYSA3NSUpOwogICAgYmFja2dyb3VuZC1zaXplOiAyMHB4IDIwcHg7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDAsIDAgMTBweCwgMTBweCAtMTBweCwgLTEwcHggMDsKfQoubWpyLXN0dWRpby1zdGFnZV9fYm94IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogNTAlOwogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2xheWVycyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoubWpyLXN0dWRpby1zdGFnZV9faW1nIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB0b3A6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgLXdlYmtpdC11c2VyLWRyYWc6IG5vbmU7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2Vycm9yIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwp9CgovKiBQbGF5ZXIgKi8KLm1qci1zdHVkaW8tcGxheWVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6ICMwMDA7Cn0KLm1qci1zdHVkaW8tcGxheWVyLmNvbnRyb2xzLWhpZGRlbiB7CiAgICBjdXJzb3I6IG5vbmU7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19tZWRpYSB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19hdWRpby1hcnQgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19hdWRpby1hcnQgLnBpIHsKICAgIGZvbnQtc2l6ZTogNjRweDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50KTsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX2JpZy1wbGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogNTAlOwogICAgd2lkdGg6IDcycHg7CiAgICBoZWlnaHQ6IDcycHg7CiAgICBtYXJnaW46IC0zNnB4IDAgMCAtMzZweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDI2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjEycywgYmFja2dyb3VuZCAwLjEyczsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX2JpZy1wbGF5OmhvdmVyIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCByZ2JhKDAsIDAsIDAsIDAuNCkpOwp9Ci5tanItc3R1ZGlvLXBsYXllci5pcy1hdWRpbyAubWpyLXN0dWRpby1wbGF5ZXJfX2JpZy1wbGF5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19lcnJvciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgI2ZmOGE4YSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBwYWRkaW5nOiAxMHB4IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19jb250cm9scyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMnB4OwogICAgcmlnaHQ6IDEycHg7CiAgICBib3R0b206IDEycHg7CiAgICBwYWRkaW5nOiA2cHggMTBweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMiwgMTIsIDE0LCAwLjcyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7CiAgICBjb2xvcjogI2VlZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycywgdHJhbnNmb3JtIDAuMnM7Cn0KLm1qci1zdHVkaW8tcGxheWVyLmNvbnRyb2xzLWhpZGRlbiAubWpyLXN0dWRpby1wbGF5ZXJfX2NvbnRyb2xzIHsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNnB4KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5tanItc3R1ZGlvLXBsYXllcl9fdHJhY2sgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgaGVpZ2h0OiAxOHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwp9Ci5tanItc3R1ZGlvLXBsYXllcl9fdHJhY2s6OmJlZm9yZSwKLm1qci1zdHVkaW8tcGxheWVyX19idWZmZXJlZCwKLm1qci1zdHVkaW8tcGxheWVyX19wcm9ncmVzcywKLm1qci1zdHVkaW8tcGxheWVyX19sb29wIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB0b3A6IDdweDsKICAgIGhlaWdodDogNHB4OwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5tanItc3R1ZGlvLXBsYXllcl9fdHJhY2s6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHJpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX3RyYWNrOmhvdmVyOjpiZWZvcmUsCi5tanItc3R1ZGlvLXBsYXllcl9fdHJhY2s6aG92ZXIgLm1qci1zdHVkaW8tcGxheWVyX19idWZmZXJlZCwKLm1qci1zdHVkaW8tcGxheWVyX190cmFjazpob3ZlciAubWpyLXN0dWRpby1wbGF5ZXJfX3Byb2dyZXNzLAoubWpyLXN0dWRpby1wbGF5ZXJfX3RyYWNrOmhvdmVyIC5tanItc3R1ZGlvLXBsYXllcl9fbG9vcCB7CiAgICB0b3A6IDZweDsKICAgIGhlaWdodDogNnB4Owp9Ci5tanItc3R1ZGlvLXBsYXllcl9fYnVmZmVyZWQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KTsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX2xvb3AgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2Y1YTUyNCkgNTUlLCB0cmFuc3BhcmVudCk7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19wcm9ncmVzcyB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50KTsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX3RodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogM3B4OwogICAgd2lkdGg6IDEycHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBtYXJnaW4tbGVmdDogLTZweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdHJhbnNwYXJlbnQpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19ob3ZlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDIycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX3RpbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIG1hcmdpbjogMCA2cHg7Cn0KLm1qci1zdHVkaW8tcGxheWVyX190aW1lIC5pcy1kaW0gewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41NSk7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19zcGFjZXIgewogICAgZmxleDogMSAxIGF1dG87Cn0KLm1qci1zdHVkaW8tcGxheWVyX19ncm91cCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDJweDsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX3ZvbHVtZSB7CiAgICB3aWR0aDogODBweDsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCk7Cn0KQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgICAubWpyLXN0dWRpb19fYm9keSB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKTsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbm1heCgwLCAxZnIpIG1pbm1heCgwLCA0MCUpOwogICAgfQogICAgLm1qci1zdHVkaW9fX2luc3BlY3RvciB7CiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1zdHVkaW8tbGluZSk7CiAgICB9Cn0KLm1qci1zdHVkaW8tcGxheWVyX192b2x1bWUgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDgwcHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7Cn0KLm1qci1zdHVkaW8tcGxheWVyX192b2x1bWU6OmJlZm9yZSwKLm1qci1zdHVkaW8tcGxheWVyX192b2x1bWUtZmlsbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgdG9wOiA2cHg7CiAgICBoZWlnaHQ6IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX3ZvbHVtZTo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcmlnaHQ6IDA7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwp9Ci5tanItc3R1ZGlvLXBsYXllcl9fdm9sdW1lLWZpbGwgewogICAgYmFja2dyb3VuZDogI2ZmZjsKfQoKLyogU3R1ZGlvIHBsYXllciBpbnNpZGUgdGhlIGZsb2F0aW5nIHZpZXdlciAoY29tcGFjdCwgd2lkdGgtYXdhcmUpLiAqLwoubWpyLW1mdi1wbGF5ZXItaG9zdC0tc3R1ZGlvIHsKICAgIGJhY2tncm91bmQ6ICMwMDA7Cn0KLm1qci1zdHVkaW8tcGxheWVyLmlzLWNvbXBhY3QgLm1qci1zdHVkaW8tcGxheWVyX19jb250cm9scyB7CiAgICBsZWZ0OiA2cHg7CiAgICByaWdodDogNnB4OwogICAgYm90dG9tOiA2cHg7CiAgICBwYWRkaW5nOiA0cHggNnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKfQoubWpyLXN0dWRpby1wbGF5ZXIuaXMtY29tcGFjdCAubWpyLXN0dWRpby1idG4gewogICAgbWluLXdpZHRoOiAyNnB4OwogICAgaGVpZ2h0OiAyNnB4OwogICAgcGFkZGluZzogMCA1cHg7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7Cn0KLm1qci1zdHVkaW8tcGxheWVyLmlzLWNvbXBhY3QgLm1qci1zdHVkaW8tcGxheWVyX190aW1lIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1hcmdpbjogMCA0cHg7Cn0KLm1qci1zdHVkaW8tcGxheWVyLmlzLWNvbXBhY3QgLm1qci1zdHVkaW8tcGxheWVyX19iaWctcGxheSB7CiAgICB3aWR0aDogNTJweDsKICAgIGhlaWdodDogNTJweDsKICAgIG1hcmdpbjogLTI2cHggMCAwIC0yNnB4OwogICAgZm9udC1zaXplOiAxOHB4Owp9Ci5tanItc3R1ZGlvLXBsYXllci5pcy1jb21wYWN0IC5tanItc3R1ZGlvLXBsYXllcl9fdm9sdW1lIHsKICAgIHdpZHRoOiA1NnB4Owp9Ci5tanItc3R1ZGlvLXBsYXllci5pcy1jb21wYWN0IC5tanItc3R1ZGlvLXBsYXllcl9fYXVkaW8tYXJ0IC5waSB7CiAgICBmb250LXNpemU6IDQwcHg7Cn0KQGNvbnRhaW5lciAobWF4LXdpZHRoOiA1MjBweCkgewogICAgLm1qci1zdHVkaW8tcGxheWVyLmlzLWNvbXBhY3QgLm1qci1zdHVkaW8tcGxheWVyX192b2x1bWUsCiAgICAubWpyLXN0dWRpby1wbGF5ZXIuaXMtY29tcGFjdCAubWpyLXN0dWRpby1jaGlwIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQp9CkBjb250YWluZXIgKG1heC13aWR0aDogMzgwcHgpIHsKICAgIC5tanItc3R1ZGlvLXBsYXllci5pcy1jb21wYWN0IC5tanItc3R1ZGlvLXBsYXllcl9fZ3JvdXAsCiAgICAubWpyLXN0dWRpby1wbGF5ZXIuaXMtY29tcGFjdCAubWpyLXN0dWRpby1wbGF5ZXJfX3RpbWUgLmlzLWRpbSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogRmxvYXRpbmcgdmlld2VyIHJlZnJlc2ggLSBhbGlnbmVkIHdpdGggdGhlIFN0dWRpbyB2aWV3ZXIuCiAqIFB1cmUgdmlzdWFsIGxheWVyIChhcHBlbmRlZCBsYXN0KTogZmxhdCBidXR0b25zIHRoYXQgbGlnaHQgdXAgb24gaG92ZXIgLwogKiB3aGVuIGFjdGl2ZSwgc29mdGVyIHdpbmRvdyBjaHJvbWUsIG5ldXRyYWwgc3RhZ2UuIFN0YXRlIGNvbG91cnMgKGxpdmUsCiAqIHByZXZpZXcsIG5vZGUgc3RyZWFtKSBrZWVwIHRoZWlyIGRlZGljYXRlZCBydWxlcyBhYm92ZS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi5tanItbWZ2IHsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMThweCA0OHB4IHJnYmEoMCwgMCwgMCwgMC40NSksCiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoubWpyLW1mdi1oZWFkZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwp9Ci5tanItbWZ2LXRvb2xiYXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgMzAlKTsKICAgIGdhcDogMnB4Owp9Ci5tanItbWZ2IC5tanItaWNvbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogOHB4Owp9Ci5tanItbWZ2IC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSAxMCUsIHRyYW5zcGFyZW50KTsKICAgIHRyYW5zZm9ybTogbm9uZTsKfQoubWpyLW1mdiAubWpyLWljb24tYnRuW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQwJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAxNiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNDUlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBub25lOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxNiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdHJhbnNwYXJlbnQpOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoubWpyLW1mdiAubWpyLW1mdi1zaW1wbGUtY29udGFpbmVyLAoubWpyLW1mdiAubWpyLW1mdi1wbGF5ZXItaG9zdCB7CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBmOwp9Ci5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCwKLm1qci1tZnYubWpyLW1mdi0tZGVza3RvcC1leHBhbmRlZCB7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKCi8qIOKUgOKUgOKUgCBTdHVkaW8gcmV2aWV3IHRvb2xzIChIVUQgcmFpbCwgY29tcGFyZSwgb3ZlcmxheXMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXN0dWRpby1meC1kZWZzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5tanItc3R1ZGlvLXN0YWdlLmlzLXByb2JpbmcsCi5tanItc3R1ZGlvLXBsYXllci5pcy1wcm9iaW5nIC5tanItc3R1ZGlvLXBsYXllcl9fc2NyZWVuIHsKICAgIGN1cnNvcjogY3Jvc3NoYWlyOwp9Ci5tanItc3R1ZGlvLXN0YWdlX19zaWRlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwp9Ci5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyIHsKICAgIC0tbWpyLWs6IHZhcigtLW1qci1pbnYtc2NhbGUsIDEpOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IGNhbGMoMjRweCAqIHZhcigtLW1qci1rKSk7CiAgICBtYXJnaW4tbGVmdDogY2FsYygtMTJweCAqIHZhcigtLW1qci1rKSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHotaW5kZXg6IDM7CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiBjYWxjKDJweCAqIHZhcigtLW1qci1rKSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgYm94LXNoYWRvdzogMCAwIDAgY2FsYygxcHggKiB2YXIoLS1tanItaykpIHJnYmEoMCwgMCwgMCwgMC40NSk7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXIuaXMtdmVydGljYWwgewogICAgdG9wOiBhdXRvOwogICAgYm90dG9tOiBhdXRvOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IGNhbGMoMjRweCAqIHZhcigtLW1qci1rKSk7CiAgICBtYXJnaW4tbGVmdDogMDsKICAgIG1hcmdpbi10b3A6IGNhbGMoLTEycHggKiB2YXIoLS1tanItaykpOwogICAgY3Vyc29yOiBucy1yZXNpemU7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXIuaXMtdmVydGljYWw6OmJlZm9yZSB7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IDUwJTsKICAgIGJvdHRvbTogYXV0bzsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiBjYWxjKDJweCAqIHZhcigtLW1qci1rKSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXItZ3JpcCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAzNHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUodmFyKC0tbWpyLWspKTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjUpOwp9Ci5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyLmlzLXZlcnRpY2FsIC5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyLWdyaXAgewogICAgd2lkdGg6IDM0cHg7CiAgICBoZWlnaHQ6IDE4cHg7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXIuaXMtYWN0aXZlIC5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyLWdyaXAsCi5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyOmhvdmVyIC5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyLWdyaXAgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzRmYTNmZik7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2FiIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogMTJweDsKICAgIHotaW5kZXg6IDQ7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA2cHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBwYWRkaW5nOiAycHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZm9udDogNjAwIDExcHgvMjBweCB2YXIoLS1tanItZm9udCwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmKTsKICAgIGNvbG9yOiAjZmZmOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2FiIC5pcy1zZXAgewogICAgb3BhY2l0eTogMC41Owp9CgoubWpyLXN0dWRpby1wbGF5ZXJfX3NjcmVlbiB7CiAgICBjdXJzb3I6IGNyb3NzaGFpcjsKfQoubWpyLXN0dWRpby1zdGFnZV9fc2lkZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoubWpyLXN0dWRpby1zdGFnZV9fZGl2aWRlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMjRweDsKICAgIG1hcmdpbi1sZWZ0OiAtMTJweDsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgei1pbmRleDogMzsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKfQoubWpyLXN0dWRpby1zdGFnZV9fZGl2aWRlcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAtMXB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwp9Ci5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyLmlzLXZlcnRpY2FsIHsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogYXV0bzsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiAyNHB4OwogICAgbWFyZ2luLWxlZnQ6IDA7CiAgICBtYXJnaW4tdG9wOiAtMTJweDsKICAgIGN1cnNvcjogbnMtcmVzaXplOwp9Ci5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyLmlzLXZlcnRpY2FsOjpiZWZvcmUgewogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBib3R0b206IGF1dG87CiAgICB3aWR0aDogYXV0bzsKICAgIGhlaWdodDogMnB4OwogICAgbWFyZ2luLWxlZnQ6IDA7CiAgICBtYXJnaW4tdG9wOiAtMXB4Owp9Ci5tanItc3R1ZGlvLXN0YWdlX19kaXZpZGVyLWdyaXAgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXIuaXMtdmVydGljYWwgLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXItZ3JpcCB7CiAgICB3aWR0aDogMzRweDsKICAgIGhlaWdodDogMThweDsKfQoubWpyLXN0dWRpby1zdGFnZV9fZGl2aWRlci5pcy1hY3RpdmUgLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXItZ3JpcCwKLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXI6aG92ZXIgLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXItZ3JpcCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNGZhM2ZmKTsKfQoubWpyLXN0dWRpby1zdGFnZV9fYWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICB6LWluZGV4OiAyOwogICAgcGFkZGluZzogMXB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQ6IDYwMCAxMXB4LzE4cHggdmFyKC0tbWpyLWZvbnQsIHN5c3RlbS11aSwgc2Fucy1zZXJpZik7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5tanItc3R1ZGlvLXN0YWdlX19hYi5pcy1hIHsKICAgIGxlZnQ6IDhweDsKfQoubWpyLXN0dWRpby1zdGFnZV9fYWIuaXMtYiB7CiAgICByaWdodDogOHB4Owp9Ci5tanItc3R1ZGlvLXN0YWdlX19ib3ggLm1qci1zdHVkaW8tc3RhZ2VfX2FiIHsKICAgIC8qIEluc2lkZSB0aGUgem9vbWVkIGJveDoga2VlcCBsYWJlbHMgcmVhZGFibGUgYXQgYW55IHpvb20uICovCiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKfQoKLm1qci1zdHVkaW8tcGxheWVyX19zY3JlZW4gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19sYXllcnMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19tZWRpYS5pcy1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwp9Ci5tanItc3R1ZGlvLXBsYXllcl9fc2NyZWVuLmlzLXNpZGUgLm1qci1zdHVkaW8tcGxheWVyX19sYXllcnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4Owp9Ci5tanItc3R1ZGlvLXBsYXllcl9fc2NyZWVuLmlzLXNpZGUgLm1qci1zdHVkaW8tcGxheWVyX19tZWRpYSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBpbnNldDogYXV0bzsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgd2lkdGg6IGF1dG87Cn0KLm1qci1zdHVkaW8tcGxheWVyX19ib3ggewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KLm1qci1zdHVkaW8tcGxheWVyX19ib3ggLm1qci1zdHVkaW8tc3RhZ2VfX2RpdmlkZXIgewogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItc3R1ZGlvLWd1aWRlcywKLm1qci1zdHVkaW8temVicmEgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5tanItc3R1ZGlvLXplYnJhIHsKICAgIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkOwp9Ci5tanItc3R1ZGlvLWd1aWRlc19fbGluZSB7CiAgICBzdHJva2U6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIHN0cm9rZS13aWR0aDogMTsKfQoubWpyLXN0dWRpby1ndWlkZXNfX3NhZmUgewogICAgc3Ryb2tlOiByZ2JhKDI1NSwgMjEwLCA4MCwgMC44KTsKICAgIHN0cm9rZS13aWR0aDogMTsKICAgIHN0cm9rZS1kYXNoYXJyYXk6IDYgNDsKfQoubWpyLXN0dWRpby1ndWlkZXNfX21hc2stZWRnZSB7CiAgICBzdHJva2U6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTsKICAgIHN0cm9rZS13aWR0aDogMTsKfQoKLm1qci1zdHVkaW8tbW9kZWwzZCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIHBhZGRpbmc6IDEycHg7Cn0KLm1qci1zdHVkaW8tbW9kZWwzZF9faG9zdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLyogSFVEIHJhaWwgKi8KLm1qci1zdHVkaW8tcmFpbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMnB4OwogICAgdG9wOiAxMnB4OwogICAgei1pbmRleDogNTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogOHB4OwogICAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gMjRweCk7Cn0KLm1qci1zdHVkaW8tcmFpbF9fYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiA1cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMxYzFjMjApIDgyJSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLXN0dWRpby1saW5lLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KLm1qci1zdHVkaW8tcmFpbF9fYnRuIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDM0cHg7CiAgICBoZWlnaHQ6IDM0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHZhcigtLW1qci10ZXh0LW11dGVkLCAjYjViNWJkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjEycyBlYXNlLAogICAgICAgIGNvbG9yIDAuMTJzIGVhc2U7Cn0KLm1qci1zdHVkaW8tcmFpbF9fYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXRleHQsICNmZmYpOwp9Ci5tanItc3R1ZGlvLXJhaWxfX2J0bjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItYWNjZW50LCAjNGZhM2ZmKTsKICAgIG91dGxpbmUtb2Zmc2V0OiAtMnB4Owp9Ci5tanItc3R1ZGlvLXJhaWxfX2J0bi5pcy1vbiB7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzRmYTNmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzRmYTNmZikgMTYlLCB0cmFuc3BhcmVudCk7Cn0KLm1qci1zdHVkaW8tcmFpbF9fYnRuLmlzLW9wZW4gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGNvbG9yOiB2YXIoLS1tanItdGV4dCwgI2ZmZik7Cn0KLm1qci1zdHVkaW8tcmFpbF9fdGFnIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAxcHg7CiAgICBib3R0b206IDFweDsKICAgIG1pbi13aWR0aDogMTJweDsKICAgIHBhZGRpbmc6IDAgMnB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udDogNzAwIDhweC8xMXB4IHZhcigtLW1qci1mb250LCBzeXN0ZW0tdWksIHNhbnMtc2VyaWYpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzRmYTNmZik7CiAgICBjb2xvcjogI2ZmZjsKfQoubWpyLXN0dWRpby1yYWlsX19zZXAgewogICAgaGVpZ2h0OiAxcHg7CiAgICBtYXJnaW46IDNweCA2cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3R1ZGlvLWxpbmUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7Cn0KLm1qci1zdHVkaW8tcmFpbF9fcGFuZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTRweDsKICAgIHdpZHRoOiAyMzZweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzFjMWMyMCkgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItc3R1ZGlvLWxpbmUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMzJweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEycHgpOwogICAgY29sb3I6IHZhcigtLW1qci10ZXh0LCAjZWVlKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoubWpyLXN0dWRpby1yYWlsX190aXRsZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLW1qci10ZXh0LCAjZmZmKTsKfQoubWpyLXN0dWRpby1yYWlsX19iIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7Cn0KLm1qci1zdHVkaW8tcmFpbF9fYi1sYWJlbCB7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM0ZmEzZmYpOwp9Ci5tanItc3R1ZGlvLXJhaWxfX2ItbmFtZSB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLXRleHQtbXV0ZWQsICNiNWI1YmQpOwp9Ci5tanItc3R1ZGlvLXNlZyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiAycHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOwp9Ci5tanItc3R1ZGlvLXNlZy5pcy13cmFwIHsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoubWpyLXN0dWRpby1zZWcgYnV0dG9uIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi1oZWlnaHQ6IDI2cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHZhcigtLW1qci10ZXh0LW11dGVkLCAjYjViNWJkKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLm1qci1zdHVkaW8tc2VnIGJ1dHRvbjpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXRleHQsICNmZmYpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoubWpyLXN0dWRpby1zZWcgYnV0dG9uLmlzLW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1hY2NlbnQsICM0ZmEzZmYpOwogICAgY29sb3I6ICNmZmY7Cn0KCi8qIFNsaWRlciAqLwoubWpyLXN0dWRpby1zbGlkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKfQoubWpyLXN0dWRpby1zbGlkZXJfX2hlYWQgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGNvbG9yOiB2YXIoLS1tanItdGV4dC1tdXRlZCwgI2I1YjViZCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KLm1qci1zdHVkaW8tc2xpZGVyX192YWx1ZSB7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgY29sb3I6IHZhcigtLW1qci10ZXh0LCAjZmZmKTsKfQoubWpyLXN0dWRpby1zbGlkZXJfX3RyYWNrIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGhlaWdodDogMTZweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KLm1qci1zdHVkaW8tc2xpZGVyX190cmFjazo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA3cHg7CiAgICBoZWlnaHQ6IDNweDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7Cn0KLm1qci1zdHVkaW8tc2xpZGVyX19maWxsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB0b3A6IDdweDsKICAgIGhlaWdodDogM3B4OwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzRmYTNmZik7Cn0KLm1qci1zdHVkaW8tc2xpZGVyX19rbm9iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMnB4OwogICAgd2lkdGg6IDEycHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBtYXJnaW4tbGVmdDogLTZweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAwLjUpOwp9Ci5tanItc3R1ZGlvLXNsaWRlcl9fdHJhY2s6Zm9jdXMtdmlzaWJsZSAubWpyLXN0dWRpby1zbGlkZXJfX2tub2IgewogICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLW1qci1hY2NlbnQsICM0ZmEzZmYpOwogICAgb3V0bGluZS1vZmZzZXQ6IDFweDsKfQoKLyogU2NvcGVzIEhVRCAqLwoubWpyLXN0dWRpby1zY29wZXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDEycHg7CiAgICB0b3A6IDEycHg7CiAgICB6LWluZGV4OiA0OwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5tanItc3R1ZGlvLXNjb3Blc19fcGFuZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZzogNnB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDEwLCAxMiwgMC43Mik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KLm1qci1zdHVkaW8tc2NvcGVzX19wYW5lbCBjYW52YXMgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMjU2cHg7CiAgICBoZWlnaHQ6IDExMHB4Owp9Ci5tanItc3R1ZGlvLXNjb3Blc19fcGFuZWwgY2FudmFzLmlzLXdhdmUgewogICAgaGVpZ2h0OiAxMjhweDsKfQoubWpyLXN0dWRpby1zY29wZXNfX2xhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDZweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNik7Cn0KCi8qIFByb2JlIC8gbG91cGUgKi8KLm1qci1zdHVkaW8tcHJvYmUgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgaW5zZXQ6IDA7CiAgICB6LWluZGV4OiAxMDAwMTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5tanItc3R1ZGlvLXByb2JlX19sb3VwZSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyOiAycHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6ICMxMTE7Cn0KLm1qci1zdHVkaW8tcHJvYmVfX2xvdXBlIGNhbnZhcyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7Cn0KLm1qci1zdHVkaW8tcHJvYmVfX2Nyb3NzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogNTAlOwogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjYpOwp9Ci5tanItc3R1ZGlvLXByb2JlX19jaGlwIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTAsIDEyLCAwLjg1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udDogNTAwIDExcHgvMS4zIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBtb25vc3BhY2U7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItc3R1ZGlvLXByb2JlX19jaGlwIC5pcy1kaW0gewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KTsKfQoubWpyLXN0dWRpby1wcm9iZV9fc3dhdGNoIHsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOwp9CgovKiBBdWRpbyBzcGVjdHJ1bSAqLwoubWpyLXN0dWRpby1wbGF5ZXJfX2F1ZGlvLWFydC5oYXMtc3BlY3RydW0gewogICAgd2lkdGg6IG1pbig3MjBweCwgODYlKTsKfQoubWpyLXN0dWRpby1wbGF5ZXJfX3NwZWN0cnVtIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDE2MHB4Owp9Ci5tanItc3R1ZGlvLXBsYXllci5pcy1jb21wYWN0IC5tanItc3R1ZGlvLXBsYXllcl9fc3BlY3RydW0gewogICAgaGVpZ2h0OiA5MHB4Owp9CgovKiBGbG9hdGluZyB2aWV3ZXIgQS9CIHdpdGggdGhlIFN0dWRpbyBwbGF5ZXIgb24gQTogQSBpcyBvbiB0b3AgKHBvaW50ZXItdGhyb3VnaCksCiAgIG9ubHkgaXRzIHBpY3R1cmUgaXMgY2xpcHBlZCBhdCB0aGUgZGl2aWRlcjsgQiBzaG93cyB1bmRlcm5lYXRoLiAqLwoubWpyLW1mdi1hYi1jb250YWluZXIuaGFzLXN0dWRpby1hIHsKICAgIGJhY2tncm91bmQ6ICMwMDA7Cn0KLm1qci1tZnYtYWItY29udGFpbmVyLmhhcy1zdHVkaW8tYSAubWpyLW1mdi1hYi1sYXllcjpub3QoLm1qci1tZnYtYWItbGF5ZXItLWIpIHsKICAgIHotaW5kZXg6IDI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoubWpyLW1mdi1hYi1jb250YWluZXIuaGFzLXN0dWRpby1hIC5tanItbWZ2LWFiLWxheWVyOm5vdCgubWpyLW1mdi1hYi1sYXllci0tYikgLm1qci1tZnYtcGxheWVyLWhvc3QsCi5tanItbWZ2LWFiLWNvbnRhaW5lci5oYXMtc3R1ZGlvLWEgLm1qci1tZnYtYWItbGF5ZXI6bm90KC5tanItbWZ2LWFiLWxheWVyLS1iKSAubWpyLXN0dWRpby1wbGF5ZXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KLm1qci1tZnYtYWItY29udGFpbmVyLmhhcy1zdHVkaW8tYSAubWpyLXN0dWRpby1wbGF5ZXJfX3NjcmVlbiB7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGNsaXAtcGF0aDogaW5zZXQoMCBjYWxjKDEwMCUgLSB2YXIoLS1tanItYWIteCwgNTAlKSkgMCAwKTsKfQoubWpyLW1mdi1hYi1jb250YWluZXIuaGFzLXN0dWRpby1hIC5tanItc3R1ZGlvLXBsYXllcl9fY29udHJvbHMsCi5tanItbWZ2LWFiLWNvbnRhaW5lci5oYXMtc3R1ZGlvLWEgLm1qci1zdHVkaW8tcGxheWVyX19iaWctcGxheSB7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoubWpyLW1mdi1hYi1jb250YWluZXIuaGFzLXN0dWRpby1hIC5tanItbWZ2LWFiLWRpdmlkZXIgewogICAgei1pbmRleDogMTA7Cn0KLyogVGhlIGRpdmlkZXIgc3RvcHMgYWJvdmUgdGhlIHBsYXllciBjb250cm9scyBpbnN0ZWFkIG9mIGRyYXdpbmcgb3ZlciB0aGVtCiAgIChjbGlwLXBhdGggYWxzbyByZW1vdmVzIGl0cyBoaXQgYXJlYSB0aGVyZSkuICovCi5tanItbWZ2LWFiLWNvbnRhaW5lci5oYXMtc3R1ZGlvLWEgLm1qci1tZnYtYWItZGl2aWRlciB7CiAgICBjbGlwLXBhdGg6IGluc2V0KDAgLTIwcHggNzJweCAtMjBweCk7Cn0KLm1qci1tZnYtYWItY29udGFpbmVyLmhhcy1zdHVkaW8tYTpoYXMoLm1qci1zdHVkaW8tcGxheWVyLmNvbnRyb2xzLWhpZGRlbikgLm1qci1tZnYtYWItZGl2aWRlciB7CiAgICBjbGlwLXBhdGg6IG5vbmU7Cn0KCi8qIEIga2VlcHMgaXRzIG93biBhc3BlY3QgcmF0aW8gaW5zaWRlIEEncyBmcmFtZSAoQS9CIG9mIGRpZmZlcmVudCBzaXplcykuICovCi5tanItc3R1ZGlvLXN0YWdlX19pbWcuaXMtYiwKLm1qci1zdHVkaW8tc3RhZ2VfX3NpZGUgLm1qci1zdHVkaW8tc3RhZ2VfX2ltZyB7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9Cg==", "" + import.meta.url).toString(), n = document.createElement("link"); n.id = t, n.rel = "stylesheet", n.type = "text/css", n.href = e, n.onerror = () => { try { n.remove(); @@ -295,7 +294,7 @@ function ui({ enabled: e = !0 } = {}) { } }, document.head.appendChild(n), n.onload = () => { try { - document.documentElement.dataset.mjrThemeComfy = "1", li(); + document.documentElement.dataset.mjrThemeComfy = "1", $r(); } catch (e) { console.debug?.(e); } @@ -304,29 +303,29 @@ function ui({ enabled: e = !0 } = {}) { console.warn("Majoor: failed to load Comfy theme CSS", e); } } -li(); +$r(); // ui/features/grid/gridApi.ts -function di() { +function ti() { let e = "mjr-grid-settings-styles"; if (document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-grid .mjr-asset-card,\n .mjr-grid .mjr-card {\n display: flex;\n flex-direction: column;\n }\n .mjr-grid .mjr-thumb {\n flex: 0 0 auto;\n width: 100%;\n aspect-ratio: 1 / 1;\n min-height: 0;\n position: relative;\n overflow: hidden;\n }\n .mjr-grid .mjr-thumb-media {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .mjr-grid .mjr-asset-card:hover {\n background-color: var(--mjr-card-hover-color) !important;\n }\n\n .mjr-grid .mjr-asset-card.is-selected {\n outline: 2px solid var(--mjr-card-selection-color) !important;\n box-shadow: 0 0 0 2px var(--mjr-card-selection-color) !important;\n }\n\n .mjr-grid .mjr-card-filename { display: none; }\n .mjr-grid.mjr-show-filename .mjr-card-filename { display: block; }\n\n .mjr-grid .mjr-card-dot-wrapper { display: none; }\n .mjr-grid.mjr-show-dot .mjr-card-dot-wrapper { display: inline-flex; }\n .mjr-grid .mjr-asset-status-dot {\n transition: color 0.3s ease, opacity 0.3s ease;\n }\n .mjr-grid .mjr-asset-status-dot.mjr-pulse-animation {\n animation: mjr-pulse 1.5s infinite;\n }\n @keyframes mjr-pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.4; }\n 100% { opacity: 1; }\n }\n\n .mjr-grid .mjr-meta-res { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-res { display: inline; }\n\n .mjr-grid .mjr-meta-duration { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-duration { display: inline; }\n\n .mjr-grid .mjr-meta-date { display: none; }\n .mjr-grid.mjr-show-date .mjr-meta-date { display: inline; }\n\n .mjr-grid .mjr-meta-gentime { display: none; }\n .mjr-grid.mjr-show-gentime .mjr-meta-gentime { display: inline; }\n\n .mjr-grid .mjr-badge-ext { display: none !important; }\n .mjr-grid.mjr-show-badges-ext .mjr-badge-ext { display: flex !important; }\n\n .mjr-grid .mjr-badge-rating { display: none !important; }\n .mjr-grid.mjr-show-badges-rating .mjr-badge-rating { display: flex !important; }\n\n .mjr-grid .mjr-badge-tags { display: none !important; }\n .mjr-grid.mjr-show-badges-tags .mjr-badge-tags { display: flex !important; }\n\n .mjr-grid .mjr-card-info { display: none !important; }\n .mjr-grid.mjr-show-details .mjr-card-info { display: block !important; }\n\n .mjr-card-meta-row > span + span::before {\n content: \" \"¢ \";\n opacity: 0.5;\n margin: 0 4px;\n }\n .mjr-card-meta-row > span[style*=\"display: none\"] + span::before {\n display: none;\n }\n ", document.head.appendChild(t); } -function fi(e) { +function ni(e) { if (!e) return; - di(); + ti(); let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; - t("mjr-show-filename", z.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", z.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", z.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", z.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", z.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", z.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", z.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", z.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", z.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", z.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${z.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${z.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", z.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", z.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", z.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", z.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", z.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", z.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", z.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", z.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", z.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", z.UI_TAG_COLOR); + t("mjr-show-filename", R.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", R.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", R.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", R.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", R.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", R.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", R.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", R.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", R.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", R.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${R.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${R.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", R.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", R.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", R.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", R.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", R.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", R.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", R.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", R.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", R.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", R.UI_TAG_COLOR); } -function pi(e, { applySettingsClasses: t = !0 } = {}) { +function ri(e, { applySettingsClasses: t = !0 } = {}) { if (!e) return null; if (e.id = "mjr-assets-grid", e.classList.add("mjr-grid"), e.tabIndex = 0, e.setAttribute("role", "grid"), t) { - fi(e); + ni(e); let t = () => { requestAnimationFrame(() => { - fi(e); + ni(e); }); }; try { @@ -344,7 +343,7 @@ function pi(e, { applySettingsClasses: t = !0 } = {}) { } return e; } -function mi(e, t, ...n) { +function ii(e, t, ...n) { let r = { _mjrCaptureAnchor: "captureAnchor", _mjrDispose: "dispose", @@ -367,56 +366,328 @@ function mi(e, t, ...n) { console.debug?.(e); } } -function hi(e, t = {}, n = {}) { - return mi(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; +function ai(e, t = {}, n = {}) { + return ii(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; } -function gi(e, t = "*", n = {}) { - return mi(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ +function oi(e, t = "*", n = {}) { + return ii(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function _i(e, t, n = {}) { - return mi(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ +function si(e, t, n = {}) { + return ii(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function vi(e) { - return mi(e, "_mjrPrepareForScopeSwitch"); +function ci(e) { + return ii(e, "_mjrPrepareForScopeSwitch"); } -function yi(e) { +function li(e) { try { e?._mjrSettingsChangedCleanup?.(); } catch (e) { console.debug?.(e); } - return mi(e, "_mjrDispose"); + return ii(e, "_mjrDispose"); } -function bi(e) { - return mi(e, "_mjrRefreshGrid"); +function ui(e) { + return ii(e, "_mjrRefreshGrid"); } -function xi(e) { - return mi(e, "_mjrCaptureAnchor") ?? null; +function di(e) { + return ii(e, "_mjrCaptureAnchor") ?? null; } -function Si(e, t) { - return mi(e, "_mjrRestoreAnchor", t); +function fi(e, t) { + return ii(e, "_mjrRestoreAnchor", t); } -function Ci(e, t, n = {}) { - return mi(e, "_mjrRemoveAssets", t, n) ?? { +function pi(e, t, n = {}) { + return ii(e, "_mjrRemoveAssets", t, n) ?? { ok: !1, removed: 0, selectedIds: [] }; } -function wi(e, t) { - return !!mi(e, "_mjrUpsertAsset", t); +function mi(e, t) { + return !!ii(e, "_mjrUpsertAsset", t); } -function Ti(e, t) { - return !!mi(e, "_mjrUpsertAssetNow", t); +function hi(e, t) { + return !!ii(e, "_mjrUpsertAssetNow", t); +} +// ui/features/grid/AssetCardRenderer.ts +function gi(e) { + try { + return String(e || "").trim().toLowerCase(); + } catch { + return ""; + } +} +function _i(e) { + try { + return (String(e || "").split(".").pop() || "").toUpperCase(); + } catch { + return ""; + } +} +function vi(e) { + try { + let t = String(e || ""), n = t.lastIndexOf("."), r = n > 0 ? t.slice(0, n) : t; + return String(r || "").trim().toLowerCase(); + } catch { + return ""; + } +} +function yi(e, t) { + if (!e || !Array.isArray(t) || t.length === 0 || (Number(e?.generation_time_ms ?? e?.metadata?.generation_time_ms ?? 0) || 0) > 0) return e; + let n = t.find((e) => (Number(e?.generation_time_ms ?? e?.metadata?.generation_time_ms ?? 0) || 0) > 0); + if (!n) return e; + let r = Number(n?.generation_time_ms ?? n?.metadata?.generation_time_ms ?? 0) || 0; + return r <= 0 || (e.generation_time_ms = r, !e.has_generation_data && n?.has_generation_data && (e.has_generation_data = n.has_generation_data)), e; +} +function bi(e, t) { + let n = String(e?.kind || "").toLowerCase(); + if (n) return n; + let r = /* @__PURE__ */ new Set([ + "PNG", + "JPG", + "JPEG", + "WEBP", + "GIF", + "BMP", + "TIF", + "TIFF" + ]), i = /* @__PURE__ */ new Set([ + "MP4", + "WEBM", + "MOV", + "AVI", + "MKV" + ]), a = /* @__PURE__ */ new Set([ + "MP3", + "WAV", + "OGG", + "FLAC" + ]), o = /* @__PURE__ */ new Set([ + "OBJ", + "FBX", + "GLB", + "GLTF", + "STL", + "PLY", + "SPLAT", + "KSPLAT", + "SPZ" + ]); + return r.has(t) ? "image" : i.has(t) ? "video" : a.has(t) ? "audio" : o.has(t) ? "model3d" : "unknown"; +} +function xi(e) { + try { + return !!e()?.siblings?.hidePngSiblings; + } catch { + return !1; + } +} +function Si(e) { + return `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}`; +} +function Ci(e) { + let t = gi(e?.filename); + return t ? `${Si(e)}|${t}` : ""; +} +function wi(e, t = _i(e?.filename || "")) { + let n = bi(e, t), r = String(e?.filename || "").trim(); + if (!r) return ""; + let i = Si(e); + if (n === "model3d") return `${i}|model3d|${r.toLowerCase()}`; + let a = vi(r); + return a ? `${i}|media|${a}` : ""; +} +function Ti(e) { + let t = e.nonImageSiblingKeys || /* @__PURE__ */ new Set(); + e.nonImageSiblingKeys = t; + let n = e.stemMap || /* @__PURE__ */ new Map(); + e.stemMap = n; + let r = e.assetIdSet || /* @__PURE__ */ new Set(); + e.assetIdSet = r; + let i = e.seenKeys || /* @__PURE__ */ new Set(); + return e.seenKeys = i, e.hiddenPngSiblings ??= 0, { + nonImageSiblingKeys: t, + stemMap: n, + assetIdSet: r, + seenKeys: i + }; +} +function Ei(e, t = [], { assetKey: n = null, preserveHiddenCount: r = !1 } = {}) { + let i = Number(e?.hiddenPngSiblings || 0) || 0; + e.seenKeys = /* @__PURE__ */ new Set(), e.assetIdSet = /* @__PURE__ */ new Set(), e.filenameCounts = /* @__PURE__ */ new Map(), e.nonImageSiblingKeys = /* @__PURE__ */ new Set(), e.stemMap = /* @__PURE__ */ new Map(), e.renderedFilenameMap = /* @__PURE__ */ new Map(), e.hiddenPngSiblings = r ? i : 0, typeof n == "function" && (e.assetKeyFn = n); + let a = Ti(e); + for (let r of Array.isArray(t) ? t : []) if (r && typeof r == "object") { + try { + let e = r?.id == null ? "" : String(r.id); + e && a.assetIdSet.add(e); + } catch (e) { + console.debug?.(e); + } + try { + let t = typeof n == "function" ? n(r) : e?.assetKeyFn?.(r); + t && a.seenKeys.add(t); + } catch (e) { + console.debug?.(e); + } + try { + let t = Ci(r); + t && e.filenameCounts.set(t, (Number(e.filenameCounts.get(t) || 0) || 0) + 1); + } catch (e) { + console.debug?.(e); + } + try { + let e = _i(r?.filename || ""), t = wi(r, e); + if (!t) continue; + let n = a.stemMap.get(t); + n || (n = [], a.stemMap.set(t, n)), n.push(r); + let i = bi(r, e); + (i === "video" || i === "audio" || i === "model3d" || e === "WEBP") && a.nonImageSiblingKeys.add(t); + } catch (e) { + console.debug?.(e); + } + } +} +function Di(e, t, n) { + try { + t?.id != null && n.assetIdSet.delete(String(t.id)); + } catch (e) { + console.debug?.(e); + } + try { + let r = e?.assetKeyFn?.(t); + r && n.seenKeys.delete(r); + } catch (e) { + console.debug?.(e); + } +} +function Oi(e, t, n, r) { + let i = n.stemMap.get(t); + if (!i?.length) return []; + let a = []; + for (let e = i.length - 1; e >= 0; e--) r(i[e]) && (a.push(i[e]), i.splice(e, 1)); + return i.length || n.stemMap.delete(t), a; +} +function ki(e, t, n) { + if (!xi(n)) return { + hidden: !1, + hideEnabled: !1, + removed: [] + }; + let r = Ti(t), i = String(e?.filename || ""), a = _i(i), o = bi(e, a), s = wi(e, a); + if (!s) return { + hidden: !1, + hideEnabled: !0, + removed: [] + }; + if (o === "video" || o === "audio" || o === "model3d" || a === "WEBP") return r.nonImageSiblingKeys.add(s), { + hidden: !1, + hideEnabled: !0, + removed: Oi(t, s, r, (e) => _i(e?.filename || "") === "PNG") + }; + if (a === "PNG") { + let t = `${Si(e)}|model3d|${vi(i)}`; + if (r.nonImageSiblingKeys.has(s) || r.nonImageSiblingKeys.has(t)) return { + hidden: !0, + hideEnabled: !0, + removed: [] + }; + } + return { + hidden: !1, + hideEnabled: !0, + removed: [] + }; +} +function Ai(e, t, n, r) { + let i = xi(r.loadMajoorSettings), a = n.filenameCounts || /* @__PURE__ */ new Map(); + n.filenameCounts = a, r.clearGridMessage(e); + let o = r.ensureVirtualGrid(e, n); + if (!o) return 0; + i || (n.hiddenPngSiblings = 0), n.assetKeyFn = r.assetKey; + let s = Ti(n), c = /* @__PURE__ */ new Map(); + for (let e of n.assets || []) { + let t = Ci(e); + if (!t) continue; + let n = c.get(t); + n || (n = [], c.set(t, n)), n.push(e); + } + let l = 0, u = !1, d = [], f = /* @__PURE__ */ new Set(), p = () => { + try { + let e = new Set((Array.isArray(n.assets) ? n.assets : []).map((e) => String(e?.id || "")).filter(Boolean)); + for (let [t, n] of c.entries()) { + let r = (Array.isArray(n) ? n : []).filter((t) => { + let n = String(t?.id || ""); + return n ? e.has(n) : !1; + }).length; + a.set(t, r); + } + } catch (e) { + console.debug?.(e); + } + }; + for (let e of t || []) { + try { + if (e?.id == null || String(e.id).trim() === "") { + let t = String(e?.kind || "").toLowerCase(), n = String(e?.filepath || "").trim(), r = String(e?.subfolder || "").trim(), i = String(e?.filename || "").trim(); + e.id = `asset:${`${String(e?.type || "").trim().toLowerCase()}|${t}|${n}|${r}|${i}` || "unknown"}`; + } + } catch (e) { + console.debug?.(e); + } + let t = _i(String(e?.filename || "")), i = ki(e, n, r.loadMajoorSettings); + for (let e of i.removed || []) f.add(e); + if (i.hidden) { + n.hiddenPngSiblings += 1; + continue; + } + let a = Ci(e); + if (a) { + let t = c.get(a); + t || (t = [], c.set(a, t)), t.push(e); + } + let o = r.assetKey(e); + if (!o || s.seenKeys.has(o) || e.id != null && s.assetIdSet.has(String(e.id))) continue; + s.seenKeys.add(o), e.id != null && s.assetIdSet.add(String(e.id)), d.push(e); + let u = wi(e, t); + if (u) { + let t = s.stemMap.get(u); + t || (t = [], s.stemMap.set(u, t)), t.push(e); + } + l++; + } + if (f.size > 0) { + n.hiddenPngSiblings += f.size, n.assets = n.assets.filter((e) => !f.has(e)); + for (let e = d.length - 1; e >= 0; e--) f.has(d[e]) && (d.splice(e, 1), l = Math.max(0, l - 1)); + for (let e of f) Di(n, e, s); + try { + for (let e of f) { + let t = Ci(e); + if (!t) continue; + let n = c.get(t); + if (!n) continue; + let r = n.indexOf(e); + r > -1 && n.splice(r, 1), n.length || c.delete(t); + } + } catch (e) { + console.debug?.(e); + } + u = !0; + } + d.length > 0 && (n.assets.push(...d), u = !0), u && (p(), o.setItems(n.assets), n.sentinel && e.appendChild(n.sentinel)); + try { + e.dataset.mjrHidePngSiblingsEnabled = i ? "1" : "0", e.dataset.mjrHiddenPngSiblings = String(Number(n.hiddenPngSiblings || 0) || 0); + } catch (e) { + console.debug?.(e); + } + return l; } // ui/features/panel/views/popoverManager.ts -function Ei(e, t) { +function ji(e, t) { if (!e || !t?.size) return !1; for (let n of t.values()) { let t = n?.popover || null; @@ -431,7 +702,7 @@ function Ei(e, t) { } return !1; } -function Di(e) { +function Mi(e) { if (!e || e === document?.body) return !1; try { if (typeof e.matches == "function" && e.matches("[data-pc-name],[role='listbox'],[role='dialog'],[role='menu'],[role='tree'],[role='grid']")) return !0; @@ -445,7 +716,7 @@ function Di(e) { ].join(" ").toLowerCase(); return /\b(p-|p_)?(select|listbox|multiselect|datepicker|calendar|overlay|panel|menu|dialog|tooltip|popover)\b/.test(t); } -function Oi(e) { +function Ni(e) { let t = /* @__PURE__ */ new Map(), n = null, r = 0, i = [], a = !1, o = !1, s = !1, c = new AbortController(), l = new AbortController(), u = !1, d = null, f = (e, t = "y") => { if (!e) return !1; let n = globalThis.getComputedStyle?.(e), r = String(t === "x" ? n?.overflowX || n?.overflow || "" : n?.overflowY || n?.overflow || ""); @@ -531,7 +802,7 @@ function Oi(e) { for (let e of t.values()) _(e.popover, e.anchor); })); }, y = (e) => { - Ei(e?.target, t) || v(); + ji(e?.target, t) || v(); }, b = () => { if (t.size) { try { @@ -689,7 +960,7 @@ function Oi(e) { try { let e = n; for (; e && e !== document.body && e.parentNode && e.parentNode !== document.body;) e = e.parentNode; - if (e && e !== document.body && e.parentNode === document.body && Di(e)) for (let e of t.values()) try { + if (e && e !== document.body && e.parentNode === document.body && Mi(e)) for (let e of t.values()) try { if (!e?.popover) continue; if (e.popover.querySelector("[data-pc-name][aria-expanded='true']") || e.popover.querySelector("[aria-expanded='true'][role='combobox']")) return; } catch (e) { @@ -750,8 +1021,154 @@ function Oi(e) { } }; } +// ui/utils/filenames.ts +var Pi = /* @__PURE__ */ new Set([ + "CON", + "PRN", + "AUX", + "NUL", + "COM1", + "COM2", + "COM3", + "COM4", + "COM5", + "COM6", + "COM7", + "COM8", + "COM9", + "LPT1", + "LPT2", + "LPT3", + "LPT4", + "LPT5", + "LPT6", + "LPT7", + "LPT8", + "LPT9" +]), Fi = 255; +function Ii(e) { + try { + let t = String(e ?? "").trim(); + if (!t) return { + valid: !1, + reason: "Filename cannot be empty" + }; + if (t.length > Fi) return { + valid: !1, + reason: `Filename is too long (max ${Fi} characters)` + }; + if (t.includes("/") || t.includes("\\")) return { + valid: !1, + reason: "Filename cannot contain path separators" + }; + if (t.includes("\0")) return { + valid: !1, + reason: "Filename cannot contain null bytes" + }; + for (let e of t) if (e.charCodeAt(0) < 32) return { + valid: !1, + reason: "Filename cannot contain control characters" + }; + if (t.startsWith(".") || t.startsWith(" ")) return { + valid: !1, + reason: "Filename cannot start with a dot or space" + }; + if (t.endsWith(".") || t.endsWith(" ")) return { + valid: !1, + reason: "Filename cannot end with a dot or space" + }; + let n = t.split(".")[0].toUpperCase(); + return Pi.has(n) ? { + valid: !1, + reason: "Filename uses a reserved Windows name" + } : { + valid: !0, + reason: "" + }; + } catch (e) { + return { + valid: !1, + reason: String(e || "Invalid filename") + }; + } +} +function Li(e) { + try { + return String(e ?? "").trim(); + } catch { + return ""; + } +} +function Ri(e) { + let t = Li(e); + if (!t) return { + stem: "", + ext: "" + }; + let n = t.lastIndexOf("."); + return n <= 0 || n === t.length - 1 ? { + stem: t, + ext: "" + } : { + stem: t.slice(0, n), + ext: t.slice(n) + }; +} +function zi(e, t) { + let n = Li(e); + if (!n) return ""; + let r = Ri(t); + return !Ri(n).ext && r.ext ? `${n}${r.ext}` : n; +} +// ui/utils/deleteGuard.ts +async function Bi(e, t) { + if (!R.DELETE_CONFIRMATION) return !0; + let n = e > 1 ? L("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : L("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || L("label.thisFile", "this file")) }); + return !!await jt(n, L("dialog.confirmDeleteTitle", "Majoor: Confirm delete")); +} +// ui/features/collections/contextmenu/addToCollectionMenuState.ts +var Vi = hr({ + open: !1, + x: 0, + y: 0, + assets: [] +}); +function Hi() { + try { + window.dispatchEvent(new CustomEvent("mjr-close-all-menus")); + } catch (e) { + console.debug?.(e); + } +} +function Ui({ x: e = 0, y: t = 0, assets: n = [] } = {}) { + Hi(), Vi.open = Array.isArray(n) && n.length > 0, Vi.x = Number(e) || 0, Vi.y = Number(t) || 0, Vi.assets = Array.isArray(n) ? [...n] : []; +} +function Wi() { + Vi.open = !1, Vi.x = 0, Vi.y = 0, Vi.assets = []; +} +// ui/features/collections/contextmenu/addToCollectionMenu.ts +function Gi(e) { + if (!e || typeof e != "object") return null; + let t = e.filepath || e.path || e?.file_info?.filepath || ""; + return t ? { + filepath: t, + filename: e.filename || "", + subfolder: e.subfolder || "", + type: (e.type || "output").toLowerCase(), + root_id: be(e), + kind: e.kind || "" + } : null; +} +async function Ki({ x: e, y: t, assets: n }) { + let r = Array.isArray(n) ? n.map(Gi).filter(Boolean) : []; + r.length ? Ui({ + x: Number(e) || 0, + y: Number(t) || 0, + assets: r + }) : F(L("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); +} // ui/features/grid/GridKeyboard.ts -var ki = { +var qi = { OPEN_VIEWER: { key: "Enter", description: "Open selected in viewer" @@ -867,29 +1284,29 @@ var ki = { key: "ArrowRight", description: "Navigate right" } -}, Ai = null; -function ji() { - return Ai ||= import("./chunks/viewerOpenRequest-WCeGPIlE.js").then((e) => e.n), Ai; +}, Ji = null; +function Yi() { + return Ji ||= import("./chunks/viewerOpenRequest-WOJE90Gn.js").then((e) => e.n), Ji; } -function Mi(e) { +function Xi(e) { if (!e) return ""; let t = []; e.ctrl && t.push("Ctrl"), e.shift && t.push("Shift"), e.alt && t.push("Alt"); let n = e.key; return n === " " && (n = "Space"), n === "Delete" && (n = "Del"), n === "ArrowUp" && (n = "<-‘"), n === "ArrowDown" && (n = "<-“"), n === "ArrowLeft" && (n = "<-"), n === "ArrowRight" && (n = "->"), t.push(n.length === 1 ? n.toUpperCase() : n), t.join("+"); } -function Ni(e, t) { +function Zi(e, t) { if (!t || !e) return !1; let n = e.key.toLowerCase() === t.key.toLowerCase() || e.key === t.key, r = !!t.ctrl === (e.ctrlKey || e.metaKey), i = !!t.shift === e.shiftKey, a = !!t.alt === e.altKey; return n && r && i && a; } -var Pi = /* @__PURE__ */ new Map(); -function Fi(e, t, n) { +var Qi = /* @__PURE__ */ new Map(); +function $i(e, t, n) { let r = e?.id; if (!r) return; let i = String(r); try { - let e = Pi.get(i); + let e = Qi.get(i); e && clearTimeout(e); } catch (e) { console.debug?.(e); @@ -901,37 +1318,37 @@ function Fi(e, t, n) { } let a = setTimeout(async () => { try { - Pi.delete(i); - let e = await y(r, t); + Qi.delete(i); + let e = await N(r, t); if (!e?.ok) { - I(e?.error || R("toast.ratingUpdateFailed"), "error"); + F(e?.error || L("toast.ratingUpdateFailed"), "error"); return; } - I(R("toast.ratingSetN", { n: t }), "success", 1500), Rt(ct, { + F(L("toast.ratingSetN", { n: t }), "success", 1500), Tt(Ft, { assetId: String(r), rating: t }, { warnPrefix: "[GridKeyboard]" }); } catch (e) { - console.error("[GridKeyboard] Rating update failed:", e), I(R("toast.ratingUpdateError"), "error"); + console.error("[GridKeyboard] Rating update failed:", e), F(L("toast.ratingUpdateError"), "error"); } }, 350); - Pi.set(i, a); + Qi.set(i, a); } -function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = () => [], getActiveAsset: r = () => null, onOpenDetails: i = () => {}, onOpenTagsEditor: a = () => {}, onSelectionChanged: o = () => {}, onAssetChanged: s = () => {} } = {}) { +function ea({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = () => [], getActiveAsset: r = () => null, onOpenDetails: i = () => {}, onOpenTagsEditor: a = () => {}, onSelectionChanged: o = () => {}, onAssetChanged: s = () => {} } = {}) { if (!e) return { bind: () => {}, unbind: () => {}, dispose: () => {} }; let c = null, l = null, u = null, d = null, f = !1, p = !1, m = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => { - ji().then((r) => r.requestViewerOpen({ + Yi().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); }, h = () => { try { - tr(e); + pt(e); } catch (e) { console.debug?.(e); } @@ -968,9 +1385,9 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } }, y = (e) => { if (!e?.filepath) return !1; - let t = Ye(e.filepath), n = document.createElement("a"); - return n.href = t, n.download = e.filename || "download", document.body.appendChild(n), n.click(), document.body.removeChild(n), I(R("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3), !0; - }, b = () => { + let t = Se(e.filepath), n = document.createElement("a"); + return n.href = t, n.download = e.filename || "download", document.body.appendChild(n), n.click(), document.body.removeChild(n), F(L("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3), !0; + }, x = () => { try { if (Array.isArray(t?.()?.assets) && t().assets.length) return t().assets; } catch (e) { @@ -989,7 +1406,7 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } catch { return []; } - }, x = () => { + }, S = () => { try { let t = _(); if (t.length >= 2) { @@ -1010,14 +1427,14 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = console.debug?.(e); } return 1; - }, S = (t, n) => { + }, C = (t, n) => { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : [], i = String(n || r[0] || ""); try { typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection(r, i) : (e.dataset.mjrSelectedAssetIds = JSON.stringify(r), e.dataset.mjrSelectedAssetId = i); } catch (e) { console.debug?.(e); } - }, C = (t) => { + }, w = (t) => { let n = String(t || "").trim(); if (n) { try { @@ -1041,11 +1458,11 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = }, T = (t) => { let n = String(t.key || ""); if (n !== "ArrowLeft" && n !== "ArrowRight" && n !== "ArrowUp" && n !== "ArrowDown" && n !== "Home" && n !== "End" || t.ctrlKey || t.altKey || t.metaKey) return !1; - let r = b(); + let r = x(); if (!Array.isArray(r) || r.length === 0) return !1; let i = v(), a = String(i?.id || e?.dataset?.mjrSelectedAssetId || ""), s = r.findIndex((e) => String(e?.id || "") === a), c = s >= 0; s < 0 && (s = 0); - let l = Math.max(1, x()), u = s; + let l = Math.max(1, S()), u = s; if (n === "ArrowLeft" ? --u : n === "ArrowRight" ? u += 1 : n === "ArrowUp" ? u -= l : n === "ArrowDown" ? u += l : n === "Home" ? u = 0 : n === "End" && (u = r.length - 1), u = Math.max(0, Math.min(r.length - 1, u)), c && u === s && n !== "Home" && n !== "End") return !1; let d = String(r[u]?.id || ""); if (!d) return !1; @@ -1053,9 +1470,9 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = let t = String(e?._mjrSelectionAnchorId || ""); t ||= a || d; let n = r.findIndex((e) => String(e?.id || "") === t), i = n >= 0 ? n : s, o = Math.min(i, u), c = Math.max(i, u), l = r.slice(o, c + 1).map((e) => String(e?.id || "")).filter(Boolean); - S(l, d); - } else e._mjrSelectionAnchorId = d, S([d], d); - C(d); + C(l, d); + } else e._mjrSelectionAnchorId = d, C([d], d); + w(d); try { o?.(); } catch (e) { @@ -1064,12 +1481,12 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = return !0; }, E = async (n) => { let r = n.target; - if (r && (r.tagName === "INPUT" || r.tagName === "TEXTAREA" || r.isContentEditable) || Se() || ve().scope === "viewer") return; + if (r && (r.tagName === "INPUT" || r.tagName === "TEXTAREA" || r.isContentEditable) || vt() || gt().scope === "viewer") return; if (document.activeElement !== document.body) { let t = document.activeElement, n = e.contains(t), r = t && t.contains && t.contains(e), i = t?.closest?.(".mjr-asset-card"); if (!n && !r && !i) return; } else { - let t = Qn(); + let t = ht(); if (t && t !== e) return; } let c = () => { @@ -1084,38 +1501,38 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = console.debug?.(e); } let l = g(), u = v(), d = t(); - if (Ni(n, ki.DOWNLOAD) && u?.filepath) { + if (Zi(n, qi.DOWNLOAD) && u?.filepath) { c(), p = !0; return; } - let f = !!ve().ratingHotkeysActive; + let f = !!gt().ratingHotkeysActive; if (!n.ctrlKey && !n.altKey && !n.metaKey && !n.shiftKey) { - if (!f && Ni(n, ki.RATING_1) && u?.id) { - c(), Fi(u, 1, s); + if (!f && Zi(n, qi.RATING_1) && u?.id) { + c(), $i(u, 1, s); return; } - if (!f && Ni(n, ki.RATING_2) && u?.id) { - c(), Fi(u, 2, s); + if (!f && Zi(n, qi.RATING_2) && u?.id) { + c(), $i(u, 2, s); return; } - if (!f && Ni(n, ki.RATING_3) && u?.id) { - c(), Fi(u, 3, s); + if (!f && Zi(n, qi.RATING_3) && u?.id) { + c(), $i(u, 3, s); return; } - if (!f && Ni(n, ki.RATING_4) && u?.id) { - c(), Fi(u, 4, s); + if (!f && Zi(n, qi.RATING_4) && u?.id) { + c(), $i(u, 4, s); return; } - if (!f && Ni(n, ki.RATING_5) && u?.id) { - c(), Fi(u, 5, s); + if (!f && Zi(n, qi.RATING_5) && u?.id) { + c(), $i(u, 5, s); return; } - if (!f && Ni(n, ki.RATING_RESET) && u?.id) { - c(), Fi(u, 0, s); + if (!f && Zi(n, qi.RATING_RESET) && u?.id) { + c(), $i(u, 0, s); return; } } - if ((Ni(n, ki.OPEN_VIEWER) || Ni(n, ki.OPEN_VIEWER_ALT)) && l.length > 0) { + if ((Zi(n, qi.OPEN_VIEWER) || Zi(n, qi.OPEN_VIEWER_ALT)) && l.length > 0) { c(); try { if (l.length >= 2 && l.length <= 4) m({ @@ -1138,8 +1555,8 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } catch (e) { console.error("[GridKeyboard] Open viewer failed:", e); } - } else if (Ni(n, ki.METADATA_PANEL) && u) c(), i(u); - else if (Ni(n, ki.COMPARE_AB) && l.length === 2) { + } else if (Zi(n, qi.METADATA_PANEL) && u) c(), i(u); + else if (Zi(n, qi.COMPARE_AB) && l.length === 2) { c(); try { m({ @@ -1150,7 +1567,7 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } catch (e) { console.debug?.(e); } - } else if (Ni(n, ki.SIDE_BY_SIDE) && l.length >= 2 && l.length <= 4) { + } else if (Zi(n, qi.SIDE_BY_SIDE) && l.length >= 2 && l.length <= 4) { c(); try { m({ @@ -1161,29 +1578,29 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } catch (e) { console.debug?.(e); } - } else if (Ni(n, ki.EDIT_TAGS) && u?.id) c(), a(u); - else if (Ni(n, ki.ADD_TO_COLLECTION) && (l.length > 0 || u)) { + } else if (Zi(n, qi.EDIT_TAGS) && u?.id) c(), a(u); + else if (Zi(n, qi.ADD_TO_COLLECTION) && (l.length > 0 || u)) { c(); let t = l.length > 0 ? l : [u], n = e.getBoundingClientRect(); - await Bt({ + await Ki({ x: n.left + n.width / 2, y: n.top + n.height / 2, assets: t }); } else { - if (Ni(n, ki.REMOVE_FROM_COLLECTION)) { + if (Zi(n, qi.REMOVE_FROM_COLLECTION)) { let e = d?.collectionId; if (e && (l.length > 0 || u)) { c(); try { let t = (l.length > 0 ? l : [u]).map((e) => String(e?.filepath || e?.path || e?.file_info?.filepath || "").trim()).filter(Boolean); if (!t.length) { - I(R("toast.removeFromCollectionFailed", "No valid files to remove from collection"), "warning"); + F(L("toast.removeFromCollectionFailed", "No valid files to remove from collection"), "warning"); return; } - let n = await Ee(e, t); + let n = await ve(e, t); if (!n?.ok) { - I(n?.error || R("toast.removeFromCollectionFailed", "Failed to remove from collection"), "error"); + F(n?.error || L("toast.removeFromCollectionFailed", "Failed to remove from collection"), "error"); return; } try { @@ -1191,54 +1608,54 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } catch (e) { console.debug?.(e); } - I(R("toast.removedFromCollection", "Removed from collection"), "success", 1400); + F(L("toast.removedFromCollection", "Removed from collection"), "success", 1400); } catch (e) { - I(R("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: e?.message || String(e || "") }), "error"); + F(L("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: e?.message || String(e || "") }), "error"); } return; } } - if (Ni(n, ki.COPY_PATH) && u?.filepath) { + if (Zi(n, qi.COPY_PATH) && u?.filepath) { c(); try { - await navigator.clipboard.writeText(u.filepath), I(R("toast.pathCopied"), "success", 2e3); + await navigator.clipboard.writeText(u.filepath), F(L("toast.pathCopied"), "success", 2e3); } catch { - I(R("toast.pathCopyFailed"), "error"); + F(L("toast.pathCopyFailed"), "error"); } - } else if (Ni(n, ki.OPEN_IN_FOLDER) && u?.id) { + } else if (Zi(n, qi.OPEN_IN_FOLDER) && u?.id) { c(); - let e = await ee(u.id); - e?.ok ? I(R("toast.openedInFolder"), "info", 2e3) : I(e?.error || R("toast.openFolderFailed"), "error"); - } else if (Ni(n, ki.RENAME) && u?.id) { + let e = await Ke(u.id); + e?.ok ? F(L("toast.openedInFolder"), "info", 2e3) : F(e?.error || L("toast.openFolderFailed"), "error"); + } else if (Zi(n, qi.RENAME) && u?.id) { c(); - let e = u.filename || "", t = await Et(R("dialog.rename.title", "Rename file"), e), n = bt(t, e); - if (n && n !== e) { - let e = At(n); + let e = u.filename || "", t = zi(await wt(L("dialog.rename.title", "Rename file"), e), e); + if (t && t !== e) { + let e = Ii(t); if (!e.valid) { - I(e.reason, "error"); + F(e.reason, "error"); return; } try { - let e = await Ae(u, n); + let e = await je(u, t); if (e?.ok) { - let t = e?.data?.asset; - t && typeof t == "object" ? Object.assign(u, t) : (u.filename = n, u.filepath = u.filepath?.replace(/[^\\/]+$/, n), u.path &&= String(u.path).replace(/[^\\/]+$/, n), u.file_info && typeof u.file_info == "object" && (u.file_info.filename = n, u.file_info.filepath && (u.file_info.filepath = String(u.file_info.filepath).replace(/[^\\/]+$/, n)), u.file_info.path && (u.file_info.path = String(u.file_info.path).replace(/[^\\/]+$/, n)))), I(R("toast.fileRenamedSuccess"), "success"); + let n = e?.data?.asset; + n && typeof n == "object" ? Object.assign(u, n) : (u.filename = t, u.filepath = u.filepath?.replace(/[^\\/]+$/, t), u.path &&= String(u.path).replace(/[^\\/]+$/, t), u.file_info && typeof u.file_info == "object" && (u.file_info.filename = t, u.file_info.filepath && (u.file_info.filepath = String(u.file_info.filepath).replace(/[^\\/]+$/, t)), u.file_info.path && (u.file_info.path = String(u.file_info.path).replace(/[^\\/]+$/, t)))), F(L("toast.fileRenamedSuccess"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "rename-keyboard" } })); } catch (e) { console.debug?.(e); } s(); - } else I(e?.error || R("toast.fileRenameFailed"), "error"); + } else F(e?.error || L("toast.fileRenameFailed"), "error"); } catch (e) { - I(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); + F(L("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); } } - } else if ((Ni(n, ki.DELETE) || Ni(n, ki.DELETE_ALT)) && (u?.id || l.length > 0)) { + } else if ((Zi(n, qi.DELETE) || Zi(n, qi.DELETE_ALT)) && (u?.id || l.length > 0)) { c(); let t = l.length > 0 ? l : [u], n = 0, r = 0, i = []; for (let e of t) if (e?.id) try { - (await w(e.id))?.ok ? (n++, i.push(String(e.id))) : r++; + (await b(e.id))?.ok ? (n++, i.push(String(e.id))) : r++; } catch { r++; } @@ -1249,7 +1666,7 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } catch (e) { console.debug?.(e); } - r === 0 ? I(R("toast.filesDeletedShort", "{n} files deleted", { n }), "success") : I(R("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { + r === 0 ? F(L("toast.filesDeletedShort", "{n} files deleted", { n }), "success") : F(L("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { success: n, failed: r }), "warning"); @@ -1262,7 +1679,7 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = console.debug?.(e); } o(); - } else if (Ni(n, ki.SELECT_ALL)) { + } else if (Zi(n, qi.SELECT_ALL)) { c(); let t = []; try { @@ -1287,7 +1704,7 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = console.debug?.(e); } o(); - } else if (Ni(n, ki.DESELECT_ALL)) { + } else if (Zi(n, qi.DESELECT_ALL)) { c(); try { typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection([], "") : (_().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => { @@ -1300,7 +1717,7 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } } }, D = (e) => { - if (String(e?.key || "").toLowerCase() !== "s" || !p || (p = !1, Se()) || ve().scope === "viewer") return; + if (String(e?.key || "").toLowerCase() !== "s" || !p || (p = !1, vt()) || gt().scope === "viewer") return; let t = v(); t?.filepath && (e.preventDefault?.(), e.stopPropagation?.(), e.stopImmediatePropagation?.(), y(t)); }, O = () => { @@ -1311,7 +1728,7 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = if (f && c) { document.removeEventListener("keydown", c, !0), l && document.removeEventListener("keyup", l, !0), u && document.removeEventListener("dragstart", u, !0), d && (e.removeEventListener("pointerdown", d, !0), e.removeEventListener("focusin", d, !0)), c = null, l = null, u = null, d = null, p = !1; try { - Zn(e); + _t(e); } catch (e) { console.debug?.(e); } @@ -1321,12 +1738,12 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = console.debug?.(e); } f = !1; - for (let e of Pi.values()) try { + for (let e of Qi.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - Pi.clear(); + Qi.clear(); } }; return { @@ -1334,63 +1751,108 @@ function Ii({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = unbind: A, dispose: () => { A(); - for (let e of Pi.values()) try { + for (let e of Qi.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - Pi.clear(); + Qi.clear(); } }; } -function Li(e) { - let t = ki[e]; - return t ? Mi(t) : ""; +function ta(e) { + let t = qi[e]; + return t ? Xi(t) : ""; +} +// ui/features/contextmenu/ratingUpdater.ts +var na = 350, ra = /* @__PURE__ */ new Map(); +function ia(e) { + let t = ra.get(e); + if (t) { + try { + clearTimeout(t.timer); + } catch (e) { + console.debug?.(e); + } + try { + t.controller?.abort?.(); + } catch (e) { + console.debug?.(e); + } + ra.delete(e); + } +} +function aa(e) { + e && ia(String(e)); +} +function oa() { + for (let e of Array.from(ra.keys())) aa(e); +} +function sa(e, t, { onSuccess: n, onFailure: r, successMessage: i = null, errorMessage: a = null, warnPrefix: o = "[RatingUpdater]" } = {}) { + if (!e) return; + aa(e); + let s = new AbortController(), c = setTimeout(async () => { + ra.delete(String(e)); + try { + let o = await N(e, t, { signal: s.signal }); + if (!o?.ok) { + F(o?.error || a || "Failed to update rating", "error"), r?.(o); + return; + } + i && F(i, "success", 1500), n?.(o); + } catch (e) { + ct(e, o, { showToast: !0 }), r?.(e); + } + }, na); + ra.set(String(e), { + timer: c, + controller: s + }); } // ui/features/workflows/workflowInfoState.ts -var Ri = Cr({ +var ca = hr({ open: !1, workflow: null }); -function zi(e) { - Ri.workflow = e || null, Ri.open = !0; +function la(e) { + ca.workflow = e || null, ca.open = !0; } -function Bi() { - Ri.open = !1, Ri.workflow = null; +function ua() { + ca.open = !1, ca.workflow = null; } // ui/features/contextmenu/GridContextMenu.ts -var Vi = 1, Hi = null, Ui = null; -function Wi() { - return Hi ||= import("./chunks/viewerOpenRequest-WCeGPIlE.js").then((e) => e.n), Hi; +var da = 1, fa = null, pa = null; +function ma() { + return fa ||= import("./chunks/viewerOpenRequest-WOJE90Gn.js").then((e) => e.n), fa; } -function Gi() { - return Ui ||= import("./chunks/floatingViewerManager-BzaQii21.js").then((e) => e.n), Ui; +function ha() { + return pa ||= import("./chunks/floatingViewerManager-B_I-SRbd.js").then((e) => e.n), pa; } -function Ki(e) { +function ga(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.includes("open graph map") ? "graph-map" : t.includes("open in floating viewer") || t.includes("open floating viewer") ? "floating-viewer" : t.includes("rename") ? "rename" : t.includes("delete") ? "delete" : "" : ""; } function $(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) { return { - id: `mjr-grid-menu-item-${Vi++}`, + id: `mjr-grid-menu-item-${da++}`, type: "item", label: String(e || ""), iconClass: t ? String(t) : "", rightHint: n ? String(n) : "", - tone: Ki(e), + tone: ga(e), disabled: !!i, closeOnSelect: a, submenu: Array.isArray(o) && o.length ? o : null, action: typeof r == "function" ? r : null }; } -function qi() { +function _a() { return { - id: `mjr-grid-menu-separator-${Vi++}`, + id: `mjr-grid-menu-separator-${da++}`, type: "separator" }; } -var Ji = (e) => { +var va = (e) => { let t = /* @__PURE__ */ new Set(); if (!e) return t; try { @@ -1412,7 +1874,7 @@ var Ji = (e) => { console.debug?.(e); } return t; -}, Yi = (e) => { +}, ya = (e) => { let t = []; if (!e) return t; try { @@ -1448,11 +1910,11 @@ var Ji = (e) => { } return t; }; -async function Xi(e) { +async function ba(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) return e; try { - let n = await S(t, { timeoutMs: 25e3 }), r = n?.data?.workflow || n?.workflow || null, i = n?.data?.prompt || n?.prompt || null; + let n = await Le(t, { timeoutMs: 25e3 }), r = n?.data?.workflow || n?.workflow || null, i = n?.data?.prompt || n?.prompt || null; return !r && !i ? e : { ...e, workflow: r || e?.workflow, @@ -1467,71 +1929,71 @@ async function Xi(e) { return console.debug?.(t), e; } } -var Zi = (e) => { +var xa = (e) => { try { let t = e?.filepath || e?.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; } catch { return ""; } -}, Qi = (e) => { +}, Sa = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), - root_id: Pe(e) || void 0, + root_id: be(e) || void 0, kind: String(e.kind || "").toLowerCase() } : null; -}, $i = (e) => { +}, Ca = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || e.name || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), - root_id: Pe(e) || void 0 + root_id: be(e) || void 0 } : null; }; -function ea(e, t = "") { +function wa(e, t = "") { if (!e) return; let n = document.createElement("a"); n.href = e, t && (n.download = t), document.body.appendChild(n), n.click(), document.body.removeChild(n); } -async function ta(e) { - let t = (Array.isArray(e) ? e.filter((e) => !ha(e)) : []).map($i).filter(Boolean); +async function Ta(e) { + let t = (Array.isArray(e) ? e.filter((e) => !za(e)) : []).map(Ca).filter(Boolean); if (t.length < 2) { - I("Select at least two files to download a ZIP.", "warning", 2600); + F("Select at least two files to download a ZIP.", "warning", 2600); return; } let n = ""; try { - n = Je("mjr_", 24); + n = _e("mjr_", 24); } catch (e) { - ie(e, "[GridContextMenu] Batch ZIP token", { showToast: z.DEBUG_VERBOSE_ERRORS }), I("Could not create a secure ZIP token.", "error"); + ct(e, "[GridContextMenu] Batch ZIP token", { showToast: R.DEBUG_VERBOSE_ERRORS }), F("Could not create a secure ZIP token.", "error"); return; } - I(`Preparing ZIP for ${t.length} files...`, "info", 1800); - let r = await pe(lt.BATCH_ZIP_CREATE, { + F(`Preparing ZIP for ${t.length} files...`, "info", 1800); + let r = await me(p.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !1 }); if (!r?.ok) { - I(r?.error || "Failed to create ZIP.", "error"); + F(r?.error || "Failed to create ZIP.", "error"); return; } let i = r?.data?.filename || `Majoor_Batch_${t.length}.zip`; - ea(et(n), i), I(`Downloading ${i}...`, "info", 3e3); + wa(I(n), i), F(`Downloading ${i}...`, "info", 3e3); } -async function na(e) { +async function Ea(e) { let t = Array.isArray(e) ? e.filter(Boolean) : [], n = await Promise.all(t.map(async (e) => { - let t = Qi(e); + let t = Sa(e); if (!t) return null; - let n = (await Un({ - post: pe, - endpoint: lt.STAGE_TO_INPUT, + let n = (await En({ + post: me, + endpoint: p.STAGE_TO_INPUT, payload: t, index: !1 }))?.relativePath; @@ -1541,13 +2003,13 @@ async function na(e) { droppedExt: String(t.filename || "").split(".").pop() || "" } : null; })); - return gn({ - app: tt(), + return bn({ + app: $e(), items: n.filter(Boolean), event: null }); } -var ra = (e) => { +var Da = (e) => { if (e) { try { if (typeof e?._mjrSetSelection == "function") e._mjrSetSelection([], ""); @@ -1559,15 +2021,15 @@ var ra = (e) => { } catch (e) { console.debug?.(e); } - Rt("mjr:selection-changed", { selectedIds: [] }, { + Tt("mjr:selection-changed", { selectedIds: [] }, { target: e, warnPrefix: "[GridContextMenu]" }); } -}, ia = (e, t, n, r) => { +}, Oa = (e, t, n, r) => { if (!e) return; try { - ra(e); + Da(e); } catch (e) { console.debug?.(e); } @@ -1587,7 +2049,7 @@ var ra = (e) => { } catch (e) { console.debug?.(e); } -}, aa = (e) => { +}, ka = (e) => { let t = []; if (!e) return t; try { @@ -1609,7 +2071,7 @@ var ra = (e) => { console.debug?.(e); } return t; -}, oa = (e, t) => { +}, Aa = (e, t) => { try { let n = String(t ?? ""); return (e || []).findIndex((e) => String(e?.id ?? "") === n); @@ -1617,16 +2079,16 @@ var ra = (e) => { return -1; } }; -function sa(e) { +function ja(e) { if (e == null) return null; try { - return document.querySelector(`[data-mjr-asset-id="${xt(e)}"]`); + return document.querySelector(`[data-mjr-asset-id="${Lt(e)}"]`); } catch (e) { return console.debug?.(e), null; } } -function ca(e, t = null) { - let n = sa(e?.id); +function Ma(e, t = null) { + let n = ja(e?.id); if (!n || !n._mjrAsset || typeof n._mjrAsset != "object") return n; try { t && typeof t == "object" ? Object.assign(n._mjrAsset, t) : e && typeof e == "object" && Object.assign(n._mjrAsset, e); @@ -1635,7 +2097,7 @@ function ca(e, t = null) { } return n; } -var la = (e) => { +var Na = (e) => { try { let t = e ? "grid-contextmenu" : "grid-contextmenu-global"; window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: t } })); @@ -1643,7 +2105,7 @@ var la = (e) => { console.debug?.(e); } }; -async function ua(e, t) { +async function Pa(e, t) { if (!e) return { ok: !1, error: "Missing asset" @@ -1658,7 +2120,7 @@ async function ua(e, t) { ok: !1, error: "Missing filename" }; - let r = await pe(lt.INDEX_FILES, { + let r = await me(p.INDEX_FILES, { files: [n], incremental: !1 }); @@ -1667,24 +2129,24 @@ async function ua(e, t) { error: "Index refresh failed" }; if (e?.id != null) try { - let t = await se(e.id); + let t = await Ue(e.id); if (t?.ok && t?.data && typeof t.data == "object") { Object.assign(e, t.data); - let n = ca(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); + let n = Ma(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); if (r) { - let e = Ot(n._mjrAsset); + let e = _n(n._mjrAsset); e && r.replaceWith(e); } } } catch (e) { console.debug?.(e); } - return la(t), { + return Na(t), { ok: !0, data: { refreshed: !0 } }; } -function da(e, t, n) { +function Fa(e, t, n) { let r = e?.id; try { e.rating = t; @@ -1696,46 +2158,46 @@ function da(e, t, n) { } catch (e) { console.debug?.(e); } - r ? Jt(String(r), t, { + r ? sa(String(r), t, { successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared", errorMessage: "Failed to update rating", warnPrefix: "[GridContextMenu]", onSuccess: () => { - Rt(ct, { + Tt(Ft, { assetId: String(r), rating: t }, { warnPrefix: "[GridContextMenu]" }); }, onFailure: (e) => { - ie(e, "[GridContextMenu] Rating update", { showToast: z.DEBUG_VERBOSE_ERRORS }); + ct(e, "[GridContextMenu] Rating update", { showToast: R.DEBUG_VERBOSE_ERRORS }); } - }) : y(e, t).catch((e) => { - ie(e, "[GridContextMenu] Rating update", { showToast: z.DEBUG_VERBOSE_ERRORS }); + }) : N(e, t).catch((e) => { + ct(e, "[GridContextMenu] Rating update", { showToast: R.DEBUG_VERBOSE_ERRORS }); }); } -function fa(e) { +function Ia(e) { let t = String(e?.scope || "").toLowerCase(); return t === "custom" || t === "input" || t === "output"; } -function pa() { +function La() { try { - return !!(Xt()?.browser?.showFolders ?? !1); + return !!(Mt()?.browser?.showFolders ?? !1); } catch { return !1; } } -function ma(e) { +function Ra(e) { return String(e?.scope || "").toLowerCase() === "workflow"; } -function ha(e) { +function za(e) { return String(e?.kind || "").toLowerCase() === "folder"; } -function ga(e) { +function Ba(e) { return String(e?.kind || "").toLowerCase() === "workflow"; } -function _a(e) { - if (!e || ha(e) || ga(e)) return !1; - let t = Zi(e); +function Va(e) { + if (!e || za(e) || Ba(e)) return !1; + let t = xa(e); if (!t) return !1; let n = String(e?.kind || "").toLowerCase(); if (n === "image" || n === "video") return !0; @@ -1754,185 +2216,185 @@ function _a(e) { "m4v" ].includes(r); } -async function va(e) { - if (!e || ha(e)) return null; - let t = Jn(e); +async function Ha(e) { + if (!e || za(e)) return null; + let t = Jt(e); if (t) return t; let n = e?.id; if (n == null || n === "") return null; try { - let t = await se(n, { timeoutMs: 3e4 }), r = t?.data; - if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Jn(e); + let t = await Ue(n, { timeoutMs: 3e4 }), r = t?.data; + if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Jt(e); } catch (e) { console.debug?.(e); } return null; } -async function ya(e) { - let t = await va(e); +async function Ua(e) { + let t = await Ha(e); if (!t || typeof t != "object") { - I(R("toast.assetWorkflowMissing", "No embedded ComfyUI workflow was found for this asset."), "warn", 2600); + F(L("toast.assetWorkflowMissing", "No embedded ComfyUI workflow was found for this asset."), "warn", 2600); return; } - let n = tt(), r = Fe(t, n); + let n = $e(), r = te(t, n); if (!r.ok) { - I(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); + F(L("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); return; } - let i = r.mode === "new-tab" ? R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab.") : R("toast.workflowLoaded", "Workflow loaded"); - I(i, "success", 1800); + let i = r.mode === "new-tab" ? L("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab.") : L("toast.workflowLoaded", "Workflow loaded"); + F(i, "success", 1800); } -async function ba(e) { +async function Wa(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) { - I(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); + F(L("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let n = tt(); - if (ze(n) === !0 && !await Gt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; - let r = await S(t, { timeoutMs: 3e4 }), a = r?.data?.workflow || r?.workflow || null; - if (!r?.ok || !a || typeof a != "object") { - I(r?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + let n = $e(); + if (a(n) === !0 && !await jt(L("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), L("tab.workflow", "Workflow"))) return; + let r = await Le(t, { timeoutMs: 3e4 }), i = r?.data?.workflow || r?.workflow || null; + if (!r?.ok || !i || typeof i != "object") { + F(r?.error || L("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } - let o = Fe(a, n); + let o = te(i, n); if (o.ok) { try { - await i({ filepath: t }, { timeoutMs: 1e4 }); + await Ze({ filepath: t }, { timeoutMs: 1e4 }); } catch (e) { console.debug?.(e); } - I(R("toast.workflowLoaded", "Workflow loaded"), "success", 1800); + F(L("toast.workflowLoaded", "Workflow loaded"), "success", 1800); } else { - let e = Ye(t, { inline: !0 }); + let e = Se(t, { inline: !0 }); try { e && typeof window < "u" && window.open(e, "_blank", "noopener,noreferrer"); } catch (e) { console.debug?.(e); } - I(R("toast.workflowImportFallback", "ComfyUI workflow import is unavailable in this frontend. Opened workflow JSON for manual import."), "warn"), o.mode === "new-tab" && I(R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab."), "success"); + F(L("toast.workflowImportFallback", "ComfyUI workflow import is unavailable in this frontend. Opened workflow JSON for manual import."), "warn"), o.mode === "new-tab" && F(L("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab."), "success"); } } -function xa(e) { +function Ga(e) { try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: e } })); } catch (e) { console.debug?.(e); } } -async function Sa(e) { - let t = String(e?.filepath || "").trim(), n = await he({ filepath: t }, { timeoutMs: 3e4 }); - n?.ok ? (I(R("toast.workflowSaved", "Workflow saved"), "success", 1800), xa("workflow-duplicate")) : I(n?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); +async function Ka(e) { + let t = String(e?.filepath || "").trim(), n = await de({ filepath: t }, { timeoutMs: 3e4 }); + n?.ok ? (F(L("toast.workflowSaved", "Workflow saved"), "success", 1800), Ga("workflow-duplicate")) : F(n?.error || L("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ca(e) { - let t = String(e?.filepath || "").trim(), n = String(e?.display_name || e?.filename || "").replace(/\.json$/i, ""), r = await Et(R("ctx.renameWorkflow", "Rename workflow"), n, R("tab.workflow", "Workflow")), i = String(r || "").trim(); +async function qa(e) { + let t = String(e?.filepath || "").trim(), n = String(e?.display_name || e?.filename || "").replace(/\.json$/i, ""), r = await wt(L("ctx.renameWorkflow", "Rename workflow"), n, L("tab.workflow", "Workflow")), i = String(r || "").trim(); if (!i) return; - let a = await v({ + let a = await et({ filepath: t, name: i }, { timeoutMs: 3e4 }); - a?.ok ? (I(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), xa("workflow-rename")) : I(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + a?.ok ? (F(L("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ga("workflow-rename")) : F(a?.error || L("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function wa(e) { - let t = String(e?.filepath || "").trim(), n = String(e?.subfolder || "").trim(), r = await Et(R("dialog.workflowCategory", "Workflow category"), n, R("tab.workflow", "Workflow")); +async function Ja(e) { + let t = String(e?.filepath || "").trim(), n = String(e?.subfolder || "").trim(), r = await wt(L("dialog.workflowCategory", "Workflow category"), n, L("tab.workflow", "Workflow")); if (r == null) return; - let i = await v({ + let i = await et({ filepath: t, category: String(r || "") }, { timeoutMs: 3e4 }); - i?.ok ? (I(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), xa("workflow-categorize")) : I(i?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + i?.ok ? (F(L("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ga("workflow-categorize")) : F(i?.error || L("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ta(e) { +async function Ya(e) { let t = String(e?.filepath || "").trim(); if (!t) { - I(R("toast.noFilePath"), "error"); + F(L("toast.noFilePath"), "error"); return; } - let n = await De({ + let n = await we({ filepath: t, limit: 12 }, { timeoutMs: 15e3 }); if (!n?.ok) { - I(n?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + F(n?.error || L("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } let r = Array.isArray(n.data) ? n.data : []; if (!r.length) { - I(R("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); + F(L("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); return; } - let i = await An({ - title: R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), + let i = await Tn({ + title: L("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), workflow: e, items: r }); if (!i?.filepath) return; - let a = await _({ + let a = await Qe({ filepath: t, source_filepath: i.filepath }, { timeoutMs: 3e4 }); - a?.ok ? (I(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), xa("workflow-thumbnail")) : I(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + a?.ok ? (F(L("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ga("workflow-thumbnail")) : F(a?.error || L("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ea(e) { +async function Xa(e) { let t = String(e?.filepath || "").trim(); if (!t) { - I(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); + F(L("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let n = await S(t, { timeoutMs: 3e4 }); + let n = await Le(t, { timeoutMs: 3e4 }); if (!n?.ok) { - I(n?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + F(n?.error || L("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } let r = n?.data?.workflow || n?.workflow || null; if (!r || typeof r != "object") { - I(R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + F(L("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } let i = String(e?.filename || e?.display_name || "workflow.json").replace(/[\\/:*?"<>|]+/g, "_").replace(/\.json$/i, "") || "workflow", a = new Blob([`${JSON.stringify(r, null, 2)}\n`], { type: "application/json" }), o = URL.createObjectURL(a); try { let e = document.createElement("a"); - e.href = o, e.download = `${i}.json`, e.rel = "noopener", document.body.appendChild(e), e.click(), e.remove(), I(R("toast.workflowExported", "Workflow exported"), "success", 1800); + e.href = o, e.download = `${i}.json`, e.rel = "noopener", document.body.appendChild(e), e.click(), e.remove(), F(L("toast.workflowExported", "Workflow exported"), "success", 1800); } finally { setTimeout(() => URL.revokeObjectURL(o), 5e3); } } -async function Da(e) { +async function Za(e) { let t = String(e?.filepath || "").trim(); if (!t) { - I(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); + F(L("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let n = await ee({ filepath: t }); - n?.ok ? I(R("toast.openedInFolder", "Opened in folder"), "success", 1600) : I(n?.error || R("toast.openFolderFailed", "Failed to open folder."), "error"); + let n = await Ke({ filepath: t }); + n?.ok ? F(L("toast.openedInFolder", "Opened in folder"), "success", 1600) : F(n?.error || L("toast.openFolderFailed", "Failed to open folder."), "error"); } -async function Oa(e) { - let t = Zi(e); +async function Qa(e) { + let t = xa(e); if (!t) { - I(R("toast.noFilePath"), "error"); + F(L("toast.noFilePath"), "error"); return; } - let n = await kn({ - title: R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), + let n = await Fn({ + title: L("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), sourceAsset: e }), r = String(n?.filepath || "").trim(); if (!r) return; let i = String(e?.kind || "").toLowerCase() === "video" || /\.(mp4|webm|mov|mkv|avi|m4v)$/i.test(t); - I(i ? R("toast.workflowThumbnailConverting", "Preparing a 5 second animated workflow thumbnail...") : R("toast.workflowThumbnailApplying", "Applying workflow thumbnail..."), "info", 2200); - let a = await _({ + F(i ? L("toast.workflowThumbnailConverting", "Preparing a 5 second animated workflow thumbnail...") : L("toast.workflowThumbnailApplying", "Applying workflow thumbnail..."), "info", 2200); + let a = await Qe({ filepath: r, source_filepath: t }, { timeoutMs: i ? 75e3 : 3e4 }); - a?.ok ? (I(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), xa("workflow-thumbnail-assign")) : I(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + a?.ok ? (F(L("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ga("workflow-thumbnail-assign")) : F(a?.error || L("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function ka(e) { +async function $a(e) { let t = String(e?.filepath || "").trim(); - if (!await Gt(R("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), R("ctx.deleteWorkflow", "Delete workflow"))) return; - let n = await oe({ filepath: t }, { timeoutMs: 3e4 }); - n?.ok ? (I(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), xa("workflow-delete")) : I(n?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); + if (!await jt(L("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), L("ctx.deleteWorkflow", "Delete workflow"))) return; + let n = await Be({ filepath: t }, { timeoutMs: 3e4 }); + n?.ok ? (F(L("toast.workflowDeleted", "Workflow deleted"), "success", 1800), Ga("workflow-delete")) : F(n?.error || L("toast.fileDeleteFailed", "Failed to delete file."), "error"); } -function Aa(e) { - let t = Ji(e), n = Yi(e), r = n.length || t.size; +function eo(e) { + let t = va(e), n = ya(e), r = n.length || t.size; return { selectedIds: t, selectedAssetsNow: n, @@ -1941,60 +2403,60 @@ function Aa(e) { hasSelection: r > 0 }; } -function ja(e, t) { +function to(e, t) { let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), r = (t) => { - ca(e, { rating: t }); + Ma(e, { rating: t }); }; return [ $(n(5), "pi pi-star", null, async () => { - da(e, 5, () => r(5)); + Fa(e, 5, () => r(5)); }, { disabled: !t }), $(n(4), "pi pi-star", null, async () => { - da(e, 4, () => r(4)); + Fa(e, 4, () => r(4)); }, { disabled: !t }), $(n(3), "pi pi-star", null, async () => { - da(e, 3, () => r(3)); + Fa(e, 3, () => r(3)); }, { disabled: !t }), $(n(2), "pi pi-star", null, async () => { - da(e, 2, () => r(2)); + Fa(e, 2, () => r(2)); }, { disabled: !t }), $(n(1), "pi pi-star", null, async () => { - da(e, 1, () => r(1)); + Fa(e, 1, () => r(1)); }, { disabled: !t }), - qi(), - $(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { - da(e, 0, () => r(0)); + _a(), + $(L("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { + Fa(e, 0, () => r(0)); }, { disabled: !t }) ]; } -function Ma(e, t) { +function no(e, t) { let n = String(t?.dataset?.mjrScope || "").toLowerCase(); if (n !== "input" && n !== "output") return e; let r = String(e || "").trim().replaceAll("\\", "/"); return r ? `mjr://${n}/${r}` : `mjr://${n}`; } -function Na({ currentPath: e, gridContainer: n } = {}) { - return [$(R("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { +function ro({ currentPath: e, gridContainer: n } = {}) { + return [$(L("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { try { - let r = await Et(R("dialog.newFolderName", "New folder name"), ""), i = String(r || "").trim(); + let r = await wt(L("dialog.newFolderName", "New folder name"), ""), i = String(r || "").trim(); if (!i) return; let a = await t({ op: "create", - path: Ma(e, n), + path: no(e, n), name: i }); if (!a?.ok) { - I(a?.error || "Failed to create folder", "error"); + F(a?.error || "Failed to create folder", "error"); return; } - la(n), I(R("toast.folderCreated", "Folder created: {name}", { name: i }), "success"); + Na(n), F(L("toast.folderCreated", "Folder created: {name}", { name: i }), "success"); } catch (e) { - I(R("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: e?.message || String(e || "") }), "error"); + F(L("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: e?.message || String(e || "") }), "error"); } })]; } -function Pa({ asset: e, gridContainer: n, panelState: r } = {}) { - let i = String(e?.filepath || "").trim(), a = [$(R("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => { +function io({ asset: e, gridContainer: n, panelState: r } = {}) { + let i = String(e?.filepath || "").trim(), a = [$(L("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => { try { n.dispatchEvent(new CustomEvent("mjr:open-folder-asset", { bubbles: !0, @@ -2003,18 +2465,18 @@ function Pa({ asset: e, gridContainer: n, panelState: r } = {}) { } catch (e) { console.debug?.(e); } - }), $(R("ctx.pinAsBrowserRoot"), "pi pi-bookmark", null, async () => { + }), $(L("ctx.pinAsBrowserRoot"), "pi pi-bookmark", null, async () => { if (!i) { - I(R("toast.unableResolveFolderPath"), "error"); + F(L("toast.unableResolveFolderPath"), "error"); return; } - let t = await Et(R("dialog.browserRootLabelOptional"), String(e?.filename || "")), n = await pe(lt.CUSTOM_ROOTS, { + let t = await wt(L("dialog.browserRootLabelOptional"), String(e?.filename || "")), n = await me(p.CUSTOM_ROOTS, { path: i, label: String(t || "").trim() || void 0 }); - if (!n?.ok) I(n?.error || R("toast.pinFolderFailed"), "error"); + if (!n?.ok) F(n?.error || L("toast.pinFolderFailed"), "error"); else { - I(R("toast.folderPinnedAsBrowserRoot"), "success"); + F(L("toast.folderPinnedAsBrowserRoot"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:custom-roots-changed", { detail: { preferredId: String(n?.data?.id || "") } })); } catch (e) { @@ -2022,9 +2484,9 @@ function Pa({ asset: e, gridContainer: n, panelState: r } = {}) { } } })]; - return fa(r) && i && a.push(qi(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { + return Ia(r) && i && a.push(_a(), $(L("ctx.createFolderHere"), "pi pi-plus", null, async () => { try { - let e = await Et(R("dialog.newFolderName"), ""), r = String(e || "").trim(); + let e = await wt(L("dialog.newFolderName"), ""), r = String(e || "").trim(); if (!r) return; let a = await t({ op: "create", @@ -2032,16 +2494,16 @@ function Pa({ asset: e, gridContainer: n, panelState: r } = {}) { name: r }); if (!a?.ok) { - I(a?.error || R("toast.createFolderFailed"), "error"); + F(a?.error || L("toast.createFolderFailed"), "error"); return; } - la(n), I(R("toast.folderCreated", { name: r }), "success"); + Na(n), F(L("toast.folderCreated", { name: r }), "success"); } catch (e) { - I(R("toast.createFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); + F(L("toast.createFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } - }), $(R("ctx.renameFolder"), "pi pi-pencil", null, async () => { + }), $(L("ctx.renameFolder"), "pi pi-pencil", null, async () => { try { - let r = String(e?.filename || "").trim(), a = await Et(R("dialog.renameFolder"), r), o = String(a || "").trim(); + let r = String(e?.filename || "").trim(), a = await wt(L("dialog.renameFolder"), r), o = String(a || "").trim(); if (!o || o === r) return; let s = await t({ op: "rename", @@ -2049,16 +2511,16 @@ function Pa({ asset: e, gridContainer: n, panelState: r } = {}) { name: o }); if (!s?.ok) { - I(s?.error || R("toast.renameFolderFailed"), "error"); + F(s?.error || L("toast.renameFolderFailed"), "error"); return; } - la(n), I(R("toast.folderRenamed"), "success"); + Na(n), F(L("toast.folderRenamed"), "success"); } catch (e) { - I(R("toast.renameFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); + F(L("toast.renameFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } - }), $(R("ctx.moveFolder"), "pi pi-arrow-right", null, async () => { + }), $(L("ctx.moveFolder"), "pi pi-arrow-right", null, async () => { try { - let e = await Et(R("dialog.destinationDirectoryPath"), ""), r = String(e || "").trim(); + let e = await wt(L("dialog.destinationDirectoryPath"), ""), r = String(e || "").trim(); if (!r) return; let a = await t({ op: "move", @@ -2066,42 +2528,42 @@ function Pa({ asset: e, gridContainer: n, panelState: r } = {}) { destination: r }); if (!a?.ok) { - I(a?.error || R("toast.moveFolderFailed"), "error"); + F(a?.error || L("toast.moveFolderFailed"), "error"); return; } - la(n), I(R("toast.folderMoved"), "success"); + Na(n), F(L("toast.folderMoved"), "success"); } catch (e) { - I(R("toast.moveFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); + F(L("toast.moveFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } - }), $(R("ctx.deleteFolder"), "pi pi-trash", null, async () => { + }), $(L("ctx.deleteFolder"), "pi pi-trash", null, async () => { try { - let r = String(e?.filename || R("label.thisFolder", "this folder")); - if (!await Gt(R("dialog.deleteFolderRecursive", { name: r }))) return; + let r = String(e?.filename || L("label.thisFolder", "this folder")); + if (!await jt(L("dialog.deleteFolderRecursive", { name: r }))) return; let a = await t({ op: "delete", path: i, recursive: !0 }); if (!a?.ok) { - I(a?.error || R("toast.deleteFolderFailed"), "error"); + F(a?.error || L("toast.deleteFolderFailed"), "error"); return; } - la(n), I(R("toast.folderDeleted"), "success"); + Na(n), F(L("toast.folderDeleted"), "success"); } catch (e) { - I(R("toast.deleteFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); + F(L("toast.deleteFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } })), a; } -function Fa({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, pointerY: a, selection: o } = {}) { - let { selectedAssetsNow: s, effectiveSelectionCount: c, isMultiSelected: l, hasSelection: u } = o, d = [], f = ma(r), p = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => Wi().then((r) => r.requestViewerOpen({ +function ao({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, pointerY: a, selection: o } = {}) { + let { selectedAssetsNow: s, effectiveSelectionCount: c, isMultiSelected: l, hasSelection: u } = o, d = [], f = Ra(r), p = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => ma().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); - if (ga(e)) { - if (d.push($(R("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => ba(e)), $(R("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => Sa(e)), $(R("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => Ca(e)), $(R("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => wa(e)), $(R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => Ta(e)), $(R("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => zi(e)), $(R("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Ea(e)), $(R("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => Da(e)), $(R("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => ka(e)), qi()), f) return d.push($("Open Graph Map", "pi pi-sitemap", null, async () => { + if (Ba(e)) { + if (d.push($(L("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => Wa(e)), $(L("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => Ka(e)), $(L("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => qa(e)), $(L("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => Ja(e)), $(L("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => Ya(e)), $(L("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => la(e)), $(L("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Xa(e)), $(L("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => Za(e)), $(L("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => $a(e)), _a()), f) return d.push($("Open Graph Map", "pi pi-sitemap", null, async () => { try { - let t = await Xi(e), { floatingViewerManager: n } = await Gi(); + let t = await ba(e), { floatingViewerManager: n } = await ha(); await n.openAssets({ assets: [t], index: 0, @@ -2112,9 +2574,9 @@ function Fa({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, p } })), d; } else if (f) return d; - d.push($("Open As New Tab", "pi pi-external-link", null, () => ya(e)), $("Open Viewer", "pi pi-image", Li("OPEN_VIEWER"), () => { + d.push($("Open As New Tab", "pi pi-external-link", null, () => Ua(e)), $("Open Viewer", "pi pi-image", ta("OPEN_VIEWER"), () => { try { - let t = (u ? Yi(n) : []).filter((e) => !ha(e)), r = t.length; + let t = (u ? ya(n) : []).filter((e) => !za(e)), r = t.length; if (r >= 2 && r <= 4) { p({ assets: t, @@ -2122,7 +2584,7 @@ function Fa({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, p }); return; } - let i = aa(n).filter((e) => !ha(e)), a = oa(i, e?.id); + let i = ka(n).filter((e) => !za(e)), a = Aa(i, e?.id); if (!i.length || a < 0) return; p({ assets: i, @@ -2131,9 +2593,9 @@ function Fa({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, p } catch (e) { console.debug?.(e); } - }), $("Open in Floating Viewer", "pi pi-window-maximize", Li("OPEN_FLOATING_VIEWER"), async () => { + }), $("Open in Floating Viewer", "pi pi-window-maximize", ta("OPEN_FLOATING_VIEWER"), async () => { try { - let { floatingViewerManager: t } = await Gi(), r = (u ? Yi(n) : []).filter((e) => !ha(e)); + let { floatingViewerManager: t } = await ha(), r = (u ? ya(n) : []).filter((e) => !za(e)); if (r.length) { await t.openAssets({ assets: r, @@ -2149,11 +2611,11 @@ function Fa({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, p console.debug?.(e); } }), $("Load Asset", "pi pi-upload", "L / L+Drop", async () => { - let t = (u ? Yi(n) : []).filter((e) => !ha(e)); - await na(t.length ? t : [e]) || I("Failed to create a loader node for this asset.", "error"); + let t = (u ? ya(n) : []).filter((e) => !za(e)); + await Ea(t.length ? t : [e]) || F("Failed to create a loader node for this asset.", "error"); }), $("Open Graph Map", "pi pi-sitemap", null, async () => { try { - let t = await Xi(e), { floatingViewerManager: n } = await Gi(); + let t = await ba(e), { floatingViewerManager: n } = await ha(); await n.openAssets({ assets: [t], index: 0, @@ -2162,17 +2624,17 @@ function Fa({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, p } catch (e) { console.debug?.(e); } - }), $(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", Li("METADATA_PANEL"), () => { + }), $(L("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", ta("METADATA_PANEL"), () => { try { - ia(n, t, e, r); + Oa(n, t, e, r); let i = n?._mjrOpenDetails; typeof i == "function" && i(); } catch (e) { console.debug?.(e); } - })), _a(e) && d.push($(R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => Oa(e))); - let m = (u ? s : []).filter((e) => !ha(e)), h = m.length; - h === 2 && d.push($("Compare A/B (2 selected)", "pi pi-clone", Li("COMPARE_AB"), () => { + })), Va(e) && d.push($(L("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => Qa(e))); + let m = (u ? s : []).filter((e) => !za(e)), h = m.length; + h === 2 && d.push($("Compare A/B (2 selected)", "pi pi-clone", ta("COMPARE_AB"), () => { try { p({ assets: m, @@ -2182,7 +2644,7 @@ function Fa({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, p } catch (e) { console.debug?.(e); } - })), h >= 2 && h <= 4 && d.push($(`Side-by-side (2x2) (${h} selected)`, "pi pi-table", Li("SIDE_BY_SIDE"), () => { + })), h >= 2 && h <= 4 && d.push($(`Side-by-side (2x2) (${h} selected)`, "pi pi-table", ta("SIDE_BY_SIDE"), () => { try { p({ assets: m, @@ -2192,147 +2654,139 @@ function Fa({ asset: e, card: t, gridContainer: n, panelState: r, pointerX: i, p } catch (e) { console.debug?.(e); } - })), d.push($(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", Li("OPEN_IN_FOLDER"), async () => { - let t = await ee(e); - t?.ok ? I(R("toast.openedInFolder"), "info", 2e3) : I(t?.error || R("toast.openFolderFailed"), "error"); - }, { disabled: !(e?.id || Zi(e)) }), $(R("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { - I(R("toast.collectingFiles", "Collecting files..."), "info", 2500); - let t = await T(e); + })), d.push($(L("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", ta("OPEN_IN_FOLDER"), async () => { + let t = await Ke(e); + t?.ok ? F(L("toast.openedInFolder"), "info", 2e3) : F(t?.error || L("toast.openFolderFailed"), "error"); + }, { disabled: !(e?.id || xa(e)) }), $(L("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { + F(L("toast.collectingFiles", "Collecting files..."), "info", 2500); + let t = await De(e); if (!t?.ok) { - I(t?.error || R("toast.collectFilesFailed", "Collect files failed"), "error"); + F(t?.error || L("toast.collectFilesFailed", "Collect files failed"), "error"); return; } - let n = t?.data || {}, r = Array.isArray(n.missing) ? n.missing.length : 0, i = n.fallback_used ? R("toast.collectFallbackDir", "output folder (source folder not writable)") : R("toast.collectSameDir", "asset folder"), a = R("toast.collectedFiles", "Collected {name} in {where}", { + let n = t?.data || {}, r = Array.isArray(n.missing) ? n.missing.length : 0, i = n.fallback_used ? L("toast.collectFallbackDir", "output folder (source folder not writable)") : L("toast.collectSameDir", "asset folder"), a = L("toast.collectedFiles", "Collected {name} in {where}", { name: String(n.zip_name || "zip"), where: i }); - r > 0 && (a += ` — ${r} ${R("toast.collectMissingInputs", "input(s) missing")}`), I(a, r > 0 ? "warning" : "success", 6e3); - }, { disabled: !Zi(e) }), $(R("ctx.copyPath", "Copy path"), "pi pi-copy", Li("COPY_PATH"), async () => { + r > 0 && (a += ` — ${r} ${L("toast.collectMissingInputs", "input(s) missing")}`), F(a, r > 0 ? "warning" : "success", 6e3); + }, { disabled: !xa(e) }), $(L("ctx.copyPath", "Copy path"), "pi pi-copy", ta("COPY_PATH"), async () => { let t = e?.filepath ? String(e.filepath) : ""; - if (!t) I(R("toast.noFilePath"), "error"); + if (!t) F(L("toast.noFilePath"), "error"); else try { - await navigator.clipboard.writeText(t), I(R("toast.pathCopied"), "success", 2e3); + await navigator.clipboard.writeText(t), F(L("toast.pathCopied"), "success", 2e3); } catch (e) { - console.warn(R("log.clipboardCopyFailed", "Clipboard copy failed"), e), I(R("toast.pathCopyFailed"), "error"); + console.warn(L("log.clipboardCopyFailed", "Clipboard copy failed"), e), F(L("toast.pathCopyFailed"), "error"); } - }), $(R("ctx.download", "Download"), "pi pi-download", Li("DOWNLOAD"), () => { + }), $(L("ctx.download", "Download"), "pi pi-download", ta("DOWNLOAD"), () => { if (!e?.filepath) return; - let t = Ye(e.filepath), n = e.filename || "download"; - ea(t, n), I(R("toast.downloadingFile", "Downloading {filename}...", { filename: n }), "info", 3e3); + let t = Se(e.filepath), n = e.filename || "download"; + wa(t, n), F(L("toast.downloadingFile", "Downloading {filename}...", { filename: n }), "info", 3e3); }, { disabled: !e?.filepath }), $(`Download selected as ZIP (${h})`, "pi pi-file-zip", null, async () => { - await ta(m); - }, { disabled: h < 2 }), $("Add to collection...", "pi pi-bookmark", Li("ADD_TO_COLLECTION"), async () => { - let t = Yi(n), r = t.length ? t : [e]; - await Bt({ + await Ta(m); + }, { disabled: h < 2 }), $("Add to collection...", "pi pi-bookmark", ta("ADD_TO_COLLECTION"), async () => { + let t = ya(n); + await Ki({ x: i, y: a, - assets: r + assets: t.length ? t : [e] }); })); let g = String(r?.collectionId || "").trim(); if (g) { - let t = Yi(n), r = (t.length ? t : [e]).map(Zi).filter(Boolean), i = r.length > 1 ? `Remove from collection (${r.length})` : "Remove from collection"; + let t = ya(n), r = (t.length ? t : [e]).map(xa).filter(Boolean), i = r.length > 1 ? `Remove from collection (${r.length})` : "Remove from collection"; d.push($(i, "pi pi-bookmark", null, async () => { if (!r.length) { - I(R("toast.noFilePath"), "error"); + F(L("toast.noFilePath"), "error"); return; } - let e = await Ee(g, r); - e?.ok ? la(n) : I(e?.error || R("toast.removeFromCollectionFailed"), "error"); + let e = await ve(g, r); + e?.ok ? Na(n) : F(e?.error || L("toast.removeFromCollectionFailed"), "error"); })); } - let _ = !!(e?.id || Zi(e)), v = String(e?.id ?? ""), y = v && h >= 2 && m.some((e) => e && String(e?.id ?? "") === v) ? m : null; - return d.push(qi(), $(y ? R("ctx.editTagsSelected", "Edit tags ({count} selected)", { count: y.length }) : R("ctx.editTags", "Edit tags"), "pi pi-tags", Li("EDIT_TAGS"), () => { - y ? La(i + 6, a + 6, y) : Ia(i + 6, a + 6, e, () => { - ca(e, { tags: Array.isArray(e?.tags) ? [...e.tags] : [] }); + let _ = !!(e?.id || xa(e)); + return d.push(_a(), $(L("ctx.editTags", "Edit tags"), "pi pi-tags", ta("EDIT_TAGS"), () => { + oo(i + 6, a + 6, e, () => { + Ma(e, { tags: Array.isArray(e?.tags) ? [...e.tags] : [] }); }); - }, { closeOnSelect: !1 }), qi(), $(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { + }, { closeOnSelect: !1 }), _a(), $(L("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { disabled: !_, closeOnSelect: !1, - submenu: ja(e, _) - }), qi(), $(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { + submenu: to(e, _) + }), _a(), $(L("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { if (e?.filename || e?.id) { - I(R("toast.rescanningFile", "Rescanning file..."), "info", 1600); + F(L("toast.rescanningFile", "Rescanning file..."), "info", 1600); try { - let t = await ua(e, n); - t?.ok ? I(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : I(t?.error || R("toast.resetFailed", "Failed to reset index"), "error"); + let t = await Pa(e, n); + t?.ok ? F(L("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : F(t?.error || L("toast.resetFailed", "Failed to reset index"), "error"); } catch (e) { - I(`${R("toast.resetFailed", "Failed to reset index")}: ${e?.message || String(e || "")}`, "error"); + F(`${L("toast.resetFailed", "Failed to reset index")}: ${e?.message || String(e || "")}`, "error"); } } - }, { disabled: !(e?.filename || e?.id) }), $("Rename...", "pi pi-pencil", Li("RENAME"), async () => { - if (!(e?.id || Zi(e))) return; - let t = e.filename || "", r = await Et(R("dialog.rename.title", "Rename file"), t), i = bt(r, t); - if (!i || i === t) return; - let a = At(i); - if (!a.valid) I(a.reason, "error"); + }, { disabled: !(e?.filename || e?.id) }), $("Rename...", "pi pi-pencil", ta("RENAME"), async () => { + if (!(e?.id || xa(e))) return; + let t = e.filename || "", r = zi(await wt(L("dialog.rename.title", "Rename file"), t), t); + if (!r || r === t) return; + let i = Ii(r); + if (!i.valid) F(i.reason, "error"); else try { - let t = await Ae(e, i); + let t = await je(e, r); if (!t?.ok) { - I(t?.error || R("toast.fileRenameFailed"), "error"); + F(t?.error || L("toast.fileRenameFailed"), "error"); return; } - let r = t?.data?.asset; - r && typeof r == "object" ? (Object.assign(e, r), ca(e, r)) : (e.filename = i, e.filepath &&= String(e.filepath).replace(/[^\\/]+$/, i), e.path &&= String(e.path).replace(/[^\\/]+$/, i), e.file_info && typeof e.file_info == "object" && (e.file_info.filename = i, e.file_info.filepath && (e.file_info.filepath = String(e.file_info.filepath).replace(/[^\\/]+$/, i)), e.file_info.path && (e.file_info.path = String(e.file_info.path).replace(/[^\\/]+$/, i))), ca(e, { + let i = t?.data?.asset; + i && typeof i == "object" ? (Object.assign(e, i), Ma(e, i)) : (e.filename = r, e.filepath &&= String(e.filepath).replace(/[^\\/]+$/, r), e.path &&= String(e.path).replace(/[^\\/]+$/, r), e.file_info && typeof e.file_info == "object" && (e.file_info.filename = r, e.file_info.filepath && (e.file_info.filepath = String(e.file_info.filepath).replace(/[^\\/]+$/, r)), e.file_info.path && (e.file_info.path = String(e.file_info.path).replace(/[^\\/]+$/, r))), Ma(e, { filename: e.filename, filepath: e.filepath, path: e.path, file_info: e.file_info })); - let a = sa(e.id)?.querySelector?.(".mjr-filename"); - a && (a.textContent = e.filename || i), I(R("toast.fileRenamedSuccess"), "success"), la(n); + let a = ja(e.id)?.querySelector?.(".mjr-filename"); + a && (a.textContent = e.filename || r), F(L("toast.fileRenamedSuccess"), "success"), Na(n); } catch (e) { - I(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); + F(L("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); } - }, { disabled: !(e?.id || Zi(e)) })), l ? d.push($(`Delete ${c} files...`, "pi pi-trash", Li("DELETE"), async () => { - if (await yt(Number(c) || 0)) try { + }, { disabled: !(e?.id || xa(e)) })), l ? d.push($(`Delete ${c} files...`, "pi pi-trash", ta("DELETE"), async () => { + if (await Bi(Number(c) || 0)) try { let t = 0, i = 0, a = [], o = 0, c = s.length ? s : [e]; - for (let e of c) (await w(e))?.ok ? (t += 1, e?.id == null ? o += 1 : a.push(String(e.id))) : i += 1; + for (let e of c) (await b(e))?.ok ? (t += 1, e?.id == null ? o += 1 : a.push(String(e.id))) : i += 1; if (a.length) { - let e = Ci(n, a); + let e = pi(n, a); r && Array.isArray(e?.selectedIds) && (r.selectedAssetIds = e.selectedIds, r.activeAssetId = e.selectedIds[0] || ""); } - o > 0 && la(n), i === 0 ? I(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: t }), "success") : I(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { + o > 0 && Na(n), i === 0 ? F(L("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: t }), "success") : F(L("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { success: t, failed: i }), "warning"); } catch (e) { - I(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); + F(L("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); } - })) : d.push($(R("ctx.delete", "Delete"), "pi pi-trash", Li("DELETE"), async () => { - if (await yt(1, e?.filename)) try { - let t = await w(e); + })) : d.push($(L("ctx.delete", "Delete"), "pi pi-trash", ta("DELETE"), async () => { + if (await Bi(1, e?.filename)) try { + let t = await b(e); if (!t?.ok) { - I(t?.error || R("toast.fileDeleteFailed"), "error"); + F(t?.error || L("toast.fileDeleteFailed"), "error"); return; } if (e?.id) { - let t = Ci(n, [String(e.id)]); + let t = pi(n, [String(e.id)]); r && Array.isArray(t?.selectedIds) && (r.selectedAssetIds = t.selectedIds, r.activeAssetId = t.selectedIds[0] || ""); - } else la(n); - I(R("toast.fileDeletedSuccess"), "success"); + } else Na(n); + F(L("toast.fileDeletedSuccess"), "success"); } catch (e) { - I(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); + F(L("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); } - }, { disabled: !(e?.id || Zi(e)) })), d; + }, { disabled: !(e?.id || xa(e)) })), d; } -function Ia(e, t, n, r) { - n && zn({ +function oo(e, t, n, r) { + n && Gn({ x: e, y: t, asset: n, onChanged: r }); } -function La(e, t, n) { - let r = Array.isArray(n) ? n.filter(Boolean) : []; - r.length < 2 || zn({ - x: e, - y: t, - assets: r - }); -} -function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { +function so({ gridContainer: e, getState: t = () => ({}) } = {}) { if (!e) return; if (e._mjrGridContextMenuBound && typeof e._mjrGridContextMenuUnbind == "function") return e._mjrGridContextMenuUnbind; let n = async (n) => { @@ -2342,15 +2796,15 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { } catch { return {}; } - })(), i = Pt(n.target, ".mjr-asset-card"); + })(), i = qt(n.target, ".mjr-asset-card"); if (!i) { - if (!fa(r)) return; - let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && pa(); + if (!Ia(r)) return; + let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && La(); if (!i && !a) return; - n.preventDefault(), n.stopPropagation(), rn({ + n.preventDefault(), n.stopPropagation(), sn({ x: n.clientX, y: n.clientY, - items: Na({ + items: ro({ currentPath: i, gridContainer: e }) @@ -2360,11 +2814,11 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { n.preventDefault(), n.stopPropagation(); let a = i._mjrAsset; if (!a) return; - let o = Aa(e), s = ha(a) ? Pa({ + let o = eo(e), s = za(a) ? io({ asset: a, gridContainer: e, panelState: r - }) : Fa({ + }) : ao({ asset: a, card: i, gridContainer: e, @@ -2373,7 +2827,7 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { pointerY: n.clientY, selection: o }); - rn({ + sn({ x: n.clientX, y: n.clientY, items: s @@ -2402,12 +2856,12 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { console.debug?.(e); } try { - Kt(); + oa(); } catch (e) { console.debug?.(e); } try { - vn(); + ln(); } catch (e) { console.debug?.(e); } @@ -2415,8 +2869,8 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { return e._mjrGridContextMenuUnbind = r, r; } // ui/features/panel/controllers/ratingHotkeysController.ts -var za = ct; -function Ba(e) { +var co = Ft; +function lo(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -2425,10 +2879,10 @@ function Ba(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Va(e, t = null) { +function uo(e, t = null) { if (!e) return []; try { - let t = Array.from(Xn(e)); + let t = Array.from(yt(e)); if (t.length) return t; } catch (e) { console.debug?.(e); @@ -2441,14 +2895,14 @@ function Va(e, t = null) { } return []; } -function Ha(e, t) { +function fo(e, t) { try { - return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ba(t)}"]`); + return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${lo(t)}"]`); } catch (e) { return console.debug?.(e), null; } } -function Ua(e, t, n) { +function po(e, t, n) { if (!e) return; let r = e._mjrAsset; r && (r.rating = n); @@ -2461,7 +2915,7 @@ function Ua(e, t, n) { console.debug?.(e); } } -async function Wa(e, t, n = 5) { +async function mo(e, t, n = 5) { let r = Math.max(1, Number(n) || 1), i = 0, a = [], o = async () => { for (; i < e.length;) { let n = i; @@ -2476,22 +2930,22 @@ async function Wa(e, t, n = 5) { for (let t = 0; t < Math.min(r, e.length); t += 1) a.push(o()); await Promise.all(a); } -function Ga({ gridContainer: e, createRatingBadge: t } = {}) { +function ho({ gridContainer: e, createRatingBadge: t } = {}) { let n = !1, r = null, i = null, a = async (e, t) => { if (e != null) { try { - let n = await y(e, t); + let n = await N(e, t); if (!n?.ok) { - I(n?.error || R("toast.ratingUpdateFailed"), "error"); + F(n?.error || L("toast.ratingUpdateFailed"), "error"); return; } - I(R("toast.ratingSetN", { n: t }), "success", 1500); + F(L("toast.ratingSetN", { n: t }), "success", 1500); } catch { - I(R("toast.ratingUpdateError"), "error"); + F(L("toast.ratingUpdateError"), "error"); return; } try { - window.dispatchEvent(new CustomEvent(za, { detail: { + window.dispatchEvent(new CustomEvent(co, { detail: { assetId: String(e), rating: t } })); @@ -2503,25 +2957,23 @@ function Ga({ gridContainer: e, createRatingBadge: t } = {}) { return { bind: () => { if (!n && e) { - n = !0, me(!0), r = async (t) => { - if (Se() || ve().scope === "viewer" || t.defaultPrevented) return; + n = !0, mt(!0), r = async (t) => { + if (vt() || gt().scope === "viewer" || t.defaultPrevented) return; let n = (e) => !!(e?.isContentEditable || e?.closest?.("input, textarea, select, [contenteditable]:not([contenteditable='false'])")); if (t.isComposing || n(t.target) || n(document.activeElement)) return; let r = String(t.key || ""); - if (r !== "0" && r !== "1" && r !== "2" && r !== "3" && r !== "4" && r !== "5") return; - let i = document.querySelector(".mjr-viewer-overlay"); - if (i && i.style.display !== "none") return; - let o = e.contains(t.target) || e === t.target, s = !!t.target?.closest?.(".mjr-mfv"), c = !!document.querySelector(".mjr-mfv.is-visible"); - if (!o && !s && !c) return; - let l = r === "0" ? 0 : Number(r); - if (!Number.isFinite(l)) return; - let u = Va(e, t.target); - u.length && (t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.(), await Wa(u, (e) => a(e, l), 5)); + if (r !== "0" && r !== "1" && r !== "2" && r !== "3" && r !== "4" && r !== "5" || document.querySelector(".mjr-studio")) return; + let i = e.contains(t.target) || e === t.target, o = !!t.target?.closest?.(".mjr-mfv"), s = !!document.querySelector(".mjr-mfv.is-visible"); + if (!i && !o && !s) return; + let c = r === "0" ? 0 : Number(r); + if (!Number.isFinite(c)) return; + let l = uo(e, t.target); + l.length && (t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.(), await mo(l, (e) => a(e, c), 5)); }, i = (n) => { let r = n?.detail || {}, i = r.assetId ?? r.id ?? null, a = Number(r.rating); if (!i || !Number.isFinite(a)) return; - let o = Ha(e, i); - o && Ua(o, t, a); + let o = fo(e, i); + o && po(o, t, a); }; try { window.addEventListener("keydown", r, { capture: !0 }); @@ -2529,7 +2981,7 @@ function Ga({ gridContainer: e, createRatingBadge: t } = {}) { console.debug?.(e); } try { - window.addEventListener(za, i); + window.addEventListener(co, i); } catch (e) { console.debug?.(e); } @@ -2537,14 +2989,14 @@ function Ga({ gridContainer: e, createRatingBadge: t } = {}) { }, dispose: () => { if (n) { - n = !1, me(!1); + n = !1, mt(!1); try { window.removeEventListener("keydown", r, { capture: !0 }); } catch (e) { console.debug?.(e); } try { - window.removeEventListener(za, i); + window.removeEventListener(co, i); } catch (e) { console.debug?.(e); } @@ -2554,7 +3006,7 @@ function Ga({ gridContainer: e, createRatingBadge: t } = {}) { }; } // ui/features/grid/StackGroupCards.ts -function Ka(e) { +function go(e) { if (!e || e.dataset?.mjrOverlayButtonBound === "1") return e; try { e.dataset.mjrOverlayButtonBound = "1"; @@ -2573,7 +3025,7 @@ function Ka(e) { }; return e.addEventListener("pointerdown", t), e.addEventListener("mousedown", n), e.addEventListener("touchstart", t, { passive: !0 }), e.addEventListener("dblclick", t), e.addEventListener("keydown", t), e.addEventListener("dragstart", n), e; } -function qa(e, t, n = null, r = "mjr-stack-group-button-count") { +function _o(e, t, n = null, r = "mjr-stack-group-button-count") { e.textContent = ""; let i = document.createElement("span"); if (i.className = t, e.appendChild(i), n != null) { @@ -2581,24 +3033,24 @@ function qa(e, t, n = null, r = "mjr-stack-group-button-count") { t.className = r, t.textContent = String(n), e.appendChild(t); } } -function Ja(e) { +function vo(e) { return String(e?.dataset?.mjrGroupStacks || "") === "1"; } -function Ya(e) { +function yo(e) { let t = String(e?.stack_id || "").trim(); return t ? `stack:${t}` : ""; } -function Xa(e, t, n) { - return Ja(e) && Ya(t) || n; +function bo(e, t, n) { + return vo(e) && yo(t) || n; } -function Za(e) { +function xo(e) { try { e._mjrStackMembersCache?.clear?.(); } catch (e) { console.debug?.(e); } } -function Qa(e, t, n) { +function So(e, t, n) { if (!t || !n || t._mjrIsVue) return; let r = !!n._mjrDupStack, i = Number(n._mjrDupCount || 0) || 0; if (!r || i < 2) { @@ -2608,7 +3060,7 @@ function Qa(e, t, n) { } t.dataset.mjrDupStacked = "true", t.dataset.mjrDupCount = String(i); let a = t.querySelector(".mjr-dup-stack-button"); - a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), Ka(a), a.addEventListener("click", (e) => { + a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), go(a), a.addEventListener("click", (e) => { if (e.preventDefault(), e.stopPropagation(), a.dataset?.mjrStackOpening !== "1") try { a.dataset.mjrStackOpening = "1", a.disabled = !0; let e = a?._mjrGridContainer, t = a?._mjrAsset; @@ -2634,21 +3086,21 @@ function Qa(e, t, n) { } }), t.appendChild(a)), a._mjrGridContainer = e, a._mjrAsset = n; let o = `${i} duplicate${i > 1 ? "s" : ""}`; - a.title = `${o} - click to compare all copies`, qa(a, "pi pi-copy", i, "mjr-dup-stack-count"); + a.title = `${o} - click to compare all copies`, _o(a, "pi pi-copy", i, "mjr-dup-stack-count"); } // ui/features/dnd/utils/log.ts -var $a = () => { +var Co = () => { try { return !!window?.MJR_DND_DEBUG; } catch { return !1; } -}, eo = (...e) => { - $a() && console.debug("[Majoor.DnD]", ...e); -}, to = (e, { buildCustomViewURL: t, buildViewURL: n }) => { +}, wo = (...e) => { + Co() && console.debug("[Majoor.DnD]", ...e); +}, To = (e, { buildCustomViewURL: t, buildViewURL: n }) => { let r = String(e?.type || "output").toLowerCase(); - return r === "custom" ? t(e?.filename || "", e?.subfolder || "", Pe(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); -}, no = (e) => { + return r === "custom" ? t(e?.filename || "", e?.subfolder || "", be(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); +}, Eo = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t || t.includes("/") || t.includes("\\") || t.includes("\0")) return null; @@ -2661,41 +3113,41 @@ var $a = () => { kind: o || void 0, filepath: o === "workflow" && s ? s : void 0 }; -}, ro = no, io = (e, t) => { +}, Do = Eo, Oo = (e, t) => { let n = e?.dataTransfer?.getData?.(t); if (!n) return null; try { - return no(JSON.parse(n)); + return Eo(JSON.parse(n)); } catch { return null; } -}, ao = /* @__PURE__ */ new WeakMap(), oo = !1; -function so(e) { - return e && ao.get(e) || null; +}, ko = /* @__PURE__ */ new WeakMap(), Ao = !1; +function jo(e) { + return e && ko.get(e) || null; } -function co(e, t) { - return e ? typeof t == "function" ? (ao.set(e, t), t) : (ao.delete(e), null) : null; +function Mo(e, t) { + return e ? typeof t == "function" ? (ko.set(e, t), t) : (ko.delete(e), null) : null; } -function lo(e) { - e && ao.delete(e); +function No(e) { + e && ko.delete(e); } -function uo() { - oo = !0; +function Po() { + Ao = !0; } -function fo() { - return oo ? (oo = !1, !0) : !1; +function Fo() { + return Ao ? (Ao = !1, !0) : !1; } -function po() { - oo = !1; +function Io() { + Ao = !1; } // ui/features/dnd/out/DragOut.ts -var mo = (e) => { +var Lo = (e) => { try { return new URL(String(e || ""), window.location.href).href; } catch { return String(e || ""); } -}, ho = () => Je("mjr_", 24), go = (e) => { +}, Ro = () => _e("mjr_", 24), zo = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return null; let n = t.filename || t.name; @@ -2703,9 +3155,9 @@ var mo = (e) => { filename: n, subfolder: t.subfolder || "", type: String(t.type || "output").toLowerCase(), - root_id: Pe(t) || void 0 + root_id: be(t) || void 0 } : null; -}, _o = (e, t) => { +}, Bo = (e, t) => { let n = []; if (!e || !t) return n; let r = t?.dataset?.mjrAssetId ? String(t.dataset.mjrAssetId) : ""; @@ -2755,25 +3207,25 @@ var mo = (e) => { t && typeof t == "object" && n.push(t); } return n; -}, vo = (e) => { +}, Vo = (e) => { if (!e || typeof e != "object") return ""; let t = e.filepath || e.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; -}, yo = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { +}, Ho = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { if (!e || !t) return; - let o = _o(n, r); + let o = Bo(n, r); if (Array.isArray(o) && o.length > 1) { - let t = o.map(go).filter(Boolean); + let t = o.map(zo).filter(Boolean); if (t.length > 1) { let n = ""; try { - n = ho(); + n = Ro(); } catch (e) { console.warn("[DragOut] failed to create secure batch token", e); } if (n) { try { - pe(lt.BATCH_ZIP_CREATE, { + me(p.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !!a @@ -2781,7 +3233,7 @@ var mo = (e) => { } catch (e) { console.debug?.(e); } - let r = mo(et(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; + let r = Lo(I(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; try { e.setData("text/uri-list", r), e.setData("DownloadURL", `application/zip:${i}:${r}`), e.effectAllowed = "copyMove"; } catch (e) { @@ -2793,40 +3245,40 @@ var mo = (e) => { } let s = t.filename || t.name; if (!s) return; - let c = a ? vo(t) : "", l = mo((c ? qe(c) : "") || i), u = nn(s); + let c = a ? Vo(t) : "", l = Lo((c ? se(c) : "") || i), u = Qt(s); try { e.setData("text/uri-list", l), e.setData("DownloadURL", `${u}:${s}:${l}`), e.effectAllowed = "copyMove"; } catch (e) { console.debug?.(e); } -}, bo = (e, { asset: t, containerEl: n, card: r }) => { +}, Uo = (e, { asset: t, containerEl: n, card: r }) => { if (e && t) try { let t = e?.dataTransfer?.dropEffect; - !t || t === "none" || fo(); + !t || t === "none" || Fo(); return; } catch (e) { console.debug?.(e); } -}, xo = () => { - let e = tt(); +}, Wo = () => { + let e = $e(); return e && typeof e == "object" ? e : null; -}, So = (e) => to(e, { - buildCustomViewURL: rt, - buildViewURL: it -}), Co = !1, wo = !1, To = (e) => { +}, Go = (e) => To(e, { + buildCustomViewURL: O, + buildViewURL: fe +}), Ko = !1, qo = !1, Jo = (e) => { try { return !!e?.closest?.("input, textarea, select, [contenteditable='true']"); } catch { return !1; } -}, Eo = () => Co === !0, Do = () => wo === !0, Oo = (e) => [ +}, Yo = () => Ko === !0, Xo = () => qo === !0, Zo = (e) => [ String(e?.type || "output"), String(e?.filename || ""), String(e?.subfolder || ""), - String(Pe(e) || "") -].join("\n"), ko = (e, t) => { + String(be(e) || "") +].join("\n"), Qo = (e, t) => { if (String(e?.type || e?.file_info?.type || "").toLowerCase() === "custom") return null; - let n = ft(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim(); + let n = Ge(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim(); if (!n || !t) return null; let r = n.toLowerCase(), i = t.toLowerCase(); for (let e of [ @@ -2854,20 +3306,20 @@ var mo = (e) => { }; } return null; -}, Ao = (e) => { +}, $o = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t) return null; - let n = ko(e, t); + let n = Qo(e, t); return { filename: t, subfolder: n?.subfolder ?? e.subfolder ?? "", type: n?.type ?? String(e.type || "output").toLowerCase(), - root_id: Pe(e) || void 0, + root_id: be(e) || void 0, kind: String(e.kind || "").toLowerCase(), filepath: String(e.filepath || e.path || e?.file_info?.filepath || "").trim() || void 0 }; -}, jo = (e, t, n) => { +}, es = (e, t, n) => { if (!e || !t || n == null) return !1; let r = String(n); try { @@ -2881,10 +3333,10 @@ var mo = (e) => { console.debug?.(e); } return !1; -}, Mo = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { +}, ts = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { if (!e || !t || !n) return; let i = String(n.kind || "").toLowerCase() === "model3d" ? "3D" : n.kind, a = { - id: t.id == null ? Oo(n) : String(t.id), + id: t.id == null ? Zo(n) : String(t.id), name: t.filename || n.filename, display_name: t.filename || n.filename, filename: n.filename, @@ -2900,46 +3352,46 @@ var mo = (e) => { }, tags: Array.isArray(t.tags) ? t.tags : [] }; - jo(e, ln, JSON.stringify(a)), r && jo(e, "text/uri-list", r); -}, No = (e) => { + es(e, An, JSON.stringify(a)), r && es(e, "text/uri-list", r); +}, ns = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return []; try { let e = window?.__MJR_LAST_SELECTION_GRID__, n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (Array.isArray(n) && n.length > 1) { - let e = n.map(Ao).filter(on), r = Oo(t); - if (e.some((e) => Oo(e) === r)) return e; + let e = n.map($o).filter(un), r = Zo(t); + if (e.some((e) => Zo(e) === r)) return e; } } catch (e) { console.debug?.(e); } return [t]; -}, Po = (e, t) => { +}, rs = (e, t) => { try { let n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (!Array.isArray(n) || n.length <= 1) return []; - let r = n.map(Ao).filter(on), i = Oo(t); - return r.some((e) => Oo(e) === i) ? r : []; + let r = n.map($o).filter(un), i = Zo(t); + return r.some((e) => Zo(e) === i) ? r : []; } catch (e) { return console.debug?.(e), []; } -}, Fo = (e, t) => { +}, is = (e, t) => { try { let t = e?.dataTransfer?.getData?.("application/x-mjr-assets") || ""; if (t) { - let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(ro).filter(on); + let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(Do).filter(un); if (n.length) return n; } } catch (e) { console.debug?.(e); } - return No(t); -}, Io = async (e) => { + return ns(t); +}, as = async (e) => { let t = Array.isArray(e) ? e.filter(Boolean) : []; return t.length ? (await Promise.all(t.map(async (e) => { - let t = (await Un({ - post: pe, - endpoint: lt.STAGE_TO_INPUT, + let t = (await En({ + post: me, + endpoint: p.STAGE_TO_INPUT, payload: e, index: !1 }))?.relativePath; @@ -2949,43 +3401,43 @@ var mo = (e) => { droppedExt: String(e?.filename || "").split(".").pop() || "" } : null; }))).filter(Boolean) : []; -}, Lo = /* @__PURE__ */ new Map(), Ro = 6e4, zo = 20, Bo = 5242880, Vo = 5e3, Ho = 2e4, Uo = 256, Wo = 5e5, Go = /[\u0000-\u001f\u007f]/, Ko = /\u0000/, qo = (e) => Go.test(String(e || "")), Jo = (e) => Ko.test(String(e || "")), Yo = (e) => { +}, os = /* @__PURE__ */ new Map(), ss = 6e4, cs = 20, ls = 5242880, us = 5e3, ds = 2e4, fs = 256, ps = 5e5, ms = /[\u0000-\u001f\u007f]/, hs = /\u0000/, gs = (e) => ms.test(String(e || "")), _s = (e) => hs.test(String(e || "")), vs = (e) => { if (!e || typeof e != "object" || Array.isArray(e)) return !1; let t = Number(e.id); if (!Number.isFinite(t)) return !1; let n = e.type == null ? "" : String(e.type); - if (n && (n.length > Uo || qo(n))) return !1; + if (n && (n.length > fs || gs(n))) return !1; let r = e.widgets_values; if (Array.isArray(r)) { - for (let e of r) if (typeof e == "string" && (e.length > Wo || Jo(e))) return !1; + for (let e of r) if (typeof e == "string" && (e.length > ps || _s(e))) return !1; } return !0; -}, Xo = (e) => { +}, ys = (e) => { if (Array.isArray(e)) return e.length >= 4; if (e && typeof e == "object") { let t = Number(e.id); return !!Number.isFinite(t); } return !1; -}, Zo = (e) => { - if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > Vo || e.links.length > Ho || !e.nodes.every(Yo) || !e.links.every(Xo)) return !1; +}, bs = (e) => { + if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > us || e.links.length > ds || !e.nodes.every(vs) || !e.links.every(ys)) return !1; try { let t = JSON.stringify(e).length; - if (!Number.isFinite(t) || t <= 0 || t > Bo) return !1; + if (!Number.isFinite(t) || t <= 0 || t > ls) return !1; } catch { return !1; } return !0; -}, Qo = () => { +}, xs = () => { let e = Date.now(); - for (let [t, n] of Lo.entries()) e - (n?.at || 0) > Ro && Lo.delete(t); - Lo.size > zo && Array.from(Lo.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, Lo.size - zo).forEach(([e]) => Lo.delete(e)); -}, $o = async (e, t = null) => { - let n = e && typeof e == "object" ? e : null, r = Pe(n), i = xo(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; + for (let [t, n] of os.entries()) e - (n?.at || 0) > ss && os.delete(t); + os.size > cs && Array.from(os.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, os.size - cs).forEach(([e]) => os.delete(e)); +}, Ss = async (e, t = null) => { + let n = e && typeof e == "object" ? e : null, r = be(n), i = Wo(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; if (a) { - let e = Lo.get(a); - if (e && Date.now() - (e.at || 0) < Ro) { - if (e.workflow && Zo(e.workflow)) try { + let e = os.get(a); + if (e && Date.now() - (e.at || 0) < ss) { + if (e.workflow && bs(e.workflow)) try { if (typeof i?.loadGraphData == "function") return i.loadGraphData(e.workflow), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(e.workflow); @@ -3006,22 +3458,22 @@ var mo = (e) => { try { let e = null, o = null; if (String(n?.kind || "").toLowerCase() === "workflow" && n?.filepath) { - let e = await S(String(n.filepath), { timeoutMs: 3e4 }); + let e = await Le(String(n.filepath), { timeoutMs: 3e4 }); o = e?.ok && (e?.data?.workflow || e?.workflow) || null; } else if (n?.filename) { - let t = `${lt.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await le(t); - i?.ok && i.workflow && (o = i.workflow), o || (e = `${lt.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); - } else t && (e = `${lt.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); + let t = `${p.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await Pe(t); + i?.ok && i.workflow && (o = i.workflow), o || (e = `${p.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); + } else t && (e = `${p.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); if (!o && e) { - let t = await le(e); + let t = await Pe(e); if (!t?.ok || !t.data) return !1; o = t.data?.workflow; } - if (!Zo(o)) return !1; - if (a && (Lo.set(a, { + if (!bs(o)) return !1; + if (a && (os.set(a, { workflow: o, at: Date.now() - }), Qo()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; + }), xs()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(o); try { @@ -3037,7 +3489,7 @@ var mo = (e) => { } return !1; }; -function es(e) { +function Cs(e) { return (t) => { let n = t?.dataTransfer; if (!n) return; @@ -3045,26 +3497,26 @@ function es(e) { if (!r) return; let i = r._mjrAsset; if (!i || typeof i != "object") return; - let a = String(i?.kind || "").toLowerCase(), o = ko(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { + let a = String(i?.kind || "").toLowerCase(), o = Qo(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { filename: i.filename, subfolder: o?.subfolder ?? i.subfolder ?? "", type: s, - root_id: Pe(i) || void 0, + root_id: be(i) || void 0, kind: a, filepath: String(i.filepath || i.path || i?.file_info?.filepath || "").trim() || void 0 }; try { - let t = Eo(); - jo(n, hn, JSON.stringify(c)); - let o = Po(e, c); - o.length > 1 && jo(n, Wn, JSON.stringify({ items: o })), jo(n, "text/plain", String(i.filename || "")); - let s = a === "workflow" ? "" : So(c); - Mo({ + let t = Yo(); + es(n, Yt, JSON.stringify(c)); + let o = rs(e, c); + o.length > 1 && es(n, kn, JSON.stringify({ items: o })), es(n, "text/plain", String(i.filename || "")); + let s = a === "workflow" ? "" : Go(c); + ts({ dt: n, asset: i, payload: c, viewUrl: s - }), yo({ + }), Ho({ dt: n, asset: i, containerEl: e, @@ -3077,7 +3529,7 @@ function es(e) { } try { r.addEventListener("dragend", (t) => { - bo(t, { + Uo(t, { asset: i, containerEl: e, card: r @@ -3094,30 +3546,30 @@ function es(e) { } }; } -var ts = (e) => { +var ws = (e) => { if (!e) return () => {}; - let t = so(e); + let t = jo(e); if (typeof t == "function") return t; - let n = es(e); - return e.addEventListener("dragstart", n, !0), co(e, () => { + let n = Cs(e); + return e.addEventListener("dragstart", n, !0), Mo(e, () => { try { e.removeEventListener("dragstart", n, !0); } catch (e) { console.debug?.(e); } - lo(e); + No(e); }); -}, ns = null, rs = 0; -function is() { +}, Ts = null, Es = 0; +function Ds() { let e = (e) => { - if (To(e?.target)) return; + if (Jo(e?.target)) return; let t = String(e?.key || "").toLowerCase(); - t === "s" ? Co = !0 : t === "l" && (wo = !0); + t === "s" ? Ko = !0 : t === "l" && (qo = !0); }, t = (e) => { let t = String(e?.key || "").toLowerCase(); - t === "s" ? Co = !1 : t === "l" && (wo = !1); + t === "s" ? Ko = !1 : t === "l" && (qo = !1); }, n = () => { - Co = !1, wo = !1; + Ko = !1, qo = !1; }, r = /* @__PURE__ */ new Set([ "mp3", "wav", @@ -3191,20 +3643,20 @@ function is() { t && (i = t.resolvedStart === void 0 ? t.start : t.resolvedStart); } e._ghostSegmentId = null, e._ghostTrack = null, e._ghostInitialTimeline = null, e._previewSegments = null, e.render?.(); - let s = String(n || "").toLowerCase(), c = r.has(s), l = await Un({ - post: pe, - endpoint: lt.STAGE_TO_INPUT, + let s = String(n || "").toLowerCase(), c = r.has(s), l = await En({ + post: me, + endpoint: p.STAGE_TO_INPUT, payload: t, index: !1 }); if (!l?.name) { - I(`Failed to stage: "${t?.filename}"`, "error"); + F(`Failed to stage: "${t?.filename}"`, "error"); return; } - let { name: u, subfolder: d = "" } = l, f = d ? `${d}/${u}` : u, p = `/view?filename=${encodeURIComponent(u)}&type=input&subfolder=${encodeURIComponent(d)}`; + let { name: u, subfolder: d = "" } = l, f = d ? `${d}/${u}` : u, m = `/view?filename=${encodeURIComponent(u)}&type=input&subfolder=${encodeURIComponent(d)}`; if (c) { try { - let t = await fetch(p); + let t = await fetch(m); if (!t.ok) throw Error(`HTTP ${t.status}`); let n = await t.arrayBuffer(), r = await new (window.AudioContext || window.webkitAudioContext)().decodeAudioData(n), a = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, o = Math.max(1, Math.ceil(r.duration * a)), s = r.getChannelData(0), c = Math.max(1, Math.floor(s.length / 200)), l = []; for (let e = 0; e < 200; e++) { @@ -3224,8 +3676,8 @@ function is() { d = Math.max(d, e.start + e.length); } } - let m = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), h = { - id: m, + let p = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), h = { + id: p, type: "audio", start: d, length: o, @@ -3236,72 +3688,72 @@ function is() { waveformPeaks: l }; if (!e.timeline?.audioSegments) { - eo("ltxdirector inject: no audioSegments", {}); + wo("ltxdirector inject: no audioSegments", {}); return; } - e.timeline.audioSegments.push(h), e.timeline.audioSegments.sort((e, t) => e.start - t.start), e.selectionType = "audio", e.selectedIndex = e.timeline.audioSegments.findIndex((e) => e.id === m), e.updateUIFromSelection?.(), e.commitChanges?.(!0), e.render?.(), I(`Added audio to LTX Director: ${u}`, "success", 3e3), eo("drop ltxdirector inject audio", { + e.timeline.audioSegments.push(h), e.timeline.audioSegments.sort((e, t) => e.start - t.start), e.selectionType = "audio", e.selectedIndex = e.timeline.audioSegments.findIndex((e) => e.id === p), e.updateUIFromSelection?.(), e.commitChanges?.(!0), e.render?.(), F(`Added audio to LTX Director: ${u}`, "success", 3e3), wo("drop ltxdirector inject audio", { file: u, start: d }); } catch (e) { - console.error("[Majoor] LTX Director audio inject failed", e), I(`Audio decode failed for: ${u}`, "error"); + console.error("[Majoor] LTX Director audio inject failed", e), F(`Audio decode failed for: ${u}`, "error"); } return; } - let m = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, h = a(t, s), g = m, _ = i ?? 0; + let h = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, g = a(t, s), _ = h, v = i ?? 0; if (i === null) { let t = Array.isArray(e.timeline?.segments) ? [...e.timeline.segments] : []; t.sort((e, t) => e.start - t.start); for (let e of t) { - if (_ + g <= e.start) break; - _ = Math.max(_, e.start + e.length); + if (v + _ <= e.start) break; + v = Math.max(v, e.start + e.length); } } - let v = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), y; - if (h) { + let y = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), b; + if (g) { let t = document.createElement("video"); - t.crossOrigin = "Anonymous", t.preload = "auto", t.muted = !0, t.playsInline = !0, t.src = p, y = { - id: `${v}_v`, - start: _, - length: g, + t.crossOrigin = "Anonymous", t.preload = "auto", t.muted = !0, t.playsInline = !0, t.src = m, b = { + id: `${y}_v`, + start: v, + length: _, trimStart: 0, prompt: "", type: "video", - videoDurationFrames: g, + videoDurationFrames: _, imageFile: f, fileName: u, videoEl: t - }, o(e, y, t, m); - } else y = { - id: v, - start: _, - length: g, + }, o(e, b, t, h); + } else b = { + id: y, + start: v, + length: _, prompt: "", type: "image", imageFile: f, - imageB64: p + imageB64: m }; if (!e.timeline?.segments) { - eo("ltxdirector inject: no timeline", {}); + wo("ltxdirector inject: no timeline", {}); return; } - if (e.timeline.segments.push(y), e.timeline.segments.sort((e, t) => e.start - t.start), h) try { - e.retakeMode || e.growTimelineIfNeeded?.(y.start + y.length), e._ensureThumbnails?.(y); + if (e.timeline.segments.push(b), e.timeline.segments.sort((e, t) => e.start - t.start), g) try { + e.retakeMode || e.growTimelineIfNeeded?.(b.start + b.length), e._ensureThumbnails?.(b); } catch (e) { console.debug?.(e); } else { let t = new Image(); t.onload = () => { - y.imgObj = t, e.render?.(); - }, t.src = p; + b.imgObj = t, e.render?.(); + }, t.src = m; } - let b = e.timeline.segments.findIndex((e) => e.id === v), x = h ? e.timeline.segments.findIndex((e) => e.id === y.id) : b; - x >= 0 && (e.selectionType = "image", e.selectedIndex = x, e.updateUIFromSelection?.()), e.commitChanges?.(!0), e.render?.(), I(`Added ${h ? "video" : "image"} to LTX Director: ${u}`, "success", 3e3), eo("drop ltxdirector inject", { + let x = e.timeline.segments.findIndex((e) => e.id === y), S = g ? e.timeline.segments.findIndex((e) => e.id === b.id) : x; + S >= 0 && (e.selectionType = "image", e.selectedIndex = S, e.updateUIFromSelection?.()), e.commitChanges?.(!0), e.render?.(), F(`Added ${g ? "video" : "image"} to LTX Director: ${u}`, "success", 3e3), wo("drop ltxdirector inject", { file: u, - start: _, + start: v, ext: s, - isVideo: h + isVideo: g }); }; return { @@ -3309,39 +3761,39 @@ function is() { onKeyUp: t, onWindowBlur: n, onDragOver: (e) => { - let t = xo(); + let t = Wo(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; - let n = io(e, hn); - if (!on(n)) return; - let r = dn(t, e.clientX, e.clientY), i = r ? un(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? pn(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; - r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Zt(t, r, Nn), e.dataTransfer.dropEffect = "copy", i ? eo("dragover slot", { + let n = Oo(e, Yt); + if (!un(n)) return; + let r = mn(t, e.clientX, e.clientY), i = r ? Hn(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? $t(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; + r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), pn(t, r, Un), e.dataTransfer.dropEffect = "copy", i ? wo("dragover slot", { node: r?.title, slot: i.input?.name - }) : s ? eo("dragover ltxdirector", { node: r?.title }) : eo("dragover widget", { + }) : s ? wo("dragover ltxdirector", { node: r?.title }) : wo("dragover widget", { node: r?.title, widget: o?.name - })) : (Mn(t, Nn), fn(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy")); + })) : (Zt(t, Un), Sn(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy")); }, onDrop: async (e) => { - let t = xo(); + let t = Wo(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; try { if ((e?.target)?.closest?.(".mjr-folder-card")) return; } catch {} - let n = io(e, hn); - if (!on(n) || !fn(t, e)) return; - uo(); - let r = Do(), i = r ? Fo(e, n) : [n], a = dn(t, e.clientX, e.clientY), o = a ? un(t, a, e.clientX, e.clientY) : null, c = String(n?.filename || "").split(".").pop() || "", l = a && !o ? pn(a, n, c) : null; + let n = Oo(e, Yt); + if (!un(n) || !Sn(t, e)) return; + Po(); + let r = Xo(), i = r ? is(e, n) : [n], a = mn(t, e.clientX, e.clientY), o = a ? Hn(t, a, e.clientX, e.clientY) : null, c = String(n?.filename || "").split(".").pop() || "", l = a && !o ? $t(a, n, c) : null; if (a && o) { - e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Mn(t, Nn); - let r = await $t({ - post: pe, - endpoint: lt.STAGE_TO_INPUT, + e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Zt(t, Un); + let r = await Dn({ + post: me, + endpoint: p.STAGE_TO_INPUT, payload: n, index: !1 }); if (!r) return; - if (tn({ + if (Vn({ app: t, payload: n, relativePath: r, @@ -3349,58 +3801,58 @@ function is() { inputSlotIndex: o.index, event: e })) { - eo("drop slot created and connected loader", { + wo("drop slot created and connected loader", { node: a?.title, slot: o.input?.name, value: r }); return; } - I(`Staged to input: ${r}`, "success", 4e3); + F(`Staged to input: ${r}`, "success", 4e3); return; } if (a && !o && !l && a._timelineEditor && !r) { - e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Mn(t, Nn), await s(a._timelineEditor, n, c); + e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Zt(t, Un), await s(a._timelineEditor, n, c); return; } if (!a || !l) { - if (Mn(t, Nn), e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), r) { - let r = await Io(i), a = gn({ + if (Zt(t, Un), e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), r) { + let r = await as(i), a = bn({ app: t, items: r, event: e }); if (a > 0) { - eo("drop canvas created loaders", { count: a }); + wo("drop canvas created loaders", { count: a }); return; } - I(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); + F(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); return; } if (String(n?.kind || "").toLowerCase() === "workflow") { - if (await $o(n)) { - eo("drop canvas loaded workflow", { file: n?.filename }); + if (await Ss(n)) { + wo("drop canvas loaded workflow", { file: n?.filename }); return; } - I(`Failed to load workflow: "${n?.filename}".`, "error"); + F(`Failed to load workflow: "${n?.filename}".`, "error"); return; } - let o = !a && !r, s = Un({ - post: pe, - endpoint: lt.STAGE_TO_INPUT, + let o = !a && !r, s = En({ + post: me, + endpoint: p.STAGE_TO_INPUT, payload: n, index: !1 - }), l = o ? $o(n) : Promise.resolve(!1), [u, d] = await Promise.all([l, s]); + }), l = o ? Ss(n) : Promise.resolve(!1), [u, d] = await Promise.all([l, s]); if (u) { - eo("drop canvas loaded workflow", { file: n?.filename }); + wo("drop canvas loaded workflow", { file: n?.filename }); return; } let f = d?.relativePath; if (!f) { - eo("drop canvas stage failed"), I(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); + wo("drop canvas stage failed"), F(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); return; } - if (eo("drop canvas staged", { value: f }), gn({ + if (wo("drop canvas staged", { value: f }), bn({ app: t, items: [{ payload: n, @@ -3409,71 +3861,71 @@ function is() { }], event: e })) { - eo("drop canvas created loader", { value: f }); + wo("drop canvas created loader", { value: f }); return; } - I(`Staged to input: ${f}`, "success", 4e3); + F(`Staged to input: ${f}`, "success", 4e3); return; } - e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Mn(t, Nn); - let u = await $t({ - post: pe, - endpoint: lt.STAGE_TO_INPUT, + e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Zt(t, Un); + let u = await Dn({ + post: me, + endpoint: p.STAGE_TO_INPUT, payload: n, index: !1 }); - u && (en(l, u), Nn(t), eo("drop inject", { + u && (Wn(l, u), Un(t), wo("drop inject", { node: a?.title, widget: l?.name, value: u })); }, onDragLeave: () => { - let e = xo(); - Mn(e, Nn), eo("dragleave"); + let e = Wo(); + Zt(e, Un), wo("dragleave"); } }; } -function as() { +function Os() { if (typeof window > "u" || !window?.addEventListener) return { dispose() {} }; - let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = is(); + let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = Ds(); return window.addEventListener("keydown", e, !0), window.addEventListener("keyup", t, !0), window.addEventListener("blur", n, !0), window.addEventListener("dragover", r, !0), window.addEventListener("drop", i, !0), window.addEventListener("dragleave", a, !0), { dispose: () => { try { window.removeEventListener("keydown", e, !0), window.removeEventListener("keyup", t, !0), window.removeEventListener("blur", n, !0), window.removeEventListener("dragover", r, !0), window.removeEventListener("drop", i, !0), window.removeEventListener("dragleave", a, !0); } catch (e) { console.debug?.(e); } - Co = !1, wo = !1; + Ko = !1, qo = !1; try { - Mn(xo(), Nn); + Zt(Wo(), Un); } catch (e) { console.debug?.(e); } } }; } -function os() { - ns || (ns = as(), rs = 0), rs += 1; +function ks() { + Ts || (Ts = Os(), Es = 0), Es += 1; let e = !1; return ({ force: t = !1 } = {}) => { - e || (e = !0, ss({ force: t })); + e || (e = !0, As({ force: t })); }; } -function ss({ force: e = !1 } = {}) { - if (!ns) rs = 0, po(); - else if (!e && rs > 1) --rs; +function As({ force: e = !1 } = {}) { + if (!Ts) Es = 0, Io(); + else if (!e && Es > 1) --Es; else { - rs = 0; + Es = 0; try { - ns.dispose?.(); + Ts.dispose?.(); } catch (e) { console.debug?.(e); } - ns = null, po(); + Ts = null, Io(); } } // ui/features/grid/MediaBlobCache.ts -var cs = "__MJR_MEDIA_BLOB_CACHE__", ls = 384, us = 3e5, ds = 3e4, fs = 15e3, ps = 6, ms = 192, hs = 3; -function gs() { +var js = "__MJR_MEDIA_BLOB_CACHE__", Ms = 384, Ns = 3e5, Ps = 3e4, Fs = 15e3, Is = 6, Ls = 192, Rs = 3; +function zs() { let e = /* @__PURE__ */ new Map(), t = null, n = 0, r = []; function i() { try { @@ -3485,10 +3937,10 @@ function gs() { return !1; } function a() { - return i() ? ms : ls; + return i() ? Ls : Ms; } function o() { - return i() ? hs : ps; + return i() ? Rs : Is; } async function s(e) { n >= o() && await new Promise((e) => r.push(e)), n += 1; @@ -3501,7 +3953,7 @@ function gs() { } } function c() { - t ||= setInterval(l, fs); + t ||= setInterval(l, Fs); } function l() { try { @@ -3523,7 +3975,7 @@ function gs() { for (let [r, i] of e) i.refcount > 0 || i.expiresAt < n && (n = i.expiresAt, t = r); t && (u(e.get(t)), e.delete(t)); } - function f(e, t = us) { + function f(e, t = Ns) { e.expiresAt = Date.now() + t; } function p() { @@ -3547,7 +3999,7 @@ function gs() { r ? (r.hasError = !0, f(r)) : (e.size >= a() && d(), e.set(n, { blobUrl: null, refcount: 0, - expiresAt: Date.now() + ds, + expiresAt: Date.now() + Ps, hasError: !0 }), p(), c()); } catch (e) { @@ -3581,7 +4033,7 @@ function gs() { return e.size >= a() && d(), e.set(r, { blobUrl: g, refcount: 1, - expiresAt: Date.now() + us, + expiresAt: Date.now() + Ns, hasError: !1 }), p(), c(), g; } catch (e) { @@ -3593,7 +4045,7 @@ function gs() { let n = m(t); if (!n) return; let r = e.get(n); - r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, ds)), l(), p(); + r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, Ps)), l(), p(); } catch (e) { console.debug?.(e); } @@ -3620,26 +4072,26 @@ function gs() { dispose: y }; } -function _s() { +function Bs() { try { - if (window[cs]) return window[cs]; + if (window[js]) return window[js]; } catch (e) { console.debug?.(e); } try { - window[cs]?.dispose?.(); + window[js]?.dispose?.(); } catch (e) { console.debug?.(e); } - let e = gs(); + let e = zs(); try { - window[cs] = e; + window[js] = e; } catch (e) { console.debug?.(e); } return e; } -var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ +var Vs = Bs(), Hs = ["title"], Us = /* @__PURE__ */ tr({ __name: "RatingBadge", props: { rating: { type: [Number, String], @@ -3650,27 +4102,27 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ } } }, setup(e) { - let t = e, n = G(() => Math.max(0, Math.min(5, Number(t.rating) || 0))), r = G(() => n.value > 0), i = G(() => R("rating.title", "Rating: {n} star{n, plural, one {} other {s}}", { n: n.value })); - return (e, t) => r.value ? (K(), Y("div", { + let t = e, n = K(() => Math.max(0, Math.min(5, Number(t.rating) || 0))), r = K(() => n.value > 0), i = K(() => L("rating.title", "Rating: {n} star{n, plural, one {} other {s}}", { n: n.value })); + return (e, t) => r.value ? (q(), Y("div", { key: 0, class: "mjr-rating-badge", title: i.value - }, [(K(!0), Y(V, null, hr(n.value, (e) => (K(), Y("span", { + }, [(q(!0), Y(V, null, $n(n.value, (e) => (q(), Y("span", { key: e, - style: xr({ + style: fr({ color: "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", marginRight: e < n.value ? "2px" : "0" }) - }, " ★ ", 4))), 128))], 8, ys)) : W("", !0); + }, " ★ ", 4))), 128))], 8, Hs)) : W("", !0); } -}), xs = ["title"], Ss = /* @__PURE__ */ dr({ +}), Ws = ["title"], Gs = /* @__PURE__ */ tr({ __name: "TagsBadge", props: { tags: { type: [Array, String], default: () => [] } }, setup(e) { - let t = e, n = G(() => { + let t = e, n = K(() => { if (Array.isArray(t.tags)) return t.tags.map((e) => String(e ?? "").trim()).filter(Boolean).slice(0, 10); if (typeof t.tags == "string") { let e = t.tags.trim(); @@ -3683,43 +4135,43 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ } } return []; - }), r = G(() => n.value.length > 0), i = G(() => R("tags.title", "Tags: {tags}", { tags: n.value.join(", ") })), a = G(() => { + }), r = K(() => n.value.length > 0), i = K(() => L("tags.title", "Tags: {tags}", { tags: n.value.join(", ") })), a = K(() => { let e = n.value; return e.length <= 5 ? e.join(", ") : e.slice(0, 5).join(", ") + ` +${e.length - 5}`; }); - return (e, t) => r.value ? (K(), Y("div", { + return (e, t) => r.value ? (q(), Y("div", { key: 0, class: "mjr-tags-badge", title: i.value, style: { color: "var(--mjr-tag-color, #90CAF9)" } - }, q(a.value), 9, xs)) : W("", !0); + }, J(a.value), 9, Ws)) : W("", !0); } -}), Cs = ["title"], ws = /* @__PURE__ */ dr({ +}), Ks = ["title"], qs = /* @__PURE__ */ tr({ __name: "GenTimeBadge", props: { genTimeMs: { default: 0 } }, setup(e) { - let t = e, n = G(() => St(t.genTimeMs)), r = G(() => n.value > 0), i = G(() => kt(n.value)), a = G(() => jt(n.value)); - return (e, t) => r.value ? (K(), Y("div", { + let t = e, n = K(() => In(t.genTimeMs)), r = K(() => n.value > 0), i = K(() => tn(n.value)), a = K(() => on(n.value)); + return (e, t) => r.value ? (q(), Y("div", { key: 0, class: "mjr-gentime-badge", title: i.value.title, - style: xr({ color: a.value }) - }, q(i.value.text), 13, Cs)) : W("", !0); + style: fr({ color: a.value }) + }, J(i.value.text), 13, Ks)) : W("", !0); } -}), Ts = { +}), Js = { key: 0, class: "mjr-live-placeholder-wash", "aria-hidden": "true" -}, Es = ["title", "aria-label"], Ds = ["alt", "src"], Os = { class: "mjr-workflow-thumb-title" }, ks = { class: "mjr-workflow-thumb-meta" }, As = { key: 0 }, js = { key: 1 }, Ms = { key: 2 }, Ns = { +}, Ys = ["title", "aria-label"], Xs = ["alt", "src"], Zs = { class: "mjr-workflow-thumb-title" }, Qs = { class: "mjr-workflow-thumb-meta" }, $s = { key: 0 }, ec = { key: 1 }, tc = { key: 2 }, nc = { key: 3, class: "mjr-workflow-missing-chip" -}, Ps = ["alt", "src"], Fs = { +}, rc = ["alt", "src"], ic = { key: 1, class: "mjr-media-error-placeholder" -}, Is = ["data-src", "poster"], Ls = ["src"], Rs = { class: "mjr-audio-thumb-head" }, zs = { class: "mjr-audio-thumb-kind" }, Bs = { +}, ac = ["data-src", "poster"], oc = ["src"], sc = { class: "mjr-audio-thumb-head" }, cc = { class: "mjr-audio-thumb-kind" }, lc = { class: "mjr-audio-thumb-waveform", "aria-hidden": "true" -}, Vs = { class: "mjr-audio-thumb-meta" }, Hs = { class: "mjr-audio-thumb-title" }, Us = { class: "mjr-audio-thumb-subtitle" }, Ws = ["src", "alt"], Gs = { +}, uc = { class: "mjr-audio-thumb-meta" }, dc = { class: "mjr-audio-thumb-title" }, fc = { class: "mjr-audio-thumb-subtitle" }, pc = ["src", "alt"], mc = { key: 1, class: "mjr-model3d-thumb-icon", style: { @@ -3730,23 +4182,23 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "justify-content": "center", color: "rgba(255,255,255,0.7)" } -}, Ks = [ +}, hc = [ "data-mjr-ext", "data-mjr-badge-bg", "title" -], qs = ["title"], Js = { +], gc = ["title"], _c = { key: 7, class: "mjr-card-hover-info" -}, Ys = { +}, vc = { key: 0, class: "mjr-hover-prompt" -}, Xs = { +}, yc = { key: 1, class: "mjr-hover-prompt mjr-hover-workflow-notes" -}, Zs = { +}, bc = { key: 2, class: "mjr-hover-gentime" -}, Qs = ["data-mjr-kind"], $s = ["title"], ec = { +}, xc = ["data-mjr-kind"], Sc = ["title"], Cc = { class: "mjr-card-meta-row", style: { "font-size": "0.85em", @@ -3757,7 +4209,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "text-overflow": "ellipsis", "padding-right": "16px" } -}, tc = ["title"], nc = ["title"], rc = ["title"], ic = { +}, wc = ["title"], Tc = ["title"], Ec = ["title"], Dc = { key: 0, class: "mjr-meta-separator", "aria-hidden": "true", @@ -3765,7 +4217,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ opacity: "0.55", margin: "0 3px" } -}, ac = ["title"], oc = { class: "mjr-stack-group-button-count" }, sc = { class: "mjr-dup-stack-count" }, cc = /* @__PURE__ */ dr({ +}, Oc = ["title"], kc = { class: "mjr-stack-group-button-count" }, Ac = { class: "mjr-dup-stack-count" }, jc = /* @__PURE__ */ tr({ __name: "AssetCardInner", props: { asset: {} }, emits: ["workflow-action"], @@ -3790,7 +4242,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ async function i(e, t = {}) { if (!e) return null; try { - return vs.hasError(e) ? null : await vs.acquireUrl(e, t) || null; + return Vs.hasError(e) ? null : await Vs.acquireUrl(e, t) || null; } catch { return null; } @@ -3803,13 +4255,13 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ let t = String(e.dataset?.src || "").trim(); if (!t || e.getAttribute("src")) return; let n = (Number(e._mjrVideoLoadRequestId || 0) || 0) + 1; - if (e._mjrVideoLoadRequestId = n, vs.hasError(t)) { + if (e._mjrVideoLoadRequestId = n, Vs.hasError(t)) { e.src = t, e._mjrSourceKey = t; return; } - let r = await vs.acquireUrl(t); + let r = await Vs.acquireUrl(t); if (e._mjrVideoLoadRequestId !== n || !e.isConnected) { - r && vs.releaseUrl(t); + r && Vs.releaseUrl(t); return; } r ? (e.src = r, e._mjrCachedSrc = t, e._mjrSourceKey = t) : (e.src = t, e._mjrSourceKey = t), e.load?.(); @@ -3830,7 +4282,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ } try { let t = String(e._mjrCachedSrc || "").trim(); - t && vs.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; + t && Vs.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; } catch (e) { console.debug?.(e); } @@ -3901,83 +4353,71 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ function f(e) { e && (u(e), s(e)); } - let p = e, m = t, h = G(() => String(p.asset.kind || "image").toLowerCase()), g = G(() => h.value === "workflow"), _ = G(() => h.value === "image"), v = G(() => h.value === "video"), y = G(() => h.value === "audio"), b = G(() => h.value === "model3d"), x = G(() => ot(p.asset) || ""), S = G(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = G(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = G(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = G(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = G(() => x.value), D = G(() => T.value || x.value), O = G(() => !v.value && !g.value ? "" : Qe(p.asset, 384)), k = G(() => S.value || O.value), A = G(() => String(p.asset.filename || "")), j = G(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), M = G(() => { + let p = e, m = t, h = K(() => String(p.asset.kind || "image").toLowerCase()), g = K(() => h.value === "workflow"), _ = K(() => h.value === "image"), v = K(() => h.value === "video"), y = K(() => h.value === "audio"), b = K(() => h.value === "model3d"), x = K(() => ae(p.asset) || ""), S = K(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = K(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = K(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = K(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = K(() => x.value), D = K(() => T.value || x.value), O = K(() => !v.value && !g.value ? "" : Te(p.asset, 384)), k = K(() => S.value || O.value), A = K(() => String(p.asset.filename || "")), ee = K(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), j = K(() => { let e = A.value; return e.includes(".") ? e.split(".").pop().toUpperCase() : ""; - }), N = G(() => { - let e = j.value || A.value; + }), M = K(() => { + let e = ee.value || A.value; return e.includes(".") ? e.slice(0, e.lastIndexOf(".")) : e; - }), ee = G(() => String(p.asset.notes || "").trim()), te = G(() => r(`${p.asset.id || ""}:${A.value}:${p.asset.duration || ""}`)), P = G(() => N.value || A.value || "Audio"), ne = G(() => [pe.value, M.value].filter(Boolean).join(" / ") || "Audio"), F = G(() => { - let e = [A.value || j.value], t = String(p.asset.subfolder || p.asset.file_info?.subfolder || "").trim(), n = String(p.asset.type || p.asset.source || p.asset.file_info?.type || "").trim(); - return t && e.push(`Subfolder: ${t}`), n && e.push(`Type: ${n}`), ee.value && e.push(`Notes: ${ee.value}`), e.filter(Boolean).join("\n"); - }), re = G(() => Number(p.asset.rating) || 0), ie = G(() => p.asset.tags || []), ae = G(() => { + }), N = K(() => String(p.asset.notes || "").trim()), te = K(() => r(`${p.asset.id || ""}:${A.value}:${p.asset.duration || ""}`)), ne = K(() => M.value || A.value || "Audio"), P = K(() => [me.value, j.value].filter(Boolean).join(" / ") || "Audio"), re = K(() => { + let e = [A.value || ee.value], t = String(p.asset.subfolder || p.asset.file_info?.subfolder || "").trim(), n = String(p.asset.type || p.asset.source || p.asset.file_info?.type || "").trim(); + return t && e.push(`Subfolder: ${t}`), n && e.push(`Type: ${n}`), N.value && e.push(`Notes: ${N.value}`), e.filter(Boolean).join("\n"); + }), F = K(() => Number(p.asset.rating) || 0), I = K(() => p.asset.tags || []), ie = K(() => { let e = p.asset.generation_time_ms ?? p.asset.metadata?.generation_time_ms ?? 0; - return St(e); - }), I = G(() => ae.value > 0), oe = G(() => kt(ae.value)), se = G(() => jt(ae.value)), ce = G(() => String(p.asset.positive_prompt || "").trim()), le = G(() => p.asset?._mjrLivePlaceholder === !0 || p.asset?.is_live_placeholder === !0 || String(p.asset?.id || "").trim().toLowerCase().startsWith("live:")), ue = G(() => String(p.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), de = G(() => `${ue.value}: waiting for indexed asset data`), fe = G(() => { + return In(e); + }), oe = K(() => ie.value > 0), se = K(() => tn(ie.value)), ce = K(() => on(ie.value)), le = K(() => String(p.asset.positive_prompt || "").trim()), ue = K(() => p.asset?._mjrLivePlaceholder === !0 || p.asset?.is_live_placeholder === !0 || String(p.asset?.id || "").trim().toLowerCase().startsWith("live:")), de = K(() => String(p.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), fe = K(() => `${de.value}: waiting for indexed asset data`), pe = K(() => { let { width: e, height: t } = p.asset; return e && t ? `${e}x${t}` : ""; - }), pe = G(() => p.asset.duration ? Tn(p.asset.duration) : ""), me = G(() => String(p.asset.task || p.asset.workflow_task || "").trim()), he = G(() => String(p.asset.model_family || p.asset.modelFamily || "").trim()), ge = G(() => String(p.asset.runs_on || p.asset.runsOn || "").trim()), _e = G(() => Number(p.asset.node_count || p.asset.nodeCount || 0) || 0), ve = G(() => !!p.asset.favorite), ye = G(() => Number(p.asset.subgraph_count || p.asset.subgraphCount || 0) || 0), be = G(() => Number(p.asset.missing_nodes_count || p.asset.missingNodesCount || 0) || 0), xe = G(() => Number(p.asset.missing_models_count || p.asset.missingModelsCount || 0) || 0), Se = G(() => be.value > 0 || xe.value > 0), Ce = G(() => { - if (!Se.value) return ""; + }), me = K(() => p.asset.duration ? jn(p.asset.duration) : ""), he = K(() => String(p.asset.task || p.asset.workflow_task || "").trim()), ge = K(() => String(p.asset.model_family || p.asset.modelFamily || "").trim()), _e = K(() => String(p.asset.runs_on || p.asset.runsOn || "").trim()), ve = K(() => Number(p.asset.node_count || p.asset.nodeCount || 0) || 0), ye = K(() => !!p.asset.favorite), be = K(() => Number(p.asset.subgraph_count || p.asset.subgraphCount || 0) || 0), xe = K(() => Number(p.asset.missing_nodes_count || p.asset.missingNodesCount || 0) || 0), Se = K(() => Number(p.asset.missing_models_count || p.asset.missingModelsCount || 0) || 0), Ce = K(() => xe.value > 0 || Se.value > 0), we = K(() => { + if (!Ce.value) return ""; let e = []; - return be.value > 0 && e.push(`${be.value} node`), xe.value > 0 && e.push(`${xe.value} model`), `Missing: ${e.join(" / ")}`; - }), we = G(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), Te = G(() => we.value ? Bn(we.value) : ""), Ee = G(() => we.value ? Pn(we.value) : ""), De = G(() => [ - fe.value ? { + return xe.value > 0 && e.push(`${xe.value} node`), Se.value > 0 && e.push(`${Se.value} model`), `Missing: ${e.join(" / ")}`; + }), L = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), Ee = K(() => L.value ? Cn(L.value) : ""), De = K(() => L.value ? Bn(L.value) : ""), Oe = K(() => [ + pe.value ? { key: "resolution", className: "mjr-meta-res", - title: `Resolution: ${fe.value}`, - text: fe.value - } : null, - pe.value ? { - key: "duration", - className: "mjr-meta-duration", - title: `Duration: ${pe.value}`, + title: `Resolution: ${pe.value}`, text: pe.value } : null, - Te.value ? { - key: "date", - className: "mjr-meta-date", - title: `Date: ${Te.value}`, - text: Te.value + me.value ? { + key: "duration", + className: "mjr-meta-duration", + title: `Duration: ${me.value}`, + text: me.value } : null, Ee.value ? { - key: "time", - className: "mjr-meta-date mjr-meta-time-val", - title: `Time: ${Ee.value}`, + key: "date", + className: "mjr-meta-date", + title: `Date: ${Ee.value}`, text: Ee.value } : null, - I.value ? { + De.value ? { + key: "time", + className: "mjr-meta-date mjr-meta-time-val", + title: `Time: ${De.value}`, + text: De.value + } : null, + oe.value ? { key: "gentime", className: "mjr-meta-gentime", - title: oe.value.title, - text: oe.value.text, + title: se.value.title, + text: se.value.text, style: { - color: se.value, + color: ce.value, fontWeight: "500" } } : null - ].filter(Boolean)), Oe = G(() => !!p.asset._mjrNameCollision && !p.asset._mjrDupStack), ke = G(() => Oe.value ? "var(--mjr-badge-duplicate-alert, #ff1744)" : { + ].filter(Boolean)), ke = K(() => !!p.asset._mjrNameCollision && !p.asset._mjrDupStack), Ae = K(() => ke.value ? "var(--mjr-badge-duplicate-alert, #ff1744)" : { image: "var(--mjr-badge-image, #2196F3)", video: "var(--mjr-badge-video, #F44336)", audio: "var(--mjr-badge-audio, #4CAF50)", model3d: "var(--mjr-badge-model3d, #9C27B0)" - }[h.value] || "var(--mjr-badge-image, #888)"), Ae = sr("mjrStackService", null), je = G(() => !Ae || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), Me = G(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Ne = G(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Pe = G(() => Number(p.asset._mjrDupCount || 0) || 0), Fe = G(() => Ne.value && !je.value), Ie = Z(!1), Le = Z(!1); - async function Re(e) { - if (e.preventDefault(), e.stopPropagation(), !Ie.value) { - Ie.value = !0; - try { - await Ae?.openStackGroup?.(p.asset); - } catch (e) { - console.debug?.(e); - } finally { - Ie.value = !1; - } - } - } - function ze(e) { + }[h.value] || "var(--mjr-badge-image, #888)"), je = nr("mjrStackService", null), Me = K(() => !je || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), Ne = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Pe = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Fe = K(() => Number(p.asset._mjrDupCount || 0) || 0), Ie = K(() => Pe.value && !Me.value), Le = Q(!1), Re = Q(!1); + async function ze(e) { if (e.preventDefault(), e.stopPropagation(), !Le.value) { Le.value = !0; try { - Ae?.openDupGroup?.(p.asset); + await je?.openStackGroup?.(p.asset); } catch (e) { console.debug?.(e); } finally { @@ -3985,92 +4425,104 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ } } } - let Be = Z(null), Ve = Z(null), He = Z(null), Ue = Z(null), We = Z(!1), Ge = Z(!1), Ke = Z(""), qe = 0, Je = "", Ye = "", Xe = ""; - function Ze() { + function Be(e) { + if (e.preventDefault(), e.stopPropagation(), !Re.value) { + Re.value = !0; + try { + je?.openDupGroup?.(p.asset); + } catch (e) { + console.debug?.(e); + } finally { + Re.value = !1; + } + } + } + let Ve = Q(null), He = Q(null), Ue = Q(null), We = Q(null), Ge = Q(!1), Ke = Q(!1), qe = Q(""), Je = 0, Ye = "", Xe = "", Ze = ""; + function Qe() { try { - Je && vs.releaseUrl(Je); + Ye && Vs.releaseUrl(Ye); } catch (e) { console.debug?.(e); } - Je = ""; + Ye = ""; } - cr(() => g.value ? S.value : _.value ? E.value : "", (e) => { - let t = String(e || "").trim(); - t && t !== Ye && (We.value = !1, Ye = ""); - }, { immediate: !0 }), cr(() => b.value ? k.value : "", (e) => { + or(() => g.value ? S.value : _.value ? E.value : "", (e) => { let t = String(e || "").trim(); t && t !== Xe && (Ge.value = !1, Xe = ""); - }, { immediate: !0 }), cr(() => [_.value ? He.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { - if (!e || !t || We.value) return; - let o = qe += 1, s = new AbortController(), c = !1; + }, { immediate: !0 }), or(() => b.value ? k.value : "", (e) => { + let t = String(e || "").trim(); + t && t !== Ze && (Ke.value = !1, Ze = ""); + }, { immediate: !0 }), or(() => [_.value ? Ue.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { + if (!e || !t || Ge.value) return; + let o = Je += 1, s = new AbortController(), c = !1; r(() => { c = !0, s.abort(); }); try { - let n = Je || String(e.dataset?.mjrSourceKey || ""); - if (Ke.value && n === t || (e.dataset.mjrSourceKey = t, await a(), c || o !== qe || !e.isConnected)) return; + let n = Ye || String(e.dataset?.mjrSourceKey || ""); + if (qe.value && n === t || (e.dataset.mjrSourceKey = t, await a(), c || o !== Je || !e.isConnected)) return; let r = await i(t, { signal: s.signal }); - if (c || o !== qe || !e.isConnected) { - r && r !== t && vs.releaseUrl(t); + if (c || o !== Je || !e.isConnected) { + r && r !== t && Vs.releaseUrl(t); return; } - if (r && r !== Ke.value) { - let e = Je; - Ke.value = r, Je = r === t ? "" : t, e && e !== Je && vs.releaseUrl(e); - } else !r && Je && Je !== t && (Ze(), Ke.value = ""); + if (r && r !== qe.value) { + let e = Ye; + qe.value = r, Ye = r === t ? "" : t, e && e !== Ye && Vs.releaseUrl(e); + } else !r && Ye && Ye !== t && (Qe(), qe.value = ""); } catch {} }, { immediate: !0 }); - let $e = Z(z.GRID_VIDEO_AUTOPLAY_MODE || "hover"); - function et() { - $e.value = z.GRID_VIDEO_AUTOPLAY_MODE || "hover"; + let z = Q(R.GRID_VIDEO_AUTOPLAY_MODE || "hover"); + function $e() { + z.value = R.GRID_VIDEO_AUTOPLAY_MODE || "hover"; } - Ar(() => { - window.addEventListener("mjr-settings-changed", et); - }), cr(Ve, (e, t) => { + Zn(() => { + window.addEventListener("mjr-settings-changed", $e); + }), or(He, (e, t) => { if (t) try { f(t); } catch {} - if (e && Be.value) try { - d(Be.value, e, $e.value); + if (e && Ve.value) try { + d(Ve.value, e, z.value); } catch {} - }), cr($e, (e) => { - let t = Ve.value, n = Be.value; + }), or(z, (e) => { + let t = He.value, n = Ve.value; t && n && d(n, t, e); - }), cr(D, (e, t) => { + }), or(D, (e, t) => { if (e === t) return; - let n = Ve.value, r = Be.value; - n && r && (f(n), d(r, n, $e.value)); - }, { flush: "post" }), pr(() => { - window.removeEventListener("mjr-settings-changed", et), qe += 1, Ze(); - let e = Ve.value; + let n = He.value, r = Ve.value; + n && r && (f(n), d(r, n, z.value)); + }, { flush: "post" }), ar(() => { + window.removeEventListener("mjr-settings-changed", $e), Je += 1, Qe(); + let e = He.value; if (e) try { f(e); } catch {} - }), rr(() => { - window.removeEventListener("mjr-settings-changed", et); - }), wr(() => { - let e = Ue.value; + }), ir(() => { + window.removeEventListener("mjr-settings-changed", $e); + }), sr(() => { + let e = We.value; if (!e) return; let t = p.asset; t?.has_workflow ?? t?.hasWorkflow, t?.has_generation_data ?? t?.hasGenerationData, t?.has_ai_info ?? t?.hasAiInfo ?? t?.ai_indexed, t?.has_ai_auto_tags ?? t?.hasAiAutoTags ?? t?.auto_tags ?? t?.autoTags, t?.has_ai_enhanced_caption ?? t?.hasAiEnhancedCaption ?? t?.enhanced_caption ?? t?.enhancedCaption, t?.has_ai_vector ?? t?.hasAiVector ?? t?.vector_indexed ?? t?.vectorIndexed; try { e.textContent = ""; - let n = Ot(t); + let n = _n(t); n && e.appendChild(n); } catch {} }); - function tt(e) { - We.value = !0; + function et(e) { + Ge.value = !0; try { let e = g.value ? S.value : E.value; - Ye = String(e || "").trim(), vs.markError(e); + Xe = String(e || "").trim(), Vs.markError(e); } catch {} } - function L() { - Ge.value = !0, Xe = String(k.value || "").trim(); + function tt() { + Ke.value = !0, Ze = String(k.value || "").trim(); } - function R(e) { - if (!Oe.value) return; + function nt(e) { + if (!ke.value) return; e.preventDefault(), e.stopPropagation(); let t = e.target?.closest?.(".mjr-asset-card"); t && t.dispatchEvent(new CustomEvent("mjr:badge-duplicates-focus", { @@ -4083,7 +4535,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ } })); } - function nt(e, t) { + function rt(e, t) { try { t?.preventDefault?.(), t?.stopPropagation?.(); } catch (e) { @@ -4096,61 +4548,61 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }); } return (t, n) => { - let r = ar("MButton"); - return K(), Y(V, null, [ + let r = Qn("MButton"); + return q(), Y(V, null, [ H("div", { - class: Q(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), + class: X(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), ref_key: "thumbRef", - ref: Be + ref: Ve }, [ - le.value ? (K(), Y("div", Ts)) : W("", !0), - g.value ? (K(), Y(V, { key: 1 }, [ + ue.value ? (q(), Y("div", Js)) : W("", !0), + g.value ? (q(), Y(V, { key: 1 }, [ H("div", { class: "mjr-workflow-card-actions", - onClick: n[1] ||= mr(() => {}, ["stop"]), - onDblclick: n[2] ||= mr(() => {}, ["stop"]) + onClick: n[1] ||= rr(() => {}, ["stop"]), + onDblclick: n[2] ||= rr(() => {}, ["stop"]) }, [H("button", { type: "button", - class: Q(["mjr-workflow-action-btn", { "is-active": ve.value }]), - title: ve.value ? "Remove favorite" : "Add favorite", - "aria-label": ve.value ? "Remove favorite" : "Add favorite", - onClick: n[0] ||= (e) => nt("favorite", e) - }, [H("i", { class: Q(ve.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, Es)], 32), - k.value && !We.value ? (K(), Y("img", { + class: X(["mjr-workflow-action-btn", { "is-active": ye.value }]), + title: ye.value ? "Remove favorite" : "Add favorite", + "aria-label": ye.value ? "Remove favorite" : "Add favorite", + onClick: n[0] ||= (e) => rt("favorite", e) + }, [H("i", { class: X(ye.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, Ys)], 32), + k.value && !Ge.value ? (q(), Y("img", { key: 0, - class: Q(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), + class: X(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), alt: A.value, decoding: "async", loading: "lazy", src: k.value, - onError: tt - }, null, 42, Ds)) : W("", !0), - H("div", { class: Q(["mjr-workflow-thumb", { - "has-thumbnail": k.value && !We.value, - "has-graph-map": w.value && !We.value + onError: et + }, null, 42, Xs)) : W("", !0), + H("div", { class: X(["mjr-workflow-thumb", { + "has-thumbnail": k.value && !Ge.value, + "has-graph-map": w.value && !Ge.value }]) }, [ n[15] ||= H("i", { class: "pi pi-sitemap" }, null, -1), - H("div", Os, q(me.value || "Workflow"), 1), - H("div", ks, [ - he.value ? (K(), Y("span", As, q(he.value), 1)) : W("", !0), - ge.value ? (K(), Y("span", js, q(ge.value), 1)) : W("", !0), - _e.value ? (K(), Y("span", Ms, q(_e.value) + " nodes", 1)) : W("", !0), - Se.value ? (K(), Y("span", Ns, q(Ce.value), 1)) : W("", !0) + H("div", Zs, J(he.value || "Workflow"), 1), + H("div", Qs, [ + ge.value ? (q(), Y("span", $s, J(ge.value), 1)) : W("", !0), + _e.value ? (q(), Y("span", ec, J(_e.value), 1)) : W("", !0), + ve.value ? (q(), Y("span", tc, J(ve.value) + " nodes", 1)) : W("", !0), + Ce.value ? (q(), Y("span", nc, J(we.value), 1)) : W("", !0) ]) ], 2) - ], 64)) : _.value ? (K(), Y(V, { key: 2 }, [We.value ? W("", !0) : (K(), Y("img", { + ], 64)) : _.value ? (q(), Y(V, { key: 2 }, [Ge.value ? W("", !0) : (q(), Y("img", { key: 0, ref_key: "imgRef", - ref: He, + ref: Ue, class: "mjr-thumb-media", alt: A.value, decoding: "async", loading: "lazy", - src: Ke.value || E.value || void 0, - onError: tt - }, null, 40, Ps)), We.value ? (K(), Y("div", Fs, [...n[16] ||= [H("i", { class: "pi pi-image" }, null, -1)]])) : W("", !0)], 64)) : v.value ? (K(), Y(V, { key: 3 }, [H("video", { + src: qe.value || E.value || void 0, + onError: et + }, null, 40, rc)), Ge.value ? (q(), Y("div", ic, [...n[16] ||= [H("i", { class: "pi pi-image" }, null, -1)]])) : W("", !0)], 64)) : v.value ? (q(), Y(V, { key: 3 }, [H("video", { ref_key: "videoRef", - ref: Ve, + ref: He, class: "mjr-thumb-media", "data-src": D.value, poster: k.value || void 0, @@ -4162,75 +4614,75 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ draggable: !1, tabindex: -1, style: { "pointer-events": "none" } - }, null, 8, Is), n[17] ||= H("div", { class: "mjr-thumb-play" }, [H("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (K(), Y(V, { key: 4 }, [k.value ? (K(), Y("img", { + }, null, 8, ac), n[17] ||= H("div", { class: "mjr-thumb-play" }, [H("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (q(), Y(V, { key: 4 }, [k.value ? (q(), Y("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: "" - }, null, 8, Ls)) : W("", !0), H("div", { class: Q(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ - H("div", Rs, [n[18] ||= H("span", { class: "mjr-audio-thumb-icon" }, [H("i", { class: "pi pi-volume-up" })], -1), H("span", zs, q(M.value || "AUDIO"), 1)]), - H("div", Bs, [(K(!0), Y(V, null, hr(te.value, (e, t) => (K(), Y("span", { + }, null, 8, oc)) : W("", !0), H("div", { class: X(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ + H("div", sc, [n[18] ||= H("span", { class: "mjr-audio-thumb-icon" }, [H("i", { class: "pi pi-volume-up" })], -1), H("span", cc, J(j.value || "AUDIO"), 1)]), + H("div", lc, [(q(!0), Y(V, null, $n(te.value, (e, t) => (q(), Y("span", { key: t, - style: xr({ + style: fr({ height: `${e.height}%`, opacity: e.opacity }) }, null, 4))), 128))]), - H("div", Vs, [H("span", Hs, q(P.value), 1), H("span", Us, q(ne.value), 1)]) - ], 2)], 64)) : b.value ? (K(), Y(V, { key: 5 }, [k.value && !Ge.value ? (K(), Y("img", { + H("div", uc, [H("span", dc, J(ne.value), 1), H("span", fc, J(P.value), 1)]) + ], 2)], 64)) : b.value ? (q(), Y(V, { key: 5 }, [k.value && !Ke.value ? (q(), Y("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: A.value, - onError: L - }, null, 40, Ws)) : (K(), Y("div", Gs, [...n[19] ||= [H("i", { + onError: tt + }, null, 40, pc)) : (q(), Y("div", mc, [...n[19] ||= [H("i", { class: "pi pi-box", style: { "font-size": "2.5rem" } }, null, -1)]]))], 64)) : W("", !0), H("div", { class: "mjr-file-badge mjr-badge-ext", - "data-mjr-ext": M.value, - "data-mjr-badge-bg": ke.value, - style: xr({ + "data-mjr-ext": j.value, + "data-mjr-badge-bg": Ae.value, + style: fr({ position: "absolute", top: "6px", left: "6px", zIndex: 10, - background: ke.value, + background: Ae.value, color: "#fff", padding: "2px 5px", borderRadius: "4px", fontSize: "10px", fontWeight: "700", - pointerEvents: Oe.value ? "auto" : "none", - cursor: Oe.value ? "pointer" : "default" + pointerEvents: ke.value ? "auto" : "none", + cursor: ke.value ? "pointer" : "default" }), - title: Oe.value ? `${M.value} - duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${M.value} file`, - onClick: R - }, q(M.value) + q(Oe.value ? "+" : ""), 13, Ks), - J(bs, { - rating: re.value, + title: ke.value ? `${j.value} - duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${j.value} file`, + onClick: nt + }, J(j.value) + J(ke.value ? "+" : ""), 13, hc), + U(Us, { + rating: F.value, class: "mjr-badge-rating" }, null, 8, ["rating"]), - J(Ss, { - tags: ie.value, + U(Gs, { + tags: I.value, class: "mjr-badge-tags" }, null, 8, ["tags"]), - J(ws, { "gen-time-ms": ae.value }, null, 8, ["gen-time-ms"]), - le.value ? (K(), Y("div", { + U(qs, { "gen-time-ms": ie.value }, null, 8, ["gen-time-ms"]), + ue.value ? (q(), Y("div", { key: 6, class: "mjr-live-pill", - title: de.value + title: fe.value }, [n[20] ||= H("span", { class: "mjr-live-pill-dot", "aria-hidden": "true" - }, null, -1), H("span", null, q(ue.value), 1)], 8, qs)) : W("", !0), - ce.value || g.value && ee.value || I.value ? (K(), Y("div", Js, [ - ce.value ? (K(), Y("div", Ys, q(ce.value), 1)) : W("", !0), - g.value && ee.value ? (K(), Y("div", Xs, q(ee.value), 1)) : W("", !0), - I.value ? (K(), Y("div", Zs, "Time " + q(oe.value.text), 1)) : W("", !0) + }, null, -1), H("span", null, J(de.value), 1)], 8, gc)) : W("", !0), + le.value || g.value && N.value || oe.value ? (q(), Y("div", _c, [ + le.value ? (q(), Y("div", vc, J(le.value), 1)) : W("", !0), + g.value && N.value ? (q(), Y("div", yc, J(N.value), 1)) : W("", !0), + oe.value ? (q(), Y("div", bc, "Time " + J(se.value.text), 1)) : W("", !0) ])) : W("", !0) ], 2), H("div", { @@ -4244,7 +4696,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }, [ H("div", { class: "mjr-card-filename", - title: F.value, + title: re.value, style: { overflow: "hidden", "text-overflow": "ellipsis", @@ -4252,31 +4704,31 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "margin-bottom": "4px", "padding-right": "12px" } - }, q(N.value), 9, $s), - H("div", ec, [g.value ? (K(), Y(V, { key: 0 }, [ - me.value ? (K(), Y("span", { + }, J(M.value), 9, Sc), + H("div", Cc, [g.value ? (q(), Y(V, { key: 0 }, [ + he.value ? (q(), Y("span", { key: 0, class: "mjr-meta-workflow-task", - title: `Task: ${me.value}` - }, q(me.value), 9, tc)) : W("", !0), - ye.value ? (K(), Y("span", { + title: `Task: ${he.value}` + }, J(he.value), 9, wc)) : W("", !0), + be.value ? (q(), Y("span", { key: 1, class: "mjr-meta-workflow-subgraphs", - title: `${ye.value} subgraph${ye.value > 1 ? "s" : ""}` - }, q(ye.value) + " sub", 9, nc)) : W("", !0), - Se.value ? (K(), Y("span", { + title: `${be.value} subgraph${be.value > 1 ? "s" : ""}` + }, J(be.value) + " sub", 9, Tc)) : W("", !0), + Ce.value ? (q(), Y("span", { key: 2, class: "mjr-meta-workflow-missing", - title: Ce.value - }, q(Ce.value), 9, rc)) : W("", !0) - ], 64)) : W("", !0), (K(!0), Y(V, null, hr(De.value, (e, t) => (K(), Y(V, { key: e.key }, [t > 0 ? (K(), Y("span", ic, "/")) : W("", !0), H("span", { - class: Q(e.className), - style: xr(e.style || null), + title: we.value + }, J(we.value), 9, Ec)) : W("", !0) + ], 64)) : W("", !0), (q(!0), Y(V, null, $n(Oe.value, (e, t) => (q(), Y(V, { key: e.key }, [t > 0 ? (q(), Y("span", Dc, "/")) : W("", !0), H("span", { + class: X(e.className), + style: fr(e.style || null), title: e.title - }, q(e.text), 15, ac)], 64))), 128))]), + }, J(e.text), 15, Oc)], 64))), 128))]), H("div", { ref_key: "dotWrapperRef", - ref: Ue, + ref: We, class: "mjr-card-dot-wrapper", style: { position: "absolute", @@ -4285,27 +4737,27 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "z-index": "2" } }, null, 512) - ], 8, Qs), - je.value ? (K(), ir(r, { + ], 8, xc), + Me.value ? (q(), Jn(r, { key: 0, type: "button", class: "mjr-stack-group-button", severity: "secondary", text: "", rounded: "", - disabled: Ie.value, - "aria-busy": Ie.value ? "true" : "false", - "aria-label": `Open generation group in grid (${Me.value} assets)`, - title: `Open generation group in grid (${Me.value} assets)`, - onClick: Re, - onPointerdown: n[3] ||= mr(() => {}, ["stop"]), - onMousedown: n[4] ||= mr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[5] ||= mr(() => {}, ["stop"]), - onDblclick: n[6] ||= mr(() => {}, ["stop"]), - onKeydown: n[7] ||= mr(() => {}, ["stop"]), - onDragstart: n[8] ||= mr(() => {}, ["stop", "prevent"]) + disabled: Le.value, + "aria-busy": Le.value ? "true" : "false", + "aria-label": `Open generation group in grid (${Ne.value} assets)`, + title: `Open generation group in grid (${Ne.value} assets)`, + onClick: ze, + onPointerdown: n[3] ||= rr(() => {}, ["stop"]), + onMousedown: n[4] ||= rr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[5] ||= rr(() => {}, ["stop"]), + onDblclick: n[6] ||= rr(() => {}, ["stop"]), + onKeydown: n[7] ||= rr(() => {}, ["stop"]), + onDragstart: n[8] ||= rr(() => {}, ["stop", "prevent"]) }, { - default: U(() => [n[21] ||= H("span", { class: "pi pi-clone" }, null, -1), H("span", oc, q(Me.value), 1)]), + default: G(() => [n[21] ||= H("span", { class: "pi pi-clone" }, null, -1), H("span", kc, J(Ne.value), 1)]), _: 1 }, 8, [ "disabled", @@ -4313,26 +4765,26 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "aria-label", "title" ])) : W("", !0), - Fe.value ? (K(), ir(r, { + Ie.value ? (q(), Jn(r, { key: 1, type: "button", class: "mjr-dup-stack-button", severity: "secondary", text: "", rounded: "", - disabled: Le.value, - "aria-busy": Le.value ? "true" : "false", - "aria-label": `${Pe.value} duplicate${Pe.value > 1 ? "s" : ""} - click to compare all copies`, - title: `${Pe.value} duplicate${Pe.value > 1 ? "s" : ""} - click to compare all copies`, - onClick: ze, - onPointerdown: n[9] ||= mr(() => {}, ["stop"]), - onMousedown: n[10] ||= mr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[11] ||= mr(() => {}, ["stop"]), - onDblclick: n[12] ||= mr(() => {}, ["stop"]), - onKeydown: n[13] ||= mr(() => {}, ["stop"]), - onDragstart: n[14] ||= mr(() => {}, ["stop", "prevent"]) + disabled: Re.value, + "aria-busy": Re.value ? "true" : "false", + "aria-label": `${Fe.value} duplicate${Fe.value > 1 ? "s" : ""} - click to compare all copies`, + title: `${Fe.value} duplicate${Fe.value > 1 ? "s" : ""} - click to compare all copies`, + onClick: Be, + onPointerdown: n[9] ||= rr(() => {}, ["stop"]), + onMousedown: n[10] ||= rr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[11] ||= rr(() => {}, ["stop"]), + onDblclick: n[12] ||= rr(() => {}, ["stop"]), + onKeydown: n[13] ||= rr(() => {}, ["stop"]), + onDragstart: n[14] ||= rr(() => {}, ["stop", "prevent"]) }, { - default: U(() => [n[22] ||= H("span", { class: "pi pi-copy" }, null, -1), H("span", sc, q(Pe.value), 1)]), + default: G(() => [n[22] ||= H("span", { class: "pi pi-copy" }, null, -1), H("span", Ac, J(Fe.value), 1)]), _: 1 }, 8, [ "disabled", @@ -4343,23 +4795,23 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ ], 64); }; } -}), lc = [ +}), Mc = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-stem", "aria-label", "aria-selected" -], uc = { +], Nc = { class: "mjr-card-info mjr-card-meta", style: { padding: "6px 8px", "min-width": "0" } -}, dc = ["title"], fc = /*#__PURE__*/ ((e, t) => { +}, Pc = ["title"], Fc = /*#__PURE__*/ ((e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -})(/* @__PURE__ */ dr({ +})(/* @__PURE__ */ tr({ __name: "FolderCard", props: { asset: {}, @@ -4367,7 +4819,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }, emits: ["drop-asset"], setup(e, { emit: t }) { - let n = e, r = t, i = Z(!1); + let n = e, r = t, i = Q(!1); function a(e) { e.dataTransfer && (e.dataTransfer.dropEffect = "move"), i.value = !0; } @@ -4388,17 +4840,17 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ folderPath: a }); } - return (t, n) => (K(), Y("div", { - class: Q(["mjr-asset-card mjr-card mjr-folder-card", { + return (t, n) => (q(), Y("div", { + class: X(["mjr-asset-card mjr-card mjr-folder-card", { "is-selected": e.selected, "drop-active": i.value }]), role: "button", tabindex: 0, draggable: "true", - onDragover: mr(a, ["prevent"]), + onDragover: rr(a, ["prevent"]), onDragleave: o, - onDrop: mr(s, ["stop", "prevent"]), + onDrop: rr(s, ["stop", "prevent"]), "data-mjr-asset-id": String(e.asset.id ?? ""), "data-mjr-filename-key": String(e.asset.filename || "").toLowerCase(), "data-mjr-ext": "FOLDER", @@ -4424,7 +4876,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }), H("path", { fill: "#D9A730", d: "M20 6H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2z" - })])], -1), H("div", uc, [H("div", { + })])], -1), H("div", Nc, [H("div", { class: "mjr-card-filename", title: e.asset.filename, style: { @@ -4433,15 +4885,15 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "white-space": "nowrap", "margin-bottom": "4px" } - }, q(e.asset.filename), 9, dc), n[0] ||= H("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, lc)); + }, J(e.asset.filename), 9, Pc), n[0] ||= H("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, Mc)); } }), [["__scopeId", "data-v-252fa951"]]); // ui/vue/composables/useGridState.ts -function pc(e) { +function Ic(e) { return Array.from(e || []).map((e) => String(e || "").trim()).filter(Boolean); } -function mc() { - let e = Sr({ +function Lc() { + let e = ur({ query: "*", offset: 0, cursor: null, @@ -4470,7 +4922,7 @@ function mc() { e.virtualGrid = { setItems(t) { e.assets = Array.isArray(t) ? t.slice() : []; } }; - let t = G(() => new Set(pc(e.selectedIds))); + let t = K(() => new Set(Ic(e.selectedIds))); function n(t = "", { error: n = !1 } = {}) { e.statusMessage = String(t || ""), e.statusError = !!n; } @@ -4490,14 +4942,14 @@ function mc() { e.query = String(t || "*") || "*", e.offset = 0, e.cursor = null, e.total = n == null ? null : Number(n) || 0, e.done = !!r, e.assets = [], o(); } function c(t, n = "", { preserveAnchor: r = !1 } = {}) { - let i = Array.from(new Set(pc(t))), a = String(n || i[0] || "").trim(); + let i = Array.from(new Set(Ic(t))), a = String(n || i[0] || "").trim(); return e.selectedIds = i, e.activeId = a, r || (a ? e.selectionAnchorId = a : i.length || (e.selectionAnchorId = "")), { selectedIds: i, activeId: a }; } function l(t, { activeId: n = "" } = {}) { - let r = new Set(pc(t)), i = pc(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); + let r = new Set(Ic(t)), i = Ic(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); return c(i, r.has(a) ? a : i[0] || "", { preserveAnchor: !0 }); } function u() { @@ -4528,14 +4980,14 @@ function mc() { }; } // ui/vue/composables/gridVisibility.ts -function hc(e) { +function Rc(e) { try { return typeof e?.getClientRects != "function" || e.getClientRects().length > 0; } catch (e) { return console.debug?.(e), !1; } } -function gc(e, { requireClientRect: t = !0 } = {}) { +function zc(e, { requireClientRect: t = !0 } = {}) { if (!e || typeof e != "object") return !1; try { if (typeof document < "u" && document.hidden) return !1; @@ -4560,14 +5012,14 @@ function gc(e, { requireClientRect: t = !0 } = {}) { } catch (e) { console.debug?.(e); } - return !t || hc(e); + return !t || Rc(e); } -function _c(e) { - return gc(e, { requireClientRect: !0 }); +function Bc(e) { + return zc(e, { requireClientRect: !0 }); } -function vc(e, t = null) { +function Vc(e, t = null) { let n = t || e; - if (!_c(n) || e && e !== n && !gc(e, { requireClientRect: !1 })) return !1; + if (!Bc(n) || e && e !== n && !zc(e, { requireClientRect: !1 })) return !1; try { let e = Number(n?.clientWidth || 0) || 0, t = Number(n?.clientHeight || 0) || 0; return e > 0 && t > 0; @@ -4576,50 +5028,50 @@ function vc(e, t = null) { } } // ui/vue/grid/useGridQuery.ts -function yc(e, t = "") { +function Hc(e, t = "") { return String(e ?? t).trim() || String(t); } -function bc(e, t = 0) { +function Uc(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function xc(e) { +function Wc(e) { return e === !0 || e === 1 || String(e || "") === "1"; } -function Sc(e = {}) { - let t = yc(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; +function Gc(e = {}) { + let t = Hc(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; return Object.freeze({ - scope: yc(e.scope, "output").toLowerCase(), + scope: Hc(e.scope, "output").toLowerCase(), q: t, query: t, - customRootId: yc(e.customRootId), - subfolder: yc(e.subfolder), - collectionId: yc(e.collectionId), - viewScope: yc(e.viewScope), - kind: yc(e.kind).toLowerCase(), - workflowOnly: xc(e.workflowOnly), - minRating: bc(e.minRating, 0), - minSizeMB: bc(e.minSizeMB, 0), - maxSizeMB: bc(e.maxSizeMB, 0), + customRootId: Hc(e.customRootId), + subfolder: Hc(e.subfolder), + collectionId: Hc(e.collectionId), + viewScope: Hc(e.viewScope), + kind: Hc(e.kind).toLowerCase(), + workflowOnly: Wc(e.workflowOnly), + minRating: Uc(e.minRating, 0), + minSizeMB: Uc(e.minSizeMB, 0), + maxSizeMB: Uc(e.maxSizeMB, 0), resolutionCompare: r, - minWidth: bc(e.minWidth, 0), - minHeight: bc(e.minHeight, 0), - maxWidth: bc(e.maxWidth, 0), - maxHeight: bc(e.maxHeight, 0), - workflowType: yc(e.workflowType).toUpperCase(), - workflowId: yc(e.workflowId), - workflowModel: yc(e.workflowModel), - workflowRunsOn: yc(e.workflowRunsOn).toLowerCase(), - dateRange: yc(e.dateRange).toLowerCase(), - dateExact: yc(e.dateExact), - metadataSearchMode: yc(e.metadataSearchMode), - sort: yc(e.sort, "mtime_desc").toLowerCase(), - semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : xc(e.semanticMode), - groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : xc(e.groupStacks) + minWidth: Uc(e.minWidth, 0), + minHeight: Uc(e.minHeight, 0), + maxWidth: Uc(e.maxWidth, 0), + maxHeight: Uc(e.maxHeight, 0), + workflowType: Hc(e.workflowType).toUpperCase(), + workflowId: Hc(e.workflowId), + workflowModel: Hc(e.workflowModel), + workflowRunsOn: Hc(e.workflowRunsOn).toLowerCase(), + dateRange: Hc(e.dateRange).toLowerCase(), + dateExact: Hc(e.dateExact), + metadataSearchMode: Hc(e.metadataSearchMode), + sort: Hc(e.sort, "mtime_desc").toLowerCase(), + semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : Wc(e.semanticMode), + groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : Wc(e.groupStacks) }); } -function Cc(e = {}, t = {}) { - return Sc({ +function Kc(e = {}, t = {}) { + return Gc({ scope: e.mjrScope, q: e.mjrQuery, customRootId: e.mjrCustomRootId, @@ -4649,16 +5101,16 @@ function Cc(e = {}, t = {}) { ...t }); } -function wc(e = null, t = "*") { +function qc(e = null, t = "*") { let n = e?.dataset || {}; - return Cc(n, { q: n.mjrQuery ?? t }).q; + return Kc(n, { q: n.mjrQuery ?? t }).q; } -function Tc(e = null, t = "mtime_desc") { +function Jc(e = null, t = "mtime_desc") { let n = e?.dataset || {}; - return Cc(n, { sort: n.mjrSort ?? t }).sort; + return Kc(n, { sort: n.mjrSort ?? t }).sort; } -function Ec(e = {}) { - let t = Sc(e); +function Yc(e = {}) { + let t = Gc(e); return [ t.scope, t.q, @@ -4684,30 +5136,30 @@ function Ec(e = {}) { t.dateExact ].join("|"); } -function Dc(e = {}) { - let t = Sc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; +function Xc(e = {}) { + let t = Gc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; return !!(t.subfolder || t.customRootId || t.collectionId || n || t.kind || t.workflowOnly || t.minRating > 0 || t.minSizeMB > 0 || t.maxSizeMB > 0 || t.minWidth > 0 || t.minHeight > 0 || t.maxWidth > 0 || t.maxHeight > 0 || t.workflowType || t.workflowId || t.workflowModel || t.workflowRunsOn || t.dateRange || t.dateExact); } -function Oc(e = {}) { - let t = Sc(e); - return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Dc(t); +function Zc(e = {}) { + let t = Gc(e); + return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Xc(t); } // ui/features/grid/PersistentAssetCache.ts -var kc = "mjr-asset-cache", Ac = 1, jc = "snapshots", Mc = 24, Nc = 500, Pc = 27e5, Fc = null; -function Ic() { - return Fc || (Fc = new Promise((e) => { +var Qc = "mjr-asset-cache", $c = 1, el = "snapshots", tl = 24, nl = 500, rl = 27e5, il = null; +function al() { + return il || (il = new Promise((e) => { try { - let t = indexedDB.open(kc, Ac); + let t = indexedDB.open(Qc, $c); t.onupgradeneeded = () => { let e = t.result; - e.objectStoreNames.contains(jc) || e.createObjectStore(jc, { keyPath: "key" }); + e.objectStoreNames.contains(el) || e.createObjectStore(el, { keyPath: "key" }); }, t.onsuccess = () => e(t.result), t.onerror = () => e(null); } catch { e(null); } - }), Fc); + }), il); } -function Lc(e) { +function ol(e) { return !e || typeof e != "object" ? null : { id: e.id, filename: e.filename, @@ -4732,39 +5184,39 @@ function Lc(e) { positive_prompt: e.positive_prompt }; } -function Rc(e) { +function sl(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0); - if (!t || Date.now() - t > Pc) return null; - let n = Array.isArray(e.assets) ? e.assets.map(Lc).filter(Boolean) : []; + if (!t || Date.now() - t > rl) return null; + let n = Array.isArray(e.assets) ? e.assets.map(ol).filter(Boolean) : []; return n.length ? { ...e, assets: n } : null; } -async function zc(e) { - let t = await Ic(); +async function cl(e) { + let t = await al(); if (!t) return null; try { - return t.transaction(jc, e).objectStore(jc); + return t.transaction(el, e).objectStore(el); } catch { return null; } } -var Bc = { +var ll = { async get(e) { - let t = await zc("readonly"); + let t = await cl("readonly"); return !t || !e ? null : await new Promise((n) => { let r = t.get(e); - r.onsuccess = () => n(Rc(r.result)), r.onerror = () => n(null); + r.onsuccess = () => n(sl(r.result)), r.onerror = () => n(null); }); }, async put(e, t) { - let n = await zc("readwrite"), r = Rc({ + let n = await cl("readwrite"), r = sl({ ...t, key: e, at: t?.at || Date.now(), - assets: Array.isArray(t?.assets) ? t.assets.slice(0, Nc) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, nl) : [] }); return !n || !e || !r ? !1 : (await new Promise((e) => { let t = n.put(r); @@ -4772,7 +5224,7 @@ var Bc = { }), this.prune(), !0); }, async prune() { - let e = await zc("readwrite"); + let e = await cl("readwrite"); if (!e) return; let t = await new Promise((t) => { let n = [], r = e.openCursor(); @@ -4781,175 +5233,175 @@ var Bc = { if (!e) return t(n); n.push(e.value), e.continue(); }, r.onerror = () => t(n); - }), n = t.filter((e) => !Rc(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - Mc)).map((e) => e.key); + }), n = t.filter((e) => !sl(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - tl)).map((e) => e.key); for (let t of [...n, ...r]) e.delete(t); } -}, Vc = /* @__PURE__ */ new Map(), Hc = !0, Uc = 8, Wc = 200, Gc = "mjr_grid_snapshot_cache_v2", Kc = 18e5, qc = 1500, Jc = !1, Yc = null, Xc = !1; -function Zc() { - return Hc; +}, ul = /* @__PURE__ */ new Map(), dl = !0, fl = 8, pl = 200, ml = "mjr_grid_snapshot_cache_v2", hl = 18e5, gl = 1500, _l = !1, vl = null, yl = !1; +function bl() { + return dl; } -function Qc() { +function xl() { try { - Vc.clear(), il()?.removeItem?.(Gc), globalThis?.sessionStorage?.removeItem?.(Gc); + ul.clear(), Dl()?.removeItem?.(ml), globalThis?.sessionStorage?.removeItem?.(ml); } catch (e) { console.debug?.(e); } } -var $c = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); -function el(e, t = "") { +var Sl = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); +function Cl(e, t = "") { try { return String(e ?? t).trim(); } catch { return String(t); } } -function tl(e = {}) { +function wl(e = {}) { return JSON.stringify({ - scope: el(e.scope || "output", "output"), - query: el(e.query || e.q || "*", "*"), - customRootId: el(e.customRootId || ""), - subfolder: el(e.subfolder || ""), - collectionId: el(e.collectionId || ""), - viewScope: el(e.viewScope || ""), - kind: el(e.kind || ""), - workflowOnly: el(e.workflowOnly ? "1" : ""), - minRating: el(e.minRating || ""), - minSizeMB: el(e.minSizeMB || ""), - maxSizeMB: el(e.maxSizeMB || ""), - resolutionCompare: el(e.resolutionCompare || ""), - minWidth: el(e.minWidth || ""), - minHeight: el(e.minHeight || ""), - maxWidth: el(e.maxWidth || ""), - maxHeight: el(e.maxHeight || ""), - workflowType: el(e.workflowType || "").toUpperCase(), - workflowId: el(e.workflowId || ""), - workflowModel: el(e.workflowModel || ""), - workflowRunsOn: el(e.workflowRunsOn || "").toLowerCase(), - dateRange: el(e.dateRange || ""), - dateExact: el(e.dateExact || ""), - sort: el(e.sort || "mtime_desc", "mtime_desc"), - semanticMode: el(e.semanticMode ? "1" : "") + scope: Cl(e.scope || "output", "output"), + query: Cl(e.query || e.q || "*", "*"), + customRootId: Cl(e.customRootId || ""), + subfolder: Cl(e.subfolder || ""), + collectionId: Cl(e.collectionId || ""), + viewScope: Cl(e.viewScope || ""), + kind: Cl(e.kind || ""), + workflowOnly: Cl(e.workflowOnly ? "1" : ""), + minRating: Cl(e.minRating || ""), + minSizeMB: Cl(e.minSizeMB || ""), + maxSizeMB: Cl(e.maxSizeMB || ""), + resolutionCompare: Cl(e.resolutionCompare || ""), + minWidth: Cl(e.minWidth || ""), + minHeight: Cl(e.minHeight || ""), + maxWidth: Cl(e.maxWidth || ""), + maxHeight: Cl(e.maxHeight || ""), + workflowType: Cl(e.workflowType || "").toUpperCase(), + workflowId: Cl(e.workflowId || ""), + workflowModel: Cl(e.workflowModel || ""), + workflowRunsOn: Cl(e.workflowRunsOn || "").toLowerCase(), + dateRange: Cl(e.dateRange || ""), + dateExact: Cl(e.dateExact || ""), + sort: Cl(e.sort || "mtime_desc", "mtime_desc"), + semanticMode: Cl(e.semanticMode ? "1" : "") }); } -function nl(e) { +function Tl(e) { if (!e || typeof e != "object") return null; let t = {}; - for (let n of $c) e[n] !== void 0 && (t[n] = e[n]); + for (let n of Sl) e[n] !== void 0 && (t[n] = e[n]); return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= e.kind || "image", Array.isArray(t.tags) && (t.tags = t.tags.slice(0, 80)), Array.isArray(t.auto_tags) && (t.auto_tags = t.auto_tags.slice(0, 80)), t; } -function rl(e) { +function El(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0) || 0; - if (!t || Date.now() - t > Kc) return null; - let n = Array.isArray(e.assets) ? e.assets.map(nl).filter(Boolean) : []; + if (!t || Date.now() - t > hl) return null; + let n = Array.isArray(e.assets) ? e.assets.map(Tl).filter(Boolean) : []; if (!n.length) return null; let r = Number(e.total ?? n.length), i = Number(e.offset ?? n.length); return { assets: n, - title: el(e.title || "Cached", "Cached"), + title: Cl(e.title || "Cached", "Cached"), at: t, total: Number.isFinite(r) ? Math.max(0, r) : n.length, offset: Number.isFinite(i) ? Math.max(n.length, i) : n.length, done: !!e.done, - query: el(e.query || "*", "*") + query: Cl(e.query || "*", "*") }; } -function il() { +function Dl() { try { return globalThis?.localStorage || null; } catch { return null; } } -Zc() || Qc(); -function al(e) { +bl() || xl(); +function Ol(e) { try { let t = globalThis?.sessionStorage; if (!t || !e) return; - let n = t.getItem?.(Gc); + let n = t.getItem?.(ml); if (!n) return; - e.getItem?.(Gc) || e.setItem(Gc, n), t.removeItem(Gc); + e.getItem?.(ml) || e.setItem(ml, n), t.removeItem(ml); } catch (e) { console.debug?.(e); } } -function ol() { +function kl() { let e = Date.now(); - for (let [t, n] of Vc.entries()) { + for (let [t, n] of ul.entries()) { let r = Number(n?.at || 0) || 0; - (!r || e - r > Kc) && Vc.delete(t); + (!r || e - r > hl) && ul.delete(t); } - for (; Vc.size > Uc;) { - let e = Vc.keys().next().value; + for (; ul.size > fl;) { + let e = ul.keys().next().value; if (!e) break; - Vc.delete(e); + ul.delete(e); } } -function sl() { - if (!Zc()) Jc = !0, Qc(); - else if (!Jc) { - Jc = !0; +function Al() { + if (!bl()) _l = !0, xl(); + else if (!_l) { + _l = !0; try { - let e = il(); - al(e); - let t = e?.getItem?.(Gc); + let e = Dl(); + Ol(e); + let t = e?.getItem?.(ml); if (!t) return; let n = JSON.parse(t), r = Array.isArray(n?.entries) ? n.entries : []; for (let e of r) { if (!Array.isArray(e) || e.length < 2) continue; - let t = String(e[0] || ""), n = rl(e[1]); - t && n && Vc.set(t, n); + let t = String(e[0] || ""), n = El(e[1]); + t && n && ul.set(t, n); } - ol(); + kl(); } catch (e) { console.debug?.(e); } } } -function cl() { - if (!Zc()) Qc(); +function jl() { + if (!bl()) xl(); else try { - ol(); - let e = il(); + kl(); + let e = Dl(); if (!e) return; - let t = Array.from(Vc.entries()).map(([e, t]) => [e, { + let t = Array.from(ul.entries()).map(([e, t]) => [e, { ...t, - assets: Array.isArray(t?.assets) ? t.assets.slice(0, Wc) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, pl) : [] }]); - e.setItem(Gc, JSON.stringify({ entries: t })); + e.setItem(ml, JSON.stringify({ entries: t })); } catch (e) { console.debug?.(e); } } -function ll() { - Zc() ? (Xc = !0, !Yc && (Yc = setTimeout(() => { - Yc = null, Xc && (Xc = !1, cl()); - }, qc))) : (Qc(), Xc = !1); +function Ml() { + bl() ? (yl = !0, !vl && (vl = setTimeout(() => { + vl = null, yl && (yl = !1, jl()); + }, gl))) : (xl(), yl = !1); } -function ul() { - Yc &&= (clearTimeout(Yc), null), Xc && (Xc = !1, cl()); +function Nl() { + vl &&= (clearTimeout(vl), null), yl && (yl = !1, jl()); } -function dl(e) { - if (!Zc()) return null; - sl(); - let t = rl(Vc.get(e)); - return t ? (Vc.delete(e), Vc.set(e, t), ll(), t) : (Vc.delete(e), ll(), null); +function Pl(e) { + if (!bl()) return null; + Al(); + let t = El(ul.get(e)); + return t ? (ul.delete(e), ul.set(e, t), Ml(), t) : (ul.delete(e), Ml(), null); } -function fl(e) { - return Zc() ? (sl(), !!rl(Vc.get(e))) : !1; +function Fl(e) { + return bl() ? (Al(), !!El(ul.get(e))) : !1; } -function pl(e, t) { - if (!Zc() || !e || !t || typeof t != "object") return !1; - let n = rl({ +function Il(e, t) { + if (!bl() || !e || !t || typeof t != "object") return !1; + let n = El({ ...t, at: t.at || Date.now() }); - return n ? (Vc.delete(e), Vc.set(e, n), ll(), Bc.put(String(e || ""), n).catch((e) => { + return n ? (ul.delete(e), ul.set(e, n), Ml(), ll.put(String(e || ""), n).catch((e) => { console.debug?.(e); }), !0) : !1; } // ui/vue/grid/useAssetCollection.ts -function ml(e) { +function Ll(e) { return !e || typeof e != "object" ? "" : [ e.source || e.type || "output", e.root_id || e.custom_root_id || "", @@ -4957,7 +5409,7 @@ function ml(e) { e.filename || e.filepath || e.path || e.fullpath || e.full_path || "" ].join("|").trim().toLowerCase(); } -function hl(e = [], { assetKey: t = ml } = {}) { +function Rl(e = [], { assetKey: t = Ll } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(); for (let i of Array.isArray(e) ? e : []) { if (!i || typeof i != "object") continue; @@ -4969,12 +5421,12 @@ function hl(e = [], { assetKey: t = ml } = {}) { byKey: r }; } -function gl(e, { assetKey: t = ml } = {}) { +function zl(e, { assetKey: t = Ll } = {}) { if (!e || typeof e != "object") return e; - let n = hl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); + let n = Rl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); return e.assetIdSet = new Set(n.byId.keys()), e.seenKeys = new Set(n.byKey.keys()), e; } -function _l(e, t = [], { assetKey: n = ml } = {}) { +function Bl(e, t = [], { assetKey: n = Ll } = {}) { if (!e || typeof e != "object") return 0; let r = new Set((Array.isArray(t) ? t : [t]).map((e) => e == null ? "" : typeof e == "object" && e?.id != null ? String(e.id) : String(e)).map((e) => e.trim()).filter(Boolean)); if (!r.size) return 0; @@ -4982,10 +5434,10 @@ function _l(e, t = [], { assetKey: n = ml } = {}) { return e.assets = (Array.isArray(e.assets) ? e.assets : []).filter((e) => { let t = e?.id == null ? "" : String(e.id); return !t || !r.has(t) || (i += 1, !1); - }), i > 0 && gl(e, { assetKey: n }), i; + }), i > 0 && zl(e, { assetKey: n }), i; } // ui/vue/grid/usePagedAssets.ts -function vl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { +function Vl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { let a = Array.isArray(e) ? e.length : 0, o = t == null ? a : Math.max(0, Number(t) || 0); if (o <= 0) return 0; let s = Math.max(0, Number(n) || 0), c = Math.max(0, Number(r) || 0), l = i == null ? null : Math.max(0, Number(i) || 0), u = l == null ? null : Math.max(0, l - c); @@ -4994,7 +5446,7 @@ function vl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, tota let d = Math.min(s, u ?? 0); return d <= 0 ? o : Math.max(o, d); } -async function yl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { +async function Hl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { if (typeof e != "function" || typeof t != "function") return { ok: !1, error: /* @__PURE__ */ Error("fetchPage and applyPage are required") @@ -5050,8 +5502,8 @@ async function yl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = nu lastResult: l }; } -function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { - let a = Cr({ +function Ul({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { + let a = hr({ offset: 0, cursor: null, total: null, @@ -5059,7 +5511,7 @@ function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi error: null, done: !1, requestId: 0 - }), o = G(() => t?.items?.value || []), s = G(() => !a.loading && !a.done); + }), o = K(() => t?.items?.value || []), s = K(() => !a.loading && !a.done); function c() { return e && typeof e == "object" && "value" in e ? e.value : e; } @@ -5081,7 +5533,7 @@ function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi }; } function f(e, { limit: n = l() } = {}) { - let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = vl({ + let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = Vl({ assets: r, count: e?.count, limit: Number(e?.limit || n) || n, @@ -5146,7 +5598,7 @@ function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi let u = a.requestId; a.loading = !0, a.error = null; try { - let n = await yl({ + let n = await Hl({ maxEmptyPages: o, canContinue: t, getLimit: e, @@ -5206,12 +5658,12 @@ function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi }; } // ui/vue/composables/useVirtualGrid.ts -function xl(e, t) { +function Wl(e, t) { if (!t || typeof t != "object") return !1; - let n = Cc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; + let n = Kc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; return !(r && r !== "all" && f && f !== r || i && d !== i || a && p && p !== a || o && _ !== null && !_ || s > 0 && (Number(t?.rating || 0) || 0) < s || c && m !== c || l && h && h !== l || u && g && g !== u); } -async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { +async function Gl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { let c = (e) => { if (typeof e == "string") return e; if (e && typeof e == "object") { @@ -5219,13 +5671,13 @@ async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s if (typeof e.target?.value == "string") return e.target.value; } return String(e || ""); - }, l = Cc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", j = c(t).trim() || "*", M = /^\[object\s+HTML.*Element\]$/i.test(j) ? "*" : j, N = i.sanitizeQuery(M) || M; + }, l = Kc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", ee = c(t).trim() || "*", j = /^\[object\s+HTML.*Element\]$/i.test(ee) ? "*" : ee, M = i.sanitizeQuery(j) || j; try { - let t = String(u || "").toLowerCase() === "output", c = Dc({ + let t = String(u || "").toLowerCase() === "output", c = Xc({ ...l, - q: N - }), j = t && Number(r ?? 0) === 0 && N === "*" && !c && String(A || "mtime_desc").toLowerCase() === "mtime_desc", M = !(t && (Number(r ?? 0) > 0 || j)), ee = !!l.groupStacks, te = Number(r ?? 0) > 0 ? null : s || null, P = i.buildListURL({ - q: N, + q: M + }), ee = t && Number(r ?? 0) === 0 && M === "*" && !c && String(A || "mtime_desc").toLowerCase() === "mtime_desc", j = !(t && (Number(r ?? 0) > 0 || ee)), N = !!l.groupStacks, te = Number(r ?? 0) > 0 ? null : s || null, ne = i.buildListURL({ + q: M, limit: n, offset: r, scope: u, @@ -5249,10 +5701,10 @@ async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s dateExact: O || null, sort: A, cursor: te, - includeTotal: M, - groupStacks: ee, + includeTotal: j, + groupStacks: N, metadataMode: k || null - }), ne = await i.get(P, { + }), P = await i.get(ne, { timeoutMs: 12e4, ...o ? { signal: o } : {} }); @@ -5266,23 +5718,23 @@ async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s } catch (e) { console.debug?.(e); } - if (ne.ok) { - let e = ne.data?.assets || [], t = Array.isArray(e) ? e.length : 0, n = ne.data?.total; + if (P.ok) { + let e = P.data?.assets || [], t = Array.isArray(e) ? e.length : 0, n = P.data?.total; return { ok: !0, assets: e, total: n == null ? null : Number(n ?? 0) || 0, count: t, - limit: Math.max(0, Number(ne.data?.limit) || 0), - offset: Math.max(0, Number(ne.data?.offset) || 0), - nextCursor: ne.data?.next_cursor || ne.data?.nextCursor || null, - hasMore: typeof ne.data?.has_more == "boolean" ? ne.data.has_more : null, + limit: Math.max(0, Number(P.data?.limit) || 0), + offset: Math.max(0, Number(P.data?.offset) || 0), + nextCursor: P.data?.next_cursor || P.data?.nextCursor || null, + hasMore: typeof P.data?.has_more == "boolean" ? P.data.has_more : null, sortKey: A, - safeQuery: N + safeQuery: M }; } try { - if (String(ne?.code || "") === "ABORTED") return { + if (String(P?.code || "") === "ABORTED") return { ok: !1, aborted: !0, error: "Aborted" @@ -5292,7 +5744,7 @@ async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s } return { ok: !1, - error: ne.error + error: P.error }; } catch (e) { try { @@ -5310,7 +5762,7 @@ async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s }; } } -function Cl(e, t) { +function Kl(e, t) { switch (t) { case "mtime_desc": return -(Number(e?.mtime) || 0); case "mtime_asc": return Number(e?.mtime) || 0; @@ -5319,23 +5771,23 @@ function Cl(e, t) { default: return -(Number(e?.mtime) || 0); } } -function wl(e, t, n) { +function ql(e, t, n) { if (n === "name_desc") { let n = String(e?.filename || "").toLowerCase(), r = String(t?.filename || "").toLowerCase(); return n > r ? -1 : +(n < r); } - let r = Cl(e, n), i = Cl(t, n); + let r = Kl(e, n), i = Kl(t, n); return r < i ? -1 : +(r > i); } -function Tl(e, t, n) { +function Jl(e, t, n) { return n === "name_asc" ? String(e) < String(t) : n === "name_desc" ? String(e) > String(t) : Number(e) < Number(t); } -function El(e, t, n) { - let r = Cl(t, n); - for (let t = 0; t < e.length; t++) if (Tl(r, Cl(e[t], n), n)) return t; +function Yl(e, t, n) { + let r = Kl(t, n); + for (let t = 0; t < e.length; t++) if (Jl(r, Kl(e[t], n), n)) return t; return e.length; } -function Dl(e, t) { +function Xl(e, t) { let n = t.get(e); return n || (n = { pending: /* @__PURE__ */ new Map(), @@ -5343,13 +5795,13 @@ function Dl(e, t) { flushing: !1 }, t.set(e, n)), n; } -function Ol(e) { +function Zl(e) { return String(e ?? "").trim().toLowerCase(); } -function kl(e) { +function Ql(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function Al(e) { +function $l(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -5358,24 +5810,24 @@ function Al(e) { } return e; } -function jl(e) { +function eu(e) { if (!e || typeof e != "object") return ""; - let t = Ol(e?.type || e?.source || "output"), n = Ol(e?.root_id || e?.custom_root_id || ""), r = Ol(e?.subfolder || ""), i = Ol(e?.filename || ""); + let t = Zl(e?.type || e?.source || "output"), n = Zl(e?.root_id || e?.custom_root_id || ""), r = Zl(e?.subfolder || ""), i = Zl(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = Ol(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = Zl(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function Ml(e, t, n) { +function tu(e, t, n) { let r = Array.isArray(e?.assets) ? e.assets : []; if (t) { let e = r.findIndex((e) => String(e?.id || "") === t); if (e > -1) return e; } - let i = jl(n); - return i ? r.findIndex((e) => jl(e) === i) : -1; + let i = eu(n); + return i ? r.findIndex((e) => eu(e) === i) : -1; } -function Nl(e, t) { - return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : kl(t) ? !0 : ![ +function nu(e, t) { + return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : Ql(t) ? !0 : ![ "filename", "filepath", "path", @@ -5394,25 +5846,15 @@ function Nl(e, t) { "date" ].some((t) => Object.prototype.hasOwnProperty.call(e, t)); } -function Pl(e, t) { - let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Map(), a = []; +function ru(e, t) { + let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = [], a = !1; for (let o of Array.isArray(e?.assets) ? e.assets : []) { - let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = Mt(o?.filename); - if (!(e && n.has(e)) && !(s && r.has(s))) { - if (c) { - let e = i.get(c); - if (e) { - let t = Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e], n = new Set(t.map((e) => String(e?.id || ""))), r = [...t, ...[o].filter((e) => !n.has(String(e?.id || "")))]; - e._mjrDupStack = !0, e._mjrDupMembers = r, e._mjrDupCount = r.length, e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, o._mjrDupStack = !1, o._mjrDupMembers = null, o._mjrDupCount = 0; - continue; - } - } - e && n.add(e), s && r.add(s), c && i.set(c, o), o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, a.push(o); - } + let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o); + e && n.has(e) || s && r.has(s) ? a = !0 : (e && n.add(e), s && r.add(s), i.push(o)); } - e.assets = a, gl(e, { assetKey: t.assetKey }); + a && (e.assets = i), zl(e, { assetKey: t.assetKey }); } -function Fl(e, t) { +function iu(e, t) { let n = t.upsertState.get(e); if (!n || n.pending.size === 0 || n.flushing) return; n.flushing = !0, n.timer &&= (clearTimeout(n.timer), null); @@ -5422,14 +5864,14 @@ function Fl(e, t) { try { let n = !1; for (let [a, o] of r.entries()) { - let r = kl(o); + let r = Ql(o); i.assetKeyFn = t.assetKey; - let s = wt(o, i, t.loadMajoorSettings); + let s = ki(o, i, t.loadMajoorSettings); if (Array.isArray(s?.removed) && s.removed.length) { let e = new Set(s.removed); i.assets = i.assets.filter((t) => { let n = !e.has(t); - return n || Ft(i, t, i), n; + return n || Di(i, t, i), n; }); try { i.hiddenPngSiblings = (Number(i.hiddenPngSiblings || 0) || 0) + s.removed.length; @@ -5449,31 +5891,31 @@ function Fl(e, t) { let c = i.assets.findIndex((e) => String(e.id) === a), l = c > -1 ? i.assets[c] : null, u = l ? { ...l, ...o - } : o, d = c > -1 ? c : Ml(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { + } : o, d = c > -1 ? c : tu(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { ...f, ...o } : u, m = t.assetKey(u); - if (!xl(e, p)) { + if (!Wl(e, p)) { if (d > -1) { - if (Nl(o, f)) { - Object.assign(f, o), r || Al(f), i.assets[d] = { ...f }, n = !0; + if (nu(o, f)) { + Object.assign(f, o), r || $l(f), i.assets[d] = { ...f }, n = !0; continue; } let [e] = i.assets.splice(d, 1); - Ft(i, e, i), n = !0; + Di(i, e, i), n = !0; } } else if (d > -1) { let e = t.assetKey(f); - Object.assign(f, o), r || Al(f); + Object.assign(f, o), r || $l(f); let a = { ...f }, s = t.assetKey(a); i.assets[d] = a, e && e !== s && (i.seenKeys?.delete?.(e), s && i.seenKeys?.add?.(s)), n = !0; } else if (!(i.seenKeys.has(m) || o.id != null && i.assetIdSet?.has?.(a))) { - let t = Cc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Al({ ...u }), c = El(i.assets, s, t); + let t = Kc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : $l({ ...u }), c = Yl(i.assets, s, t); i.seenKeys.add(m), o.id != null && i.assetIdSet?.add?.(a), i.assets.splice(c, 0, s), n = !0; } } if (n && a) { - Pl(i, t); + ru(i, t); try { e.dataset.mjrHiddenPngSiblings = String(Number(i.hiddenPngSiblings || 0) || 0); } catch (e) { @@ -5485,22 +5927,22 @@ function Fl(e, t) { if (n.flushing = !1, n.pending.size > 0 && !n.timer) { let r = Math.min(16, t.debounceMs); n.timer = setTimeout(() => { - n.timer = null, Fl(e, t); + n.timer = null, iu(e, t); }, r); } } } -function Il(e, t, n) { +function au(e, t, n) { if (!t || !t.id) return !1; let r = n.getOrCreateState(e), i = String(t.id); if (!n.ensureVirtualGrid(e, r)) return !1; - let a = Dl(e, n.upsertState); - return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Fl(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { - a.timer = null, Fl(e, n); + let a = Xl(e, n.upsertState); + return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? iu(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { + a.timer = null, iu(e, n); }, n.debounceMs)), !0; } // ui/vue/components/grid/gridDomBridge.ts -function Ll(e) { +function ou(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -5509,7 +5951,7 @@ function Ll(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Rl(e) { +function su(e) { if (!e) return []; try { return Array.from(e.querySelectorAll?.(".mjr-asset-card") || []); @@ -5517,7 +5959,7 @@ function Rl(e) { return console.debug?.(e), []; } } -function zl(e) { +function cu(e) { if (!e) return null; try { return e.querySelector?.(".mjr-asset-card.is-selected") || null; @@ -5525,46 +5967,46 @@ function zl(e) { return console.debug?.(e), null; } } -function Bl(e, t) { +function lu(e, t) { if (!e) return null; let n = String(t || "").trim(); if (!n) return null; try { - return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ll(n)}"]`) || null; + return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${ou(n)}"]`) || null; } catch (e) { return console.debug?.(e), null; } } -function Vl(e, t = 0) { +function uu(e, t = 0) { let n = e?.dataset?.mjrShown, r = Number(n); return Number.isFinite(r) ? Math.max(0, r) : Math.max(0, Number(t) || 0); } // ui/vue/composables/useGridLoader.ts -var Hl = 200, Ul = 50, Wl = /* @__PURE__ */ new WeakMap(), Gl = /* @__PURE__ */ new Set([ +var du = 200, fu = 50, pu = /* @__PURE__ */ new WeakMap(), mu = /* @__PURE__ */ new Set([ "collection", "filter", "initial", "scope", "search", "sort" -]), Kl = 0; -function ql(e) { +]), hu = 0; +function gu(e) { return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0))); } -function Jl(e) { +function _u(e) { if (!e || typeof e != "object") return ""; if (e.id != null && String(e.id).trim()) return `id:${String(e.id).trim()}`; - let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(Pe(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); + let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(be(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); if (i) return `${t}|${n}|${r}|${i}`; let a = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(); return a ? `${t}|${n}|path|${a}` : ""; } -function Yl(e) { +function vu(e) { if (e == null) return e; let t = String(e); return t.trim() === "" ? t : t.trim() === "*" ? "*" : t.replace(/[\u0000-\u001f\u007f]+/g, " ").replace(/[<>]/g, " ").replace(/\s+/g, " ").trim() || t; } -function Xl(e) { +function yu(e) { if (typeof e == "string") return e; if (e && typeof e == "object") { if (typeof e.value == "string") return e.value; @@ -5580,13 +6022,13 @@ function Xl(e) { } return String(e || ""); } -function Zl(e) { +function bu(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } -async function Ql() { - await lr(); +async function xu() { + await qn(); } -function $l(e, t) { +function Su(e, t) { let n = String(e || "Failed to load"); try { let e = String(t?.message || t || "").trim(), r = e.toLowerCase(); @@ -5595,13 +6037,13 @@ function $l(e, t) { return n; } } -function eu(e, t) { - let n = Math.max(1, Math.min(z.MAX_PAGE_SIZE, Number(e) || 1)), r = Math.max(0, Number(t) || 0); +function Cu(e, t) { + let n = Math.max(1, Math.min(R.MAX_PAGE_SIZE, Number(e) || 1)), r = Math.max(0, Number(t) || 0); if (r <= 0) return n; let i = 2 ** Math.min(r, 5); - return Math.max(1, Math.min(z.MAX_PAGE_SIZE, n * i)); + return Math.max(1, Math.min(R.MAX_PAGE_SIZE, n * i)); } -function tu() { +function wu() { try { let e = typeof navigator < "u" ? navigator : null, t = Number(e?.deviceMemory || 0) || 0; if (t > 0 && t <= 4 || e?.connection?.saveData === !0) return !0; @@ -5610,20 +6052,20 @@ function tu() { } return !1; } -function nu() { - return z.PREFETCH_NEXT_PAGE ? !tu() : !1; +function Tu() { + return R.PREFETCH_NEXT_PAGE ? !wu() : !1; } -function ru(e, t = {}) { +function Eu(e, t = {}) { let n = Array.isArray(e.assets) ? e.assets : []; - t.rebuildFromVisible && n.length ? vt(e, n, { + t.rebuildFromVisible && n.length ? Ei(e, n, { assetKey: t.assetKey || e.assetKeyFn, preserveHiddenCount: !!t.preserveHiddenCount - }) : vt(e, [], { + }) : Ei(e, [], { assetKey: t.assetKey || e.assetKeyFn, preserveHiddenCount: !1 }); } -function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { +function Du({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { let p = !1, m = null, h = null, g = { pagesRequested: 0, assetsReceived: 0, @@ -5650,7 +6092,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM g.lastOperation = String(e || ""), t.reloadReason && (g.lastReloadReason = String(t.reloadReason || "")), t.appendReason && (g.lastAppendReason = String(t.appendReason || "")); } function y() { - return Zl(e); + return bu(e); } function b() { return C(); @@ -5686,7 +6128,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM ...e, counts: { loaded: e.assets.length, - visible: Vl(y(), e.assets.length), + visible: uu(y(), e.assets.length), total: e.pagination.total }, metrics: { ...g } @@ -5694,8 +6136,8 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function C() { let e = y(); - return Cc(e?.dataset || {}, { - q: wc(e, t.query || "*"), + return Kc(e?.dataset || {}, { + q: qc(e, t.query || "*"), resolutionCompare: e?.dataset?.mjrFilterResolutionCompare || "" }); } @@ -5733,7 +6175,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; } function D(e) { - return Gl.has(String(e || "").toLowerCase()); + return mu.has(String(e || "").toLowerCase()); } function O(e = null) { try { @@ -5751,10 +6193,10 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return vc(y(), l()); + return Vc(y(), l()); } - function j() { - if (!z.DEFER_GRID_FETCH_DURING_EXECUTION) return !1; + function ee() { + if (!R.DEFER_GRID_FETCH_DURING_EXECUTION) return !1; try { if (!Array.isArray(t.assets) || t.assets.length === 0) return !1; } catch (e) { @@ -5766,7 +6208,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM return console.debug?.(e), !1; } } - function M() { + function j() { try { m?.timer && clearTimeout(m.timer); } catch (e) { @@ -5779,7 +6221,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } m = null; } - function N() { + function M() { try { h && clearTimeout(h); } catch (e) { @@ -5787,26 +6229,26 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } h = null; } - function ee(e, n = z.PREFETCH_NEXT_PAGE_DELAY_MS) { - if (!nu()) return; - N(); + function N(e, n = R.PREFETCH_NEXT_PAGE_DELAY_MS) { + if (!Tu()) return; + M(); let r = Math.max(0, Number(n) || 0); h = setTimeout(() => { - h = null, !(t.requestId !== e || t.done || t.loading) && he().catch((e) => { + h = null, !(t.requestId !== e || t.done || t.loading) && me().catch((e) => { console.debug?.("[AssetsManager][GridLoader] Delayed prefetch failed", e); }); }, r); } function te(e, t = {}) { - M(); + j(); let n = (() => { try { - return tl(C()); + return wl(C()); } catch (e) { return console.debug?.(e), null; } })(), r = () => { - if (j()) { + if (ee()) { try { m = { ...m, @@ -5817,22 +6259,22 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } return; } - M(); + j(); let i = y(); if (n) { let e = null; try { - e = tl(C()); + e = wl(C()); } catch (e) { console.debug?.(e); } if (e && e !== n) { - Te("[Grid] Deferred execution reload skipped - scope/filter changed during execution"); + ft("[Grid] Deferred execution reload skipped - scope/filter changed during execution"); return; } } - let a = wc(i, e); - Promise.resolve().then(() => ve(a, { + let a = qc(i, e); + Promise.resolve().then(() => _e(a, { ...t || {}, reset: !0, preserveVisibleUntilReady: !0 @@ -5850,36 +6292,36 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(e); } } - function P(e, t = null) { + function ne(e, t = null) { if (!e || typeof e != "object") return ""; - let n = e.id == null ? `${e.type || ""}|${Pe(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; + let n = e.id == null ? `${e.type || ""}|${be(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; try { - return Xa(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); + return bo(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); } catch (e) { return console.debug?.(e), n; } } - function ne() { + function P() { try { - let e = Xt?.() || {}, t = e.grid || {}; + let e = Mt?.() || {}, t = e.grid || {}; return t.snapshotCacheEnabled === !0 || t.enableSnapshotCache === !0 || e.snapshotCacheEnabled === !0 || e.enableSnapshotCache === !0; } catch (e) { return console.debug?.(e), !1; } } - function F(e = "") { + function re(e = "") { try { - if (!ne()) return; + if (!P()) return; let n = y(), r = Array.isArray(t.assets) ? t.assets : []; if (!n || !r.length) return; - let i = r.map(nl).filter(Boolean); + let i = r.map(Tl).filter(Boolean); if (!i.length) return; - let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = Cc(n.dataset || {}, { - q: wc(n, t.query || "*"), + let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = Kc(n.dataset || {}, { + q: qc(n, t.query || "*"), resolutionCompare: n.dataset?.mjrFilterResolutionCompare || "" - }), l = tl(c); + }), l = wl(c); if (!l) return; - pl(l, { + Il(l, { assets: i, title: String(e || "").trim(), query: String(t.query || c.query || "*").trim() || "*", @@ -5891,42 +6333,42 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(e); } } - function re() { + function F() { let e = y(); if (e) try { - let t = Wl.get(e); + let t = pu.get(e); if (!t) return; t.timer &&= (clearTimeout(t.timer), null), t.pending.clear(), t.flushing = !1; } catch (e) { console.debug?.(e); } } - function ie(e, n) { - let r = _(), i = Array.isArray(n) ? n.length : 0, o = Dt(e, n, t, { - loadMajoorSettings: Xt, + function I(e, n) { + let r = _(), i = Array.isArray(n) ? n.length : 0, o = Ai(e, n, t, { + loadMajoorSettings: Mt, clearGridMessage: () => { a(); }, ensureVirtualGrid: () => t.virtualGrid, - setFileBadgeCollision: Tt, - assetKey: (t) => P(t, e), - ensureDupStackCard: (e, t, n) => Qa(e, t, n) + setFileBadgeCollision: an, + assetKey: (t) => ne(t, e), + ensureDupStackCard: (e, t, n) => So(e, t, n) }); return g.renderTimeMs += Math.max(0, _() - r), g.assetsReceived += i, g.visibleAssetsAdded += Number(o || 0) || 0, g.hiddenOrDedupedAssets += Math.max(0, i - (Number(o || 0) || 0)), o; } - function ae(e, t) { + function ie(e, t) { let n = String(t || "*").trim() || "*"; - return Ec(Cc(e?.dataset || {}, { q: n })); + return Yc(Kc(e?.dataset || {}, { q: n })); } - function I(e) { - let t = C(), n = Yl(Xl(e).trim() || "*") || "*"; - return Oc({ + function ae(e) { + let t = C(), n = vu(yu(e).trim() || "*") || "*"; + return Zc({ ...t, q: n }); } function oe(e, { query: t = "*", limit: n = 0, offset: r = 0 } = {}) { - if (!e?.ok || e.total == null || !I(t)) return e; + if (!e?.ok || e.total == null || !ae(t)) return e; let i = Number(e.total), a = Number(e.count ?? e.assets?.length ?? 0) || 0, o = Math.max(1, Number(n) || 1), s = Math.max(0, Number(r) || 0) + a; return Number.isFinite(i) && i > 0 && i <= s && a > 0 && a < o ? { ...e, @@ -5940,9 +6382,9 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM error: "Grid unavailable" }; if (r === 0) { - let s = ae(o, e), c = Ir(); + let s = ie(o, e), c = Er(); if (c && c === s) { - let o = Fr(s); + let o = Tr(s); if (o) try { let s = await o; if (Number(t.requestId) !== Number(i)) return { @@ -5957,7 +6399,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; let c = s?.data?.assets; if (s?.ok && Array.isArray(c)) { - Te("[Grid] Using early-fetched data:", c.length, "assets"); + ft("[Grid] Using early-fetched data:", c.length, "assets"); let t = s.data?.total ?? s.meta?.total ?? null; return oe({ ok: !0, @@ -5974,14 +6416,14 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }); } } catch (e) { - Te("[Grid] Early fetch failed, falling back to normal fetch", e); + ft("[Grid] Early fetch failed, falling back to normal fetch", e); } } } - return oe(await Sl(o, e, n, r, { - sanitizeQuery: Yl, - buildListURL: L, - get: le, + return oe(await Gl(o, e, n, r, { + sanitizeQuery: vu, + buildListURL: qe, + get: Pe, getGridState: () => t }, { requestId: i, @@ -5993,7 +6435,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM offset: r }); } - let ce = bl({ + let ce = Ul({ query: { get value() { return t.query || "*"; @@ -6005,7 +6447,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM collection: { append(e = []) { let t = y(); - return t && e.length && Number(ie(t, e) || 0) || 0; + return t && e.length && Number(I(t, e) || 0) || 0; }, reset() {} }, @@ -6018,9 +6460,9 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }); return g.apiTimeMs += Math.max(0, _() - a), o; }, - pageSize: z.DEFAULT_PAGE_SIZE + pageSize: R.DEFAULT_PAGE_SIZE }); - function ue() { + function le() { ce.setPageState({ offset: t.offset, cursor: t.cursor, @@ -6031,22 +6473,22 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM error: null }); } - function de(e = {}, { syncPaged: n = !0 } = {}) { - e && typeof e == "object" && (Object.prototype.hasOwnProperty.call(e, "offset") && (t.offset = Math.max(0, Number(e.offset || 0) || 0)), Object.prototype.hasOwnProperty.call(e, "cursor") && (t.cursor = e.cursor || null), Object.prototype.hasOwnProperty.call(e, "total") && (t.total = e.total == null ? null : Math.max(0, Number(e.total) || 0)), Object.prototype.hasOwnProperty.call(e, "done") && (t.done = !!e.done), n && ue()); + function ue(e = {}, { syncPaged: n = !0 } = {}) { + e && typeof e == "object" && (Object.prototype.hasOwnProperty.call(e, "offset") && (t.offset = Math.max(0, Number(e.offset || 0) || 0)), Object.prototype.hasOwnProperty.call(e, "cursor") && (t.cursor = e.cursor || null), Object.prototype.hasOwnProperty.call(e, "total") && (t.total = e.total == null ? null : Math.max(0, Number(e.total) || 0)), Object.prototype.hasOwnProperty.call(e, "done") && (t.done = !!e.done), n && le()); + } + function de() { + ue(ce.getPageState(), { syncPaged: !1 }); } function fe() { - de(ce.getPageState(), { syncPaged: !1 }); - } - function pe() { let e = Array.isArray(t.assets) ? t.assets.length : 0; - e <= 0 || t.done || Number(t.offset || 0) >= e || de({ offset: e }, { syncPaged: !0 }); + e <= 0 || t.done || Number(t.offset || 0) >= e || ue({ offset: e }, { syncPaged: !0 }); } - function me({ title: e = "", showEmptyMessage: n = !0 } = {}) { - r(), Array.isArray(t.assets) && t.assets.length ? (a(), F(e || t.query)) : !n || t.statusMessage && t.statusError || i("No assets found"); + function pe({ title: e = "", showEmptyMessage: n = !0 } = {}) { + r(), Array.isArray(t.assets) && t.assets.length ? (a(), re(e || t.query)) : !n || t.statusMessage && t.statusError || i("No assets found"); let o = (Array.isArray(t.assets) ? t.assets : []).map((e) => String(e?.id || "")).filter(Boolean); (t.done || Number.isFinite(Number(t.total)) && Number(t.total || 0) <= o.length) && c(o, { activeId: t.activeId }); } - async function he() { + async function me() { let e = y(); if (!e || t.loading || t.done) return { ok: !0, @@ -6064,17 +6506,17 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(e); } let f = Array.isArray(t.selectedIds) ? t.selectedIds.join("|") : "", m = String(t.activeId || ""); - if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && nu() && ee(t.requestId, 400), { + if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && Tu() && N(t.requestId, 400), { ok: !0, skipped: !0, hidden: !0 }; - if (j()) return { + if (ee()) return { ok: !0, skipped: !0, busy: !0 }; - let h = Math.max(1, Math.min(z.MAX_PAGE_SIZE, z.DEFAULT_PAGE_SIZE)), _ = Date.now(); + let h = Math.max(1, Math.min(R.MAX_PAGE_SIZE, R.DEFAULT_PAGE_SIZE)), _ = Date.now(); t.loading = !0, a(); try { if (!t.done) { @@ -6083,11 +6525,11 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM skipped: !0, hidden: !0 }; - p || pe(), ue(); + p || fe(), le(); let n = t.requestId, r = await ce.loadUntilVisible({ maxEmptyPages: 6, canContinue: () => A(), - getLimit: (e) => eu(h, e), + getLimit: (e) => Cu(h, e), beforeApplyPage: (e) => { if (t.requestId !== n) return { ok: !1, @@ -6100,12 +6542,12 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM query: t.query || "*", total: null, done: !1 - }), de({ + }), ue({ offset: 0, cursor: null, total: null, done: !1 - }), ru(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (Te("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { + }), Eu(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (ft("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { offset: t.offset, query: t.query }), { @@ -6116,18 +6558,18 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }) : null; }, onEmptyPage: (e) => { - e.emptyPageIndex <= 0 || Te(`[Grid LoadPage] fetched adaptive page with no visible additions: offset=${t.offset}, fetched=${e.count}, consumed=${e.advanced}, added=${e.added}, limit=${e.limit}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`); + e.emptyPageIndex <= 0 || ft(`[Grid LoadPage] fetched adaptive page with no visible additions: offset=${t.offset}, fetched=${e.count}, consumed=${e.advanced}, added=${e.added}, limit=${e.limit}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`); } }); - if (fe(), pe(), !r.ok) return r.aborted || r.stale || (de({ done: !0 }), i($l("Failed to load assets", r?.error || "Unknown error"), { error: !0 })), r; + if (de(), fe(), !r.ok) return r.aborted || r.stale || (ue({ done: !0 }), i(Su("Failed to load assets", r?.error || "Unknown error"), { error: !0 })), r; if (r.preservedCached) return r; - if (t.done || r.added > 0) return F(t.query || wc(e, "*")), { + if (t.done || r.added > 0) return re(t.query || qc(e, "*")), { ok: !0, count: r.count, total: t.total }; let a = r.lastResult || r.firstResult || r; - return Te(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && nu() && ee(Number(t.requestId ?? 0) || 0, Math.min(z.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { + return ft(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && Tu() && N(Number(t.requestId ?? 0) || 0, Math.min(R.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { ok: !0, count: r.count, total: t.total, @@ -6149,7 +6591,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return i($l("Failed to load assets", e), { error: !0 }), { + return i(Su("Failed to load assets", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; @@ -6171,42 +6613,42 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } try { let e = Date.now() - _; - e < Kl && await ql(Kl - e); + e < hu && await gu(hu - e); } catch (e) { console.debug?.(e); } t.loading = !1, r(); } } - let ge = null; - function _e(e = 250) { + let he = null; + function ge(e = 250) { v("refreshHead", { appendReason: "snapshotHeadRefresh" }); try { - ge && clearTimeout(ge); + he && clearTimeout(he); } catch (e) { console.debug?.(e); } let n = t.requestId, r = null; try { - r = tl(C()); + r = wl(C()); } catch (e) { console.debug?.(e); } - ge = setTimeout(async () => { - if (ge = null, Number(t.requestId) !== Number(n) || j() || !y()) return; + he = setTimeout(async () => { + if (he = null, Number(t.requestId) !== Number(n) || ee() || !y()) return; if (r) { let e = null; try { - e = tl(C()); + e = wl(C()); } catch (e) { console.debug?.(e); } if (e && e !== r) { - Te("[Grid] Snapshot head refresh skipped - context changed"); + ft("[Grid] Snapshot head refresh skipped - context changed"); return; } } - let e = Math.max(1, Math.min(z.MAX_PAGE_SIZE, z.DEFAULT_PAGE_SIZE)); + let e = Math.max(1, Math.min(R.MAX_PAGE_SIZE, R.DEFAULT_PAGE_SIZE)); try { let i = await se(t.query || "*", e, 0, { requestId: n, @@ -6216,27 +6658,27 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (r) { let e = null; try { - e = tl(C()); + e = wl(C()); } catch (e) { console.debug?.(e); } if (e && e !== r) { - Te("[Grid] Snapshot head refresh discarded - context changed mid-fetch"); + ft("[Grid] Snapshot head refresh discarded - context changed mid-fetch"); return; } } if (!i?.ok) return; let a = Array.isArray(i.assets) ? i.assets : []; - if (i.total != null && de({ total: i.total }), !a.length) return; + if (i.total != null && ue({ total: i.total }), !a.length) return; let o = 0; - for (let e of a) e && e.id != null && Oe(e) && (o += 1); - o > 0 && (F(t.query || "*"), Te("[Grid] Snapshot head refresh: inserted", o, "new asset(s)")); + for (let e of a) e && e.id != null && Ee(e) && (o += 1); + o > 0 && (re(t.query || "*"), ft("[Grid] Snapshot head refresh: inserted", o, "new asset(s)")); } catch (e) { console.debug?.("[Grid] Snapshot head refresh failed", e); } }, Math.max(0, Number(e) || 0)); } - async function ve(e = "*", i = {}) { + async function _e(e = "*", i = {}) { let s = t.requestId, { reset: c = !0, preserveVisibleUntilReady: l = !0 } = i || {}, u = y(); if (!u) return { ok: !1, @@ -6251,19 +6693,19 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - let d = Xl(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Yl(f) || f; + let d = yu(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = vu(f) || f; t.query = m; let h = c ? E(m, i) : { reason: "append", nextContext: w(m) }; - if (v("reload", { reloadReason: h.reason || "loadAssets" }), c && j()) { + if (v("reload", { reloadReason: h.reason || "loadAssets" }), c && ee()) { let e = !1; try { let n = C(); n.query = m; - let r = tl(n); - if (ne() && fl(r) && (e = await Ee(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { + let r = wl(n); + if (P() && Fl(r) && (e = await L(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { ok: !1, aborted: !0 }; @@ -6297,28 +6739,28 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { t.abortController = null; } - t.requestId = (Number(t.requestId) || 0) + 1, N(), re(), a(), p ? (t.query = m, de({ + t.requestId = (Number(t.requestId) || 0) + 1, M(), F(), a(), p ? (t.query = m, ue({ offset: 0, cursor: null, total: null, done: !1 - }), ru(t, { + }), Eu(t, { rebuildFromVisible: !0, preserveHiddenCount: !0, - assetKey: (e) => P(e, u) + assetKey: (e) => ne(e, u) })) : (o({ query: m, total: null, done: !1 - }), de({ + }), ue({ offset: 0, cursor: null, total: null, done: !1 - }), ru(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); + }), Eu(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); } - let _ = await he(); - return pe(), nu() && _?.ok && !_?.skipped && !t.done && !_?.aborted && ee(t.requestId), c && (me({ + let _ = await me(); + return fe(), Tu() && _?.ok && !_?.skipped && !t.done && !_?.aborted && N(t.requestId), c && (pe({ title: m, showEmptyMessage: !(_?.skipped || _?.hidden || _?.aborted || _?.stale || _?.preservedCached || _?.busy) }), O(h.nextContext)), { @@ -6329,7 +6771,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM aborted: !!_?.aborted }; } - async function ye(e, s = {}) { + async function ve(e, s = {}) { let { title: c = "Collection", reset: l = !0, showLoading: u = !0, preserveVisibleUntilReady: d = !0 } = s || {}; v("reload", { reloadReason: s?.resetReason || s?.reason || "collection" }); let f = y(); @@ -6353,7 +6795,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { t.abortController = null; } - t.requestId = (Number(t.requestId) || 0) + 1, re(), a(), h ? (t.query = String(c || "Collection"), de({ + t.requestId = (Number(t.requestId) || 0) + 1, F(), a(), h ? (t.query = String(c || "Collection"), ue({ offset: 0, cursor: null, total: p.length, @@ -6362,48 +6804,48 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM query: String(c || "Collection"), total: p.length, done: !0 - }), de({ + }), ue({ offset: 0, cursor: null, total: p.length, done: !0 - }), ru(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); + }), Eu(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); } try { - let e = Tc(f, "mtime_desc"), n = p.sort((t, n) => wl(t, n, e)); + let e = Jc(f, "mtime_desc"), n = p.sort((t, n) => ql(t, n, e)); return l && h && (o({ query: String(c || "Collection"), total: p.length, done: !0 - }), ru(t), g.resetCount += 1), ie(f, n), de({ + }), Eu(t), g.resetCount += 1), I(f, n), ue({ offset: n.length, cursor: null, total: n.length, done: !0 - }), me({ title: c }), O(w(String(c || "Collection"))), { + }), pe({ title: c }), O(w(String(c || "Collection"))), { ok: !0, count: n.length, total: n.length }; } catch (e) { - return i($l("Failed to load collection", e), { error: !0 }), { + return i(Su("Failed to load collection", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; } finally { if (u) try { let e = Date.now() - m; - e < Kl && await ql(Kl - e); + e < hu && await gu(hu - e); } catch (e) { console.debug?.(e); } t.loading = !1, u && r(); } } - function be() { + function ye() { v("reload", { reloadReason: "scopeSwitch" }); try { - Za(y()); + xo(y()); } catch (e) { console.debug?.(e); } @@ -6412,19 +6854,19 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - t.abortController = null, t.requestId = (Number(t.requestId) || 0) + 1, t.loading = !0, de({ + t.abortController = null, t.requestId = (Number(t.requestId) || 0) + 1, t.loading = !0, ue({ offset: 0, cursor: null, total: null, done: !1 - }), N(), re(), r(), a(), p = !0, s([], ""); + }), M(), F(), r(), a(), p = !0, s([], ""); } function xe() { t.virtualGrid?.setItems?.(t.assets || []); } function Se(e, { updateSelection: n = !0 } = {}) { - let r = _l(t, e, { assetKey: (e) => P(e, y()) }); - return r ? (Number.isFinite(Number(t.total)) && de({ total: Math.max(0, Number(t.total || 0) - r) }), n && c(t.assets.map((e) => String(e?.id || "")).filter(Boolean), { activeId: t.activeId }), !t.assets.length && !t.loading && i("No assets found"), { + let r = Bl(t, e, { assetKey: (e) => ne(e, y()) }); + return r ? (Number.isFinite(Number(t.total)) && ue({ total: Math.max(0, Number(t.total || 0) - r) }), n && c(t.assets.map((e) => String(e?.id || "")).filter(Boolean), { activeId: t.activeId }), !t.assets.length && !t.loading && i("No assets found"), { ok: !0, removed: r, selectedIds: t.selectedIds.slice() @@ -6445,7 +6887,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { return !1; } - }, r = zl(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; + }, r = cu(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; if (!o) return null; try { let e = o.getBoundingClientRect(), n = t.getBoundingClientRect(); @@ -6461,14 +6903,14 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM async function we(e) { let t = y(), n = l(); if (!t || !n || !e) return; - await Ql(); + await xu(); let r = String(e.id || "").trim(); if (!r) { n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; return; } - d(r, { align: "start" }), await Ql(); - let i = Bl(t, r); + d(r, { align: "start" }), await xu(); + let i = lu(t, r); if (!i) n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; else try { let t = i.getBoundingClientRect(), r = n.getBoundingClientRect(), a = t.top - r.top - Number(e.top || 0); @@ -6477,10 +6919,10 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(t), n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; } } - async function Ee(e = {}, n = {}) { + async function L(e = {}, n = {}) { let i = y(); - if (!i || !ne()) return !1; - let s = tl(e), c = dl(s); + if (!i || !P()) return !1; + let s = wl(e), c = Pl(s); if (!c || !Array.isArray(c.assets) || !c.assets.length || !n.allowReplaceExisting && Array.isArray(t.assets) && t.assets.length) return !1; g.lastResetReason = "snapshot"; try { @@ -6493,11 +6935,11 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { t.abortController = null; } - return t.requestId = (Number(t.requestId) || 0) + 1, N(), re(), o({ + return t.requestId = (Number(t.requestId) || 0) + 1, M(), F(), o({ query: c.query || n.title || "Cached", total: Number(c.total ?? c.assets.length) || c.assets.length, done: !!c.done - }), ru(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), de({ + }), Eu(t), g.resetCount += 1, a(), r(), t.loading = !1, I(i, c.assets), ue({ offset: Math.max(Number(c.assets.length || 0) || 0, Number(c.offset || c.assets.length) || c.assets.length), cursor: c.cursor || null, total: Number(c.total ?? c.assets.length) || c.assets.length, @@ -6505,44 +6947,44 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }), t._mjrLastHydrateKey = s, t._mjrLastHydrateAt = Date.now(), O({ ...e, query: c.query || e.query || "*" - }), p = !1, me({ title: c.title || n.title || "Cached" }), !0; + }), p = !1, pe({ title: c.title || n.title || "Cached" }), !0; } - function De(e) { + function Te(e) { return { getOrCreateState: () => t, ensureVirtualGrid: () => t.virtualGrid, - upsertState: Wl, - maxBatchSize: Ul, - debounceMs: Hl, - assetKey: (t) => Jl(t) || P(t, e), - loadMajoorSettings: Xt + upsertState: pu, + maxBatchSize: fu, + debounceMs: du, + assetKey: (t) => _u(t) || ne(t, e), + loadMajoorSettings: Mt }; } - function Oe(e) { + function Ee(e) { v("upsertRealtime", { appendReason: "realtime" }); let t = y(); - return !t || !e || !e.id ? !1 : Il(t, e, De(t)); + return !t || !e || !e.id ? !1 : au(t, e, Te(t)); } - let ke = !1; - function Ae(e) { + let De = !1; + function Oe(e) { v("upsertRealtime", { appendReason: "realtimeImmediate" }); let t = y(); if (!t || !e || !e.id) return !1; - let n = Il(t, e, De(t)); - return n && !ke && (ke = !0, queueMicrotask(() => { - ke = !1; + let n = au(t, e, Te(t)); + return n && !De && (De = !0, queueMicrotask(() => { + De = !1; let e = y(); - e && Fl(e, De(e)); + e && iu(e, Te(e)); })), n; } - function je() { - F(t.query || "Cached"); + function ke() { + re(t.query || "Cached"); try { - ul(); + Nl(); } catch (e) { console.debug?.(e); } - M(), N(); + j(), M(); try { t.abortController?.abort?.(); } catch (e) { @@ -6550,48 +6992,48 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } let e = y(); if (e) try { - let t = Dl(e, Wl); + let t = Xl(e, pu); t?.timer && (clearTimeout(t.timer), t.timer = null), t?.pending?.clear?.(); } catch (e) { console.debug?.(e); } try { - window.removeEventListener("pagehide", je); + window.removeEventListener("pagehide", ke); } catch (e) { console.debug?.(e); } } try { - window.addEventListener("pagehide", je, { once: !0 }); + window.addEventListener("pagehide", ke, { once: !0 }); } catch (e) { console.debug?.(e); } return { - reload: ve, - appendNextPage: he, - refreshHead: _e, - upsertRealtime: Ae, - loadAssets: ve, - loadAssetsFromList: ye, - loadNextPage: he, - prepareGridForScopeSwitch: be, + reload: _e, + appendNextPage: me, + refreshHead: ge, + upsertRealtime: Oe, + loadAssets: _e, + loadAssetsFromList: ve, + loadNextPage: me, + prepareGridForScopeSwitch: ye, refreshGrid: xe, removeAssets: Se, captureAnchor: Ce, restoreAnchor: we, - hydrateFromSnapshot: Ee, - upsertAsset: Oe, - upsertAssetNow: Ae, + hydrateFromSnapshot: L, + upsertAsset: Ee, + upsertAssetNow: Oe, getCanonicalState: x, getDebugSnapshot: S, - dispose: je + dispose: ke }; } // node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js -function au(e) { +function Ou(e) { return typeof e == "object" ? e.key : e; } -function ou(e, t) { +function ku(e, t) { let n = e.length; return new Proxy(e, { get(e, r, i) { if (typeof r == "string") { @@ -6620,7 +7062,7 @@ function ou(e, t) { } }); } // node_modules/@tanstack/virtual-core/dist/esm/utils.js -function su(e, t, n) { +function Au(e, t, n) { let r = n.initialDeps ?? [], i, a = !0; function o() { let o = e(); @@ -6630,34 +7072,34 @@ function su(e, t, n) { r = e; }, o; } -function cu(e, t) { +function ju(e, t) { if (e === void 0) throw Error(`Unexpected undefined${t ? `: ${t}` : ""}`); return e; } -var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { +var Mu = (e, t) => Math.abs(e - t) < 1.01, Nu = (e, t, n) => { let r; return Object.assign(function(...i) { e.clearTimeout(r), r = e.setTimeout(() => t.apply(this, i), n); }, { cancel: () => { e.clearTimeout(r); } }); -}, du, fu = () => { - if (du !== void 0) return du; - if (typeof navigator > "u") return du = !1; - if (/iP(hone|od|ad)/.test(navigator.userAgent)) return du = !0; +}, Pu, Fu = () => { + if (Pu !== void 0) return Pu; + if (typeof navigator > "u") return Pu = !1; + if (/iP(hone|od|ad)/.test(navigator.userAgent)) return Pu = !0; let e = navigator.maxTouchPoints; - return du = navigator.platform === "MacIntel" && e !== void 0 && e > 0; -}, pu = (e) => { + return Pu = navigator.platform === "MacIntel" && e !== void 0 && e > 0; +}, Iu = (e) => { let { offsetWidth: t, offsetHeight: n } = e; return { width: t, height: n }; -}, mu = (e) => e, hu = (e) => { +}, Lu = (e) => e, Ru = (e) => { let t = Math.max(e.startIndex - e.overscan, 0), n = Math.min(e.endIndex + e.overscan, e.count - 1) - t + 1, r = Array(n); for (let e = 0; e < n; e++) r[e] = t + e; return r; -}, gu = (e, t) => { +}, zu = (e, t) => { let n = e.scrollElement; if (!n) return; let r = e.targetWindow; @@ -6669,7 +7111,7 @@ var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { height: Math.round(r) }); }; - if (i(pu(n)), !r.ResizeObserver) return () => {}; + if (i(Iu(n)), !r.ResizeObserver) return () => {}; let a = new r.ResizeObserver((t) => { let r = () => { let e = t[0]; @@ -6683,28 +7125,28 @@ var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { return; } } - i(pu(n)); + i(Iu(n)); }; e.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(r) : r(); }); return a.observe(n, { box: "border-box" }), () => { a.unobserve(n); }; -}, _u = { passive: !0 }, vu = typeof window > "u" || "onscrollend" in window, yu = (e, t, n) => { +}, Bu = { passive: !0 }, Vu = typeof window > "u" || "onscrollend" in window, Hu = (e, t, n) => { let r = e.scrollElement; if (!r) return; let i = e.targetWindow; if (!i) return; - let a = e.options.useScrollendEvent && vu, o = 0, s = a ? null : uu(i, () => t(n(r), !1), e.options.isScrollingResetDelay), c = (e) => () => { + let a = e.options.useScrollendEvent && Vu, o = 0, s = a ? null : Nu(i, () => t(n(r), !1), e.options.isScrollingResetDelay), c = (e) => () => { o = n(r), s?.(), t(o, e); }, l = c(!0), u = c(!1); - return r.addEventListener("scroll", l, _u), a && r.addEventListener("scrollend", u, _u), () => { + return r.addEventListener("scroll", l, Bu), a && r.addEventListener("scrollend", u, Bu), () => { r.removeEventListener("scroll", l), a && r.removeEventListener("scrollend", u), s?.cancel(); }; -}, bu = (e, t) => yu(e, t, (t) => { +}, Uu = (e, t) => Hu(e, t, (t) => { let { horizontal: n, isRtl: r } = e.options; return n ? t.scrollLeft * (r && -1 || 1) : t.scrollTop; -}), xu = (e, t, n) => { +}), Wu = (e, t, n) => { if (n.options.useCachedMeasurements) { let t = n.indexFromElement(e), r = n.options.getItemKey(t); return n.itemSizeCache.get(r) ?? n.options.estimateSize(t); @@ -6718,14 +7160,14 @@ var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { if (i !== void 0) return i; } return e[n.options.horizontal ? "offsetWidth" : "offsetHeight"]; -}, Su = (e, { adjustments: t = 0, behavior: n }, r) => { +}, Gu = (e, { adjustments: t = 0, behavior: n }, r) => { var i, a; (a = (i = r.scrollElement)?.scrollTo) == null || a.call(i, { [r.options.horizontal ? "left" : "top"]: e + t, behavior: n }); }; -function Cu(e, t, n, r) { +function Ku(e, t, n, r) { if (t === 0) return !1; let i = r(0), a = /* @__PURE__ */ new Set(), o = 0; for (; o < e;) { @@ -6739,7 +7181,7 @@ function Cu(e, t, n, r) { for (let e = s; e < t; e++) if (a.has(r(e))) return !1; return !0; } -var wu = class { +var qu = class { constructor(e) { this.unsubs = [], this.scrollElement = null, this.targetWindow = null, this.isScrolling = !1, this.scrollState = null, this.measurementsCache = [], this._singleLaneMeasurements = null, this.itemSizeCache = /* @__PURE__ */ new Map(), this.itemSizeCacheVersion = 0, this.laneAssignments = /* @__PURE__ */ new Map(), this.pendingMin = null, this.prevLanes = void 0, this.lanesChangedFlag = !1, this.lanesSettling = !1, this.pendingScrollAnchor = null, this.scrollRect = null, this.scrollOffset = null, this.scrollDirection = null, this.scrollAdjustments = 0, this._iosDeferredAdjustment = 0, this._iosTouching = !1, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._intendedScrollOffset = null, this._clampedAdjustment = null, this.elementsCache = /* @__PURE__ */ new Map(), this.now = () => { var e; @@ -6779,10 +7221,10 @@ var wu = class { scrollPaddingStart: 0, scrollPaddingEnd: 0, horizontal: !1, - getItemKey: mu, - rangeExtractor: hu, + getItemKey: Lu, + rangeExtractor: Ru, onChange: () => {}, - measureElement: xu, + measureElement: Wu, initialRect: { width: 0, height: 0 @@ -6809,13 +7251,13 @@ var wu = class { } let n = this.options, r = null, i = null, a = !1; if (n !== void 0 && n.enabled && t.enabled && t.anchorTo === "end" && this.scrollElement !== null) { - let e = n.count, o = t.count, s = this.getMeasurements(), c = this._singleLaneMeasurements?.items ?? s, l = (e) => au(c[e]), u = e > 0 ? l(0) : null, d = e > 0 ? l(e - 1) : null; + let e = n.count, o = t.count, s = this.getMeasurements(), c = this._singleLaneMeasurements?.items ?? s, l = (e) => Ou(c[e]), u = e > 0 ? l(0) : null, d = e > 0 ? l(e - 1) : null; if (o !== e || e > 0 && o > 0 && (t.getItemKey(0) !== u || t.getItemKey(o - 1) !== d)) { a = !0; let c = e > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? s[0] : null; c && (r = [c.key, this.getScrollOffset() - c.start]); let u = t.followOnAppend === !0 ? "auto" : t.followOnAppend || null; - u && o > 0 && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== d) && (o > e || Cu(e, o, l, t.getItemKey)) && (i = u); + u && o > 0 && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== d) && (o > e || Ku(e, o, l, t.getItemKey)) && (i = u); } } this.options = t, a && (this.pendingMin = 0, this.itemSizeCacheVersion++); @@ -6840,7 +7282,7 @@ var wu = class { }, this.notify = (e) => { var t, n; (n = (t = this.options).onChange) == null || n.call(t, this, e); - }, this.maybeNotify = su(() => (this.calculateRange(), [ + }, this.maybeNotify = Au(() => (this.calculateRange(), [ this.isScrolling, this.range ? this.range.startIndex : null, this.range ? this.range.endIndex : null @@ -6878,11 +7320,11 @@ var wu = class { let e = this.scrollElement, t = () => { this._iosTouching = !0, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }, n = () => { - this._iosTouching = !1, fu() && this.targetWindow != null && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { + this._iosTouching = !1, Fu() && this.targetWindow != null && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._flushIosDeferredIfReady(); }, 150)); }; - e.addEventListener("touchstart", t, _u), e.addEventListener("touchend", n, _u), this.unsubs.push(() => { + e.addEventListener("touchstart", t, Bu), e.addEventListener("touchend", n, Bu), this.unsubs.push(() => { e.removeEventListener("touchstart", t), e.removeEventListener("touchend", n), this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }); } @@ -6894,7 +7336,7 @@ var wu = class { let t = this.pendingScrollAnchor; if (this.pendingScrollAnchor = null, t && this.scrollElement && this.options.enabled) { let [e, n, r, i] = t; - e !== null && !r && (fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this.scrollState?.behavior === "smooth" && !lu(this.getScrollOffset() - i, this.scrollState.lastTargetOffset) || this._scrollToOffset(this.getScrollOffset(), { + e !== null && !r && (Fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this.scrollState?.behavior === "smooth" && !Mu(this.getScrollOffset() - i, this.scrollState.lastTargetOffset) || this._scrollToOffset(this.getScrollOffset(), { adjustments: void 0, behavior: void 0 })), r && this.scrollToEnd({ behavior: r }); @@ -6923,7 +7365,7 @@ var wu = class { adjustments: this.scrollAdjustments += n, behavior: void 0 }); - }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = su(() => [ + }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = Au(() => [ this.options.count, this.options.paddingStart, this.options.scrollMargin, @@ -6941,7 +7383,7 @@ var wu = class { lanes: a, laneAssignmentMode: o, gap: s - }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = su(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { + }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = Au(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { let l = this.itemSizeCache; if (!i) return this.measurementsCache = [], this._singleLaneMeasurements = null, this.itemSizeCache.clear(), this.laneAssignments.clear(), []; if (this.laneAssignments.size > e) for (let t of this.laneAssignments.keys()) t >= e && this.laneAssignments.delete(t); @@ -6971,7 +7413,7 @@ var wu = class { flat: a, items: o }; - let d = ou(o, a); + let d = ku(o, a); return this.measurementsCache = d, d; } let d = this.measurementsCache.slice(0, u), f = Array(a).fill(void 0), p = new Float64Array(a), m = 0; @@ -7007,15 +7449,15 @@ var wu = class { }, { key: !1, debug: () => this.options.debug - }), this.calculateRange = su(() => [ + }), this.calculateRange = Au(() => [ this.getMeasurements(), this.getSize(), this.getScrollOffset(), this.options.lanes - ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Du(e, t, n, r, r === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null), this.range), { + ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Xu(e, t, n, r, r === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null), this.range), { key: !1, debug: () => this.options.debug - }), this.getVirtualIndexes = su(() => { + }), this.getVirtualIndexes = Au(() => { let e = null, t = null, n = this.calculateRange(); return n && (e = n.startIndex, t = n.endIndex), this.maybeNotify.updateDeps([ this.isScrolling, @@ -7081,7 +7523,7 @@ var wu = class { let f = !1; a ? f = this.applyScrollAdjustment(this.getTotalSize() - c) : d && (f = this.applyScrollAdjustment(s)), this.notify(f), this._retryClampedAdjustment(); } - }, this.getVirtualItems = su(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { + }, this.getVirtualItems = Au(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { let n = []; for (let r = 0, i = e.length; r < i; r++) { let i = t[e[r]]; @@ -7095,7 +7537,7 @@ var wu = class { let t = this.getMeasurements(); if (t.length === 0) return; let n = this._singleLaneMeasurements?.flat, r = this.options.lanes === 1 && n != null; - return cu(t[Tu(0, t.length - 1, r ? (e) => n[e * 2] : (e) => cu(t[e]).start, e)]); + return ju(t[Ju(0, t.length - 1, r ? (e) => n[e * 2] : (e) => ju(t[e]).start, e)]); }, this.getMaxScrollOffset = () => { if (!this.scrollElement) return 0; if ("scrollHeight" in this.scrollElement) return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight; @@ -7208,7 +7650,7 @@ var wu = class { } applyScrollAdjustment(e, t) { if (e === 0) return !1; - if (fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) return this._iosDeferredAdjustment += e, !1; + if (Fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) return this._iosDeferredAdjustment += e, !1; { let n = this.getScrollOffset() + this.scrollAdjustments + e, r = this.scrollElement, i = r !== null && ("scrollHeight" in r || "document" in r) ? this.getMaxScrollOffset() : null; return this._clampedAdjustment = i !== null && n > i + .5 ? { @@ -7232,7 +7674,7 @@ var wu = class { return; } let e = this.scrollState.index == null ? void 0 : this.getOffsetForIndex(this.scrollState.index, this.scrollState.align), t = e ? e[0] : this.scrollState.lastTargetOffset, n = t !== this.scrollState.lastTargetOffset; - if (!n && lu(t, this.getScrollOffset())) { + if (!n && Mu(t, this.getScrollOffset())) { if (this.scrollState.stableFrames++, this.scrollState.stableFrames >= 1) { this.getScrollOffset() !== t && this._scrollToOffset(t, { adjustments: void 0, @@ -7249,7 +7691,7 @@ var wu = class { } this.scheduleScrollReconcile(); } -}, Tu = (e, t, n, r) => { +}, Ju = (e, t, n, r) => { for (; e <= t;) { let i = (e + t) / 2 | 0, a = n(i); if (a < r) e = i + 1; @@ -7258,7 +7700,7 @@ var wu = class { } return e > 0 ? e - 1 : 0; }; -function Eu(e, t, n) { +function Yu(e, t, n) { let r = 0; for (; r <= t;) { let i = (r + t) / 2 | 0, a = e[i * 2]; @@ -7268,21 +7710,21 @@ function Eu(e, t, n) { } return r > 0 ? r - 1 : 0; } -function Du(e, t, n, r, i) { +function Xu(e, t, n, r, i) { let a = e.length - 1; if (e.length <= r) return { startIndex: 0, endIndex: a }; if (r === 1 && i !== null) { - let e = Eu(i, a, n), r = e, o = n + t; + let e = Yu(i, a, n), r = e, o = n + t; for (; r < a && i[r * 2] + i[r * 2 + 1] < o;) r++; return { startIndex: e, endIndex: r }; } - let o = Tu(0, a, (t) => e[t].start, n), s = o; + let o = Ju(0, a, (t) => e[t].start, n), s = o; if (r === 1) for (; s < a && e[s].end < n + t;) s++; else if (r > 1) { let i = Array(r).fill(0); @@ -7303,34 +7745,34 @@ function Du(e, t, n, r, i) { }; } // node_modules/@tanstack/vue-virtual/dist/esm/index.js -function Ou(e) { - let t = new wu(X(e)), n = vr(t), r = t._didMount(); - return cr(() => X(e).getScrollElement(), (e) => { +function Zu(e) { + let t = new qu(Z(e)), n = mr(t), r = t._didMount(); + return or(() => Z(e).getScrollElement(), (e) => { e && t._willUpdate(); - }, { immediate: !0 }), cr(() => X(e), (e) => { + }, { immediate: !0 }), or(() => Z(e), (e) => { t.setOptions({ ...e, onChange: (t, r) => { var i; - br(n), (i = e.onChange) == null || i.call(e, t, r); + dr(n), (i = e.onChange) == null || i.call(e, t, r); } - }), t._willUpdate(), br(n); - }, { immediate: !0 }), Tr(r), n; + }), t._willUpdate(), dr(n); + }, { immediate: !0 }), cr(r), n; } -function ku(e) { - return Ou(G(() => ({ - observeElementRect: gu, - observeElementOffset: bu, - scrollToFn: Su, - ...X(e) +function Qu(e) { + return Zu(K(() => ({ + observeElementRect: zu, + observeElementOffset: Uu, + scrollToFn: Gu, + ...Z(e) }))); } // ui/vue/grid/useGridVirtualRows.ts -function Au(e, t = 0) { - let n = Number(X(e)); +function $u(e, t = 0) { + let n = Number(Z(e)); return Number.isFinite(n) ? n : t; } -function ju(e = [], t = 1) { +function ed(e = [], t = 1) { let n = Array.isArray(e) ? e : [], r = Math.max(1, Number(t) || 1), i = []; for (let e = 0; e < n.length; e += r) i.push({ index: Math.floor(e / r), @@ -7338,29 +7780,29 @@ function ju(e = [], t = 1) { }); return i; } -function Mu(e = [], t = 0, n = 1) { +function td(e = [], t = 0, n = 1) { let r = Array.isArray(e) ? e : [], i = Math.max(1, Number(n) || 1), a = Math.max(0, Number(t) || 0) * i; return r.slice(a, a + i); } -function Nu({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = xu } = {}) { - let c = G(() => { - if (!X(o)) return 0; - let e = X(n); +function nd({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = Wu } = {}) { + let c = K(() => { + if (!Z(o)) return 0; + let e = Z(n); if (Array.isArray(e)) return e.length; - let i = X(t) || [], a = Math.max(1, Au(r, 1)); + let i = Z(t) || [], a = Math.max(1, $u(r, 1)); return Math.ceil((Array.isArray(i) ? i.length : 0) / a); - }), l = ku(G(() => ({ + }), l = Qu(K(() => ({ count: c.value, - getScrollElement: () => X(e) || null, - estimateSize: () => Math.max(1, Au(i, 120)), - overscan: Math.max(0, Au(a, 8)), + getScrollElement: () => Z(e) || null, + estimateSize: () => Math.max(1, $u(i, 120)), + overscan: Math.max(0, $u(a, 8)), measureElement: s }))); return { rowCount: c, virtualizer: l, - virtualRows: G(() => { - let e = X(n); + virtualRows: K(() => { + let e = Z(n); if (Array.isArray(e)) return l.value.getVirtualItems().map((t) => { let n = e[t.index] || {}; return { @@ -7373,28 +7815,28 @@ function Nu({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight groupKey: String(n?.groupKey || "") }; }); - let i = X(t) || [], a = Math.max(1, Au(r, 1)); + let i = Z(t) || [], a = Math.max(1, $u(r, 1)); return l.value.getVirtualItems().map((e) => ({ key: e.key, index: e.index, virtual: e, - items: Mu(i, e.index, a), + items: td(i, e.index, a), kind: "assets", title: "", groupKey: "" })); }), - totalSize: G(() => l.value.getTotalSize()), - getRowItems: (e) => Mu(X(t) || [], e, Au(r, 1)) + totalSize: K(() => l.value.getTotalSize()), + getRowItems: (e) => td(Z(t) || [], e, $u(r, 1)) }; } // ui/vue/grid/useInfiniteTrigger.ts -function Pu(e, t = !0) { - let n = X(e); +function rd(e, t = !0) { + let n = Z(e); return n == null ? t : !!n; } -function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { - let o = Z(null), s = null, c = !1; +function id({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { + let o = Q(null), s = null, c = !1; function l() { try { s?.disconnect?.(); @@ -7404,7 +7846,7 @@ function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar s = null; } async function u() { - if (!c && Pu(t, !0) && Pu(n, !0) && typeof r == "function") { + if (!c && rd(t, !0) && rd(n, !0) && typeof r == "function") { c = !0; try { await r(); @@ -7419,12 +7861,12 @@ function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar t && typeof IntersectionObserver == "function" && (s = new IntersectionObserver((e = []) => { e.some((e) => e?.isIntersecting) && u(); }, { - root: X(e) || null, + root: Z(e) || null, rootMargin: i, threshold: a }), s.observe(t)); } - return fr() && (Ar(d), pr(l), cr(() => [X(e), o.value], () => d(), { flush: "post" })), { + return Yn() && (Zn(d), ar(l), or(() => [Z(e), o.value], () => d(), { flush: "post" })), { sentinelRef: o, connect: d, disconnect: l, @@ -7432,36 +7874,77 @@ function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar }; } // ui/vue/grid/useGridDisplayAssets.ts -function Iu(e) { - let t = Mt(e?.filename); +var ad = ["_mjrNameCollisionCount", "_mjrNameCollisionPaths"]; +function od(e) { + let t = gi(e?.filename); return t ? `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}|${t}` : ""; } -function Lu(e) { +function sd(e) { return !!e; } -function Ru(e) { - let t = Array.isArray(e) ? e : [], n = /* @__PURE__ */ new Map(), r = []; - for (let e of t) { +function cd(e, t, n) { + _r(e)?.[t] !== n && (e[t] = n); +} +function ld(e, t) { + let n = _r(e); + n && Object.prototype.hasOwnProperty.call(n, t) && delete e[t]; +} +function ud(e, t) { + if (!Array.isArray(e) || e.length !== t.length) return !1; + for (let n = 0; n < t.length; n++) if (_r(e[n]) !== _r(t[n])) return !1; + return !0; +} +function dd(e) { + cd(e, "_mjrNameCollision", !1); + for (let t of ad) ld(e, t); + cd(e, "_mjrDupStack", !1), cd(e, "_mjrDupMembers", null), cd(e, "_mjrDupCount", 0); +} +function fd(e, t) { + for (let t of ad) ld(e, t); + cd(e, "_mjrNameCollision", !1), cd(e, "_mjrDupStack", !0), ud(_r(e)?._mjrDupMembers, t) || (e._mjrDupMembers = t.slice()), cd(e, "_mjrDupCount", t.length), yi(e, t); +} +function pd(e, { collapseDuplicates: t = !0 } = {}) { + let n = Array.isArray(e) ? e : []; + if (!t) { + let e = []; + for (let t of n) t && (dd(t), e.push(t)); + return e; + } + let r = /* @__PURE__ */ new Map(), i = []; + for (let e of n) { if (!e) continue; - let t = Iu(e); + let t = od(e); if (!t) { - e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0, r.push(e); + dd(e), i.push(e); continue; } - let i = n.get(t); - i || (i = [], n.set(t, i), r.push(e)), i.push(e); + let n = r.get(t); + n || (n = [], r.set(t, n), i.push(e)), n.push(e); } - for (let e of n.values()) { - for (let t of e) t._mjrNameCollision = !1, delete t._mjrNameCollisionCount, delete t._mjrNameCollisionPaths, t._mjrDupStack = !1, t._mjrDupMembers = null, t._mjrDupCount = 0; - if (e.length >= 2) { - let t = e[0]; - t._mjrDupStack = !0, t._mjrDupMembers = e.slice(), t._mjrDupCount = e.length; + for (let e of r.values()) { + let t = e[0]; + for (let n of e) (n !== t || e.length < 2) && dd(n); + e.length >= 2 && fd(t, e); + } + return i; +} +function md(e) { + let t = Array.isArray(e) ? e : [], n = [], r = /* @__PURE__ */ new Set(); + for (let e of t) { + if (!e || typeof e != "object") continue; + let t = { ..._r(e) }; + delete t._mjrDupMembers, delete t._mjrDupStack, delete t._mjrDupCount, delete t._mjrDupHidden, delete t._mjrNameCollision, delete t._mjrNameCollisionCount, delete t._mjrNameCollisionPaths; + let i = String(t.id ?? ""); + if (i) { + if (r.has(i)) continue; + r.add(i); } + n.push(t); } - return r; + return n; } // ui/vue/components/grid/VirtualAssetGridHost.vue?vue&type=script&setup=true&lang.ts -var zu = { +var hd = { key: 0, class: "mjr-grid-loading-overlay", style: { @@ -7476,19 +7959,19 @@ var zu = { background: "rgba(20,22,28,0.55)", "backdrop-filter": "blur(2px)" } -}, Bu = { style: { width: "100%" } }, Vu = { style: { +}, gd = { style: { width: "100%" } }, _d = { style: { "margin-top": "10px", "font-size": "12px", opacity: "0.68", "text-align": "center" -} }, Hu = ["data-index"], Uu = [ +} }, vd = ["data-index"], yd = [ "aria-expanded", "title", "onClick" -], Wu = { +], bd = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Gu = { class: "mjr-grid-group-separator-title" }, Ku = [ +}, xd = { class: "mjr-grid-group-separator-title" }, Sd = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7504,21 +7987,21 @@ var zu = { "onMousedown", "onClick", "onDblclick" -], qu = { +], Cd = { key: 3, style: { display: "flex", "flex-direction": "column", width: "100%" } -}, Ju = [ +}, wd = [ "aria-expanded", "title", "onClick" -], Yu = { +], Td = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Xu = { class: "mjr-grid-group-separator-title" }, Zu = [ +}, Ed = { class: "mjr-grid-group-separator-title" }, Dd = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7534,7 +8017,7 @@ var zu = { "onMousedown", "onClick", "onDblclick" -], Qu = 501, $u = /* @__PURE__ */ dr({ +], Od = 501, kd = /* @__PURE__ */ tr({ __name: "VirtualAssetGridHost", props: { scrollElement: { default: null }, @@ -7560,14 +8043,14 @@ var zu = { } }, setup(e, { expose: n }) { - let r = e, a = Z(null), o = Z(1024); - Z(!0); - let s = Z(0), c = Z(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; + let r = e, i = Q(null), o = Q(1024); + Q(!0); + let s = Q(0), c = Q(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; function v() { - return g ||= import("./chunks/viewerOpenRequest-WCeGPIlE.js").then((e) => e.n), g; + return g ||= import("./chunks/viewerOpenRequest-WOJE90Gn.js").then((e) => e.n), g; } function y() { - return _ ||= import("./chunks/floatingViewerManager-BzaQii21.js").then((e) => e.n), _; + return _ ||= import("./chunks/floatingViewerManager-B_I-SRbd.js").then((e) => e.n), _; } function b(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { @@ -7575,25 +8058,25 @@ var zu = { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }); } - or("mjrStackService", { + Xn("mjrStackService", { openStackGroup: async (e) => { - let t = a.value; + let t = i.value; if (!t || !e) return; let n = String(e.stack_id || "").trim(); if (!n) return; let r = `stack:${n}`; t._mjrStackMembersCache ||= /* @__PURE__ */ new Map(); - let i = t._mjrStackMembersCache.get(r); - if (!Array.isArray(i)) { + let a = t._mjrStackMembersCache.get(r); + if (!Array.isArray(a)) { let e = h.get(r); - e || (e = le(Xe(n, { limit: Qu }), { timeoutMs: 3e4 }).finally(() => { + e || (e = Pe(Ve(n, { limit: Od }), { timeoutMs: 3e4 }).finally(() => { h.delete(r); }), h.set(r, e)); - let a = await e; - if (a?.ok && Array.isArray(a?.data)) i = a.data, t._mjrStackMembersCache.set(r, i); + let i = await e; + if (i?.ok && Array.isArray(i?.data)) a = i.data, t._mjrStackMembersCache.set(r, a); else return; } - let o = b(i); + let o = b(a); t.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, { bubbles: !0, detail: { @@ -7605,9 +8088,9 @@ var zu = { })); }, openDupGroup: (e) => { - let t = a.value; + let t = i.value; if (!t || !e) return; - let n = Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e]; + let n = md(Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e]); t.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, { bubbles: !0, detail: { @@ -7619,13 +8102,13 @@ var zu = { })); } }); - let { state: x, selectedIdSet: C, setLoadingMessage: w, clearLoadingMessage: T, setStatusMessage: E, clearStatusMessage: D, resetAssets: O, setSelection: k, reconcileSelection: A, getSelectedAssets: j, getActiveAsset: M } = mc(); - function N(e) { + let { state: x, selectedIdSet: S, setLoadingMessage: C, clearLoadingMessage: w, setStatusMessage: T, clearStatusMessage: E, resetAssets: D, setSelection: O, reconcileSelection: k, getSelectedAssets: A, getActiveAsset: ee } = Lc(); + function M(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } - let ee = G(() => N(r.scrollElement)); - function te() { - return Rl(a.value); + let N = K(() => M(r.scrollElement)); + function ne() { + return su(i.value); } function P(e, { align: t = "auto" } = {}) { let n = String(e || "").trim(); @@ -7635,7 +8118,7 @@ var zu = { if (r.virtualize) { let e = Math.floor(i / Math.max(1, Be.value)); try { - Ze.value.scrollToIndex(e, { align: t }); + Qe.value.scrollToIndex(e, { align: t }); } catch (e) { console.debug?.(e); } @@ -7649,45 +8132,45 @@ var zu = { } } } - function ne() { - return vc(a.value, ee.value); + function re() { + return Vc(i.value, N.value); } - let F = iu({ - gridContainerRef: a, + let I = Du({ + gridContainerRef: i, state: x, - setLoadingMessage: w, - clearLoadingMessage: T, - setStatusMessage: E, - clearStatusMessage: D, - resetAssets: O, - setSelection: k, - reconcileSelection: A, - readScrollElement: () => ee.value, - readRenderedCards: te, + setLoadingMessage: C, + clearLoadingMessage: w, + setStatusMessage: T, + clearStatusMessage: E, + resetAssets: D, + setSelection: O, + reconcileSelection: k, + readScrollElement: () => N.value, + readRenderedCards: ne, scrollToAssetId: P, - canLoadMore: ne - }), { sentinelRef: re } = Fu({ - rootRef: ee, + canLoadMore: re + }), { sentinelRef: ie } = id({ + rootRef: N, enabled: !0, - canLoad: G(() => !x.loading && !x.done && ne()), - loadMore: () => F.loadNextPage(), + canLoad: K(() => !x.loading && !x.done && re()), + loadMore: () => I.loadNextPage(), rootMargin: "900px" }); - function ie(e) { + function ae(e) { let t = String(e?.filename || ""), n = t.lastIndexOf("."); return n >= 0 ? t.slice(n + 1).toUpperCase() : ""; } - function ae(e) { + function oe(e) { let t = String(e?.filename || ""), n = t.lastIndexOf("."); return n >= 0 ? t.slice(0, n).toLowerCase() : t.toLowerCase(); } - function oe(e) { - return C.value.has(String(e?.id || "")); - } function se(e) { - return String(e?.kind || "").toLowerCase() === "folder"; + return S.value.has(String(e?.id || "")); } function ce(e) { + return String(e?.kind || "").toLowerCase() === "folder"; + } + function le(e) { return String(e?.kind || "").toLowerCase() === "workflow"; } function ue() { @@ -7701,29 +8184,29 @@ var zu = { "category" ].includes(t) ? t : "none"; } - function pe(e) { + function fe(e) { let t = String(e || ""), n = 0; for (let e = 0; e < t.length; e += 1) n = (n << 5) - n + t.charCodeAt(e), n |= 0; return `hsl(${Math.abs(n) % 360}deg 68% 60%)`; } - function me(e, t) { + function pe(e, t) { return !e || typeof e != "object" ? "Ungrouped" : t === "task" ? String(e?.task || e?.workflow_task || "").trim() || "Task: Unknown" : t === "model" ? String(e?.model_family || e?.workflow_model_family || e?.workflow_model || e?.model || "").trim() || "Model: Unknown" : t === "category" ? String(e?.category || e?.subfolder || e?.workflow_category || "").trim() || "Category: Uncategorized" : "Ungrouped"; } - function he(e, t) { + function me(e, t) { return (Array.isArray(e) ? e : []).slice().sort((e, n) => { - let r = me(e, t).toLowerCase(), i = me(n, t).toLowerCase(); + let r = pe(e, t).toLowerCase(), i = pe(n, t).toLowerCase(); if (r < i) return -1; if (r > i) return 1; let a = Number(e?.mtime || e?.created_at || 0) || 0; return (Number(n?.mtime || n?.created_at || 0) || 0) - a; }); } - function ge(e, t, n) { - let r = he(e, n), i = []; + function he(e, t, n) { + let r = me(e, n), i = []; if (!r.length) return i; let a = /* @__PURE__ */ new Map(); for (let e of r) { - let t = ce(e) ? me(e, n) : "Other"; + let t = le(e) ? pe(e, n) : "Other"; a.has(t) || a.set(t, []), a.get(t).push(e); } let o = Array.from(a.keys()); @@ -7734,7 +8217,7 @@ var zu = { title: e, groupKey: e, groupCount: n.length, - accent: pe(e), + accent: fe(e), items: [] }); for (let r = 0; r < n.length; r += t) i.push({ @@ -7742,40 +8225,40 @@ var zu = { title: "", groupKey: e, groupCount: n.length, - accent: pe(e), + accent: fe(e), items: n.slice(r, r + t) }); } return i; } - function _e(e) { - let t = a.value; + function ge(e) { + let t = i.value; return !t || String(t.dataset?.mjrGroupStacks || "") !== "1" ? !1 : !!String(e?.stack_id || "").trim() && Number(e?.stack_asset_count || 0) > 1; } - function ve(e) { + function _e(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } - function ye() { - let e = a.value; + function ve() { + let e = i.value; if (!e) return; let t = new Set((Array.isArray(x.selectedIds) ? x.selectedIds : []).map((e) => String(e || "").trim()).filter(Boolean)); - $n(e, t, x.activeId || ""); + ut(e, t, x.activeId || ""); try { t.size ? e.dataset.mjrSelectedAssetId = String(x.activeId || Array.from(t)[0] || "") : delete e.dataset.mjrSelectedAssetId; } catch (e) { console.debug?.(e); } } - function be() { - let e = a.value; + function ye() { + let e = i.value; if (!e) return; - let t = Array.isArray(x.selectedIds) ? x.selectedIds.slice() : [], n = String(x.activeId || ""), i = `${t.join("|")}::${n}`; - if (i === be._lastSelectionKey) return; - be._lastSelectionKey = i; + let t = Array.isArray(x.selectedIds) ? x.selectedIds.slice() : [], n = String(x.activeId || ""), a = `${t.join("|")}::${n}`; + if (a === ye._lastSelectionKey) return; + ye._lastSelectionKey = a; let o = { selectedIds: t, activeId: n, - selectedAssets: j() + selectedAssets: A() }; try { e.dispatchEvent(new CustomEvent("mjr:selection-changed", { detail: o })); @@ -7788,18 +8271,18 @@ var zu = { console.debug?.(e); } } - be._lastSelectionKey = ""; - let xe = G(() => Ru(x.assets)), Se = G(() => (Array.isArray(xe.value) ? xe.value : []).filter((e) => Lu(e))), Ce = Z(/* @__PURE__ */ new Set()), we = Z(""), Te = G(() => { + ye._lastSelectionKey = ""; + let be = Q(""), xe = K(() => pd(x.assets, { collapseDuplicates: be.value !== "similar" })), Se = K(() => (Array.isArray(xe.value) ? xe.value : []).filter((e) => sd(e))), Ce = Q(/* @__PURE__ */ new Set()), we = Q(""), Te = K(() => { s.value; - let e = de(z.WORKFLOW_GRID_GROUP_BY); + let e = de(R.WORKFLOW_GRID_GROUP_BY); return e === "none" || we.value !== "workflow" ? "none" : e; - }), Ee = G(() => { + }), Ee = K(() => { let e = Array.isArray(Se.value) ? Se.value : []; if (!e.length) return []; let t = Te.value; - return t === "none" ? [] : ge(e, Be.value, t); + return t === "none" ? [] : he(e, Be.value, t); }); - cr(() => `${Te.value}::${Ee.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { + or(() => `${Te.value}::${Ee.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { if (Te.value === "none") { Ce.value = /* @__PURE__ */ new Set(); return; @@ -7827,16 +8310,16 @@ var zu = { for (let e = 0; e < t.length; e += 1) n = (n << 5) - n + t.charCodeAt(e) | 0; return `mjr-grid-group-separator--accent-${Math.abs(n) % 8}`; } - let Ae = G(() => { + let Ae = K(() => { let e = Array.isArray(Se.value) ? Se.value : []; if (!e.length) return []; - if (Te.value === "none") return ju(e, Be.value); + if (Te.value === "none") return ed(e, Be.value); let t = Array.isArray(Ee.value) ? Ee.value : [], n = []; for (let e of t) e?.kind === "header" ? n.push(e) : De(String(e?.groupKey || "")) || n.push(e); return n; }); function je() { - let e = a.value; + let e = i.value; if (!e) return; let t = { count: Array.isArray(Se.value) ? Se.value.length : 0, @@ -7869,20 +8352,20 @@ var zu = { console.debug?.(e); } } - function Pe(e, t = 6) { + function Fe(e, t = 6) { let n = x.cardElements.get(e); if (n) try { n.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } - else t <= 0 || requestAnimationFrame(() => Pe(e, t - 1)); + else t <= 0 || requestAnimationFrame(() => Fe(e, t - 1)); } function Ie(e) { let t = e?.detail || {}, n = String(t.assetId ?? t.id ?? "").trim(); - n && (Array.isArray(Se.value) ? Se.value : []).some((e) => String(e?.id || "") === n) && (k([n], n), ye(), be(), P(n, { align: "center" }), setTimeout(() => Pe(n), 0)); + n && (Array.isArray(Se.value) ? Se.value : []).some((e) => String(e?.id || "") === n) && (O([n], n), ve(), ye(), P(n, { align: "center" }), setTimeout(() => Fe(n), 0)); } - function Le(e) { + function Re(e) { if (!e) return; e._mjrSelectionManagedByVue = !0; try { @@ -7891,80 +8374,80 @@ var zu = { console.debug?.(e); } try { - mt?.(); + gt?.(); } catch (e) { console.debug?.(e); } - pi(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); + ri(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); try { - mt = ts(e); + gt = ws(e); } catch (e) { - console.debug?.(e), mt = null; + console.debug?.(e), gt = null; } e._mjrPrimaryPointerSelectionUnbind = () => {}, e._mjrGetAssets = () => Array.isArray(Se.value) ? Se.value : [], e._mjrSetSelection = (e, t = "") => { - let n = k(e, t); - return ye(), be(), n.selectedIds; + let n = O(e, t); + return ve(), ye(), n.selectedIds; }; let t = (e, t = {}) => { - let n = F.removeAssets(e, t); + let n = I.removeAssets(e, t); return je(), n; }; - e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => te(), e._mjrScrollToAssetId = (e, t = {}) => { + e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => ne(), e._mjrScrollToAssetId = (e, t = {}) => { P(e, t); - }, e._mjrHasAssetId = (e) => (Array.isArray(x.assets) ? x.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => x, e._mjrGetSelectedAssets = () => j(), e._mjrGetActiveAsset = () => M(), e._mjrOnKeyboardAssetChanged = (e) => Me(e), e._mjrOpenKeyboardDetails = () => Ne(); - let n = () => (r.applyDefaultSettingsClasses && (fi(e), s.value += 1), F.refreshGrid()), i = () => { - F.prepareGridForScopeSwitch(), F.dispose(), x.cardElements.clear(), e._mjrGridApi = null; + }, e._mjrHasAssetId = (e) => (Array.isArray(x.assets) ? x.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => x, e._mjrGetSelectedAssets = () => A(), e._mjrGetActiveAsset = () => ee(), e._mjrOnKeyboardAssetChanged = (e) => Me(e), e._mjrOpenKeyboardDetails = () => Ne(); + let n = () => (r.applyDefaultSettingsClasses && (ni(e), s.value += 1), I.refreshGrid()), i = () => { + I.prepareGridForScopeSwitch(), I.dispose(), x.cardElements.clear(), e._mjrGridApi = null; }; e._mjrGridApi = { - reload: (...e) => F.reload(...e), - loadAssetsFromList: (...e) => F.loadAssetsFromList(...e), - appendNextPage: (...e) => F.appendNextPage(...e), - refreshHead: (...e) => F.refreshHead(...e), - upsertRealtime: (...e) => F.upsertRealtime(...e), - upsertRealtimeNow: (...e) => F.upsertAssetNow(...e), - prepareForScopeSwitch: () => F.prepareGridForScopeSwitch(), + reload: (...e) => I.reload(...e), + loadAssetsFromList: (...e) => I.loadAssetsFromList(...e), + appendNextPage: (...e) => I.appendNextPage(...e), + refreshHead: (...e) => I.refreshHead(...e), + upsertRealtime: (...e) => I.upsertRealtime(...e), + upsertRealtimeNow: (...e) => I.upsertAssetNow(...e), + prepareForScopeSwitch: () => I.prepareGridForScopeSwitch(), refreshGrid: n, - captureAnchor: () => F.captureAnchor(), - restoreAnchor: (e) => F.restoreAnchor(e), - hydrateFromSnapshot: (...e) => F.hydrateFromSnapshot(...e), + captureAnchor: () => I.captureAnchor(), + restoreAnchor: (e) => I.restoreAnchor(e), + hydrateFromSnapshot: (...e) => I.hydrateFromSnapshot(...e), removeAssets: t, dispose: i, - getCanonicalState: () => F.getCanonicalState(), - getDebugSnapshot: () => F.getDebugSnapshot() - }, e._mjrLoadAssets = (...e) => F.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => F.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => F.prepareGridForScopeSwitch(), e._mjrRefreshGrid = n, e._mjrCaptureAnchor = () => F.captureAnchor(), e._mjrRestoreAnchor = (e) => F.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => F.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => F.upsertAsset(e), e._mjrUpsertAssetNow = (e) => F.upsertAssetNow(e), e._mjrGetCanonicalState = () => F.getCanonicalState(), e._mjrGetDebugSnapshot = () => F.getDebugSnapshot(), e._mjrDispose = i; + getCanonicalState: () => I.getCanonicalState(), + getDebugSnapshot: () => I.getDebugSnapshot() + }, e._mjrLoadAssets = (...e) => I.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => I.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => I.prepareGridForScopeSwitch(), e._mjrRefreshGrid = n, e._mjrCaptureAnchor = () => I.captureAnchor(), e._mjrRestoreAnchor = (e) => I.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => I.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => I.upsertAsset(e), e._mjrUpsertAssetNow = (e) => I.upsertAssetNow(e), e._mjrGetCanonicalState = () => I.getCanonicalState(), e._mjrGetDebugSnapshot = () => I.getDebugSnapshot(), e._mjrDispose = i; } - cr(a, (e) => { - e && (Le(e), ye(), je()); - }, { immediate: !0 }), cr(() => `${(x.selectedIds || []).join("|")}::${String(x.activeId || "")}`, () => { - a.value && (ye(), be()); - }, { flush: "post" }), cr(() => `${Array.isArray(Se.value) ? Se.value.length : 0}::${Number(x.total || 0)}::${Number(x.hiddenPngSiblings || 0)}`, () => { - a.value && je(); + or(i, (e) => { + e && (Re(e), ve(), je()); + }, { immediate: !0 }), or(() => `${(x.selectedIds || []).join("|")}::${String(x.activeId || "")}`, () => { + i.value && (ve(), ye()); + }, { flush: "post" }), or(() => `${Array.isArray(Se.value) ? Se.value.length : 0}::${Number(x.total || 0)}::${Number(x.hiddenPngSiblings || 0)}`, () => { + i.value && je(); }, { flush: "post", immediate: !0 }); - function Re() { - let e = a.value, t = String(e?.dataset?.mjrBottomFeed || "").toLowerCase() === "true", n = Number(z.GRID_MIN_SIZE || 120) || 120; - return t ? Math.max(80, Number(z.FEED_GRID_MIN_SIZE || n) || n) : ue() ? Math.max(180, n) : Math.max(80, n); + function ze() { + let e = i.value, t = String(e?.dataset?.mjrBottomFeed || "").toLowerCase() === "true", n = Number(R.GRID_MIN_SIZE || 120) || 120; + return t ? Math.max(80, Number(R.FEED_GRID_MIN_SIZE || n) || n) : ue() ? Math.max(180, n) : Math.max(80, n); } - let Be = G(() => { + let Be = K(() => { s.value; - let e = Math.max(0, Number(z.GRID_GAP || 10) || 10), t = Re(), n = Number(o.value || 0) || Number(ee.value?.clientWidth || 0) || 0; + let e = Math.max(0, Number(R.GRID_GAP || 10) || 10), t = ze(), n = Number(o.value || 0) || Number(N.value?.clientWidth || 0) || 0; return n <= 0 ? 1 : Math.max(1, Math.floor((n + e) / (t + e))); - }), Ve = G(() => (Number(o.value || 0) || Number(ee.value?.clientWidth || 0) || 0) > 0), He = G(() => (s.value, Math.max(0, Number(z.GRID_GAP || 10) || 10))), Ue = G(() => { - let e = Math.max(1, Be.value), t = Number(o.value || 0) || Number(ee.value?.clientWidth || 0) || 0; - return t <= 0 ? Re() : Math.max(80, Math.floor((t - He.value * Math.max(0, e - 1)) / e)); - }), We = G(() => { + }), He = K(() => (Number(o.value || 0) || Number(N.value?.clientWidth || 0) || 0) > 0), Ue = K(() => (s.value, Math.max(0, Number(R.GRID_GAP || 10) || 10))), We = K(() => { + let e = Math.max(1, Be.value), t = Number(o.value || 0) || Number(N.value?.clientWidth || 0) || 0; + return t <= 0 ? ze() : Math.max(80, Math.floor((t - Ue.value * Math.max(0, e - 1)) / e)); + }), Ge = K(() => { s.value; - let e = !!z.GRID_SHOW_DETAILS, t = Ue.value, n = e ? 82 : 0; - return Te.value === "none" ? t + n + He.value : Math.max(48, t + n + He.value); - }), Ge = G(() => r.virtualize ? [] : Array.isArray(Ae.value) ? Ae.value : []); - function Ke(e) { + let e = !!R.GRID_SHOW_DETAILS, t = We.value, n = e ? 82 : 0; + return Te.value === "none" ? t + n + Ue.value : Math.max(48, t + n + Ue.value); + }), Ke = K(() => r.virtualize ? [] : Array.isArray(Ae.value) ? Ae.value : []); + function qe(e) { if (!d) try { d = requestAnimationFrame(() => { d = 0; try { - let t = typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), n = Number(e?.scrollTop || 0) || 0, r = Math.max(16, t - Number(m || t)), i = Math.abs(n - Number(p || n)) / Math.max(1, We.value) * (16 / r); + let t = typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), n = Number(e?.scrollTop || 0) || 0, r = Math.max(16, t - Number(m || t)), i = Math.abs(n - Number(p || n)) / Math.max(1, Ge.value) * (16 / r); c.value = Math.max(0, Math.min(20, i)), p = n, m = t, f && clearTimeout(f), f = setTimeout(() => { f = 0, c.value = 0; }, 140); @@ -7976,7 +8459,7 @@ var zu = { console.debug?.(e), d = 0; } } - function qe() { + function Je() { if (d) { try { cancelAnimationFrame(d); @@ -7995,52 +8478,52 @@ var zu = { } c.value = 0; } - let Je = Nu({ - scrollRef: ee, + let Ye = nd({ + scrollRef: N, items: Se, rows: Ae, columnCount: Be, - estimateRowHeight: We, - overscan: G(() => { - let e = Math.max(1, We.value), t = ee.value?.clientHeight || 0; + estimateRowHeight: Ge, + overscan: K(() => { + let e = Math.max(1, Ge.value), t = N.value?.clientHeight || 0; if (t <= 0) return 6; let n = Math.ceil(t / e), r = Math.ceil(c.value * 3); return Math.max(3, Math.min(30, n + r)); }), - enabled: G(() => r.virtualize) - }), Ye = Je.rowCount, Ze = Je.virtualizer, Qe = Je.virtualRows, $e = Je.totalSize, et = G(() => { + enabled: K(() => r.virtualize) + }), Xe = Ye.rowCount, Qe = Ye.virtualizer, z = Ye.virtualRows, et = Ye.totalSize, tt = K(() => { let e = /* @__PURE__ */ new Map(); - for (let t of Qe.value) e.set(t.index, t.virtual || t); + for (let t of z.value) e.set(t.index, t.virtual || t); return e; - }), L = G(() => (s.value, !!z.GRID_SHOW_DETAILS)), nt = G(() => { + }), nt = K(() => (s.value, !!R.GRID_SHOW_DETAILS)), rt = K(() => { let e = Math.max(1, Number(Be.value || 1)); return Math.max(12, Math.min(36, e * 4)); - }), rt = G(() => Array.from({ length: Number(nt.value || 12) }, (e, t) => t)), it = G(() => { - let e = Math.max(80, Number(We.value || 0) - Number(He.value || 0)), t = Math.max(80, Number(Ue.value || 0)); + }), it = K(() => Array.from({ length: Number(rt.value || 12) }, (e, t) => t)), at = K(() => { + let e = Math.max(80, Number(Ge.value || 0) - Number(Ue.value || 0)), t = Math.max(80, Number(We.value || 0)); return Math.max(0, e - t); - }), at = G(() => ({ + }), ot = K(() => ({ display: "grid", - gridTemplateColumns: `repeat(${Math.max(1, Number(Be.value || 1))}, minmax(0, ${Math.max(80, Number(Ue.value || 0))}px))`, - gap: `${He.value}px`, + gridTemplateColumns: `repeat(${Math.max(1, Number(Be.value || 1))}, minmax(0, ${Math.max(80, Number(We.value || 0))}px))`, + gap: `${Ue.value}px`, justifyContent: "start", boxSizing: "border-box" - })), ot = G(() => ({ + })), st = K(() => ({ width: "100%", minWidth: "0", - height: `${Math.max(80, Number(We.value || 0) - Number(He.value || 0))}px`, + height: `${Math.max(80, Number(Ge.value || 0) - Number(Ue.value || 0))}px`, borderRadius: "12px", border: "1px solid rgba(255,255,255,0.22)", background: "rgba(192,198,206,0.20)", overflow: "hidden", boxShadow: "0 6px 18px rgba(0,0,0,0.24)", boxSizing: "border-box" - })), st = G(() => ({ + })), ct = K(() => ({ width: "100%", - height: `${Math.max(80, Number(Ue.value || 0))}px`, + height: `${Math.max(80, Number(We.value || 0))}px`, background: "linear-gradient(90deg, rgba(168,174,182,0.40) 0%, rgba(220,225,232,0.54) 50%, rgba(168,174,182,0.40) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), ct = G(() => ({ + })), lt = K(() => ({ height: "10px", margin: "10px 10px 6px", borderRadius: "8px", @@ -8048,7 +8531,7 @@ var zu = { background: "linear-gradient(90deg, rgba(162,168,176,0.38) 0%, rgba(214,219,226,0.52) 50%, rgba(162,168,176,0.38) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), lt = G(() => ({ + })), dt = K(() => ({ height: "10px", margin: "0 10px 10px", borderRadius: "8px", @@ -8056,23 +8539,25 @@ var zu = { background: "linear-gradient(90deg, rgba(160,166,173,0.34) 0%, rgba(208,214,221,0.48) 50%, rgba(160,166,173,0.34) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), ut = G(() => ({ - display: L.value ? "block" : "none", - minHeight: `${Math.max(0, Number(it.value || 0))}px` + })), ft = K(() => ({ + display: nt.value ? "block" : "none", + minHeight: `${Math.max(0, Number(at.value || 0))}px` })); - function dt() { - let e = Number(ee.value?.clientWidth || 0) || Number(a.value?.clientWidth || 0) || 0; + function pt() { + let e = Number(N.value?.clientWidth || 0) || Number(i.value?.clientWidth || 0) || 0; e > 0 && (o.value = e); } - let ft = null, pt = null, mt = null, ht = !1; - function gt() { - let e = String(a.value?.dataset?.mjrScope || "").trim().toLowerCase(); + let mt = null, ht = null, gt = null, _t = !1; + function vt() { + let e = String(i.value?.dataset?.mjrScope || "").trim().toLowerCase(); we.value !== e && (we.value = e); + let t = String(i.value?.dataset?.mjrViewScope || "").trim().toLowerCase(); + be.value !== t && (be.value = t); } - function _t() { - Bt(); + function yt() { + Ut(); let e = () => { - Bt(), Kt(); + Ut(), Jt(); }; try { requestAnimationFrame(() => { @@ -8087,53 +8572,53 @@ var zu = { 400 ]) setTimeout(e, t); } - Ar(() => { - _t(), window.addEventListener(B.VIEWER_ACTIVE_ASSET_CHANGED, Ie); - }), cr(a, (e) => { + Zn(() => { + yt(), window.addEventListener(B.VIEWER_ACTIVE_ASSET_CHANGED, Ie); + }), or(i, (e) => { try { - pt?.disconnect?.(); + ht?.disconnect?.(); } catch (e) { console.debug?.(e); } - if (pt = null, e) { - gt(); + if (ht = null, e) { + vt(); try { - pt = new MutationObserver(() => { - gt(); - }), pt.observe(e, { + ht = new MutationObserver(() => { + vt(); + }), ht.observe(e, { attributes: !0, - attributeFilter: ["data-mjr-scope"] + attributeFilter: ["data-mjr-scope", "data-mjr-view-scope"] }); } catch (e) { - console.debug?.(e), pt = null; + console.debug?.(e), ht = null; } } - }, { immediate: !0 }), cr(ee, (e, t) => { + }, { immediate: !0 }), or(N, (e, t) => { try { - ft?.disconnect?.(); + mt?.disconnect?.(); } catch (e) { console.debug?.(e); } if (e) { - dt(); + pt(); try { - ft = new ResizeObserver(() => { - dt(); - }), ft.observe(e); + mt = new ResizeObserver(() => { + pt(); + }), mt.observe(e); } catch (e) { - console.debug?.(e), ft = null; + console.debug?.(e), mt = null; } } - }, { immediate: !0 }), cr(() => Ye.value, async () => { - Ve.value && (await lr(), xt(), Vt()); - }), cr(() => x.assets, async (e) => { + }, { immediate: !0 }), or(() => Xe.value, async () => { + He.value && (await qn(), Ct(), Wt()); + }), or(() => x.assets, async (e) => { if (!Array.isArray(e) || e.length === 0) { - let e = a.value; + let e = i.value; e?._mjrStackMembersCache && e._mjrStackMembersCache.clear(); } - await lr(), xt(); + await qn(), Ct(); }); - function vt(e, t) { + function bt(e, t) { let n = String(t?.filename || "").trim().toLowerCase(), r = l.get(e); if (r && r !== n) { let t = x.renderedFilenameMap.get(r); @@ -8146,56 +8631,53 @@ var zu = { let i = x.renderedFilenameMap.get(n); i || (i = /* @__PURE__ */ new Set(), x.renderedFilenameMap.set(n, i)), i.add(e), l.set(e, n); } - function yt(e) { + function xt(e) { if (!e) return; let t = l.get(e); if (!t) return; let n = x.renderedFilenameMap.get(t); n && (n.delete(e), n.size || x.renderedFilenameMap.delete(t)), l.delete(e); } - function bt(e) { + function St(e) { let t = String(e || "").trim().toLowerCase(); if (!t) return; - let n = x.renderedFilenameMap.get(t), r = Array.from(n || []); - if (!r.length) return; - let i = (Array.isArray(x.assets) ? x.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(x.filenameCounts?.get?.(t) || 0) || 0, i.length), o = It(i), s = r.find((e) => { - let t = String(e._mjrAsset?.id || ""), n = String(o?.id || ""); - return t && n && t === n; - }) || r[0] || r[0] || null, c = s?._mjrAsset || o || i[0] || null; - Yt(c, i); - for (let e of r) { - delete e.dataset.mjrDupHidden; - let t = e._mjrAsset; - t && (t._mjrNameCollision = !1, delete t._mjrNameCollisionCount, delete t._mjrNameCollisionPaths, t._mjrDupStack = !1, t._mjrDupMembers = null, t._mjrDupCount = 0, t._mjrDupHidden = !1); - } - if (!s || !c || a < 2) for (let e of r); - else c._mjrDupStack = !0, c._mjrDupMembers = i.length ? i : [c], c._mjrDupCount = c._mjrDupMembers.length, c._mjrNameCollision = !1; + let n = x.renderedFilenameMap.get(t); + for (let e of n || []) e?.dataset?.mjrDupHidden && delete e.dataset.mjrDupHidden; } - function xt() { - for (let e of x.renderedFilenameMap.keys()) bt(e); + function Ct() { + for (let e of x.renderedFilenameMap.keys()) St(e); } - function St(e, t) { + function wt(e, t) { let n = String(e?.id || "").trim(); if (!n) return; if (!t) { let e = x.cardElements.get(n), t = e ? l.get(e) : ""; - yt(e), x.cardElements.delete(n), bt(t); + xt(e), x.cardElements.delete(n), St(t); return; } - let i = t?.$el ?? t; - if (i instanceof HTMLElement) { - x.cardElements.set(n, i), i._mjrIsVue = !0, i._mjrAsset = e, i._mjrReactiveAsset = e, i.dataset.mjrKind = String(e?.kind || ""), vt(i, e), bt(String(e?.filename || "").trim().toLowerCase()); + let a = t?.$el ?? t; + if (a instanceof HTMLElement) { + x.cardElements.set(n, a), a._mjrIsVue = !0, a._mjrAsset = e, a._mjrReactiveAsset = e, a.dataset.mjrKind = String(e?.kind || ""), bt(a, e), St(String(e?.filename || "").trim().toLowerCase()); try { - r.onCardRendered?.(i, e, a.value); + r.onCardRendered?.(a, e, i.value); } catch (e) { console.debug?.(e); } } } - function Ct(e) { - return (t) => St(e, t); + let Tt = /* @__PURE__ */ new Map(); + function Et(e) { + let t = String(e?.id ?? "").trim(); + if (!t) return (t) => wt(e, t); + let n = Tt.get(t); + return n || (n = { + asset: e, + fn: null + }, n.fn = (e) => { + wt(n.asset, e), e || Tt.delete(t); + }, Tt.set(t, n)), n.asset = e, n.fn; } - function wt(e, t) { + function Dt(e, t) { try { let n = e?.closest?.("a, button, input, textarea, select, label"); return !!(n && t?.contains?.(n)); @@ -8203,49 +8685,49 @@ var zu = { return !1; } } - let Tt = { + let Ot = { assetId: "", at: 0 }; - function Et(e, t) { + function kt(e, t) { let n = String(t?.id || "").trim(); if (!n) return; if (e?.type === "click" && Number(e?.detail || 0) > 0) { - let e = Date.now() - Number(Tt.at || 0); - if (Tt.assetId === n && e >= 0 && e < 500) { - Tt.assetId = "", Tt.at = 0; + let e = Date.now() - Number(Ot.at || 0); + if (Ot.assetId === n && e >= 0 && e < 500) { + Ot.assetId = "", Ot.at = 0; return; } } - if (wt(e?.target, e?.currentTarget)) return; + if (Dt(e?.target, e?.currentTarget)) return; let r = Array.isArray(x.assets) ? x.assets : [], i = r.findIndex((e) => String(e?.id || "") === n), a = Array.isArray(x.selectedIds) ? x.selectedIds.slice() : []; if (e?.shiftKey && i >= 0) { let e = String(x.selectionAnchorId || x.activeId || n).trim(), t = r.findIndex((t) => String(t?.id || "") === e), a = t >= 0 ? t : i, o = Math.min(a, i), s = Math.max(a, i), c = r.slice(o, s + 1).map((e) => String(e?.id || "")).filter(Boolean); - k(c, n); + O(c, n); } else if (e?.ctrlKey || e?.metaKey) { let e = new Set(a.map(String)); e.has(n) ? e.delete(n) : e.add(n); let t = Array.from(e); - k(t, e.has(n) ? n : t[0] || ""); + O(t, e.has(n) ? n : t[0] || ""); } else { - k([n], n); + O([n], n); try { x.cardElements.get(n)?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } - ue() && ce(t) && y().then((e) => e?.floatingViewerManager?.isGraphModeVisible?.() ? At(t) : null).catch((e) => console.debug?.(e)); + ue() && le(t) && y().then((e) => e?.floatingViewerManager?.isGraphModeVisible?.() ? Pt(t) : null).catch((e) => console.debug?.(e)); } } - function Dt(e, t) { + function At(e, t) { if (Number(e?.button ?? 0) !== 0) return; let n = String(t?.id || "").trim(); if (!n) return; let r = Array.isArray(x.selectedIds) ? x.selectedIds.map(String).filter(Boolean) : []; - r.includes(n) && r.length > 1 && !e?.ctrlKey && !e?.metaKey && !e?.shiftKey ? (Tt.assetId = n, Tt.at = Date.now()) : (Tt.assetId = n, Tt.at = Date.now(), Et(e, t)); + r.includes(n) && r.length > 1 && !e?.ctrlKey && !e?.metaKey && !e?.shiftKey ? (Ot.assetId = n, Ot.at = Date.now()) : (Ot.assetId = n, Ot.at = Date.now(), kt(e, t)); } - async function Ot(e) { - let t = (Array.isArray(x.assets) ? x.assets : []).filter((e) => !se(e)), n = t.findIndex((t) => String(t?.id || "") === String(e?.id || "")); + async function Mt(e) { + let t = (Array.isArray(x.assets) ? x.assets : []).filter((e) => !ce(e)), n = t.findIndex((t) => String(t?.id || "") === String(e?.id || "")); if (!t.length || n < 0) return; let { requestViewerOpen: r } = await v(); r({ @@ -8253,7 +8735,7 @@ var zu = { index: n }); } - function kt(e, t = null) { + function Nt(e, t = null) { let n = String(e?.id || "").trim(); if (!n) return; let r = x.cardElements.get(n); @@ -8270,13 +8752,13 @@ var zu = { console.debug?.(e); } } - async function At(e, { select: t = !1 } = {}) { + async function Pt(e, { select: t = !1 } = {}) { try { let n = String(e?.id || "").trim(); - t && n && k([n], n); + t && n && O([n], n); let r = String(e?.filepath || e?.path || e?.full_path || "").trim(), i = e; if (r) try { - let t = await S(r, { timeoutMs: 25e3 }), n = t?.data?.workflow || t?.workflow || null, a = t?.data?.prompt || t?.prompt || null; + let t = await Le(r, { timeoutMs: 25e3 }), n = t?.data?.workflow || t?.workflow || null, a = t?.data?.prompt || t?.prompt || null; (n || a) && (i = { ...e, workflow: n || e?.workflow, @@ -8300,23 +8782,23 @@ var zu = { console.debug?.(e), Ne(); } } - async function jt(e, t) { + async function Ft(e, t) { let n = String(e?.type || "").trim().toLowerCase(); if (n && String(t?.kind || "").toLowerCase() === "workflow") { - if (n === "load") await Mt(t); - else if (n === "inspect") await At(t, { select: !0 }); + if (n === "load") await It(t); + else if (n === "inspect") await Pt(t, { select: !0 }); else if (n === "favorite") { let e = !!t.favorite, n = !e; try { t.favorite = n; let e = String(t?.filepath || t?.path || t?.full_path || "").trim(); if (!e) throw Error("Missing workflow filepath"); - let r = await fe({ + let r = await j({ filepath: e, favorite: n }, { timeoutMs: 12e3 }); if (!r?.ok) throw Error(String(r?.error || "Failed to save workflow favorite")); - a.value?.dispatchEvent?.(new CustomEvent("mjr:workflow-favorite-changed", { + i.value?.dispatchEvent?.(new CustomEvent("mjr:workflow-favorite-changed", { bubbles: !0, detail: { asset: t, @@ -8324,55 +8806,55 @@ var zu = { } })); } catch (n) { - console.debug?.(n), t.favorite = e, I(R("toast.workflowFavoriteFailed", "Failed to update workflow favorite."), "error"); + console.debug?.(n), t.favorite = e, F(L("toast.workflowFavoriteFailed", "Failed to update workflow favorite."), "error"); } - } else n === "menu" && kt(t, e?.event || null); + } else n === "menu" && Nt(t, e?.event || null); } } - async function Mt(e) { + async function It(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) { - I(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); + F(L("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let n = tt(); - if (ze(n) === !0 && !await Gt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; - let r = await S(t, { timeoutMs: 3e4 }), a = r?.data?.workflow || r?.workflow || null; - if (!r?.ok || !a || typeof a != "object") I(r?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); - else if (!Fe(a, n).ok) I(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); + let n = $e(); + if (a(n) === !0 && !await jt(L("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), L("tab.workflow", "Workflow"))) return; + let r = await Le(t, { timeoutMs: 3e4 }), i = r?.data?.workflow || r?.workflow || null; + if (!r?.ok || !i || typeof i != "object") F(r?.error || L("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + else if (!te(i, n).ok) F(L("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); else { try { - await i({ filepath: t }, { timeoutMs: 1e4 }); + await Ze({ filepath: t }, { timeoutMs: 1e4 }); } catch (e) { console.debug?.(e); } - I(R("toast.workflowLoaded", "Workflow loaded"), "success", 1800); + F(L("toast.workflowLoaded", "Workflow loaded"), "success", 1800); } } - function Nt(e) { + function Lt(e) { try { if (typeof r.onCardDblclick == "function") { r.onCardDblclick({ asset: e, assets: Array.isArray(x.assets) ? x.assets : [], - gridContainer: a.value + gridContainer: i.value }); return; } } catch (e) { console.debug?.(e); } - if (se(e)) try { - a.value?.dispatchEvent?.(new CustomEvent("mjr:open-folder-asset", { + if (ce(e)) try { + i.value?.dispatchEvent?.(new CustomEvent("mjr:open-folder-asset", { bubbles: !0, detail: { asset: e } })); } catch (e) { console.debug?.(e); } - else String(e?.kind || "").toLowerCase() === "workflow" ? Mt(e) : Ot(e); + else String(e?.kind || "").toLowerCase() === "workflow" ? It(e) : Mt(e); } - async function Pt({ asset: e, folderPath: n }) { + async function Rt({ asset: e, folderPath: n }) { let r = String(e?.filepath || "").trim(); if (r && n) try { let e = await t({ @@ -8380,26 +8862,26 @@ var zu = { path: r, destination: n }); - e?.ok ? (I("Moved to folder", "success"), F.reload()) : I(e?.error || "Failed to move file", "error"); + e?.ok ? (F("Moved to folder", "success"), I.reload()) : F(e?.error || "Failed to move file", "error"); } catch (e) { - I(e?.message || "Failed to move file", "error"); + F(e?.message || "Failed to move file", "error"); } } - let Ft = null, Lt = null, Rt = 0, zt = ""; - function Bt() { - dt(); + let zt = null, Bt = null, Vt = 0, Ht = ""; + function Ut() { + pt(); try { - Ze.value?.measure?.(); + Qe.value?.measure?.(); } catch (e) { console.debug?.(e); } } - function Vt() { + function Wt() { if (!u) try { u = requestAnimationFrame(() => { u = 0; try { - Ze.value?.measure?.(); + Qe.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -8407,34 +8889,34 @@ var zu = { } catch (e) { console.debug?.(e), u = 0; try { - Ze.value?.measure?.(); + Qe.value?.measure?.(); } catch (e) { console.debug?.(e); } } } - function Ht() { - Bt(), requestAnimationFrame(() => { + function Gt() { + Ut(), requestAnimationFrame(() => { requestAnimationFrame(() => { - Bt(), Kt(); + Ut(), Jt(); }); }), setTimeout(() => { - Bt(), Kt(); + Ut(), Jt(); }, 150); } - function Ut(e) { + function Kt(e) { if (!e || !r.virtualize) return () => {}; let t = () => { - Ke(e); + qe(e); }; e.addEventListener("scroll", t, { passive: !0 }); try { requestAnimationFrame(() => { - t(), Kt(); + t(), Jt(); }); } catch { setTimeout(() => { - t(), Kt(); + t(), Jt(); }, 0); } return () => { @@ -8443,21 +8925,21 @@ var zu = { } catch (e) { console.debug?.(e); } - qe(); + Je(); }; } - cr(ee, (e) => { + or(N, (e) => { try { - Ft?.(); + zt?.(); } catch (e) { console.debug?.(e); } - Ft = Ut(e); + zt = Kt(e); }, { immediate: !0 }); - function Wt(e) { + function qt(e) { let t = Number(e?.clientHeight || 0) || 0; if (t > 0) return t; - let n = Number(a.value?.clientHeight || 0) || 0; + let n = Number(i.value?.clientHeight || 0) || 0; if (n > 0) return n; try { return Math.max(0, Math.floor(Number(window?.innerHeight || 0) * .7)); @@ -8465,43 +8947,43 @@ var zu = { return 0; } } - async function Kt() { - if (!r.virtualize || !Ve.value || x.loading || x.done) return; - let e = ee.value; + async function Jt() { + if (!r.virtualize || !He.value || x.loading || x.done) return; + let e = N.value; if (!e) return; let t = Array.isArray(x.assets) ? x.assets.length : 0, n = `${t}::${Be.value}`; - if (!Lt && !(n === zt && Date.now() - Rt < 500) && (await lr(), (Number(e.scrollHeight || 0) || 0) <= Wt(e) + 40)) { + if (!Bt && !(n === Ht && Date.now() - Vt < 500) && (await qn(), (Number(e.scrollHeight || 0) || 0) <= qt(e) + 40)) { let e = t; - Lt = Promise.resolve(F.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { + Bt = Promise.resolve(I.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { let t = Array.isArray(x.assets) ? x.assets.length : 0; - Rt = Date.now(), zt = t === e ? n : "", Lt = null, setTimeout(() => { - Kt(); + Vt = Date.now(), Ht = t === e ? n : "", Bt = null, setTimeout(() => { + Jt(); }, 0); }); } } - cr(() => `${Array.isArray(x.assets) ? x.assets.length : 0}::${Be.value}::${x.loading}::${x.done}`, () => { - Kt(); + or(() => `${Array.isArray(x.assets) ? x.assets.length : 0}::${Be.value}::${x.loading}::${x.done}`, () => { + Jt(); }, { flush: "post" }); - function qt(e) { + function Yt(e) { if (e && r.virtualize) try { - Ze.value.measureElement(e); + Qe.value.measureElement(e); } catch (e) { console.debug?.(e); } } - function Jt() { + function Xt() { return { - width: `${Ue.value}px`, - flex: `0 0 ${Ue.value}px`, - minWidth: `${Ue.value}px` + width: `${We.value}px`, + flex: `0 0 ${We.value}px`, + minWidth: `${We.value}px` }; } - function Xt(e) { - return et.value.get(e) || null; - } function Zt(e) { - let t = Xt(e); + return tt.value.get(e) || null; + } + function Qt(e) { + let t = Zt(e); return { position: "absolute", left: "0", @@ -8509,52 +8991,52 @@ var zu = { transform: `translateY(${Number(t?.start || 0)}px)`, width: "100%", display: "flex", - gap: `${He.value}px`, - paddingBottom: `${He.value}px`, - boxSizing: "border-box" - }; - } - function Qt() { - return { - display: "flex", - gap: `${He.value}px`, - paddingBottom: `${He.value}px`, + gap: `${Ue.value}px`, + paddingBottom: `${Ue.value}px`, boxSizing: "border-box" }; } function $t() { - s.value += 1, r.applyDefaultSettingsClasses && a.value && fi(a.value); + return { + display: "flex", + gap: `${Ue.value}px`, + paddingBottom: `${Ue.value}px`, + boxSizing: "border-box" + }; } - return cr(() => r.applyDefaultSettingsClasses, () => { - a.value && r.applyDefaultSettingsClasses && fi(a.value); - }, { immediate: !0 }), pr(() => { + function en() { + s.value += 1, r.applyDefaultSettingsClasses && i.value && ni(i.value); + } + return or(() => r.applyDefaultSettingsClasses, () => { + i.value && r.applyDefaultSettingsClasses && ni(i.value); + }, { immediate: !0 }), ar(() => { try { window.removeEventListener(B.VIEWER_ACTIVE_ASSET_CHANGED, Ie); } catch (e) { console.debug?.(e); } try { - a.value?._mjrPrimaryPointerSelectionUnbind?.(); + i.value?._mjrPrimaryPointerSelectionUnbind?.(); } catch (e) { console.debug?.(e); } try { - a.value && (a.value._mjrPrimaryPointerSelectionUnbind = null, a.value._mjrSelectionManagedByVue = !1); + i.value && (i.value._mjrPrimaryPointerSelectionUnbind = null, i.value._mjrSelectionManagedByVue = !1); } catch (e) { console.debug?.(e); } try { - ft?.disconnect?.(); + mt?.disconnect?.(); } catch (e) { console.debug?.(e); } try { - pt?.disconnect?.(); + ht?.disconnect?.(); } catch (e) { console.debug?.(e); } try { - Ft?.(); + zt?.(); } catch (e) { console.debug?.(e); } @@ -8563,88 +9045,88 @@ var zu = { } catch (e) { console.debug?.(e); } - u = 0, qe(); + u = 0, Je(); try { - F.dispose(); + I.dispose(); } catch (e) { console.debug?.(e); } try { - mt?.(); + gt?.(); } catch (e) { console.debug?.(e); } - mt = null; + gt = null; try { - window.removeEventListener("mjr-settings-changed", $t), ht = !1; + window.removeEventListener("mjr-settings-changed", en), _t = !1; } catch (e) { console.debug?.(e); } try { - window.removeEventListener("mjr:keepalive-attached", Ht); + window.removeEventListener("mjr:keepalive-attached", Gt); } catch (e) { console.debug?.(e); } - }), cr(a, (e) => { - e && (ht ||= (window.addEventListener("mjr-settings-changed", $t), window.addEventListener("mjr:keepalive-attached", Ht), !0)); + }), or(i, (e) => { + e && (_t ||= (window.addEventListener("mjr-settings-changed", en), window.addEventListener("mjr:keepalive-attached", Gt), !0)); }, { immediate: !0 }), n({ get gridContainer() { - return a.value; + return i.value; }, get assets() { return Array.isArray(x.assets) ? x.assets : []; }, loadAssets(...e) { - return F.loadAssets(...e); + return I.loadAssets(...e); }, loadAssetsFromList(...e) { - return F.loadAssetsFromList(...e); + return I.loadAssetsFromList(...e); }, loadNextPage(...e) { - return F.loadNextPage(...e); + return I.loadNextPage(...e); }, appendNextPage(...e) { - return F.appendNextPage(...e); + return I.appendNextPage(...e); }, refreshHead(...e) { - return F.refreshHead(...e); + return I.refreshHead(...e); }, upsertRealtime(...e) { - return F.upsertRealtime(...e); + return I.upsertRealtime(...e); }, prepareGridForScopeSwitch(...e) { - return F.prepareGridForScopeSwitch(...e); + return I.prepareGridForScopeSwitch(...e); }, refreshGrid(...e) { - return F.refreshGrid(...e); + return I.refreshGrid(...e); }, removeAssets(...e) { - return F.removeAssets(...e); + return I.removeAssets(...e); }, upsertAsset(...e) { - return F.upsertAsset(...e); + return I.upsertAsset(...e); }, getCanonicalState(...e) { - return F.getCanonicalState(...e); + return I.getCanonicalState(...e); }, getDebugSnapshot(...e) { - return F.getDebugSnapshot(...e); + return I.getDebugSnapshot(...e); }, captureAnchor(...e) { - return F.captureAnchor(...e); + return I.captureAnchor(...e); }, restoreAnchor(...e) { - return F.restoreAnchor(...e); + return I.restoreAnchor(...e); }, hydrateFromSnapshot(...e) { - return F.hydrateFromSnapshot(...e); + return I.hydrateFromSnapshot(...e); }, dispose() { - return F.dispose(); + return I.dispose(); } - }), (t, n) => (K(), Y("div", { + }), (t, n) => (q(), Y("div", { ref_key: "gridContainerRef", - ref: a, + ref: i, class: "mjr-grid", tabindex: "0", role: "grid", @@ -8653,27 +9135,27 @@ var zu = { "min-height": "100%" } }, [ - X(x).loading && !X(x).assets.length ? (K(), Y("div", zu, [H("div", Bu, [H("div", { + Z(x).loading && !Z(x).assets.length ? (q(), Y("div", hd, [H("div", gd, [H("div", { class: "mjr-grid-skeleton-layout", - style: xr(at.value) - }, [(K(!0), Y(V, null, hr(rt.value, (e) => (K(), Y("div", { + style: fr(ot.value) + }, [(q(!0), Y(V, null, $n(it.value, (e) => (q(), Y("div", { key: `sk-${e}`, class: "mjr-grid-skeleton-card", - style: xr(ot.value) + style: fr(st.value) }, [H("div", { class: "mjr-grid-skeleton-thumb mjr-grid-skeleton-shimmer", - style: xr(st.value) - }, null, 4), H("div", { style: xr(ut.value) }, [H("div", { + style: fr(ct.value) + }, null, 4), H("div", { style: fr(ft.value) }, [H("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--title mjr-grid-skeleton-shimmer", - style: xr(ct.value) + style: fr(lt.value) }, null, 4), H("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--meta mjr-grid-skeleton-shimmer", - style: xr(lt.value) - }, null, 4)], 4)], 4))), 128))], 4), H("div", Vu, q(X(x).loadingMessage || "Loading assets..."), 1)])])) : W("", !0), - X(x).statusMessage && !X(x).assets.length && !X(x).loading ? (K(), Y("div", { + style: fr(dt.value) + }, null, 4)], 4)], 4))), 128))], 4), H("div", _d, J(Z(x).loadingMessage || "Loading assets..."), 1)])])) : W("", !0), + Z(x).statusMessage && !Z(x).assets.length && !Z(x).loading ? (q(), Y("div", { key: 1, class: "mjr-grid-message", - style: xr({ + style: fr({ position: "absolute", inset: "0", zIndex: 3, @@ -8685,42 +9167,42 @@ var zu = { pointerEvents: "none", fontSize: "14px", lineHeight: "1.4", - color: X(x).statusError ? "var(--error-text, #f44336)" : "var(--muted-text, #bdbdbd)", + color: Z(x).statusError ? "var(--error-text, #f44336)" : "var(--muted-text, #bdbdbd)", background: "rgba(0, 0, 0, 0.35)" }) - }, q(X(x).statusMessage), 5)) : W("", !0), - e.virtualize ? (K(), Y("div", { + }, J(Z(x).statusMessage), 5)) : W("", !0), + e.virtualize ? (q(), Y("div", { key: 2, - style: xr({ - height: `${X($e)}px`, + style: fr({ + height: `${Z(et)}px`, position: "relative", width: "100%", gridColumn: "1 / -1" }) - }, [(K(!0), Y(V, null, hr(X(Qe), (e) => (K(), Y("div", { + }, [(q(!0), Y(V, null, $n(Z(z), (e) => (q(), Y("div", { key: e.key, ref_for: !0, - ref: qt, + ref: Yt, "data-index": e.index, - style: xr(Zt(e.index)) - }, [e.kind === "header" ? (K(), Y("button", { + style: fr(Qt(e.index)) + }, [e.kind === "header" ? (q(), Y("button", { key: 0, type: "button", - class: Q(["mjr-grid-group-separator", ke(e)]), + class: X(["mjr-grid-group-separator", ke(e)]), "aria-expanded": De(e.groupKey) ? "false" : "true", title: `${De(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => Oe(e.groupKey) - }, [H("span", Wu, [H("i", { class: Q(["pi", De(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), H("span", Gu, q(e.title), 1)], 10, Uu)) : e.items.length ? (K(!0), Y(V, { key: 1 }, hr(e.items, (e) => (K(), Y(V, { key: String(e.id) }, [se(e) ? (K(), ir(fc, { + }, [H("span", bd, [H("i", { class: X(["pi", De(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), H("span", xd, J(e.title), 1)], 10, yd)) : e.items.length ? (q(!0), Y(V, { key: 1 }, $n(e.items, (e) => (q(), Y(V, { key: String(e.id) }, [ce(e) ? (q(), Jn(Fc, { key: 0, ref_for: !0, - ref: Ct(e), + ref: Et(e), asset: e, - selected: oe(e), - style: xr(Jt()), - onMousedown: mr((t) => Dt(t, e), ["left"]), - onClick: (t) => Et(t, e), - onDblclick: mr((t) => Nt(e), ["stop"]), - onDropAsset: Pt + selected: se(e), + style: fr(Xt()), + onMousedown: rr((t) => At(t, e), ["left"]), + onClick: (t) => kt(t, e), + onDblclick: rr((t) => Lt(e), ["stop"]), + onDropAsset: Rt }, null, 8, [ "asset", "selected", @@ -8728,57 +9210,57 @@ var zu = { "onMousedown", "onClick", "onDblclick" - ])) : (K(), Y("div", { + ])) : (q(), Y("div", { key: 1, ref_for: !0, - ref: Ct(e), - class: Q(["mjr-asset-card mjr-card", { - "is-selected": oe(e), - "mjr-live-placeholder": ve(e) + ref: Et(e), + class: X(["mjr-asset-card mjr-card", { + "is-selected": se(e), + "mjr-live-placeholder": _e(e) }]), role: "button", tabindex: "0", draggable: "true", - style: xr(Jt()), + style: fr(Xt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), - "data-mjr-ext": ie(e), - "data-mjr-stem": ae(e), + "data-mjr-ext": ae(e), + "data-mjr-stem": oe(e), "data-mjr-kind": String(e.kind || ""), - "data-mjr-live-placeholder": ve(e) ? "true" : void 0, - "data-mjr-stacked": _e(e) ? "true" : void 0, - "data-mjr-stack-count": _e(e) ? String(e.stack_asset_count || 0) : void 0, + "data-mjr-live-placeholder": _e(e) ? "true" : void 0, + "data-mjr-stacked": ge(e) ? "true" : void 0, + "data-mjr-stack-count": ge(e) ? String(e.stack_asset_count || 0) : void 0, "data-mjr-dup-stacked": e._mjrDupStack ? "true" : void 0, "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, - "aria-selected": oe(e) ? "true" : "false", - onMousedown: mr((t) => Dt(t, e), ["left"]), - onClick: (t) => Et(t, e), - onDblclick: mr((t) => Nt(e), ["stop"]) - }, [J(cc, { + "aria-selected": se(e) ? "true" : "false", + onMousedown: rr((t) => At(t, e), ["left"]), + onClick: (t) => kt(t, e), + onDblclick: rr((t) => Lt(e), ["stop"]) + }, [U(jc, { asset: e, - onWorkflowAction: (t) => jt(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Ku))], 64))), 128)) : W("", !0)], 12, Hu))), 128))], 4)) : (K(), Y("div", qu, [(K(!0), Y(V, null, hr(Ge.value, (e) => (K(), Y("div", { + onWorkflowAction: (t) => Ft(t, e) + }, null, 8, ["asset", "onWorkflowAction"])], 46, Sd))], 64))), 128)) : W("", !0)], 12, vd))), 128))], 4)) : (q(), Y("div", Cd, [(q(!0), Y(V, null, $n(Ke.value, (e) => (q(), Y("div", { key: `${e.kind || "assets"}-${e.groupKey || ""}-${e.index ?? ""}`, - style: xr(Qt()) - }, [e.kind === "header" ? (K(), Y("button", { + style: fr($t()) + }, [e.kind === "header" ? (q(), Y("button", { key: 0, type: "button", - class: Q(["mjr-grid-group-separator", ke(e)]), + class: X(["mjr-grid-group-separator", ke(e)]), "aria-expanded": De(e.groupKey) ? "false" : "true", title: `${De(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => Oe(e.groupKey) - }, [H("span", Yu, [H("i", { class: Q(["pi", De(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), H("span", Xu, q(e.title), 1)], 10, Ju)) : (K(!0), Y(V, { key: 1 }, hr(e.items, (e) => (K(), Y(V, { key: String(e.id) }, [se(e) ? (K(), ir(fc, { + }, [H("span", Td, [H("i", { class: X(["pi", De(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), H("span", Ed, J(e.title), 1)], 10, wd)) : (q(!0), Y(V, { key: 1 }, $n(e.items, (e) => (q(), Y(V, { key: String(e.id) }, [ce(e) ? (q(), Jn(Fc, { key: 0, ref_for: !0, - ref: Ct(e), + ref: Et(e), asset: e, - selected: oe(e), - style: xr(Jt()), - onMousedown: mr((t) => Dt(t, e), ["left"]), - onClick: (t) => Et(t, e), - onDblclick: mr((t) => Nt(e), ["stop"]), - onDropAsset: Pt + selected: se(e), + style: fr(Xt()), + onMousedown: rr((t) => At(t, e), ["left"]), + onClick: (t) => kt(t, e), + onDblclick: rr((t) => Lt(e), ["stop"]), + onDropAsset: Rt }, null, 8, [ "asset", "selected", @@ -8786,40 +9268,40 @@ var zu = { "onMousedown", "onClick", "onDblclick" - ])) : (K(), Y("div", { + ])) : (q(), Y("div", { key: 1, ref_for: !0, - ref: Ct(e), - class: Q(["mjr-asset-card mjr-card", { - "is-selected": oe(e), - "mjr-live-placeholder": ve(e) + ref: Et(e), + class: X(["mjr-asset-card mjr-card", { + "is-selected": se(e), + "mjr-live-placeholder": _e(e) }]), role: "button", tabindex: "0", draggable: "true", - style: xr(Jt()), + style: fr(Xt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), - "data-mjr-ext": ie(e), - "data-mjr-stem": ae(e), + "data-mjr-ext": ae(e), + "data-mjr-stem": oe(e), "data-mjr-kind": String(e.kind || ""), - "data-mjr-live-placeholder": ve(e) ? "true" : void 0, - "data-mjr-stacked": _e(e) ? "true" : void 0, - "data-mjr-stack-count": _e(e) ? String(e.stack_asset_count || 0) : void 0, + "data-mjr-live-placeholder": _e(e) ? "true" : void 0, + "data-mjr-stacked": ge(e) ? "true" : void 0, + "data-mjr-stack-count": ge(e) ? String(e.stack_asset_count || 0) : void 0, "data-mjr-dup-stacked": e._mjrDupStack ? "true" : void 0, "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, - "aria-selected": oe(e) ? "true" : "false", - onMousedown: mr((t) => Dt(t, e), ["left"]), - onClick: (t) => Et(t, e), - onDblclick: mr((t) => Nt(e), ["stop"]) - }, [J(cc, { + "aria-selected": se(e) ? "true" : "false", + onMousedown: rr((t) => At(t, e), ["left"]), + onClick: (t) => kt(t, e), + onDblclick: rr((t) => Lt(e), ["stop"]) + }, [U(jc, { asset: e, - onWorkflowAction: (t) => jt(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Zu))], 64))), 128))], 4))), 128))])), + onWorkflowAction: (t) => Ft(t, e) + }, null, 8, ["asset", "onWorkflowAction"])], 46, Dd))], 64))), 128))], 4))), 128))])), H("div", { ref_key: "infiniteSentinelRef", - ref: re, + ref: ie, "aria-hidden": "true", style: { height: "1px", @@ -8830,14 +9312,14 @@ var zu = { }, null, 512) ], 512)); } -}), ed = 240, td = 120, nd = 80, rd = null, id = null; -function ad() { - return rd ||= import("./chunks/viewerOpenRequest-WCeGPIlE.js").then((e) => e.n), rd; +}), Ad = 240, jd = 120, Md = 80, Nd = null, Pd = null; +function Fd() { + return Nd ||= import("./chunks/viewerOpenRequest-WOJE90Gn.js").then((e) => e.n), Nd; } -function od() { - return id ||= import("./chunks/floatingViewerManager-BzaQii21.js").then((e) => e.n), id; +function Id() { + return Pd ||= import("./chunks/floatingViewerManager-B_I-SRbd.js").then((e) => e.n), Pd; } -function sd(e) { +function Ld(e) { let t = document.createElement("button"); t.type = "button", t.className = "mjr-asset-card mjr-card mjr-feed-group-member-card", t.style.cssText = "display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;min-height:110px;padding:8px;border:1px solid var(--mjr-border,#444);border-radius:8px;background:var(--mjr-surface,#202020);color:inherit;text-align:left;overflow:hidden;"; try { @@ -8848,7 +9330,7 @@ function sd(e) { let n = document.createElement("div"); return n.className = "mjr-feed-group-member-name", n.style.cssText = "font-size:11px;font-weight:600;line-height:1.3;word-break:break-word;", n.textContent = String(e?.filename || "Asset"), t.appendChild(n), t; } -function cd(e) { +function Rd(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -8863,11 +9345,11 @@ function cd(e) { return console.debug?.(e), []; } } -function ld(e, t, n = "") { +function zd(e, t, n = "") { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : []; - return er(e, r, { activeId: n || r[0] || "" }, cd); + return dt(e, r, { activeId: n || r[0] || "" }, Rd); } -function ud(e) { +function Bd(e) { let t = e?.grid; if (!t) return; let n = (e) => { @@ -8883,16 +9365,16 @@ function ud(e) { } catch (e) { console.debug?.(e); } - let a = cd(t), o = a.indexOf(n), s = Xn(t); + let a = Rd(t), o = a.indexOf(n), s = yt(t); if (e.shiftKey && o >= 0) { let n = Number.isFinite(Number(t._mjrLastSelectedIndex)) ? Number(t._mjrLastSelectedIndex) : o, r = Math.min(n, o), s = Math.max(n, o), c = a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean); - ld(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); + zd(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); } else if (e.ctrlKey || e.metaKey) { s.has(i) ? s.delete(i) : s.add(i); let n = Array.from(s); - ld(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); + zd(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); } else { - ld(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); + zd(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); try { n.focus?.({ preventScroll: !0 }); } catch (e) { @@ -8909,23 +9391,23 @@ function ud(e) { } }; } -var dd = { +var Vd = { hosts: /* @__PURE__ */ new Set(), pendingAssets: /* @__PURE__ */ new Map() }; -function fd(e) { - if (!z.EXECUTION_GROUPING_ENABLED) return Dd(e); +function Hd(e) { + if (!R.EXECUTION_GROUPING_ENABLED) return rf(e); let t = String(e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.job_id || "").trim(); - return n ? `job:${n}` : Dd(e); + return n ? `job:${n}` : rf(e); } -function pd(e) { +function Ud(e) { let t = /* @__PURE__ */ new Map(); for (let n of Array.isArray(e) ? e : []) { - let e = kd(n); + let e = of(n); if (!e) continue; - let r = fd(e), i = t.get(r); + let r = Hd(e), i = t.get(r); i || (i = { key: r, members: [] @@ -8950,16 +9432,16 @@ function pd(e) { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }), n; } -function md(e) { +function Wd(e) { return Array.from(e?.assetsByKey?.values?.() || []); } -function hd(e) { +function Gd(e) { return String(e ?? "").trim().toLowerCase(); } -function gd(e) { +function Kd(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function _d(e) { +function qd(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -8968,19 +9450,19 @@ function _d(e) { } return e; } -function vd(e) { +function Jd(e) { if (!e || typeof e != "object") return ""; - let t = hd(e?.type || e?.source || "output"), n = hd(e?.root_id || e?.custom_root_id || ""), r = hd(e?.subfolder || ""), i = hd(e?.filename || ""); + let t = Gd(e?.type || e?.source || "output"), n = Gd(e?.root_id || e?.custom_root_id || ""), r = Gd(e?.subfolder || ""), i = Gd(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = hd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = Gd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function yd(e, t) { - let n = kd(t); +function Yd(e, t) { + let n = of(t); if (!e || typeof e.set != "function" || !n) return null; - let r = Dd(n), i = vd(n), a = ""; + let r = rf(n), i = Jd(n), a = ""; if (i) { - for (let [t, n] of e.entries()) if (vd(n) === i) { + for (let [t, n] of e.entries()) if (Jd(n) === i) { a = t; break; } @@ -8989,17 +9471,17 @@ function yd(e, t) { ...o, ...n } : n; - return gd(n) || _d(s), a && a !== r && e.delete(a), e.set(r, s), s; + return Kd(n) || qd(s), a && a !== r && e.delete(a), e.set(r, s), s; } -function bd(e, t) { - return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), yd(e.assetsByKey, t)) : null; +function Xd(e, t) { + return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), Yd(e.assetsByKey, t)) : null; } -function xd(e) { +function Zd(e) { e?.grid && e.loaded && (e._renderTimer ||= setTimeout(() => { - e._renderTimer = null, Ed(e); - }, nd)); + e._renderTimer = null, nf(e); + }, Md)); } -function Sd(e, t, n = 0) { +function Qd(e, t, n = 0) { let r = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets.filter(Boolean) : [t].filter(Boolean); if (!r.length) return; let i = Math.max(0, Math.min(n, r.length - 1)), a = r[i] || null, o = String(a?.id || "").trim(); @@ -9009,52 +9491,52 @@ function Sd(e, t, n = 0) { } catch (e) { console.debug?.(e); } - ld(e.grid, [o], o); + zd(e.grid, [o], o); } - ad().then((e) => e.requestViewerOpen({ + Fd().then((e) => e.requestViewerOpen({ assets: r, index: i })).catch((e) => console.debug?.(e)); } -function Cd(e, t) { +function $d(e, t) { let n = document.createElement("div"); n.className = "mjr-popover mjr-feed-group-popover", n.style.cssText = "display:none; width:min(440px, 92vw); padding:10px;"; let r = document.createElement("div"); - r.className = "mjr-feed-group-popover-title", r.textContent = R("bottomFeed.groupTitle", "Generation group"), r.style.cssText = "font-size:12px; font-weight:700; opacity:0.92; margin-bottom:8px;", n.appendChild(r); + r.className = "mjr-feed-group-popover-title", r.textContent = L("bottomFeed.groupTitle", "Generation group"), r.style.cssText = "font-size:12px; font-weight:700; opacity:0.92; margin-bottom:8px;", n.appendChild(r); let i = document.createElement("div"); i.className = "mjr-feed-group-popover-grid", i.style.cssText = "display:grid; grid-template-columns:repeat(auto-fill, minmax(110px, 1fr)); gap:8px; max-height:360px; overflow-y:auto; overscroll-behavior:contain;"; let a = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets : []; for (let r = 0; r < a.length; r += 1) { - let o = a[r], s = sd(o); + let o = a[r], s = Ld(o); s.classList.add("mjr-feed-group-member-card"), r === 0 && s.classList.add("mjr-feed-group-member-card--cover"), s.addEventListener("click", (i) => { - i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Sd(e, t, r); + i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Qd(e, t, r); }), i.appendChild(s); } return n.appendChild(i), e.root.appendChild(n), n; } -function wd(e, t, n) { +function ef(e, t, n) { if (!t || !n) return; let r = Number(n?._mjrFeedGroupCount || 0) || 0; if (r <= 1 || (t.dataset.mjrFeedGrouped = "true", t.dataset.mjrFeedGroupCount = String(r), t.dataset.mjrStacked = "true", t.dataset.mjrStackCount = String(r), t.querySelector(".mjr-feed-group-button"))) return; let i = document.createElement("button"); - i.type = "button", i.className = "mjr-feed-group-button", i.title = R("bottomFeed.groupOpen", "Show other assets from this generation"), i.setAttribute("aria-label", `${r} assets`); + i.type = "button", i.className = "mjr-feed-group-button", i.title = L("bottomFeed.groupOpen", "Show other assets from this generation"), i.setAttribute("aria-label", `${r} assets`); let a = document.createElement("span"); a.className = "mjr-feed-group-button-icon pi pi-clone", i.appendChild(a); let o = document.createElement("span"); - o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", Ka(i); - let s = Cd(e, n); + o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", go(i); + let s = $d(e, n); i.addEventListener("click", (t) => { t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(s, i); }), t.appendChild(i); } -function Td(e, t) { +function tf(e, t) { let n = new Map((Array.isArray(t) ? t : []).map((e) => [String(e?.id || "").trim(), e]).filter(([e]) => !!e)); - for (let t of cd(e?.grid)) { + for (let t of Rd(e?.grid)) { let r = String(t?.dataset?.mjrAssetId || "").trim(), i = n.get(r); - i && wd(e, t, i); + i && ef(e, t, i); } } -async function Ed(e) { +async function nf(e) { if (!e?.grid) return; try { e.popoverManager?.closeAll?.(); @@ -9067,19 +9549,19 @@ async function Ed(e) { } catch (e) { console.debug?.(e); } - let t = pd(md(e)), n = await _i(e.grid, t, { - title: R("bottomFeed.title", "Generated Feed"), + let t = Ud(Wd(e)), n = await si(e.grid, t, { + title: L("bottomFeed.title", "Generated Feed"), reset: !0 }); - Td(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + tf(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = L("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } -function Dd(e) { +function rf(e) { let t = String(e?.id || "").trim(); if (t) return `id:${t}`; let n = String(e?.filename || "").trim(), r = String(e?.subfolder || "").trim(); return `file:${String(e?.source || e?.type || "").trim()}:${r}:${n}`; } -function Od(e) { +function af(e) { let t = String(e || "").split(".").pop()?.toUpperCase() ?? "", n = /* @__PURE__ */ new Set([ "MP4", "WEBM", @@ -9106,85 +9588,85 @@ function Od(e) { ]); return n.has(t) ? "video" : r.has(t) ? "audio" : i.has(t) ? "model3d" : "image"; } -function kd(e) { +function of(e) { if (!e || typeof e != "object") return null; let t = { ...e }; - return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= Od(t.ext || t.filename || ""), t; + return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= af(t.ext || t.filename || ""), t; } -function Ad(e) { - let t = kd(e); +function sf(e) { + let t = of(e); if (!t) return null; - let n = Dd(t); + let n = rf(t); if (!n) return null; - let r = vd(t), i = null; - if (r) for (let [e, t] of dd.pendingAssets.entries()) e !== n && vd(t) === r && (i = t, dd.pendingAssets.delete(e)); - let a = dd.pendingAssets.get(n) || i || null, o = a ? { + let r = Jd(t), i = null; + if (r) for (let [e, t] of Vd.pendingAssets.entries()) e !== n && Jd(t) === r && (i = t, Vd.pendingAssets.delete(e)); + let a = Vd.pendingAssets.get(n) || i || null, o = a ? { ...a, ...t } : t; - if (gd(t) || _d(o), dd.pendingAssets.set(n, o), dd.pendingAssets.size > 64) { - let e = dd.pendingAssets.keys().next().value; - e && dd.pendingAssets.delete(e); + if (Kd(t) || qd(o), Vd.pendingAssets.set(n, o), Vd.pendingAssets.size > 64) { + let e = Vd.pendingAssets.keys().next().value; + e && Vd.pendingAssets.delete(e); } return o; } -function jd() { - return Array.from(dd.pendingAssets.values()); +function cf() { + return Array.from(Vd.pendingAssets.values()); } -async function Md(e) { +async function lf(e) { if (e?.grid) { - e.empty.style.display = "none", e.empty.textContent = R("bottomFeed.loading", "Loading recent assets..."); + e.empty.style.display = "none", e.empty.textContent = L("bottomFeed.loading", "Loading recent assets..."); try { e.assetsByKey = /* @__PURE__ */ new Map(); let t = [], n = 0; - for (; n < ed;) { - let r = L({ + for (; n < Ad;) { + let r = qe({ q: "*", - limit: Math.min(td, ed - n), + limit: Math.min(jd, Ad - n), offset: n, scope: "output", sort: "mtime_desc", includeTotal: n === 0 - }), i = await le(r, { timeoutMs: 3e4 }); + }), i = await Pe(r, { timeoutMs: 3e4 }); if (!i?.ok) throw Error(String(i?.error || "Failed to load feed assets")); let a = Array.isArray(i?.data?.assets) ? i.data.assets : []; if (!a.length) break; for (let n of a) { - let r = bd(e, n); + let r = Xd(e, n); r && t.push(r); } - if (a.length < td) break; + if (a.length < jd) break; n += a.length; } - for (let t of jd()) bd(e, t); - dd.pendingAssets.clear(); - let r = pd(md(e)), i = await _i(e.grid, r, { - title: R("bottomFeed.title", "Generated Feed"), + for (let t of cf()) Xd(e, t); + Vd.pendingAssets.clear(); + let r = Ud(Wd(e)), i = await si(e.grid, r, { + title: L("bottomFeed.title", "Generated Feed"), reset: !0 }); - Td(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + tf(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = L("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } catch (t) { - console.debug?.(t), e.empty.textContent = R("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = ""; + console.debug?.(t), e.empty.textContent = L("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = ""; } finally { e.loaded = !0; } } } -async function Nd() { - for (let e of Array.from(dd.hosts)) try { - await Md(e); +async function uf() { + for (let e of Array.from(Vd.hosts)) try { + await lf(e); } catch (e) { console.debug?.(e); } } -function Pd() { - Nd(); +function df() { + uf(); } -function Fd(e) { +function ff(e) { let t = document.createElement("div"); - t.textContent = R("bottomFeed.loading", "Loading recent assets..."), t.style.cssText = "font-size:11px; opacity:0.65; padding:4px 2px 8px 2px;", e.root.appendChild(t), e.empty = t; + t.textContent = L("bottomFeed.loading", "Loading recent assets..."), t.style.cssText = "font-size:11px; opacity:0.65; padding:4px 2px 8px 2px;", e.root.appendChild(t), e.empty = t; } -function Id(e) { +function pf(e) { if (!e) return; let t = [ e, @@ -9202,14 +9684,14 @@ function Id(e) { console.debug?.(e); } } -function Ld(e) { +function mf(e) { if (!e) return; let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; - t("mjr-feed-show-info", z.FEED_SHOW_INFO), t("mjr-feed-show-filename", z.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", z.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", z.FEED_SHOW_DATE), t("mjr-feed-show-gentime", z.FEED_SHOW_GENTIME), t("mjr-show-hover-info", z.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", z.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", z.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", z.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", z.FEED_SHOW_BADGES_TAGS); + t("mjr-feed-show-info", R.FEED_SHOW_INFO), t("mjr-feed-show-filename", R.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", R.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", R.FEED_SHOW_DATE), t("mjr-feed-show-gentime", R.FEED_SHOW_GENTIME), t("mjr-show-hover-info", R.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", R.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", R.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", R.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", R.FEED_SHOW_BADGES_TAGS); } -function Rd(e, t = null) { +function hf(e, t = null) { let n = t || document.createElement("div"); n.classList.add("mjr-am-grid-scroll"), n.style.position = "relative", n.style.flex = "1 1 auto", n.style.minHeight = "0", n.style.height = "100%", n.style.overflow = "auto", n.style.scrollbarGutter = "stable", n.style.overscrollBehavior = "contain", n.style.webkitOverflowScrolling = "touch"; let r = () => { @@ -9227,14 +9709,14 @@ function Rd(e, t = null) { } }, a = document.createElement("div"); n.appendChild(a), e.root.appendChild(n); - let { app: o } = Hn($u, { + let { app: o } = Wt(kd, { scrollElement: n, virtualize: !1, applyDefaultSettingsClasses: !1, emitWindowSelectionEvents: !0, onCardRendered: (t, n) => { try { - wd(e, t, n); + ef(e, t, n); } catch (e) { console.debug?.(e); } @@ -9245,7 +9727,7 @@ function Rd(e, t = null) { }), s = o.mount(a), c = s?.gridContainer || a.querySelector?.(".mjr-grid") || null; if (e.gridApp = o, e.gridVm = s, e.grid = c, !c) return; c.style.minHeight = "100%", c.style.height = "auto", c.dataset.mjrScope = "output", c.dataset.mjrQuery = "*", c.dataset.mjrSort = "mtime_desc", c.dataset.mjrBottomFeed = "true"; - let l = Number(z.FEED_GRID_MIN_SIZE || z.GRID_MIN_SIZE || 120); + let l = Number(R.FEED_GRID_MIN_SIZE || R.GRID_MIN_SIZE || 120); c.dataset.mjrFeedMinItemWidth = String(l), c.style.setProperty("--mjr-grid-min-size", `${l}px`), c.addEventListener("keydown", (e) => { let t = e?.key?.toLowerCase?.() || ""; if (!(e?.ctrlKey || e?.metaKey || e?.altKey)) { @@ -9253,7 +9735,7 @@ function Rd(e, t = null) { else if (t === "c") { e.preventDefault?.(), e.stopPropagation?.(), r(); try { - od().then(async ({ floatingViewerManager: e }) => { + Id().then(async ({ floatingViewerManager: e }) => { await e.open(), e.toggleCompareAB(); }).catch((e) => console.debug?.(e)); } catch (e) { @@ -9274,19 +9756,19 @@ function Rd(e, t = null) { } }; } -function zd(e) { +function gf(e) { let t = e?.grid; if (!t) return []; - let n = Xn(t); - return n.size ? md(e).filter((e) => n.has(String(e?.id || ""))) : []; + let n = yt(t); + return n.size ? Wd(e).filter((e) => n.has(String(e?.id || ""))) : []; } -function Bd(e) { +function _f(e) { let t = e?.grid; if (!t) return null; let n = String(t.dataset?.mjrSelectedAssetId || "").trim(); - return n ? md(e).find((e) => String(e?.id || "") === n) || null : zd(e)[0] || null; + return n ? Wd(e).find((e) => String(e?.id || "") === n) || null : gf(e)[0] || null; } -function Vd(e) { +function vf(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -9295,48 +9777,48 @@ function Vd(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Hd(e) { +function yf(e) { let t = e?.grid; if (!t) return; let n = () => { try { - xd(e); + Zd(e); } catch (e) { console.debug?.(e); } }; - e.keyboard = Ii({ + e.keyboard = ea({ gridContainer: t, - getState: () => ({ assets: pd(md(e)) }), - getSelectedAssets: () => zd(e), - getActiveAsset: () => Bd(e), + getState: () => ({ assets: Ud(Wd(e)) }), + getSelectedAssets: () => gf(e), + getActiveAsset: () => _f(e), onOpenTagsEditor: (e) => { - let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Vd(e?.id || "")}"]`) || null, i = null; + let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${vf(e?.id || "")}"]`) || null, i = null; try { i = r?.getBoundingClientRect?.() || t.getBoundingClientRect(); } catch (e) { console.debug?.(e); } - Ia(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); + oo(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); }, onAssetChanged: n - }), e.keyboard.bind(), e.ratingHotkeys = Ga({ + }), e.keyboard.bind(), e.ratingHotkeys = ho({ gridContainer: t, - createRatingBadge: _t + createRatingBadge: nn }), e.ratingHotkeys.bind(); } -var Ud = 60, Wd = 600, Gd = 10; -function Kd(e, t) { - let n = Math.max(Ud, Math.min(Wd, Math.round(Number(t) / Gd) * Gd)); +var bf = 60, xf = 600, Sf = 10; +function Cf(e, t) { + let n = Math.max(bf, Math.min(xf, Math.round(Number(t) / Sf) * Sf)); if (e?.grid) try { e.grid.style.setProperty("--mjr-grid-min-size", `${n}px`); } catch (e) { console.debug?.(e); } - z.FEED_GRID_MIN_SIZE = n; + R.FEED_GRID_MIN_SIZE = n; try { - let e = Xt(); - e.feed.minSize = n, Dn(e), mn(e); + let e = Mt(); + e.feed.minSize = n, bt(e), Et(e); } catch (e) { console.debug?.(e); } @@ -9353,27 +9835,27 @@ function Kd(e, t) { } return n; } -function qd(e) { - let t = Math.max(Ud, Number(z.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); +function wf(e) { + let t = Math.max(bf, Number(R.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); n.className = "mjr-feed-toolbar", n.style.cssText = "display:flex; align-items:center; gap:5px; padding:0 2px 5px 2px; flex-shrink:0; user-select:none;"; let r = document.createElement("span"); - r.textContent = R("bottomFeed.cardSize", "Cards:"), r.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(r); + r.textContent = L("bottomFeed.cardSize", "Cards:"), r.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(r); let i = document.createElement("button"); - i.type = "button", i.className = "mjr-feed-size-btn", i.textContent = "-", i.title = R("bottomFeed.cardSizeDecrease", "Decrease card size"), i.style.cssText = "width:20px; height:20px; padding:0; border:1px solid var(--mjr-border,#555); border-radius:4px; background:var(--mjr-surface,#2a2a2a); color:inherit; cursor:pointer; font-size:14px; line-height:1; flex-shrink:0; display:flex; align-items:center; justify-content:center;", n.appendChild(i); + i.type = "button", i.className = "mjr-feed-size-btn", i.textContent = "-", i.title = L("bottomFeed.cardSizeDecrease", "Decrease card size"), i.style.cssText = "width:20px; height:20px; padding:0; border:1px solid var(--mjr-border,#555); border-radius:4px; background:var(--mjr-surface,#2a2a2a); color:inherit; cursor:pointer; font-size:14px; line-height:1; flex-shrink:0; display:flex; align-items:center; justify-content:center;", n.appendChild(i); let a = document.createElement("input"); - a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Ud), a.max = String(Wd), a.step = String(Gd), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); + a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(bf), a.max = String(xf), a.step = String(Sf), a.value = String(t), a.title = L("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); let o = document.createElement("button"); - o.type = "button", o.className = "mjr-feed-size-btn", o.textContent = "+", o.title = R("bottomFeed.cardSizeIncrease", "Increase card size"), o.style.cssText = i.style.cssText, n.appendChild(o); + o.type = "button", o.className = "mjr-feed-size-btn", o.textContent = "+", o.title = L("bottomFeed.cardSizeIncrease", "Increase card size"), o.style.cssText = i.style.cssText, n.appendChild(o); let s = document.createElement("span"); s.className = "mjr-feed-size-display", s.textContent = `${t}px`, s.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; min-width:36px; text-align:right; flex-shrink:0; font-variant-numeric:tabular-nums;", n.appendChild(s), i.addEventListener("click", () => { - Kd(e, Number(a.value) - Gd); + Cf(e, Number(a.value) - Sf); }), o.addEventListener("click", () => { - Kd(e, Number(a.value) + Gd); + Cf(e, Number(a.value) + Sf); }), a.addEventListener("input", () => { - Kd(e, Number(a.value)); + Cf(e, Number(a.value)); }), e.root.appendChild(n), e._sizeToolbar = n; } -function Jd(e, t = {}) { +function Tf(e, t = {}) { let n = document.createElement("div"); n.className = "mjr-assets-manager mjr-bottom-feed", n.style.cssText = "padding:6px; height:100%; min-height:0; box-sizing:border-box; display:flex; flex-direction:column; overflow:hidden;", e.replaceChildren(n); let r = { @@ -9385,13 +9867,13 @@ function Jd(e, t = {}) { assetsByKey: /* @__PURE__ */ new Map(), popoverManager: null }; - qd(r), Fd(r), Rd(r, t.gridWrapper ?? null), ud(r), r.popoverManager = Oi(n), r._disposeContextMenu = Ra({ + wf(r), ff(r), hf(r, t.gridWrapper ?? null), Bd(r), r.popoverManager = Ni(n), r._disposeContextMenu = so({ gridContainer: r.grid, getState: () => ({ scope: "output" }) - }), Hd(r), Ld(r.grid); + }), yf(r), mf(r.grid); let i = () => { try { - Ld(r.grid); + mf(r.grid); } catch (e) { console.debug?.(e); } @@ -9404,26 +9886,42 @@ function Jd(e, t = {}) { } }, r; } -function Yd(e) { - let t = Ad(e); - if (t) for (let e of Array.from(dd.hosts)) try { - if (!e?.grid || (bd(e, t), !e.loaded)) continue; - e.empty.style.display = "none", xd(e); +function Ef(e) { + let t = new Set((Array.isArray(e) ? e : []).map((e) => String(e ?? "").trim()).filter(Boolean)); + if (!t.size) return 0; + let n = 0; + for (let [e, n] of Array.from(Vd.pendingAssets.entries())) t.has(String(n?.id ?? "").trim()) && Vd.pendingAssets.delete(e); + for (let e of Array.from(Vd.hosts)) try { + let r = e?.assetsByKey; + if (!r?.size) continue; + let i = !1; + for (let [e, a] of Array.from(r.entries())) t.has(String(a?.id ?? "").trim()) && (r.delete(e), n += 1, i = !0); + i && Zd(e); + } catch (e) { + console.debug?.(e); + } + return n; +} +function Df(e) { + let t = sf(e); + if (t) for (let e of Array.from(Vd.hosts)) try { + if (!e?.grid || (Xd(e, t), !e.loaded)) continue; + e.empty.style.display = "none", Zd(e); } catch (e) { console.debug?.(e); } } -function Xd(e, t = {}) { - Id(e); - let n = Jd(e, t); +function Of(e, t = {}) { + pf(e); + let n = Tf(e, t); try { e._mjrGeneratedFeedHost = n; } catch (e) { console.debug?.(e); } - return dd.hosts.add(n), Md(n), n; + return Vd.hosts.add(n), lf(n), n; } -function Zd(e) { +function kf(e) { let t = e?._mjrGeneratedFeedHost || e || null; if (!t) return; let n = t.container || null; @@ -9437,7 +9935,7 @@ function Zd(e) { } console.debug?.(e); } - dd.hosts.delete(t); + Vd.hosts.delete(t); try { t._disposeSelection?.(); } catch (e) { @@ -9484,7 +9982,7 @@ function Zd(e) { console.debug?.(e); } try { - yi(t.grid); + li(t.grid); } catch (e) { console.debug?.(e); } @@ -9495,24 +9993,24 @@ function Zd(e) { } } // ui/features/stacks/executionAssetBuffer.ts -function Qd(e) { +function Af(e) { return String(e || "").trim(); } -function $d(e) { +function jf(e) { let t = String(e?.filename || "").trim(), n = String(e?.subfolder || "").trim(); return `${String(e?.type || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${n}|${t}`; } -function ef() { +function Mf() { let e = /* @__PURE__ */ new Map(); function t(t, n) { - let r = Qd(t); + let r = Af(t); if (!r) return []; let i = Array.isArray(n) ? n : []; if (!i.length) return []; let a = e.get(r); a || (a = /* @__PURE__ */ new Map(), e.set(r, a)); for (let e of i) { - let t = $d(e); + let t = jf(e); t && a.set(t, { ...a.get(t) || {}, ...e || {} @@ -9521,13 +10019,13 @@ function ef() { return Array.from(a.values()); } function n(t) { - let n = Qd(t); + let n = Af(t); if (!n) return []; let r = e.get(n); return e.delete(n), Array.from(r?.values?.() || []); } function r(t) { - let n = Qd(t); + let n = Af(t); n && e.delete(n); } return { @@ -9538,7 +10036,7 @@ function ef() { }; } // ui/features/stacks/finalizeQueue.ts -function tf({ defaultDelayMs: e = 900, postJob: t } = {}) { +function Nf({ defaultDelayMs: e = 900, postJob: t } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = !1; async function a() { if (!i) { @@ -9575,27 +10073,27 @@ function tf({ defaultDelayMs: e = 900, postJob: t } = {}) { }; } // ui/features/stacks/liveAssetGate.ts -function nf(e) { +function Pf(e) { return String(e || "").trim(); } -function rf(e) { +function Ff(e) { let t = String(e?.filename || "").trim(), n = String(e?.filepath || "").trim(), r = String(e?.subfolder || "").trim(); return `${String(e?.type || e?.source || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${r}|${t || n}`; } -function af(e, t) { +function If(e, t) { return !t || String(e?.job_id || "").trim() === t ? e : { ...e || {}, job_id: t }; } -function of() { +function Lf() { let e = /* @__PURE__ */ new Map(); function t(t, { files: n = [], expectedCount: r = null } = {}) { - let i = nf(t); + let i = Pf(t); if (!i) return; let a = /* @__PURE__ */ new Set(); for (let e of Array.isArray(n) ? n : []) { - let t = rf(e); + let t = Ff(e); t && a.add(t); } e.set(i, { @@ -9605,13 +10103,13 @@ function of() { }); } function n(t) { - let n = nf(t); + let n = Pf(t); n && e.delete(n); } function r(t) { - let n = nf(t?.job_id); + let n = Pf(t?.job_id); if (n) return n; - let r = rf(t); + let r = Ff(t); if (!r) return ""; let i = "", a = Infinity; for (let [t, n] of e.entries()) n?.fileKeys?.has?.(r) && (n.markedAt ?? Infinity) < a && (a = n.markedAt ?? Infinity, i = t); @@ -9624,7 +10122,7 @@ function of() { jobId: "", defer: !1 }; - let i = af(t, n), a = e.get(n); + let i = If(t, n), a = e.get(n); if (!a) return { detail: i, jobId: n, @@ -9646,20 +10144,20 @@ function of() { }; } // ui/features/stacks/executionRuntimeController.ts -var sf = 2e3, cf = 2e3, lf = /* @__PURE__ */ new Set([ +var Rf = 2e3, zf = 2e3, Bf = /* @__PURE__ */ new Set([ "DB_MAINTENANCE", "TIMEOUT", "NETWORK_ERROR", "SERVICE_UNAVAILABLE" -]), uf = 8, df = 1200, ff = 15e3, pf = 6e5, mf = 500, hf = 6, gf = 3e4, _f = 500; -function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { - let c = Ce({ - ttlMs: sf, - maxSize: cf - }), l = Ce({ - ttlMs: pf, - maxSize: mf - }), u = Math.max(0, Number(z.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = ef(), p = of(), m = "", h = 0, g = null; +]), Vf = 8, Hf = 1200, Uf = 15e3, Wf = 6e5, Gf = 500, Kf = 6, qf = 3e4, Jf = 500; +function Yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { + let c = Re({ + ttlMs: Rf, + maxSize: zf + }), l = Re({ + ttlMs: Wf, + maxSize: Gf + }), u = Math.max(0, Number(R.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = Mf(), p = Lf(), m = "", h = 0, g = null; function _() { try { return typeof window > "u" ? !1 : window.__MJR_DEBUG_JOB_TRACKING__ === !0 || String(window.localStorage?.getItem("mjr.debug.jobTracking") || "").trim() === "1"; @@ -9675,7 +10173,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } } function y() { - return !!z.EXECUTION_GROUPING_ENABLED; + return !!R.EXECUTION_GROUPING_ENABLED; } function b() { let e = y(); @@ -9731,7 +10229,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu console.debug?.(e); } } - let S = tf({ + let S = Nf({ defaultDelayMs: 900, async postJob(r) { v("auto-stack:start", { job_id: r }); @@ -9769,7 +10267,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function T(e) { let t = Math.max(1, Number(e) || 1), n = Math.min(6, t - 1); - return Math.min(ff, df * 2 ** n); + return Math.min(Uf, Hf * 2 ** n); } function E() { g &&= (clearTimeout(g), null); @@ -9787,7 +10285,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function O(e) { let t = String(e?.code || "").trim().toUpperCase(); - return lf.has(t); + return Bf.has(t); } function k(r, i = 1, a = {}) { let o = Array.isArray(r) ? r : []; @@ -9802,7 +10300,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu files: o.map((e) => String(e?.filename || e?.filepath || "")) }), e(t.INDEX_FILES, s).then((e) => { if (!e?.ok) { - if (O(e) && i < uf) { + if (O(e) && i < Vf) { let e = T(i); setTimeout(() => k(o, i + 1, a), e); } else try { @@ -9823,13 +10321,13 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu return console.debug?.(e), ""; } } - function j(e) { + function ee(e) { return !Array.isArray(e) || !e.length ? "" : e.map((e) => String(e?.filepath || e?.filename || "")).filter(Boolean).sort().join("|"); } - function M(e, t = {}, n = 1) { + function j(e, t = {}, n = 1) { let r = Array.isArray(e) ? e : []; if (!r.length) return; - let i = j(r); + let i = ee(r); if (!i) { k(r, 1, t); return; @@ -9837,7 +10335,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu let a = d.get(i); a?.timer && clearTimeout(a.timer); let o = a?.firstAttemptAt ?? Date.now(); - if (Date.now() - o >= gf) { + if (Date.now() - o >= qf) { k(r, 1, t); return; } @@ -9852,7 +10350,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu firstAttemptAt: o }); } - function N(e) { + function M(e) { let t = String(e || "").trim(); if (!(!t || d.size <= 0)) for (let [e, n] of Array.from(d.entries())) { try { @@ -9863,7 +10361,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu d.delete(e), f.add(t, n?.files || []); } } - function ee() { + function N() { for (let [e, t] of Array.from(d.entries())) { try { t?.timer && clearTimeout(t.timer); @@ -9882,20 +10380,20 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu file_count: Array.isArray(e) ? e.length : 0, files: Array.isArray(e) ? e.map((e) => String(e?.filename || e?.filepath || "")) : [] }), !r) { - if (n < hf) { - M(e, t, n); + if (n < Kf) { + j(e, t, n); return; } k(e, 1, t); } else f.add(r, e); } - function P(e, t = 900) { + function ne(e, t = 900) { y() && (v("finalize:schedule", { job_id: String(e || ""), delay_ms: t }), S.schedule(e, t)); } - function ne(r) { + function P(r) { let i = b(), a = String(r || "").trim(); if (!a) return; let o = f.take(a); @@ -9914,12 +10412,12 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu e?.ok ? (v("index:flush:done", { prompt_id: a, file_count: o.length - }), i.allowLiveStackFinalize && P(a, 1800)) : (i.allowLiveStackFinalize && p.clearPendingJob(a), n(Error(String(e?.error || "Indexing generated files failed")), "executionRuntime.executed.index")); + }), i.allowLiveStackFinalize && ne(a, 1800)) : (i.allowLiveStackFinalize && p.clearPendingJob(a), n(Error(String(e?.error || "Indexing generated files failed")), "executionRuntime.executed.index")); }).catch((e) => { i.allowLiveStackFinalize && p.clearPendingJob(a), n(e, "executionRuntime.executed.index"); - }) : i.allowLiveStackFinalize && P(a); + }) : i.allowLiveStackFinalize && ne(a); } - function F(e) { + function re(e) { let t = String(e || "").trim(); if (!t) return !1; try { @@ -9929,7 +10427,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu return console.debug?.(e), !1; } } - function re(e) { + function F(e) { if (!y()) return { detail: e, jobId: "", @@ -9945,18 +10443,18 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu }; } } - function ie(e) { + function I(e) { let t = String(e?.kind || "").trim(), n = String(e?.filename || "").trim(), r = String(e?.filepath || "").trim(); return !!t && (!!n || !!r); } - function ae(e, { appRef: t }) { + function ie(e, { appRef: t }) { if (!b().useExecutionBuffer) return; let n = w(r(e?.detail?.output)); if (!n.length) return; let i = e?.detail?.prompt_id || e?.detail?.promptId, a = String(e?.detail?.node || e?.detail?.display_node || "").trim(), o = i ? l.get(String(i)) : null, s = o ? Math.max(0, Date.now() - o) : 0, c = ""; try { if (a && t !== void 0) { - let e = ht(pt(t), a); + let e = ot(it(t), a); e && (c = String(e.type || e.comfyClass || "").trim()); } } catch (e) { @@ -9987,7 +10485,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu let d = u.length > 0 ? [u[0]] : [], f = u.length > 1 ? u.slice(1) : []; d.length > 0 && k(d, 1, { prompt_id: i }), f.length > 0 && te(f, { prompt_id: i }); } - function I(e, { setCurrentJobId: t }) { + function ae(e, { setCurrentJobId: t }) { let n = e?.detail?.prompt_id || e?.detail?.promptId, r = e?.detail?.timestamp; v("execution:start", { prompt_id: String(n || ""), @@ -9998,7 +10496,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu progress_node: null, progress_value: null, progress_max: null - }), n && N(n); + }), n && M(n); } function oe(e, { setCurrentJobId: t }) { let n = b(), r = e?.detail?.prompt_id || e?.detail?.promptId; @@ -10014,9 +10512,9 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu }), r && String(e?.type || "") !== "execution_success" && (v("buffer:clear", { prompt_id: String(r || ""), reason: String(e?.type || "") - }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), ee()), String(e?.type || "") === "execution_success" && D(() => { - r && N(r), ne(r); - }, F(r) ? Math.min(u, _f) : u); + }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), N()), String(e?.type || "") === "execution_success" && D(() => { + r && M(r), P(r); + }, re(r) ? Math.min(u, Jf) : u); } function se(e) { if (!y()) return; @@ -10032,16 +10530,16 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } return { notifyStacksUpdated: x, - prepareLiveAssetEvent: re, - isRenderableLiveAsset: ie, - handleExecutedEvent: ae, - handleExecutionStart: I, + prepareLiveAssetEvent: F, + isRenderableLiveAsset: I, + handleExecutedEvent: ie, + handleExecutionStart: ae, handleExecutionEnd: oe, handleNodeOutputsUpdated: se }; } // ui/utils/extractOutputFiles.ts -function yf(e) { +function Xf(e) { let t = [], n = /* @__PURE__ */ new Set(), r = 2e3, i = /\.(png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl)$/i, a = typeof WeakSet < "u" ? /* @__PURE__ */ new WeakSet() : null, o = ({ type: e, subfolder: t, filename: n, path: r }) => r ? `path|${String(r).trim().toLowerCase()}` : `${e || ""}|${t || ""}|${n || ""}`.toLowerCase(), s = (e) => { if (!e) return; let r = e.path || e.filepath || e.fullpath || e.fullPath || e.full_path, i = e.filename; @@ -10122,15 +10620,15 @@ function yf(e) { return u(e, 0), t; } // ui/features/runtime/sidebarAssetBadge.ts -var bf = "mjr-sidebar-asset-badge", xf = "mjr-sidebar-tab-has-badge", Sf = "mjr-sidebar-asset-badge-style", Cf = 99, wf = 0, Tf = "majoor-assets", Ef = !1, Df = /* @__PURE__ */ new Set(); -function Of() { - if (typeof document > "u" || document.getElementById(Sf)) return; +var Zf = "mjr-sidebar-asset-badge", Qf = "mjr-sidebar-tab-has-badge", $f = "mjr-sidebar-asset-badge-style", ep = 99, tp = 0, np = "majoor-assets", rp = !1, ip = /* @__PURE__ */ new Set(); +function ap() { + if (typeof document > "u" || document.getElementById($f)) return; let e = document.createElement("style"); - e.id = Sf, e.textContent = ` - .${xf} { + e.id = $f, e.textContent = ` + .${Qf} { position: relative !important; } - .${bf} { + .${Zf} { position: absolute; top: 3px; right: 3px; @@ -10154,7 +10652,7 @@ function Of() { } `, document.head?.appendChild(e); } -function kf(e) { +function op(e) { let t = String(e || "").trim(); if (!t) return []; let n = (() => { @@ -10173,91 +10671,91 @@ function kf(e) { `[href="#${n}"]` ]; } -function Af(e) { +function sp(e) { let t = `${e?.textContent || ""} ${e?.title || ""} ${e?.getAttribute?.("aria-label") || ""}`; return /assets\s*manager|majoor/i.test(t); } -function jf(e) { +function cp(e) { return !e || typeof e != "object" ? !1 : typeof HTMLElement < "u" ? e instanceof HTMLElement : typeof e.querySelector == "function" && typeof e.appendChild == "function"; } -function Mf() { +function lp() { if (typeof document > "u") return null; - for (let e of kf(Tf)) { + for (let e of op(np)) { let t = document.querySelector(e); - if (jf(t)) return t; + if (cp(t)) return t; } let e = Array.from(document.querySelectorAll(".pi-folder, .pi-folder-open")); for (let t of e) { let e = t.closest?.("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab"); - if (jf(e) && Af(e)) return e; + if (cp(e) && sp(e)) return e; } - return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => jf(e) && Af(e)) || null; + return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => cp(e) && sp(e)) || null; } -function Nf() { - Of(); - let e = Mf(); +function up() { + ap(); + let e = lp(); if (!e) return !1; - let t = e.querySelector(`:scope > .${bf}`); - return !Ff() || wf <= 0 ? (t?.remove(), e.classList.remove(xf), !0) : (t || (t = document.createElement("span"), t.className = bf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(xf), t.textContent = wf > Cf ? `${Cf}+` : String(wf), !0); + let t = e.querySelector(`:scope > .${Zf}`); + return !fp() || tp <= 0 ? (t?.remove(), e.classList.remove(Qf), !0) : (t || (t = document.createElement("span"), t.className = Zf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(Qf), t.textContent = tp > ep ? `${ep}+` : String(tp), !0); } -function Pf() { - Nf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => Nf()), setTimeout(() => Nf(), 250), setTimeout(() => Nf(), 1e3); +function dp() { + up(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => up()), setTimeout(() => up(), 250), setTimeout(() => up(), 1e3); } -function Ff() { - return z.SIDEBAR_ASSET_BADGE_ENABLED !== !1; +function fp() { + return R.SIDEBAR_ASSET_BADGE_ENABLED !== !1; } -function If(e = null) { +function pp(e = null) { let t = String(e?.id || e?.asset_id || "").trim(); if (t) return `id:${t}`; let n = String(e?.type || e?.source || "output").trim().toLowerCase(), r = String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim().toLowerCase(), a = String(e?.filename || "").trim().toLowerCase(), o = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(), s = a || o; return s ? `file:${n}|${r}|${i}|${s}` : ""; } -function Lf(e) { +function mp(e) { if (!e) return !0; - if (Df.has(e)) return !1; - if (Df.add(e), Df.size > 1e3) { - let e = Array.from(Df).slice(-500); - Df.clear(); - for (let t of e) Df.add(t); + if (ip.has(e)) return !1; + if (ip.add(e), ip.size > 1e3) { + let e = Array.from(ip).slice(-500); + ip.clear(); + for (let t of e) ip.add(t); } return !0; } -function Rf({ sidebarTabId: e } = {}) { +function hp({ sidebarTabId: e } = {}) { let t = String(e || "").trim(); - t && (Tf = t), !Ef && typeof window < "u" && (Ef = !0, window.addEventListener?.("mjr-settings-changed", (e) => { - e?.detail?.key === "sidebar.assetBadgeEnabled" && (Ff() || (wf = 0, Df.clear()), Pf()); - })), Pf(); + t && (np = t), !rp && typeof window < "u" && (rp = !0, window.addEventListener?.("mjr-settings-changed", (e) => { + e?.detail?.key === "sidebar.assetBadgeEnabled" && (fp() || (tp = 0, ip.clear()), dp()); + })), dp(); } -function zf(e = null) { - Ff() && Lf(If(e)) && (wf += 1, Pf()); +function gp(e = null) { + fp() && mp(pp(e)) && (tp += 1, dp()); } -function Bf() { - wf = 0, Df.clear(), Pf(); +function _p() { + tp = 0, ip.clear(), dp(); } // ui/features/runtime/pendingGeneratedAssets.ts -var Vf = 0; -function Hf(e = 1) { +var vp = 0; +function yp(e = 1) { let t = Math.max(1, Number(e) || 1); - Vf += t; + vp += t; try { - window.__mjrPendingGeneratedAssetCount = Vf; + window.__mjrPendingGeneratedAssetCount = vp; } catch {} - return Vf; + return vp; } -function Uf() { - let e = Vf; - Vf = 0; +function bp() { + let e = vp; + vp = 0; try { window.__mjrPendingGeneratedAssetCount = 0; } catch {} return e; } // ui/features/runtime/registerRealtimeListeners.ts -var Wf = 3e4, Gf = /* @__PURE__ */ new Map(), Kf = "live"; -function qf(e) { +var xp = 3e4, Sp = /* @__PURE__ */ new Map(), Cp = "live"; +function wp(e) { return e === !0 || e === 1 || e === "1" ? !0 : e === !1 || e === 0 || e === "0" ? !1 : null; } -function Jf(e) { +function Tp(e) { let t = [ e?.has_ai_vector, e?.hasAiVector, @@ -10267,25 +10765,25 @@ function Jf(e) { e?.vectorIndexed ]; for (let e of t) { - let t = qf(e); + let t = wp(e); if (t !== null) return t; } return !1; } -function Yf(e) { - let t = Date.now(), n = Number(Gf.get(e) || 0); - if (n > 0 && t - n < Wf) return !0; - if (Gf.set(e, t), Gf.size > 500) { - let e = t - 5 * Wf; - for (let [t, n] of Gf.entries()) Number(n) < e && Gf.delete(t); +function Ep(e) { + let t = Date.now(), n = Number(Sp.get(e) || 0); + if (n > 0 && t - n < xp) return !0; + if (Sp.set(e, t), Sp.size > 500) { + let e = t - 5 * xp; + for (let [t, n] of Sp.entries()) Number(n) < e && Sp.delete(t); } return !1; } -function Xf(e) { +function Dp(e) { let t = String(e?.id || "").trim(); - t && (Jf(e) || Yf(t) || p(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); + t && (Tp(e) || Ep(t) || ee(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); } -function Zf(e) { +function Op(e) { let t = String(e?.kind || "").trim().toLowerCase(); if (t) return t; let n = String(e?.filename || e?.filepath || e?.path || e?.fullpath || "").trim(), r = n.includes(".") && n.split(".").pop()?.toLowerCase?.() || ""; @@ -10333,8 +10831,8 @@ function Zf(e) { "spz" ].includes(r) ? "model3d" : "unknown" : ""; } -function Qf(e, { jobId: t = "" } = {}) { - let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Zf(e); +function kp(e, { jobId: t = "" } = {}) { + let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Op(e); if (!s || !n && !r) return null; let c = n || r.split(/[/\\]/).filter(Boolean).pop() || ""; if (!c) return null; @@ -10345,7 +10843,7 @@ function Qf(e, { jobId: t = "" } = {}) { c ].map((e) => String(e || "").trim().toLowerCase()).join("|"), d = Date.now() / 1e3, f = String(e?.job_id || t || "").trim(); return { - id: `${Kf}:${u || l.toLowerCase()}`, + id: `${Cp}:${u || l.toLowerCase()}`, filename: c, filepath: l, path: l, @@ -10368,7 +10866,7 @@ function Qf(e, { jobId: t = "" } = {}) { _mjrLiveLabel: "In progress" }; } -function $f(e) { +function Ap(e) { let t = String(e || ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -10377,11 +10875,11 @@ function $f(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function ep(e, t) { +function jp(e, t) { let n = String(e || "").trim().toLowerCase(); return n === "delete_db" ? t("btn.deleteDb", "Delete DB") : n === "reset_index" ? t("btn.resetIndex", "Reset index") : n === "restore_db" ? t("btn.dbRestore", "Restore DB") : t("btn.maintenance", "Maintenance"); } -function tp(e, t) { +function Mp(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = { delete_db: [ "started", @@ -10415,36 +10913,36 @@ function tp(e, t) { label: r.replace(/[_-]+/g, " ") }; } -async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { +async function Np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: _, registerCleanableListener: v, syncExecutionBackendState: y }) { e._mjrExecutedHandler = (e) => { try { n.handleExecutedEvent(e, { appRef: r }); } catch (e) { - g(e, "entry.executed"); + _(e, "entry.executed"); } - }, _(t, e, "executed", e._mjrExecutedHandler), e._mjrExecutionStartHandler = (e) => { + }, v(t, e, "executed", e._mjrExecutedHandler), e._mjrExecutionStartHandler = (e) => { try { - n.handleExecutionStart(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), v?.({ + n.handleExecutionStart(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), y?.({ active: !0, promptId: e?.detail?.prompt_id || e?.detail?.promptId || "" }); } catch (e) { - g(e, "entry.execution_start"); + _(e, "entry.execution_start"); } }, e._mjrExecutionEndHandler = (e) => { try { - n.handleExecutionEnd(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), v?.({ + n.handleExecutionEnd(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), y?.({ active: !1, promptId: e?.detail?.prompt_id || e?.detail?.promptId || "" }); } catch (e) { - g(e, "entry.execution_end"); + _(e, "entry.execution_end"); } }, e._mjrStacksUpdatedHandler = (e) => { try { n.notifyStacksUpdated(e?.detail || {}); } catch (e) { - g(e, "entry.stacks_updated"); + _(e, "entry.stacks_updated"); } }, e._mjrRuntimeStatusHandler = (e) => { try { @@ -10456,7 +10954,7 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre queue_remaining: Number.isFinite(Number(t?.exec_info?.queue_remaining)) ? Number(t.exec_info.queue_remaining) : Number.isFinite(Number(t?.queue_remaining)) ? Number(t.queue_remaining) : a().queue_remaining }); } catch (e) { - g(e, "entry.runtime_status"); + _(e, "entry.runtime_status"); } }, e._mjrExecutionCachedHandler = (e) => { try { @@ -10466,20 +10964,20 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre cached_nodes: Array.isArray(t?.nodes) ? t.nodes.slice() : [] }); } catch (e) { - g(e, "entry.execution_cached"); + _(e, "entry.execution_cached"); } - }, _(t, e, "execution_start", e._mjrExecutionStartHandler), _(t, e, "execution_success", e._mjrExecutionEndHandler), _(t, e, "execution_error", e._mjrExecutionEndHandler), _(t, e, "execution_interrupted", e._mjrExecutionEndHandler), _(t, e, "mjr.stacks.updated", e._mjrStacksUpdatedHandler), _(t, e, "progress", e._mjrRuntimeStatusHandler), _(t, e, "status", e._mjrRuntimeStatusHandler), _(t, e, B.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), _(t, e, "execution_cached", e._mjrExecutionCachedHandler); - function y() { + }, v(t, e, "execution_start", e._mjrExecutionStartHandler), v(t, e, "execution_success", e._mjrExecutionEndHandler), v(t, e, "execution_error", e._mjrExecutionEndHandler), v(t, e, "execution_interrupted", e._mjrExecutionEndHandler), v(t, e, "mjr.stacks.updated", e._mjrStacksUpdatedHandler), v(t, e, "progress", e._mjrRuntimeStatusHandler), v(t, e, "status", e._mjrRuntimeStatusHandler), v(t, e, B.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), v(t, e, "execution_cached", e._mjrExecutionCachedHandler); + function b() { try { window.__mjrLastAssetUpsert = Date.now(), window.__mjrLastAssetUpsertCount = (Number(window.__mjrLastAssetUpsertCount || 0) || 0) + 1; } catch (e) { console.debug?.(e); } } - function b(e, t, { immediate: n = !1, force: r = !1 } = {}) { + function x(e, t, { immediate: n = !1, force: r = !1 } = {}) { let i = String(t?.id || "").trim(), a = String(t?.kind || "").trim(), o = String(t?.filename || "").trim(), s = String(t?.filepath || "").trim(), c = !!a && (!!o || !!s), d = !1; if (i) try { - d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${$f(i)}"]`); + d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Ap(i)}"]`); } catch (e) { console.debug?.(e); } @@ -10498,7 +10996,7 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre }); } let m = f ? !!(n && typeof u == "function" ? u : l)(e, p) : !1; - return m && y(), m; + return m && b(), m; } e._mjrNewGenerationOutputHandler = (e) => { try { @@ -10508,38 +11006,38 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (n !== "output" && n !== "all") return; let r = Array.isArray(e?.detail?.files) ? e.detail.files : [], i = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); for (let e of r) { - let n = Qf(e, { jobId: i }); - n && b(t, n, { + let n = kp(e, { jobId: i }); + n && x(t, n, { immediate: !0, force: !0 }); } } catch (e) { - g(e, "entry.new_generation_output"); + _(e, "entry.new_generation_output"); } - }, _(t, window, B.NEW_GENERATION_OUTPUT, e._mjrNewGenerationOutputHandler), e._mjrAssetAddedHandler = (e) => { + }, v(t, window, B.NEW_GENERATION_OUTPUT, e._mjrNewGenerationOutputHandler), e._mjrAssetAddedHandler = (e) => { try { if (!e?.detail) return; let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; if (t?.defer) return; let i = n.isRenderableLiveAsset(r); - i && c(r), Xf(r); + i && c(r), Dp(r); let a = s(); if (!a) { - i && Hf(); + i && yp(); return; } let o = a.dataset?.mjrScope || "output"; if (o !== "output" && o !== "all") { - i && Hf(); + i && yp(); return; } let l = a.dataset?.mjrQuery || "*"; - String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Hf() : i && Hf(); + String(l).trim() === "*" && i ? x(a, r, { immediate: !0 }) || yp() : i && yp(); } catch (e) { - g(e, "entry.asset_added"); + _(e, "entry.asset_added"); } - }, _(t, e, "mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler = (e) => { + }, v(t, e, "mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler = (e) => { try { if (!e?.detail) return; let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; @@ -10547,25 +11045,56 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre n.isRenderableLiveAsset(r) && c(r); let i = s(); if (!i) return; - b(i, r, { immediate: !0 }); + x(i, r, { immediate: !0 }); } catch (e) { - g(e, "entry.asset_updated"); + _(e, "entry.asset_updated"); } - }, _(t, e, "mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler = (e) => { + }, v(t, e, "mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.STRUCTURED_EVENT, { detail: t })); } catch (e) { console.debug?.(e); } - }, _(t, e, B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler = (e) => { + }, v(t, e, B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler = (e) => { try { let t = e?.detail || {}; - window.dispatchEvent(new CustomEvent(B.SCAN_COMPLETE, { detail: t })); + window.dispatchEvent(new CustomEvent(B.SCAN_COMPLETE, { detail: t })), S(t); } catch (e) { console.debug?.(e); } - }, _(t, e, B.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => { + }, v(t, e, B.SCAN_COMPLETE, e._mjrScanCompleteHandler); + function S(e) { + if (globalThis?._mjrMaintenanceActive) return; + let t = Math.max(0, Number(e?.added) || 0), n = Math.max(0, Number(e?.pruned) || 0); + e?.needs_refresh && window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { + reason: "scan-complete", + added: t, + removed: n + } })), String(e?.origin || "") === "directory_scan" && (t || n) && m({ + summary: h("toast.scanComplete", "Scan complete"), + detail: h("toast.scanCompleteSummary", "{added} new, {removed} removed", { + added: t, + removed: n + }) + }, "success", 3500, { history: { + source: "scan", + operation: "scan", + status: "done" + } }); + } + e._mjrAssetsRemovedHandler = (e) => { + try { + let t = e?.detail || {}, n = Array.isArray(t?.ids) ? t.ids.map((e) => String(e ?? "").trim()).filter(Boolean) : []; + n.length && window.dispatchEvent(new CustomEvent(B.ASSETS_DELETED, { detail: { + ids: n, + source: "backend", + reason: t?.reason || "" + } })), t?.truncated && window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { reason: "assets-removed" } })); + } catch (e) { + console.debug?.(e); + } + }, v(t, e, B.ASSETS_REMOVED, e._mjrAssetsRemovedHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.CORE_EXECUTION_ASSETS_READY, { detail: t })); @@ -10578,44 +11107,44 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre } catch (e) { console.debug?.(e); } - }, _(t, e, B.CORE_EXECUTION_ASSETS_READY, e._mjrCoreExecutionAssetsReadyHandler), e._mjrScanProgressHandler = (e) => { + }, v(t, e, B.CORE_EXECUTION_ASSETS_READY, e._mjrCoreExecutionAssetsReadyHandler), e._mjrScanProgressHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.SCAN_PROGRESS, { detail: t })); } catch (e) { console.debug?.(e); } - }, _(t, e, B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler = (e) => { + }, v(t, e, B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.ASSET_INDEXING, { detail: t })); } catch (e) { console.debug?.(e); } - }, _(t, e, B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler = (e) => { + }, v(t, e, B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler = (e) => { try { let t = e?.detail || {}; if (window.dispatchEvent(new CustomEvent(B.ASSET_INDEXED, { detail: t })), !t) return; let r = n.prepareLiveAssetEvent(t), i = r?.detail || t; if (r?.defer) return; - n.isRenderableLiveAsset(i) && (c(i), zf(i)), Xf(i); + n.isRenderableLiveAsset(i) && (c(i), gp(i)), Dp(i); let a = s(); if (!a) return; - b(a, i, { + x(a, i, { immediate: !0, force: !0 }); } catch (e) { console.debug?.(e); } - }, _(t, e, B.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrEnrichmentStatusHandler = (e) => { + }, v(t, e, B.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrEnrichmentStatusHandler = (e) => { try { let t = e?.detail || {}, n = Number(t?.queued), r = Number(t?.queue_left), i = Number.isFinite(n) ? Math.max(0, Math.floor(n)) : Number.isFinite(r) ? Math.max(0, Math.floor(r)) : 0, a = !!t?.active || i > 0, o = f().active; p(a, i), window.dispatchEvent(new CustomEvent(B.ENRICHMENT_STATUS, { detail: t })), o && !a && m(h("toast.enrichmentComplete", "Metadata enrichment complete"), "success", 2600); } catch (e) { console.debug?.(e); } - }, _(t, e, B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler = (e) => { + }, v(t, e, B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler = (e) => { try { let t = e?.detail || {}, n = String(t?.step || ""), r = String(t?.level || "info"), i = String(t?.operation || ""); window.dispatchEvent(new CustomEvent(B.DB_RESTORE_STATUS, { detail: t })); @@ -10633,11 +11162,11 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (!s) return; let c = r === "error" || n === "failed" ? "error" : n === "done" ? "success" : "info", l = { history: { trackId: `maintenance:${String(i || "db_restore").trim().toLowerCase() || "db_restore"}`, - title: ep(i, h), + title: jp(i, h), detail: s, status: n, operation: String(i || "db_restore").trim().toLowerCase(), - progress: tp(i, n), + progress: Mp(i, n), source: String(t?.name || "").trim() || "maintenance", forceStore: !0 } }; @@ -10646,28 +11175,28 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre "done", "failed" ].includes(n)) { - we(s, c, 0, l); + g(s, c, 0, l); return; } m(s, c, n === "done" || n === "failed" ? 2800 : 1800, l); } catch (e) { console.debug?.(e); } - }, _(t, e, B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler); - let x = (e) => { + }, v(t, e, B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler); + let C = (e) => { try { let t = Array.isArray(e?.detail?.ids) ? e.detail.ids.map((e) => String(e || "")).filter(Boolean) : []; if (!t.length) return; let n = s(); - n && d(n, t); + n && d(n, t), Ef(t); } catch (e) { console.debug?.(e); } }; - _(t, window, B.ASSETS_DELETED, x), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = x), console.debug("[Majoor] Real-time listener registered"); + v(t, window, B.ASSETS_DELETED, C), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = C), console.debug("[Majoor] Real-time listener registered"); } // ui/features/runtime/entryDebugApi.ts -function rp({ resolveNodeStreamModule: e }) { +function Pp({ resolveNodeStreamModule: e }) { typeof window < "u" && (window.MajoorDebug = { exportMetrics: () => window.MajoorMetrics?.exportMetrics?.(), getMetrics: () => window.MajoorMetrics?.getMetricsReport?.(), @@ -10682,16 +11211,16 @@ function rp({ resolveNodeStreamModule: e }) { }, console.debug?.("[Majoor] NodeStream API: window.MajoorNodeStream.mode, .listAdapters(), .getKnownNodeSets()")); } // ui/features/runtime/benignConsoleNoise.ts -var ip = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; -function ap(e) { +var Fp = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; +function Ip(e) { try { let t = String(e?.message || e || ""); - return ip.some((e) => t.includes(e)); + return Fp.some((e) => t.includes(e)); } catch { return !1; } } -function op() { +function Lp() { if (typeof window > "u") return null; try { window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__?.abort?.(); @@ -10706,7 +11235,7 @@ function op() { } let t = (e) => { try { - if (!ap(e?.message || e?.error)) return; + if (!Ip(e?.message || e?.error)) return; e.preventDefault?.(), e.stopImmediatePropagation?.(); } catch (e) { console.debug?.(e); @@ -10731,7 +11260,7 @@ function op() { return window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__ = r, r; } // ui/features/geninfo/genInfoOverridePicker.ts -var sp = "Majoor.GenInfoOverridePicker", cp = "MajoorGenInfoOverride", lp = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), up = R("genInfoOverride.pick", "Pick"), dp = { +var Rp = "Majoor.GenInfoOverridePicker", zp = "MajoorGenInfoOverride", Bp = L("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), Vp = L("genInfoOverride.pick", "Pick"), Hp = { positive_prompt: [ "positive_prompt", "prompt", @@ -10754,7 +11283,7 @@ var sp = "Majoor.GenInfoOverridePicker", cp = "MajoorGenInfoOverride", lp = R("g ], vae: ["vae", "vae_name"], clip: ["clip", "clip_name"] -}, fp = [ +}, Up = [ { field: "positive_prompt", label: "prompt" @@ -10799,14 +11328,14 @@ var sp = "Majoor.GenInfoOverridePicker", cp = "MajoorGenInfoOverride", lp = R("g field: "denoise", label: "denoise" } -], pp = 0x10000000000000000, mp = !1, hp = !1; -function gp(e, t) { +], Wp = 0x10000000000000000, Gp = !1, Kp = !1; +function qp(e, t) { let n = (e.widgets ?? []).find((e) => e?.name === t); if (n && n.value !== void 0 && n.value !== null && String(n.value).trim() !== "") return n.value; let r = Array.isArray(e.widgets_values) ? e.widgets_values : [], i = (Array.isArray(e.widgets) ? e.widgets : []).findIndex((e) => e?.name === t); return i >= 0 ? r[i] : void 0; } -function _p(e, t, n, r, i) { +function Jp(e, t, n, r, i) { if (r == null || String(r).trim() === "") return; let a = `${n}:${String(r).trim()}`; t.has(a) || (t.add(a), e.push({ @@ -10816,42 +11345,42 @@ function _p(e, t, n, r, i) { source: i })); } -function vp(e, t, n) { +function Yp(e, t, n) { let r = t.toLowerCase(); - return !!((dp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); + return !!((Hp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); } -function yp(e, t = null) { +function Xp(e, t = null) { let n = [], r = /* @__PURE__ */ new Set(); - for (let { graph: i, label: a } of gt(e)) for (let e of mt(i)) { - if (String(e?.comfyClass || e?.type || "") === cp) continue; + for (let { graph: i, label: a } of st(e)) for (let e of at(i)) { + if (String(e?.comfyClass || e?.type || "") === zp) continue; let i = String(e?.title || e?.comfyClass || e?.type || `Node ${e?.id ?? ""}`).trim(), o = a === "Workflow" ? i : `${a} / ${i}`; - for (let [t, i] of Object.entries(dp)) for (let a of i) _p(n, r, t, gp(e, a), o); + for (let [t, i] of Object.entries(Hp)) for (let a of i) Jp(n, r, t, qp(e, a), o); let s = Array.isArray(e.widgets) ? e.widgets : [], c = Array.isArray(e.widgets_values) ? e.widgets_values : []; s.forEach((e, a) => { let s = String(e?.name || "").toLowerCase(), l = e?.value ?? c[a]; - s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? _p(n, r, "positive_prompt", l, o) : s.includes("negative") && _p(n, r, "negative_prompt", l, o), t && vp(t, s, i) && _p(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); + s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? Jp(n, r, "positive_prompt", l, o) : s.includes("negative") && Jp(n, r, "negative_prompt", l, o), t && Yp(t, s, i) && Jp(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); }); } return t ? n.filter((e) => e.field === t).slice(0, 120) : n.slice(0, 80); } -function bp(e, t) { +function Zp(e, t) { return (e.widgets ?? []).find((e) => e?.name === t); } -function xp(e) { - let t = bp(e, "seed"); +function Qp(e) { + let t = Zp(e, "seed"); t && (t.options = { ...t.options ?? {}, min: -1, - max: pp, + max: Wp, control_after_generate: !1 }); } -function Sp(e, t) { +function $p(e, t) { return t === "positive_prompt" ? e?.prompt ?? e?.positive_prompt : t === "negative_prompt" ? e?.negative_prompt ?? e?.negative : t === "loras_json" && Array.isArray(e?.loras) ? JSON.stringify(e.loras) : t === "custom_info_json" && Array.isArray(e?.custom_info) ? JSON.stringify(e.custom_info) : e?.[t]; } -function Cp(e, t) { +function em(e, t) { if (!e || !t || typeof t != "object") return 0; - xp(e); + Qp(e); let n = 0; for (let r of [ "positive_prompt", @@ -10869,16 +11398,16 @@ function Cp(e, t) { "workflow_notes", "custom_info_json" ]) { - let i = Sp(t, r); + let i = $p(t, r); if (i == null) continue; - let a = bp(e, r); - a && (wp(a, i, e, r), Tp(a, i), n += 1); + let a = Zp(e, r); + a && (tm(a, i, e, r), nm(a, i), n += 1); } return n; } -function wp(e, t, n, r) { +function tm(e, t, n, r) { if (r !== "seed") { - Kn(e, t, n); + Ht(e, t, n); return; } let i = Number(t); @@ -10886,15 +11415,15 @@ function wp(e, t, n, r) { e.options = { ...e.options ?? {}, min: -1, - max: pp, + max: Wp, control_after_generate: !1 }, e.value = Math.trunc(i); try { - e.callback?.(e.value, tt()?.canvas ?? null, n, null, e); + e.callback?.(e.value, $e()?.canvas ?? null, n, null, e); } catch {} } } -function Tp(e, t) { +function nm(e, t) { let n = String(t ?? ""), r = [ e?.inputEl, e?.element, @@ -10907,138 +11436,134 @@ function Tp(e, t) { e.value = n; } catch {} } -function Ep(e, t, n) { - let r = jp({ detail: { output: t } }); - if (r && Cp(e, r)) try { +function rm(e, t, n) { + let r = cm({ detail: { output: t } }); + if (r && em(e, r)) try { e.setSize?.(e.computeSize?.()), e.graph?.setDirtyCanvas?.(!0, !0), e.graph?.change?.(), n?.graph?.setDirtyCanvas?.(!0, !0), n?.graph?.change?.(), n?.canvas?.setDirty?.(!0, !0), n?.canvas?.draw?.(!0, !0); } catch {} } -function Dp(e, t, n = null) { - let r = n || t.field, i = bp(e, r); - i && (wp(i, t.value, e, r), Tp(i, t.value)); +function im(e, t, n = null) { + let r = n || t.field, i = Zp(e, r); + i && (tm(i, t.value, e, r), nm(i, t.value)); } -function Op(e) { +function am(e) { return !e || e.value === void 0 || e.value === null || String(e.value).trim() === ""; } -function kp(e, t) { - let n = yp(t), r = 0; - for (let t of Object.keys(dp)) { - let i = bp(e, t); - if (!i || !Op(i)) continue; +function om(e, t) { + let n = Xp(t), r = 0; + for (let t of Object.keys(Hp)) { + let i = Zp(e, t); + if (!i || !am(i)) continue; let a = n.find((e) => e.field === t); - a && (wp(i, a.value, e, t), Tp(i, a.value), r += 1); + a && (tm(i, a.value, e, t), nm(i, a.value), r += 1); } - return t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), t?.extensionManager?.toast?.add?.({ - severity: r ? "success" : "warn", + return t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), F({ summary: "Majoor Gen Info", - detail: r ? `Filled ${r} empty override fields.` : "No empty matching fields found.", - life: 3e3 - }), r; + detail: r ? `Filled ${r} empty override fields.` : "No empty matching fields found." + }, r ? "success" : "warning", 3e3), r; } -function Ap(e, t) { - if (e && String(e?.comfyClass || e?.type || "") === cp && (xp(e), !(e.widgets ?? []).some((e) => e?.name === lp) && typeof e.addWidget == "function")) { - e.addWidget("button", lp, null, () => kp(e, t)); - for (let n of fp) { - let r = `${up} ${n.label}`; - (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => Np(e, t, n.field)); +function sm(e, t) { + if (e && String(e?.comfyClass || e?.type || "") === zp && (Qp(e), !(e.widgets ?? []).some((e) => e?.name === Bp) && typeof e.addWidget == "function")) { + e.addWidget("button", Bp, null, () => om(e, t)); + for (let n of Up) { + let r = `${Vp} ${n.label}`; + (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => um(e, t, n.field)); } try { e.setSize?.(e.computeSize?.()), t?.graph?.setDirtyCanvas?.(!0, !0); } catch {} } } -function jp(e) { +function cm(e) { let t = e?.detail?.output, n = t?.majoor_geninfo_override ?? t?.ui?.majoor_geninfo_override, r = Array.isArray(n) ? n[0] : n; return r && typeof r == "object" ? r : null; } -function Mp(e) { - if (hp) return; +function lm(e) { + if (Kp) return; let t = e?.api; - t && typeof t.addEventListener == "function" && (hp = !0, t.addEventListener("executed", (t) => { + t && typeof t.addEventListener == "function" && (Kp = !0, t.addEventListener("executed", (t) => { let n = t?.detail?.node ?? t?.detail?.display_node; if (!n) return; - let r = ht(e, n); - r && String(r?.comfyClass || r?.type || "") === cp && Ep(r, t?.detail?.output, e); + let r = ot(e, n); + r && String(r?.comfyClass || r?.type || "") === zp && rm(r, t?.detail?.output, e); })); } -function Np(e, t, n = null) { - let r = yp(t, n); +function um(e, t, n = null) { + let r = Xp(t, n); if (!r.length) { - t?.extensionManager?.toast?.add?.({ - severity: "warn", + F({ summary: "Majoor Gen Info", - detail: n ? `No widget value found for ${n}.` : "No workflow parameters found.", - life: 3e3 - }); + detail: n ? `No widget value found for ${n}.` : "No workflow parameters found." + }, "warning", 3e3); return; } let i = document.createElement("div"); i.style.cssText = "position:fixed;inset:0;z-index:1000000;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center"; let a = document.createElement("div"); a.style.cssText = "width:min(720px,92vw);max-height:80vh;overflow:auto;background:#202020;color:#eee;border:1px solid #555;border-radius:8px;padding:12px;box-shadow:0 16px 48px rgba(0,0,0,.55);font:12px sans-serif"; - let o = n ? R("genInfoOverride.pickField", "Pick {field}", { field: n.replace(/_/g, " ") }) : R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"); + let o = n ? L("genInfoOverride.pickField", "Pick {field}", { field: n.replace(/_/g, " ") }) : L("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"); a.innerHTML = "
"; let s = a.querySelector("strong"); s && (s.textContent = o); let c = a.querySelector("[data-close]"); - c && (c.textContent = R("dialog.close", "Close")); + c && (c.textContent = L("dialog.close", "Close")); for (let t of r) { let r = document.createElement("button"); r.type = "button", r.style.cssText = "width:100%;display:grid;grid-template-columns:130px 1fr 150px;gap:8px;text-align:left;background:#2b2b2b;color:#eee;border:1px solid #3d3d3d;border-radius:5px;padding:7px;margin:5px 0;cursor:pointer", r.innerHTML = `${t.label}`, r.children[1].textContent = String(t.value), r.children[2].textContent = t.source, r.onclick = () => { - Dp(e, t, n), i.remove(); + im(e, t, n), i.remove(); }, a.appendChild(r); } i.appendChild(a), a.querySelector("[data-close]")?.addEventListener("click", () => i.remove()), i.addEventListener("click", (e) => { e.target === i && i.remove(); }), document.body.appendChild(i); } -function Pp(e, t) { - if (String(e?.comfyClass || e?.type || "") !== cp) return []; +function dm(e, t) { + if (String(e?.comfyClass || e?.type || "") !== zp) return []; let n = [{ - content: R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), - callback: () => Np(e, t) + content: L("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), + callback: () => um(e, t) }]; - for (let r of fp) n.push({ + for (let r of Up) n.push({ content: `Pick ${r.label}`, - callback: () => Np(e, t, r.field) + callback: () => um(e, t, r.field) }); return n.push({ - content: lp, - callback: () => kp(e, t) + content: Bp, + callback: () => om(e, t) }), n; } -function Fp(e = null) { - if (mp) return; - let t = e || tt(); - !t || typeof t.registerExtension != "function" ? setTimeout(() => Fp(e), 100) : (mp = !0, Mp(t), t.registerExtension({ - name: sp, +function fm(e = null) { + if (Gp) return; + let t = e || $e(); + !t || typeof t.registerExtension != "function" ? setTimeout(() => fm(e), 100) : (Gp = !0, lm(t), t.registerExtension({ + name: Rp, async nodeCreated(e) { - Ap(e, t); + sm(e, t); }, getNodeMenuItems(e) { - return Pp(e, t); + return dm(e, t); } }), setTimeout(() => { - for (let { graph: e } of gt(t)) for (let n of mt(e)) Ap(n, t); + for (let { graph: e } of st(t)) for (let n of at(e)) sm(n, t); }, 0)); } // ui/vue/composables/useDragDrop.ts -function Ip() { +function pm() { let e = null; - Ar(() => { + Zn(() => { try { - e = os() ?? null; + e = ks() ?? null; } catch (e) { console.warn("[Majoor] useDragDrop: init failed", e); } - }), rr(() => { + }), ir(() => { try { e?.({ force: !0 }); } catch (e) { console.debug?.(e); } try { - ss({ force: !0 }); + As({ force: !0 }); } catch (e) { console.debug?.(e); } @@ -11046,10 +11571,10 @@ function Ip() { }); } // ui/vue/GlobalRuntime.vue -var Lp = /* @__PURE__ */ dr({ +var mm = /* @__PURE__ */ tr({ __name: "GlobalRuntime", setup(e) { - let t = ur(() => import("./chunks/ViewerPortal-gWBXDS-v.js")), n = Z(!1), r = [ + let t = er(() => import("./chunks/ViewerPortal-Sv96pbcb.js")), n = Q(!1), r = [ B.OPEN_VIEWER, B.MFV_OPEN, B.MFV_TOGGLE, @@ -11062,7 +11587,7 @@ var Lp = /* @__PURE__ */ dr({ if (n.value) return; n.value = !0; let t = String(e?.type || ""), r = e?.detail ?? null; - t && t !== B.OPEN_VIEWER && lr(() => { + t && t !== B.OPEN_VIEWER && qn(() => { try { window.dispatchEvent(new CustomEvent(t, { detail: r })); } catch (e) { @@ -11070,21 +11595,21 @@ var Lp = /* @__PURE__ */ dr({ } }); } - return Ip(), Ar(() => { + return pm(), Zn(() => { for (let e of r) try { window.addEventListener(e, i, { once: !1 }); } catch (e) { console.debug?.(e); } - }), rr(() => { + }), ir(() => { for (let e of r) try { window.removeEventListener(e, i); } catch (e) { console.debug?.(e); } - }), (e, r) => n.value ? (K(), ir(X(t), { key: 0 })) : W("", !0); + }), (e, r) => n.value ? (q(), Jn(Z(t), { key: 0 })) : W("", !0); } -}), Rp = { +}), hm = { gridRenderCount: 0, gridRenderTotalMs: 0, searchQueryCount: 0, @@ -11095,20 +11620,20 @@ var Lp = /* @__PURE__ */ dr({ thumbnailLoadCount: 0, thumbnailLoadFailures: 0, errorCounts: {} -}, zp = /* @__PURE__ */ new Map(); -function Bp(e) { +}, gm = /* @__PURE__ */ new Map(); +function _m(e) { let t = performance.now(); - zp.set(e, t); + gm.set(e, t); try { performance.mark(`${e}-start`); } catch {} } -function Vp(e, t) { - let n = zp.get(e); +function vm(e, t) { + let n = gm.get(e); if (!n) return console.warn(`[Majoor Metrics] Timer not found: ${e}`), 0; let r = performance.now() - n; - if (zp.delete(e), t) { - let e = `${t}Count`, n = `${t}TotalMs`, i = Rp; + if (gm.delete(e), t) { + let e = `${t}Count`, n = `${t}TotalMs`, i = hm; typeof i[e] == "number" && (i[e]++, i[n] += r); } r > 100 && console.log(`[Majoor Metrics] ${e}: ${r.toFixed(2)}ms`); @@ -11117,15 +11642,15 @@ function Vp(e, t) { } catch {} return r; } -function Hp(e) { - return zp.has(e); +function ym(e) { + return gm.has(e); } -function Up(e) { +function bm(e) { try { performance.mark(`${e}-start`); } catch {} } -function Wp(e) { +function xm(e) { try { performance.mark(`${e}-end`), performance.measure(e, `${e}-start`, `${e}-end`); let t = performance.getEntriesByName(e)[0]?.duration || 0; @@ -11134,47 +11659,47 @@ function Wp(e) { return null; } } -function Gp(e, t = !1) { - Rp.apiCallCount++, Rp.apiCallTotalMs += e, t && Rp.apiErrorCount++; +function Sm(e, t = !1) { + hm.apiCallCount++, hm.apiCallTotalMs += e, t && hm.apiErrorCount++; } -function Kp(e) { - Rp.gridRenderCount++, Rp.gridRenderTotalMs += e; +function Cm(e) { + hm.gridRenderCount++, hm.gridRenderTotalMs += e; } -function qp(e) { - Rp.searchQueryCount++, Rp.searchQueryTotalMs += e; +function wm(e) { + hm.searchQueryCount++, hm.searchQueryTotalMs += e; } -function Jp(e) { - Rp.thumbnailLoadCount++, e || Rp.thumbnailLoadFailures++; +function Tm(e) { + hm.thumbnailLoadCount++, e || hm.thumbnailLoadFailures++; } -function Yp(e, t) { - Rp.errorCounts[e] = (Rp.errorCounts[e] || 0) + 1; +function Em(e, t) { + hm.errorCounts[e] = (hm.errorCounts[e] || 0) + 1; } -function Xp() { +function Dm() { return { - ...Rp, + ...hm, averages: { - gridRenderMs: Rp.gridRenderCount > 0 ? Rp.gridRenderTotalMs / Rp.gridRenderCount : 0, - searchQueryMs: Rp.searchQueryCount > 0 ? Rp.searchQueryTotalMs / Rp.searchQueryCount : 0, - apiCallMs: Rp.apiCallCount > 0 ? Rp.apiCallTotalMs / Rp.apiCallCount : 0 + gridRenderMs: hm.gridRenderCount > 0 ? hm.gridRenderTotalMs / hm.gridRenderCount : 0, + searchQueryMs: hm.searchQueryCount > 0 ? hm.searchQueryTotalMs / hm.searchQueryCount : 0, + apiCallMs: hm.apiCallCount > 0 ? hm.apiCallTotalMs / hm.apiCallCount : 0 }, rates: { - apiErrorRate: Rp.apiCallCount > 0 ? (Rp.apiErrorCount / Rp.apiCallCount * 100).toFixed(2) + "%" : "0%", - thumbnailFailureRate: Rp.thumbnailLoadCount > 0 ? (Rp.thumbnailLoadFailures / Rp.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" + apiErrorRate: hm.apiCallCount > 0 ? (hm.apiErrorCount / hm.apiCallCount * 100).toFixed(2) + "%" : "0%", + thumbnailFailureRate: hm.thumbnailLoadCount > 0 ? (hm.thumbnailLoadFailures / hm.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" } }; } -function Zp(e) { - let t = `${e}Count`, n = `${e}TotalMs`, r = Rp, i = r[t], a = r[n]; +function Om(e) { + let t = `${e}Count`, n = `${e}TotalMs`, r = hm, i = r[t], a = r[n]; return i > 0 ? a / i : 0; } -function Qp() { - let e = Rp; +function km() { + let e = hm; Object.keys(e).forEach((t) => { typeof e[t] == "number" ? e[t] = 0 : typeof e[t] == "object" && (e[t] = {}); - }), zp.clear(), console.log("[Majoor Metrics] Metrics reset"); + }), gm.clear(), console.log("[Majoor Metrics] Metrics reset"); } -function $p() { - let e = Xp(); +function Am() { + let e = Dm(); console.group("[Majoor Assets Manager] Performance Metrics"), console.table({ "Grid Renders": e.gridRenderCount, "Avg Grid Render": `${e.averages.gridRenderMs.toFixed(2)}ms`, @@ -11187,26 +11712,26 @@ function $p() { "Thumbnail Loads": e.thumbnailLoadCount, "Thumbnail Failures": e.thumbnailLoadFailures, "Failure Rate": e.rates.thumbnailFailureRate - }), Object.keys(Rp.errorCounts).length > 0 && console.log("Error Counts:", Rp.errorCounts), console.groupEnd(); + }), Object.keys(hm.errorCounts).length > 0 && console.log("Error Counts:", hm.errorCounts), console.groupEnd(); } typeof window < "u" && (window.MajoorMetrics = { - startTimer: Bp, - endTimer: Vp, - hasTimer: Hp, - mark: Up, - measure: Wp, - trackApiCall: Gp, - trackGridRender: Kp, - trackSearchQuery: qp, - trackThumbnailLoad: Jp, - trackError: Yp, - getMetricsReport: Xp, - getAverageDuration: Zp, - resetMetrics: Qp, - exportMetrics: $p + startTimer: _m, + endTimer: vm, + hasTimer: ym, + mark: bm, + measure: xm, + trackApiCall: Sm, + trackGridRender: Cm, + trackSearchQuery: wm, + trackThumbnailLoad: Tm, + trackError: Em, + getMetricsReport: Dm, + getAverageDuration: Om, + resetMetrics: km, + exportMetrics: Am }); // ui/features/status/StatusDot.ts -var em = [{ +var jm = [{ key: "exiftool", labelKey: "tool.exiftool", hintKey: "tool.exiftool.hint" @@ -11214,24 +11739,24 @@ var em = [{ key: "ffprobe", labelKey: "tool.ffprobe", hintKey: "tool.ffprobe.hint" -}], tm = !1, nm = null, rm = null, im = "__MJR_STATUS_DOT_CACHE__", am = { +}], Mm = !1, Nm = null, Pm = null, Fm = "__MJR_STATUS_DOT_CACHE__", Im = { ACTIVE: "active", COOLDOWN: "cooldown", IDLE: "idle" -}, om = { - [am.ACTIVE]: 2e3, - [am.COOLDOWN]: 1e4, - [am.IDLE]: 6e4 +}, Lm = { + [Im.ACTIVE]: 2e3, + [Im.COOLDOWN]: 1e4, + [Im.IDLE]: 6e4 }; -function sm(e) { - tm = !!e; +function Rm(e) { + Mm = !!e; try { - globalThis._mjrMaintenanceActive = tm; + globalThis._mjrMaintenanceActive = Mm; } catch (e) { console.debug?.(e); } } -function cm(e) { +function zm(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return "0 B"; let n = [ @@ -11245,7 +11770,7 @@ function cm(e) { let a = r >= 100 ? 0 : r >= 10 ? 1 : 2; return `${r.toFixed(a)} ${n[i]}`; } -function lm(e, t, n = null) { +function Bm(e, t, n = null) { if (e && (e.replaceChildren(), (Array.isArray(t) ? t.filter((e) => e != null && String(e).trim() !== "") : []).forEach((t, n) => { n > 0 && e.appendChild(document.createElement("br")), e.appendChild(document.createTextNode(String(t))); }), n != null && String(n).trim() !== "")) { @@ -11254,7 +11779,7 @@ function lm(e, t, n = null) { t.style.fontSize = "11px", t.style.opacity = "0.6", t.textContent = String(n), e.appendChild(t); } } -function um(e, t = []) { +function Vm(e, t = []) { if (!e) return; let n = Array.isArray(t) ? t.filter((e) => e && String(e.label || "").trim()) : []; if (!n.length) return; @@ -11274,7 +11799,7 @@ function um(e, t = []) { } e.appendChild(r); } -function dm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { +function Hm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { let i = Math.max(0, Number(t || e?.total_assets || 0) || 0); if (i <= 0) return []; let a = (e, t = i) => { @@ -11320,13 +11845,13 @@ function dm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r } : null ].filter(Boolean); } -function fm(e, t, n) { +function Um(e, t, n) { if (!e) return; e.replaceChildren(), e.appendChild(document.createTextNode(String(t || ""))), e.appendChild(document.createElement("br")); let r = document.createElement("span"); r.style.fontSize = "11px", r.style.opacity = "0.7", r.textContent = String(n || ""), e.appendChild(r); } -function pm(e, t = "neutral", n = {}) { +function Wm(e, t = "neutral", n = {}) { if (!e) return; let r = n?.toast !== !1, i = { neutral: { @@ -11377,38 +11902,38 @@ function pm(e, t = "neutral", n = {}) { if (n - (Number(e._mjrStatusToastAt || 0) || 0) >= 4e3) { e._mjrStatusToastAt = n; let r = { - info: R("status.toast.info", "Index status: checking"), - success: R("status.toast.success", "Index status: ready"), - warning: R("status.toast.warning", "Index status: attention needed"), - error: R("status.toast.error", "Index status: error"), - browser: R("status.toast.browser", "Index status: browser scope"), - workflow: R("status.toast.workflow", "Index status: workflow scope") + info: L("status.toast.info", "Index status: checking"), + success: L("status.toast.success", "Index status: ready"), + warning: L("status.toast.warning", "Index status: attention needed"), + error: L("status.toast.error", "Index status: error"), + browser: L("status.toast.browser", "Index status: browser scope"), + workflow: L("status.toast.workflow", "Index status: workflow scope") }, i = t === "error" ? "error" : t === "warning" ? "warning" : t === "success" ? "success" : "info"; try { - I(r[t] || r.info, i, 1800, { noHistory: !0 }); + F(r[t] || r.info, i, 1800, { noHistory: !0 }); } catch (e) { console.debug?.(e); } } } } -function mm(e) { +function Gm(e) { let t = String(e || "").toLowerCase(); - return t === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : t === "input" || t === "inputs" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Browser") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); + return t === "all" ? L("scope.allFull", "All (Inputs + Outputs)") : t === "input" || t === "inputs" ? L("scope.input", "Inputs") : t === "custom" ? L("scope.custom", "Browser") : t === "workflow" ? L("scope.workflow", "Workflow") : L("scope.output", "Outputs"); } -function hm(e, t = "") { - if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: mm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); +function Km(e, t = "") { + if (!e || typeof e != "object") return t ? L("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: Gm(t) }) : L("status.watcher.disabled", "Watcher: disabled"); let n = !!e.enabled, r = e.scope ? String(e.scope) : ""; - return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: mm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: mm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); + return n ? r ? L("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: Gm(r) }) : L("status.watcher.enabled", "Watcher: enabled") : r || t ? L("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: Gm(t && r && r !== t ? t : r || t) }) : L("status.watcher.disabled", "Watcher: disabled"); } -function gm(e = "status-action") { +function qm(e = "status-action") { try { window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -function _m(e = "status-action", t = {}) { +function Jm(e = "status-action", t = {}) { try { window?.dispatchEvent?.(new CustomEvent("mjr-grid-dirty", { detail: { reason: String(e || "status-action"), @@ -11418,21 +11943,14 @@ function _m(e = "status-action", t = {}) { console.debug?.(e); } } -function vm(e = "") { - try { - window?.dispatchEvent?.(new CustomEvent(B.OPEN_MESSAGE_HISTORY, { detail: { reason: String(e || "status-action") } })); - } catch (e) { - console.debug?.(e); - } +async function Ym(e = "") { + return await jt(L("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || L("dialog.vectorsReset.title", "AI vectors")); } -async function ym(e = "") { - return await Gt(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); -} -function bm(e = {}) { +function Xm(e = {}) { let t = typeof e?.getScanContext == "function" ? e.getScanContext : null; - sm(!1); + Rm(!1); let n = document.createElement("div"); - n.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", pm(n, "info", { toast: !1 }); + n.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", Wm(n, "info", { toast: !1 }); let r = document.createElement("div"); r.style.cssText = "display: flex; align-items: center; gap: 10px; margin-bottom: 8px;"; let i = document.createElement("span"); @@ -11440,140 +11958,140 @@ function bm(e = {}) { let a = document.createElement("span"); a.id = "mjr-status-title", a.style.cssText = "font-weight: 500; font-size: 13px; cursor: pointer;"; let o = document.createElement("span"); - o.id = "mjr-status-title-indicator", o.style.marginRight = "6px", o.textContent = "v", a.appendChild(o), a.appendChild(document.createTextNode(R("status.indexStatus", "Index Status"))), r.appendChild(i), r.appendChild(a); + o.id = "mjr-status-title-indicator", o.style.marginRight = "6px", o.textContent = "v", a.appendChild(o), a.appendChild(document.createTextNode(L("status.indexStatus", "Index Status"))), r.appendChild(i), r.appendChild(a); let s = document.createElement("button"); - s.id = "mjr-status-scan", s.className = "mjr-btn mjr-status-scan", s.type = "button", s.textContent = R("btn.scan", "Scan"), r.appendChild(s); + s.id = "mjr-status-scan", s.className = "mjr-btn mjr-status-scan", s.type = "button", s.textContent = L("btn.scan", "Scan"), r.appendChild(s); let c = document.createElement("div"); c.id = "mjr-status-body", c.style.marginLeft = "22px"; let l = document.createElement("div"); - l.id = "mjr-status-text", l.style.cssText = "font-size: 12px; opacity: 0.8;", l.textContent = R("status.checking"); - let d = document.createElement("div"); - d.id = "mjr-status-capabilities", d.style.cssText = "font-size: 11px; opacity: 0.75; margin-top: 10px; display: flex; gap: 6px; flex-wrap: wrap;", d.textContent = R("status.discoveringTools"), c.appendChild(l), c.appendChild(d); + l.id = "mjr-status-text", l.style.cssText = "font-size: 12px; opacity: 0.8;", l.textContent = L("status.checking"); + let u = document.createElement("div"); + u.id = "mjr-status-capabilities", u.style.cssText = "font-size: 11px; opacity: 0.75; margin-top: 10px; display: flex; gap: 6px; flex-wrap: wrap;", u.textContent = L("status.discoveringTools"), c.appendChild(l), c.appendChild(u); let f = document.createElement("div"); - f.id = "mjr-tools-status", f.style.cssText = "font-size: 11px; opacity: 0.7; margin-top: 10px;", f.textContent = R("status.toolStatusChecking", "Tool status: checking..."), c.appendChild(f); + f.id = "mjr-tools-status", f.style.cssText = "font-size: 11px; opacity: 0.7; margin-top: 10px;", f.textContent = L("status.toolStatusChecking", "Tool status: checking..."), c.appendChild(f); let p = document.createElement("div"); p.style.cssText = "margin-top: 10px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap;"; - let h = document.createElement("select"); - h.style.cssText = "\n min-width: 240px;\n padding: 4px 8px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.2);\n background: rgba(255,255,255,0.04);\n color: inherit;\n ", h.title = R("status.dbBackupSelectHint", "Select a DB backup to restore"); - let g = !1, _ = null, v = (e) => { - h.replaceChildren(); + let m = document.createElement("select"); + m.style.cssText = "\n min-width: 240px;\n padding: 4px 8px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.2);\n background: rgba(255,255,255,0.04);\n color: inherit;\n ", m.title = L("status.dbBackupSelectHint", "Select a DB backup to restore"); + let h = !1, _ = null, v = (e) => { + m.replaceChildren(); let t = document.createElement("option"); - t.value = "", t.textContent = String(e || ""), t.disabled = !0, t.selected = !0, h.appendChild(t), g = !1, h.disabled = !0, _ && (_.disabled = !0); + t.value = "", t.textContent = String(e || ""), t.disabled = !0, t.selected = !0, m.appendChild(t), h = !1, m.disabled = !0, _ && (_.disabled = !0); }; - v(R("status.dbBackupLoading", "Loading DB backups...")); - let y = async (e = "") => { + v(L("status.dbBackupLoading", "Loading DB backups...")); + let b = async (e = "") => { try { - let t = await ue(); + let t = await pe(); if (!t?.ok) { - v(R("status.dbBackupNone", "No DB backup found")); + v(L("status.dbBackupNone", "No DB backup found")); return; } let n = Array.isArray(t?.data?.items) ? t.data.items : []; if (!n.length) { - v(R("status.dbBackupNone", "No DB backup found")); + v(L("status.dbBackupNone", "No DB backup found")); return; } - h.replaceChildren(); + m.replaceChildren(); let r = !1; for (let t of n) { let n = String(t?.name || ""); if (!n) continue; - let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${cm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); - c.value = n, c.textContent = s, e && e === n && (c.selected = !0, r = !0), h.appendChild(c); + let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${zm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); + c.value = n, c.textContent = s, e && e === n && (c.selected = !0, r = !0), m.appendChild(c); } - g = h.childNodes.length > 0, h.disabled = !g, g && !r && h.childNodes[0] && (h.value = String(h.childNodes[0]?.value || "")), _ && (_.disabled = !g); + h = m.childNodes.length > 0, m.disabled = !h, h && !r && m.childNodes[0] && (m.value = String(m.childNodes[0]?.value || "")), _ && (_.disabled = !h); } catch { - v(R("status.dbBackupNone", "No DB backup found")); + v(L("status.dbBackupNone", "No DB backup found")); } }; - y(), p.appendChild(h); - let b = document.createElement("button"); - b.type = "button", b.textContent = R("btn.dbSave", "Save DB"), b.title = R("status.dbSaveHint", "Save a DB snapshot into archive folder"), b.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(120,200,255,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", b.onclick = async (e) => { - e.stopPropagation(), sm(!0); - let r = b.textContent, a = !!_?.disabled; - b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), i.style.background = "var(--mjr-status-info, #64B5F6)", pm(n, "info"); + b(), p.appendChild(m); + let x = document.createElement("button"); + x.type = "button", x.textContent = L("btn.dbSave", "Save DB"), x.title = L("status.dbSaveHint", "Save a DB snapshot into archive folder"), x.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(120,200,255,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", x.onclick = async (e) => { + e.stopPropagation(), Rm(!0); + let r = x.textContent, a = !!_?.disabled; + x.disabled = !0, _ && (_.disabled = !0), x.textContent = L("btn.saving", "Saving..."), i.style.background = "var(--mjr-status-info, #64B5F6)", Wm(n, "info"); try { - let e = await C(); + let e = await Ce(); if (e?.ok) { let t = String(e?.data?.name || "").trim(), n = Number(e?.data?.size_bytes || 0); - I(R("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { - title: R("btn.dbSave", "Save DB"), - detail: t ? `${t}${n > 0 ? ` | ${cm(n)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), + F(L("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { + title: L("btn.dbSave", "Save DB"), + detail: t ? `${t}${n > 0 ? ` | ${zm(n)}` : ""}` : L("toast.dbSaveSuccess", "Database backup saved"), operation: "save_db", source: t || "archive", forceStore: !0 - } }), await y(t); - } else I(e?.error || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); + } }), await b(t); + } else F(e?.error || L("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } catch (e) { - I(e?.message || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); + F(e?.message || L("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } finally { - sm(!1), b.disabled = !1, _ && (_.disabled = a || !g), b.textContent = r; + Rm(!1), x.disabled = !1, _ && (_.disabled = a || !h), x.textContent = r; try { let e = t ? t() : null; - await km(i, l, d, e, null, { force: !0 }); + await ah(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } - }, p.appendChild(b), _ = document.createElement("button"), _.type = "button", _.textContent = R("btn.dbRestore", "Restore"), _.title = R("status.dbRestoreHint", "Restore selected DB backup"), _.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,180,80,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", _.onclick = async (e) => { + }, p.appendChild(x), _ = document.createElement("button"), _.type = "button", _.textContent = L("btn.dbRestore", "Restore"), _.title = L("status.dbRestoreHint", "Restore selected DB backup"), _.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,180,80,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", _.onclick = async (e) => { e.stopPropagation(); - let r = String(h.value || ""); + let r = String(m.value || ""); if (!r) { - I(R("toast.dbRestoreSelect", "Select a DB backup first"), "warning", 2e3); + F(L("toast.dbRestoreSelect", "Select a DB backup first"), "warning", 2e3); return; } - if (!await Gt(`${R("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${r}`, R("btn.dbRestore", "Restore DB"))) return; - I(R("toast.dbRestoreStarted", "DB restore started"), "info", 1800, { history: { + if (!await jt(`${L("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${r}`, L("btn.dbRestore", "Restore DB"))) return; + F(L("toast.dbRestoreStarted", "DB restore started"), "info", 1800, { history: { trackId: "maintenance:restore_db", - title: R("btn.dbRestore", "Restore DB"), + title: L("btn.dbRestore", "Restore DB"), detail: r, operation: "restore_db", source: r, status: "started", forceStore: !0 - } }), sm(!0); - let a = _.textContent, o = !!b.disabled; - _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), i.style.background = "var(--mjr-status-warning, #FFA726)", pm(n, "warning"); + } }), Rm(!0); + let a = _.textContent, o = !!x.disabled; + _.disabled = !0, x.disabled = !0, m.disabled = !0, _.textContent = L("btn.restoring", "Restoring..."), i.style.background = "var(--mjr-status-warning, #FFA726)", Wm(n, "warning"); try { - let e = await Oe({ + let e = await xe({ name: r, useLatest: !1 }); - e?.ok ? await y(String(e?.data?.name || r || "")) : I(e?.error || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); + e?.ok ? await b(String(e?.data?.name || r || "")) : F(e?.error || L("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } catch (e) { - I(e?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); + F(e?.message || L("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } finally { - sm(!1), _.disabled = !g, b.disabled = o, h.disabled = !g, _.textContent = a, gm("db-restore"); + Rm(!1), _.disabled = !h, x.disabled = o, m.disabled = !h, _.textContent = a, qm("db-restore"); try { let e = t ? t() : null; - await km(i, l, d, e, null, { force: !0 }); + await ah(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } }, p.appendChild(_), c.appendChild(p); - let x = document.createElement("div"); - x.style.cssText = "margin-top: 10px; display: flex; justify-content: flex-end; gap: 8px; flex-wrap: wrap;"; let S = document.createElement("div"); - S.style.cssText = "margin-top: 8px; font-size: 11px; opacity: 0.9; line-height: 1.35; white-space: pre-wrap;", S.textContent = ""; + S.style.cssText = "margin-top: 10px; display: flex; justify-content: flex-end; gap: 8px; flex-wrap: wrap;"; + let C = document.createElement("div"); + C.style.cssText = "margin-top: 8px; font-size: 11px; opacity: 0.9; line-height: 1.35; white-space: pre-wrap;", C.textContent = ""; let w = (e, t = "neutral") => { let n = String(e || "").trim(); - S.textContent = n, n ? t === "error" ? (S.style.color = "var(--error-text-color, #ff8a80)", S.style.opacity = "1") : t === "success" ? (S.style.color = "var(--success-text-color, #a5d6a7)", S.style.opacity = "1") : t === "info" ? (S.style.color = "var(--input-text, #cfd8dc)", S.style.opacity = "0.95") : (S.style.color = "inherit", S.style.opacity = "0.9") : (S.style.color = "inherit", S.style.opacity = "0.9"); - }, T, E = document.createElement("button"); - E.type = "button", E.textContent = R("btn.resetIndex"), E.title = R("status.resetIndexHint", "Reset index cache (requires allowResetIndex in settings)."), E.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.25);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", E.onmouseenter = () => { - E.style.borderColor = "rgba(255,255,255,0.6)", E.style.background = "rgba(255,255,255,0.08)"; - }, E.onmouseleave = () => { - E.style.borderColor = "rgba(255,255,255,0.25)", E.style.background = "transparent"; - }, E.onclick = async (e) => { + C.textContent = n, n ? t === "error" ? (C.style.color = "var(--error-text-color, #ff8a80)", C.style.opacity = "1") : t === "success" ? (C.style.color = "var(--success-text-color, #a5d6a7)", C.style.opacity = "1") : t === "info" ? (C.style.color = "var(--input-text, #cfd8dc)", C.style.opacity = "0.95") : (C.style.color = "inherit", C.style.opacity = "0.9") : (C.style.color = "inherit", C.style.opacity = "0.9"); + }, T, D = document.createElement("button"); + D.type = "button", D.textContent = L("btn.resetIndex"), D.title = L("status.resetIndexHint", "Reset index cache (requires allowResetIndex in settings)."), D.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.25);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", D.onmouseenter = () => { + D.style.borderColor = "rgba(255,255,255,0.6)", D.style.background = "rgba(255,255,255,0.08)"; + }, D.onmouseleave = () => { + D.style.borderColor = "rgba(255,255,255,0.25)", D.style.background = "transparent"; + }, D.onclick = async (e) => { e.stopPropagation(); - let r = await ym(R("btn.resetIndex", "Reset index")); - if (!await Gt(r ? R("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : R("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), R("dialog.resetIndex.title", "Reset index?"))) return; - vm("reset-index"), sm(!0); - let a = E.textContent; - E.disabled = !0, T.disabled = !0, E.textContent = R("btn.resetting"), i.style.background = "var(--mjr-status-info, #64B5F6)", pm(n, "info"); + let r = await Ym(L("btn.resetIndex", "Reset index")); + if (!await jt(r ? L("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : L("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), L("dialog.resetIndex.title", "Reset index?"))) return; + Rm(!0); + let a = D.textContent; + D.disabled = !0, T.disabled = !0, D.textContent = L("btn.resetting"), i.style.background = "var(--mjr-status-info, #64B5F6)", Wm(n, "info"); try { let e = t ? t() : {}, a = String(e?.scope || "output").toLowerCase(), o = e?.customRootId || e?.custom_root_id || e?.root_id || null, s = a === "custom" && !o; - (await ne({ + (await Xe({ scope: s ? "all" : a, customRootId: s ? null : o, reindex: !0, @@ -11585,60 +12103,58 @@ function bm(e = {}) { clear_assets: !r, preserve_vectors: r, rebuild_fts: !0 - }))?.ok ? (i.style.background = "var(--mjr-status-success, #4CAF50)", pm(n, "success")) : (i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error")); + }))?.ok ? (i.style.background = "var(--mjr-status-success, #4CAF50)", Wm(n, "success")) : (i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error")); } catch { - i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error"); + i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error"); } finally { - sm(!1), E.disabled = !1, T.disabled = !1, E.textContent = a, gm("index-reset"); + Rm(!1), D.disabled = !1, T.disabled = !1, D.textContent = a, qm("index-reset"); try { let e = t ? t() : null; - await km(i, l, d, e, null, { force: !0 }); + await ah(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } }; - let D = document.createElement("button"); - D.type = "button", D.textContent = "Backfill vectors", D.title = "Compute missing AI vector embeddings for existing assets.", D.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(0, 188, 212, 0.45);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", D.onmouseenter = () => { - D.style.borderColor = "rgba(0, 188, 212, 0.8)", D.style.background = "rgba(0, 188, 212, 0.12)"; - }, D.onmouseleave = () => { - D.style.borderColor = "rgba(0, 188, 212, 0.45)", D.style.background = "transparent"; - }, D.onclick = async (e) => { + let O = document.createElement("button"); + O.type = "button", O.textContent = "Backfill vectors", O.title = "Compute missing AI vector embeddings for existing assets.", O.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(0, 188, 212, 0.45);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", O.onmouseenter = () => { + O.style.borderColor = "rgba(0, 188, 212, 0.8)", O.style.background = "rgba(0, 188, 212, 0.12)"; + }, O.onmouseleave = () => { + O.style.borderColor = "rgba(0, 188, 212, 0.45)", O.style.background = "transparent"; + }, O.onclick = async (e) => { e.stopPropagation(); let r = t ? t() : {}, a = String(r?.scope || "output").toLowerCase(), o = String(r?.customRootId || r?.custom_root_id || r?.root_id || "").trim(); if (a === "custom" && !o) { - I(R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), w("Backfill skipped - Browser scope has no selected custom root.", "warning"); + F(L("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), w("Backfill skipped - Browser scope has no selected custom root.", "warning"); return; } - let s = a || "output", c = mm(s); - vm("vector-backfill"); - let u = { history: { + let s = a || "output", c = Gm(s), d = { history: { trackId: `vector-backfill:status:${s}:${o || "default"}`, title: "Vector Backfill", source: c, operation: "vector_backfill", forceStore: !0 } }; - sm(!0); - let f = D.textContent, p = E.textContent; - D.disabled = !0, E.disabled = !0, T.disabled = !0, D.textContent = "Backfilling...", w(`Backfill started (${c})...`, "info"), we({ + Rm(!0); + let f = O.textContent, p = D.textContent; + O.disabled = !0, D.disabled = !0, T.disabled = !0, O.textContent = "Backfilling...", w(`Backfill started (${c})...`, "info"), g({ summary: "Vector Backfill", detail: `Started (${c})` }, "info", 0, { history: { - ...u.history, + ...d.history, status: "started", detail: `Started (${c})` - } }), i.style.background = "var(--mjr-status-info, #64B5F6)", pm(n, "info"); + } }), i.style.background = "var(--mjr-status-info, #64B5F6)", Wm(n, "info"); try { let e = { scope: s, onProgress: (e) => { let t = String(e?.status || "").toLowerCase(), n = e?.progress || e?.result || {}, r = Number(n?.candidates || n?.processed || 0), i = Number(n?.candidate_total || r || 0), a = Number(n?.eligible_total || n?.total_assets || 0), o = Number(n?.indexed || 0), s = Number(n?.skipped || 0), l = Number(n?.errors || 0); - if (t === "queued") w("Backfill queued...", "info"), we({ + if (t === "queued") w("Backfill queued...", "info"), g({ summary: "Vector Backfill", detail: `Queued (${c})` }, "info", 0, { history: { - ...u.history, + ...d.history, status: "queued", detail: `Queued (${c})`, progress: { @@ -11650,11 +12166,11 @@ function bm(e = {}) { } }); else if (t === "running" || r > 0 || i > 0 || a > 0 || o > 0 || s > 0 || l > 0) { let e = a > 0 ? `Indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${l}` : `Candidates ${r}, indexed ${o}, skipped ${s}, errors ${l}`; - w(a > 0 ? `Backfill running - indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${l}` : `Backfill running - candidates ${r}, indexed ${o}, skipped ${s}, errors ${l}`, "info"), we({ + w(a > 0 ? `Backfill running - indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${l}` : `Backfill running - candidates ${r}, indexed ${o}, skipped ${s}, errors ${l}`, "info"), g({ summary: "Vector Backfill", detail: e }, "info", 0, { history: { - ...u.history, + ...d.history, status: "running", detail: e, progress: { @@ -11673,7 +12189,7 @@ function bm(e = {}) { } }; s === "custom" && o && (e.customRootId = o); - let t = await O(64, e); + let t = await E(64, e); if (t?.ok) { let e = String(t?.data?.status || "").toLowerCase(), r = !!t?.data?.pending || [ "queued", @@ -11681,9 +12197,9 @@ function bm(e = {}) { "pending" ].includes(e), a = t?.data?.progress || {}, o = Number(t?.data?.processed ?? a?.candidates ?? 0), s = Number(t?.data?.indexed ?? a?.indexed ?? 0), c = Number(t?.data?.skipped ?? a?.skipped ?? 0), l = Number(t?.data?.errors ?? a?.errors ?? 0); if (r) { - let e = String(t?.data?.backfill_id || "").trim(), r = R("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (${e.slice(0, 8)})` : "" }); - I(r, "info", 4200, { history: { - ...u.history, + let e = String(t?.data?.backfill_id || "").trim(), r = L("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (${e.slice(0, 8)})` : "" }); + F(r, "info", 4200, { history: { + ...d.history, status: "running", detail: `Running in background${e ? ` (${e.slice(0, 8)})` : ""}.`, progress: { @@ -11695,13 +12211,13 @@ function bm(e = {}) { errors: l, label: "running" } - } }), w(`Backfill running in background - candidates ${o}, indexed ${s}, skipped ${c}, errors ${l}`, "info"), i.style.background = "var(--mjr-status-info, #64B5F6)", pm(n, "info"); - } else I(R("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { + } }), w(`Backfill running in background - candidates ${o}, indexed ${s}, skipped ${c}, errors ${l}`, "info"), i.style.background = "var(--mjr-status-info, #64B5F6)", Wm(n, "info"); + } else F(L("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { processed: o, indexed: s, skipped: c }), "success", 3e3, { history: { - ...u.history, + ...d.history, status: "succeeded", detail: `Processed ${o}, indexed ${s}, skipped ${c}`, progress: { @@ -11713,87 +12229,87 @@ function bm(e = {}) { errors: l, label: "done" } - } }), w(`Backfill OK - processed ${o}, indexed ${s}, skipped ${c}`, "success"), i.style.background = "var(--mjr-status-success, #4CAF50)", pm(n, "success"); + } }), w(`Backfill OK - processed ${o}, indexed ${s}, skipped ${c}`, "success"), i.style.background = "var(--mjr-status-success, #4CAF50)", Wm(n, "success"); } else { - let e = String(t?.error || R("toast.vectorBackfillFailedGeneric", "Backfill failed")), r = String(t?.code || "").trim(), a = Number(t?.status || 0) || 0, o = [ + let e = String(t?.error || L("toast.vectorBackfillFailedGeneric", "Backfill failed")), r = String(t?.code || "").trim(), a = Number(t?.status || 0) || 0, o = [ r ? `code=${r}` : "", a ? `status=${a}` : "", e ].filter(Boolean).join(" | "); - I(o, "error", 4500, { history: { - ...u.history, + F(o, "error", 4500, { history: { + ...d.history, status: "failed", detail: o, progress: { label: "failed", errors: 1 } - } }), w(`Backfill ? - ${o}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", t), i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error"); + } }), w(`Backfill ? - ${o}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", t), i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error"); } } catch (e) { let t = String(e?.message || e || "Backfill failed"); - I(t, "error", 4500, { history: { - ...u.history, + F(t, "error", 4500, { history: { + ...d.history, status: "failed", detail: t, progress: { label: "failed", errors: 1 } - } }), w(`Backfill EXCEPTION - ${t}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", e), i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error"); + } }), w(`Backfill EXCEPTION - ${t}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", e), i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error"); } finally { - sm(!1), D.disabled = !1, E.disabled = !1, T.disabled = !1, D.textContent = f, E.textContent = p, gm("vector-backfill"); + Rm(!1), O.disabled = !1, D.disabled = !1, T.disabled = !1, O.textContent = f, D.textContent = p, qm("vector-backfill"); try { let e = t ? t() : null; - await km(i, l, d, e, null, { force: !0 }); + await ah(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } - }, T = document.createElement("button"), T.type = "button", T.textContent = R("btn.memoryPurge", "Memory purge"), T.title = R("tooltip.memoryPurge", "Unload Majoor AI models, ask ComfyUI to unload loaded models, and clear torch cache when idle."), T.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(156, 204, 101, 0.45);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", T.onmouseenter = () => { + }, T = document.createElement("button"), T.type = "button", T.textContent = L("btn.memoryPurge", "Memory purge"), T.title = L("tooltip.memoryPurge", "Unload Majoor AI models, ask ComfyUI to unload loaded models, and clear torch cache when idle."), T.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(156, 204, 101, 0.45);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", T.onmouseenter = () => { T.style.borderColor = "rgba(156, 204, 101, 0.85)", T.style.background = "rgba(156, 204, 101, 0.12)"; }, T.onmouseleave = () => { T.style.borderColor = "rgba(156, 204, 101, 0.45)", T.style.background = "transparent"; }, T.onclick = async (e) => { e.stopPropagation(); let r = T.textContent; - T.disabled = !0, D.disabled = !0, E.disabled = !0, T.textContent = R("btn.memoryPurging", "Purging..."), w(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), i.style.background = "var(--mjr-status-info, #64B5F6)", pm(n, "info"); + T.disabled = !0, O.disabled = !0, D.disabled = !0, T.textContent = L("btn.memoryPurging", "Purging..."), w(L("status.memoryPurgeStarted", "Memory purge started..."), "info"), i.style.background = "var(--mjr-status-info, #64B5F6)", Wm(n, "info"); try { - let e = await u(); + let e = await y(); if (e?.ok) { - let t = e?.data?.comfy_models ? R("toast.memoryPurgeComplete", "Memory purge complete. Majoor AI and ComfyUI model caches were released.") : R("toast.memoryPurgeCompleteMajoorOnly", "Memory purge complete. Majoor AI caches were released."); - I(t, "success", 3200), w(t, "success"), i.style.background = "var(--mjr-status-success, #4CAF50)", pm(n, "success"); + let t = e?.data?.comfy_models ? L("toast.memoryPurgeComplete", "Memory purge complete. Majoor AI and ComfyUI model caches were released.") : L("toast.memoryPurgeCompleteMajoorOnly", "Memory purge complete. Majoor AI caches were released."); + F(t, "success", 3200), w(t, "success"), i.style.background = "var(--mjr-status-success, #4CAF50)", Wm(n, "success"); } else { let t = String(e?.error || "Memory purge failed"); - I(t, "error", 4500), w(t, "error"), i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error"); + F(t, "error", 4500), w(t, "error"), i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error"); } } catch (e) { let t = String(e?.message || e || "Memory purge failed"); - I(t, "error", 4500), w(t, "error"), i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error"); + F(t, "error", 4500), w(t, "error"), i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error"); } finally { - T.disabled = !1, D.disabled = !1, E.disabled = !1, T.textContent = r; + T.disabled = !1, O.disabled = !1, D.disabled = !1, T.textContent = r; try { let e = t ? t() : null; - await km(i, l, d, e, null, { force: !0 }); + await ah(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } - }, x.appendChild(D), x.appendChild(T), x.appendChild(E), c.appendChild(S); + }, S.appendChild(O), S.appendChild(T), S.appendChild(D), c.appendChild(C); let k = document.createElement("button"); - k.type = "button", k.textContent = R("btn.deleteDb"), k.title = R("tooltip.deleteDb", "Force-delete database and rebuild from scratch"), k.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,80,80,0.4);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", k.onmouseenter = () => { + k.type = "button", k.textContent = L("btn.deleteDb"), k.title = L("tooltip.deleteDb", "Force-delete database and rebuild from scratch"), k.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,80,80,0.4);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", k.onmouseenter = () => { k.style.borderColor = "rgba(255,80,80,0.8)", k.style.background = "rgba(255,80,80,0.12)"; }, k.onmouseleave = () => { k.style.borderColor = "rgba(255,80,80,0.4)", k.style.background = "transparent"; }, k.onclick = async (e) => { e.stopPropagation(); - let r = await ym(R("btn.deleteDb", "Delete DB")); - if (!await Gt(r ? R("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : R("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), R("btn.deleteDb", "Delete DB"))) return; - sm(!0); + let r = await Ym(L("btn.deleteDb", "Delete DB")); + if (!await jt(r ? L("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : L("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), L("btn.deleteDb", "Delete DB"))) return; + Rm(!0); let a = k.textContent; - k.disabled = !0, k.textContent = r ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), E.disabled = !0, T.disabled = !0, i.style.background = "var(--mjr-status-info, #64B5F6)", pm(n, "info"); + k.disabled = !0, k.textContent = r ? L("btn.resetting", "Resetting...") : L("btn.deletingDb"), D.disabled = !0, T.disabled = !0, i.style.background = "var(--mjr-status-info, #64B5F6)", Wm(n, "info"); try { - (r ? await ne({ + (r ? await Xe({ scope: "all", reindex: !0, maintenance_force: !0, @@ -11804,53 +12320,53 @@ function bm(e = {}) { clear_assets: !1, preserve_vectors: !0, rebuild_fts: !0 - }) : await m())?.ok ? (globalThis._mjrCorruptToastShown = !1, i.style.background = "var(--mjr-status-success, #4CAF50)", pm(n, "success")) : (i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error")); + }) : await d())?.ok ? (globalThis._mjrCorruptToastShown = !1, i.style.background = "var(--mjr-status-success, #4CAF50)", Wm(n, "success")) : (i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error")); } catch { - i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error"); + i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error"); } finally { - sm(!1), k.disabled = !1, k.textContent = a, E.disabled = !1, T.disabled = !1, gm(r ? "index-reset-preserve-vectors" : "db-force-delete"); + Rm(!1), k.disabled = !1, k.textContent = a, D.disabled = !1, T.disabled = !1, qm(r ? "index-reset-preserve-vectors" : "db-force-delete"); try { let e = t ? t() : null; - await km(i, l, d, e, null, { force: !0 }); + await ah(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } - }, x.appendChild(k), c.appendChild(x), n.appendChild(r), n.appendChild(c); + }, S.appendChild(k), c.appendChild(S), n.appendChild(r), n.appendChild(c); let A = n.querySelector("#mjr-status-title"); A && A.addEventListener("click", (e) => { e.stopPropagation(); let t = n.querySelector("#mjr-status-body"); if (!t) return; let r = t.style.display === "none"; - Em(n, !r); - }), Em(n, !0), n.onmouseenter = () => { + nh(n, !r); + }), nh(n, !0), n.onmouseenter = () => { n.style.transform = "translateY(-1px)"; }, n.onmouseleave = () => { - n.style.transform = "", pm(n, n.dataset?.mjrStatusTone || "neutral", { toast: !1 }); + n.style.transform = "", Wm(n, n.dataset?.mjrStatusTone || "neutral", { toast: !1 }); }; - let j = async (e) => { + let ee = async (e) => { try { let r = e?.detail || {}, a = String(r?.step || ""); if (!a) return; let o = a === "started" || a === "stopping_workers" || a === "resetting_db" || a === "delete_db" || a === "recreate_db" || a === "replacing_files" || a === "restarting_scan"; - if (o ? sm(!0) : (a === "failed" || a === "done") && sm(!1), !n?.isConnected || !i?.isConnected || !l?.isConnected) return; + if (o ? Rm(!0) : (a === "failed" || a === "done") && Rm(!1), !n?.isConnected || !i?.isConnected || !l?.isConnected) return; if (o) { - i.style.background = "var(--mjr-status-info, #64B5F6)", pm(n, "info", { toast: !1 }), fm(l, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); + i.style.background = "var(--mjr-status-info, #64B5F6)", Wm(n, "info", { toast: !1 }), Um(l, L("status.pending", "Pending..."), L("status.dbRestoreInProgress", "Database restore in progress")); return; } if (a === "failed") { - i.style.background = "var(--mjr-status-error, #f44336)", pm(n, "error", { toast: !1 }), lm(l, [R("status.error", "Error"), String(r?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); + i.style.background = "var(--mjr-status-error, #f44336)", Wm(n, "error", { toast: !1 }), Bm(l, [L("status.error", "Error"), String(r?.message || L("toast.dbRestoreFailed", "Failed to restore DB backup"))]); return; } if (a === "done") { - i.style.background = "var(--mjr-status-success, #4CAF50)", pm(n, "success", { toast: !1 }); - let e = String(r?.operation || ""), a = e === "delete_db" ? R("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed.") : e === "reset_index" ? R("toast.resetStarted", "Index reset started. Files will be reindexed in the background.") : R("toast.dbRestoreSuccess", "Database backup restored"); - fm(l, R("status.ready", "Ready"), a); + i.style.background = "var(--mjr-status-success, #4CAF50)", Wm(n, "success", { toast: !1 }); + let e = String(r?.operation || ""), a = e === "delete_db" ? L("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed.") : e === "reset_index" ? L("toast.resetStarted", "Index reset started. Files will be reindexed in the background.") : L("toast.dbRestoreSuccess", "Database backup restored"); + Um(l, L("status.ready", "Ready"), a); try { let e = t ? t() : null; setTimeout(() => { - km(i, l, d, e, null, { force: !0 }); + ah(i, l, u, e, null, { force: !0 }); }, 600); } catch (e) { console.debug?.(e); @@ -11861,45 +12377,45 @@ function bm(e = {}) { } }; try { - let e = nm; - typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), nm = j, n._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); + let e = Nm; + typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), Nm = ee, n._mjrDbRestoreStatusHandler = ee, window.addEventListener("mjr-db-restore-status", ee); } catch (e) { console.debug?.(e); } - let M = (e) => { + let j = (e) => { try { let t = e?.detail || {}, n = Number(t?.queue_remaining), r = Number(t?.progress_value), i = Number(t?.progress_max), a = Array.isArray(t?.cached_nodes) ? t.cached_nodes.length : 0, o = String(t?.active_prompt_id || "").trim(), s = [ - Number.isFinite(r) && Number.isFinite(i) && i > 0 ? R("status.runtimeProgress", "Runtime progress: {value}/{max}", { + Number.isFinite(r) && Number.isFinite(i) && i > 0 ? L("status.runtimeProgress", "Runtime progress: {value}/{max}", { value: r, max: i }) : "", - Number.isFinite(n) ? R("status.queueRemaining", "Queue remaining: {count}", { count: Math.max(0, n) }) : "", - a > 0 ? R("status.executionCached", "Cached nodes reused: {count}", { count: a }) : "", - o ? R("status.activePrompt", "Active prompt: {id}", { id: o }) : "" + Number.isFinite(n) ? L("status.queueRemaining", "Queue remaining: {count}", { count: Math.max(0, n) }) : "", + a > 0 ? L("status.executionCached", "Cached nodes reused: {count}", { count: a }) : "", + o ? L("status.activePrompt", "Active prompt: {id}", { id: o }) : "" ].filter(Boolean); if (!s.length) return; let c = l?.querySelector?.("span"); - c ? c.textContent = s.join(" | ") : fm(l, R("status.ready", "Ready"), s.join(" | ")); + c ? c.textContent = s.join(" | ") : Um(l, L("status.ready", "Ready"), s.join(" | ")); } catch (e) { console.debug?.(e); } }; try { - let e = rm; - typeof e == "function" && window.removeEventListener(B.RUNTIME_STATUS, e), rm = M, window.addEventListener(B.RUNTIME_STATUS, M); + let e = Pm; + typeof e == "function" && window.removeEventListener(B.RUNTIME_STATUS, e), Pm = j, window.addEventListener(B.RUNTIME_STATUS, j); } catch (e) { console.debug?.(e); } return n; } -async function xm(e, t, n = null, r = null) { - if (tm) { - I(R("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); +async function Zm(e, t, n = null, r = null) { + if (Mm) { + F(L("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); return; } let i = t?.closest?.("#mjr-status-body")?.parentElement || t?.closest?.("div"), a = String(r?.scope || "output").toLowerCase(), o = r?.customRootId || r?.custom_root_id || r?.root_id || null; if (a === "custom" && !o) { - e.style.background = "var(--mjr-status-info, #64B5F6)", pm(i, "info"), fm(t, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); + e.style.background = "var(--mjr-status-info, #64B5F6)", Wm(i, "info"), Um(t, L("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), L("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); return; } try { @@ -11907,7 +12423,7 @@ async function xm(e, t, n = null, r = null) { if (n && typeof n == "object") { let r = e - Number(n.at || 0); if (r >= 0 && r < 6e5) { - fm(t, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); + Um(t, L("status.scanInProgress", "Scan already running..."), L("status.scanInProgressHint", "Please wait for the current scan to finish")); return; } } @@ -11927,118 +12443,118 @@ async function xm(e, t, n = null, r = null) { } }, c = null; try { - let e = await le(lt.ROOTS); + let e = await Pe(p.ROOTS); e.ok && (c = e.data); } catch (e) { console.debug?.(e); } if (!c) { - let n = await le(lt.CONFIG); + let n = await Pe(p.CONFIG); if (!n.ok) { - e.style.background = "var(--mjr-status-error, #f44336)", pm(i, "error"), t.textContent = R("status.errorGetConfig"), s(); + e.style.background = "var(--mjr-status-error, #f44336)", Wm(i, "error"), t.textContent = L("status.errorGetConfig"), s(); return; } c = { output_directory: n.data.output_directory }; } - let l = a === "all" ? R("scope.all", "Inputs + Outputs") : a === "input" ? R("scope.input", "Inputs") : a === "custom" ? R("scope.custom", "Custom") : a === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"), u = ""; + let l = a === "all" ? L("scope.all", "Inputs + Outputs") : a === "input" ? L("scope.input", "Inputs") : a === "custom" ? L("scope.custom", "Custom") : a === "workflow" ? L("scope.workflow", "Workflow") : L("scope.output", "Outputs"), u = ""; if (a === "input") u = c?.input_directory ? ` (${c.input_directory})` : ""; else if (a === "custom") { let e = Array.isArray(c?.custom_roots) ? c.custom_roots : [], t = o ? e.find((e) => e?.id === o) : null; u = t?.path ? ` (${t.path})` : ""; } else a === "output" && (u = c?.output_directory ? ` (${c.output_directory})` : ""); - e.style.background = "var(--mjr-status-info, #64B5F6)", pm(i, "info"), fm(t, R("status.scanningScope", `Scanning ${l}${u}...`, { + e.style.background = "var(--mjr-status-info, #64B5F6)", Wm(i, "info"), Um(t, L("status.scanningScope", `Scanning ${l}${u}...`, { scope: l, detail: u - }), R("status.scanningHint", "This may take a while")); + }), L("status.scanningHint", "This may take a while")); let d = { scope: a, recursive: !0, incremental: !0, - fast: !!(Xt()?.scan?.fastMode ?? !0), + fast: !!(Mt()?.scan?.fastMode ?? !0), background_metadata: !0 }; if (a === "custom") { if (!o) { - e.style.background = "var(--mjr-status-error, #f44336)", pm(i, "error"), t.textContent = R("status.selectCustomFolder"), s(); + e.style.background = "var(--mjr-status-error, #f44336)", Wm(i, "error"), t.textContent = L("status.selectCustomFolder"), s(); return; } d.custom_root_id = o; } let f; try { - f = await pe(lt.SCAN, d); + f = await me(p.SCAN, d); } finally { s(); } if (f?.ok) { let r = f.data; - e.style.background = "var(--mjr-status-success, #4CAF50)", pm(i, "success"), fm(t, R("toast.scanComplete"), R("status.scanStats", `Added: ${r.added || 0} - Updated: ${r.updated || 0} - Skipped: ${r.skipped || 0}`, { + e.style.background = "var(--mjr-status-success, #4CAF50)", Wm(i, "success"), Um(t, L("toast.scanComplete"), L("status.scanStats", `Added: ${r.added || 0} - Updated: ${r.updated || 0} - Skipped: ${r.skipped || 0}`, { added: r.added || 0, updated: r.updated || 0, skipped: r.skipped || 0 - })), _m("scan-complete", { stats: { + })), Jm("scan-complete", { stats: { added: r.added || 0, updated: r.updated || 0, skipped: r.skipped || 0 } }), setTimeout(() => { - km(e, t, n); + ah(e, t, n); }, 2e3); - } else e.style.background = "var(--mjr-status-error, #f44336)", pm(i, "error"), lm(t, [R("toast.scanFailed") + `: ${f?.error || "Unknown error"}`]), setTimeout(() => { - km(e, t, n); + } else e.style.background = "var(--mjr-status-error, #f44336)", Wm(i, "error"), Bm(t, [L("toast.scanFailed") + `: ${f?.error || "Unknown error"}`]), setTimeout(() => { + ah(e, t, n); }, 3e3); } -function Sm(e, t, n) { +function Qm(e, t, n) { let r = document.createElement("span"); - return r.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n ", r.textContent = `${t ? "OK" : "ERR"} ${e}`, r.title = t ? R("status.toolAvailable", `${e} available`, { tool: e }) : n || R("status.toolUnavailable", `${e} unavailable`, { tool: e }), r.style.opacity = t ? "1" : "0.75", r; + return r.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n ", r.textContent = `${t ? "OK" : "ERR"} ${e}`, r.title = t ? L("status.toolAvailable", `${e} available`, { tool: e }) : n || L("status.toolUnavailable", `${e} unavailable`, { tool: e }), r.style.opacity = t ? "1" : "0.75", r; } -function Cm(e, t = {}, n = {}) { +function $m(e, t = {}, n = {}) { if (!e) return; if (e.replaceChildren(), !t || Object.keys(t).length === 0) { - e.textContent = R("status.discoveringTools"); + e.textContent = L("status.discoveringTools"); return; } let r = document.createElement("div"); - r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", em.forEach(({ key: e, labelKey: i, hintKey: a }) => { - let o = !!t[e], s = n[e], c = R(i, e), l = R(a, ""); - r.appendChild(Tm({ + r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", jm.forEach(({ key: e, labelKey: i, hintKey: a }) => { + let o = !!t[e], s = n[e], c = L(i, e), l = L(a, ""); + r.appendChild(th({ label: c, hint: l }, o, s)); }), e.appendChild(r); } -function wm(e, t = null, n = {}) { +function eh(e, t = null, n = {}) { if (!e) return; let r = e.parentElement; if (!r) return; let i = r.querySelector("#mjr-tools-status"); if (!i) return; let a = n && Object.keys(n).length > 0; - i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : em.map(({ key: e, labelKey: r }) => { - let i = R(r, e), a = t && e in t ? t[e] : void 0, o = e in n ? n[e] : void 0, s = a === void 0 ? o : a, c = s == null ? R("status.unknown", "unknown") : s ? R("status.available", "available") : R("status.missing", "missing"), l = t?.versions?.[e]; + i.textContent = !t && !a ? L("status.toolStatusChecking", "Tool status: checking...") : jm.map(({ key: e, labelKey: r }) => { + let i = L(r, e), a = t && e in t ? t[e] : void 0, o = e in n ? n[e] : void 0, s = a === void 0 ? o : a, c = s == null ? L("status.unknown", "unknown") : s ? L("status.available", "available") : L("status.missing", "missing"), l = t?.versions?.[e]; return l ? `${i}: ${c} - ${l}` : `${i}: ${c}`; }).join(" | "); } -function Tm({ label: e, hint: t }, n, r) { +function th({ label: e, hint: t }, n, r) { let i = document.createElement("div"); i.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 3px;\n padding: 6px 8px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.03);\n border: 1px solid rgba(255, 255, 255, 0.08);\n min-width: 170px;\n "; - let a = Sm(e, n, t); + let a = Qm(e, n, t); a.style.fontWeight = "500", i.appendChild(a); let o = document.createElement("span"); - return o.style.fontSize = "10px", o.style.opacity = "0.7", o.style.wordBreak = "break-all", o.textContent = R("status.path", "Path") + `: ${r || R("status.pathAuto", "auto / not configured")}`, i.appendChild(o), i; + return o.style.fontSize = "10px", o.style.opacity = "0.7", o.style.wordBreak = "break-all", o.textContent = L("status.path", "Path") + `: ${r || L("status.pathAuto", "auto / not configured")}`, i.appendChild(o), i; } -function Em(e, t) { +function nh(e, t) { let n = e.querySelector("#mjr-status-body"), r = e.querySelector("#mjr-status-title-indicator"); n && r && (t ? (n.style.display = "none", r.textContent = ">") : (n.style.display = "", r.textContent = "v")); } -function Dm(e, t) { +function rh(e, t) { let n = !!e?.database?.available, r = t?.diagnostics || {}, i = !!r?.malformed, a = !!r?.locked; - return !n || i ? R("status.dbHealthError", "DB health: error") : a ? R("status.dbHealthLocked", "DB health: locked") : R("status.dbHealthOk", "DB health: ok"); + return !n || i ? L("status.dbHealthError", "DB health: error") : a ? L("status.dbHealthLocked", "DB health: locked") : L("status.dbHealthOk", "DB health: ok"); } -function Om(e, t) { - let n = Number(e?.total_assets || 0), r = e?.last_index_end, i = e?.last_scan_end, a = t === "all" ? R("scope.all", "Inputs + Outputs") : t === "input" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Custom") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); - return !Number.isFinite(n) || n <= 0 ? `${R("status.indexHealthEmpty", "Index health: empty")} (${a})` : !r && !i ? `${R("status.indexHealthPartial", "Index health: partial")} (${a})` : `${R("status.indexHealthOk", "Index health: ok")} (${a})`; +function ih(e, t) { + let n = Number(e?.total_assets || 0), r = e?.last_index_end, i = e?.last_scan_end, a = t === "all" ? L("scope.all", "Inputs + Outputs") : t === "input" ? L("scope.input", "Inputs") : t === "custom" ? L("scope.custom", "Custom") : t === "workflow" ? L("scope.workflow", "Workflow") : L("scope.output", "Outputs"); + return !Number.isFinite(n) || n <= 0 ? `${L("status.indexHealthEmpty", "Index health: empty")} (${a})` : !r && !i ? `${L("status.indexHealthPartial", "Index health: partial")} (${a})` : `${L("status.indexHealthOk", "Index health: ok")} (${a})`; } -async function km(e, t, n = null, r = null, i = null, a = {}) { +async function ah(e, t, n = null, r = null, i = null, a = {}) { let o = t?.closest?.("#mjr-status-body")?.parentElement || t?.closest?.("div"), s = a?.signal || null, c = !!a?.force; try { if (!e?.isConnected || !t?.isConnected) return null; @@ -12046,27 +12562,27 @@ async function km(e, t, n = null, r = null, i = null, a = {}) { console.debug?.(e); } try { - if (!c && tm) return null; + if (!c && Mm) return null; } catch (e) { console.debug?.(e); } i && typeof i == "object" && (i.lastCode = null, i.lastStatus = null); - let l = String(r?.scope || "output").toLowerCase(), u = l === "workflow" ? "all" : l, d = r?.customRootId || r?.custom_root_id || r?.root_id || null, f = l === "custom" && !d, p = f ? `${lt.HEALTH_COUNTERS}?scope=all` : u === "custom" ? `${lt.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(d || ""))}` : `${lt.HEALTH_COUNTERS}?scope=${encodeURIComponent(u || "output")}`, m = !!a?.lightweight, h = !(!c && i && typeof i == "object" && Number(i._scanAuxBackoffUntil || 0) > Date.now()) && (c || !m || !(i && typeof i == "object" && i._auxCached)), g, _, v, y = null; - if (h) { + let l = String(r?.scope || "output").toLowerCase(), u = l === "workflow" ? "all" : l, d = r?.customRootId || r?.custom_root_id || r?.root_id || null, f = l === "custom" && !d, m = f ? `${p.HEALTH_COUNTERS}?scope=all` : u === "custom" ? `${p.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(d || ""))}` : `${p.HEALTH_COUNTERS}?scope=${encodeURIComponent(u || "output")}`, h = !!a?.lightweight, g = !(!c && i && typeof i == "object" && Number(i._scanAuxBackoffUntil || 0) > Date.now()) && (c || !h || !(i && typeof i == "object" && i._auxCached)), _, v, y, b = null; + if (g) { let [e, t, n] = await Promise.all([ - le(p, s ? { signal: s } : void 0), - le(lt.HEALTH, s ? { signal: s } : void 0), - le(lt.HEALTH_DB, s ? { signal: s } : void 0) + Pe(m, s ? { signal: s } : void 0), + Pe(p.HEALTH, s ? { signal: s } : void 0), + Pe(p.HEALTH_DB, s ? { signal: s } : void 0) ]); - g = e, _ = t, v = n; + _ = e, v = t, y = n; try { - let e = await re(s ? { signal: s } : void 0); - e?.ok && (y = e.data); + let e = await D(s ? { signal: s } : void 0); + e?.ok && (b = e.data); } catch (e) { console.debug?.(e); } - i && typeof i == "object" && (i._auxCached = !0, i._healthCache = _, i._dbDiagCache = v, i._toolsCache = y); - } else g = await le(p, s ? { signal: s } : void 0), _ = i?._healthCache || null, v = i?._dbDiagCache || null, y = i?._toolsCache || null; + i && typeof i == "object" && (i._auxCached = !0, i._healthCache = v, i._dbDiagCache = y, i._toolsCache = b); + } else _ = await Pe(m, s ? { signal: s } : void 0), v = i?._healthCache || null, y = i?._dbDiagCache || null, b = i?._toolsCache || null; try { if (s?.aborted) return null; } catch (e) { @@ -12077,20 +12593,20 @@ async function km(e, t, n = null, r = null, i = null, a = {}) { } catch (e) { console.debug?.(e); } - if (i && typeof i == "object" && (i.lastCode = g?.code || null, i.lastStatus = typeof g?.status == "number" ? g.status : null), g.ok) { - let r = g.data; + if (i && typeof i == "object" && (i.lastCode = _?.code || null, i.lastStatus = typeof _?.status == "number" ? _.status : null), _.ok) { + let r = _.data; i && typeof i == "object" && (i._scanAuxBackoffUntil = r?.scan_active ? Date.now() + 3e4 : 0); - let a = r.total_assets || 0, c = r.with_workflows - 0, u = r.with_generation_data - 0, p = Math.max(0, Number(c || 0) || 0), m = r.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", b = r.tool_availability || {}, x = r.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: cm(r.db_size_bytes || 0) }), C = _?.ok && _?.data && _.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Dm(_?.data || null, v?.data || null), A = Om(r, f ? "all" : l), j = !!(_?.ok && _?.data?.database?.available), M = v?.ok && v?.data?.diagnostics || {}, N = !!M?.malformed, ee = !!M?.locked, te = !!M?.maintenance_active; - sm(te); - let P = Math.max(0, Number(r?.enrichment_queue_length || 0) || 0), ne = Lt().active || P > 0; - Ct(ne, P); - let F = Number(a) > 0, re = !!(r?.last_index_end || r?.last_scan_end), ie = F && re, I = "success"; - te || ne ? I = "info" : !j || N ? I = "error" : (ee || !ie || E) && (I = "warning"); - let oe = l === "workflow", se = f && I !== "error" ? "browser" : oe && I !== "error" ? "workflow" : I, ce = r.watcher; + let a = r.total_assets || 0, c = r.with_workflows - 0, u = r.with_generation_data - 0, p = Math.max(0, Number(c || 0) || 0), m = r.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = r.tool_availability || {}, x = r.tool_paths || {}, S = L("status.dbSize", "Database size: {size}", { size: zm(r.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = rh(v?.data || null, y?.data || null), A = ih(r, f ? "all" : l), ee = !!(v?.ok && v?.data?.database?.available), j = y?.ok && y?.data?.diagnostics || {}, M = !!j?.malformed, N = !!j?.locked, te = !!j?.maintenance_active; + Rm(te); + let ne = Math.max(0, Number(r?.enrichment_queue_length || 0) || 0), P = yn().active || ne > 0; + vn(P, ne); + let re = Number(a) > 0, F = !!(r?.last_index_end || r?.last_scan_end), I = re && F, ie = "success"; + te || P ? ie = "info" : !ee || M ? ie = "error" : (N || !I || E) && (ie = "warning"); + let ae = l === "workflow", oe = f && ie !== "error" ? "browser" : ae && ie !== "error" ? "workflow" : ie, se = r.watcher; try { - if (!ce || typeof ce.enabled != "boolean") { - let e = await ae(s ? { signal: s } : void 0); - e?.ok && e.data && (ce = { + if (!se || typeof se.enabled != "boolean") { + let e = await Je(s ? { signal: s } : void 0); + e?.ok && e.data && (se = { enabled: !!e.data.enabled, scope: r?.watcher?.scope || l, custom_root_id: d || null @@ -12099,77 +12615,77 @@ async function km(e, t, n = null, r = null, i = null, a = {}) { } catch (e) { console.debug?.(e); } - let le = oe ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : f ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : hm(ce, l), ue = ne ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: P }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); - Cm(n, b, x), wm(n, y, b); - let de = l === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : l === "input" ? R("scope.input", "Inputs") : l === "custom" ? R("scope.customBrowser", "Browser") : l === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); - return I === "error" ? (e.style.background = "var(--mjr-status-error, #f44336)", pm(o, "error"), fm(t, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ + let ce = ae ? L("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: L("scope.workflow", "Workflow") }) : f ? L("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: L("scope.customBrowser", "Browser") }) : Km(se, l), le = P ? L("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: ne }) : L("status.enrichmentIdle", "Metadata enrichment: idle"); + $m(n, g, x), eh(n, b, g); + let ue = l === "all" ? L("scope.allFull", "All (Inputs + Outputs)") : l === "input" ? L("scope.input", "Inputs") : l === "custom" ? L("scope.customBrowser", "Browser") : l === "workflow" ? L("scope.workflow", "Workflow") : L("scope.output", "Outputs"); + return ie === "error" ? (e.style.background = "var(--mjr-status-error, #f44336)", Wm(o, "error"), Um(t, L("status.dbCorrupted", "Database appears corrupted or unavailable."), [ k, A, S, - le - ].filter(Boolean).join(" | ")), r) : f ? (e.style.background = "var(--mjr-status-browser, #26A69A)", pm(o, "browser"), fm(t, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), le].filter(Boolean).join(" | ")), r) : oe ? (e.style.background = "#d481c3", pm(o, se), lm(t, [ - R("status.workflowsIndexed", `${p.toLocaleString()} workflows indexed (${de})`, { + ce + ].filter(Boolean).join(" | ")), r) : f ? (e.style.background = "var(--mjr-status-browser, #26A69A)", Wm(o, "browser"), Um(t, L("status.ready", "Ready"), [L("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), ce].filter(Boolean).join(" | ")), r) : ae ? (e.style.background = "#d481c3", Wm(o, oe), Bm(t, [ + L("status.workflowsIndexed", `${p.toLocaleString()} workflows indexed (${ue})`, { count: p.toLocaleString(), - scope: de + scope: ue }), - R("status.assetsCountReference", `Asset records in DB: ${a.toLocaleString()}`, { count: a.toLocaleString() }), - ue, + L("status.assetsCountReference", `Asset records in DB: ${a.toLocaleString()}`, { count: a.toLocaleString() }), + le, O, k, A, S, - le - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), r) : (a === 0 ? (e.style.background = se === "browser" ? "var(--mjr-status-browser, #26A69A)" : I === "info" ? "var(--mjr-status-info, #64B5F6)" : I === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", pm(o, se), fm(t, R("status.noAssets", `No assets indexed yet (${de})`, { scope: de }), [ - R("status.clickToScan", "Click the dot to start a scan"), + ce + ], L("status.lastScan", `Last scan: ${h}`, { date: h })), r) : (a === 0 ? (e.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", Wm(o, oe), Um(t, L("status.noAssets", `No assets indexed yet (${ue})`, { scope: ue }), [ + L("status.clickToScan", "Click the dot to start a scan"), O, k, A, S, - le - ].filter(Boolean).join(" | "))) : (e.style.background = se === "browser" ? "var(--mjr-status-browser, #26A69A)" : I === "info" ? "var(--mjr-status-info, #64B5F6)" : I === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", pm(o, se), lm(t, [ - R("status.assetsIndexed", `${a.toLocaleString()} assets indexed (${de})`, { + ce + ].filter(Boolean).join(" | "))) : (e.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", Wm(o, oe), Bm(t, [ + L("status.assetsIndexed", `${a.toLocaleString()} assets indexed (${ue})`, { count: a.toLocaleString(), - scope: de + scope: ue }), - Fm(r), - R("status.withWorkflows", `With workflows: ${c} - Generation data: ${u}`, { + dh(r), + L("status.withWorkflows", `With workflows: ${c} - Generation data: ${u}`, { workflows: c, gendata: u }), - ue, + le, O, k, A, S, - le - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), um(t, dm(r, { + ce + ], L("status.lastScan", `Last scan: ${h}`, { date: h })), Vm(t, Hm(r, { totalAssets: a, withWorkflows: c, withGenerationData: u }))), r); } - if (Cm(n, {}, {}), wm(n, y), e.style.background = "var(--mjr-status-error, #f44336)", pm(o, "error"), g?.code === "INVALID_RESPONSE" && g?.status === 404) fm(t, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); + if ($m(n, {}, {}), eh(n, b), e.style.background = "var(--mjr-status-error, #f44336)", Wm(o, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) Um(t, L("status.apiNotFound", "Majoor API endpoints not found (404)"), L("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); else { - let e = String(g?.error || "").toLowerCase(); - e.includes("malform") || e.includes("corrupt") || e.includes("disk image") ? (fm(t, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, I(R("toast.resetFailedCorrupt"), "error", 8e3))) : lm(t, [g.error || R("status.errorChecking", "Error checking status")]); + let e = String(_?.error || "").toLowerCase(); + e.includes("malform") || e.includes("corrupt") || e.includes("disk image") ? (Um(t, L("status.dbCorrupted"), L("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, F(L("toast.resetFailedCorrupt"), "error", 8e3))) : Bm(t, [_.error || L("status.errorChecking", "Error checking status")]); } - if (g.code === "SERVICE_UNAVAILABLE") { - let i = Am(e, t, n, r); + if (_.code === "SERVICE_UNAVAILABLE") { + let i = oh(e, t, n, r); t.appendChild(document.createElement("br")), t.appendChild(i); } return null; } -function Am(e, t, n = null, r = null) { +function oh(e, t, n = null, r = null) { let i = document.createElement("button"); - return i.textContent = R("btn.retryServices"), i.style.cssText = "\n padding: 4px 10px;\n margin-top: 6px;\n font-size: 11px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.3);\n background: transparent;\n color: white;\n cursor: pointer;\n ", i.onclick = async () => { - i.disabled = !0, i.textContent = R("btn.retrying"); - let a = await pe(lt.RETRY_SERVICES, {}); - i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? km(e, t, n, r) : (lm(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); + return i.textContent = L("btn.retryServices"), i.style.cssText = "\n padding: 4px 10px;\n margin-top: 6px;\n font-size: 11px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.3);\n background: transparent;\n color: white;\n cursor: pointer;\n ", i.onclick = async () => { + i.disabled = !0, i.textContent = L("btn.retrying"); + let a = await me(p.RETRY_SERVICES, {}); + i.disabled = !1, i.textContent = L("btn.retryServices"), a.ok ? ah(e, t, n, r) : (Bm(t, [a.error || L("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); }, i; } -function jm() { +function sh() { try { - let e = localStorage?.getItem?.(im); + let e = localStorage?.getItem?.(Fm); if (!e) return null; let t = JSON.parse(e); return t && typeof t == "object" ? t : null; @@ -12177,15 +12693,15 @@ function jm() { return console.debug?.(e), null; } } -function Mm(e) { +function ch(e) { try { if (!e || typeof e != "object") return; - localStorage?.setItem?.(im, JSON.stringify(e)); + localStorage?.setItem?.(Fm, JSON.stringify(e)); } catch (e) { console.debug?.(e); } } -function Nm(e) { +function lh(e) { let t = [], n = (e, r = 0) => { if (!(!e || r > 2)) { if (typeof e == "number" && Number.isFinite(e)) t.push(e); @@ -12198,23 +12714,23 @@ function Nm(e) { }; return n(e, 0), t; } -function Pm(e) { +function uh(e) { if (!e || typeof e != "object") return !1; - if (tm) return !0; + if (Mm) return !0; try { - if (Lt()?.active) return !0; + if (yn()?.active) return !0; } catch (e) { console.debug?.(e); } - return Nm(e).some((e) => Number(e) > 0); + return lh(e).some((e) => Number(e) > 0); } -function Fm(e) { +function dh(e) { let t = []; e.images && t.push(`Images: ${e.images}`), e.videos && t.push(`Videos: ${e.videos}`), e.audio && t.push(`Audio: ${e.audio}`); let n = e.model3d || e.by_kind?.model3d || 0; return n && t.push(`3D: ${n}`), t.length ? t.join(" - ") : "Images: 0 - Videos: 0"; } -function Im(e) { +function fh(e) { if (!e || typeof e != "object") return ""; let t = (e) => e == null ? null : typeof e == "number" ? Number.isFinite(e) ? e : null : typeof e == "boolean" || typeof e == "string" ? e : null; return JSON.stringify({ @@ -12232,23 +12748,23 @@ function Im(e) { } }); } -function Lm(e, t, n) { - let r = jm(); +function ph(e, t, n) { + let r = sh(); if (!r) return !1; try { - Cm(n, r.tool_availability || {}, r.tool_paths || {}); + $m(n, r.tool_availability || {}, r.tool_paths || {}); } catch (e) { console.debug?.(e); } try { - return e.style.background = "var(--mjr-status-info, #64B5F6)", fm(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; + return e.style.background = "var(--mjr-status-info, #64B5F6)", Um(t, L("status.cached", "Last known status"), L("status.checking", "Checking status...")), !0; } catch (e) { return console.debug?.(e), !1; } } -function Rm(e, t, n) { - let r = Im(t), i = r && r !== String(n?.lastSignature || ""), a = Pm(t), o = e || am.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; - return a || i ? (o = am.ACTIVE, s = 0) : o === am.ACTIVE ? (o = am.COOLDOWN, s = 0) : o === am.COOLDOWN ? (s += 1, s >= 3 && (o = am.IDLE, s = 0)) : (o = i ? am.ACTIVE : am.IDLE, s = 0), { +function mh(e, t, n) { + let r = fh(t), i = r && r !== String(n?.lastSignature || ""), a = uh(t), o = e || Im.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; + return a || i ? (o = Im.ACTIVE, s = 0) : o === Im.ACTIVE ? (o = Im.COOLDOWN, s = 0) : o === Im.COOLDOWN ? (s += 1, s >= 3 && (o = Im.IDLE, s = 0)) : (o = i ? Im.ACTIVE : Im.IDLE, s = 0), { nextState: o, signature: r, hasChange: i, @@ -12256,14 +12772,14 @@ function Rm(e, t, n) { cooldownStablePolls: s }; } -function zm(e, t, n, r = null, i = null, a = null) { +function hh(e, t, n, r = null, i = null, a = null) { let o = "__MJR_STATUS_POLL_DISPOSE__", s = { lastCode: null, lastStatus: null, _pollTick: 0, _auxCached: !1 }, c = { - mode: am.ACTIVE, + mode: Im.ACTIVE, cooldownStablePolls: 0, lastSignature: "" }, l = typeof AbortController < "u" ? new AbortController() : null, u = async () => { @@ -12273,14 +12789,14 @@ function zm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } s._pollTick = Number(s._pollTick || 0) + 1; - let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await km(e, t, r, typeof a == "function" ? a() : null, s, { + let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await ah(e, t, r, typeof a == "function" ? a() : null, s, { signal: l?.signal || null, lightweight: n, - force: !!tm || s._pollTick <= 1 + force: !!Mm || s._pollTick <= 1 }); if (o && typeof o == "object") { - Mm(o); - let e = Rm(c.mode, o, c); + ch(o); + let e = mh(c.mode, o, c); c.mode = e.nextState, c.lastSignature = e.signature, c.cooldownStablePolls = e.cooldownStablePolls; } if (o && typeof i == "function") try { @@ -12290,7 +12806,7 @@ function zm(e, t, n, r = null, i = null, a = null) { } return o; }; - Lm(e, t, r), u(); + ph(e, t, r), u(); try { n._mjrStatusPollDispose?.(); } catch (e) { @@ -12311,7 +12827,7 @@ function zm(e, t, n, r = null, i = null, a = null) { } return 1; }, h = () => { - let e = om[c.mode] || Math.max(250, Number(z.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); + let e = Lm[c.mode] || Math.max(250, Number(R.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); d = setTimeout(async () => { try { if (l?.signal?.aborted) return; @@ -12319,7 +12835,7 @@ function zm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } let e = await u(); - if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = am.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { + if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = Im.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { n._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); @@ -12342,54 +12858,54 @@ function zm(e, t, n, r = null, i = null, a = null) { } h(); for (let i of n.querySelectorAll("#mjr-status-dot, #mjr-status-scan")) i.onclick = (n) => { - n.stopPropagation(), xm(e, t, r, typeof a == "function" ? a() : null); - }, i.title = R("btn.scan", "Scan"); + n.stopPropagation(), Zm(e, t, r, typeof a == "function" ? a() : null); + }, i.title = L("btn.scan", "Scan"); } // ui/vue/composables/useActiveAsset.ts -var Bm = vr(null), Vm = vr(null); -function Hm() { +var gh = mr(null), _h = mr(null); +function vh() { return { - activeAsset: Bm, - onUpdateCallback: Vm + activeAsset: gh, + onUpdateCallback: _h }; } -function Um(e, t) { - Vm.value = typeof t == "function" ? t : null, Bm.value = e ?? null; +function yh(e, t) { + _h.value = typeof t == "function" ? t : null, gh.value = e ?? null; } -function Wm() { - Bm.value = null, Vm.value = null; +function bh() { + gh.value = null, _h.value = null; } -function Gm(e, t) { - if (Bm.value && e) { - Bm.value = { - ...Bm.value, +function xh(e, t) { + if (gh.value && e) { + gh.value = { + ...gh.value, ...e }; try { - let e = t ?? Vm.value; - typeof e == "function" && e(Bm.value); + let e = t ?? _h.value; + typeof e == "function" && e(gh.value); } catch {} } } // ui/components/sidebar/SidebarView.ts -var Km = 360, qm = 240, Jm = 640; -function Ym() { +var Sh = 360, Ch = 240, wh = 640; +function Th() { try { - let e = Xt(), t = Number(e?.sidebar?.widthPx); - return Number.isFinite(t) ? Math.max(qm, Math.min(Jm, Math.round(t))) : Km; + let e = Mt(), t = Number(e?.sidebar?.widthPx); + return Number.isFinite(t) ? Math.max(Ch, Math.min(wh, Math.round(t))) : Sh; } catch { - return Km; + return Sh; } } -function Xm(e, t) { +function Eh(e, t) { if (!e) return; let n = String(e?.dataset?.position || "right").toLowerCase() === "left", r = "var(--mjr-border, rgba(255,255,255,0.12))"; if (t) { - let t = `${Ym()}px`; + let t = `${Th()}px`; e.style.flex = `0 0 ${t}`, e.style.width = t, e.style.maxWidth = t, e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = n ? "none" : `1px solid ${r}`, e.style.borderRight = n ? `1px solid ${r}` : "none"; } else e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none"; } -function Zm(e) { +function Dh(e) { if (e == null) return !1; let t = e; if (typeof e == "string") { @@ -12408,10 +12924,10 @@ function Zm(e) { } return !1; } -function Qm(e) { - return e ? !!(e.geninfo || e.prompt || Zm(e.metadata_raw)) : !1; +function Oh(e) { + return e ? !!(e.geninfo || e.prompt || Dh(e.metadata_raw)) : !1; } -async function $m(e, t, n) { +async function kh(e, t, n) { if (!e || !t) return; let r = String(t?.kind || "").toLowerCase() === "folder"; try { @@ -12420,7 +12936,7 @@ async function $m(e, t, n) { console.debug?.(e); } let i = e._requestSeq = (e._requestSeq || 0) + 1; - e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), Xm(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, Um(t, n); + e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), Eh(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, yh(t, n); let a = () => { e._currentFetchAbortController?.abort?.(); let t = typeof AbortController < "u" ? new AbortController() : null; @@ -12429,14 +12945,14 @@ async function $m(e, t, n) { e._requestSeq === i && e._currentAsset === t && (e._currentFullAsset = { ...e._currentFullAsset ?? t, ...r - }, Gm(r, n)); + }, xh(r, n)); }; (async () => { if (e._requestSeq !== i || e._currentAsset !== t) return; let n = a(), s = n.signal; if (r) { try { - let e = String(t?.filepath || t?.subfolder || "").trim(), r = String(t?.root_id || t?.rootId || "").trim(), i = r ? String(t?.subfolder || "").trim() : "", a = await P({ + let e = String(t?.filepath || t?.subfolder || "").trim(), r = String(t?.root_id || t?.rootId || "").trim(), i = r ? String(t?.subfolder || "").trim() : "", a = await ye({ filepath: e, root_id: r, subfolder: i @@ -12451,8 +12967,8 @@ async function $m(e, t, n) { } let c = () => e._currentFullAsset ?? t; try { - if (t.id && !Qm(c())) { - let e = await se(t.id, n); + if (t.id && !Oh(c())) { + let e = await Ue(t.id, n); if (s?.aborted) return; e?.ok && e.data && o(e.data); } @@ -12460,10 +12976,10 @@ async function $m(e, t, n) { s?.aborted || console.warn("Failed to load full asset metadata:", e); } if (!s?.aborted) { - if (!Qm(c())) { + if (!Oh(c())) { let e = String(c()?.filename || "").trim(), t = String(c()?.type || "output").trim().toLowerCase(), r = String(c()?.subfolder || "").trim(), i = String(c()?.root_id || c()?.rootId || "").trim(); if (e) try { - let a = await ke({ + let a = await Ye({ type: t, filename: e, subfolder: r, @@ -12489,9 +13005,9 @@ async function $m(e, t, n) { } })(); } -function eh(e) { +function Ah(e) { if (e) { - e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Xm(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Wm(); + e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Eh(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, bh(); try { e.dispatchEvent?.(new CustomEvent("mjr:sidebar-closed", { bubbles: !0 })); } catch (e) { @@ -12500,14 +13016,14 @@ function eh(e) { } } // ui/stores/usePanelStore.ts -var th = "mjr_panel_state", nh = /* @__PURE__ */ new Set([ +var jh = "mjr_panel_state", Mh = /* @__PURE__ */ new Set([ "output", "input", "all", "custom", "workflow" ]); -function rh(e, t = !1) { +function Nh(e, t = !1) { if (typeof e == "boolean") return e; if (typeof e == "string") { let t = e.trim().toLowerCase(); @@ -12526,71 +13042,71 @@ function rh(e, t = !1) { } return !!t; } -function ih(e, t = 0) { +function Ph(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function ah(e, t = "") { +function Fh(e, t = "") { return e == null ? t : String(e); } -function oh(e, t = 0, n = Infinity) { - return Math.max(t, Math.min(n, Math.floor(ih(e, t)))); +function Ih(e, t = 0, n = Infinity) { + return Math.max(t, Math.min(n, Math.floor(Ph(e, t)))); } -function sh(e) { - let t = ah(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; - return nh.has(n) ? n : "output"; +function Lh(e) { + let t = Fh(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; + return Mh.has(n) ? n : "output"; } -function ch(e) { +function Rh(e) { if (!e || typeof e != "object") return {}; let t = e; return { - scope: sh(t.scope), - customRootId: ah(t.customRootId), - customRootLabel: ah(t.customRootLabel), - currentFolderRelativePath: ah(t.currentFolderRelativePath || t.subfolder), - collectionId: ah(t.collectionId), - collectionName: ah(t.collectionName), - kindFilter: ah(t.kindFilter), - dateRangeFilter: ah(t.dateRangeFilter), - dateExactFilter: ah(t.dateExactFilter), - workflowOnly: rh(t.workflowOnly, !1), - minRating: oh(t.minRating, 0, 5), - minSizeMB: Math.max(0, ih(t.minSizeMB, 0)), - maxSizeMB: Math.max(0, ih(t.maxSizeMB, 0)), + scope: Lh(t.scope), + customRootId: Fh(t.customRootId), + customRootLabel: Fh(t.customRootLabel), + currentFolderRelativePath: Fh(t.currentFolderRelativePath || t.subfolder), + collectionId: Fh(t.collectionId), + collectionName: Fh(t.collectionName), + kindFilter: Fh(t.kindFilter), + dateRangeFilter: Fh(t.dateRangeFilter), + dateExactFilter: Fh(t.dateExactFilter), + workflowOnly: Nh(t.workflowOnly, !1), + minRating: Ih(t.minRating, 0, 5), + minSizeMB: Math.max(0, Ph(t.minSizeMB, 0)), + maxSizeMB: Math.max(0, Ph(t.maxSizeMB, 0)), resolutionCompare: t.resolutionCompare === "lte" ? "lte" : "gte", - minWidth: oh(t.minWidth), - minHeight: oh(t.minHeight), - maxWidth: oh(t.maxWidth), - maxHeight: oh(t.maxHeight), - workflowType: ah(t.workflowType), - workflowId: ah(t.workflowId || t.workflow_id), - workflowModelFilter: ah(t.workflowModelFilter || t.workflowModel || t.workflow_model), - workflowRunsOnFilter: ah(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), - sort: ah(t.sort || "mtime_desc"), - searchQuery: ah(t.searchQuery), + minWidth: Ih(t.minWidth), + minHeight: Ih(t.minHeight), + maxWidth: Ih(t.maxWidth), + maxHeight: Ih(t.maxHeight), + workflowType: Fh(t.workflowType), + workflowId: Fh(t.workflowId || t.workflow_id), + workflowModelFilter: Fh(t.workflowModelFilter || t.workflowModel || t.workflow_model), + workflowRunsOnFilter: Fh(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), + sort: Fh(t.sort || "mtime_desc"), + searchQuery: Fh(t.searchQuery), metadataSearchMode: String(t.metadataSearchMode || "AND").toUpperCase() === "OR" ? "OR" : "AND", - scrollTop: oh(t.scrollTop), - activeAssetId: ah(t.activeAssetId), - selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => ah(e).trim()).filter(Boolean).slice(0, 5e3) : [], - sidebarOpen: rh(t.sidebarOpen, !1) + scrollTop: Ih(t.scrollTop), + activeAssetId: Fh(t.activeAssetId), + selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => Fh(e).trim()).filter(Boolean).slice(0, 5e3) : [], + sidebarOpen: Nh(t.sidebarOpen, !1) }; } -function lh() { +function zh() { try { - let e = localStorage.getItem(th); - if (e) return ch(JSON.parse(e)); + let e = localStorage.getItem(jh); + if (e) return Rh(JSON.parse(e)); } catch {} return {}; } -function uh(e) { +function Bh(e) { try { let t = { ...e }; - delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem(th, JSON.stringify(t)); + delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem(jh, JSON.stringify(t)); } catch {} } -var dh = jr("mjr-panel", () => { - let e = lh(), t = Z(e.scope || "output"), n = Z(e.customRootId || ""), r = Z(e.customRootLabel || ""), i = Z(e.currentFolderRelativePath || ""), a = Z(e.collectionId || ""), o = Z(e.collectionName || ""), s = Z(e.kindFilter || ""), c = Z(e.dateRangeFilter || ""), l = Z(e.dateExactFilter || ""), u = Z(e.workflowOnly || !1), d = Z(e.minRating || 0), f = Z(e.minSizeMB || 0), p = Z(e.maxSizeMB || 0), m = Z(e.resolutionCompare || "gte"), h = Z(e.minWidth || 0), g = Z(e.minHeight || 0), _ = Z(e.maxWidth || 0), v = Z(e.maxHeight || 0), y = Z(e.workflowType || ""), b = Z(e.workflowId || ""), x = Z(e.workflowModelFilter || ""), S = Z(e.workflowRunsOnFilter || ""), C = Z(e.sort || "mtime_desc"), w = Z(e.searchQuery || ""), T = Z(e.metadataSearchMode || "AND"), E = Z(e.scrollTop || 0), D = Z(e.activeAssetId || ""), O = Z(e.selectedAssetIds || []), k = Z(e.sidebarOpen || !1), A = Z(0), j = Z(0), M = Z(""), N = Z([]), ee = Z(""), te = Z(""), P = null; - cr([ +var Vh = Sr("mjr-panel", () => { + let e = zh(), t = Q(e.scope || "output"), n = Q(e.customRootId || ""), r = Q(e.customRootLabel || ""), i = Q(e.currentFolderRelativePath || ""), a = Q(e.collectionId || ""), o = Q(e.collectionName || ""), s = Q(e.kindFilter || ""), c = Q(e.dateRangeFilter || ""), l = Q(e.dateExactFilter || ""), u = Q(e.workflowOnly || !1), d = Q(e.minRating || 0), f = Q(e.minSizeMB || 0), p = Q(e.maxSizeMB || 0), m = Q(e.resolutionCompare || "gte"), h = Q(e.minWidth || 0), g = Q(e.minHeight || 0), _ = Q(e.maxWidth || 0), v = Q(e.maxHeight || 0), y = Q(e.workflowType || ""), b = Q(e.workflowId || ""), x = Q(e.workflowModelFilter || ""), S = Q(e.workflowRunsOnFilter || ""), C = Q(e.sort || "mtime_desc"), w = Q(e.searchQuery || ""), T = Q(e.metadataSearchMode || "AND"), E = Q(e.scrollTop || 0), D = Q(e.activeAssetId || ""), O = Q(e.selectedAssetIds || []), k = Q(e.sidebarOpen || !1), A = Q(0), ee = Q(0), j = Q(""), M = Q([]), N = Q(""), te = Q(""), ne = null; + or([ t, n, r, @@ -12621,8 +13137,8 @@ var dh = jr("mjr-panel", () => { O, k ], () => { - P && clearTimeout(P), P = setTimeout(() => { - P = null, uh({ + ne && clearTimeout(ne), ne = setTimeout(() => { + ne = null, Bh({ scope: t.value, customRootId: n.value, customRootLabel: r.value, @@ -12655,36 +13171,36 @@ var dh = jr("mjr-panel", () => { }); }, 750); }, { deep: !0 }); - let ne = (e) => { - if (e.key === th && e.newValue) try { - let n = ch(JSON.parse(e.newValue)); + let P = (e) => { + if (e.key === jh && e.newValue) try { + let n = Rh(JSON.parse(e.newValue)); n.scope !== void 0 && (t.value = n.scope), n.customRootLabel !== void 0 && (r.value = n.customRootLabel), n.searchQuery !== void 0 && (w.value = n.searchQuery), n.metadataSearchMode !== void 0 && (T.value = n.metadataSearchMode), n.sort !== void 0 && (C.value = n.sort), n.sidebarOpen !== void 0 && (k.value = n.sidebarOpen); } catch {} }; try { - window.addEventListener("storage", ne); + window.addEventListener("storage", P); } catch {} - Tr(() => { + cr(() => { try { - window.removeEventListener("storage", ne); + window.removeEventListener("storage", P); } catch {} }); - function F() { + function re() { s.value = "", c.value = "", l.value = "", u.value = !1, d.value = 0, f.value = 0, p.value = 0, m.value = "gte", h.value = 0, g.value = 0, _.value = 0, v.value = 0, y.value = "", b.value = "", x.value = "", S.value = "", w.value = ""; } - function re() { + function F() { O.value = [], D.value = ""; } - function ie(e, t = "") { + function I(e, t = "") { O.value = Array.isArray(e) ? e.map(String).filter(Boolean) : [], D.value = t || O.value[0] || ""; } - function ae(e, s = {}) { - t.value = e, i.value = s.folder || "", a.value = s.collectionId || "", o.value = s.collectionName || "", n.value = s.customRootId || "", r.value = s.customRootLabel || "", M.value = "", N.value = [], ee.value = "", te.value = "", re(); + function ie(e, s = {}) { + t.value = e, i.value = s.folder || "", a.value = s.collectionId || "", o.value = s.collectionName || "", n.value = s.customRootId || "", r.value = s.customRootLabel || "", j.value = "", M.value = [], N.value = "", te.value = "", F(); } - async function I() { + async function ae() { let e = String(n.value || "").trim(); if (e) try { - let a = await le("/mjr/am/custom-roots"), o = (Array.isArray(a?.data) ? a.data : []).find((t) => String(t?.id || "") === e); + let a = await Pe("/mjr/am/custom-roots"), o = (Array.isArray(a?.data) ? a.data : []).find((t) => String(t?.id || "") === e); if (!o) { n.value = "", r.value = "", t.value === "custom" && (t.value = "output", i.value = ""); return; @@ -12724,29 +13240,29 @@ var dh = jr("mjr-panel", () => { selectedAssetIds: O, sidebarOpen: k, lastGridCount: A, - lastGridTotal: j, - viewScope: M, - similarResults: N, - similarTitle: ee, + lastGridTotal: ee, + viewScope: j, + similarResults: M, + similarTitle: N, similarSourceAssetId: te, - resetFilters: F, - clearSelection: re, - setSelection: ie, - navigateToScope: ae, - validatePersistedCustomRoot: I + resetFilters: re, + clearSelection: F, + setSelection: I, + navigateToScope: ie, + validatePersistedCustomRoot: ae }; }); // ui/stores/getOptionalPanelStore.ts -function fh() { +function Hh() { try { - return Mr() ? dh() : null; + return Cr() ? Vh() : null; } catch { return null; } } // ui/stores/panelStateBridge.ts -function ph(e, t = []) { - let n = fh(); +function Uh(e, t = []) { + let n = Hh(); return { panelStore: n, hydrateStoreFromLegacy: () => {}, @@ -12773,12 +13289,12 @@ function ph(e, t = []) { }; } // ui/features/panel/messages/messageCenter.ts -var mh = "mjr_panel_messages_v1", hh = "mjr_panel_messages_last_read_v1", gh = "mjr_panel_messages_dismissed_builtin_ids_v1", _h = 120, vh = "/mjr/am/user-guide", yh = /* @__PURE__ */ new Set([ +var Wh = "mjr_panel_messages_v1", Gh = "mjr_panel_messages_last_read_v1", Kh = "mjr_panel_messages_dismissed_builtin_ids_v1", qh = 120, Jh = "/mjr/am/user-guide", Yh = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" -]), bh = "mjr:panel-messages-changed", xh = !1, Sh = [], Ch = Object.freeze([ +]), Xh = "mjr:panel-messages-changed", Zh = !1, Qh = [], $h = Object.freeze([ { id: "whats-new-2026-07-09-version-2-5-0", title: "New Version 2.5.0", @@ -12901,7 +13417,7 @@ var mh = "mjr_panel_messages_v1", hh = "mjr_panel_messages_last_read_v1", gh = " bodyKey: "msg.whatsNew.body.localUserGuide", actionLabel: "User Guide", actionLabelKey: "label.userGuide", - actionUrl: vh + actionUrl: Jh }, { id: "tip-2026-04-07-output-folder-override", @@ -13083,27 +13599,27 @@ var mh = "mjr_panel_messages_v1", hh = "mjr_panel_messages_last_read_v1", gh = " actionLabelKey: "label.settingsGuide", actionUrl: "docs/SETTINGS_CONFIGURATION.md" } -]), wh = new Set(Ch.map((e) => String(e?.id || "").trim()).filter(Boolean)); -function Th(e, t = 0) { +]), eg = new Set($h.map((e) => String(e?.id || "").trim()).filter(Boolean)); +function tg(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function Eh() { +function ng() { return Date.now(); } -function Dh() { - return dt(`msg-${Eh()}-`, 6); +function rg() { + return Ae(`msg-${ng()}-`, 6); } -function Oh(e) { +function ig(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : yh.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : Yh.has(t) ? t : "info"; } -function kh(e) { - return wh.has(String(e || "").trim()); +function ag(e) { + return eg.has(String(e || "").trim()); } -function Ah(e = {}) { +function og(e = {}) { return { - id: String(e?.id || "").trim() || Dh(), + id: String(e?.id || "").trim() || rg(), title: String(e?.title || "").trim() || "Info", titleKey: String(e?.titleKey || "").trim(), emoji: String(e?.emoji || "").trim(), @@ -13111,14 +13627,14 @@ function Ah(e = {}) { bodyKey: String(e?.bodyKey || "").trim(), category: String(e?.category || "").trim() || "Info", categoryKey: String(e?.categoryKey || "").trim(), - createdAt: Th(e?.createdAt, Eh()), - level: Oh(e?.level), + createdAt: tg(e?.createdAt, ng()), + level: ig(e?.level), actionLabel: String(e?.actionLabel || "").trim(), actionLabelKey: String(e?.actionLabelKey || "").trim(), actionUrl: String(e?.actionUrl || "").trim() }; } -function jh(e, t) { +function sg(e, t) { try { let n = localStorage.getItem(e); return n ? JSON.parse(n) : t; @@ -13126,87 +13642,87 @@ function jh(e, t) { return t; } } -function Mh(e, t) { +function cg(e, t) { try { localStorage.setItem(e, JSON.stringify(t)); } catch {} } -function Nh() { +function lg() { try { - return Th(localStorage.getItem(hh), 0); + return tg(localStorage.getItem(Gh), 0); } catch { return 0; } } -function Ph(e) { +function ug(e) { try { - localStorage.setItem(hh, String(Th(e, Eh()))); + localStorage.setItem(Gh, String(tg(e, ng()))); } catch {} } -function Fh() { - let e = jh(gh, []); - return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => kh(e))); +function dg() { + let e = sg(Kh, []); + return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => ag(e))); } -function Ih() { - Sh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), Sh.length > _h && (Sh = Sh.slice(0, _h)); +function fg() { + Qh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), Qh.length > qh && (Qh = Qh.slice(0, qh)); } -function Lh() { - Mh(mh, Sh); +function pg() { + cg(Wh, Qh); } -function Rh() { - let e = Fh(), t = !1; - for (let n of Ch) { - let r = Ah(n); +function mg() { + let e = dg(), t = !1; + for (let n of $h) { + let r = og(n); if (e.has(r.id)) continue; - let i = Sh.findIndex((e) => e.id === r.id); + let i = Qh.findIndex((e) => e.id === r.id); if (i < 0) { - Sh.push(r), t = !0; + Qh.push(r), t = !0; continue; } - let a = Sh[i], o = { + let a = Qh[i], o = { ...a, ...r, - createdAt: Th(a?.createdAt, r.createdAt) + createdAt: tg(a?.createdAt, r.createdAt) }; - JSON.stringify(a) !== JSON.stringify(o) && (Sh[i] = o, t = !0); + JSON.stringify(a) !== JSON.stringify(o) && (Qh[i] = o, t = !0); } - return t ? (Ih(), Lh(), !0) : !1; + return t ? (fg(), pg(), !0) : !1; } -function zh() { +function hg() { try { - window.dispatchEvent(new CustomEvent(bh, { detail: { - total: Sh.length, - unread: Uh() + window.dispatchEvent(new CustomEvent(Xh, { detail: { + total: Qh.length, + unread: yg() } })); } catch (e) { console.debug?.(e); } } -function Bh() { - if (xh) return; - xh = !0; - let e = jh(mh, []); - Sh = (Array.isArray(e) ? e : []).map(Ah), Ih(); +function gg() { + if (Zh) return; + Zh = !0; + let e = sg(Wh, []); + Qh = (Array.isArray(e) ? e : []).map(og), fg(); } -function Vh() { - Bh(), Rh() && zh(); +function _g() { + gg(), mg() && hg(); } -function Hh() { - return Bh(), Sh.map((e) => ({ ...e })); +function vg() { + return gg(), Qh.map((e) => ({ ...e })); } -function Uh() { - Bh(); - let e = Nh(); - return Sh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); +function yg() { + gg(); + let e = lg(); + return Qh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); } -function Wh() { - return Bh(), Nh(); +function bg() { + return gg(), lg(); } -function Gh({ upTo: e = Eh() } = {}) { - Bh(), Ph(Th(e, Eh())), zh(); +function xg({ upTo: e = ng() } = {}) { + gg(), ug(tg(e, ng())), hg(); } // ui/features/panel/messages/shortcutGuide.ts -var Kh = Object.freeze([ +var Sg = Object.freeze([ { id: "panel", titleKey: "msg.shortcuts.section.panel", @@ -13415,22 +13931,22 @@ var Kh = Object.freeze([ ]) } ]); -function qh() { - return Kh.map((e) => ({ +function Cg() { + return Sg.map((e) => ({ ...e, items: Array.isArray(e.items) ? e.items.map((e) => ({ ...e })) : [] })); } -function Jh() { +function wg() { let e = document.createElement("div"); e.className = "mjr-shortcut-guide"; let t = document.createElement("div"); - t.className = "mjr-shortcut-guide-intro", t.textContent = R("msg.shortcuts.intro", "Current keyboard shortcuts grouped by section for quick reference."), e.appendChild(t); - for (let t of qh()) { + t.className = "mjr-shortcut-guide-intro", t.textContent = L("msg.shortcuts.intro", "Current keyboard shortcuts grouped by section for quick reference."), e.appendChild(t); + for (let t of Cg()) { let n = document.createElement("section"); n.className = "mjr-shortcut-section"; let r = document.createElement("div"); - r.className = "mjr-shortcut-section-title", r.textContent = R(t.titleKey, t.title), n.appendChild(r); + r.className = "mjr-shortcut-section-title", r.textContent = L(t.titleKey, t.title), n.appendChild(r); let i = document.createElement("div"); i.className = "mjr-shortcut-list"; for (let e of t.items) { @@ -13446,18 +13962,18 @@ function Jh() { return e; } // ui/features/panel/messages/messagePopoverController.ts -var Yh = /* @__PURE__ */ new Set([ +var Tg = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" -]), Xh = 2200, Zh = /* @__PURE__ */ new Set([ +]), Eg = 2200, Dg = /* @__PURE__ */ new Set([ "started", "queued", "running", "pending", "in_progress" -]), Qh = /* @__PURE__ */ new Set([ +]), Og = /* @__PURE__ */ new Set([ "succeeded", "success", "complete", @@ -13468,7 +13984,7 @@ var Yh = /* @__PURE__ */ new Set([ "cancelled", "canceled" ]); -function $h(e) { +function kg(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return ""; try { @@ -13483,15 +13999,15 @@ function $h(e) { return ""; } } -function eg(e, t, n, r) { +function Ag(e, t, n, r) { let i = String(e?.[t] || "").trim(), a = String(e?.[n] || r || "").trim() || String(r || ""); - return i ? R(i, a) : a; + return i ? L(i, a) : a; } -function tg(e) { +function jg(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : Yh.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : Tg.has(t) ? t : "info"; } -function ng(e) { +function Mg(e) { let t = String(e || "").trim(); if (!t) return ""; try { @@ -13501,13 +14017,13 @@ function ng(e) { return ""; } } -function rg(e) { +function Ng(e) { let t = String(e?.emoji || "").trim(); if (t) return t; - let n = tg(e?.level); + let n = jg(e?.level); return n === "success" ? "OK" : n === "warning" ? "WARN" : n === "error" ? "ERR" : "INFO"; } -function ig(e) { +function Pg(e) { switch (String(e || "").toLowerCase()) { case "success": return "OK"; case "warning": return "WARN"; @@ -13515,22 +14031,22 @@ function ig(e) { default: return "Tip"; } } -function ag(e) { +function Fg(e) { if (e?.persistent) return "persistent"; let t = Number(e?.durationMs); return !Number.isFinite(t) || t <= 0 ? "" : t < 1e4 ? `${(t / 1e3).toFixed(1)}s` : `${Math.round(t / 1e3)}s`; } -function og(e) { +function Ig(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.replace(/[_-]+/g, " ") : ""; } -function sg(e) { +function Lg(e) { let t = e?.progress; if (!t || typeof t != "object") return ""; let n = String(t.label || "").trim(), r = Number(t.current), i = Number(t.total), a = Number(t.indexed), o = Number(t.skipped), s = Number(t.errors), c = []; return n && c.push(n), Number.isFinite(r) && Number.isFinite(i) && i > 0 && c.push(`${r}/${i}`), Number.isFinite(a) && c.push(`indexed ${a}`), Number.isFinite(o) && c.push(`skipped ${o}`), Number.isFinite(s) && s > 0 && c.push(`errors ${s}`), c.join(" | "); } -function cg(e) { +function Rg(e) { let t = e?.progress; if (!t || typeof t != "object") return null; let n = Number(t.percent); @@ -13538,15 +14054,15 @@ function cg(e) { let r = Number(t.current), i = Number(t.total); return Number.isFinite(r) && Number.isFinite(i) && i > 0 ? Math.max(0, Math.min(100, Math.round(r / i * 100))) : null; } -function lg(e) { +function zg(e) { return String(e?.trackId || "").trim() || [ String(e?.operation || "").trim(), String(e?.source || "").trim(), String(e?.title || "").trim() ].filter(Boolean).join(":"); } -function ug({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { - let u = e === "messages", d = e === "history", f = e === "shortcuts", p = u ? R("label.messages", "Messages") : d ? R("label.toastHistory", "History") : R("msg.shortcuts.title", "Shortcut Guide"); +function Bg({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { + let u = e === "messages", d = e === "history", f = e === "shortcuts", p = u ? L("label.messages", "Messages") : d ? L("label.toastHistory", "History") : L("msg.shortcuts.title", "Shortcut Guide"); try { r?.classList.toggle("is-active", u), r?.setAttribute("aria-selected", u ? "true" : "false"), r?.setAttribute("tabindex", u ? "0" : "-1"), i?.classList.toggle("is-active", d), i?.setAttribute("aria-selected", d ? "true" : "false"), i?.setAttribute("tabindex", d ? "0" : "-1"), a?.classList.toggle("is-active", f), a?.setAttribute("aria-selected", f ? "true" : "false"), a?.setAttribute("tabindex", f ? "0" : "-1"); } catch (e) { @@ -13558,32 +14074,32 @@ function ug({ activeTab: e = "messages", title: t = null, messagePopover: n = nu console.debug?.(e); } } -function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, messageList: r = null, historyTabBtn: i = null, historyTabBadge: a = null, historyTabCount: o = null, historyPanel: s = null, shortcutsPanel: c = null, messageTabBtn: l = null, messageTabBadge: u = null, shortcutsTabBtn: d = null, markReadBtn: f = null, popovers: p = null, onBeforeToggle: m = null, signal: h = null } = {}) { - Vh(); - let g = "messages", _ = !1, v = null, y = /* @__PURE__ */ new Set(), b = () => { - if (v) { +function Vg({ messageBtn: e = null, messagePopover: t = null, title: n = null, messageList: r = null, historyTabBtn: i = null, historyTabBadge: a = null, historyTabCount: o = null, historyPanel: s = null, shortcutsPanel: c = null, messageTabBtn: l = null, messageTabBadge: u = null, shortcutsTabBtn: d = null, markReadBtn: f = null, popovers: p = null, onBeforeToggle: h = null, signal: g = null } = {}) { + _g(); + let _ = "messages", v = !1, y = null, b = /* @__PURE__ */ new Set(), x = () => { + if (y) { try { - clearTimeout(v); + clearTimeout(y); } catch (e) { console.debug?.(e); } - v = null; + y = null; } - }, x = () => { - if (!_ || g !== "history" || t?.style?.display !== "block") return; - let e = te(); + }, S = () => { + if (!v || _ !== "history" || t?.style?.display !== "block") return; + let e = ie(); for (let n of e) { - let e = lg(n); - if (!e || !y.has(e)) continue; + let e = zg(n); + if (!e || !b.has(e)) continue; let r = String(n?.status || "").trim().toLowerCase(); - if (Qh.has(r)) { - b(), v = setTimeout(() => { - v = null, _ && g === "history" && t?.style?.display === "block" && (p?.close?.(t), _ = !1, y.clear(), S(), k()); - }, Xh); + if (Og.has(r)) { + x(), y = setTimeout(() => { + y = null, v && _ === "history" && t?.style?.display === "block" && (p?.close?.(t), v = !1, b.clear(), C(), A()); + }, Eg); return; } } - }, S = () => { + }, C = () => { let n = t?.style?.display === "block"; try { e?.setAttribute("aria-expanded", n ? "true" : "false"); @@ -13595,16 +14111,16 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } catch (e) { console.debug?.(e); } - }, C = () => { + }, w = () => { if (!r) return; - let e = Hh(), t = Wh(); + let e = vg(), t = bg(); if (r.replaceChildren(), !e.length) { let e = document.createElement("div"); - e.className = "mjr-messages-empty", e.textContent = R("msg.noMessages", "No messages for now."), r.appendChild(e); + e.className = "mjr-messages-empty", e.textContent = L("msg.noMessages", "No messages for now."), r.appendChild(e); } else for (let n of e) { let e = document.createElement("article"); e.className = "mjr-message-item"; - let i = tg(n?.level); + let i = jg(n?.level); e.classList.add(`mjr-message-item--${i}`); let a = Number(n?.createdAt || 0); a > Number(t || 0) && e.classList.add("mjr-message-item--unread"); @@ -13613,43 +14129,43 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let s = document.createElement("div"); s.className = "mjr-message-item-title-wrap"; let c = document.createElement("span"); - c.className = "mjr-message-item-emoji", c.textContent = rg(n), c.setAttribute("aria-hidden", "true"); + c.className = "mjr-message-item-emoji", c.textContent = Ng(n), c.setAttribute("aria-hidden", "true"); let l = document.createElement("div"); - l.className = "mjr-message-item-title", l.textContent = eg(n, "titleKey", "title", R("label.info", "Info")); + l.className = "mjr-message-item-title", l.textContent = Ag(n, "titleKey", "title", L("label.info", "Info")); let u = document.createElement("span"); - u.className = "mjr-message-item-category", u.textContent = eg(n, "categoryKey", "category", R("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); + u.className = "mjr-message-item-category", u.textContent = Ag(n, "categoryKey", "category", L("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); let d = document.createElement("div"); - d.className = "mjr-message-item-meta", d.textContent = $h(a); + d.className = "mjr-message-item-meta", d.textContent = kg(a); let f = document.createElement("div"); - f.className = "mjr-message-item-body", f.textContent = eg(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); - let p = ng(n?.actionUrl), m = eg(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); + f.className = "mjr-message-item-body", f.textContent = Ag(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); + let p = Mg(n?.actionUrl), m = Ag(n, "actionLabelKey", "actionLabel", L("label.readMe", "Read Me")); if (p && m) { let t = document.createElement("a"); t.className = "mjr-message-item-action", t.href = p, t.target = "_blank", t.rel = "noopener noreferrer", t.textContent = m, e.appendChild(t); } r.appendChild(e); } - }, w = () => { + }, T = () => { if (!s) return; - let e = te(), t = s.querySelector(".mjr-history-list"); + let e = ie(), t = s.querySelector(".mjr-history-list"); if (!t) { let e = document.createElement("div"); e.className = "mjr-history-head"; let n = document.createElement("span"); - n.className = "mjr-history-head-label", n.textContent = R("label.recentActivity", "Recent activity"); + n.className = "mjr-history-head-label", n.textContent = L("label.recentActivity", "Recent activity"); let r = document.createElement("button"); - r.type = "button", r.className = "mjr-btn mjr-history-clear-btn", r.textContent = R("btn.clearHistory", "Clear"), r.title = R("tooltip.clearToastHistory", "Clear toast history"), r.addEventListener("click", (e) => { - e.stopPropagation(), xe(), w(); - }, h ? { signal: h } : void 0), e.appendChild(n), e.appendChild(r), t = document.createElement("div"), t.className = "mjr-history-list", s.replaceChildren(e, t); + r.type = "button", r.className = "mjr-btn mjr-history-clear-btn", r.textContent = L("btn.clearHistory", "Clear"), r.title = L("tooltip.clearToastHistory", "Clear toast history"), r.addEventListener("click", (e) => { + e.stopPropagation(), m(), T(); + }, g ? { signal: g } : void 0), e.appendChild(n), e.appendChild(r), t = document.createElement("div"), t.className = "mjr-history-list", s.replaceChildren(e, t); } if (t.replaceChildren(), !e.length) { let e = document.createElement("div"); - e.className = "mjr-messages-empty", e.textContent = R("msg.noHistory", "No recent activity."), t.appendChild(e); + e.className = "mjr-messages-empty", e.textContent = L("msg.noHistory", "No recent activity."), t.appendChild(e); } else for (let n of e) { let e = document.createElement("div"); e.className = `mjr-history-item mjr-history-item--${String(n.type || "info")}`; let r = document.createElement("span"); - r.className = "mjr-history-item-icon", r.textContent = ig(n.type), r.setAttribute("aria-hidden", "true"); + r.className = "mjr-history-item-icon", r.textContent = Pg(n.type), r.setAttribute("aria-hidden", "true"); let i = document.createElement("div"); i.className = "mjr-history-item-content"; let a = String(n.title || "").trim(), o = String(n.detail || "").trim(), s = String(n.message || "").trim(), c = a || s, l = a && o ? o : a ? "" : o, u = document.createElement("div"); @@ -13659,14 +14175,14 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let f = document.createElement("div"); f.className = "mjr-history-item-meta"; let p = document.createElement("span"); - p.className = "mjr-history-item-time", p.textContent = $h(n.createdAt); + p.className = "mjr-history-item-time", p.textContent = kg(n.createdAt); let m = document.createElement("span"); - m.className = "mjr-history-item-chip", m.textContent = ag(n); + m.className = "mjr-history-item-chip", m.textContent = Fg(n); let h = document.createElement("span"); h.className = "mjr-history-item-chip", h.textContent = String(n.source || "").trim(); let g = document.createElement("span"); - g.className = "mjr-history-item-chip", g.textContent = og(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); - let _ = sg(n), v = cg(n); + g.className = "mjr-history-item-chip", g.textContent = Ig(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); + let _ = Lg(n), v = Rg(n); if (_ || v !== null) { let e = document.createElement("div"); if (e.className = "mjr-history-item-progress", _) { @@ -13681,49 +14197,49 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } i.appendChild(e); } - let y = ng(n?.actionUrl), b = String(n?.actionLabel || "").trim(); + let y = Mg(n?.actionUrl), b = String(n?.actionLabel || "").trim(); if (y && b) { let e = document.createElement("a"); e.className = "mjr-history-item-action", e.href = y, e.target = "_blank", e.rel = "noopener noreferrer", e.textContent = b, i.appendChild(e); } e.appendChild(r), e.appendChild(i), t.appendChild(e); } - }, T = (e, t) => { + }, E = (e, t) => { if (!e) return; let n = Math.max(0, Number(t || 0) || 0); n <= 0 ? (e.style.display = "none", e.textContent = "") : (e.style.display = "inline-flex", e.textContent = n > 99 ? "99+" : String(n)); - }, E = () => { - let e = de(); - a && (a.style.display = e > 0 ? "inline-block" : "none"), T(o, e); }, D = () => { - c && (c.childNodes.length > 0 || c.replaceChildren(Jh())); + let e = oe(); + a && (a.style.display = e > 0 ? "inline-block" : "none"), E(o, e); }, O = () => { - if (!f) return; - let e = Math.max(0, Number(Uh() || 0) || 0); - f.disabled = e <= 0, f.title = e > 0 ? R("tooltip.markMessagesRead", "Mark all messages as read") : R("tooltip.noUnreadMessages", "No unread messages"); + c && (c.childNodes.length > 0 || c.replaceChildren(wg())); }, k = () => { - let t = Math.max(0, Number(Uh() || 0) || 0); + if (!f) return; + let e = Math.max(0, Number(yg() || 0) || 0); + f.disabled = e <= 0, f.title = e > 0 ? L("tooltip.markMessagesRead", "Mark all messages as read") : L("tooltip.noUnreadMessages", "No unread messages"); + }, A = () => { + let t = Math.max(0, Number(yg() || 0) || 0); if (e) { - let n = e.querySelector(".mjr-message-badge"), r = t > 0 ? R("tooltip.openMessagesUnread", "Messages ({count} unread)", { count: t }) : R("tooltip.openMessages", "Messages and updates"); + let n = e.querySelector(".mjr-message-badge"), r = t > 0 ? L("tooltip.openMessagesUnread", "Messages ({count} unread)", { count: t }) : L("tooltip.openMessages", "Messages and updates"); e.classList.toggle("mjr-message-has-unread", t > 0), e.title = r, e.setAttribute("aria-label", r), n && (t <= 0 ? (n.style.display = "none", n.textContent = "") : (n.style.display = "inline-flex", n.textContent = t > 9 ? "9+" : String(t))); } - T(u, t), O(); - }, A = () => { - k(), E(), t?.style?.display === "block" && (g === "messages" && C(), g === "history" && w()); - }, j = h ? { signal: h } : void 0; + E(u, t), k(); + }, ee = () => { + A(), D(), t?.style?.display === "block" && (_ === "messages" && w(), _ === "history" && T()); + }, j = g ? { signal: g } : void 0; try { - window.addEventListener(bh, A, j); + window.addEventListener(Xh, ee, j); } catch (e) { console.debug?.(e); } try { - window.addEventListener(_e, () => { - if (E(), t?.style?.display === "block" && g === "history" && w(), _) { - for (let e of te()) { - let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); - n && Zh.has(t) && y.add(n); + window.addEventListener(ze, () => { + if (D(), t?.style?.display === "block" && _ === "history" && T(), v) { + for (let e of ie()) { + let t = String(e?.status || "").trim().toLowerCase(), n = zg(e); + n && Dg.has(t) && b.add(n); } - x(); + S(); } }, j); } catch (e) { @@ -13736,7 +14252,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } let M = null; try { - typeof MutationObserver < "u" && t && (M = new MutationObserver(S), M.observe(t, { + typeof MutationObserver < "u" && t && (M = new MutationObserver(C), M.observe(t, { attributes: !0, attributeFilter: ["style"] })); @@ -13744,12 +14260,12 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m console.debug?.(e); } try { - h?.addEventListener?.("abort", () => M?.disconnect?.(), { once: !0 }); + g?.addEventListener?.("abort", () => M?.disconnect?.(), { once: !0 }); } catch (e) { console.debug?.(e); } - k(), E(), S(), ug({ - activeTab: g, + A(), D(), C(), Bg({ + activeTab: _, title: n, messagePopover: t, messageTabBtn: l, @@ -13761,8 +14277,8 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m markReadBtn: f }); let N = () => { - g = "messages", ug({ - activeTab: g, + _ = "messages", Bg({ + activeTab: _, title: n, messagePopover: t, messageTabBtn: l, @@ -13772,10 +14288,10 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m historyPanel: s, shortcutsPanel: c, markReadBtn: f - }), C(), Gh(), k(); - }, ee = () => { - g = "history", ug({ - activeTab: g, + }), w(), xg(), A(); + }, te = () => { + _ = "history", Bg({ + activeTab: _, title: n, messagePopover: t, messageTabBtn: l, @@ -13785,10 +14301,10 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m historyPanel: s, shortcutsPanel: c, markReadBtn: f - }), w(), ye(), E(); - }, P = () => { - g = "shortcuts", ug({ - activeTab: g, + }), T(), ce(), D(); + }, ne = () => { + _ = "shortcuts", Bg({ + activeTab: _, title: n, messagePopover: t, messageTabBtn: l, @@ -13798,56 +14314,56 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m historyPanel: s, shortcutsPanel: c, markReadBtn: f - }), D(); - }, ne = (e) => { - e === "messages" ? N() : e === "history" ? ee() : P(); - }, F = () => { + }), O(); + }, P = (e) => { + e === "messages" ? N() : e === "history" ? te() : ne(); + }, re = () => { if (t && p && e) { if (t?.style?.display !== "block") { try { - typeof m == "function" && m(); + typeof h == "function" && h(); } catch (e) { console.debug?.(e); } p.toggle(t, e); } - ee(), _ = !0, b(), y.clear(); - for (let e of te()) { - let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); - n && Zh.has(t) && y.add(n); + te(), v = !0, x(), b.clear(); + for (let e of ie()) { + let t = String(e?.status || "").trim().toLowerCase(), n = zg(e); + n && Dg.has(t) && b.add(n); } - x(), S(), k(); + S(), C(), A(); } }; try { window.addEventListener(B.OPEN_MESSAGE_HISTORY, () => { - F(); + re(); }, j); } catch (e) { console.debug?.(e); } - let re = [ + let F = [ "messages", "history", "shortcuts" - ], ie = (e, t) => { - let n = String(e?.key || "").toLowerCase(), r = re.indexOf(String(t || "").toLowerCase()); + ], I = (e, t) => { + let n = String(e?.key || "").toLowerCase(), r = F.indexOf(String(t || "").toLowerCase()); if (!(r < 0)) { if (n === "arrowright") { e.preventDefault(); - let t = re[(r + 1) % re.length]; - ne(t), t === "messages" && l?.focus?.(), t === "history" && i?.focus?.(), t === "shortcuts" && d?.focus?.(); + let t = F[(r + 1) % F.length]; + P(t), t === "messages" && l?.focus?.(), t === "history" && i?.focus?.(), t === "shortcuts" && d?.focus?.(); } else if (n === "arrowleft") { e.preventDefault(); - let t = re[(r + re.length - 1) % re.length]; - ne(t), t === "messages" && l?.focus?.(), t === "history" && i?.focus?.(), t === "shortcuts" && d?.focus?.(); - } else n === "home" ? (e.preventDefault(), N(), l?.focus?.()) : n === "end" ? (e.preventDefault(), P(), d?.focus?.()) : (n === " " || n === "enter") && (e.preventDefault(), ne(t)); + let t = F[(r + F.length - 1) % F.length]; + P(t), t === "messages" && l?.focus?.(), t === "history" && i?.focus?.(), t === "shortcuts" && d?.focus?.(); + } else n === "home" ? (e.preventDefault(), N(), l?.focus?.()) : n === "end" ? (e.preventDefault(), ne(), d?.focus?.()) : (n === " " || n === "enter") && (e.preventDefault(), P(t)); } }; return e?.addEventListener("click", (a) => { if (t && p && e) { - a.stopPropagation(), _ = !1, y.clear(), b(), g = "messages", C(), D(), ug({ - activeTab: g, + a.stopPropagation(), v = !1, b.clear(), x(), _ = "messages", w(), O(), Bg({ + activeTab: _, title: n, messagePopover: t, messageTabBtn: l, @@ -13859,35 +14375,35 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m markReadBtn: f }); try { - typeof m == "function" && m(); + typeof h == "function" && h(); } catch (e) { console.debug?.(e); } - p.toggle(t, e), t?.style?.display === "block" && Gh(), S(), k(); + p.toggle(t, e), t?.style?.display === "block" && xg(), C(), A(); } }, j), l?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), N(); - }, j), l?.addEventListener("keydown", (e) => ie(e, "messages"), j), i?.addEventListener("click", (e) => { - e.preventDefault(), e.stopPropagation(), _ = !1, y.clear(), b(), ee(); - }, j), i?.addEventListener("keydown", (e) => ie(e, "history"), j), d?.addEventListener("click", (e) => { - e.preventDefault(), e.stopPropagation(), P(); - }, j), d?.addEventListener("keydown", (e) => ie(e, "shortcuts"), j), f?.addEventListener("click", (e) => { - e.preventDefault(), e.stopPropagation(), Gh(), C(), k(); + }, j), l?.addEventListener("keydown", (e) => I(e, "messages"), j), i?.addEventListener("click", (e) => { + e.preventDefault(), e.stopPropagation(), v = !1, b.clear(), x(), te(); + }, j), i?.addEventListener("keydown", (e) => I(e, "history"), j), d?.addEventListener("click", (e) => { + e.preventDefault(), e.stopPropagation(), ne(); + }, j), d?.addEventListener("keydown", (e) => I(e, "shortcuts"), j), f?.addEventListener("click", (e) => { + e.preventDefault(), e.stopPropagation(), xg(), w(), A(); }, j), { - refresh: A, - render: C, - updateButtonState: k, + refresh: ee, + render: w, + updateButtonState: A, showMessagesTab: N, - showHistoryTab: ee, - showShortcutsTab: P, - openHistoryPopover: F, + showHistoryTab: te, + showShortcutsTab: ne, + openHistoryPopover: re, close: () => { - t && p && (p.close(t), _ = !1, y.clear(), b(), S()); + t && p && (p.close(t), v = !1, b.clear(), x(), C()); } }; } // ui/features/panel/controllers/query.ts -function fg(e) { +function Hg(e) { let t = e; for (let e = 0; e < 3 && t && typeof t == "object" && "value" in t; e += 1) { let e = t.value; @@ -13896,8 +14412,8 @@ function fg(e) { } return t; } -function pg(e) { - let t = fg(e); +function Ug(e) { + let t = Hg(e); if (!t) return null; let n = String(t?.tagName || "").toUpperCase(); if (n === "INPUT" || n === "TEXTAREA") return t; @@ -13911,13 +14427,13 @@ function pg(e) { } return null; } -function mg(e) { - let t = pg(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; +function Wg(e) { + let t = Ug(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; return String(n || "").trim() || "*"; } // ui/features/panel/controllers/gridController.ts -function hg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollectionAssets: r, disposeGrid: i, getQuery: a, searchInputEl: o, state: s }) { - let { read: c, write: l } = ph(s, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), u = !1, d = !1, f = {}, p = 0, m = 0, h = 3e4, g = async (e, t = h) => { +function Gg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollectionAssets: i, disposeGrid: a, getQuery: o, searchInputEl: s, state: c }) { + let { read: l, write: u } = Uh(c, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), d = !1, f = !1, p = {}, m = 0, h = 0, g = 3e4, _ = async (e, t = g) => { let n = null; try { let r = new Promise((e, r) => { @@ -13930,19 +14446,19 @@ function hg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect } finally { n && clearTimeout(n); } - }, _ = () => { + }, v = () => { try { - return o?.dataset?.mjrSemanticMode === "1"; + return s?.dataset?.mjrSemanticMode === "1"; } catch { return !1; } - }, v = () => { + }, y = () => { try { - return !!(Xt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Mt()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } - }, y = (e, t = "") => { + }, b = (e, t = "") => { try { if (e && typeof e == "object") return String(e.error || e.message || t || "").trim(); } catch {} @@ -13951,44 +14467,44 @@ function hg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect } catch { return String(t || "").trim(); } - }, b = (e = []) => !Array.isArray(e) || e.length === 0 ? !1 : e.some((e) => { + }, x = (e = []) => !Array.isArray(e) || e.length === 0 ? !1 : e.some((e) => { if (String(e?._matchType || e?.matchType || "").trim().toLowerCase().includes("semantic")) return !0; let t = Number(e?._vectorScore ?? e?.vectorScore ?? NaN); return Number.isFinite(t) && t > 0; - }), x = () => { - let e = String(c("currentFolderRelativePath", "") || "").trim(); + }), S = () => { + let e = String(l("currentFolderRelativePath", "") || "").trim(); return { - subfolder: (c("scope", "output") !== "custom" || c("customRootId", "")) && e ? e : null, - kind: c("kindFilter", "") || null, - hasWorkflow: c("workflowOnly", !1) ? !0 : null, - minRating: Number(c("minRating", 0) || 0) > 0 ? Number(c("minRating", 0) || 0) : null, - minSizeMB: Number(c("minSizeMB", 0) || 0) > 0 ? Number(c("minSizeMB", 0) || 0) : null, - maxSizeMB: Number(c("maxSizeMB", 0) || 0) > 0 ? Number(c("maxSizeMB", 0) || 0) : null, - minWidth: Number(c("minWidth", 0) || 0) > 0 ? Number(c("minWidth", 0) || 0) : null, - minHeight: Number(c("minHeight", 0) || 0) > 0 ? Number(c("minHeight", 0) || 0) : null, - maxWidth: Number(c("maxWidth", 0) || 0) > 0 ? Number(c("maxWidth", 0) || 0) : null, - maxHeight: Number(c("maxHeight", 0) || 0) > 0 ? Number(c("maxHeight", 0) || 0) : null, - workflowType: String(c("workflowType", "") || "").trim().toUpperCase() || null, - workflowId: String(c("workflowId", "") || "").trim() || null, - workflowModel: String(c("workflowModelFilter", "") || "").trim() || null, - runsOn: String(c("workflowRunsOnFilter", "") || "").trim().toLowerCase() || null, - dateRange: String(c("dateRangeFilter", "") || "").trim().toLowerCase() || null, - dateExact: String(c("dateExactFilter", "") || "").trim() || null + subfolder: (l("scope", "output") !== "custom" || l("customRootId", "")) && e ? e : null, + kind: l("kindFilter", "") || null, + hasWorkflow: l("workflowOnly", !1) ? !0 : null, + minRating: Number(l("minRating", 0) || 0) > 0 ? Number(l("minRating", 0) || 0) : null, + minSizeMB: Number(l("minSizeMB", 0) || 0) > 0 ? Number(l("minSizeMB", 0) || 0) : null, + maxSizeMB: Number(l("maxSizeMB", 0) || 0) > 0 ? Number(l("maxSizeMB", 0) || 0) : null, + minWidth: Number(l("minWidth", 0) || 0) > 0 ? Number(l("minWidth", 0) || 0) : null, + minHeight: Number(l("minHeight", 0) || 0) > 0 ? Number(l("minHeight", 0) || 0) : null, + maxWidth: Number(l("maxWidth", 0) || 0) > 0 ? Number(l("maxWidth", 0) || 0) : null, + maxHeight: Number(l("maxHeight", 0) || 0) > 0 ? Number(l("maxHeight", 0) || 0) : null, + workflowType: String(l("workflowType", "") || "").trim().toUpperCase() || null, + workflowId: String(l("workflowId", "") || "").trim() || null, + workflowModel: String(l("workflowModelFilter", "") || "").trim() || null, + runsOn: String(l("workflowRunsOnFilter", "") || "").trim().toLowerCase() || null, + dateRange: String(l("dateRangeFilter", "") || "").trim().toLowerCase() || null, + dateExact: String(l("dateExactFilter", "") || "").trim() || null }; - }, S = async (e = "") => { + }, C = async (e = "") => { let t = Date.now(); - if (t - Number(m || 0) < 15e3) return; - m = t; + if (t - Number(h || 0) < 15e3) return; + h = t; try { - let e = await k(); + let e = await r(); if (e?.ok && e?.data) { let t = Number(e.data?.total || 0) || 0, n = Number(e.data?.eligible_total || 0) || 0, r = Number(e.data?.coverage_ratio ?? NaN); if (t <= 10) { - I(R("toast.aiSearchNeedsBackfill", "AI search index is almost empty ({count} vectors). Run Enrich, then Vector Backfill for existing assets.", { count: t }), "warn", 6500); + F(L("toast.aiSearchNeedsBackfill", "AI search index is almost empty ({count} vectors). Run Enrich, then Vector Backfill for existing assets.", { count: t }), "warn", 6500); return; } if (n > 0 && Number.isFinite(r) && r > 0 && r < .75) { - I(R("toast.aiSearchPartiallyIndexed", "AI search index is only partially built ({indexed}/{eligible}, {percent}%). Run Vector Backfill for existing assets.", { + F(L("toast.aiSearchPartiallyIndexed", "AI search index is only partially built ({indexed}/{eligible}, {percent}%). Run Vector Backfill for existing assets.", { indexed: t, eligible: n, percent: Math.round(r * 100) @@ -13997,38 +14513,38 @@ function hg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect } } } catch {} - let n = y(e, R("toast.aiSearchUnavailable", "AI search is currently unavailable. Falling back to normal search.")); - I(n, "warn", 5200); - }, C = async (r, i = {}) => { + let n = b(e, L("toast.aiSearchUnavailable", "AI search is currently unavailable. Falling back to normal search.")); + F(n, "warn", 5200); + }, w = async (r, i = {}) => { let a = String(r || "").trim(), o = /^ai:\s*/i.test(a); o && (a = a.replace(/^ai:\s*/i, "").trim()); - let s = v(), l = s && _(); + let s = y(), c = s && v(); if (!s) return await t(e, a || "*", i); - let u = l || o, d = !1, f = ""; + let u = c || o, d = !1, f = ""; if (u && a && a !== "*") { d = !0; - let t = x(); + let t = S(); try { - let r = await be(a, { + let r = await He(a, { topK: 100, - scope: c("scope", "output") || "output", - customRootId: c("customRootId", "") || "", + scope: l("scope", "output") || "output", + customRootId: l("customRootId", "") || "", ...t }); - if (r?.ok && Array.isArray(r.data) && r.data.length > 0 && b(r.data)) return await n(e, r.data, { + if (r?.ok && Array.isArray(r.data) && r.data.length > 0 && x(r.data)) return await n(e, r.data, { title: `AI Search: "${a}" (${r.data.length} results)`, reset: !0, ...i }); - r?.ok === !1 && (f = y(r?.error || r?.message, f)); + r?.ok === !1 && (f = b(r?.error || r?.message, f)); } catch (e) { - f = y(e, f), console.debug?.("[Majoor] Hybrid search failed, trying pure semantic", e); + f = b(e, f), console.debug?.("[Majoor] Hybrid search failed, trying pure semantic", e); } try { - let r = await j(a, { + let r = await rt(a, { topK: 100, - scope: c("scope", "output") || "output", - customRootId: c("customRootId", "") || "", + scope: l("scope", "output") || "output", + customRootId: l("customRootId", "") || "", ...t }); if (r?.ok && Array.isArray(r.data) && r.data.length > 0) return await n(e, r.data, { @@ -14036,50 +14552,50 @@ function hg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect reset: !0, ...i }); - r?.ok === !1 && (f = y(r?.error || r?.message, f)); + r?.ok === !1 && (f = b(r?.error || r?.message, f)); } catch (e) { - f = y(e, f), console.debug?.("[Majoor] Semantic search failed, falling back to FTS", e); + f = b(e, f), console.debug?.("[Majoor] Semantic search failed, falling back to FTS", e); } } let p = await t(e, a || "*", i); - return d && f && (Number(p?.count || 0) || 0) === 0 && S(f), p; - }, w = async (t = {}) => { - let i = String(e.dataset.mjrViewScope || "").trim().toLowerCase(), o = String(c("viewScope", s?.viewScope || "") || "").trim().toLowerCase(); - e.dataset.mjrScope = c("scope", "output"), e.dataset.mjrViewScope = o, e.dataset.mjrCustomRootId = c("customRootId", "") || ""; - let u = c("currentFolderRelativePath", "") || ""; - e.dataset.mjrSubfolder = u, e.dataset.mjrFilterKind = c("kindFilter", "") || "", e.dataset.mjrFilterWorkflowOnly = c("workflowOnly", !1) ? "1" : "0", e.dataset.mjrFilterMinRating = String(c("minRating", 0) || 0), e.dataset.mjrFilterMinSizeMB = String(c("minSizeMB", 0) || 0), e.dataset.mjrFilterMaxSizeMB = String(c("maxSizeMB", 0) || 0), e.dataset.mjrFilterResolutionCompare = String(c("resolutionCompare", "gte") || "gte"), e.dataset.mjrFilterMinWidth = String(c("minWidth", 0) || 0), e.dataset.mjrFilterMinHeight = String(c("minHeight", 0) || 0), e.dataset.mjrFilterMaxWidth = String(c("maxWidth", 0) || 0), e.dataset.mjrFilterMaxHeight = String(c("maxHeight", 0) || 0), e.dataset.mjrFilterWorkflowType = String(c("workflowType", "") || ""), e.dataset.mjrFilterWorkflowId = String(c("workflowId", "") || ""), e.dataset.mjrFilterWorkflowModel = String(c("workflowModelFilter", "") || ""), e.dataset.mjrFilterWorkflowRunsOn = String(c("workflowRunsOnFilter", "") || ""), e.dataset.mjrFilterDateRange = c("dateRangeFilter", "") || "", e.dataset.mjrFilterDateExact = c("dateExactFilter", "") || "", e.dataset.mjrSort = c("sort", "mtime_desc") || "mtime_desc", e.dataset.mjrCollectionId = c("collectionId", "") || "", e.dataset.mjrSemanticMode = _() ? "1" : "0"; + return d && f && (Number(p?.count || 0) || 0) === 0 && C(f), p; + }, T = async (t = {}) => { + let r = String(e.dataset.mjrViewScope || "").trim().toLowerCase(), a = String(l("viewScope", c?.viewScope || "") || "").trim().toLowerCase(); + e.dataset.mjrScope = l("scope", "output"), e.dataset.mjrViewScope = a, e.dataset.mjrCustomRootId = l("customRootId", "") || ""; + let s = l("currentFolderRelativePath", "") || ""; + e.dataset.mjrSubfolder = s, e.dataset.mjrFilterKind = l("kindFilter", "") || "", e.dataset.mjrFilterWorkflowOnly = l("workflowOnly", !1) ? "1" : "0", e.dataset.mjrFilterMinRating = String(l("minRating", 0) || 0), e.dataset.mjrFilterMinSizeMB = String(l("minSizeMB", 0) || 0), e.dataset.mjrFilterMaxSizeMB = String(l("maxSizeMB", 0) || 0), e.dataset.mjrFilterResolutionCompare = String(l("resolutionCompare", "gte") || "gte"), e.dataset.mjrFilterMinWidth = String(l("minWidth", 0) || 0), e.dataset.mjrFilterMinHeight = String(l("minHeight", 0) || 0), e.dataset.mjrFilterMaxWidth = String(l("maxWidth", 0) || 0), e.dataset.mjrFilterMaxHeight = String(l("maxHeight", 0) || 0), e.dataset.mjrFilterWorkflowType = String(l("workflowType", "") || ""), e.dataset.mjrFilterWorkflowId = String(l("workflowId", "") || ""), e.dataset.mjrFilterWorkflowModel = String(l("workflowModelFilter", "") || ""), e.dataset.mjrFilterWorkflowRunsOn = String(l("workflowRunsOnFilter", "") || ""), e.dataset.mjrFilterDateRange = l("dateRangeFilter", "") || "", e.dataset.mjrFilterDateExact = l("dateExactFilter", "") || "", e.dataset.mjrSort = l("sort", "mtime_desc") || "mtime_desc", e.dataset.mjrCollectionId = l("collectionId", "") || "", e.dataset.mjrSemanticMode = v() ? "1" : "0"; try { - e.dataset.mjrQuery = String(a?.() ?? "*") || "*"; + e.dataset.mjrQuery = String(o?.() ?? "*") || "*"; } catch (e) { console.debug?.(e); } - e.dataset.mjrGroupStacks = z.EXECUTION_GROUPING_ENABLED && (c("scope", "output") === "output" || c("scope", "output") === "all") ? "1" : "0"; + e.dataset.mjrGroupStacks = R.EXECUTION_GROUPING_ENABLED && (l("scope", "output") === "output" || l("scope", "output") === "all") ? "1" : "0"; try { - let t = Array.isArray(c("selectedAssetIds", [])) ? c("selectedAssetIds", []).filter(Boolean).map(String) : []; - t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), e.dataset.mjrSelectedAssetId = String(c("activeAssetId", "") || t[0] || "")) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); + let t = Array.isArray(l("selectedAssetIds", [])) ? l("selectedAssetIds", []).filter(Boolean).map(String) : []; + t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), e.dataset.mjrSelectedAssetId = String(l("activeAssetId", "") || t[0] || "")) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } - if (c("scope", "output") === "custom" && !c("customRootId", "") && !c("currentFolderRelativePath", "") && l("currentFolderRelativePath", ""), c("collectionId", "")) { - let t = await r?.(c("collectionId", "")); + if (l("scope", "output") === "custom" && !l("customRootId", "") && !l("currentFolderRelativePath", "") && u("currentFolderRelativePath", ""), l("collectionId", "")) { + let t = await i?.(l("collectionId", "")); if (t?.ok && t.data && Array.isArray(t.data.assets)) { - let r = c("collectionName", "") ? `Collection: ${c("collectionName", "")}` : "Collection", i = await n(e, t.data.assets, { + let r = l("collectionName", "") ? `Collection: ${l("collectionName", "")}` : "Collection", i = await n(e, t.data.assets, { title: r, reset: !0 }); try { - l("lastGridCount", Number(i?.count || 0) || 0), l("lastGridTotal", Number(i?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: i || {} })); + u("lastGridCount", Number(i?.count || 0) || 0), u("lastGridTotal", Number(i?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: i || {} })); } catch (e) { console.debug?.(e); } return; } - l("collectionId", ""), l("collectionName", ""); + u("collectionId", ""), u("collectionName", ""); } - let d = o; + let d = a; if (d === "similar") { - let r = Array.isArray(c("similarResults", [])) ? c("similarResults", []) : [], i = Array.isArray(s?.similarResults) ? s.similarResults : [], a = r.length > 0 ? r : i, o = String(c("similarSourceAssetId", s?.similarSourceAssetId || "") || "").trim(), u = await n(e, a, { - title: String(c("similarTitle", s?.similarTitle || "") || R("search.similarResults", "Similar to asset #{id} ({n} results)", { + let r = Array.isArray(l("similarResults", [])) ? l("similarResults", []) : [], i = Array.isArray(c?.similarResults) ? c.similarResults : [], a = r.length > 0 ? r : i, o = String(l("similarSourceAssetId", c?.similarSourceAssetId || "") || "").trim(), s = await n(e, a, { + title: String(l("similarTitle", c?.similarTitle || "") || L("search.similarResults", "Similar to asset #{id} ({n} results)", { id: o || "?", n: a.length })).trim() || "Similar", @@ -14087,13 +14603,13 @@ function hg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect ...t }); try { - l("lastGridCount", Number(u?.count || 0) || 0), l("lastGridTotal", Number(u?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: u || {} })); + u("lastGridCount", Number(s?.count || 0) || 0), u("lastGridTotal", Number(s?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: s || {} })); } catch (e) { console.debug?.(e); } return; } - let f = i === "similar" && d !== "similar", p = await C(a(), { + let f = r === "similar" && d !== "similar", p = await w(o(), { ...t, preserveVisibleUntilReady: t.preserveVisibleUntilReady ?? !f }); @@ -14104,46 +14620,46 @@ function hg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect console.debug?.(e); } try { - l("lastGridCount", Number(p?.count || 0) || 0), l("lastGridTotal", Number(p?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: p || {} })); + u("lastGridCount", Number(p?.count || 0) || 0), u("lastGridTotal", Number(p?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: p || {} })); } catch (e) { console.debug?.(e); } - }, T = null, E = async () => { - if (d = !0, !u) { - u = !0; + }, E = null, D = async () => { + if (f = !0, !d) { + d = !0; try { - for (; d;) { - let e = { ...f || {} }; - f = {}, d = !1; + for (; f;) { + let e = { ...p || {} }; + p = {}, f = !1; try { - let t = v() && (_() || String(a?.() || "").length >= 12); - await g(() => w(e), t ? 15e4 : h); + let t = y() && (v() || String(o?.() || "").length >= 12); + await _(() => T(e), t ? 15e4 : g); } catch (e) { try { let t = Date.now(); - t - Number(p || 0) > 2e3 && (p = t, console.warn("[Majoor] Grid reload failed", e)); + t - Number(m || 0) > 2e3 && (m = t, console.warn("[Majoor] Grid reload failed", e)); } catch (e) { console.debug?.(e); } } } } finally { - u = !1; + d = !1; } } }; return { reloadGrid: (e = {}) => new Promise((t, n) => { - f = { - ...f || {}, + p = { + ...p || {}, ...e || {} - }, T && clearTimeout(T), T = setTimeout(() => { - T = null, E().then(t).catch(n); + }, E && clearTimeout(E), E = setTimeout(() => { + E = null, D().then(t).catch(n); }, 30); }) }; } // ui/features/panel/controllers/browserNavigationController.ts -function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { - let { read: l, write: u } = ph(e, [ +function Kg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { + let { read: l, write: u } = Uh(e, [ "scope", "customRootId", "currentFolderRelativePath" @@ -14270,7 +14786,7 @@ function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC onClick: async () => { e === "Computer" && String(l("customRootId", "") || "").trim() ? await C() : await S(t); } - }), T = [x(R("label.computer", "Computer"), "", !t)]; + }), T = [x(L("label.computer", "Computer"), "", !t)]; if (a && T.push(x(o || a, "", !t)), t) { let e = t.split("/").filter(Boolean), n = ""; for (let t = 0; t < e.length; t++) n = n ? `${n}/${e[t]}`.replace(/\/{2,}/g, "/") : p(e[t]) ? `${e[t]}/` : e[t], T.push(x(e[t], n, t === e.length - 1)); @@ -14278,12 +14794,12 @@ function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC if (w({ visible: !0, back: { - label: R("btn.back", "Back"), + label: L("btn.back", "Back"), disabled: h, onClick: v }, up: { - label: R("btn.up", "Up"), + label: L("btn.up", "Up"), disabled: _, onClick: b }, @@ -14291,9 +14807,9 @@ function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC })) return; n.style.display = "flex", n.replaceChildren(); let E = document.createElement("button"); - E.type = "button", E.textContent = R("btn.back", "Back"), E.className = "mjr-btn-link mjr-folder-breadcrumb-action", E.disabled = h, E.addEventListener("click", v, { signal: c || void 0 }), n.appendChild(E); + E.type = "button", E.textContent = L("btn.back", "Back"), E.className = "mjr-btn-link mjr-folder-breadcrumb-action", E.disabled = h, E.addEventListener("click", v, { signal: c || void 0 }), n.appendChild(E); let D = document.createElement("button"); - D.type = "button", D.textContent = R("btn.up", "Up"), D.className = "mjr-btn-link mjr-folder-breadcrumb-action", D.disabled = _, D.addEventListener("click", b, { signal: c || void 0 }), n.appendChild(D); + D.type = "button", D.textContent = L("btn.up", "Up"), D.className = "mjr-btn-link mjr-folder-breadcrumb-action", D.disabled = _, D.addEventListener("click", b, { signal: c || void 0 }), n.appendChild(D); let O = document.createElement("span"); O.textContent = "|", O.className = "mjr-folder-breadcrumb-separator", n.appendChild(O); let k = (e, t, n = !1) => { @@ -14376,8 +14892,8 @@ function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC }; } // ui/features/panel/controllers/scopeController.ts -function _g({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { - let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = ph(e, [ +function qg({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { + let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = Uh(e, [ "scope", "customRootId", "currentFolderRelativePath", @@ -14492,44 +15008,44 @@ function _g({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popov }; } // ui/features/panel/controllers/contextController.ts -var vg = (e, t) => { +var Jg = (e, t) => { if (e) try { e.value = t; } catch (e) { console.debug?.(e); } -}, yg = (e, t) => { +}, Yg = (e, t) => { if (e) try { e.checked = !!t; } catch (e) { console.debug?.(e); } }; -function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { - let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: j } = ph(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), M = (e, t) => { +function Xg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { + let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: ee } = Uh(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), j = (e, t) => { A(e, t); - }, N = (e, t = "") => k(e, t), ee = () => ({ + }, M = (e, t = "") => k(e, t), N = () => ({ ...O || {}, - ...j?.() || {}, - customRootLabel: N("customRootLabel", "") + ...ee?.() || {}, + customRootLabel: M("customRootLabel", "") }), te = () => { try { E?.resetBrowserHistory?.(); } catch (e) { console.debug?.(e); } - }, P = () => { + }, ne = () => { try { let e = t?.closest?.(".mjr-assets-manager") || document.querySelector?.(".mjr-assets-manager") || document.documentElement; if (!e?.style?.setProperty) return; - e.style.setProperty("--mjr-star-active", String(z.BADGE_STAR_COLOR || "#FFD45A")), e.style.setProperty("--mjr-badge-image", String(z.BADGE_IMAGE_COLOR || "#2196F3")), e.style.setProperty("--mjr-badge-video", String(z.BADGE_VIDEO_COLOR || "#9C27B0")), e.style.setProperty("--mjr-badge-audio", String(z.BADGE_AUDIO_COLOR || "#FF9800")), e.style.setProperty("--mjr-badge-model3d", String(z.BADGE_MODEL3D_COLOR || "#4CAF50")), e.style.setProperty("--mjr-badge-duplicate-alert", String(z.BADGE_DUPLICATE_ALERT_COLOR || "#FF1744")); + e.style.setProperty("--mjr-star-active", String(R.BADGE_STAR_COLOR || "#FFD45A")), e.style.setProperty("--mjr-badge-image", String(R.BADGE_IMAGE_COLOR || "#2196F3")), e.style.setProperty("--mjr-badge-video", String(R.BADGE_VIDEO_COLOR || "#9C27B0")), e.style.setProperty("--mjr-badge-audio", String(R.BADGE_AUDIO_COLOR || "#FF9800")), e.style.setProperty("--mjr-badge-model3d", String(R.BADGE_MODEL3D_COLOR || "#4CAF50")), e.style.setProperty("--mjr-badge-duplicate-alert", String(R.BADGE_DUPLICATE_ALERT_COLOR || "#FF1744")); } catch (e) { console.debug?.(e); } - }, ne = { + }, P = { clearQuery: async () => { try { - vg(a, ""), M("searchQuery", ""); + Jg(a, ""), j("searchQuery", ""); } catch (e) { console.debug?.(e); } @@ -14541,7 +15057,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearCollection: async () => { try { - M("collectionId", ""), M("collectionName", ""); + j("collectionId", ""), j("collectionName", ""); } catch (e) { console.debug?.(e); } @@ -14562,7 +15078,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB } let n = !1; try { - M("customRootId", ""), M("customRootLabel", ""), M("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, te(), typeof S?.setScope == "function" ? (await S.setScope("output"), n = !0) : (M("scope", "output"), S?.setActiveTabStyles?.()); + j("customRootId", ""), j("customRootLabel", ""), j("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, te(), typeof S?.setScope == "function" ? (await S.setScope("output"), n = !0) : (j("scope", "output"), S?.setActiveTabStyles?.()); } catch (e) { console.debug?.(e); } @@ -14574,7 +15090,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearCustomRoot: async () => { try { - M("customRootId", ""), M("customRootLabel", ""), M("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, te(); + j("customRootId", ""), j("customRootLabel", ""), j("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, te(); } catch (e) { console.debug?.(e); } @@ -14586,7 +15102,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearFolder: async () => { try { - M("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, te(); + j("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, te(); } catch (e) { console.debug?.(e); } @@ -14598,7 +15114,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearKind: async () => { try { - M("kindFilter", ""), vg(o, ""); + j("kindFilter", ""), Jg(o, ""); } catch (e) { console.debug?.(e); } @@ -14610,7 +15126,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearMinRating: async () => { try { - M("minRating", 0), vg(f, "0"); + j("minRating", 0), Jg(f, "0"); } catch (e) { console.debug?.(e); } @@ -14622,7 +15138,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowOnly: async () => { try { - M("workflowOnly", !1), yg(s, !1); + j("workflowOnly", !1), Yg(s, !1); } catch (e) { console.debug?.(e); } @@ -14634,7 +15150,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowType: async () => { try { - M("workflowType", ""), vg(c, ""); + j("workflowType", ""), Jg(c, ""); } catch (e) { console.debug?.(e); } @@ -14646,7 +15162,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowId: async () => { try { - M("workflowId", ""), vg(l, ""); + j("workflowId", ""), Jg(l, ""); } catch (e) { console.debug?.(e); } @@ -14658,7 +15174,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowModel: async () => { try { - M("workflowModelFilter", ""), vg(u, ""); + j("workflowModelFilter", ""), Jg(u, ""); } catch (e) { console.debug?.(e); } @@ -14670,7 +15186,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowRunsOn: async () => { try { - M("workflowRunsOnFilter", ""), vg(d, ""); + j("workflowRunsOnFilter", ""), Jg(d, ""); } catch (e) { console.debug?.(e); } @@ -14682,7 +15198,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearSize: async () => { try { - M("minSizeMB", 0), M("maxSizeMB", 0), vg(p, ""), vg(m, ""); + j("minSizeMB", 0), j("maxSizeMB", 0), Jg(p, ""), Jg(m, ""); } catch (e) { console.debug?.(e); } @@ -14694,7 +15210,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearResolution: async () => { try { - M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), vg(h, ""), vg(g, ""), vg(_, ""), vg(v, ""), vg(y, ""); + j("minWidth", 0), j("minHeight", 0), j("maxWidth", 0), j("maxHeight", 0), Jg(h, ""), Jg(g, ""), Jg(_, ""), Jg(v, ""), Jg(y, ""); } catch (e) { console.debug?.(e); } @@ -14706,7 +15222,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearDateRange: async () => { try { - M("dateRangeFilter", ""), vg(b, ""); + j("dateRangeFilter", ""), Jg(b, ""); } catch (e) { console.debug?.(e); } @@ -14718,7 +15234,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearDateExact: async () => { try { - M("dateExactFilter", ""), vg(x, ""); + j("dateExactFilter", ""), Jg(x, ""); } catch (e) { console.debug?.(e); } @@ -14730,7 +15246,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearSort: async () => { try { - M("sort", "mtime_desc"), C?.setSortIcon?.(N("sort", "mtime_desc")), C?.renderSortMenu?.(); + j("sort", "mtime_desc"), C?.setSortIcon?.(M("sort", "mtime_desc")), C?.renderSortMenu?.(); } catch (e) { console.debug?.(e); } @@ -14743,28 +15259,28 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB clearAll: async () => { let e = !1; try { - vg(a, ""); + Jg(a, ""); } catch (e) { console.debug?.(e); } try { - M("collectionId", ""), M("collectionName", ""), M("kindFilter", ""), M("workflowOnly", !1), M("minRating", 0), M("minSizeMB", 0), M("maxSizeMB", 0), M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), M("resolutionCompare", "gte"), M("workflowType", ""), M("workflowId", ""), M("workflowModelFilter", ""), M("workflowRunsOnFilter", ""), M("dateRangeFilter", ""), M("dateExactFilter", ""), M("sort", "mtime_desc"), M("customRootId", ""), M("customRootLabel", ""), M("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, te(); + j("collectionId", ""), j("collectionName", ""), j("kindFilter", ""), j("workflowOnly", !1), j("minRating", 0), j("minSizeMB", 0), j("maxSizeMB", 0), j("minWidth", 0), j("minHeight", 0), j("maxWidth", 0), j("maxHeight", 0), j("resolutionCompare", "gte"), j("workflowType", ""), j("workflowId", ""), j("workflowModelFilter", ""), j("workflowRunsOnFilter", ""), j("dateRangeFilter", ""), j("dateExactFilter", ""), j("sort", "mtime_desc"), j("customRootId", ""), j("customRootLabel", ""), j("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, te(); try { await E?.clearTransientContext?.(); } catch (e) { console.debug?.(e); } - typeof S?.setScope == "function" ? (await S.setScope("output"), e = !0) : (M("scope", "output"), S?.setActiveTabStyles?.()); + typeof S?.setScope == "function" ? (await S.setScope("output"), e = !0) : (j("scope", "output"), S?.setActiveTabStyles?.()); } catch (e) { console.debug?.(e); } try { - vg(o, ""), yg(s, !1), vg(c, ""), vg(l, ""), vg(u, ""), vg(d, ""), vg(f, "0"), vg(p, ""), vg(m, ""), vg(h, ""), vg(g, ""), vg(_, ""), vg(v, ""), vg(y, ""), vg(b, ""), vg(x, ""); + Jg(o, ""), Yg(s, !1), Jg(c, ""), Jg(l, ""), Jg(u, ""), Jg(d, ""), Jg(f, "0"), Jg(p, ""), Jg(m, ""), Jg(h, ""), Jg(g, ""), Jg(_, ""), Jg(v, ""), Jg(y, ""), Jg(b, ""), Jg(x, ""); } catch (e) { console.debug?.(e); } try { - C?.setSortIcon?.(N("sort", "mtime_desc")), C?.renderSortMenu?.(); + C?.setSortIcon?.(M("sort", "mtime_desc")), C?.renderSortMenu?.(); } catch (e) { console.debug?.(e); } @@ -14781,11 +15297,11 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB "constructor", "prototype" ]); - for (let [t, n] of Object.entries(E)) e.has(String(t)) || (ne[t] = n); + for (let [t, n] of Object.entries(E)) e.has(String(t)) || (P[t] = n); } return { update: () => { - let e = String(a?.value || "").trim(), o = mg(a), s = ee(), c = !!(N("kindFilter", "") || N("workflowOnly", !1) || (Number(N("minRating", 0) || 0) || 0) > 0 || (Number(N("minSizeMB", 0) || 0) || 0) > 0 || (Number(N("maxSizeMB", 0) || 0) || 0) > 0 || (Number(N("minWidth", 0) || 0) || 0) > 0 || (Number(N("minHeight", 0) || 0) || 0) > 0 || (Number(N("maxWidth", 0) || 0) || 0) > 0 || (Number(N("maxHeight", 0) || 0) || 0) > 0 || String(N("workflowType", "") || "").trim().length > 0 || String(N("workflowId", "") || "").trim().length > 0 || String(N("workflowModelFilter", "") || "").trim().length > 0 || String(N("workflowRunsOnFilter", "") || "").trim().length > 0 || N("dateRangeFilter", "") || N("dateExactFilter", "")), l = String(N("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!N("collectionId", ""); + let e = String(a?.value || "").trim(), o = Wg(a), s = N(), c = !!(M("kindFilter", "") || M("workflowOnly", !1) || (Number(M("minRating", 0) || 0) || 0) > 0 || (Number(M("minSizeMB", 0) || 0) || 0) > 0 || (Number(M("maxSizeMB", 0) || 0) || 0) > 0 || (Number(M("minWidth", 0) || 0) || 0) > 0 || (Number(M("minHeight", 0) || 0) || 0) > 0 || (Number(M("maxWidth", 0) || 0) || 0) > 0 || (Number(M("maxHeight", 0) || 0) || 0) > 0 || String(M("workflowType", "") || "").trim().length > 0 || String(M("workflowId", "") || "").trim().length > 0 || String(M("workflowModelFilter", "") || "").trim().length > 0 || String(M("workflowRunsOnFilter", "") || "").trim().length > 0 || M("dateRangeFilter", "") || M("dateExactFilter", "")), l = String(M("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!M("collectionId", ""); try { n?.classList?.toggle?.("mjr-context-active", c), r?.classList?.toggle?.("mjr-context-active", l), i?.classList?.toggle?.("mjr-context-active", u); } catch (e) { @@ -14800,29 +15316,29 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB rawQuery: e || o, ...n }, - actions: ne + actions: P }); } catch (e) { console.debug?.(e); } - P(); + ne(); }, - actions: ne + actions: P }; } // ui/features/panel/controllers/customRootsController.ts -function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { - let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = ph(e, [ +function Zg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { + let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = Uh(e, [ "customRootId", "customRootLabel", "currentFolderRelativePath" ]), m = (e) => { p("customRootLabel", String(e || "")); }, h = async (e = null) => { - let r = t.querySelector("option[value=\"\"]")?.textContent || R("label.selectFolder", "Select folder..."); + let r = t.querySelector("option[value=\"\"]")?.textContent || L("label.selectFolder", "Select folder..."); t.innerHTML = ""; let i = document.createElement("option"); - i.value = "", i.textContent = R("msg.loading"), i.disabled = !0, t.appendChild(i), t.disabled = !0; + i.value = "", i.textContent = L("msg.loading"), i.disabled = !0, t.appendChild(i), t.disabled = !0; try { let i = await o(c.CUSTOM_ROOTS), a = i && i.ok && Array.isArray(i.data) ? i.data : []; t.innerHTML = ""; @@ -14845,7 +15361,7 @@ function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, co } catch (e) { console.warn("Majoor: failed to load custom roots", e), t.innerHTML = ""; let n = document.createElement("option"); - n.value = "", n.textContent = R("msg.errorLoadingFolders"), n.disabled = !0, t.appendChild(n); + n.value = "", n.textContent = L("msg.errorLoadingFolders"), n.disabled = !0, t.appendChild(n); } finally { t.disabled = !1; } @@ -14886,7 +15402,7 @@ function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, co } await l(); } - }), n && (n.disabled = !1, n.title = R("btn.add", "Add")), _(n, "click", async () => { + }), n && (n.disabled = !1, n.title = L("btn.add", "Add")), _(n, "click", async () => { let t = ""; try { let e = await s(c.BROWSE_FOLDER, {}); @@ -14895,16 +15411,16 @@ function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, co console.debug?.(e); } if (!t) { - let e = await i(R("dialog.enterFolderPath", "Enter folder path"), ""); + let e = await i(L("dialog.enterFolderPath", "Enter folder path"), ""); t = String(e || "").trim(); } if (!t) return; - let n = await i(R("dialog.folderLabelOptional", "Folder label (optional)"), ""), r = await s(c.CUSTOM_ROOTS, { + let n = await i(L("dialog.folderLabelOptional", "Folder label (optional)"), ""), r = await s(c.CUSTOM_ROOTS, { path: t, label: String(n || "").trim() || void 0 }); if (!r?.ok) { - a(r?.error || R("toast.failedAddFolder", "Failed to add browser folder"), "error"); + a(r?.error || L("toast.failedAddFolder", "Failed to add browser folder"), "error"); return; } let o = String(r?.data?.id || "").trim() || null; @@ -14914,23 +15430,23 @@ function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, co } catch (e) { console.debug?.(e); } - await l(), a(R("toast.folderAdded", "Folder added"), "success"); + await l(), a(L("toast.folderAdded", "Folder added"), "success"); }), _(o, "click", async () => { if (!f("customRootId", "")) return; - let e = t.options[t.selectedIndex], n = e ? e.text : R("label.thisFolder", "this folder"); - if (await r(R("dialog.removeFolder", `Remove the browser folder "${n}"?`, { name: n }), R("dialog.customFoldersTitle", "Majoor: Browser Folders"))) { - o.disabled = !0, o.textContent = R("btn.removing"); + let e = t.options[t.selectedIndex], n = e ? e.text : L("label.thisFolder", "this folder"); + if (await r(L("dialog.removeFolder", `Remove the browser folder "${n}"?`, { name: n }), L("dialog.customFoldersTitle", "Majoor: Browser Folders"))) { + o.disabled = !0, o.textContent = L("btn.removing"); try { let e = await s(c.CUSTOM_ROOTS_REMOVE, { id: f("customRootId", "") }); if (!e?.ok) { - a(e?.error || R("toast.failedRemoveFolder", "Failed to remove browser folder"), "error"); + a(e?.error || L("toast.failedRemoveFolder", "Failed to remove browser folder"), "error"); return; } - a(R("toast.folderRemoved", "Folder removed"), "success"), p("customRootId", ""), m(""), p("currentFolderRelativePath", ""), await h(), await l(); + a(L("toast.folderRemoved", "Folder removed"), "success"), p("customRootId", ""), m(""), p("currentFolderRelativePath", ""), await h(), await l(); } catch (e) { - console.warn("Majoor: remove custom root failed", e), a(R("toast.errorRemovingFolder", "An error occurred while removing the browser folder"), "error"); + console.warn("Majoor: remove custom root failed", e), a(L("toast.errorRemovingFolder", "An error occurred while removing the browser folder"), "error"); } finally { - o.disabled = !f("customRootId", ""), o.textContent = R("btn.remove"); + o.disabled = !f("customRootId", ""), o.textContent = L("btn.remove"); } } }), () => { @@ -14944,35 +15460,35 @@ function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, co }; } // ui/features/panel/controllers/sortController.ts -function Sg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { - let { read: s, write: c } = ph(e, ["sort"]), l = () => [ +function Qg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { + let { read: s, write: c } = Uh(e, ["sort"]), l = () => [ { key: "mtime_desc", - label: R("sort.newest") + label: L("sort.newest") }, { key: "mtime_asc", - label: R("sort.oldest") + label: L("sort.oldest") }, { key: "name_asc", - label: R("sort.nameAZ") + label: L("sort.nameAZ") }, { key: "name_desc", - label: R("sort.nameZA") + label: L("sort.nameZA") }, { key: "rating_desc", - label: R("sort.ratingHigh") + label: L("sort.ratingHigh") }, { key: "size_desc", - label: R("sort.sizeDesc") + label: L("sort.sizeDesc") }, { key: "size_asc", - label: R("sort.sizeAsc") + label: L("sort.sizeAsc") } ], u = (e) => { let n = t.querySelector("i"); @@ -15030,24 +15546,24 @@ function Sg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, re }; } // ui/features/panel/controllers/sidebarController.ts -var Cg = "_mjrRescanning", wg = 1500, Tg = (e) => /^\d+$/.test(String(e ?? "").trim()); -async function Eg({ card: e, asset: t, sidebar: n, onAssetUpdated: r }) { +var $g = "_mjrRescanning", e_ = 1500, t_ = (e) => /^\d+$/.test(String(e ?? "").trim()); +async function n_({ card: e, asset: t, sidebar: n, onAssetUpdated: r }) { if (!e || !t || globalThis._mjrMaintenanceActive) return; try { let t = Date.now(); - if (t - (Number(e[Cg] || 0) || 0) < wg) return; - e[Cg] = t; + if (t - (Number(e[$g] || 0) || 0) < e_) return; + e[$g] = t; } catch (e) { console.debug?.(e); } let i = e.querySelector(".mjr-workflow-dot"); try { - i && (Wt(i, "pending", "Pending: metadata refresh in progress", { asset: t }), i.classList.add("mjr-pulse-animation"), i.style.cursor = "progress", i.title = R("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); + i && (gn(i, "pending", "Pending: metadata refresh in progress", { asset: t }), i.classList.add("mjr-pulse-animation"), i.style.cursor = "progress", i.title = L("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); } catch (e) { console.debug?.(e); } try { - I(R("toast.rescanUpdatingAiIndex", "Rescanning file + updating AI index..."), "info", 2200); + F(L("toast.rescanUpdatingAiIndex", "Rescanning file + updating AI index..."), "info", 2200); } catch (e) { console.debug?.(e); } @@ -15055,22 +15571,22 @@ async function Eg({ card: e, asset: t, sidebar: n, onAssetUpdated: r }) { filename: t.filename, subfolder: t.subfolder || "", type: String(t.type || "output").toLowerCase(), - root_id: Pe(t) || void 0 + root_id: be(t) || void 0 }, o = null, s = !1, c = !1, l = !1; try { - if (s = !!(await pe(lt.INDEX_FILES, { + if (s = !!(await me(p.INDEX_FILES, { files: [a], incremental: !1 - }))?.ok, !s && i && (Wt(i, "error", "Error: metadata refresh failed", { asset: t }), i.classList.remove("mjr-pulse-animation"), i.style.cursor = ""), Tg(t?.id)) { + }))?.ok, !s && i && (gn(i, "error", "Error: metadata refresh failed", { asset: t }), i.classList.remove("mjr-pulse-animation"), i.style.cursor = ""), t_(t?.id)) { c = !0; try { - l = !!(await p(t.id))?.ok; + l = !!(await ee(t.id))?.ok; } catch (e) { console.debug?.(e); } } if (s && t.id != null) { - let e = await se(t.id); + let e = await Ue(t.id); e?.ok && e.data && (o = { ...t, ...e.data @@ -15078,7 +15594,7 @@ async function Eg({ card: e, asset: t, sidebar: n, onAssetUpdated: r }) { } } catch { try { - i && (Wt(i, "error", "Error: metadata refresh failed", { asset: t }), i.classList.remove("mjr-pulse-animation"), i.style.cursor = ""); + i && (gn(i, "error", "Error: metadata refresh failed", { asset: t }), i.classList.remove("mjr-pulse-animation"), i.style.cursor = ""); } catch (e) { console.debug?.(e); } @@ -15098,7 +15614,7 @@ async function Eg({ card: e, asset: t, sidebar: n, onAssetUpdated: r }) { } finally { try { if (i && i.isConnected) { - let e = Ot(o || t); + let e = _n(o || t); e && i.replaceWith(e); } } catch { @@ -15110,13 +15626,13 @@ async function Eg({ card: e, asset: t, sidebar: n, onAssetUpdated: r }) { } } try { - s && l ? I(R("toast.metadataVectorUpdated", "Metadata + AI vector index updated for this asset."), "success", 2200) : s && c && !l && I(R("toast.metadataUpdatedVectorFailed", "Metadata updated. AI vector index could not be updated."), "warning", 2600); + s && l ? F(L("toast.metadataVectorUpdated", "Metadata + AI vector index updated for this asset."), "success", 2200) : s && c && !l && F(L("toast.metadataUpdatedVectorFailed", "Metadata updated. AI vector index could not be updated."), "warning", 2600); } catch (e) { console.debug?.(e); } return o; } -function Dg(e, t) { +function r_(e, t) { if (e) { try { let n = e.querySelector(".mjr-asset-card.is-selected"); @@ -15152,7 +15668,7 @@ function Dg(e, t) { } } } -var Og = (e) => { +var i_ = (e) => { if (e == null) return ""; try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(String(e)); @@ -15161,32 +15677,32 @@ var Og = (e) => { } return String(e).replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); }; -function kg(e, t) { +function a_(e, t) { if (!e || !t) return null; try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${i_(t)}"]`); } catch (e) { console.debug?.(e); } try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${i_(t)}"]`); } catch (e) { console.debug?.(e); } return null; } -function Ag(e) { +function o_(e) { if (!e) return null; let t = e.dataset?.mjrSelectedAssetId; if (t) { - let n = kg(e, t); + let n = a_(e, t); if (n) return n; } let n = e.dataset?.mjrSelectedAssetIds; if (n) try { let t = JSON.parse(n); if (Array.isArray(t) && t.length) { - let n = kg(e, t[0]); + let n = a_(e, t[0]); if (n) return n; } } catch (e) { @@ -15194,7 +15710,7 @@ function Ag(e) { } return e.querySelector(".mjr-asset-card.is-selected"); } -function jg(e, { preventScroll: t = !0 } = {}) { +function s_(e, { preventScroll: t = !0 } = {}) { if (e) try { e.focus?.({ preventScroll: t }); } catch { @@ -15205,14 +15721,14 @@ function jg(e, { preventScroll: t = !0 } = {}) { } } } -function Mg(e, { force: t = !1 } = {}) { +function c_(e, { force: t = !1 } = {}) { if (!e || !t && !e._mjrFocusWithin) return; - let n = Ag(e); - n && (jg(n), e._mjrFocusWithin = !0); + let n = o_(e); + n && (s_(n), e._mjrFocusWithin = !0); } -function Ng(e) { +function l_(e) { if (e) try { - let t = Ag(e); + let t = o_(e); if (!t) return; let n = e.parentElement; if (n && typeof n.getBoundingClientRect == "function" && typeof t.getBoundingClientRect == "function") { @@ -15227,7 +15743,7 @@ function Ng(e) { console.debug?.(e); } } -function Pg(e) { +function u_(e) { if (e) try { e._mjrAutoRevealSelectionUntil = Date.now() + 900; } catch (e) { @@ -15235,12 +15751,12 @@ function Pg(e) { } let t = () => { try { - Ng(e); + l_(e); } catch (e) { console.debug?.(e); } try { - Mg(e); + c_(e); } catch (e) { console.debug?.(e); } @@ -15255,10 +15771,10 @@ function Pg(e) { t(); } } -function Fg(e, t) { +function d_(e, t) { e && (t ? (e.classList.add("is-selected"), e.setAttribute?.("aria-selected", "true")) : (e.classList.remove("is-selected"), e.setAttribute?.("aria-selected", "false"))); } -function Ig(e) { +function f_(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -15273,15 +15789,15 @@ function Ig(e) { return []; } } -function Lg(e) { +function p_(e) { if (e) try { - let t = Ig(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); + let t = f_(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), !e.dataset.mjrSelectedAssetId && t[0] && (e.dataset.mjrSelectedAssetId = String(t[0]))) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } } -function Rg(e, t, n = "") { +function m_(e, t, n = "") { if (!e) return []; let r = Array.from(t || []).map(String).filter(Boolean); try { @@ -15295,9 +15811,9 @@ function Rg(e, t, n = "") { console.debug?.(e); } try { - for (let t of Ig(e)) { + for (let t of f_(e)) { let e = t?.dataset?.mjrAssetId; - Fg(t, !!(e && r.includes(String(e)))); + d_(t, !!(e && r.includes(String(e)))); } } catch (e) { console.debug?.(e); @@ -15312,7 +15828,7 @@ function Rg(e, t, n = "") { } return r; } -function zg({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { +function h_({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { if ((t || i) && e) try { let a = []; if (e.dataset?.mjrSelectedAssetIds) try { @@ -15321,7 +15837,7 @@ function zg({ gridContainer: e, state: t, activeId: n, readState: r = null, writ } catch (e) { console.debug?.(e); } - else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : Ig(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); + else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : f_(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); typeof i == "function" ? i("selectedAssetIds", a) : t.selectedAssetIds = a; let o = String(typeof r == "function" ? r("activeAssetId", "") || "" : t?.activeAssetId || ""); n == null ? o && a.includes(o) || (typeof i == "function" ? i("activeAssetId", a[0] || "") : t.activeAssetId = a[0] || "") : typeof i == "function" ? i("activeAssetId", String(n)) : t.activeAssetId = String(n); @@ -15329,8 +15845,8 @@ function zg({ gridContainer: e, state: t, activeId: n, readState: r = null, writ console.debug?.(e); } } -function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { - let { read: s, write: c } = ph(o, [ +function g_({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { + let { read: s, write: c } = Uh(o, [ "activeAssetId", "selectedAssetIds", "sidebarOpen" @@ -15340,7 +15856,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg e._mjrSidebarOpenBound = !0; let l = (t) => { e._mjrFocusWithin = !0; - let n = Pt(t.target, ".mjr-asset-card"); + let n = qt(t.target, ".mjr-asset-card"); if (n) try { e._mjrLastFocusedCardId = n.dataset?.mjrAssetId || ""; } catch (e) { @@ -15365,9 +15881,9 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } }, a = () => { n && cancelAnimationFrame(n), r && clearTimeout(r), n = requestAnimationFrame(() => { - n = null, i() && Ng(e); + n = null, i() && l_(e); }), r = setTimeout(() => { - r = null, i() && Ng(e); + r = null, i() && l_(e); }, 160); }, o = new ResizeObserver(() => a()); t && o.observe(t), o.observe(e), e._mjrSelectionResizeObserver = o; @@ -15379,7 +15895,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg try { let n = i?.has_workflow ?? i?.hasWorkflow ?? t.has_workflow, r = i?.has_generation_data ?? i?.hasGenerationData ?? t.has_generation_data; n !== void 0 && (t.has_workflow = n), r !== void 0 && (t.has_generation_data = r); - let a = e.querySelector(".mjr-workflow-dot"), o = Ot(t); + let a = e.querySelector(".mjr-workflow-dot"), o = _n(t); a && o && a.replaceWith(o); } catch (e) { console.debug?.(e); @@ -15399,22 +15915,22 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } }, f = async (n) => { if (n.defaultPrevented) return; - let r = Pt(n.target, ".mjr-asset-card"); + let r = qt(n.target, ".mjr-asset-card"); if (!r) return; - let a = Pt(n.target, ".mjr-workflow-dot"); + let a = qt(n.target, ".mjr-workflow-dot"); if (a && r.contains(a)) { let a = r._mjrAsset; if (!a) return; n.preventDefault(), n.stopPropagation(); let l = r?.dataset?.mjrAssetId || ""; - Rg(e, l ? [l] : [], l), zg({ + m_(e, l ? [l] : [], l), h_({ gridContainer: e, state: o, activeId: l, readState: s, writeState: c }); - let u = await Eg({ + let u = await n_({ card: r, asset: a, sidebar: t, @@ -15428,12 +15944,12 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } return; } - let l = Pt(n.target, "a, button, input, textarea, select, label"); + let l = qt(n.target, "a, button, input, textarea, select, label"); if (l && r.contains(l)) return; let u = r._mjrAsset; if (u) { if (e?._mjrSelectionManagedByVue) { - zg({ + h_({ gridContainer: e, state: o, activeId: String(r?.dataset?.mjrAssetId || "").trim(), @@ -15453,7 +15969,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg console.debug?.(e); } } else if (n.preventDefault(), n.stopPropagation(), n.ctrlKey || n.metaKey || n.shiftKey) { - let t = Ig(e), i = t.indexOf(r); + let t = f_(e), i = t.indexOf(r); if (n.shiftKey) { let t = []; try { @@ -15465,7 +15981,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let n = r?.dataset?.mjrAssetId || "", i = t.findIndex((e) => String(e?.id || "") === String(n)), a = Number(e._mjrLastSelectedIndex), l = Number.isFinite(a) ? a : i; if (i >= 0 && l >= 0) { let r = Math.min(l, i), a = Math.max(l, i), u = t.slice(r, a + 1).map((e) => String(e?.id || "")).filter(Boolean); - Rg(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, zg({ + m_(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, h_({ gridContainer: e, state: o, activeId: n || "", @@ -15500,7 +16016,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } a && (l.has(a) ? l.delete(a) : l.add(a)); let u = Array.from(l), d = l.has(a) ? a : u[0] || ""; - Rg(e, u, d), zg({ + m_(e, u, d), h_({ gridContainer: e, state: o, activeId: d, @@ -15510,7 +16026,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } else { { if (r.classList.contains("is-selected")) { - Rg(e, [], ""), zg({ + m_(e, [], ""), h_({ gridContainer: e, state: o, activeId: "", @@ -15520,7 +16036,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg return; } let n = r?.dataset?.mjrAssetId; - Rg(e, n ? [n] : [], n || ""), zg({ + m_(e, n ? [n] : [], n || ""), h_({ gridContainer: e, state: o, activeId: n || "", @@ -15534,7 +16050,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } } try { - Ng(e), r?.focus?.({ preventScroll: !0 }); + l_(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -15545,10 +16061,10 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let p = async () => { let n = String(s("activeAssetId", "") || ""), r = null; if (n) try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${i_(n)}"]`); } catch { try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${i_(n)}"]`); } catch (e) { console.debug?.(e); } @@ -15556,7 +16072,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg r ||= e.querySelector(".mjr-asset-card.is-selected"); let l = r?._mjrAsset; if (l) { - Dg(e, r), Lg(e), zg({ + r_(e, r), p_(e), h_({ gridContainer: e, state: o, activeId: r?.dataset?.mjrAssetId, @@ -15572,7 +16088,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - Mg(e, { force: !0 }), Pg(e); + c_(e, { force: !0 }), u_(e); return; } } catch (e) { @@ -15585,7 +16101,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - Pg(e), r?.focus?.({ preventScroll: !0 }); + u_(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -15600,7 +16116,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!n) return !1; let r = null; try { - r = kg(e, n); + r = a_(e, n); } catch (e) { console.debug?.(e); } @@ -15636,8 +16152,8 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg e.addEventListener("mjr:selection-changed", g); let _ = (t) => { if (t.defaultPrevented || (t.key?.toLowerCase?.() || "") !== "d" || t.ctrlKey || t.metaKey || t.altKey || t.target?.isContentEditable || t.target?.closest?.("input, textarea, select, [contenteditable='true']")) return; - let n = Pt(t.target, ".mjr-asset-card"); - n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Dg(e, n), Lg(e), zg({ + let n = qt(t.target, ".mjr-asset-card"); + n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), r_(e, n), p_(e), h_({ gridContainer: e, state: o, activeId: n?.dataset?.mjrAssetId, @@ -15723,7 +16239,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg }; } // ui/features/panel/controllers/panelHotkeysController.ts -function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { +function __({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { let s = !1, c = !1, l = null, u = o instanceof Set ? o : /* @__PURE__ */ new Set([ " ", "ArrowUp", @@ -15758,7 +16274,7 @@ function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF console.debug?.(e); } try { - let e = Qn(); + let e = ht(); return e && (document.activeElement === document.body || e.contains?.(document.activeElement)) || !1; } catch (e) { return console.debug?.(e), !1; @@ -15777,7 +16293,7 @@ function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF c = !1; }, keydown: (o) => { - if (Se() || ve().scope === "viewer") return; + if (vt() || gt().scope === "viewer") return; if (o.key?.toLowerCase?.() === "v" && !o.ctrlKey && !o.metaKey && !o.altKey && !o.shiftKey && !(o.target?.isContentEditable || o.target?.closest?.("input, textarea, select, [contenteditable='true']")) && l?.isConnected && f(o)) { let e = !1; try { @@ -15854,7 +16370,7 @@ function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF } catch (e) { console.debug?.(e); } - F("panel"); + lt("panel"); } }, g = () => { if (l) { @@ -15868,7 +16384,7 @@ function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF } catch (e) { console.debug?.(e); } - ve().scope === "panel" && F(null), l = null; + gt().scope === "panel" && lt(null), l = null; } }; return { @@ -15877,17 +16393,17 @@ function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF }; } // ui/vue/composables/useGridSelection.ts -function Hg(e) { +function v_(e) { return Array.isArray(e) ? e.map((e) => String(e || "").trim()).filter(Boolean) : []; } -function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { +function y_({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { if (!e) return { restoreSelectionState() {}, dispose() {} }; let s = (e) => { try { - let t = e?.detail || {}, n = Hg(t.selectedIds); + let t = e?.detail || {}, n = v_(t.selectedIds); r(n), i(String(t.activeId || n[0] || "").trim()); } catch (e) { console.debug?.(e); @@ -15905,7 +16421,7 @@ function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs } return { restoreSelectionState: ({ scrollTop: r = 0 } = {}) => { - let i = Hg(t()), a = String(n() || i[0] || "").trim(); + let i = v_(t()), a = String(n() || i[0] || "").trim(); if (i.length || a) { try { typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(i, a); @@ -15922,7 +16438,7 @@ function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs console.debug?.(e); } try { - Bl(e, a)?.scrollIntoView?.({ + lu(e, a)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -15942,7 +16458,7 @@ function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs }; } // ui/vue/composables/useAssetsQuery.ts -function Wg(e) { +function b_(e) { try { if (typeof requestAnimationFrame == "function") { requestAnimationFrame(e); @@ -15953,28 +16469,28 @@ function Wg(e) { } setTimeout(e, 0); } -function Gg(e = {}, t = "*") { +function x_(e = {}, t = "*") { return e.scope === "output" && !e.collectionId && t === "*" && !e.kindFilter && !e.workflowOnly && !(Number(e.minRating || 0) > 0) && !(Number(e.minSizeMB || 0) > 0) && !(Number(e.maxSizeMB || 0) > 0) && !(Number(e.minWidth || 0) > 0) && !(Number(e.minHeight || 0) > 0) && !(Number(e.maxWidth || 0) > 0) && !(Number(e.maxHeight || 0) > 0) && !String(e.workflowType || "").trim() && !String(e.workflowId || "").trim() && !e.dateRangeFilter && !e.dateExactFilter; } -function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { - let g = 0, _ = !1, v = null, y = null, b = null, x = 0, S = !0, C = "", w = Date.now(), T = () => { +function S_({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: m = () => "output", loadAssets: h = null, lifecycleSignal: g = null } = {}) { + let _ = 0, v = !1, y = null, b = null, x = null, S = 0, C = !0, w = "", T = Date.now(), E = () => { try { - return vc(e, (typeof n == "function" ? n() : t) || t || null); + return Vc(e, (typeof n == "function" ? n() : t) || t || null); } catch (e) { return console.debug?.(e), !1; } - }, E = (e = null, { resumeQueuedReload: t = !0 } = {}) => { - if (S = typeof e == "boolean" ? e : T(), !S) return v &&= (clearTimeout(v), null), S; - if (t && C && !_) { - let e = C; - C = "", k({ reason: e }).catch((e) => console.debug?.(e)); + }, D = (e = null, { resumeQueuedReload: t = !0 } = {}) => { + if (C = typeof e == "boolean" ? e : E(), !C) return y &&= (clearTimeout(y), null), C; + if (t && w && !v) { + let e = w; + w = "", A({ reason: e }).catch((e) => console.debug?.(e)); } - if (b && !v) { - let e = b, t = x || 50; - b = null, x = 0, te(e, Math.min(t, 50)); + if (x && !y) { + let e = x, t = S || 50; + x = null, S = 0, ne(e, Math.min(t, 50)); } - return t && g > 0 && !_ && k().catch((e) => console.debug?.(e)), S; - }, D = () => { + return t && _ > 0 && !v && A().catch((e) => console.debug?.(e)), C; + }, O = () => { try { let t = e?._mjrGetGridState?.(); if (Array.isArray(t?.assets) && t.assets.length > 0) return !0; @@ -15992,21 +16508,21 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } catch (e) { return console.debug?.(e), !1; } - }, O = () => { + }, k = () => { try { return !!e?._mjrGetGridState?.()?.loading; } catch (e) { return console.debug?.(e), !1; } - }, k = async (t = {}) => { - if (e && r?.reloadGrid && (g += 1, E(null, { resumeQueuedReload: !1 }) && !_)) { - _ = !0; + }, A = async (t = {}) => { + if (e && r?.reloadGrid && (_ += 1, D(null, { resumeQueuedReload: !1 }) && !v)) { + v = !0; try { - for (; g > 0;) { - if (!E(null, { resumeQueuedReload: !1 })) return; - g = 0; + for (; _ > 0;) { + if (!D(null, { resumeQueuedReload: !1 })) return; + _ = 0; let t = typeof i == "function" ? i(e) : null; - if (await r.reloadGrid(), !E(null, { resumeQueuedReload: !1 })) return; + if (await r.reloadGrid(), !D(null, { resumeQueuedReload: !1 })) return; if (t && typeof a == "function") try { if ((Number(s() || 0) || 0) > (Number(t?.scrollTop || 0) || 0) + 8) continue; await a(e, t); @@ -16015,29 +16531,29 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } } } finally { - _ = !1; + v = !1; } } - }, A = (e = "external") => { - C = String(e || "external"); + }, ee = (e = "external") => { + w = String(e || "external"); try { let e = globalThis?.window ?? globalThis; e.__mjrGridDirty = !0; } catch (e) { console.debug?.(e); } - if (E(null, { resumeQueuedReload: !1 }) && !_) { - let e = C; - C = "", k({ reason: e }).catch((e) => console.debug?.(e)); + if (D(null, { resumeQueuedReload: !1 }) && !v) { + let e = w; + w = "", A({ reason: e }).catch((e) => console.debug?.(e)); } }, j = (e) => { - e?.detail?.source !== "assets-query-controller" && A(e?.detail?.reason || "external"); + e?.detail?.source !== "assets-query-controller" && ee(e?.detail?.reason || "external"); }, M = (e) => { - globalThis?._mjrMaintenanceActive || A(e?.detail?.reason || "manual"); + globalThis?._mjrMaintenanceActive || ee(e?.detail?.reason || "manual"); }; try { let e = globalThis?.window ?? globalThis; - e?.addEventListener?.("mjr-grid-dirty", j, { signal: h || void 0 }), e?.addEventListener?.("mjr:reload-grid", M, { signal: h || void 0 }); + e?.addEventListener?.("mjr-grid-dirty", j, { signal: g || void 0 }), e?.addEventListener?.("mjr:reload-grid", M, { signal: g || void 0 }); } catch (e) { console.debug?.(e); } @@ -16048,7 +16564,7 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } catch (e) { console.debug?.(e); } - Wg(() => { + b_(() => { let e = Number(s() || 0) || 0; if (e > 0) try { t.scrollTop = e; @@ -16066,28 +16582,28 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul console.debug?.(e); } }); - }, ee = async (t) => { + }, te = async (t) => { try { await t; } catch (e) { console.debug?.(e); } - if (e && typeof m == "function" && !h?.aborted) { - if (!E()) b = t, x = 50; - else if (!D() && !O() && String(p() || "output") === "output" && String(f() || "*") === "*") try { - let t = await le(`${lt.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); - t?.ok && (t.data?.total_assets || 0) > 0 && await m(e); + if (e && typeof h == "function" && !g?.aborted) { + if (!D()) x = t, S = 50; + else if (!O() && !k() && String(m() || "output") === "output" && String(f() || "*") === "*") try { + let t = await Pe(`${p.HEALTH_COUNTERS}?scope=output`, { signal: g || void 0 }); + t?.ok && (t.data?.total_assets || 0) > 0 && await h(e); } catch (e) { console.debug?.(e); } } - }, te = (e, t = 2e3) => (v && clearTimeout(v), E() ? (b = null, x = 0, v = setTimeout(() => { - v = null, ee(e).catch(() => {}); - }, t), v) : (b = e, x = t, null)); + }, ne = (e, t = 2e3) => (y && clearTimeout(y), D() ? (x = null, S = 0, y = setTimeout(() => { + y = null, te(e).catch(() => {}); + }, t), y) : (x = e, S = t, null)); return { - queuedReload: k, + queuedReload: A, restoreUiState: N, - scheduleAutoLoad: te, + scheduleAutoLoad: ne, createCountersUpdateHandler: ({ state: t = {}, getStableQuery: n = () => String(e?.dataset?.mjrQuery || "*").trim() || "*", getRecentUserInteractionAt: r = () => 0 } = {}) => { let i = globalThis?.window ?? globalThis, a = null, o = null, s = null, c = !1; return async (e = {}) => { @@ -16095,12 +16611,12 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul c = !0, a = e.last_scan_end, o = e.last_index_end, s = Number(e.total_assets ?? null); return; } - let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = Gg(t, String(n() || "*").trim() || "*"), p = Date.now() - w < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; - if (Number.isFinite(d) && (s = d), !f || p && D() && !u && !g) { + let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = x_(t, String(n() || "*").trim() || "*"), p = Date.now() - T < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; + if (Number.isFinite(d) && (s = d), !f || p && O() && !u && !g) { a = e.last_scan_end, o = e.last_index_end; return; } - let _ = Date.now() - Number(i?.__mjrLastAssetUpsert || 0) < 15e3, v = _ && m > 0 && h > 0 && m <= h + 8, y = g && !l && !u && D(); + let _ = Date.now() - Number(i?.__mjrLastAssetUpsert || 0) < 15e3, v = _ && m > 0 && h > 0 && m <= h + 8, y = g && !l && !u && O(); u && (o = e.last_index_end); let b = u && !l && !g && !_; if (v) { @@ -16130,7 +16646,7 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } try { let e = Date.now() - Math.max(0, Number(r() || 0) || 0); - D() || (e > 1500 ? A(x) : C = x); + O() || (e > 1500 ? ee(x) : w = x); } catch (e) { console.debug?.(e); } @@ -16168,15 +16684,15 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } catch (e) { console.debug?.(e); } - y && clearTimeout(y), t.length === 0 || t === "*" ? c() : y = setTimeout(() => { - y = null, c(); + b && clearTimeout(b), t.length === 0 || t === "*" ? c() : b = setTimeout(() => { + b = null, c(); }, n); } }, u = (e) => { - e?.key === "Enter" && (y &&= (clearTimeout(y), null), c()); + e?.key === "Enter" && (b &&= (clearTimeout(b), null), c()); }; return e.addEventListener("input", l, { signal: t || void 0 }), e.addEventListener("keypress", u, { signal: t || void 0 }), () => { - y &&= (clearTimeout(y), null); + b &&= (clearTimeout(b), null); try { e.removeEventListener("input", l); } catch (e) { @@ -16189,9 +16705,9 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } }; }, - markGridDirty: A, + markGridDirty: ee, setVisibility(e = null) { - return E(e); + return D(e); }, dispose() { try { @@ -16200,12 +16716,12 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } catch (e) { console.debug?.(e); } - v &&= (clearTimeout(v), null), b = null, x = 0, y &&= (clearTimeout(y), null); + y &&= (clearTimeout(y), null), x = null, S = 0, b &&= (clearTimeout(b), null); } }; } // ui/features/panel/panelBootstrap.ts -function qg(e, { useComfyThemeUI: t }) { +function C_(e, { useComfyThemeUI: t }) { t ? e.classList.add("mjr-assets-manager") : e.classList.remove("mjr-assets-manager"); let n = e.parentElement || null, r = n ? { height: n.style.height, @@ -16217,7 +16733,7 @@ function qg(e, { useComfyThemeUI: t }) { } catch (e) { console.debug?.(e); } - Zn(); + _t(); for (let t of [ () => e._eventCleanup?.(), () => e._mjrPopoverManager?.dispose?.(), @@ -16231,7 +16747,7 @@ function qg(e, { useComfyThemeUI: t }) { console.debug?.(e); } e.replaceChildren(), e.classList.add("mjr-am-container"); - let i = Oi(e); + let i = Ni(e); try { e._mjrPopoverManager = i; } catch (e) { @@ -16244,10 +16760,10 @@ function qg(e, { useComfyThemeUI: t }) { }; } // ui/features/panel/panelSettingsSync.ts -function Jg({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: i, similarBtn: a, setSemanticEnabled: o, similarEnabledTitle: s, similarDisabledTitle: c, refreshGridFn: l, isSidebarOpen: u, readActiveAssetId: d, getSidebarController: f, panelLifecycleAC: p }) { +function w_({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: i, similarBtn: a, setSemanticEnabled: o, similarEnabledTitle: s, similarDisabledTitle: c, refreshGridFn: l, isSidebarOpen: u, readActiveAssetId: d, getSidebarController: f, panelLifecycleAC: p }) { let m = "", h = () => { try { - return !!(Xt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Mt()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -16306,20 +16822,20 @@ function Jg({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: } } }, v = async (e) => { - let n = String(e || t.scope || "output").toLowerCase(), r = !!Xt()?.watcher?.enabled; + let n = String(e || t.scope || "output").toLowerCase(), r = !!Mt()?.watcher?.enabled; if (n === "custom") try { - await E(!1); + await Oe(!1); } catch (e) { console.debug?.(e); } else { try { - await E(r); + await Oe(r); } catch (e) { console.debug?.(e); } if (r) try { - await x({ + await C({ scope: n, customRootId: "" }); @@ -16330,9 +16846,9 @@ function Jg({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: }, y = (e) => { let n = String(e?.detail?.key || "").trim(), r = n === "__init__", i = r || n.startsWith("grid.") || n.startsWith("infiniteScroll.") || n.startsWith("siblings.") || n.startsWith("search.") || n.startsWith("rtHydrate.") || n.startsWith("workflowMinimap."), a = r || n.startsWith("sidebar.") || n.startsWith("ai."), o = r || n.startsWith("watcher."); try { - let e = Xt(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), p = String(e?.ui?.tagColor || "").trim(); + let e = Mt(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), p = String(e?.ui?.tagColor || "").trim(); if (/^#[0-9a-fA-F]{3,8}$/.test(o) && document.documentElement.style.setProperty("--mjr-card-hover-color", o), /^#[0-9a-fA-F]{3,8}$/.test(s) && document.documentElement.style.setProperty("--mjr-card-selection-color", s), /^#[0-9a-fA-F]{3,8}$/.test(c) && document.documentElement.style.setProperty("--mjr-rating-color", c), /^#[0-9a-fA-F]{3,8}$/.test(p) && document.documentElement.style.setProperty("--mjr-tag-color", p), _(e.sidebar?.position || "right"), g(t), i) { - let e = Qn() || null; + let e = ht() || null; if (!r && n.startsWith("siblings.")) try { e?.dispatchEvent(new CustomEvent("mjr:reload-grid")); } catch { @@ -16369,7 +16885,7 @@ function Jg({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: }; } // ui/features/panel/panelGridEventBindings.ts -function Yg({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, notifyContextChanged: r, markUserInteraction: i, writePanelValue: a, popovers: o, collectionsPopover: s, gridController: c, registerSummaryDispose: l }) { +function T_({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, notifyContextChanged: r, markUserInteraction: i, writePanelValue: a, popovers: o, collectionsPopover: s, gridController: c, registerSummaryDispose: l }) { let u = null; try { u = () => n(), e.addEventListener("mjr:reload-grid", u, { signal: t?.signal }), l(() => { @@ -16397,7 +16913,7 @@ function Yg({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, not }), i(), r(); let l = Number(n?.count || s.length || o.length || 0); try { - I(R("toast.nameCollisionInView", "Name collision in view: {n} item(s) selected", { n: l }), "info", 1800); + F(L("toast.nameCollisionInView", "Name collision in view: {n} item(s) selected", { n: l }), "info", 1800); } catch (e) { console.debug?.(e); } @@ -16462,34 +16978,34 @@ function Yg({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, not } } // ui/features/panel/panelSimilarSearch.ts -var Xg = 500; -function Zg(e) { +var E_ = 500; +function D_(e) { return Number(e?.status || 0) === 404 && String(e?.error || "").toLowerCase().includes("non-json"); } -function Qg(e, t = "") { +function O_(e, t = "") { let n = Array.isArray(e) ? e : []; - return n.length <= Xg ? { + return n.length <= E_ ? { list: n, title: t, truncated: !1, total: n.length } : { - list: n.slice(0, Xg), - title: `${String(t || "").trim() || "Generation group"} - showing first ${Xg}/${n.length}`, + list: n.slice(0, E_), + title: `${String(t || "").trim() || "Generation group"} - showing first ${E_}/${n.length}`, truncated: !0, total: n.length }; } -function $g(e = {}) { +function k_(e = {}) { let t = String(e?.stackId || e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.asset?.id || "").trim(); return e?.isDupGroup ? n ? `duplicates:${n}` : "duplicates" : n ? `group:${n}` : "group"; } -function e_(e, t) { +function A_(e, t) { return String(e?.[t] ?? e?.file_info?.[t] ?? "").trim(); } -function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplicatesBtn: r, similarSameNodeBtn: i, similarSameWorkflowBtn: a, gridContainer: o, state: s, panelLifecycleAC: l, isAiEnabled: u, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { +function j_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplicatesBtn: r, similarSameNodeBtn: i, similarSameWorkflowBtn: a, gridContainer: o, state: c, panelLifecycleAC: l, isAiEnabled: u, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { let C = () => String(f() || p()[0] || "").trim(), w = () => { let e = Number(C()); return Number.isFinite(e) && e > 0 ? e : 0; @@ -16510,12 +17026,12 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic }, D = async (e = w()) => { if (!e) return null; try { - let t = await se(e, { timeoutMs: 3e4 }); + let t = await Ue(e, { timeoutMs: 3e4 }); return t?.ok && t.data || null; } catch (e) { return console.debug?.(e), null; } - }, O = async (e, t) => e && t.some((t) => e_(e, t)) ? e : await D() || e, k = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ + }, O = async (e, t) => e && t.some((t) => A_(e, t)) ? e : await D() || e, k = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ filename: String(e?.filename || "").trim(), subfolder: String(e?.subfolder || "").trim().replace(/\\/g, "/"), type: String(e?.type || "").trim().toLowerCase() @@ -16524,7 +17040,7 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic for (let e of t.slice(0, 4)) { let t = e.type === "input" ? "input" : "output"; try { - let i = await le(L({ + let i = await Pe(qe({ q: e.filename, scope: t, limit: 50, @@ -16545,15 +17061,15 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic } } if (!n.length) { - I(R("nodeContext.fileNotIndexed", "The node file is not indexed yet. Run a scan first."), "info", 3200); + F(L("nodeContext.fileNotIndexed", "The node file is not indexed yet. Run a scan first."), "info", 3200); return; } let i = String(e?.title || e?.sourceNodeType || e?.source_node_type || t[0]?.filename || "").trim(); - h("similarResults", n), h("similarSourceAssetId", `node-file:${t[0]?.filename || ""}`), h("similarTitle", R("nodeContext.fileResultsTitle", "Node {node} file ({n} assets)", { + h("similarResults", n), h("similarSourceAssetId", `node-file:${t[0]?.filename || ""}`), h("similarTitle", L("nodeContext.fileResultsTitle", "Node {node} file ({n} assets)", { node: i || t[0]?.filename || "", n: n.length })), await g?.setScope?.("similar"); - }, j = async (e = {}) => { + }, ee = async (e = {}) => { let t = String(e?.sourceNodeId || e?.source_node_id || "").trim(), n = k(e); if (t || n.length) { try { @@ -16563,26 +17079,26 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic } if (!t) await A(e, n); else try { - let r = await le(ut(t, { + let r = await Pe(Ne(t, { jobId: e?.jobId || e?.job_id || "", latest: e?.latest !== !1, limit: 500 }), { timeoutMs: 3e4 }); if (!r?.ok) { - if (Zg(r)) { + if (D_(r)) { if (n.length) { await A(e, n); return; } let t = window.MajoorAssetsManager ||= {}; - t.nodeContextRouteMissingToastShown || (t.nodeContextRouteMissingToastShown = !0, I(R("nodeContext.routeMissing", "Node context backend route is not loaded yet. Restart ComfyUI after updating Majoor Assets Manager."), "warn", 7e3)); + t.nodeContextRouteMissingToastShown || (t.nodeContextRouteMissingToastShown = !0, F(L("nodeContext.routeMissing", "Node context backend route is not loaded yet. Restart ComfyUI after updating Majoor Assets Manager."), "warn", 7e3)); return; } if (n.length) { await A(e, n); return; } - I(String(r?.error || R("nodeContext.loadFailed", "Failed to load node assets")), "error", 3e3); + F(String(r?.error || L("nodeContext.loadFailed", "Failed to load node assets")), "error", 3e3); return; } let i = Array.isArray(r?.data) ? r.data : []; @@ -16591,21 +17107,21 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic await A(e, n); return; } - I(R("nodeContext.noAssets", "No indexed assets found for this node yet."), "info", 2600); + F(L("nodeContext.noAssets", "No indexed assets found for this node yet."), "info", 2600); return; } let a = String(e?.title || e?.sourceNodeType || e?.source_node_type || t).trim(); - h("similarResults", i), h("similarSourceAssetId", `node:${t}`), h("similarTitle", R("nodeContext.resultsTitle", "Node {node} outputs ({n} assets)", { + h("similarResults", i), h("similarSourceAssetId", `node:${t}`), h("similarTitle", L("nodeContext.resultsTitle", "Node {node} outputs ({n} assets)", { node: a || t, n: i.length })), await g?.setScope?.("similar"); } catch (e) { - console.debug?.(e), I(R("nodeContext.loadFailed", "Failed to load node assets"), "error", 3e3); + console.debug?.(e), F(L("nodeContext.loadFailed", "Failed to load node assets"), "error", 3e3); } } - }, M = async () => { + }, j = async () => { if (!u()) { - I(d, "info", 2200); + F(d, "info", 2200); return; } try { @@ -16615,60 +17131,60 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic } let t = w(); if (!t) { - I(R("search.selectAssetForSimilar", "Select an asset first to find similar images/videos."), "info", 2500); + F(L("search.selectAssetForSimilar", "Select an asset first to find similar images/videos."), "info", 2500); return; } let n = e.title; - e.disabled = !0, e.title = R("search.findingSimilar", "Finding similar assets..."); + e.disabled = !0, e.title = L("search.findingSimilar", "Finding similar assets..."); try { - let e = await c(t, { + let e = await s(t, { topK: 100, - scope: s.scope || "output", - customRootId: s.customRootId || "" + scope: c.scope || "output", + customRootId: c.customRootId || "" }); if (!e?.ok) { - I(String(e?.error || R("search.findSimilarFailed", "Failed to find similar assets")), "error", 3e3); + F(String(e?.error || L("search.findSimilarFailed", "Failed to find similar assets")), "error", 3e3); return; } let n = Array.isArray(e?.data) ? e.data : []; - h("similarResults", n), h("similarSourceAssetId", String(t)), h("similarTitle", R("search.similarResults", "Similar to asset #{id} ({n} results)", { + h("similarResults", n), h("similarSourceAssetId", String(t)), h("similarTitle", L("search.similarResults", "Similar to asset #{id} ({n} results)", { id: t, n: n.length })), await g?.setScope?.("similar"); } catch (e) { - console.debug?.(e), I(R("search.findSimilarFailed", "Failed to find similar assets"), "error", 3e3); + console.debug?.(e), F(L("search.findSimilarFailed", "Failed to find similar assets"), "error", 3e3); } finally { e.disabled = !1, e.title = n; } - }, N = async () => { + }, M = async () => { try { _?.(); } catch (e) { console.debug?.(e); } - let e = await E(), t = String(e?.id || C() || "").trim(), n = Array.isArray(e?._mjrDupMembers) ? e._mjrDupMembers : []; + let e = await E(), t = String(e?.id || C() || "").trim(), n = md(Array.isArray(e?._mjrDupMembers) ? e._mjrDupMembers : []); if (n.length >= 2) { - h("similarResults", n), h("similarSourceAssetId", t ? `duplicates:${t}` : "duplicates"), h("similarTitle", R("search.duplicateResults", "Duplicates ({n} assets)", { n: n.length })), await g?.setScope?.("similar"); + h("similarResults", n), h("similarSourceAssetId", t ? `duplicates:${t}` : "duplicates"), h("similarTitle", L("search.duplicateResults", "Duplicates ({n} assets)", { n: n.length })), await g?.setScope?.("similar"); return; } let r = (S?.() || {})?.firstGroup; - r && Array.isArray(r.assets) && r.assets.length >= 2 ? (h("similarResults", r.assets), h("similarSourceAssetId", "duplicates"), h("similarTitle", R("search.duplicateResults", "Duplicates ({n} assets)", { n: r.assets.length })), await g?.setScope?.("similar")) : I(R("search.noKnownDuplicates", "No duplicate group is available yet. Run duplicate analysis from the duplicate alert first."), "info", 3200); - }, ee = async () => { - let e = await O(await E(), ["source_node_id", "source_node_type"]), t = e_(e, "source_node_id"); - t ? await j({ + r && Array.isArray(r.assets) && r.assets.length >= 2 ? (h("similarResults", r.assets), h("similarSourceAssetId", "duplicates"), h("similarTitle", L("search.duplicateResults", "Duplicates ({n} assets)", { n: r.assets.length })), await g?.setScope?.("similar")) : F(L("search.noKnownDuplicates", "No duplicate group is available yet. Run duplicate analysis from the duplicate alert first."), "info", 3200); + }, N = async () => { + let e = await O(await E(), ["source_node_id", "source_node_type"]), t = A_(e, "source_node_id"); + t ? await ee({ sourceNodeId: t, - sourceNodeType: e_(e, "source_node_type"), - jobId: e_(e, "job_id"), - title: e_(e, "source_node_type") || t - }) : I(R("search.noSourceNode", "Selected asset has no persisted source node id."), "info", 2600); + sourceNodeType: A_(e, "source_node_type"), + jobId: A_(e, "job_id"), + title: A_(e, "source_node_type") || t + }) : F(L("search.noSourceNode", "Selected asset has no persisted source node id."), "info", 2600); }, te = async () => { try { _?.(); } catch (e) { console.debug?.(e); } - let e = e_(await O(await E(), ["workflow_id"]), "workflow_id"); - if (!e) I(R("search.noWorkflowId", "Selected asset has no persisted workflow id."), "info", 2600); + let e = A_(await O(await E(), ["workflow_id"]), "workflow_id"); + if (!e) F(L("search.noWorkflowId", "Selected asset has no persisted workflow id."), "info", 2600); else { h("workflowId", e); try { @@ -16677,7 +17193,7 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic console.debug?.(e); } try { - await g?.setScope?.(s.scope || "output"); + await g?.setScope?.(c.scope || "output"); } catch (e) { console.debug?.(e); } @@ -16693,15 +17209,15 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic } y?.toggle?.(t, e); }, { signal: l?.signal }); - let P = (e, t) => { + let ne = (e, t) => { e?.addEventListener("click", (e) => { e.stopPropagation(), t(); }, { signal: l?.signal }); }; - P(n, M), P(r, N), P(i, ee), P(a, te), o?.addEventListener(B.OPEN_STACK_GROUP, async (e) => { + ne(n, j), ne(r, M), ne(i, N), ne(a, te), o?.addEventListener(B.OPEN_STACK_GROUP, async (e) => { try { - let t = e?.detail || {}, n = Array.isArray(t?.members) ? t.members : [], r = `Generation group (${n.length} assets)`, i = Qg(n, String(t?.title || "").trim() || r); - i.truncated && I(`Large stack truncated to ${Xg}/${i.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", i.list), h("similarSourceAssetId", $g(t)), h("similarTitle", i.title || r), await Promise.resolve(), await g?.setScope?.("similar"); + let t = e?.detail || {}, n = Array.isArray(t?.members) ? t.members : [], r = `Generation group (${n.length} assets)`, i = O_(n, String(t?.title || "").trim() || r); + i.truncated && F(`Large stack truncated to ${E_}/${i.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", i.list), h("similarSourceAssetId", k_(t)), h("similarTitle", i.title || r), await Promise.resolve(), await g?.setScope?.("similar"); } catch (e) { console.debug?.(e); } @@ -16712,20 +17228,20 @@ function t_({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplic } catch (e) { console.debug?.(e); } - j(e?.detail || {}); + ee(e?.detail || {}); }, { signal: l?.signal }); try { let e = window.MajoorAssetsManager?.pendingNodeContext || null; e && (window.MajoorAssetsManager.pendingNodeContext = null, setTimeout(() => { - j(e); + ee(e); }, 0)); } catch (e) { console.debug?.(e); } } // ui/features/panel/panelPinnedFolders.ts -function n_({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFoldersMenu: n = null, pinnedFoldersPopover: r, popovers: i, closeOtherPopovers: a, state: o, gridContainer: s, customSelect: c, scopeController: l, customRootsController: u, gridController: d, applyWatcherForScope: f, refreshDuplicateAlerts: p, notifyContextChanged: m, panelLifecycleAC: h }) { - let g = (e) => { +function M_({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFoldersMenu: n = null, pinnedFoldersPopover: r, popovers: i, closeOtherPopovers: a, state: o, gridContainer: s, customSelect: c, scopeController: l, customRootsController: u, gridController: d, applyWatcherForScope: f, refreshDuplicateAlerts: m, notifyContextChanged: h, panelLifecycleAC: g }) { + let _ = (e) => { let t = String(e?.id || "").trim(); if (!t) return null; let n = String(e?.path || "").trim(); @@ -16734,14 +17250,14 @@ function n_({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFold label: String(e?.name || n || t).trim() || t, path: n }; - }, _ = async () => { + }, v = async () => { try { - let e = await le(lt.CUSTOM_ROOTS, h?.signal ? { signal: h.signal } : void 0); - return e?.ok && Array.isArray(e.data) ? e.data.map(g).filter(Boolean) : []; + let e = await Pe(p.CUSTOM_ROOTS, g?.signal ? { signal: g.signal } : void 0); + return e?.ok && Array.isArray(e.data) ? e.data.map(_).filter(Boolean) : []; } catch (e) { return console.debug?.(e), []; } - }, v = async (e) => { + }, y = async (e) => { let t = String(e?.id || "").trim(); if (!t) return; let n = String(e?.label || e?.path || t).trim(); @@ -16768,24 +17284,24 @@ function n_({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFold console.debug?.(e); } try { - await p(); + await m(); } catch (e) { console.debug?.(e); } try { - m(); + h(); } catch (e) { console.debug?.(e); } i.close(r), await d.reloadGrid(); - }, y = async (e, t = null) => { + }, b = async (e, t = null) => { t?.preventDefault?.(), t?.stopPropagation?.(); let n = String(e?.id || "").trim(); if (!n) return; let r = String(e?.label || e?.path || n).trim(); - if (!await Gt(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: r }))) return; - let i = await pe(lt.CUSTOM_ROOTS_REMOVE, { id: n }); - if (!i?.ok) I(i?.error || R("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); + if (!await jt(L("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: r }))) return; + let i = await me(p.CUSTOM_ROOTS_REMOVE, { id: n }); + if (!i?.ok) F(i?.error || L("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); else { String(o.customRootId || "") === n && (o.customRootId = "", o.customRootLabel = "", o.currentFolderRelativePath = ""); try { @@ -16793,17 +17309,17 @@ function n_({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFold } catch (e) { console.debug?.(e); } - await S(), await d.reloadGrid(); + await C(), await d.reloadGrid(); } - }, b = (e) => typeof t?.setPinnedFolders == "function" && (t.setPinnedFolders({ + }, x = (e) => typeof t?.setPinnedFolders == "function" && (t.setPinnedFolders({ roots: e, - emptyLabel: R("msg.noPinnedFolders", "No pinned folders"), - loadingLabel: R("status.loading", "Loading..."), - unpinLabel: R("ctx.unpinFolder", "Unpin folder"), - onOpen: v, - onUnpin: y, + emptyLabel: L("msg.noPinnedFolders", "No pinned folders"), + loadingLabel: L("status.loading", "Loading..."), + unpinLabel: L("ctx.unpinFolder", "Unpin folder"), + onOpen: y, + onUnpin: b, loading: !1 - }), !0), x = (e) => { + }), !0), S = (e) => { if (n) { try { n.replaceChildren(); @@ -16814,38 +17330,38 @@ function n_({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFold let e = document.createElement("div"); e.className = "mjr-pinned-folder-row"; let r = document.createElement("button"); - r.type = "button", r.className = "mjr-menu-item mjr-pinned-folder-open", r.textContent = t.label, r.addEventListener("click", () => v(t), { signal: h?.signal }); + r.type = "button", r.className = "mjr-menu-item mjr-pinned-folder-open", r.textContent = t.label, r.addEventListener("click", () => y(t), { signal: g?.signal }); let i = document.createElement("button"); - i.type = "button", i.className = "mjr-menu-item mjr-pinned-folder-unpin", i.title = R("ctx.unpinFolder", "Unpin folder"), i.textContent = "x", i.addEventListener("click", (e) => y(t, e), { signal: h?.signal }), e.appendChild(r), e.appendChild(i), n.appendChild(e); + i.type = "button", i.className = "mjr-menu-item mjr-pinned-folder-unpin", i.title = L("ctx.unpinFolder", "Unpin folder"), i.textContent = "x", i.addEventListener("click", (e) => b(t, e), { signal: g?.signal }), e.appendChild(r), e.appendChild(i), n.appendChild(e); } else { let e = document.createElement("div"); - e.className = "mjr-muted", e.style.cssText = "padding:10px 12px; opacity:0.75;", e.textContent = R("msg.noPinnedFolders", "No pinned folders"), n.appendChild(e); + e.className = "mjr-muted", e.style.cssText = "padding:10px 12px; opacity:0.75;", e.textContent = L("msg.noPinnedFolders", "No pinned folders"), n.appendChild(e); } } }; - async function S() { + async function C() { try { - t?.setPinnedFoldersLoading?.(!0, R("status.loading", "Loading...")); + t?.setPinnedFoldersLoading?.(!0, L("status.loading", "Loading...")); } catch (e) { console.debug?.(e); } - let e = await _(); - b(e) || x(e); + let e = await v(); + x(e) || S(e); } e?.addEventListener("click", async (t) => { t.stopPropagation(); try { - await S(); + await C(); } catch (e) { console.debug?.(e); } a(), i.toggle(r, e); - }, { signal: h?.signal }); + }, { signal: g?.signal }); } // ui/features/filters/calendar/AgendaCalendar.ts -var r_ = (e) => String(e).padStart(2, "0"); -function i_(e) { +var N_ = (e) => String(e).padStart(2, "0"); +function P_(e) { try { let t = String(e || "").trim(); if (!/^\d{4}-\d{2}-\d{2}$/.test(t)) return null; @@ -16857,50 +17373,50 @@ function i_(e) { return null; } } -function a_(e) { +function F_(e) { try { let t = e.getFullYear(), n = e.getMonth() + 1, r = e.getDate(); - return `${t}-${r_(n)}-${r_(r)}`; + return `${t}-${N_(n)}-${N_(r)}`; } catch { return ""; } } -function o_(e) { +function I_(e) { try { - return `${e.getFullYear()}-${r_(e.getMonth() + 1)}`; + return `${e.getFullYear()}-${N_(e.getMonth() + 1)}`; } catch { return ""; } } -function s_(e) { +function L_(e) { try { return new Date(e.getFullYear(), e.getMonth(), 1); } catch { return /* @__PURE__ */ new Date(); } } -function c_(e, t) { +function R_(e, t) { try { return new Date(e.getFullYear(), e.getMonth() + t, 1); } catch { return /* @__PURE__ */ new Date(); } } -function l_(e) { +function z_(e) { try { return new Date(e.getFullYear(), e.getMonth() + 1, 0).getDate(); } catch { return 31; } } -function u_(e) { +function B_(e) { try { return (e.getDay() + 6) % 7; } catch { return 0; } } -function d_(e, t) { +function V_(e, t) { if (e) try { let n = String(e.value || ""); e.value = t || "", n !== e.value && e.dispatchEvent?.(new Event("change", { bubbles: !0 })); @@ -16908,37 +17424,37 @@ function d_(e, t) { console.debug?.(e); } } -async function f_({ state: e, monthKey: t }) { +async function H_({ state: t, monthKey: n }) { try { - let n = String(e?.scope || "output"); - if (n === "collection") return { + let r = String(t?.scope || "output"); + if (r === "collection") return { ok: !0, days: {} }; - let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = st({ - scope: n, - customRootId: e?.customRootId || null, - subfolder: i, - month: t, - kind: e?.kindFilter || null, - hasWorkflow: e?.workflowOnly ? !0 : null, - minRating: Number(e?.minRating || 0) || 0, - minSizeMB: Number(e?.minSizeMB || 0) || 0, - maxSizeMB: Number(e?.maxSizeMB || 0) || 0, - minWidth: Number(e?.minWidth || 0) || 0, - minHeight: Number(e?.minHeight || 0) || 0, - maxWidth: Number(e?.maxWidth || 0) || 0, - maxHeight: Number(e?.maxHeight || 0) || 0, - workflowType: String(e?.workflowType || "").trim().toUpperCase() || null, + let i = String(t?.currentFolderRelativePath || "").trim(), a = r === "custom" && !t?.customRootId ? null : i || null, o = e({ + scope: r, + customRootId: t?.customRootId || null, + subfolder: a, + month: n, + kind: t?.kindFilter || null, + hasWorkflow: t?.workflowOnly ? !0 : null, + minRating: Number(t?.minRating || 0) || 0, + minSizeMB: Number(t?.minSizeMB || 0) || 0, + maxSizeMB: Number(t?.maxSizeMB || 0) || 0, + minWidth: Number(t?.minWidth || 0) || 0, + minHeight: Number(t?.minHeight || 0) || 0, + maxWidth: Number(t?.maxWidth || 0) || 0, + maxHeight: Number(t?.maxHeight || 0) || 0, + workflowType: String(t?.workflowType || "").trim().toUpperCase() || null, dateRange: null, dateExact: null - }), o = await le(a); - return !o || !o.ok ? { + }), s = await Pe(o); + return !s || !s.ok ? { ok: !1, - error: o?.error || "Histogram error" + error: s?.error || "Histogram error" } : { ok: !0, - days: o?.data?.days && typeof o.data.days == "object" ? o.data.days : {} + days: s?.data?.days && typeof s.data.days == "object" ? s.data.days : {} }; } catch (e) { return { @@ -16947,7 +17463,7 @@ async function f_({ state: e, monthKey: t }) { }; } } -function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { +function U_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { if (!e || !(e instanceof HTMLElement) || !t) return { dispose() {}, refresh() {} @@ -16967,10 +17483,10 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n let u = document.createElement("div"); u.className = "mjr-agenda-footer"; let d = document.createElement("button"); - d.type = "button", d.className = "mjr-btn mjr-agenda-clear", d.textContent = R("action.clear", "Clear"); + d.type = "button", d.className = "mjr-btn mjr-agenda-clear", d.textContent = L("action.clear", "Clear"); let f = document.createElement("button"); - f.type = "button", f.className = "mjr-btn mjr-agenda-refresh", f.textContent = R("action.refresh", "Refresh"), u.appendChild(d), u.appendChild(f), i.appendChild(a), i.appendChild(l), i.appendChild(u), e.appendChild(i); - let p = s_(i_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { + f.type = "button", f.className = "mjr-btn mjr-agenda-refresh", f.textContent = L("action.refresh", "Refresh"), u.appendChild(d), u.appendChild(f), i.appendChild(a), i.appendChild(l), i.appendChild(u), e.appendChild(i); + let p = L_(P_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { if (g) return; let e = p.getFullYear(), n = p.getMonth(); s.textContent = p.toLocaleString(void 0, { @@ -16978,53 +17494,53 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n year: "numeric" }), l.innerHTML = ""; let r = [ - R("weekday.monShort", "Mon"), - R("weekday.tueShort", "Tue"), - R("weekday.wedShort", "Wed"), - R("weekday.thuShort", "Thu"), - R("weekday.friShort", "Fri"), - R("weekday.satShort", "Sat"), - R("weekday.sunShort", "Sun") + L("weekday.monShort", "Mon"), + L("weekday.tueShort", "Tue"), + L("weekday.wedShort", "Wed"), + L("weekday.thuShort", "Thu"), + L("weekday.friShort", "Fri"), + L("weekday.satShort", "Sat"), + L("weekday.sunShort", "Sun") ]; for (let e of r) { let t = document.createElement("div"); t.className = "mjr-agenda-weekday", t.textContent = e, l.appendChild(t); } - let i = u_(new Date(e, n, 1)), a = l_(p), o = i_(t.value), c = o ? a_(o) : ""; + let i = B_(new Date(e, n, 1)), a = z_(p), o = P_(t.value), c = o ? F_(o) : ""; for (let e = 0; e < i; e++) { let e = document.createElement("div"); e.className = "mjr-agenda-day mjr-agenda-day--blank", l.appendChild(e); } for (let r = 1; r <= a; r++) { - let i = a_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); + let i = F_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); if (o.type = "button", o.className = "mjr-agenda-day", o.textContent = String(r), o.dataset.date = i, a > 0) { o.classList.add("mjr-agenda-day--has-assets"); - let e = R(a === 1 ? "tooltip.assetsDaySingular" : "tooltip.assetsDayPlural", a === 1 ? "{count} asset" : "{count} assets", { count: a }); + let e = L(a === 1 ? "tooltip.assetsDaySingular" : "tooltip.assetsDayPlural", a === 1 ? "{count} asset" : "{count} assets", { count: a }); o.title = e; let t = document.createElement("span"); t.className = "mjr-agenda-day-badge", t.textContent = a > 99 ? "99+" : String(a), t.setAttribute("aria-label", e), o.appendChild(t); - } else o.title = R("tooltip.noAssetsDay", "No assets on this day"); + } else o.title = L("tooltip.noAssetsDay", "No assets on this day"); i === c && o.classList.add("mjr-agenda-day--selected"), o.addEventListener("click", () => { - d_(t, String(t.value || "").trim() === i ? "" : i); + V_(t, String(t.value || "").trim() === i ? "" : i); }), l.appendChild(o); } }, v = async () => { if (g) return; - let e = o_(p); + let e = I_(p); if (!e) return; h += 1; - let t = h, r = await f_({ + let t = h, r = await H_({ state: n, monthKey: e }); g || t === h && (m = r.ok && r.days || {}, _()); }; return o.addEventListener("click", async () => { - p = c_(p, -1), await v(); + p = R_(p, -1), await v(); }), c.addEventListener("click", async () => { - p = c_(p, 1), await v(); + p = R_(p, 1), await v(); }), d.addEventListener("click", () => { - d_(t, ""); + V_(t, ""); try { r?.(); } catch (e) { @@ -17033,9 +17549,9 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n }), f.addEventListener("click", async () => { await v(); }), t.addEventListener("change", () => { - let e = i_(t.value); + let e = P_(t.value); if (e) { - let t = s_(e); + let t = L_(e); (t.getFullYear() !== p.getFullYear() || t.getMonth() !== p.getMonth()) && (p = t); } _(); @@ -17052,14 +17568,14 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n }; } // ui/features/panel/controllers/filtersController.ts -var m_ = (e) => { +var W_ = (e) => { let t = String(e ?? "").trim(); if (!t) return 0; let n = t.replace(",", "."), r = Number(n); return Number.isFinite(r) ? r : 0; }; -function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { - let { write: x } = ph(e, [ +function G_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { + let { write: x } = Uh(e, [ "kindFilter", "workflowOnly", "minRating", @@ -17171,7 +17687,7 @@ function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor C(); }, b ? { signal: b } : void 0); let E = () => { - let e = m_(c?.value || 0), t = m_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; + let e = W_(c?.value || 0), t = W_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; r > 0 && n > 0 && r < n && (r = n, l && (l.value = String(r))), x("minSizeMB", n), x("maxSizeMB", r); try { y?.(); @@ -17182,7 +17698,7 @@ function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor }; T(c, "change", E, b ? { signal: b } : void 0), T(l, "change", E, b ? { signal: b } : void 0); let D = () => { - let e = m_(d?.value || 0), t = m_(f?.value || 0), n = m_(p?.value || 0), r = m_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; + let e = W_(d?.value || 0), t = W_(f?.value || 0), n = W_(p?.value || 0), r = W_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; o > 0 && i > 0 && o < i && (o = i, p && (p.value = String(o))), s > 0 && a > 0 && s < a && (s = a, m && (m.value = String(s))), x("minWidth", i), x("minHeight", a), x("maxWidth", o), x("maxHeight", s); try { u && (u.value = { @@ -17266,7 +17782,7 @@ function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor }; } // ui/features/panel/panelFiltersInit.ts -function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { +function K_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { let E = null; try { try { @@ -17276,7 +17792,7 @@ function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo } catch (e) { console.debug?.(e); } - E = p_({ + E = U_({ container: v, hiddenInput: _, state: e, @@ -17317,7 +17833,7 @@ function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo D = () => { e &&= (clearTimeout(e), null); }; - } else D = h_({ + } else D = G_({ state: e, kindSelect: n, wfCheckbox: r, @@ -17354,7 +17870,7 @@ function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo }; } // ui/features/panel/panelContextMenuExtraActions.ts -function __({ state: e, scopeController: t, browserNav: r, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { +function q_({ state: e, scopeController: t, browserNav: r, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { return { clearSimilarScope: async () => { try { @@ -17382,37 +17898,37 @@ function __({ state: e, scopeController: t, browserNav: r, gridController: i, ge if (t && Array.isArray(t.assets) && t.assets.length >= 2) { let e = t.assets[0] || {}, n = t.assets.slice(1).map((e) => Number(e?.id || 0)).filter((e) => e > 0); if (n.length) { - if (await Gt(R("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { + if (await jt(L("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { count: t.assets.length, target: e?.filename || e?.id }))) { - let t = await ce(Number(e?.id || 0), n); - t?.ok ? I(R("toast.tagsMerged", "Tags merged"), "success", 2200) : I(R("toast.tagMergeFailed", "Tag merge failed: {error}", { error: t?.error || "error" }), "warning", 3500); + let t = await Ie(Number(e?.id || 0), n); + t?.ok ? F(L("toast.tagsMerged", "Tags merged"), "success", 2200) : F(L("toast.tagMergeFailed", "Tag merge failed: {error}", { error: t?.error || "error" }), "warning", 3500); } - if (await Gt(R("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: n.length }))) { - let e = await D(n); - e?.ok ? (I(R("toast.duplicatesDeleted", "Duplicates deleted"), "success", 2200), await i.reloadGrid()) : I(R("toast.deleteFailed", "Delete failed: {error}", { error: e?.error || "error" }), "warning", 3500); + if (await jt(L("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: n.length }))) { + let e = await w(n); + e?.ok ? (F(L("toast.duplicatesDeleted", "Duplicates deleted"), "success", 2200), await i.reloadGrid()) : F(L("toast.deleteFailed", "Delete failed: {error}", { error: e?.error || "error" }), "warning", 3500); } await o(); return; } } - if (!await Gt(R("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; + if (!await jt(L("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; let r = await n(500); - r?.ok ? I(R("toast.dupAnalysisStarted", "Duplicate analysis started"), "info", 2200) : I(R("toast.analysisNotStarted", "Analysis not started: {error}", { error: r?.error || "error" }), "warning", 3500), await o(); + r?.ok ? F(L("toast.dupAnalysisStarted", "Duplicate analysis started"), "info", 2200) : F(L("toast.analysisNotStarted", "Analysis not started: {error}", { error: r?.error || "error" }), "warning", 3500), await o(); } }; } // ui/features/panel/panelRuntime.ts -async function v_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { - return y_(e, { +async function J_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { + return Y_(e, { useComfyThemeUI: t, external: n }); } -async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { - Bp("panelRender"), Up("panelRender"); - let r = typeof AbortController < "u" ? new AbortController() : null, { popovers: i, hostWrapper: a, hostWrapperPrevStyle: o } = qg(e, { useComfyThemeUI: t }), s = fh(); +async function Y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { + _m("panelRender"), bm("panelRender"); + let r = typeof AbortController < "u" ? new AbortController() : null, { popovers: i, hostWrapper: a, hostWrapperPrevStyle: o } = C_(e, { useComfyThemeUI: t }), s = Hh(); if (!s) throw Error("[Majoor] mountAssetsManagerPanelRuntime requires an active Pinia panel store"); for (let e of [ "statusSection", @@ -17428,7 +17944,7 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { "gridContainer", "sidebar" ]) if (!n?.[e]) throw Error(`[Majoor] mountAssetsManagerPanelRuntime now requires external.${e}`); - let c = ph(null, [ + let c = Uh(null, [ "searchQuery", "scrollTop", "scope", @@ -17452,27 +17968,27 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { let l = (e, t = "") => c.read(e, s?.[e] ?? t), u = (e, t) => c.write(e, t), d = () => { let e = l("selectedAssetIds", []); return Array.isArray(e) ? e.map(String).filter(Boolean) : []; - }, p = () => String(l("activeAssetId", "") || "").trim(), m = () => !!l("sidebarOpen", !1), { header: h, tabButtons: g, customMenuBtn: _, filterBtn: v, sortBtn: y, collectionsBtn: b, pinnedFoldersBtn: x, messageBtn: S, settingsBtn: C, customPopover: w, customSelect: T, customAddBtn: E, customRemoveBtn: D, filterPopover: O, kindSelect: k, wfCheckbox: j, workflowTypeSelect: M, workflowIdInput: N, workflowModelInput: ee, workflowRunsOnSelect: te, ratingSelect: P, minSizeInput: ne, maxSizeInput: re, resolutionPresetSelect: ie, minWidthInput: ae, minHeightInput: oe, maxWidthInput: se, maxHeightInput: ce, dateRangeSelect: ue, dateExactInput: de, agendaContainer: fe, sortPopover: me, sortMenu: he, collectionsPopover: ge, pinnedFoldersPopover: _e, pinnedFoldersController: ye, pinnedFoldersMenu: be, messagePopoverTitle: xe, messagePopover: Se, messageTabBtn: Ce, messageTabBadge: we, historyTabBtn: Te, historyTabBadge: Ee, historyTabCount: De, historyPanel: Oe, shortcutsTabBtn: ke, messageList: Ae, shortcutsPanel: je, markReadBtn: Me, searchSection: Ne, searchInputEl: Pe, similarBtn: Fe, similarPopover: Ie, similarFindBtn: Le, similarDuplicatesBtn: Re, similarSameNodeBtn: ze, similarSameWorkflowBtn: Be, setSemanticEnabled: Ve, _headerDispose: He } = n.headerSection, Ue = !!n?.headerSection?.isVueHeader; - c.read("searchQuery", "") && (Pe.value = c.read("searchQuery", "")), Pe.addEventListener("input", (e) => { + }, f = () => String(l("activeAssetId", "") || "").trim(), m = () => !!l("sidebarOpen", !1), { header: h, tabButtons: g, customMenuBtn: _, filterBtn: v, sortBtn: y, collectionsBtn: b, pinnedFoldersBtn: x, messageBtn: S, settingsBtn: C, customPopover: w, customSelect: T, customAddBtn: E, customRemoveBtn: D, filterPopover: O, kindSelect: A, wfCheckbox: ee, workflowTypeSelect: j, workflowIdInput: M, workflowModelInput: N, workflowRunsOnSelect: te, ratingSelect: ne, minSizeInput: P, maxSizeInput: re, resolutionPresetSelect: I, minWidthInput: ie, minHeightInput: ae, maxWidthInput: oe, maxHeightInput: se, dateRangeSelect: ce, dateExactInput: le, agendaContainer: ue, sortPopover: de, sortMenu: fe, collectionsPopover: pe, pinnedFoldersPopover: he, pinnedFoldersController: ge, pinnedFoldersMenu: _e, messagePopoverTitle: ve, messagePopover: ye, messageTabBtn: be, messageTabBadge: xe, historyTabBtn: Se, historyTabBadge: Ce, historyTabCount: we, historyPanel: Te, shortcutsTabBtn: Ee, messageList: De, shortcutsPanel: Oe, markReadBtn: ke, searchSection: Ae, searchInputEl: je, similarBtn: Me, similarPopover: Ne, similarFindBtn: Fe, similarDuplicatesBtn: Ie, similarSameNodeBtn: Le, similarSameWorkflowBtn: Re, setSemanticEnabled: ze, _headerDispose: Be } = n.headerSection, Ve = !!n?.headerSection?.isVueHeader; + c.read("searchQuery", "") && (je.value = c.read("searchQuery", "")), je.addEventListener("input", (e) => { c.write("searchQuery", e.target.value); }, { signal: r?.signal }); - let We = n.summaryBar, Ge = n.updateSummaryBar, Ke = n.folderBreadcrumb, qe = n.folderBreadcrumbController || null, Je = n.statusSection, Ye = n.statusDot, Xe = n.statusText, Ze = n.capabilitiesSection, Qe = n.browseSection, $e = n.gridWrapper, et = n.sidebar; - Xt(); - let tt = document.createElement("div"); - tt.classList.add("mjr-am-content"); - let L = null, nt = null; + let He = n.summaryBar, Ue = n.updateSummaryBar, We = n.folderBreadcrumb, Ge = n.folderBreadcrumbController || null, Ke = n.statusSection, R = n.statusDot, qe = n.statusText, Je = n.capabilitiesSection, Ye = n.browseSection, Xe = n.gridWrapper, Ze = n.sidebar; + Mt(); + let Qe = document.createElement("div"); + Qe.classList.add("mjr-am-content"); + let z = null, $e = null; e.tabIndex = -1; - let z = null, rt = 0, it = () => { + let et = null, nt = 0, rt = () => { try { - rt = Date.now(); + nt = Date.now(); } catch { - rt = 0; + nt = 0; } - }, at = typeof n?.bindGridHostState == "function" && typeof n?.restoreGridUiState == "function", ot = !at; - $e.addEventListener("scroll", () => { - it(), ot && (z && clearTimeout(z), z = setTimeout(() => { + }, it = typeof n?.bindGridHostState == "function" && typeof n?.restoreGridUiState == "function", at = !it; + Xe.addEventListener("scroll", () => { + rt(), at && (et && clearTimeout(et), et = setTimeout(() => { try { - c.write("scrollTop", $e.scrollTop); + c.write("scrollTop", Xe.scrollTop); } catch (e) { console.debug?.(e); } @@ -17480,17 +17996,17 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { }, { passive: !0, signal: r?.signal - }), L = n.gridContainer, L.parentElement !== $e && $e.appendChild(L), tr(L); + }), z = n.gridContainer, z.parentElement !== Xe && Xe.appendChild(z), pt(z); try { - L.dataset.mjrScope = String(l("scope", s.scope || "output") || "output"); + z.dataset.mjrScope = String(l("scope", s.scope || "output") || "output"); } catch (e) { console.debug?.(e); } - let st = [], ct = (e) => { - typeof e == "function" && st.push(e); + let ot = [], st = (e) => { + typeof e == "function" && ot.push(e); }; - L._mjrSummaryBarDispose = () => { - for (let e of st.splice(0)) try { + z._mjrSummaryBarDispose = () => { + for (let e of ot.splice(0)) try { e(); } catch (e) { console.debug?.(e); @@ -17499,17 +18015,17 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { try { let e = () => { try { - Ge?.({ + Ue?.({ state: s, - gridContainer: L + gridContainer: z }); } catch (e) { console.debug?.(e); } }; - L.addEventListener("mjr:grid-stats", e, { signal: r?.signal }), ct(() => { + z.addEventListener("mjr:grid-stats", e, { signal: r?.signal }), st(() => { try { - L.removeEventListener("mjr:grid-stats", e); + z.removeEventListener("mjr:grid-stats", e); } catch (e) { console.debug?.(e); } @@ -17517,107 +18033,107 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { } catch (e) { console.debug?.(e); } - let ut = n.loadAssets ?? gi, dt = n.loadAssetsFromList ?? _i, ft = n.prepareGridForScopeSwitch ?? vi, pt = n.disposeGrid ?? yi, mt = n.refreshGrid ?? bi, ht = n.captureAnchor ?? xi, gt = n.restoreAnchor ?? Si, vt = n.hydrateGridFromSnapshot ?? hi; + let ct = n.loadAssets ?? oi, ut = n.loadAssetsFromList ?? si, dt = n.prepareGridForScopeSwitch ?? ci, ft = n.disposeGrid ?? li, mt = n.refreshGrid ?? ui, ht = n.captureAnchor ?? di, vt = n.restoreAnchor ?? fi, yt = n.hydrateGridFromSnapshot ?? ai; if (typeof n?.onGridContainerReady == "function") try { - n.onGridContainerReady(L, { getState: () => s }); + n.onGridContainerReady(z, { getState: () => s }); } catch (e) { console.debug?.(e); } - else e._mjrGridContextMenuUnbind = Ra({ - gridContainer: L, + else e._mjrGridContextMenuUnbind = so({ + gridContainer: z, getState: () => s }); - let yt = R("search.findSimilar", "Find Similar"), bt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: xt, isAiEnabled: St } = Jg({ + let bt = L("search.findSimilar", "Find Similar"), xt = L("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: St, isAiEnabled: Ct } = w_({ container: e, state: s, - sidebar: et, - browseSection: Qe, - gridWrapper: $e, - similarBtn: Fe, - setSemanticEnabled: Ve, - similarEnabledTitle: yt, - similarDisabledTitle: bt, + sidebar: Ze, + browseSection: Ye, + gridWrapper: Xe, + similarBtn: Me, + setSemanticEnabled: ze, + similarEnabledTitle: bt, + similarDisabledTitle: xt, refreshGridFn: mt, isSidebarOpen: m, - readActiveAssetId: p, - getSidebarController: () => nt, + readActiveAssetId: f, + getSidebarController: () => $e, panelLifecycleAC: r }); - tt.appendChild(Je), tt.appendChild(Ne), tt.appendChild(Ke), tt.appendChild(We), tt.appendChild(Qe), e.appendChild(h); + Qe.appendChild(Ke), Qe.appendChild(Ae), Qe.appendChild(We), Qe.appendChild(He), Qe.appendChild(Ye), e.appendChild(h); try { e._mjrVersionUpdateCleanup?.(); } catch (e) { console.debug?.(e); } - e._mjrVersionUpdateCleanup = He || h._mjrVersionUpdateCleanup, e.appendChild(tt); - let Ct = () => mg(Pe), wt = hg({ - gridContainer: L, - loadAssets: ut, - loadAssetsFromList: dt, - getCollectionAssets: f, - disposeGrid: pt, - getQuery: Ct, - searchInputEl: Pe, + e._mjrVersionUpdateCleanup = Be || h._mjrVersionUpdateCleanup, e.appendChild(Qe); + let Tt = () => Wg(je), Et = Gg({ + gridContainer: z, + loadAssets: ct, + loadAssetsFromList: ut, + getCollectionAssets: k, + disposeGrid: ft, + getQuery: Tt, + searchInputEl: je, state: s - }), Tt = null, Dt = null, Ot = null, kt = null, At = null, jt = null, Mt = null, Nt = null, Pt = null, Ft = !1, It = (e) => !!e && String(e?.style?.display || "").toLowerCase() === "block", Lt = () => { + }), Dt = null, Ot = null, kt = null, At = null, Nt = null, Pt = null, Ft = null, It = null, Lt = null, Rt = !1, Bt = (e) => !!e && String(e?.style?.display || "").toLowerCase() === "block", Vt = () => { let e = [ [v, O], - [y, me], - [b, ge], - [x, _e], - [S, Se], - [Fe, Ie] + [y, de], + [b, pe], + [x, he], + [S, ye], + [Me, Ne] ]; for (let [t, n] of e) try { - t?.classList?.toggle?.("mjr-popover-open", It(n)), t?.setAttribute?.("aria-expanded", It(n) ? "true" : "false"); + t?.classList?.toggle?.("mjr-popover-open", Bt(n)), t?.setAttribute?.("aria-expanded", Bt(n) ? "true" : "false"); } catch (e) { console.debug?.(e); } try { - C?.classList?.toggle?.("mjr-popover-open", Ft), C?.setAttribute?.("aria-expanded", Ft ? "true" : "false"); + C?.classList?.toggle?.("mjr-popover-open", Rt), C?.setAttribute?.("aria-expanded", Rt ? "true" : "false"); } catch (e) { console.debug?.(e); } - }, Rt = () => { + }, Ht = () => { try { - Dt?.update?.(); + Ot?.update?.(); } catch (e) { console.debug?.(e); } try { - jt?.renderBreadcrumb?.(); + Pt?.renderBreadcrumb?.(); } catch (e) { console.debug?.(e); } - Lt(); + Vt(); }; - at || (Nt = Ug({ - gridContainer: L, + it || (It = y_({ + gridContainer: z, readSelectedAssetIds: d, - readActiveAssetId: () => p(), + readActiveAssetId: () => f(), writeSelectedAssetIds: (e) => u("selectedAssetIds", e), writeActiveAssetId: (e) => u("activeAssetId", e), onSelectionChanged: () => { - it(), Rt(); + rt(), Ht(); }, lifecycleSignal: r?.signal || null - })), jt = gg({ + })), Pt = Kg({ state: s, - gridContainer: L, - folderBreadcrumb: Ke, - folderBreadcrumbController: qe, + gridContainer: z, + folderBreadcrumb: We, + folderBreadcrumbController: Ge, customSelect: T, - reloadGrid: () => wt.reloadGrid(), + reloadGrid: () => Et.reloadGrid(), clearSelection: () => { try { - L?._mjrSetSelection?.([], ""); + z?._mjrSetSelection?.([], ""); } catch (e) { console.debug?.(e); } }, onContextChanged: () => { try { - Dt?.update?.(); + Ot?.update?.(); } catch (e) { console.debug?.(e); } @@ -17625,15 +18141,15 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { lifecycleSignal: r?.signal || null }); try { - Mt = jt.bindGridFolderNavigation(); + Ft = Pt.bindGridFolderNavigation(); } catch (e) { console.debug?.(e); } - let zt = async () => { + let Ut = async () => { let e = String(l("scope", s.scope || "output") || "output").toLowerCase(), t = String(l("customRootId", s.customRootId || "") || "").trim(); - if (e === "custom" && !t) Ot = null, Rt(); + if (e === "custom" && !t) kt = null, Ht(); else try { - let n = await A({ + let n = await tt({ scope: e, customRootId: t, maxGroups: 4, @@ -17641,27 +18157,27 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { }, { signal: r?.signal }); if (!n?.ok) return; let i = n.data || {}; - Ot = { + kt = { exactCount: Array.isArray(i.exact_groups) ? i.exact_groups.length : 0, similarCount: Array.isArray(i.similar_pairs) ? i.similar_pairs.length : 0, firstGroup: Array.isArray(i.exact_groups) ? i.exact_groups[0] : null, firstPair: Array.isArray(i.similar_pairs) ? i.similar_pairs[0] : null - }, Rt(); + }, Ht(); } catch (e) { console.debug?.(e); } - }, Bt = null; - Yg({ - gridContainer: L, + }, Wt = null; + T_({ + gridContainer: z, panelLifecycleAC: r, requestQueuedReload: () => { try { - Bt && clearTimeout(Bt); + Wt && clearTimeout(Wt); } catch (e) { console.debug?.(e); } - Bt = setTimeout(() => { - Bt = null, nn().catch((e) => { + Wt = setTimeout(() => { + Wt = null, an().catch((e) => { try { console.warn("[Majoor] queuedReload failed", e); } catch (e) { @@ -17670,108 +18186,108 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { }); }, 120); }, - notifyContextChanged: Rt, - markUserInteraction: it, + notifyContextChanged: Ht, + markUserInteraction: rt, writePanelValue: u, popovers: i, - collectionsPopover: ge, - gridController: wt, - registerSummaryDispose: ct + collectionsPopover: pe, + gridController: Et, + registerSummaryDispose: st }); - let Vt = xg({ + let Gt = Zg({ state: s, customSelect: T, customRemoveBtn: D, - comfyConfirm: Gt, - comfyPrompt: Et, - comfyToast: I, - get: le, - post: pe, - ENDPOINTS: lt, - reloadGrid: wt.reloadGrid, + comfyConfirm: jt, + comfyPrompt: wt, + comfyToast: F, + get: Pe, + post: me, + ENDPOINTS: p, + reloadGrid: Et.reloadGrid, onRootChanged: async () => { try { - jt?.resetHistory?.(); + Pt?.resetHistory?.(); } catch (e) { console.debug?.(e); } try { - await xt(s.scope); + await St(s.scope); } catch (e) { console.debug?.(e); } try { - await zt(); + await Ut(); } catch (e) { console.debug?.(e); } } - }), Ht = Vt.bind({ + }), Kt = Gt.bind({ customAddBtn: E, customRemoveBtn: D }); try { window.addEventListener("mjr:custom-roots-changed", async (e) => { let t = String(e?.detail?.preferredId || "").trim() || null; - await Vt.refreshCustomRoots(t); + await Gt.refreshCustomRoots(t); }, { signal: r?.signal }); } catch (e) { console.debug?.(e); } - let Wt = () => { + let qt = () => { try { - let e = L?._mjrGetAssets, t = L?._mjrSetSelection; + let e = z?._mjrGetAssets, t = z?._mjrSetSelection; if (typeof e != "function" || typeof t != "function") return; let n = (Array.isArray(e()) ? e() : []).map((e) => String(e?.id ?? "").trim()).filter(Boolean), r = d(), i = r.filter((e) => n.includes(e)), a = r.length - i.length; if (a <= 0) return; - let o = p(); - t(i, i.includes(o) ? o : i[0] || ""), I(R("toast.selectionPruned", "{count} items deselected - not visible in current view", { count: a }), "info", 2600, { noHistory: !0 }); + let o = f(); + t(i, i.includes(o) ? o : i[0] || ""), F(L("toast.selectionPruned", "{count} items deselected - not visible in current view", { count: a }), "info", 2600, { noHistory: !0 }); } catch (e) { console.debug?.(e); } }; - Tt = _g({ + Dt = qg({ state: s, tabButtons: g, customMenuBtn: _, customPopover: w, popovers: i, - refreshCustomRoots: Vt.refreshCustomRoots, - reloadGrid: wt.reloadGrid, - reconcileSelection: Wt, + refreshCustomRoots: Gt.refreshCustomRoots, + reloadGrid: Et.reloadGrid, + reconcileSelection: qt, onChanged: () => { try { - L && (L.dataset.mjrScope = String(l("scope", s.scope || "output") || "output")); + z && (z.dataset.mjrScope = String(l("scope", s.scope || "output") || "output")); } catch (e) { console.debug?.(e); } - Rt(); + Ht(); }, onScopeChanged: async () => { try { - await xt(String(l("scope", s.scope || "output") || "output")); + await St(String(l("scope", s.scope || "output") || "output")); } catch (e) { console.debug?.(e); } try { - await zt(); + await Ut(); } catch (e) { console.debug?.(e); } }, onBeforeReload: async () => { try { - L.dataset.mjrScope = l("scope", "output"), L.dataset.mjrCustomRootId = l("customRootId", "") || "", L.dataset.mjrSubfolder = l("currentFolderRelativePath", "") || "", L.dataset.mjrCollectionId = l("collectionId", "") || "", L.dataset.mjrViewScope = l("viewScope", "") || ""; + z.dataset.mjrScope = l("scope", "output"), z.dataset.mjrCustomRootId = l("customRootId", "") || "", z.dataset.mjrSubfolder = l("currentFolderRelativePath", "") || "", z.dataset.mjrCollectionId = l("collectionId", "") || "", z.dataset.mjrViewScope = l("viewScope", "") || ""; } catch (e) { console.debug?.(e); } try { - ft(L); + dt(z); } catch (e) { console.debug?.(e); } try { - await km(Ye, Xe, Ze, { + await ah(R, qe, Je, { scope: l("scope", s.scope || "output"), customRootId: l("customRootId", s.customRootId || "") }, null, { signal: r?.signal || null }); @@ -17780,212 +18296,212 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { } } }); - let Kt = async ({ reload: e = !1 } = {}) => { + let Jt = async ({ reload: e = !1 } = {}) => { try { if (String(l("viewScope", s.viewScope || "") || "").trim().toLowerCase() !== "similar") return; - await Tt?.clearSimilarScope?.({ reload: e }); + await Dt?.clearSimilarScope?.({ reload: e }); } catch (e) { console.debug?.(e); } }; Object.values(g).forEach((e) => { - e.addEventListener("click", () => Tt.setScope(e.dataset.scope), { signal: r?.signal }); - }), dg({ + e.addEventListener("click", () => Dt.setScope(e.dataset.scope), { signal: r?.signal }); + }), Vg({ messageBtn: S, - messagePopover: Se, - title: xe, - messageList: Ae, - historyTabBtn: Te, - historyTabBadge: Ee, - historyTabCount: De, - historyPanel: Oe, - shortcutsPanel: je, - messageTabBtn: Ce, - messageTabBadge: we, - shortcutsTabBtn: ke, - markReadBtn: Me, + messagePopover: ye, + title: ve, + messageList: De, + historyTabBtn: Se, + historyTabBadge: Ce, + historyTabCount: we, + historyPanel: Te, + shortcutsPanel: Oe, + messageTabBtn: be, + messageTabBadge: xe, + shortcutsTabBtn: Ee, + markReadBtn: ke, popovers: i, signal: r?.signal, onBeforeToggle: () => { - i.close(w), i.close(O), i.close(me), i.close(ge), i.close(_e); + i.close(w), i.close(O), i.close(de), i.close(pe), i.close(he); } }), i.setDismissWhitelist([ w, O, - me, - ge, - _e, - Se, - Ie, + de, + pe, + he, + ye, + Ne, _, v, y, b, x, S, - Fe - ]), i.setOnVisibilityChanged?.(() => Lt()); + Me + ]), i.setOnVisibilityChanged?.(() => Vt()); try { - window.addEventListener(qn, (e) => { - Ft = !!e?.detail?.open, Lt(); + window.addEventListener(zt, (e) => { + Rt = !!e?.detail?.open, Vt(); }, { signal: r?.signal }); } catch (e) { console.debug?.(e); } - Lt(), _.addEventListener("click", (e) => { - e.stopPropagation(), i.close(O), i.close(me), i.close(ge), i.close(Se), i.close(Ie), i.toggle(w, _); + Vt(), _.addEventListener("click", (e) => { + e.stopPropagation(), i.close(O), i.close(de), i.close(pe), i.close(ye), i.close(Ne), i.toggle(w, _); }, { signal: r?.signal }), v.addEventListener("click", (e) => { - e.stopPropagation(), i.close(w), i.close(me), i.close(ge), i.close(Se), i.close(Ie), i.toggle(O, v); + e.stopPropagation(), i.close(w), i.close(de), i.close(pe), i.close(ye), i.close(Ne), i.toggle(O, v); }, { signal: r?.signal }), b.addEventListener("click", (e) => { - e.stopPropagation(), i.close(w), i.close(O), i.close(me), i.close(Se), i.close(Ie), i.toggle(ge, b); + e.stopPropagation(), i.close(w), i.close(O), i.close(de), i.close(ye), i.close(Ne), i.toggle(pe, b); }, { signal: r?.signal }); - let qt = Ue ? null : Sg({ + let Yt = Ve ? null : Qg({ state: s, sortBtn: y, - sortMenu: he, - sortPopover: me, + sortMenu: fe, + sortPopover: de, popovers: i, - reloadGrid: wt.reloadGrid, - onChanged: () => Rt() + reloadGrid: Et.reloadGrid, + onChanged: () => Ht() }); - qt ? qt.bind({ onBeforeToggle: () => { - i.close(w), i.close(O), i.close(ge), i.close(Se), i.close(Ie); + Yt ? Yt.bind({ onBeforeToggle: () => { + i.close(w), i.close(O), i.close(pe), i.close(ye), i.close(Ne); } }) : y.addEventListener("click", (e) => { - e.stopPropagation(), i.close(w), i.close(O), i.close(ge), i.close(Se), i.close(Ie), i.toggle(me, y); - }, { signal: r?.signal }), t_({ - similarBtn: Fe, - similarPopover: Ie, - similarFindBtn: Le, - similarDuplicatesBtn: Re, - similarSameNodeBtn: ze, - similarSameWorkflowBtn: Be, - gridContainer: L, + e.stopPropagation(), i.close(w), i.close(O), i.close(pe), i.close(ye), i.close(Ne), i.toggle(de, y); + }, { signal: r?.signal }), j_({ + similarBtn: Me, + similarPopover: Ne, + similarFindBtn: Fe, + similarDuplicatesBtn: Ie, + similarSameNodeBtn: Le, + similarSameWorkflowBtn: Re, + gridContainer: z, state: s, panelLifecycleAC: r, - isAiEnabled: St, - similarDisabledTitle: bt, - readActiveAssetId: p, + isAiEnabled: Ct, + similarDisabledTitle: xt, + readActiveAssetId: f, readSelectedAssetIds: d, readPanelValue: l, writePanelValue: u, - scopeController: Tt, + scopeController: Dt, closePopovers: () => { - i.close(w), i.close(O), i.close(me), i.close(ge), i.close(Se), i.close(Ie); + i.close(w), i.close(O), i.close(de), i.close(pe), i.close(ye), i.close(Ne); }, closePeerPopovers: () => { - i.close(w), i.close(O), i.close(me), i.close(ge), i.close(Se), i.close(_e); + i.close(w), i.close(O), i.close(de), i.close(pe), i.close(ye), i.close(he); }, popovers: i, - workflowIdInput: N, - reloadGrid: () => wt.reloadGrid(), - getDuplicatesAlert: () => Ot - }), n_({ + workflowIdInput: M, + reloadGrid: () => Et.reloadGrid(), + getDuplicatesAlert: () => kt + }), M_({ pinnedFoldersBtn: x, - pinnedFoldersController: ye, - pinnedFoldersMenu: be, - pinnedFoldersPopover: _e, + pinnedFoldersController: ge, + pinnedFoldersMenu: _e, + pinnedFoldersPopover: he, popovers: i, closeOtherPopovers: () => { - i.close(w), i.close(O), i.close(me), i.close(ge), i.close(Se), i.close(Ie); + i.close(w), i.close(O), i.close(de), i.close(pe), i.close(ye), i.close(Ne); }, state: s, - gridContainer: L, + gridContainer: z, customSelect: T, - scopeController: Tt, - customRootsController: Vt, - gridController: wt, - applyWatcherForScope: xt, - refreshDuplicateAlerts: zt, - notifyContextChanged: Rt, + scopeController: Dt, + customRootsController: Gt, + gridController: Et, + applyWatcherForScope: St, + refreshDuplicateAlerts: Ut, + notifyContextChanged: Ht, panelLifecycleAC: r }); - let { agendaCalendar: Jt, disposeFilters: Yt } = g_({ + let { agendaCalendar: Xt, disposeFilters: Zt } = K_({ state: s, - hasVueHeaderSection: Ue, - kindSelect: k, - wfCheckbox: j, - workflowTypeSelect: M, - workflowIdInput: N, - workflowModelInput: ee, + hasVueHeaderSection: Ve, + kindSelect: A, + wfCheckbox: ee, + workflowTypeSelect: j, + workflowIdInput: M, + workflowModelInput: N, workflowRunsOnSelect: te, - ratingSelect: P, - minSizeInput: ne, + ratingSelect: ne, + minSizeInput: P, maxSizeInput: re, - resolutionPresetSelect: ie, - minWidthInput: ae, - minHeightInput: oe, - maxWidthInput: se, - maxHeightInput: ce, - dateRangeSelect: ue, - dateExactInput: de, - agendaContainer: fe, - gridController: wt, - reconcileVisibleSelection: Wt, - exitSimilarViewIfActive: Kt, - notifyContextChanged: Rt, + resolutionPresetSelect: I, + minWidthInput: ie, + minHeightInput: ae, + maxWidthInput: oe, + maxHeightInput: se, + dateRangeSelect: ce, + dateExactInput: le, + agendaContainer: ue, + gridController: Et, + reconcileVisibleSelection: qt, + exitSimilarViewIfActive: Jt, + notifyContextChanged: Ht, panelLifecycleAC: r, popovers: i, filterPopover: O - }), Zt = __({ + }), Qt = q_({ state: s, - scopeController: Tt, - browserNav: jt, - gridController: wt, - getDuplicatesAlert: () => Ot, - refreshDuplicateAlerts: zt + scopeController: Dt, + browserNav: Pt, + gridController: Et, + getDuplicatesAlert: () => kt, + refreshDuplicateAlerts: Ut }); try { - Dt = bg({ + Ot = Xg({ state: s, - gridContainer: L, + gridContainer: z, filterBtn: v, sortBtn: y, collectionsBtn: b, - searchInputEl: Pe, - kindSelect: k, - wfCheckbox: j, - workflowTypeSelect: M, - workflowIdInput: N, - workflowModelInput: ee, + searchInputEl: je, + kindSelect: A, + wfCheckbox: ee, + workflowTypeSelect: j, + workflowIdInput: M, + workflowModelInput: N, workflowRunsOnSelect: te, - ratingSelect: P, - minSizeInput: ne, + ratingSelect: ne, + minSizeInput: P, maxSizeInput: re, - minWidthInput: ae, - minHeightInput: oe, - maxWidthInput: se, - maxHeightInput: ce, - resolutionPresetSelect: ie, - dateRangeSelect: ue, - dateExactInput: de, - scopeController: Tt, - sortController: qt, - updateSummaryBar: Ge, - reloadGrid: () => wt.reloadGrid(), - getExtraContext: () => ({ duplicatesAlert: Ot }), - extraActions: Zt + minWidthInput: ie, + minHeightInput: ae, + maxWidthInput: oe, + maxHeightInput: se, + resolutionPresetSelect: I, + dateRangeSelect: ce, + dateExactInput: le, + scopeController: Dt, + sortController: Yt, + updateSummaryBar: Ue, + reloadGrid: () => Et.reloadGrid(), + getExtraContext: () => ({ duplicatesAlert: kt }), + extraActions: Qt }); } catch (e) { console.debug?.(e); } try { - if (Rt(), at) ct(n.bindGridHostState({ - onContextChanged: Rt, - markUserInteraction: it + if (Ht(), it) st(n.bindGridHostState({ + onContextChanged: Ht, + markUserInteraction: rt })); else { - let e = () => Rt(); - L.addEventListener("mjr:grid-stats", e, { signal: r?.signal }), window.addEventListener?.("mjr-settings-changed", e, { signal: r?.signal }); + let e = () => Ht(); + z.addEventListener("mjr:grid-stats", e, { signal: r?.signal }), window.addEventListener?.("mjr-settings-changed", e, { signal: r?.signal }); let t = null, n = null, i = () => { n && clearTimeout(n), n = setTimeout(() => { n = null, t && cancelAnimationFrame(t), t = requestAnimationFrame(() => { - t = null, Rt(); + t = null, Ht(); }); }, 250); }, a = new MutationObserver(() => i()); - a.observe(L, { childList: !0 }), L._mjrSummaryBarObserver = a, ct(() => { + a.observe(z, { childList: !0 }), z._mjrSummaryBarObserver = a, st(() => { try { - L.removeEventListener("mjr:grid-stats", e); + z.removeEventListener("mjr:grid-stats", e); } catch (e) { console.debug?.(e); } @@ -18009,51 +18525,51 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { } catch (e) { console.debug?.(e); } - nt = Bg({ - gridContainer: L, - sidebar: et, - createRatingBadge: _t, - createTagsBadge: Ut, - showAssetInSidebar: $m, - closeSidebar: eh, + $e = g_({ + gridContainer: z, + sidebar: Ze, + createRatingBadge: nn, + createTagsBadge: hn, + showAssetInSidebar: kh, + closeSidebar: Ah, state: s }); - let Qt = { - gridController: wt, + let $t = { + gridController: Et, captureAnchor: ht, - restoreAnchor: gt, - restoreGridUiState: at ? (e) => n.restoreGridUiState(e, { onRestoreSidebar: () => { + restoreAnchor: vt, + restoreGridUiState: it ? (e) => n.restoreGridUiState(e, { onRestoreSidebar: () => { try { - nt?.toggleDetails?.(); + $e?.toggleDetails?.(); } catch (e) { console.debug?.(e); } } }) : null, readScrollTop: () => c.read("scrollTop", s.scrollTop || 0), restoreSelectionState: ({ scrollTop: e } = {}) => { - Nt?.restoreSelectionState?.({ scrollTop: e }); + It?.restoreSelectionState?.({ scrollTop: e }); }, - readActiveAssetId: p, + readActiveAssetId: f, isSidebarOpen: m, toggleSidebarDetails: () => { - nt?.toggleDetails?.(); + $e?.toggleDetails?.(); }, - getQuery: Ct, + getQuery: Tt, getScope: () => c.read("scope", s.scope), - loadAssets: ut, + loadAssets: ct, lifecycleSignal: r?.signal || null }; - Pt = typeof n?.initAssetsQueryController == "function" ? n.initAssetsQueryController(Qt) : Kg({ - gridContainer: L, - gridWrapper: $e, - ...Qt + Lt = typeof n?.initAssetsQueryController == "function" ? n.initAssetsQueryController($t) : S_({ + gridContainer: z, + gridWrapper: Xe, + ...$t }); - let $t = Vg({ + let en = __({ onTriggerScan: (e) => { - xm(Ye, Xe, Ze, e || {}); + Zm(R, qe, Je, e || {}); }, onToggleDetails: () => { - nt?.toggleDetails?.(); + $e?.toggleDetails?.(); }, onToggleFloatingViewer: () => { try { @@ -18064,17 +18580,17 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { }, onFocusSearch: () => { try { - Pe?.focus?.(); - let e = Pe?.value?.length || 0; - Pe?.setSelectionRange?.(e, e); + je?.focus?.(); + let e = je?.value?.length || 0; + je?.setSelectionRange?.(e, e); } catch (e) { console.debug?.(e); } }, onClearSearch: () => { try { - if (!Pe) return; - u("searchQuery", ""), Pe.value = "", Pe.dispatchEvent?.(new Event("input", { bubbles: !0 })); + if (!je) return; + u("searchQuery", ""), je.value = "", je.dispatchEvent?.(new Event("input", { bubbles: !0 })); } catch (e) { console.debug?.(e); } @@ -18083,18 +18599,18 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { scope: c.read("scope", s.scope), customRootId: c.read("customRootId", s.customRootId) }) - }), en = Ga({ - gridContainer: L, - createRatingBadge: _t - }), tn = null; + }), tn = ho({ + gridContainer: z, + createRatingBadge: nn + }), rn = null; if (e._eventCleanup) try { e._eventCleanup(); } catch (e) { console.debug?.(e); } - $t.bind(tt), en.bind(), F("grid"); + en.bind(Qe), tn.bind(), lt("grid"); try { - e._mjrHotkeys = $t, e._mjrRatingHotkeys = en, e._mjrSidebarController = nt; + e._mjrHotkeys = en, e._mjrRatingHotkeys = tn, e._mjrSidebarController = $e; } catch (e) { console.debug?.(e); } @@ -18105,7 +18621,7 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { console.debug?.(e); } try { - Je?._mjrStatusPollDispose?.(); + Ke?._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); } @@ -18116,12 +18632,7 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { } e._mjrVersionUpdateCleanup = null; try { - z && clearTimeout(z), z = null; - } catch (e) { - console.debug?.(e); - } - try { - $t.dispose(); + et && clearTimeout(et), et = null; } catch (e) { console.debug?.(e); } @@ -18130,86 +18641,91 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { } catch (e) { console.debug?.(e); } - ve().scope === "grid" && F(null); try { - Jt?.dispose?.(); + tn.dispose(); + } catch (e) { + console.debug?.(e); + } + gt().scope === "grid" && lt(null); + try { + Xt?.dispose?.(); } catch (e) { console.debug?.(e); } try { - Yt?.(); + Zt?.(); } catch (e) { console.debug?.(e); } try { - tn?.(); + rn?.(); } catch (e) { console.debug?.(e); } - tn = null; + rn = null; try { - et?.dispose?.(); + Ze?.dispose?.(); } catch (e) { console.debug?.(e); } try { - nt?.dispose?.(); + $e?.dispose?.(); } catch (e) { console.debug?.(e); } try { - kt && clearInterval(kt), kt = null; + At && clearInterval(At), At = null; } catch (e) { console.debug?.(e); } try { - At && clearTimeout(At), At = null; + Nt && clearTimeout(Nt), Nt = null; } catch (e) { console.debug?.(e); } try { - Pt?.dispose?.(); + Lt?.dispose?.(); } catch (e) { console.debug?.(e); } - Pt = null; + Lt = null; try { - Nt?.dispose?.(); + It?.dispose?.(); } catch (e) { console.debug?.(e); } - Nt = null; + It = null; try { - L?._mjrSummaryBarDispose?.(); + z?._mjrSummaryBarDispose?.(); } catch (e) { console.debug?.(e); } try { - L?._mjrSummaryBarObserver?.disconnect?.(); + z?._mjrSummaryBarObserver?.disconnect?.(); } catch (e) { console.debug?.(e); } try { - L?._mjrGridContextMenuUnbind?.(); + z?._mjrGridContextMenuUnbind?.(); } catch (e) { console.debug?.(e); } try { - Ht?.(); + Kt?.(); } catch (e) { console.debug?.(e); } try { - Mt?.(); + Ft?.(); } catch (e) { console.debug?.(e); } try { - L && pt(L); + z && ft(z); } catch (e) { console.debug?.(e); } - Zn(L), L = null; + _t(z), z = null; try { i.dispose(); } catch (e) { @@ -18226,40 +18742,40 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { console.debug?.(e); } }; - let nn = async () => { - await Pt?.queuedReload?.(); + let an = async () => { + await Lt?.queuedReload?.(); }; - zm(Ye, Xe, Je, Ze, Pt?.createCountersUpdateHandler?.({ + hh(R, qe, Ke, Je, Lt?.createCountersUpdateHandler?.({ state: s, - getStableQuery: () => String(L?.dataset?.mjrQuery || "*").trim() || "*", - getRecentUserInteractionAt: () => Number(rt || 0) + getStableQuery: () => String(z?.dataset?.mjrQuery || "*").trim() || "*", + getRecentUserInteractionAt: () => Number(nt || 0) }) ?? (async () => { - await nn(); + await an(); }), () => ({ scope: c.read("scope", s.scope), customRootId: c.read("customRootId", s.customRootId) - })), Tt.setActiveTabStyles(), jt?.renderBreadcrumb?.(), Vt.refreshCustomRoots().catch(() => {}), tn = Pt?.bindSearchInput?.({ - searchInputEl: Pe, + })), Dt.setActiveTabStyles(), Pt?.renderBreadcrumb?.(), Gt.refreshCustomRoots().catch(() => {}), rn = Lt?.bindSearchInput?.({ + searchInputEl: je, lifecycleSignal: r?.signal || null, debounceMs: 120, onQueryChanged: () => { - Kt({ reload: !1 }), Rt(); + Jt({ reload: !1 }), Ht(); }, onBeforeReload: () => { - Kt({ reload: !1 }), Rt(); + Jt({ reload: !1 }), Ht(); }, startSearchTimer: () => { - Bp("searchQuery"); + _m("searchQuery"); }, reloadGrid: () => { - wt.reloadGrid(); + Et.reloadGrid(); } }); - let rn = !1; + let on = !1; try { - rn = await vt(L, { + on = await yt(z, { scope: l("scope", s.scope || "output") || "output", - query: String(mg(c.read("searchQuery", s.searchQuery || "*") || "*") || "*"), + query: String(Wg(c.read("searchQuery", s.searchQuery || "*") || "*") || "*"), customRootId: l("customRootId", s.customRootId || "") || "", subfolder: l("currentFolderRelativePath", s.currentFolderRelativePath || "") || "", collectionId: l("collectionId", s.collectionId || "") || "", @@ -18285,59 +18801,59 @@ async function y_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { } catch (e) { console.debug?.(e); } - let an = !1; + let sn = !1; try { - an = !!L?.querySelector?.(".mjr-asset-card"); + sn = !!z?.querySelector?.(".mjr-asset-card"); } catch (e) { console.debug?.(e); } - let on = Uf(), sn = !on && (rn || an) ? Promise.resolve({ + let cn = bp(), ln = !cn && (on || sn) ? Promise.resolve({ ok: !0, - hydrated: !!rn, - cached: !!an - }) : wt.reloadGrid({ - reason: on ? "pending-generated-assets" : "initial-load", - preserveVisibleUntilReady: !on + hydrated: !!on, + cached: !!sn + }) : Et.reloadGrid({ + reason: cn ? "pending-generated-assets" : "initial-load", + preserveVisibleUntilReady: !cn }); - if (rn) try { + if (on) try { setTimeout(() => { try { if (r?.signal?.aborted) return; } catch (e) { console.debug?.(e); } - wt.reloadGrid().catch(() => {}); + Et.reloadGrid().catch(() => {}); }, 200); } catch (e) { console.debug?.(e); } - zt().catch(() => {}); + Ut().catch(() => {}); try { - kt = setInterval(() => { + At = setInterval(() => { try { if (r?.signal?.aborted) return; } catch (e) { console.debug?.(e); } - zt().catch(() => {}); + Ut().catch(() => {}); }, 15e3); } catch (e) { console.debug?.(e); } - Pt?.restoreUiState?.(sn); + Lt?.restoreUiState?.(ln); try { window.__mjrLastAssetUpsert = 0, window.__mjrLastAssetUpsertCount = 0; } catch (e) { console.debug?.(e); } - return Kp(Vp("panelRender", "gridRender") ?? 0), { gridContainer: L }; + return Cm(vm("panelRender", "gridRender") ?? 0), { gridContainer: z }; } // ui/vue/components/status/StatusSection.vue -var b_ = /* @__PURE__ */ dr({ +var X_ = /* @__PURE__ */ tr({ __name: "StatusSection", setup(e, { expose: t }) { - let n = bm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); - return rr(() => { + let n = Xm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); + return ir(() => { try { n?._mjrStatusPollDispose?.(); } catch {} @@ -18348,28 +18864,28 @@ var b_ = /* @__PURE__ */ dr({ capabilitiesSection: a }), (e, t) => null; } -}), x_ = Cr({ +}), Z_ = hr({ open: !1, initial: null, resolve: null }); -function S_(e = {}) { - return x_.open = !0, x_.initial = e || {}, new Promise((e) => { - x_.resolve = e; +function Q_(e = {}) { + return Z_.open = !0, Z_.initial = e || {}, new Promise((e) => { + Z_.resolve = e; }); } -function C_(e = null) { - let t = x_.resolve; - x_.open = !1, x_.initial = null, x_.resolve = null, t && t(e); +function $_(e = null) { + let t = Z_.resolve; + Z_.open = !1, Z_.initial = null, Z_.resolve = null, t && t(e); } // ui/vue/components/panel/SimilarSearchPopover.vue?vue&type=script&setup=true&lang.ts -var w_ = { +var ev = { class: "mjr-popover mjr-similar-popover", style: { display: "none" } -}, T_ = { class: "mjr-menu mjr-similar-menu" }, E_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, D_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, O_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, k_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, A_ = /* @__PURE__ */ dr({ +}, tv = { class: "mjr-menu mjr-similar-menu" }, nv = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, rv = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, iv = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, av = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, ov = /* @__PURE__ */ tr({ __name: "SimilarSearchPopover", setup(e, { expose: t }) { - let n = Z(null), r = Z(null), i = Z(null), a = Z(null), o = (e) => e?.$el || e || null; + let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = (e) => e?.$el || e || null; return t({ get findSimilarBtn() { return o(n.value); @@ -18384,24 +18900,24 @@ var w_ = { return o(a.value); } }), (e, t) => { - let o = ar("MButton"); - return K(), Y("div", w_, [H("div", T_, [ - J(o, { + let o = Qn("MButton"); + return q(), Y("div", ev, [H("div", tv, [ + U(o, { ref_key: "findSimilarBtnRef", ref: n, type: "button", class: "mjr-menu-item", severity: "secondary", text: "", - title: X(R)("search.findSimilarWarning", "Find similar assets. This may be heavy on very large libraries.") + title: Z(L)("search.findSimilarWarning", "Find similar assets. This may be heavy on very large libraries.") }, { - default: U(() => [H("span", E_, [t[0] ||= H("i", { + default: G(() => [H("span", nv, [t[0] ||= H("i", { class: "pi pi-sparkles", "aria-hidden": "true" - }, null, -1), H("span", null, q(X(R)("search.findSimilar", "Find Similar")), 1)])]), + }, null, -1), H("span", null, J(Z(L)("search.findSimilar", "Find Similar")), 1)])]), _: 1 }, 8, ["title"]), - J(o, { + U(o, { ref_key: "findDuplicatesBtnRef", ref: r, type: "button", @@ -18409,14 +18925,14 @@ var w_ = { severity: "secondary", text: "" }, { - default: U(() => [H("span", D_, [t[1] ||= H("i", { + default: G(() => [H("span", rv, [t[1] ||= H("i", { class: "pi pi-clone", "aria-hidden": "true" - }, null, -1), H("span", null, q(X(R)("search.findDuplicates", "Find Duplicate")), 1)])]), + }, null, -1), H("span", null, J(Z(L)("search.findDuplicates", "Find Duplicate")), 1)])]), _: 1 }, 512), t[4] ||= H("div", { class: "mjr-menu-divider" }, null, -1), - J(o, { + U(o, { ref_key: "sameNodeBtnRef", ref: i, type: "button", @@ -18424,13 +18940,13 @@ var w_ = { severity: "secondary", text: "" }, { - default: U(() => [H("span", O_, [t[2] ||= H("i", { + default: G(() => [H("span", iv, [t[2] ||= H("i", { class: "pi pi-share-alt", "aria-hidden": "true" - }, null, -1), H("span", null, q(X(R)("search.generatedWithSameSaveNode", "Generated with same save node")), 1)])]), + }, null, -1), H("span", null, J(Z(L)("search.generatedWithSameSaveNode", "Generated with same save node")), 1)])]), _: 1 }, 512), - J(o, { + U(o, { ref_key: "sameWorkflowBtnRef", ref: a, type: "button", @@ -18438,20 +18954,20 @@ var w_ = { severity: "secondary", text: "" }, { - default: U(() => [H("span", k_, [t[3] ||= H("i", { + default: G(() => [H("span", av, [t[3] ||= H("i", { class: "pi pi-sitemap", "aria-hidden": "true" - }, null, -1), H("span", null, q(X(R)("search.generatedFromSameWorkflow", "Generated from same workflow")), 1)])]), + }, null, -1), H("span", null, J(Z(L)("search.generatedFromSameWorkflow", "Generated from same workflow")), 1)])]), _: 1 }, 512) ])]); }; } -}), j_ = { class: "mjr-am-search-pill" }, M_ = ["id"], N_ = { class: "mjr-am-search-tools" }, P_ = { class: "mjr-popover-anchor" }, F_ = { class: "mjr-popover-anchor" }, I_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", L_ = "AND", R_ = /* @__PURE__ */ dr({ +}), sv = { class: "mjr-am-search-pill" }, cv = ["id"], lv = { class: "mjr-am-search-tools" }, uv = { class: "mjr-popover-anchor" }, dv = { class: "mjr-popover-anchor" }, fv = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", pv = "AND", mv = /* @__PURE__ */ tr({ __name: "SearchBar", emits: ["search-change"], setup(e, { expose: t, emit: n }) { - let r = n, i = dh(), a = Z(null), o = Z(null), s = Z(null), c = Z(null), l = Z(null), u = Z(null), d = dt("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Z(!1), h = Z(!0), g = Z(L_), _ = null, v = null, y = G(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = G(() => m.value ? Ht(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), I_) : Ht(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), I_)), x = G(() => m.value ? { + let r = n, i = Vh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Ae("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, m = () => f(o.value), h = Q(!1), g = Q(!0), _ = Q(pv), v = null, y = null, b = K(() => h.value ? L("search.semanticPlaceholder", "Describe what you're looking for...") : L("search.placeholder", "Search assets...")), x = K(() => h.value ? Gt(L("search.semanticTitle", "AI semantic search — describe your image in natural language"), fv) : Gt(L("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), fv)), S = K(() => h.value ? { background: "rgba(0, 188, 212, 0.2)", borderColor: "rgba(0, 188, 212, 0.6)", color: "#00BCD4", @@ -18461,102 +18977,102 @@ var w_ = { borderColor: "rgba(0, 188, 212, 0.25)", color: "rgba(0, 188, 212, 0.5)", boxShadow: "none" - }), S = () => { + }), C = () => { try { - let e = p(); + let e = m(); if (!e) return; - e.dataset.mjrSemanticMode = m.value ? "1" : "0", e.dataset.mjrMetadataMode = g.value; + e.dataset.mjrSemanticMode = h.value ? "1" : "0", e.dataset.mjrMetadataMode = _.value; } catch (e) { console.debug?.(e); } - }, C = (e = {}) => { + }, w = (e = {}) => { r("search-change", { - query: p()?.value || "", - semantic: m.value, - metadataMode: g.value, + query: m()?.value || "", + semantic: h.value, + metadataMode: _.value, ...e }); - }, w = () => { - if (h.value) { - m.value = !m.value, S(); + }, T = () => { + if (g.value) { + h.value = !h.value, C(); try { - p()?.dispatchEvent?.(new Event("input", { bubbles: !0 })); + m()?.dispatchEvent?.(new Event("input", { bubbles: !0 })); } catch (e) { console.debug?.(e); } - C({ semantic: m.value }); + w({ semantic: h.value }); } - }, T = async (e) => { + }, E = async (e) => { let t = e.target?.value || ""; - i.searchQuery = t, i.metadataSearchMode = L_, S(), C({ query: t }), await j(); - }, E = (e) => { + i.searchQuery = t, i.metadataSearchMode = pv, C(), w({ query: t }), await j(); + }, D = (e) => { let t = String(e || "").split(/\s+/); return t[t.length - 1] || ""; }; - async function D() { - return _ || (v ||= le(lt.METADATA_KEYS, { limit: 600 }).then((e) => { + async function O() { + return v || (y ||= Pe(p.METADATA_KEYS, { limit: 600 }).then((e) => { let t = e?.data || {}; - return _ = t, t; - }), v); + return v = t, t; + }), y); } - function O(e, t) { + function k(e, t) { let n = String(e || "").match(/^(.*?)(\S*)$/); return `${n ? n[1] : ""}${t}`.trimStart(); } - function k(e, t) { - let n = E(e), r = n.replace(/^-/, ""), i = wn(); + function A(e, t) { + let n = D(e), r = n.replace(/^-/, ""), i = Pn(); if (!r.includes(":")) { let t = r.toLowerCase(); - return Object.keys(i).filter((e) => e.startsWith(t)).slice(0, 12).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${t}:`)); + return Object.keys(i).filter((e) => e.startsWith(t)).slice(0, 12).map((t) => k(e, `${n.startsWith("-") ? "-" : ""}${t}:`)); } let [a, o = ""] = r.split(/:(.*)/s); - if (!Ln(a)) return []; + if (!Rn(a)) return []; let s = o.toLowerCase(), c = Array.isArray(t?.keys) ? t.keys : [], l = t?.workflow_nodes || {}; - return [...c, ...Object.keys(l).flatMap((e) => (l[e] || []).map((t) => `workflow_nodes.${e}.${t}`))].filter((e) => String(e || "").toLowerCase().includes(s)).slice(0, 16).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${a}:${t}`)); + return [...c, ...Object.keys(l).flatMap((e) => (l[e] || []).map((t) => `workflow_nodes.${e}.${t}`))].filter((e) => String(e || "").toLowerCase().includes(s)).slice(0, 16).map((t) => k(e, `${n.startsWith("-") ? "-" : ""}${a}:${t}`)); } - let A = 0, j = Sn(async () => { - let e = (p()?.value || "").trim(); - if (m.value || e.length < 1) return; - let t = ++A; + let ee = 0, j = St(async () => { + let e = (m()?.value || "").trim(); + if (h.value || e.length < 1) return; + let t = ++ee; try { - let n = [], r = await D(); - if (n.push(...k(e, r)), !e.includes(":") && e.length >= 2) { - let t = await le("/mjr/am/autocomplete", { + let n = [], r = await O(); + if (n.push(...A(e, r)), !e.includes(":") && e.length >= 2) { + let t = await Pe("/mjr/am/autocomplete", { q: e, limit: 10 }); t && t.ok && Array.isArray(t.data) && n.push(...t.data); } - if (t !== A) return; + if (t !== ee) return; s.value && (s.value.innerHTML = "", [...new Set(n)].slice(0, 18).forEach((e) => { let t = document.createElement("option"); t.value = e, s.value.appendChild(t); })); } catch {} }, 300); - return cr(() => i.searchQuery, (e) => { - let t = p(); + return or(() => i.searchQuery, (e) => { + let t = m(); t && t.value !== e && (t.value = e); - }), cr(h, (e) => { - !e && m.value && (m.value = !1), S(); - }), cr(m, () => { - S(); - }), cr(() => i.metadataSearchMode, (e) => { - String(e || "").toUpperCase() !== L_ && (i.metadataSearchMode = L_), g.value !== L_ && (g.value = L_), S(); - }), Ar(() => { + }), or(g, (e) => { + !e && h.value && (h.value = !1), C(); + }), or(h, () => { + C(); + }), or(() => i.metadataSearchMode, (e) => { + String(e || "").toUpperCase() !== pv && (i.metadataSearchMode = pv), _.value !== pv && (_.value = pv), C(); + }), Zn(() => { try { - let e = p(); - e && (e.value = i.searchQuery || ""), i.metadataSearchMode = L_; + let e = m(); + e && (e.value = i.searchQuery || ""), i.metadataSearchMode = pv; } catch (e) { console.debug?.(e); } - S(); + C(); }), t({ get searchSection() { return a.value; }, get searchInputEl() { - return p(); + return m(); }, get similarBtn() { return f(c.value); @@ -18580,26 +19096,26 @@ var w_ = { return f(u.value); }, setSemanticEnabled: (e) => { - h.value = !!e, S(); + g.value = !!e, C(); } }), (e, t) => { - let n = ar("MInputText"), r = ar("MButton"); - return K(), Y("div", { + let n = Qn("MInputText"), r = Qn("MButton"); + return q(), Y("div", { ref_key: "searchSectionRef", ref: a, class: "mjr-am-search" - }, [H("div", j_, [ + }, [H("div", sv, [ t[0] ||= H("span", { class: "mjr-am-search-icon" }, [H("i", { class: "pi pi-search" })], -1), - J(n, { + U(n, { ref_key: "searchInputRef", ref: o, id: "mjr-search-input", class: "mjr-input", type: "text", - placeholder: y.value, - title: b.value, - list: X(d), - onInput: T + placeholder: b.value, + title: x.value, + list: Z(d), + onInput: E }, null, 8, [ "placeholder", "title", @@ -18608,10 +19124,10 @@ var w_ = { H("datalist", { ref_key: "dataListRef", ref: s, - id: X(d) - }, null, 8, M_) - ]), H("div", N_, [ - H("div", P_, [J(r, { + id: Z(d) + }, null, 8, cv) + ]), H("div", lv, [ + H("div", uv, [U(r, { ref_key: "semanticBtnRef", ref: u, type: "button", @@ -18619,13 +19135,13 @@ var w_ = { severity: "secondary", text: "", rounded: "", - disabled: !h.value, - "aria-disabled": !h.value, - title: h.value ? X(R)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : X(R)("search.semanticDisabled", "AI semantic search is disabled in settings"), - style: xr(x.value), - onClick: w + disabled: !g.value, + "aria-disabled": !g.value, + title: g.value ? Z(L)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : Z(L)("search.semanticDisabled", "AI semantic search is disabled in settings"), + style: fr(S.value), + onClick: T }, { - default: U(() => [...t[1] ||= [H("i", { class: "pi pi-sparkles" }, null, -1)]]), + default: G(() => [...t[1] ||= [H("i", { class: "pi pi-sparkles" }, null, -1)]]), _: 1 }, 8, [ "disabled", @@ -18633,7 +19149,7 @@ var w_ = { "title", "style" ])]), - H("div", F_, [J(r, { + H("div", dv, [U(r, { ref_key: "similarBtnRef", ref: c, type: "button", @@ -18641,11 +19157,11 @@ var w_ = { severity: "secondary", text: "", rounded: "", - title: X(R)("search.findSimilar", "Find Similar") + title: Z(L)("search.findSimilar", "Find Similar") }, { - default: U(() => [...t[2] ||= [H("i", { class: "pi pi-search" }, null, -1)]]), + default: G(() => [...t[2] ||= [H("i", { class: "pi pi-search" }, null, -1)]]), _: 1 - }, 8, ["title"]), J(A_, { + }, 8, ["title"]), U(ov, { ref_key: "similarPopoverRef", ref: l }, null, 512)]), @@ -18656,53 +19172,53 @@ var w_ = { ])], 512); }; } -}), z_ = { +}), hv = { class: "mjr-popover mjr-sort-popover", style: { display: "none" } -}, B_ = { class: "mjr-menu-item-label" }, V_ = /* @__PURE__ */ dr({ +}, gv = { class: "mjr-menu-item-label" }, _v = /* @__PURE__ */ tr({ __name: "SortPopover", setup(e) { - let t = dh(), n = G(() => t.sort || "mtime_desc"), r = (e) => { + let t = Vh(), n = K(() => t.sort || "mtime_desc"), r = (e) => { t.sort = e; try { window.dispatchEvent(new CustomEvent("mjr:sort-changed", { detail: { sort: e } })); } catch (e) { console.debug?.(e); } - }, i = G(() => [ + }, i = K(() => [ { key: "mtime_desc", - label: R("sort.newest"), + label: L("sort.newest"), icon: "pi pi-sort-amount-down" }, { key: "mtime_asc", - label: R("sort.oldest"), + label: L("sort.oldest"), icon: "pi pi-sort-amount-up-alt" }, { key: "name_asc", - label: R("sort.nameAZ"), + label: L("sort.nameAZ"), icon: "pi pi-sort-alpha-down" }, { key: "name_desc", - label: R("sort.nameZA"), + label: L("sort.nameZA"), icon: "pi pi-sort-alpha-up" }, { key: "rating_desc", - label: R("sort.ratingHigh"), + label: L("sort.ratingHigh"), icon: "pi pi-star-fill" }, { key: "size_desc", - label: R("sort.sizeDesc"), + label: L("sort.sizeDesc"), icon: "pi pi-sort-numeric-down-alt" }, { key: "size_asc", - label: R("sort.sizeAsc"), + label: L("sort.sizeAsc"), icon: "pi pi-sort-numeric-up-alt" } ].map((e) => ({ @@ -18711,66 +19227,66 @@ var w_ = { command: () => r(e.key) }))); return (e, t) => { - let r = ar("MMenu"); - return K(), Y("div", z_, [J(r, { + let r = Qn("MMenu"); + return q(), Y("div", hv, [U(r, { model: i.value, class: "mjr-menu mjr-prime-menu mjr-sort-menu", pt: { list: { class: "mjr-menu mjr-prime-menu-list" } } }, { - item: U(({ item: e }) => [H("div", { class: Q(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [H("span", B_, q(e.label), 1), H("i", { - class: Q([e.icon, "mjr-menu-item-check"]), - style: xr({ opacity: +(n.value === e.key) }) + item: G(({ item: e }) => [H("div", { class: X(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [H("span", gv, J(e.label), 1), H("i", { + class: X([e.icon, "mjr-menu-item-check"]), + style: fr({ opacity: +(n.value === e.key) }) }, null, 6)], 2)]), _: 1 }, 8, ["model"])]); }; } -}), H_ = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, U_ = { class: "mjr-filter-head" }, W_ = { class: "mjr-filter-head-left" }, G_ = { class: "mjr-filter-kicker" }, K_ = { class: "mjr-filter-subtitle" }, q_ = { class: "mjr-filter-head-actions" }, J_ = { class: "mjr-filter-active-count" }, Y_ = { class: "mjr-filter-group-title" }, X_ = { +}), vv = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, yv = { class: "mjr-filter-head" }, bv = { class: "mjr-filter-head-left" }, xv = { class: "mjr-filter-kicker" }, Sv = { class: "mjr-filter-subtitle" }, Cv = { class: "mjr-filter-head-actions" }, wv = { class: "mjr-filter-active-count" }, Tv = { class: "mjr-filter-group-title" }, Ev = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Z_ = { class: "mjr-filter-group-body" }, Q_ = { class: "mjr-filter-card" }, $_ = { class: "mjr-popover-row" }, ev = { class: "mjr-popover-label" }, tv = { class: "mjr-popover-row" }, nv = { class: "mjr-popover-label" }, rv = ["title"], iv = { class: "mjr-filter-card" }, av = { class: "mjr-popover-row" }, ov = { class: "mjr-popover-label" }, sv = { class: "mjr-popover-row" }, cv = { class: "mjr-popover-label" }, lv = { class: "mjr-popover-row" }, uv = { class: "mjr-popover-label" }, dv = { class: "mjr-filter-stack" }, fv = { class: "mjr-popover-row" }, pv = { class: "mjr-popover-label" }, mv = { class: "mjr-popover-row" }, hv = { class: "mjr-popover-label" }, gv = { class: "mjr-filter-group-title" }, _v = { +}, Dv = { class: "mjr-filter-group-body" }, Ov = { class: "mjr-filter-card" }, kv = { class: "mjr-popover-row" }, Av = { class: "mjr-popover-label" }, jv = { class: "mjr-popover-row" }, Mv = { class: "mjr-popover-label" }, Nv = ["title"], Pv = { class: "mjr-filter-card" }, Fv = { class: "mjr-popover-row" }, Iv = { class: "mjr-popover-label" }, Lv = { class: "mjr-popover-row" }, Rv = { class: "mjr-popover-label" }, zv = { class: "mjr-popover-row" }, Bv = { class: "mjr-popover-label" }, Vv = { class: "mjr-filter-stack" }, Hv = { class: "mjr-popover-row" }, Uv = { class: "mjr-popover-label" }, Wv = { class: "mjr-popover-row" }, Gv = { class: "mjr-popover-label" }, Kv = { class: "mjr-filter-group-title" }, qv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, vv = { class: "mjr-filter-group-body" }, yv = { class: "mjr-filter-card" }, bv = { class: "mjr-popover-row mjr-popover-row--3col" }, xv = { class: "mjr-popover-label" }, Sv = { class: "mjr-popover-row" }, Cv = { class: "mjr-popover-label" }, wv = { class: "mjr-popover-row mjr-popover-row--3col" }, Tv = { class: "mjr-popover-label" }, Ev = { class: "mjr-popover-row mjr-popover-row--3col" }, Dv = { class: "mjr-popover-label" }, Ov = { class: "mjr-filter-group-title" }, kv = { +}, Jv = { class: "mjr-filter-group-body" }, Yv = { class: "mjr-filter-card" }, Xv = { class: "mjr-popover-row mjr-popover-row--3col" }, Zv = { class: "mjr-popover-label" }, Qv = { class: "mjr-popover-row" }, $v = { class: "mjr-popover-label" }, ey = { class: "mjr-popover-row mjr-popover-row--3col" }, ty = { class: "mjr-popover-label" }, ny = { class: "mjr-popover-row mjr-popover-row--3col" }, ry = { class: "mjr-popover-label" }, iy = { class: "mjr-filter-group-title" }, ay = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Av = { class: "mjr-filter-group-body" }, jv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Mv = { class: "mjr-popover-row" }, Nv = { class: "mjr-popover-label" }, Pv = { class: "mjr-popover-row" }, Fv = { class: "mjr-popover-label" }, Iv = /* @__PURE__ */ dr({ +}, oy = { class: "mjr-filter-group-body" }, sy = { class: "mjr-filter-card mjr-filter-card--agenda" }, cy = { class: "mjr-popover-row" }, ly = { class: "mjr-popover-label" }, uy = { class: "mjr-popover-row" }, dy = { class: "mjr-popover-label" }, fy = /* @__PURE__ */ tr({ __name: "FilterPopover", setup(e, { expose: t }) { - let n = dh(), i = Z(null), a = Z(null), o = Z(null), s = Z(null), c = Z(null), l = Z(null), u = Z(null), d = Z(null), f = Z(null), p = Z(null), m = Z([{ - label: R("filter.any", "Any"), + let n = Vh(), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = Q([{ + label: L("filter.any", "Any"), value: "" - }]), h = (e) => e?.$el || e || null, g = (e) => h(e.value)?.value || "", _ = (e, t) => { - let n = h(e.value); + }]), m = (e) => e?.$el || e || null, h = (e) => m(e.value)?.value || "", g = (e, t) => { + let n = m(e.value); n && (n.value = String(t ?? "")); - }, v = Z({ + }, _ = Q({ core: !0, media: !1, time: !0 - }), y = G(() => [ + }), v = K(() => [ { - label: R("filter.all"), + label: L("filter.all"), value: "" }, { - label: R("filter.images", "Images"), + label: L("filter.images", "Images"), value: "image" }, { - label: R("filter.videos", "Videos"), + label: L("filter.videos", "Videos"), value: "video" }, { - label: R("filter.audio", "Audio"), + label: L("filter.audio", "Audio"), value: "audio" }, { label: "3D", value: "model3d" } - ]), b = G(() => [ + ]), y = K(() => [ { - label: R("filter.any", "Any"), + label: L("filter.any", "Any"), value: "" }, { @@ -18813,9 +19329,9 @@ var w_ = { label: "A2A (Audio to Audio)", value: "A2A" } - ]), x = G(() => [ + ]), b = K(() => [ { - label: R("filter.any", "Any"), + label: L("filter.any", "Any"), value: "" }, { @@ -18834,13 +19350,13 @@ var w_ = { label: "Unknown", value: "unknown" } - ]), S = G(() => { - let e = Array.isArray(m.value) ? m.value.slice() : [{ - label: R("filter.any", "Any"), + ]), x = K(() => { + let e = Array.isArray(p.value) ? p.value.slice() : [{ + label: L("filter.any", "Any"), value: "" }]; e.length && String(e[0]?.value || "") === "" || e.unshift({ - label: R("filter.any", "Any"), + label: L("filter.any", "Any"), value: "" }); let t = String(n.workflowModelFilter || "").trim(); @@ -18848,9 +19364,9 @@ var w_ = { label: t, value: t }), e; - }), C = G(() => [ + }), S = K(() => [ { - label: R("filter.anyRating"), + label: L("filter.anyRating"), value: "0" }, { @@ -18873,9 +19389,9 @@ var w_ = { label: "★ 5", value: "5" } - ]), w = G(() => [ + ]), C = K(() => [ { - label: R("filter.any", "Any"), + label: L("filter.any", "Any"), value: "" }, { @@ -18894,101 +19410,101 @@ var w_ = { label: "4K (3840x2160)", value: "uhd" } - ]), T = G(() => [ + ]), w = K(() => [ { - label: R("filter.anytime"), + label: L("filter.anytime"), value: "" }, { - label: R("filter.today"), + label: L("filter.today"), value: "today" }, { - label: R("filter.thisWeek"), + label: L("filter.thisWeek"), value: "this_week" }, { - label: R("filter.thisMonth"), + label: L("filter.thisMonth"), value: "this_month" } - ]), E = G(() => { + ]), T = K(() => { let e = Number(n.minWidth || 0) || 0, t = Number(n.minHeight || 0) || 0; return e >= 3840 && t >= 2160 ? "uhd" : e >= 2560 && t >= 1440 ? "qhd" : e >= 1920 && t >= 1080 ? "fhd" : e >= 1280 && t >= 720 ? "hd" : ""; - }), D = G(() => { + }), E = K(() => { let e = String(n.dateExactFilter || "").trim().length > 0; return { "mjr-agenda-filled": e, "mjr-agenda-empty": !e }; - }), O = (e) => { + }), D = (e) => { let t = String(e ?? "").trim(); if (!t) return 0; let n = t.replace(",", "."), r = Number(n); return Number.isFinite(r) ? r : 0; - }, k = () => { + }, O = () => { try { window.dispatchEvent(new CustomEvent("mjr:filters-changed")); } catch (e) { console.debug?.(e); } - }, A = async () => { + }, k = async () => { try { - let e = await r(); + let e = await Me(); if (!e?.ok) return; let t = (Array.isArray(e.data?.model_families) ? e.data.model_families : []).map((e) => ({ label: String(e?.label || e?.value || "").trim(), value: String(e?.value || e?.label || "").trim() })).filter((e) => e.value).slice(0, 200); - m.value = [{ - label: R("filter.any", "Any"), + p.value = [{ + label: L("filter.any", "Any"), value: "" }, ...t]; } catch (e) { console.debug?.(e); } }; - Ar(() => { - A(); + Zn(() => { + k(); }); - let j = (e, { emit: t = !0 } = {}) => { - n.kindFilter = String(e || ""), t && k(); - }, M = (e, { emit: t = !0 } = {}) => { - n.workflowOnly = !!e, t && k(); - }, N = (e, { emit: t = !0 } = {}) => { - n.workflowType = String(e || "").trim().toUpperCase(), t && k(); + let A = (e, { emit: t = !0 } = {}) => { + n.kindFilter = String(e || ""), t && O(); }, ee = (e, { emit: t = !0 } = {}) => { - n.workflowId = String(e || "").trim(), t && k(); + n.workflowOnly = !!e, t && O(); + }, j = (e, { emit: t = !0 } = {}) => { + n.workflowType = String(e || "").trim().toUpperCase(), t && O(); + }, M = (e, { emit: t = !0 } = {}) => { + n.workflowId = String(e || "").trim(), t && O(); + }, N = (e, { emit: t = !0 } = {}) => { + n.workflowModelFilter = String(e || "").trim(), t && O(); }, te = (e, { emit: t = !0 } = {}) => { - n.workflowModelFilter = String(e || "").trim(), t && k(); - }, P = (e, { emit: t = !0 } = {}) => { - n.workflowRunsOnFilter = String(e || "").trim().toLowerCase(), t && k(); + n.workflowRunsOnFilter = String(e || "").trim().toLowerCase(), t && O(); }, ne = (e, { emit: t = !0 } = {}) => { - n.minRating = Number(e || 0) || 0, t && k(); - }, F = () => { - let e = O(g(i) || 0), t = O(g(a) || 0); - t > 0 && e > 0 && t < e && (t = e, _(a, t)), n.minSizeMB = e > 0 ? e : 0, n.maxSizeMB = t > 0 ? t : 0, k(); + n.minRating = Number(e || 0) || 0, t && O(); + }, P = () => { + let e = D(h(r) || 0), t = D(h(i) || 0); + t > 0 && e > 0 && t < e && (t = e, g(i, t)), n.minSizeMB = e > 0 ? e : 0, n.maxSizeMB = t > 0 ? t : 0, O(); }, re = () => { - let e = Math.max(0, Math.round(O(g(o) || 0))), t = Math.max(0, Math.round(O(g(s) || 0))), r = Math.max(0, Math.round(O(g(c) || 0))), i = Math.max(0, Math.round(O(g(l) || 0))); - r > 0 && e > 0 && r < e && (r = e, _(c, r)), i > 0 && t > 0 && i < t && (i = t, _(l, i)), n.minWidth = e, n.minHeight = t, n.maxWidth = r, n.maxHeight = i, k(); - }, ie = (e, { emit: t = !0 } = {}) => { + let e = Math.max(0, Math.round(D(h(a) || 0))), t = Math.max(0, Math.round(D(h(o) || 0))), r = Math.max(0, Math.round(D(h(s) || 0))), i = Math.max(0, Math.round(D(h(c) || 0))); + r > 0 && e > 0 && r < e && (r = e, g(s, r)), i > 0 && t > 0 && i < t && (i = t, g(c, i)), n.minWidth = e, n.minHeight = t, n.maxWidth = r, n.maxHeight = i, O(); + }, F = (e, { emit: t = !0 } = {}) => { let [r, i] = { hd: [1280, 720], fhd: [1920, 1080], qhd: [2560, 1440], uhd: [3840, 2160] }[String(e || "").trim()] || [0, 0]; - n.minWidth = Number(r || 0), n.minHeight = Number(i || 0), n.maxWidth = 0, n.maxHeight = 0, _(o, n.minWidth || ""), _(s, n.minHeight || ""), _(c, ""), _(l, ""), t && k(); - }, ae = (e, { emit: t = !0 } = {}) => { - n.dateRangeFilter = String(e || ""), n.dateRangeFilter && n.dateExactFilter && (n.dateExactFilter = "", _(d, "")), t && k(); - }, I = (e) => { - n.dateExactFilter = String(e?.target?.value || "").trim(), n.dateExactFilter && n.dateRangeFilter && (n.dateRangeFilter = ""), k(); - }, oe = (e) => { + n.minWidth = Number(r || 0), n.minHeight = Number(i || 0), n.maxWidth = 0, n.maxHeight = 0, g(a, n.minWidth || ""), g(o, n.minHeight || ""), g(s, ""), g(c, ""), t && O(); + }, I = (e, { emit: t = !0 } = {}) => { + n.dateRangeFilter = String(e || ""), n.dateRangeFilter && n.dateExactFilter && (n.dateExactFilter = "", g(u, "")), t && O(); + }, ie = (e) => { + n.dateExactFilter = String(e?.target?.value || "").trim(), n.dateExactFilter && n.dateRangeFilter && (n.dateRangeFilter = ""), O(); + }, ae = (e) => { let t = String(e || "").trim().toLowerCase(); - t && t in v.value && (v.value = { - ...v.value, - [t]: !v.value[t] + t && t in _.value && (_.value = { + ..._.value, + [t]: !_.value[t] }); - }, se = (e) => !!v.value[String(e || "").trim().toLowerCase()], ce = ({ getValue: e, setValue: t }) => ({ + }, oe = (e) => !!_.value[String(e || "").trim().toLowerCase()], se = ({ getValue: e, setValue: t }) => ({ get value() { return e(); }, @@ -19000,7 +19516,7 @@ var w_ = { dispatchEvent() { return !0; } - }), le = ({ getChecked: e, setChecked: t }) => ({ + }), ce = ({ getChecked: e, setChecked: t }) => ({ get checked() { return e(); }, @@ -19012,195 +19528,195 @@ var w_ = { dispatchEvent() { return !0; } - }), ue = ce({ + }), le = se({ getValue: () => String(n.kindFilter || ""), - setValue: j - }), de = le({ + setValue: A + }), ue = ce({ getChecked: () => !!n.workflowOnly, - setChecked: M - }), fe = ce({ + setChecked: ee + }), de = se({ getValue: () => String(n.workflowType || "").trim().toUpperCase(), - setValue: N - }), pe = ce({ + setValue: j + }), fe = se({ getValue: () => String(n.workflowId || "").trim(), - setValue: ee - }), me = ce({ + setValue: M + }), pe = se({ getValue: () => String(n.workflowModelFilter || "").trim(), - setValue: te - }), he = ce({ + setValue: N + }), me = se({ getValue: () => String(n.workflowRunsOnFilter || "").trim().toLowerCase(), - setValue: P - }), ge = ce({ + setValue: te + }), he = se({ getValue: () => String(Number(n.minRating || 0) || 0), setValue: ne - }), _e = ce({ - getValue: () => E.value, - setValue: ie - }), ve = ce({ + }), ge = se({ + getValue: () => T.value, + setValue: F + }), _e = se({ getValue: () => String(n.dateRangeFilter || ""), - setValue: ae - }), ye = G(() => { + setValue: I + }), ve = K(() => { let e = 0; return String(n.kindFilter || "").trim() && (e += 1), n.workflowOnly && (e += 1), String(n.workflowType || "").trim() && (e += 1), String(n.workflowId || "").trim() && (e += 1), String(n.workflowModelFilter || "").trim() && (e += 1), String(n.workflowRunsOnFilter || "").trim() && (e += 1), (Number(n.minRating || 0) || 0) > 0 && (e += 1), ((Number(n.minSizeMB || 0) || 0) > 0 || (Number(n.maxSizeMB || 0) || 0) > 0) && (e += 1), ((Number(n.minWidth || 0) || 0) > 0 || (Number(n.minHeight || 0) || 0) > 0 || (Number(n.maxWidth || 0) || 0) > 0 || (Number(n.maxHeight || 0) || 0) > 0) && (e += 1), String(n.dateRangeFilter || "").trim() && (e += 1), String(n.dateExactFilter || "").trim() && (e += 1), e; - }), be = () => { - n.kindFilter = "", n.workflowOnly = !1, n.workflowType = "", n.workflowId = "", n.workflowModelFilter = "", n.workflowRunsOnFilter = "", n.minRating = 0, n.minSizeMB = 0, n.maxSizeMB = 0, n.minWidth = 0, n.minHeight = 0, n.maxWidth = 0, n.maxHeight = 0, n.dateRangeFilter = "", n.dateExactFilter = "", _(i, ""), _(a, ""), _(o, ""), _(s, ""), _(c, ""), _(l, ""), _(d, ""), _(f, ""), _(p, ""), k(); + }), ye = () => { + n.kindFilter = "", n.workflowOnly = !1, n.workflowType = "", n.workflowId = "", n.workflowModelFilter = "", n.workflowRunsOnFilter = "", n.minRating = 0, n.minSizeMB = 0, n.maxSizeMB = 0, n.minWidth = 0, n.minHeight = 0, n.maxWidth = 0, n.maxHeight = 0, n.dateRangeFilter = "", n.dateExactFilter = "", g(r, ""), g(i, ""), g(a, ""), g(o, ""), g(s, ""), g(c, ""), g(u, ""), g(d, ""), g(f, ""), O(); }; return t({ get kindSelect() { - return ue; + return le; }, get wfCheckbox() { - return de; + return ue; }, get workflowTypeSelect() { - return fe; + return de; }, get workflowIdInput() { - return pe; + return fe; }, get workflowModelInput() { - return me; + return pe; }, get workflowModelFamilyOptions() { - return S.value; + return x.value; }, get workflowRunsOnSelect() { - return he; + return me; }, get ratingSelect() { - return ge; + return he; }, get minSizeInput() { - return h(i.value); + return m(r.value); }, get maxSizeInput() { - return h(a.value); + return m(i.value); }, get resolutionPresetSelect() { - return _e; + return ge; }, get minWidthInput() { - return h(o.value); + return m(a.value); }, get minHeightInput() { - return h(s.value); + return m(o.value); }, get maxWidthInput() { - return h(c.value); + return m(s.value); }, get maxHeightInput() { - return h(l.value); + return m(c.value); }, get dateRangeSelect() { - return ve; + return _e; }, get dateExactInput() { - return h(d.value); + return m(u.value); }, get agendaContainer() { - return u.value; + return l.value; } }), (e, t) => { - let r = ar("MButton"), m = ar("MSelect"), h = ar("MCheckbox"), g = ar("MInputText"); - return K(), Y("div", H_, [ - H("div", U_, [H("div", W_, [H("div", G_, q(X(R)("label.filters", "Filters")), 1), H("div", K_, q(X(R)("label.refineResults", "Refine your results")), 1)]), H("div", q_, [H("span", J_, q(ye.value), 1), J(r, { + let p = Qn("MButton"), m = Qn("MSelect"), h = Qn("MCheckbox"), g = Qn("MInputText"); + return q(), Y("div", vv, [ + H("div", yv, [H("div", bv, [H("div", xv, J(Z(L)("label.filters", "Filters")), 1), H("div", Sv, J(Z(L)("label.refineResults", "Refine your results")), 1)]), H("div", Cv, [H("span", wv, J(ve.value), 1), U(p, { type: "button", class: "mjr-filter-clear-all", severity: "secondary", text: "", - disabled: ye.value === 0, - onClick: be + disabled: ve.value === 0, + onClick: ye }, { - default: U(() => [nr(q(X(R)("action.clearAll", "Clear all")), 1)]), + default: G(() => [pr(J(Z(L)("action.clearAll", "Clear all")), 1)]), _: 1 }, 8, ["disabled"])])]), - H("div", { class: Q(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [J(r, { + H("div", { class: X(["mjr-filter-group mjr-filter-group--core", { "is-open": oe("core") }]) }, [U(p, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", - "aria-expanded": String(se("core")), - onClick: t[0] ||= (e) => oe("core") + "aria-expanded": String(oe("core")), + onClick: t[0] ||= (e) => ae("core") }, { - default: U(() => [H("span", Y_, q(X(R)("group.core", "Core")), 1), H("span", X_, q(se("core") ? "▾" : "▸"), 1)]), + default: G(() => [H("span", Tv, J(Z(L)("group.core", "Core")), 1), H("span", Ev, J(oe("core") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), _r(H("div", Z_, [H("div", Q_, [H("div", $_, [H("div", ev, q(X(R)("label.type")), 1), J(m, { + }, 8, ["aria-expanded"]), Kn(H("div", Dv, [H("div", Ov, [H("div", kv, [H("div", Av, J(Z(L)("label.type")), 1), U(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - title: X(R)("tooltip.filterByFileType", "Filter by file type"), - "model-value": String(X(n).kindFilter || ""), - options: y.value, + title: Z(L)("tooltip.filterByFileType", "Filter by file type"), + "model-value": String(Z(n).kindFilter || ""), + options: v.value, "option-label": "label", "option-value": "value", - "onUpdate:modelValue": j + "onUpdate:modelValue": A }, null, 8, [ "title", "model-value", "options" - ])]), H("div", tv, [H("div", nv, q(X(R)("label.workflow")), 1), H("label", { + ])]), H("div", jv, [H("div", Mv, J(Z(L)("label.workflow")), 1), H("label", { class: "mjr-popover-toggle", - title: X(R)("tooltip.filterWorkflowOnly", "Show only assets with embedded workflow data") - }, [J(h, { + title: Z(L)("tooltip.filterWorkflowOnly", "Show only assets with embedded workflow data") + }, [U(h, { class: "mjr-checkbox", - "model-value": !!X(n).workflowOnly, + "model-value": !!Z(n).workflowOnly, binary: "", - "onUpdate:modelValue": M - }, null, 8, ["model-value"]), H("span", null, q(X(R)("filter.onlyWithWorkflow")), 1)], 8, rv)])]), H("div", iv, [ - H("div", av, [H("div", ov, q(X(R)("label.workflowType", "Workflow type")), 1), J(m, { + "onUpdate:modelValue": ee + }, null, 8, ["model-value"]), H("span", null, J(Z(L)("filter.onlyWithWorkflow")), 1)], 8, Nv)])]), H("div", Pv, [ + H("div", Fv, [H("div", Iv, J(Z(L)("label.workflowType", "Workflow type")), 1), U(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - "model-value": String(X(n).workflowType || "").trim().toUpperCase(), - options: b.value, + "model-value": String(Z(n).workflowType || "").trim().toUpperCase(), + options: y.value, "option-label": "label", "option-value": "value", - "onUpdate:modelValue": N + "onUpdate:modelValue": j }, null, 8, ["model-value", "options"])]), - H("div", sv, [H("div", cv, q(X(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), J(g, { + H("div", Lv, [H("div", Rv, J(Z(L)("label.sameWorkflow", "Generated with Same Workflow")), 1), U(g, { ref_key: "workflowIdInputRef", - ref: f, + ref: d, class: "mjr-input", - title: X(R)("tooltip.filterWorkflowId", "Filter assets generated from the same embedded workflow id"), - placeholder: X(R)("placeholder.workflowId", "Workflow ID"), - "model-value": String(X(n).workflowId || ""), - "onUpdate:modelValue": ee, - onChange: t[1] ||= (e) => ee(e?.target?.value) + title: Z(L)("tooltip.filterWorkflowId", "Filter assets generated from the same embedded workflow id"), + placeholder: Z(L)("placeholder.workflowId", "Workflow ID"), + "model-value": String(Z(n).workflowId || ""), + "onUpdate:modelValue": M, + onChange: t[1] ||= (e) => M(e?.target?.value) }, null, 8, [ "title", "placeholder", "model-value" ])]), - H("div", lv, [H("div", uv, q(X(R)("label.workflowModelFamily", "Model family")), 1), H("div", dv, [J(m, { + H("div", zv, [H("div", Bv, J(Z(L)("label.workflowModelFamily", "Model family")), 1), H("div", Vv, [U(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - "model-value": String(X(n).workflowModelFilter || ""), - options: S.value, - "option-label": "label", - "option-value": "value", - "onUpdate:modelValue": te - }, null, 8, ["model-value", "options"]), J(g, { - ref_key: "workflowModelInputRef", - ref: p, - class: "mjr-input", - placeholder: X(R)("placeholder.workflowModelFamily", "Flux, Wan, SDXL..."), - "model-value": String(X(n).workflowModelFilter || ""), - "onUpdate:modelValue": te, - onChange: t[2] ||= (e) => te(e?.target?.value) - }, null, 8, ["placeholder", "model-value"])])]), - H("div", fv, [H("div", pv, q(X(R)("label.workflowRunsOn", "Runs on")), 1), J(m, { - class: "mjr-select mjr-filter-select", - "panel-class": "mjr-filter-select-panel", - "model-value": String(X(n).workflowRunsOnFilter || "").trim().toLowerCase(), + "model-value": String(Z(n).workflowModelFilter || ""), options: x.value, "option-label": "label", "option-value": "value", - "onUpdate:modelValue": P - }, null, 8, ["model-value", "options"])]), - H("div", mv, [H("div", hv, q(X(R)("label.rating")), 1), J(m, { + "onUpdate:modelValue": N + }, null, 8, ["model-value", "options"]), U(g, { + ref_key: "workflowModelInputRef", + ref: f, + class: "mjr-input", + placeholder: Z(L)("placeholder.workflowModelFamily", "Flux, Wan, SDXL..."), + "model-value": String(Z(n).workflowModelFilter || ""), + "onUpdate:modelValue": N, + onChange: t[2] ||= (e) => N(e?.target?.value) + }, null, 8, ["placeholder", "model-value"])])]), + H("div", Hv, [H("div", Uv, J(Z(L)("label.workflowRunsOn", "Runs on")), 1), U(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - title: X(R)("tooltip.filterMinRating", "Filter by minimum rating"), - "model-value": String(Number(X(n).minRating || 0) || 0), - options: C.value, + "model-value": String(Z(n).workflowRunsOnFilter || "").trim().toLowerCase(), + options: b.value, + "option-label": "label", + "option-value": "value", + "onUpdate:modelValue": te + }, null, 8, ["model-value", "options"])]), + H("div", Wv, [H("div", Gv, J(Z(L)("label.rating")), 1), U(m, { + class: "mjr-select mjr-filter-select", + "panel-class": "mjr-filter-select-panel", + title: Z(L)("tooltip.filterMinRating", "Filter by minimum rating"), + "model-value": String(Number(Z(n).minRating || 0) || 0), + options: S.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": ne @@ -19209,80 +19725,80 @@ var w_ = { "model-value", "options" ])]) - ])], 512), [[yr, se("core")]])], 2), - H("div", { class: Q(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [J(r, { + ])], 512), [[lr, oe("core")]])], 2), + H("div", { class: X(["mjr-filter-group mjr-filter-group--media", { "is-open": oe("media") }]) }, [U(p, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", - "aria-expanded": String(se("media")), - onClick: t[3] ||= (e) => oe("media") + "aria-expanded": String(oe("media")), + onClick: t[3] ||= (e) => ae("media") }, { - default: U(() => [H("span", gv, q(X(R)("group.media", "Media")), 1), H("span", _v, q(se("media") ? "▾" : "▸"), 1)]), + default: G(() => [H("span", Kv, J(Z(L)("group.media", "Media")), 1), H("span", qv, J(oe("media") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), _r(H("div", vv, [H("div", yv, [ - H("div", bv, [ - H("div", xv, q(X(R)("label.fileSizeMB", "File size (MB)")), 1), - J(g, { + }, 8, ["aria-expanded"]), Kn(H("div", Jv, [H("div", Yv, [ + H("div", Xv, [ + H("div", Zv, J(Z(L)("label.fileSizeMB", "File size (MB)")), 1), + U(g, { ref_key: "minSizeInputRef", + ref: r, + type: "number", + min: "0", + step: "0.1", + class: "mjr-input", + placeholder: Z(L)("label.min", "Min"), + value: Z(n).minSizeMB || "", + onChange: P + }, null, 8, ["placeholder", "value"]), + U(g, { + ref_key: "maxSizeInputRef", ref: i, type: "number", min: "0", step: "0.1", class: "mjr-input", - placeholder: X(R)("label.min", "Min"), - value: X(n).minSizeMB || "", - onChange: F - }, null, 8, ["placeholder", "value"]), - J(g, { - ref_key: "maxSizeInputRef", - ref: a, - type: "number", - min: "0", - step: "0.1", - class: "mjr-input", - placeholder: X(R)("label.max", "Max"), - value: X(n).maxSizeMB || "", - onChange: F + placeholder: Z(L)("label.max", "Max"), + value: Z(n).maxSizeMB || "", + onChange: P }, null, 8, ["placeholder", "value"]) ]), - H("div", Sv, [H("div", Cv, q(X(R)("label.resolutionPx", "Resolution (px)")), 1), J(m, { + H("div", Qv, [H("div", $v, J(Z(L)("label.resolutionPx", "Resolution (px)")), 1), U(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - "model-value": E.value, - options: w.value, + "model-value": T.value, + options: C.value, "option-label": "label", "option-value": "value", - "onUpdate:modelValue": ie + "onUpdate:modelValue": F }, null, 8, ["model-value", "options"])]), - H("div", wv, [ - H("div", Tv, q(X(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), - J(g, { + H("div", ey, [ + H("div", ty, J(Z(L)("label.resolutionMinWxH", "Min WxH (px)")), 1), + U(g, { ref_key: "minWidthInputRef", - ref: o, + ref: a, type: "number", min: "0", step: "1", class: "mjr-input", - placeholder: X(R)("label.widthPx", "W (px)"), - title: X(R)("tooltip.widthPx", "Minimum width in pixels"), - value: X(n).minWidth || "", + placeholder: Z(L)("label.widthPx", "W (px)"), + title: Z(L)("tooltip.widthPx", "Minimum width in pixels"), + value: Z(n).minWidth || "", onChange: re }, null, 8, [ "placeholder", "title", "value" ]), - J(g, { + U(g, { ref_key: "minHeightInputRef", - ref: s, + ref: o, type: "number", min: "0", step: "1", class: "mjr-input", - placeholder: X(R)("label.heightPx", "H (px)"), - title: X(R)("tooltip.heightPx", "Minimum height in pixels"), - value: X(n).minHeight || "", + placeholder: Z(L)("label.heightPx", "H (px)"), + title: Z(L)("tooltip.heightPx", "Minimum height in pixels"), + value: Z(n).minHeight || "", onChange: re }, null, 8, [ "placeholder", @@ -19290,34 +19806,34 @@ var w_ = { "value" ]) ]), - H("div", Ev, [ - H("div", Dv, q(X(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), - J(g, { + H("div", ny, [ + H("div", ry, J(Z(L)("label.resolutionMaxWxH", "Max WxH (px)")), 1), + U(g, { ref_key: "maxWidthInputRef", - ref: c, + ref: s, type: "number", min: "0", step: "1", class: "mjr-input", - placeholder: X(R)("label.widthPx", "W (px)"), - title: X(R)("tooltip.widthPx", "Maximum width in pixels"), - value: X(n).maxWidth || "", + placeholder: Z(L)("label.widthPx", "W (px)"), + title: Z(L)("tooltip.widthPx", "Maximum width in pixels"), + value: Z(n).maxWidth || "", onChange: re }, null, 8, [ "placeholder", "title", "value" ]), - J(g, { + U(g, { ref_key: "maxHeightInputRef", - ref: l, + ref: c, type: "number", min: "0", step: "1", class: "mjr-input", - placeholder: X(R)("label.heightPx", "H (px)"), - title: X(R)("tooltip.heightPx", "Maximum height in pixels"), - value: X(n).maxHeight || "", + placeholder: Z(L)("label.heightPx", "H (px)"), + title: Z(L)("tooltip.heightPx", "Maximum height in pixels"), + value: Z(n).maxHeight || "", onChange: re }, null, 8, [ "placeholder", @@ -19325,46 +19841,46 @@ var w_ = { "value" ]) ]) - ])], 512), [[yr, se("media")]])], 2), - H("div", { class: Q(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [J(r, { + ])], 512), [[lr, oe("media")]])], 2), + H("div", { class: X(["mjr-filter-group mjr-filter-group--time", { "is-open": oe("time") }]) }, [U(p, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", - "aria-expanded": String(se("time")), - onClick: t[4] ||= (e) => oe("time") + "aria-expanded": String(oe("time")), + onClick: t[4] ||= (e) => ae("time") }, { - default: U(() => [H("span", Ov, q(X(R)("group.time", "Time")), 1), H("span", kv, q(se("time") ? "▾" : "▸"), 1)]), + default: G(() => [H("span", iy, J(Z(L)("group.time", "Time")), 1), H("span", ay, J(oe("time") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), _r(H("div", Av, [H("div", jv, [H("div", Mv, [H("div", Nv, q(X(R)("label.dateRange")), 1), J(m, { + }, 8, ["aria-expanded"]), Kn(H("div", oy, [H("div", sy, [H("div", cy, [H("div", ly, J(Z(L)("label.dateRange")), 1), U(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - title: X(R)("tooltip.filterByDateRange", "Filter by date range"), - "model-value": String(X(n).dateRangeFilter || ""), - options: T.value, + title: Z(L)("tooltip.filterByDateRange", "Filter by date range"), + "model-value": String(Z(n).dateRangeFilter || ""), + options: w.value, "option-label": "label", "option-value": "value", - "onUpdate:modelValue": ae + "onUpdate:modelValue": I }, null, 8, [ "title", "model-value", "options" - ])]), H("div", Pv, [H("div", Fv, q(X(R)("label.agenda")), 1), H("div", { + ])]), H("div", uy, [H("div", dy, J(Z(L)("label.agenda")), 1), H("div", { ref_key: "agendaContainerRef", - ref: u, + ref: l, class: "mjr-agenda-container" - }, [J(g, { + }, [U(g, { ref_key: "dateExactInputRef", - ref: d, + ref: u, type: "date", - class: Q(["mjr-input mjr-agenda-input", D.value]), - value: X(n).dateExactFilter, - onChange: I - }, null, 8, ["class", "value"])], 512)])])], 512), [[yr, se("time")]])], 2) + class: X(["mjr-input mjr-agenda-input", E.value]), + value: Z(n).dateExactFilter, + onChange: ie + }, null, 8, ["class", "value"])], 512)])])], 512), [[lr, oe("time")]])], 2) ]); }; } -}), Lv = 128, Rv = Object.freeze([ +}), py = 128, my = Object.freeze([ { key: "portraits", label: "Portraits", @@ -19402,10 +19918,10 @@ var w_ = { iconClass: "pi pi-circle" } ]); -function zv(e) { +function hy(e) { try { let t = String(e ?? "").trim(); - if (!t || t.length > Lv || t.includes("\0")) return ""; + if (!t || t.length > py || t.includes("\0")) return ""; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return ""; @@ -19415,7 +19931,7 @@ function zv(e) { return ""; } } -function Bv(e) { +function gy(e) { if (!e || typeof e != "object") return null; let t = String(e.filepath || "").trim(); return t ? { @@ -19427,10 +19943,10 @@ function Bv(e) { root_id: String(e.root_id || e.rootId || e.custom_root_id || "").trim() || void 0 } : null; } -function Vv(e) { +function _y(e) { let t = [], n = [], r = /* @__PURE__ */ new Set(); for (let i of Array.isArray(e) ? e : []) { - let e = Bv(i); + let e = gy(i); if (e?.filepath) { let n = e.filepath.toLowerCase(); if (r.has(n)) continue; @@ -19445,24 +19961,24 @@ function Vv(e) { missingIds: n }; } -async function Hv(e) { +async function vy(e) { let t = Array.from(new Set((Array.isArray(e) ? e : []).map((e) => Number(e)).filter((e) => Number.isFinite(e) && e > 0))); if (!t.length) return { ok: !0, data: [] }; - let n = await N(t); + let n = await ge(t); if (!n?.ok) return { ok: !1, error: String(n?.error || "Failed to fetch assets") }; - let { assets: r } = Vv(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); + let { assets: r } = _y(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); return { ok: !0, data: r }; } -function Uv(e) { +function yy(e) { let t = String(e?.label || "").trim(); if (t && !/^group\b/i.test(t)) return t; let n = (Array.isArray(e?.dominant_tags) ? e.dominant_tags : []).map((e) => String(e || "").trim()).filter(Boolean); @@ -19480,43 +19996,43 @@ function Uv(e) { let s = Object.entries(o).sort((e, t) => t[1] - e[1])[0]?.[0] || "other", c = s === "image" ? "Images" : s === "video" ? "Videos" : s === "audio" ? "Audio" : "Media", l = Number(e?.cluster_id), u = Number.isFinite(l) ? ` ${l + 1}` : ""; return a ? `${a} - ${c}` : `${c} Cluster${u}`; } -function Wv() { +function by() { try { - return !!(Xt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Mt()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } // ui/vue/components/panel/CollectionsPopover.vue?vue&type=script&setup=true&lang.ts -var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-item-label" }, qv = { class: "mjr-menu-item-label" }, Jv = { class: "mjr-menu-item-right" }, Yv = { +var xy = { class: "mjr-menu mjr-collections-menu" }, Sy = { class: "mjr-menu-item-label" }, Cy = { class: "mjr-menu-item-label" }, wy = { class: "mjr-menu-item-right" }, Ty = { key: 0, class: "mjr-menu-item-hint" -}, Xv = { +}, Ey = { key: 1, class: "mjr-muted" -}, Zv = { +}, Dy = { key: 2, class: "mjr-state-block is-error" -}, Qv = { +}, Oy = { key: 3, class: "mjr-muted" -}, $v = { class: "mjr-collection-row" }, ey = { class: "mjr-menu-item-label" }, ty = { class: "mjr-menu-item-right" }, ny = { +}, ky = { class: "mjr-collection-row" }, Ay = { class: "mjr-menu-item-label" }, jy = { class: "mjr-menu-item-right" }, My = { key: 0, class: "mjr-menu-item-hint" -}, ry = { class: "mjr-state-block" }, iy = { class: "mjr-section-title mjr-section-title--cyan" }, ay = { class: "mjr-section-hint" }, oy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, sy = { class: "mjr-section-title mjr-section-title--violet" }, cy = { class: "mjr-section-hint" }, ly = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, uy = { +}, Ny = { class: "mjr-state-block" }, Py = { class: "mjr-section-title mjr-section-title--cyan" }, Fy = { class: "mjr-section-hint" }, Iy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, Ly = { class: "mjr-section-title mjr-section-title--violet" }, Ry = { class: "mjr-section-hint" }, zy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, By = { key: 0, class: "mjr-state-block is-error" -}, dy = { class: "mjr-cluster-thumbs" }, fy = ["src", "alt"], py = { class: "mjr-cluster-info" }, my = ["title"], hy = { class: "mjr-cluster-count" }, gy = "mjr:collections-changed", _y = /* @__PURE__ */ dr({ +}, Vy = { class: "mjr-cluster-thumbs" }, Hy = ["src", "alt"], Uy = { class: "mjr-cluster-info" }, Wy = ["title"], Gy = { class: "mjr-cluster-count" }, Ky = "mjr:collections-changed", qy = /* @__PURE__ */ tr({ __name: "CollectionsPopover", setup(e, { expose: t }) { - let n = dh(), r = Z(null), i = Z([]), a = Z(!1), o = Z(""), c = Z(!1), u = Z(!0), d = Z(!1), f = Z(!1), p = Z(!1), m = Z([]), h = Z(""), g = Z(""), _ = 0, v = null, y = !1, x = G(() => String(n.collectionId || "").trim()), S = G(() => String(n.collectionName || "").trim()), C = G(() => !!x.value), w = G(() => !u.value || f.value), T = G(() => u.value && d.value), E = G(() => `${Math.max(1, Math.min(i.value.length, 6)) * 48}px`); - function D() { - let e = r.value; + let n = Vh(), i = Q(null), a = Q([]), s = Q(!1), c = Q(""), l = Q(!1), u = Q(!0), d = Q(!1), f = Q(!1), p = Q(!1), m = Q([]), h = Q(""), g = Q(""), _ = 0, y = null, b = !1, x = K(() => String(n.collectionId || "").trim()), C = K(() => String(n.collectionName || "").trim()), w = K(() => !!x.value), T = K(() => !u.value || f.value), E = K(() => u.value && d.value), D = K(() => `${Math.max(1, Math.min(a.value.length, 6)) * 48}px`); + function O() { + let e = i.value; return !!e && String(e.style.display || "").toLowerCase() !== "none"; } - function O({ collectionId: e = x.value, collectionName: t = S.value, close: n = !0, reload: r = !0 } = {}) { + function k({ collectionId: e = x.value, collectionName: t = C.value, close: n = !0, reload: r = !0 } = {}) { try { - window.dispatchEvent(new CustomEvent(gy, { detail: { + window.dispatchEvent(new CustomEvent(Ky, { detail: { collectionId: String(e || ""), collectionName: String(t || ""), close: n !== !1, @@ -19528,19 +20044,19 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } function A(e) { try { - return ot(e) || ""; + return ae(e) || ""; } catch (e) { return console.debug?.(e), ""; } } - async function N() { - if (!Wv()) return { + async function ee() { + if (!by()) return { enabled: !1, vectorAvailable: !1, vectorDisabled: !1 }; try { - let e = await k(), t = !e?.ok && (String(e?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(e?.error || ""))); + let e = await r(), t = !e?.ok && (String(e?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(e?.error || ""))); return { enabled: !0, vectorAvailable: !!(e?.ok && e?.data?.total > 0), @@ -19554,7 +20070,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }; } } - function ee(...e) { + function j(...e) { let t = [], n = /* @__PURE__ */ new Set(); for (let r of e) for (let e of Array.isArray(r) ? r : []) { let r = String(e?.filepath || "").trim().toLowerCase(); @@ -19562,21 +20078,21 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } return t; } - async function te() { + async function M() { let e = ++_; - a.value = !0, c.value = !0, o.value = "", h.value = ""; + s.value = !0, l.value = !0, c.value = "", h.value = ""; try { - let [t, n] = await Promise.all([ge(), N()]); + let [t, n] = await Promise.all([Ee(), ee()]); if (e !== _) return; - t?.ok ? i.value = Array.isArray(t?.data) ? t.data : [] : (o.value = String(t?.error || R("msg.failedLoadCollections", "Failed to load collections")), i.value = []), u.value = !!n.enabled, d.value = !!n.vectorAvailable, f.value = !!n.vectorDisabled, d.value || (m.value = [], p.value = !1); + t?.ok ? a.value = Array.isArray(t?.data) ? t.data : [] : (c.value = String(t?.error || L("msg.failedLoadCollections", "Failed to load collections")), a.value = []), u.value = !!n.enabled, d.value = !!n.vectorAvailable, f.value = !!n.vectorDisabled, d.value || (m.value = [], p.value = !1); } catch (t) { if (e !== _) return; - console.debug?.(t), o.value = R("msg.failedLoadCollections", "Failed to load collections"), i.value = []; + console.debug?.(t), c.value = L("msg.failedLoadCollections", "Failed to load collections"), a.value = []; } finally { - e === _ && (a.value = !1, c.value = !1); + e === _ && (s.value = !1, l.value = !1); } } - function P(e, t) { + function N(e, t) { return async (...n) => { if (!g.value) { g.value = e; @@ -19588,74 +20104,74 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } }; } - let ne = P("create", async () => { - let e = await Et(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); + let te = N("create", async () => { + let e = await wt(L("dialog.createCollection", "Create collection"), L("dialog.collectionPlaceholder", "Collection name")); if (!e) return; - let t = zv(e); + let t = hy(e); if (!t) { - I(R("toast.invalidCollectionName", "Invalid collection name"), "error"); + F(L("toast.invalidCollectionName", "Invalid collection name"), "error"); return; } - let n = await l(t); - n?.ok ? O({ + let n = await v(t); + n?.ok ? k({ collectionId: String(n?.data?.id || ""), collectionName: String(n?.data?.name || t) - }) : I(n?.error || R("toast.failedCreateCollection", "Failed to create collection"), "error"); - }), F = P("exit", async () => { - O({ + }) : F(n?.error || L("toast.failedCreateCollection", "Failed to create collection"), "error"); + }), ne = N("exit", async () => { + k({ collectionId: "", collectionName: "" }); - }), re = P("open", async (e) => { + }), re = N("open", async (e) => { let t = String(e?.id || ""), n = String(e?.name || t); - t && (t === x.value ? O({ + t && (t === x.value ? k({ collectionId: t, collectionName: n, reload: !1 - }) : O({ + }) : k({ collectionId: t, collectionName: n })); - }), ie = P("delete", async (e) => { + }), I = N("delete", async (e) => { let t = String(e?.id || ""), n = String(e?.name || t); - if (!t || !await Gt(R("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: n }))) return; - let r = await s(t); - r?.ok ? t === x.value ? O({ + if (!t || !await jt(L("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: n }))) return; + let r = await o(t); + r?.ok ? t === x.value ? k({ collectionId: "", collectionName: "" - }) : await te() : I(r?.error || R("toast.failedDeleteCollection", "Failed to delete collection"), "error"); + }) : await M() : F(r?.error || L("toast.failedDeleteCollection", "Failed to delete collection"), "error"); }); - async function ae(e) { + async function ie(e) { let t = String(e?.label || "").trim(); if (!t) return; - let n = await l(t); + let n = await v(t); if (!n?.ok) { - I(n?.error || R("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); + F(n?.error || L("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); return; } let r = String(n?.data?.id || ""); if (!r) return; - let i = await j(String(e?.query || ""), 50); + let i = await rt(String(e?.query || ""), 50); if (i?.ok && Array.isArray(i?.data) && i.data.length > 0) { - let e = Vv(i.data), n = e.assets; + let e = _y(i.data), n = e.assets; if (e.missingIds.length) { - let t = await Hv(e.missingIds); - t.ok && Array.isArray(t.data) && (n = ee(n, t.data)); + let t = await vy(e.missingIds); + t.ok && Array.isArray(t.data) && (n = j(n, t.data)); } if (n.length) { - let e = await b(r, n); + let e = await S(r, n); if (!e?.ok) { - I(e?.error || R("toast.failedAddAssetsToSmartCollection", "Failed to add assets to smart collection"), "error"); + F(e?.error || L("toast.failedAddAssetsToSmartCollection", "Failed to add assets to smart collection"), "error"); return; } let i = Number(e?.data?.added || n.length || 0); - I(R("toast.smartCollectionCreated", "Smart collection \"{name}\" created with {count} assets!", { + F(L("toast.smartCollectionCreated", "Smart collection \"{name}\" created with {count} assets!", { name: t, count: i }), "success", 3e3); - } else I(R("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); - } else I(R("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); - O({ + } else F(L("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); + } else F(L("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); + k({ collectionId: r, collectionName: t }); @@ -19666,9 +20182,9 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite if (!g.value) { g.value = t; try { - await ae(e); + await ie(e); } catch (e) { - console.error("[Majoor] Smart collection creation failed:", e), I(R("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); + console.error("[Majoor] Smart collection creation failed:", e), F(L("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); } finally { g.value === t && (g.value = ""); } @@ -19678,17 +20194,17 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite if (!(p.value || g.value)) { p.value = !0, h.value = "", m.value = []; try { - let e = await M(8); + let e = await P(8); if (!e?.ok || !Array.isArray(e?.data) || !e.data.length) { - I(R("toast.noGroupsFoundIndexFirst", "No groups found. Index more assets first."), "info", 3e3); + F(L("toast.noGroupsFoundIndexFirst", "No groups found. Index more assets first."), "info", 3e3); return; } m.value = e.data.map((e) => ({ ...e, - _label: Uv(e) + _label: yy(e) })); } catch (e) { - console.error("[Majoor] Discover groups failed:", e), h.value = R("toast.clusterAnalysisFailed", "Cluster analysis failed"), I(R("toast.clusterAnalysisFailed", "Cluster analysis failed"), "error"); + console.error("[Majoor] Discover groups failed:", e), h.value = L("toast.clusterAnalysisFailed", "Cluster analysis failed"), F(L("toast.clusterAnalysisFailed", "Cluster analysis failed"), "error"); } finally { p.value = !1; } @@ -19699,122 +20215,122 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite if (!g.value) { g.value = t; try { - let t = String(e?._label || Uv(e) || "").trim(); + let t = String(e?._label || yy(e) || "").trim(); if (!t) return; - let n = await l(t); + let n = await v(t); if (!n?.ok) { - I(n?.error || R("toast.failedCreateCollection", "Failed to create collection"), "error"); + F(n?.error || L("toast.failedCreateCollection", "Failed to create collection"), "error"); return; } let r = String(n?.data?.id || ""), i = Array.isArray(e?.all_asset_ids) ? e.all_asset_ids : []; if (r && i.length) { - let e = await Hv(i); + let e = await vy(i); if (!e.ok) { - I(e.error || R("toast.failedLoadClusterAssets", "Failed to load cluster assets"), "error"); + F(e.error || L("toast.failedLoadClusterAssets", "Failed to load cluster assets"), "error"); return; } - let n = await b(r, e.data || []); + let n = await S(r, e.data || []); if (!n?.ok) { - I(n?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection"), "error"); + F(n?.error || L("toast.failedAddAssetsToCollection", "Failed to add assets to collection"), "error"); return; } let a = Number(n?.data?.added || e.data?.length || 0); - I(R("toast.collectionCreatedWithAssets", "Collection \"{name}\" created with {count} assets!", { + F(L("toast.collectionCreatedWithAssets", "Collection \"{name}\" created with {count} assets!", { name: t, count: a }), "success", 3e3); - } else I(R("toast.collectionCreatedNamed", "Collection \"{name}\" created.", { name: t }), "success", 2200); - O({ + } else F(L("toast.collectionCreatedNamed", "Collection \"{name}\" created.", { name: t }), "success", 2200); + k({ collectionId: r, collectionName: t }); } catch (e) { - console.error("[Majoor] Cluster collection creation failed:", e), I(R("toast.failedCreateCollection", "Failed to create collection"), "error"); + console.error("[Majoor] Cluster collection creation failed:", e), F(L("toast.failedCreateCollection", "Failed to create collection"), "error"); } finally { g.value === t && (g.value = ""); } } } function le() { - let e = D(); - e && !y && te().catch(() => {}), y = e; + let e = O(); + e && !b && M().catch(() => {}), b = e; } - return Ar(() => { - le(), typeof MutationObserver < "u" && r.value && (v = new MutationObserver(() => le()), v.observe(r.value, { + return Zn(() => { + le(), typeof MutationObserver < "u" && i.value && (y = new MutationObserver(() => le()), y.observe(i.value, { attributes: !0, attributeFilter: ["style"] })); - }), rr(() => { + }), ir(() => { try { - v?.disconnect?.(); + y?.disconnect?.(); } catch (e) { console.debug?.(e); } - v = null; - }), t({ refresh: te }), (e, t) => { - let n = ar("MButton"), s = ar("MVirtualScroller"); - return K(), Y("div", { + y = null; + }), t({ refresh: M }), (e, t) => { + let n = Qn("MButton"), r = Qn("MVirtualScroller"); + return q(), Y("div", { ref_key: "rootRef", - ref: r, + ref: i, class: "mjr-popover mjr-collections-popover", style: { display: "none" } - }, [H("div", Gv, [ - J(n, { + }, [H("div", xy, [ + U(n, { type: "button", class: "mjr-menu-item", severity: "secondary", text: "", disabled: g.value !== "", - onClick: X(ne) + onClick: Z(te) }, { - default: U(() => [H("span", Kv, q(X(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= H("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: G(() => [H("span", Sy, J(Z(L)("ctx.createCollection", "Create collection")), 1), t[0] ||= H("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 1 }, 8, ["disabled", "onClick"]), - C.value ? (K(), ir(n, { + w.value ? (q(), Jn(n, { key: 0, type: "button", class: "mjr-menu-item", severity: "secondary", text: "", disabled: g.value !== "", - onClick: X(F) + onClick: Z(ne) }, { - default: U(() => [H("span", qv, q(X(R)("ctx.exitCollection", "Exit collection")), 1), H("span", Jv, [S.value ? (K(), Y("span", Yv, q(S.value), 1)) : W("", !0), t[1] ||= H("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), + default: G(() => [H("span", Cy, J(Z(L)("ctx.exitCollection", "Exit collection")), 1), H("span", wy, [C.value ? (q(), Y("span", Ty, J(C.value), 1)) : W("", !0), t[1] ||= H("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), _: 1 }, 8, ["disabled", "onClick"])) : W("", !0), t[9] ||= H("div", { class: "mjr-menu-divider" }, null, -1), - a.value ? (K(), Y("div", Xv, q(X(R)("label.loading", "Loading...")), 1)) : o.value ? (K(), Y("div", Zv, q(o.value), 1)) : i.value.length ? (K(), ir(s, { + s.value ? (q(), Y("div", Ey, J(Z(L)("label.loading", "Loading...")), 1)) : c.value ? (q(), Y("div", Dy, J(c.value), 1)) : a.value.length ? (q(), Jn(r, { key: 4, - items: i.value, + items: a.value, "item-size": 48, - "scroll-height": E.value, + "scroll-height": D.value, "num-tolerated-items": 4, class: "mjr-collections-virtual-list" }, { - item: U(({ item: e }) => [H("div", $v, [J(n, { + item: G(({ item: e }) => [H("div", ky, [U(n, { type: "button", - class: Q(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), + class: X(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), severity: "secondary", text: "", disabled: g.value !== "", - onClick: (t) => X(re)(e) + onClick: (t) => Z(re)(e) }, { - default: U(() => [H("span", ey, q(e.name || e.id), 1), H("span", ty, [Number(e.count || 0) ? (K(), Y("span", ny, q(Number(e.count || 0)), 1)) : W("", !0), t[2] ||= H("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), + default: G(() => [H("span", Ay, J(e.name || e.id), 1), H("span", jy, [Number(e.count || 0) ? (q(), Y("span", My, J(Number(e.count || 0)), 1)) : W("", !0), t[2] ||= H("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), _: 2 }, 1032, [ "class", "disabled", "onClick" - ]), J(n, { + ]), U(n, { type: "button", class: "mjr-menu-item mjr-delete-btn", severity: "secondary", text: "", disabled: g.value !== "", - title: X(R)("tooltip.deleteCollection", "Delete collection"), - onClick: mr((t) => X(ie)(e), ["stop", "prevent"]) + title: Z(L)("tooltip.deleteCollection", "Delete collection"), + onClick: rr((t) => Z(I)(e), ["stop", "prevent"]) }, { - default: U(() => [...t[3] ||= [H("i", { class: "pi pi-trash" }, null, -1)]]), + default: G(() => [...t[3] ||= [H("i", { class: "pi pi-trash" }, null, -1)]]), _: 1 }, 8, [ "disabled", @@ -19822,13 +20338,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "onClick" ])])]), _: 1 - }, 8, ["items", "scroll-height"])) : (K(), Y("div", Qv, q(X(R)("msg.noCollections", "No collections yet")), 1)), - !c.value && w.value ? (K(), Y(V, { key: 5 }, [t[4] ||= H("div", { class: "mjr-menu-divider" }, null, -1), H("div", ry, q(u.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : W("", !0), - !c.value && T.value ? (K(), Y(V, { key: 6 }, [ + }, 8, ["items", "scroll-height"])) : (q(), Y("div", Oy, J(Z(L)("msg.noCollections", "No collections yet")), 1)), + !l.value && T.value ? (q(), Y(V, { key: 5 }, [t[4] ||= H("div", { class: "mjr-menu-divider" }, null, -1), H("div", Ny, J(u.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : W("", !0), + !l.value && E.value ? (q(), Y(V, { key: 6 }, [ t[7] ||= H("div", { class: "mjr-menu-divider" }, null, -1), - H("div", iy, q(X(R)("label.smartSuggestions", "Smart Suggestions")), 1), - H("div", ay, q(X(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), - (K(!0), Y(V, null, hr(X(Rv), (e) => (K(), ir(n, { + H("div", Py, J(Z(L)("label.smartSuggestions", "Smart Suggestions")), 1), + H("div", Fy, J(Z(L)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), + (q(!0), Y(V, null, $n(Z(my), (e) => (q(), Jn(n, { key: e.key, type: "button", class: "mjr-menu-item mjr-menu-item--smart", @@ -19837,13 +20353,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite disabled: g.value !== "", onClick: (t) => oe(e) }, { - default: U(() => [H("span", oy, [H("i", { class: Q(e.iconClass) }, null, 2), H("span", null, q(e.label), 1)]), t[5] ||= H("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: G(() => [H("span", Iy, [H("i", { class: X(e.iconClass) }, null, 2), H("span", null, J(e.label), 1)]), t[5] ||= H("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 2 }, 1032, ["disabled", "onClick"]))), 128)), t[8] ||= H("div", { class: "mjr-menu-divider" }, null, -1), - H("div", sy, q(X(R)("label.discoverGroups", "Discover Groups")), 1), - H("div", cy, q(X(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), - J(n, { + H("div", Ly, J(Z(L)("label.discoverGroups", "Discover Groups")), 1), + H("div", Ry, J(Z(L)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), + U(n, { type: "button", class: "mjr-menu-item mjr-menu-item--cluster", severity: "secondary", @@ -19851,34 +20367,34 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite disabled: p.value || g.value !== "", onClick: se }, { - default: U(() => [H("span", ly, [t[6] ||= H("i", { class: "pi pi-search" }, null, -1), H("span", null, q(p.value ? X(R)("label.analyzing", "Analyzing...") : X(R)("label.analyzeLibrary", "Analyze library")), 1)])]), + default: G(() => [H("span", zy, [t[6] ||= H("i", { class: "pi pi-search" }, null, -1), H("span", null, J(p.value ? Z(L)("label.analyzing", "Analyzing...") : Z(L)("label.analyzeLibrary", "Analyze library")), 1)])]), _: 1 }, 8, ["disabled"]), - h.value ? (K(), Y("div", uy, q(h.value), 1)) : W("", !0), - (K(!0), Y(V, null, hr(m.value, (e) => (K(), Y("div", { + h.value ? (q(), Y("div", By, J(h.value), 1)) : W("", !0), + (q(!0), Y(V, null, $n(m.value, (e) => (q(), Y("div", { key: e.cluster_id, class: "mjr-cluster-row" }, [ - H("div", dy, [(K(!0), Y(V, null, hr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (K(), Y("img", { + H("div", Vy, [(q(!0), Y(V, null, $n(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), Y("img", { key: `${e.cluster_id}-${n}`, class: "mjr-cluster-thumb", src: A(t), alt: String(t?.filename || e._label || ""), loading: "lazy" - }, null, 8, fy))), 128))]), - H("div", py, [H("div", { + }, null, 8, Hy))), 128))]), + H("div", Uy, [H("div", { class: "mjr-cluster-name", title: e._label - }, q(e._label), 9, my), H("div", hy, q(Number(e.size || 0)) + " " + q(X(R)("label.assets", "assets")), 1)]), - J(n, { + }, J(e._label), 9, Wy), H("div", Gy, J(Number(e.size || 0)) + " " + J(Z(L)("label.assets", "assets")), 1)]), + U(n, { type: "button", class: "mjr-cluster-create-btn", severity: "secondary", disabled: g.value !== "", - title: X(R)("ctx.createCollection", "Create collection"), + title: Z(L)("ctx.createCollection", "Create collection"), onClick: (t) => ce(e) }, { - default: U(() => [nr(q(g.value === `cluster:${String(e.cluster_id ?? "")}` ? X(R)("label.loading", "Loading...") : X(R)("label.create", "Create")), 1)]), + default: G(() => [pr(J(g.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(L)("label.loading", "Loading...") : Z(L)("label.create", "Create")), 1)]), _: 2 }, 1032, [ "disabled", @@ -19890,19 +20406,19 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite ])], 512); }; } -}), vy = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, yy = { +}), Jy = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, Yy = { key: 0, class: "mjr-muted mjr-pinned-folders-empty" -}, by = { +}, Xy = { key: 1, class: "mjr-muted mjr-pinned-folders-empty" -}, xy = { class: "mjr-pinned-folder-label" }, Sy = { +}, Zy = { class: "mjr-pinned-folder-label" }, Qy = { key: 0, class: "mjr-menu-item-hint mjr-pinned-folder-path" -}, Cy = /* @__PURE__ */ dr({ +}, $y = /* @__PURE__ */ tr({ __name: "PinnedFoldersPopover", setup(e, { expose: t }) { - let n = Z(null), r = Z([]), i = Z(!1), a = Z("No pinned folders"), o = Z("Loading..."), s = Z("Unpin folder"), c = Z(null), l = Z(null); + let n = Q(null), r = Q([]), i = Q(!1), a = Q("No pinned folders"), o = Q("Loading..."), s = Q("Unpin folder"), c = Q(null), l = Q(null); function u(e) { let t = String(e?.id || "").trim(); return t ? { @@ -19930,25 +20446,25 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite setPinnedFolders: d, setPinnedFoldersLoading: f }), (e, t) => { - let c = ar("MButton"); - return K(), Y("div", vy, [H("div", { + let c = Qn("MButton"); + return q(), Y("div", Jy, [H("div", { ref_key: "menuRef", ref: n, class: "mjr-menu mjr-pinned-folders-menu", role: "menu" - }, [i.value ? (K(), Y("div", yy, q(o.value), 1)) : r.value.length ? (K(!0), Y(V, { key: 2 }, hr(r.value, (e) => (K(), Y("div", { + }, [i.value ? (q(), Y("div", Yy, J(o.value), 1)) : r.value.length ? (q(!0), Y(V, { key: 2 }, $n(r.value, (e) => (q(), Y("div", { key: e.id, class: "mjr-pinned-folder-row" - }, [J(c, { + }, [U(c, { type: "button", class: "mjr-menu-item mjr-pinned-folder-open", role: "menuitem", severity: "secondary", onClick: (t) => p(e) }, { - default: U(() => [H("span", xy, q(e.label), 1), e.path ? (K(), Y("span", Sy, q(e.path), 1)) : W("", !0)]), + default: G(() => [H("span", Zy, J(e.label), 1), e.path ? (q(), Y("span", Qy, J(e.path), 1)) : W("", !0)]), _: 2 - }, 1032, ["onClick"]), J(c, { + }, 1032, ["onClick"]), U(c, { type: "button", class: "mjr-menu-item mjr-pinned-folder-unpin", role: "menuitem", @@ -19957,7 +20473,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-label": `${s.value}: ${e.label}`, onClick: (t) => m(e, t) }, { - default: U(() => [...t[0] ||= [H("i", { + default: G(() => [...t[0] ||= [H("i", { class: "pi pi-times", "aria-hidden": "true" }, null, -1)]]), @@ -19966,20 +20482,20 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "title", "aria-label", "onClick" - ])]))), 128)) : (K(), Y("div", by, q(a.value), 1))], 512)]); + ])]))), 128)) : (q(), Y("div", Xy, J(a.value), 1))], 512)]); }; } -}), wy = { +}), eb = { class: "mjr-popover mjr-custom-popover", style: { display: "none" } -}, Ty = { class: "mjr-popover-row" }, Ey = { class: "mjr-popover-label" }, Dy = { class: "mjr-popover-row mjr-popover-row--actions" }, Oy = /* @__PURE__ */ dr({ +}, tb = { class: "mjr-popover-row" }, nb = { class: "mjr-popover-label" }, rb = { class: "mjr-popover-row mjr-popover-row--actions" }, ib = /* @__PURE__ */ tr({ __name: "CustomRootsPopover", setup(e, { expose: t }) { - let n = Z([{ - label: R("label.selectFolder", "Select folder..."), + let n = Q([{ + label: L("label.selectFolder", "Select folder..."), value: "", disabled: !1 - }]), r = Z(""), i = Z(!1), a = Z(null), o = Z(null), s = (e) => e?.$el || e || null, c = new EventTarget(), l = (e) => ({ + }]), r = Q(""), i = Q(!1), a = Q(null), o = Q(null), s = (e) => e?.$el || e || null, c = new EventTarget(), l = (e) => ({ value: String(e?.value || ""), label: String(e?.textContent || e?.text || e?.label || ""), text: String(e?.text || e?.textContent || e?.label || ""), @@ -20055,8 +20571,8 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite return s(o.value); } }), (e, t) => { - let s = ar("MSelect"), c = ar("MButton"); - return K(), Y("div", wy, [H("div", Ty, [H("div", Ey, q(X(R)("label.folder")), 1), J(s, { + let s = Qn("MSelect"), c = Qn("MButton"); + return q(), Y("div", eb, [H("div", tb, [H("div", nb, J(Z(L)("label.folder")), 1), U(s, { class: "mjr-select", "model-value": r.value, options: n.value, @@ -20068,16 +20584,16 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "model-value", "options", "disabled" - ])]), H("div", Dy, [J(c, { + ])]), H("div", rb, [U(c, { ref_key: "customAddBtnRef", ref: a, type: "button", class: "mjr-btn", severity: "secondary" }, { - default: U(() => [nr(q(X(R)("btn.add")), 1)]), + default: G(() => [pr(J(Z(L)("btn.add")), 1)]), _: 1 - }, 512), J(c, { + }, 512), U(c, { ref_key: "customRemoveBtnRef", ref: o, type: "button", @@ -20085,18 +20601,18 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", disabled: "" }, { - default: U(() => [nr(q(X(R)("btn.remove")), 1)]), + default: G(() => [pr(J(Z(L)("btn.remove")), 1)]), _: 1 }, 512)])]); }; } -}), ky = ["aria-label"], Ay = { class: "mjr-messages-head" }, jy = { class: "mjr-messages-actions" }, My = ["title"], Ny = { class: "mjr-messages-star-label" }, Py = { +}), ab = ["aria-label"], ob = { class: "mjr-messages-head" }, sb = { class: "mjr-messages-actions" }, cb = ["title"], lb = { class: "mjr-messages-star-label" }, ub = { class: "mjr-messages-tabs", role: "tablist" -}, Fy = { class: "mjr-messages-panels" }, Iy = { class: "mjr-messages-empty" }, Ly = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Ry = /* @__PURE__ */ dr({ +}, db = { class: "mjr-messages-panels" }, fb = { class: "mjr-messages-empty" }, pb = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", mb = /* @__PURE__ */ tr({ __name: "MessagePopover", setup(e, { expose: t }) { - let n = Z(null), r = Z(null), i = Z(null), a = Z(null), o = Z(null), s = Z(null), c = Z(null), l = Z(null), u = Z(null), d = Z(null), f = Z(null), p = (e) => e?.$el || e || null; + let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = (e) => e?.$el || e || null; return t({ get title() { return n.value; @@ -20132,16 +20648,16 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite return f.value; } }), (e, t) => { - let p = ar("MButton"), m = ar("MDialog"); - return K(), Y("div", { + let p = Qn("MButton"), m = Qn("MDialog"); + return q(), Y("div", { class: "mjr-popover mjr-messages-popover", id: "mjr-messages-popover", role: "dialog", - "aria-label": X(R)("label.messages", "Messages"), + "aria-label": Z(L)("label.messages", "Messages"), "aria-hidden": "true", tabindex: "-1", style: { display: "none" } - }, [J(m, { + }, [U(m, { visible: !0, modal: !1, "show-header": !1, @@ -20157,33 +20673,33 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite root: { class: "mjr-inline-dialog-root" } } }, { - default: U(() => [ - H("div", Ay, [H("div", { + default: G(() => [ + H("div", ob, [H("div", { ref_key: "titleRef", ref: n, class: "mjr-messages-title" - }, q(X(R)("label.messages", "Messages")), 513), H("div", jy, [H("a", { - href: Ly, + }, J(Z(L)("label.messages", "Messages")), 513), H("div", sb, [H("a", { + href: pb, target: "_blank", rel: "noopener noreferrer", class: "mjr-btn mjr-messages-star-link", - title: X(R)("tooltip.starGithub", "Open GitHub and give a star") + title: Z(L)("tooltip.starGithub", "Open GitHub and give a star") }, [t[0] ||= H("span", { class: "mjr-messages-star-icon", "aria-hidden": "true" - }, "★", -1), H("span", Ny, q(X(R)("btn.giveStar", "Give a star")), 1)], 8, My), J(p, { + }, "★", -1), H("span", lb, J(Z(L)("btn.giveStar", "Give a star")), 1)], 8, cb), U(p, { ref_key: "markReadBtnRef", ref: r, type: "button", class: "mjr-btn mjr-messages-mark-read-btn", severity: "secondary", - title: X(R)("tooltip.markMessagesRead", "Mark all messages as read") + title: Z(L)("tooltip.markMessagesRead", "Mark all messages as read") }, { - default: U(() => [nr(q(X(R)("btn.markAllRead", "Mark all read")), 1)]), + default: G(() => [pr(J(Z(L)("btn.markAllRead", "Mark all read")), 1)]), _: 1 }, 8, ["title"])])]), - H("div", Py, [ - J(p, { + H("div", ub, [ + U(p, { ref_key: "messageTabBtnRef", ref: i, type: "button", @@ -20195,7 +20711,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-controls": "mjr-messages-panel", id: "mjr-messages-tab" }, { - default: U(() => [H("span", null, q(X(R)("label.messages", "Messages")), 1), H("span", { + default: G(() => [H("span", null, J(Z(L)("label.messages", "Messages")), 1), H("span", { ref_key: "messageTabBadgeRef", ref: a, class: "mjr-tab-count-badge", @@ -20204,7 +20720,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, null, 512)]), _: 1 }, 512), - J(p, { + U(p, { ref_key: "historyTabBtnRef", ref: o, type: "button", @@ -20216,8 +20732,8 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-controls": "mjr-history-panel", id: "mjr-history-tab" }, { - default: U(() => [ - H("span", null, q(X(R)("label.toastHistory", "History")), 1), + default: G(() => [ + H("span", null, J(Z(L)("label.toastHistory", "History")), 1), H("span", { ref_key: "historyTabCountRef", ref: c, @@ -20235,7 +20751,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite ]), _: 1 }, 512), - J(p, { + U(p, { ref_key: "shortcutsTabBtnRef", ref: l, type: "button", @@ -20247,11 +20763,11 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-controls": "mjr-shortcuts-panel", id: "mjr-shortcuts-tab" }, { - default: U(() => [nr(q(X(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), + default: G(() => [pr(J(Z(L)("msg.shortcuts.title", "Shortcut Guide")), 1)]), _: 1 }, 512) ]), - H("div", Fy, [ + H("div", db, [ H("div", { ref_key: "messageListRef", ref: u, @@ -20259,7 +20775,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite id: "mjr-messages-panel", role: "tabpanel", "aria-labelledby": "mjr-messages-tab" - }, [H("div", Iy, q(X(R)("msg.noMessages", "No messages for now.")), 1)], 512), + }, [H("div", fb, J(Z(L)("msg.noMessages", "No messages for now.")), 1)], 512), H("div", { ref_key: "historyPanelRef", ref: d, @@ -20281,22 +20797,22 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite ]) ]), _: 1 - })], 8, ky); + })], 8, ab); }; } -}), zy = { class: "mjr-am-header-row" }, By = { class: "mjr-am-header-left" }, Vy = { class: "mjr-am-header-title" }, Hy = ["data-mjr-version-channel", "title"], Uy = { class: "mjr-tabs" }, Wy = { class: "mjr-am-header-tools" }, Gy = { +}), hb = { class: "mjr-am-header-row" }, gb = { class: "mjr-am-header-left" }, _b = { class: "mjr-am-header-title" }, vb = ["data-mjr-version-channel", "title"], yb = { class: "mjr-tabs" }, bb = { class: "mjr-am-header-tools" }, xb = { class: "mjr-popover-anchor", style: { display: "none" } -}, Ky = { class: "mjr-popover-anchor" }, qy = { class: "mjr-popover-anchor" }, Jy = { class: "mjr-popover-anchor" }, Yy = { class: "mjr-popover-anchor" }, Xy = { class: "mjr-popover-anchor" }, Zy = "mjr-am-version-badge-label", Qy = "V", $y = /* @__PURE__ */ dr({ +}, Sb = { class: "mjr-popover-anchor" }, Cb = { class: "mjr-popover-anchor" }, wb = { class: "mjr-popover-anchor" }, Tb = { class: "mjr-popover-anchor" }, Eb = { class: "mjr-popover-anchor" }, Db = "mjr-am-version-badge-label", Ob = "V", kb = /* @__PURE__ */ tr({ __name: "HeaderSection", - setup(t, { expose: n }) { - let r = null; - function i() { - return r ||= Promise.resolve({}).catch((e) => { - throw r = null, e; - }), r; + setup(e, { expose: t }) { + let n = null; + function r() { + return n ||= Promise.resolve({}).catch((e) => { + throw n = null, e; + }), n; } - function a(e, t = "") { + function i(e, t = "") { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(); return [ "nightly", @@ -20305,7 +20821,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "experimental" ].some((e) => n.includes(e) || r.includes(e)) || n.includes("+") || n.length > 10 && /^[a-f0-9]+$/i.test(n); } - function o() { + function a() { try { if (typeof window < "u" && window?.MajoorAssetsManagerBranch) return String(window.MajoorAssetsManagerBranch); } catch (e) { @@ -20318,19 +20834,19 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } return ""; } - let s = { + let o = { name_asc: "pi pi-sort-alpha-down", name_desc: "pi pi-sort-alpha-up", mtime_asc: "pi pi-sort-amount-up-alt", rating_desc: "pi pi-star-fill", size_desc: "pi pi-sort-numeric-down-alt", size_asc: "pi pi-sort-numeric-up-alt" - }, c = dh(), l = o() === "nightly", u = Z(null), d = Z(null), f = Z(null), p = Z(null), m = Z(null), h = Z(null), g = Z(null), _ = Z(null), v = Z(null), y = Z(null), b = Z(null), x = Z(null), S = Z(null), C = Z(null), w = Z(null), T = Z(null), E = Z(null), D = Z(null), O = Z(null), k = Z(null), A = Z(null), j = Z(null), M = Z(null), N = Z(null), ee = Z(null), te = Z(null), P = (e) => e?.$el || e || null, ne = Z(l ? "nightly" : "v?"), F = Z(l ? "nightly" : "stable"), re = Z(!1), ie = Z(!1), ae = G(() => s[c.sort] ?? "pi pi-sort-amount-down"), oe = G(() => String(c.viewScope || c.scope || "output").toLowerCase()), se = G(() => oe.value === "similar" || Array.isArray(c.similarResults) && c.similarResults.length > 0 || !!c.similarTitle), ce = G(() => { - let e = String(c.similarSourceAssetId || ""); + }, s = Vh(), c = a() === "nightly", l = Q(null), u = Q(null), d = Q(null), f = Q(null), m = Q(null), h = Q(null), g = Q(null), v = Q(null), y = Q(null), b = Q(null), x = Q(null), S = Q(null), C = Q(null), w = Q(null), T = Q(null), E = Q(null), D = Q(null), O = Q(null), k = Q(null), A = Q(null), ee = Q(null), j = Q(null), M = Q(null), N = Q(null), te = Q(null), ne = Q(null), P = (e) => e?.$el || e || null, re = Q(c ? "nightly" : "v?"), I = Q(c ? "nightly" : "stable"), ie = Q(!1), ae = Q(!1), oe = K(() => o[s.sort] ?? "pi pi-sort-amount-down"), se = K(() => String(s.viewScope || s.scope || "output").toLowerCase()), ce = K(() => se.value === "similar" || Array.isArray(s.similarResults) && s.similarResults.length > 0 || !!s.similarTitle), le = K(() => { + let e = String(s.similarSourceAssetId || ""); return e.startsWith("stack:") || e.startsWith("duplicates:") || e.startsWith("group:") || e.startsWith("node:") ? "group" : "similar"; - }), ue = G(() => ce.value === "group" ? R("tab.group", "Group") : R("tab.similar", "Similar")), de = G(() => ce.value === "group" ? R("tooltip.tab.group", "Browse current grouped assets") : R("tooltip.tab.similar", "Browse current similar findings")), fe = { + }), ue = K(() => le.value === "group" ? L("tab.group", "Group") : L("tab.similar", "Similar")), de = K(() => le.value === "group" ? L("tooltip.tab.group", "Browse current grouped assets") : L("tooltip.tab.similar", "Browse current similar findings")), fe = { get tabAll() { - return P(A.value); + return P(ee.value); }, get tabInputs() { return P(j.value); @@ -20342,48 +20858,48 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite return P(N.value); }, get tabWorkflow() { - return P(ee.value); + return P(te.value); }, get tabSimilar() { - return P(te.value); + return P(ne.value); } - }, me = G(() => ({ + }, pe = K(() => ({ position: "relative", fontSize: "10px", - opacity: re.value ? "1" : "0.6", + opacity: ie.value ? "1" : "0.6", marginLeft: "6px", padding: "2px 5px", borderRadius: "4px", - background: re.value ? "rgba(255,255,255,0.15)" : "rgba(255,255,255,0.08)", + background: ie.value ? "rgba(255,255,255,0.15)" : "rgba(255,255,255,0.08)", color: "inherit", textDecoration: "none", cursor: "pointer", transition: "opacity 0.2s, background 0.2s", verticalAlign: "middle" - })), he = G(() => ie.value ? R("tooltip.closeMFV", "Close Majoor Floating Viewer") : R("tooltip.openMFV", "Open Majoor Floating Viewer")), ge = G(() => "pi pi-eye"), _e = G(() => R("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings")); + })), he = K(() => ae.value ? L("tooltip.closeMFV", "Close Majoor Floating Viewer") : L("tooltip.openMFV", "Open Majoor Floating Viewer")), ge = K(() => "pi pi-eye"), _e = K(() => L("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings")); async function ve() { - let t = Ie(); - if (!t || typeof t != "object") { - I(R("toast.workflowSerializeFailed", "Could not read the current ComfyUI workflow."), "error"); + let e = _(); + if (!e || typeof e != "object") { + F(L("toast.workflowSerializeFailed", "Could not read the current ComfyUI workflow."), "error"); return; } - let n = await S_({ - workflow: t, - name: String(t?.name || t?.title || "workflow").trim() - }), r = String(n?.name || "").trim(); - if (!r) return; - let i = await e({ - workflow: t, - name: r, - task: n?.task || "", - model_family: n?.model_family || "", - provider: n?.provider || "", - runs_on: n?.runs_on || "", - notes: n?.notes || "" + let t = await Q_({ + workflow: e, + name: String(e?.name || e?.title || "workflow").trim() + }), n = String(t?.name || "").trim(); + if (!n) return; + let r = await z({ + workflow: e, + name: n, + task: t?.task || "", + model_family: t?.model_family || "", + provider: t?.provider || "", + runs_on: t?.runs_on || "", + notes: t?.notes || "" }, { timeoutMs: 3e4 }); - if (!i?.ok) I(i?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + if (!r?.ok) F(r?.error || L("toast.workflowSaveFailed", "Failed to save workflow."), "error"); else { - I(R("toast.workflowSaved", "Workflow saved"), "success", 1800); + F(L("toast.workflowSaved", "Workflow saved"), "success", 1800); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-save" } })); } catch (e) { @@ -20394,33 +20910,33 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite async function ye() { let e = ""; try { - let t = await pe(lt.BROWSE_FOLDER, {}); + let t = await me(p.BROWSE_FOLDER, {}); t?.ok && (e = String(t?.data?.path || "").trim()); } catch (e) { console.debug?.(e); } if (!e) { - let t = await Et(R("dialog.enterWorkflowRootPath", "Workflow root folder"), "", R("tab.workflow", "Workflow")); + let t = await wt(L("dialog.enterWorkflowRootPath", "Workflow root folder"), "", L("tab.workflow", "Workflow")); e = String(t || "").trim(); } if (!e) return; - let t = await je(e, { timeoutMs: 3e4 }); - if (!t?.ok) I(t?.error || R("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); + let t = await ke(e, { timeoutMs: 3e4 }); + if (!t?.ok) F(t?.error || L("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); else { try { - let n = Xt(); - n.paths = n.paths || {}, n.paths.workflowRoots = String(t?.data?.workflow_roots_text || e).trim(), Dn(n), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { + let n = Mt(); + n.paths = n.paths || {}, n.paths.workflowRoots = String(t?.data?.workflow_roots_text || e).trim(), bt(n), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { key: "paths.workflowRoots", value: e } })), window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-root-pick" } })); } catch (e) { console.debug?.(e); } - I(R("toast.workflowRootsSaved", "Workflow roots saved"), "success", 1800); + F(L("toast.workflowRootsSaved", "Workflow roots saved"), "success", 1800); } } function be() { - let e = S.value; + let e = C.value; if (e) try { e.value = "", e.click(); } catch (e) { @@ -20439,30 +20955,30 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, r.onerror = () => n(r.error || /* @__PURE__ */ Error("Failed to read workflow file")), r.readAsText(e, "utf-8"); }); } - async function Se(t) { - let n = Array.from(t?.target?.files || []).filter((e) => String(e?.name || "").toLowerCase().endsWith(".json")); - if (!n.length) return; - let r = 0; - for (let t of n) try { - let n = await xe(t); - if (!n || typeof n != "object") { - I(R("toast.workflowImportInvalid", "Invalid workflow JSON."), "error"); + async function Se(e) { + let t = Array.from(e?.target?.files || []).filter((e) => String(e?.name || "").toLowerCase().endsWith(".json")); + if (!t.length) return; + let n = 0; + for (let e of t) try { + let t = await xe(e); + if (!t || typeof t != "object") { + F(L("toast.workflowImportInvalid", "Invalid workflow JSON."), "error"); continue; } - let i = String(t.name || "workflow.json").replace(/\.json$/i, "").trim() || "workflow", a = await e({ - workflow: n, - name: i + let r = String(e.name || "workflow.json").replace(/\.json$/i, "").trim() || "workflow", i = await z({ + workflow: t, + name: r }, { timeoutMs: 3e4 }); - if (!a?.ok) { - I(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + if (!i?.ok) { + F(i?.error || L("toast.workflowSaveFailed", "Failed to save workflow."), "error"); continue; } - r += 1; + n += 1; } catch (e) { - console.debug?.(e), I(R("toast.workflowImportInvalid", "Invalid workflow JSON."), "error"); + console.debug?.(e), F(L("toast.workflowImportInvalid", "Invalid workflow JSON."), "error"); } - if (r > 0) { - I(r === 1 ? R("toast.workflowImported", "Workflow imported") : R("toast.workflowsImported", "{count} workflows imported", { count: r }), "success", 1800); + if (n > 0) { + F(n === 1 ? L("toast.workflowImported", "Workflow imported") : L("toast.workflowsImported", "{count} workflows imported", { count: n }), "success", 1800); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-import" } })); } catch (e) { @@ -20471,25 +20987,25 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } } function Ce(e, { channel: t = "" } = {}) { - ne.value = String(e || ""), t && (F.value = t); + re.value = String(e || ""), t && (I.value = t); } function we(e) { - i().then((t) => { - let n = F.value.toLowerCase() === "nightly" || ne.value.toLowerCase() === "nightly"; + r().then((t) => { + let n = I.value.toLowerCase() === "nightly" || re.value.toLowerCase() === "nightly"; if (!e && !n) { let e = (typeof t?.version == "string" ? t.version.trim() : "") || ""; e && Ce(`v${e}`, { channel: "stable" }); } }).catch(() => { - r = null; + n = null; }); } async function Te(e) { try { - let t = await le(lt.VERSION, { cache: "no-cache" }); + let t = await Pe(p.VERSION, { cache: "no-cache" }); if (!t?.ok) return; let n = String(t.data?.version || "").trim(); - if (a(n, String(t.data?.branch || "").trim().toLowerCase()) || e) { + if (i(n, String(t.data?.branch || "").trim().toLowerCase()) || e) { Ce("nightly", { channel: "nightly" }); return; } @@ -20498,7 +21014,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } function Ee() { try { - zt(P(_.value), he.value, Qy); + Vt(P(v.value), he.value, Ob); } catch (e) { console.debug?.(e); } @@ -20506,19 +21022,19 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite function De() { try { if (typeof document > "u") return; - ie.value = !!document.querySelector(".mjr-mfv.is-visible"); + ae.value = !!document.querySelector(".mjr-mfv.is-visible"); } catch (e) { console.debug?.(e); } } function Oe(e) { - ie.value = !!e?.detail?.visible; - } - function ke() { - window.dispatchEvent(new CustomEvent(B.MFV_TOGGLE)); + ae.value = !!e?.detail?.visible; } function Ae() { - Yn(); + window.dispatchEvent(new CustomEvent(B.MFV_TOGGLE)); + } + function je() { + Ut(); } function Me() { try { @@ -20527,38 +21043,38 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite console.debug?.(e); } } - return cr(ie, () => { + return or(ae, () => { Ee(); - }), Ar(async () => { - await lr(), De(), Ee(), we(l), Te(l); + }), Zn(async () => { + await qn(), De(), Ee(), we(c), Te(c); try { typeof window < "u" && window.addEventListener(B.MFV_VISIBILITY_CHANGED, Oe); } catch (e) { console.debug?.(e); } try { - u.value._mjrVersionUpdateCleanup = Me; + l.value._mjrVersionUpdateCleanup = Me; } catch (e) { console.debug?.(e); } - }), rr(() => { + }), ir(() => { Me(); - }), n({ + }), t({ isVueHeader: !0, get header() { - return u.value; + return l.value; }, get headerActions() { - return d.value; + return u.value; }, get tabButtons() { return fe; }, get customMenuBtn() { - return P(f.value); + return P(d.value); }, get filterBtn() { - return P(p.value); + return P(f.value); }, get sortBtn() { return P(m.value); @@ -20570,322 +21086,322 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite return P(g.value); }, get messageBtn() { - return P(v.value); - }, - get settingsBtn() { return P(y.value); }, + get settingsBtn() { + return P(b.value); + }, get customPopover() { - return O.value?.$el ?? null; + return k.value?.$el ?? null; }, get customSelect() { - return O.value?.customSelect ?? null; + return k.value?.customSelect ?? null; }, get customAddBtn() { - return O.value?.customAddBtn ?? null; + return k.value?.customAddBtn ?? null; }, get customRemoveBtn() { - return O.value?.customRemoveBtn ?? null; + return k.value?.customRemoveBtn ?? null; }, get filterPopover() { - return T.value?.$el ?? null; + return E.value?.$el ?? null; }, get kindSelect() { - return T.value?.kindSelect ?? null; + return E.value?.kindSelect ?? null; }, get wfCheckbox() { - return T.value?.wfCheckbox ?? null; + return E.value?.wfCheckbox ?? null; }, get workflowTypeSelect() { - return T.value?.workflowTypeSelect ?? null; + return E.value?.workflowTypeSelect ?? null; }, get workflowIdInput() { - return T.value?.workflowIdInput ?? null; + return E.value?.workflowIdInput ?? null; }, get workflowModelInput() { - return T.value?.workflowModelInput ?? null; + return E.value?.workflowModelInput ?? null; }, get workflowRunsOnSelect() { - return T.value?.workflowRunsOnSelect ?? null; + return E.value?.workflowRunsOnSelect ?? null; }, get ratingSelect() { - return T.value?.ratingSelect ?? null; + return E.value?.ratingSelect ?? null; }, get minSizeInput() { - return T.value?.minSizeInput ?? null; + return E.value?.minSizeInput ?? null; }, get maxSizeInput() { - return T.value?.maxSizeInput ?? null; + return E.value?.maxSizeInput ?? null; }, get resolutionPresetSelect() { - return T.value?.resolutionPresetSelect ?? null; + return E.value?.resolutionPresetSelect ?? null; }, get minWidthInput() { - return T.value?.minWidthInput ?? null; + return E.value?.minWidthInput ?? null; }, get minHeightInput() { - return T.value?.minHeightInput ?? null; + return E.value?.minHeightInput ?? null; }, get maxWidthInput() { - return T.value?.maxWidthInput ?? null; + return E.value?.maxWidthInput ?? null; }, get maxHeightInput() { - return T.value?.maxHeightInput ?? null; + return E.value?.maxHeightInput ?? null; }, get dateRangeSelect() { - return T.value?.dateRangeSelect ?? null; + return E.value?.dateRangeSelect ?? null; }, get dateExactInput() { - return T.value?.dateExactInput ?? null; + return E.value?.dateExactInput ?? null; }, get agendaContainer() { - return T.value?.agendaContainer ?? null; + return E.value?.agendaContainer ?? null; }, get sortPopover() { - return w.value?.$el ?? null; + return T.value?.$el ?? null; }, sortMenu: document.createElement("div"), get collectionsPopover() { - return E.value?.$el ?? null; - }, - get refreshCollectionsPopover() { - return E.value?.refresh ?? null; - }, - get pinnedFoldersPopover() { return D.value?.$el ?? null; }, + get refreshCollectionsPopover() { + return D.value?.refresh ?? null; + }, + get pinnedFoldersPopover() { + return O.value?.$el ?? null; + }, get pinnedFoldersController() { - return D.value ?? null; + return O.value ?? null; }, get pinnedFoldersMenu() { - return D.value?.pinnedFoldersMenu ?? null; + return O.value?.pinnedFoldersMenu ?? null; }, get messagePopover() { - return k.value?.$el ?? null; + return A.value?.$el ?? null; }, get messagePopoverTitle() { - return k.value?.title ?? null; + return A.value?.title ?? null; }, get messageTabBtn() { - return k.value?.messageTabBtn ?? null; + return A.value?.messageTabBtn ?? null; }, get messageTabBadge() { - return k.value?.messageTabBadge ?? null; + return A.value?.messageTabBadge ?? null; }, get historyTabBtn() { - return k.value?.historyTabBtn ?? null; + return A.value?.historyTabBtn ?? null; }, get historyTabBadge() { - return k.value?.historyTabBadge ?? null; + return A.value?.historyTabBadge ?? null; }, get historyTabCount() { - return k.value?.historyTabCount ?? null; + return A.value?.historyTabCount ?? null; }, get historyPanel() { - return k.value?.historyPanel ?? null; + return A.value?.historyPanel ?? null; }, get shortcutsTabBtn() { - return k.value?.shortcutsTabBtn ?? null; + return A.value?.shortcutsTabBtn ?? null; }, get messageList() { - return k.value?.messageList ?? null; + return A.value?.messageList ?? null; }, get shortcutsPanel() { - return k.value?.shortcutsPanel ?? null; + return A.value?.shortcutsPanel ?? null; }, get markReadBtn() { - return k.value?.markReadBtn ?? null; + return A.value?.markReadBtn ?? null; }, get searchSection() { - return C.value?.searchSection ?? null; + return w.value?.searchSection ?? null; }, get searchInputEl() { - return C.value?.searchInputEl ?? null; + return w.value?.searchInputEl ?? null; }, get similarBtn() { - return C.value?.similarBtn ?? null; + return w.value?.similarBtn ?? null; }, get similarPopover() { - return C.value?.similarPopover ?? null; + return w.value?.similarPopover ?? null; }, get similarFindBtn() { - return C.value?.similarFindBtn ?? null; + return w.value?.similarFindBtn ?? null; }, get similarDuplicatesBtn() { - return C.value?.similarDuplicatesBtn ?? null; + return w.value?.similarDuplicatesBtn ?? null; }, get similarSameNodeBtn() { - return C.value?.similarSameNodeBtn ?? null; + return w.value?.similarSameNodeBtn ?? null; }, get similarSameWorkflowBtn() { - return C.value?.similarSameWorkflowBtn ?? null; + return w.value?.similarSameWorkflowBtn ?? null; }, setSemanticEnabled(e) { - C.value?.setSemanticEnabled?.(e); + w.value?.setSemanticEnabled?.(e); }, _headerDispose: Me }), (e, t) => { - let n = ar("MButton"); - return K(), Y(V, null, [H("div", { + let n = Qn("MButton"); + return q(), Y(V, null, [H("div", { ref_key: "headerRef", - ref: u, + ref: l, class: "mjr-am-header" - }, [H("div", zy, [H("div", By, [ + }, [H("div", hb, [H("div", gb, [ t[2] ||= H("i", { class: "mjr-am-header-icon pi pi-folder", "aria-hidden": "true" }, null, -1), - H("div", Vy, q(X(R)("manager.title")), 1), + H("div", _b, J(Z(L)("manager.title")), 1), H("a", { href: "https://ko-fi.com/majoorwaldi", target: "_blank", rel: "noopener noreferrer", class: "mjr-am-version-badge", - "data-mjr-version-channel": F.value, - title: X(R)("tooltip.supportKofi"), - style: xr(me.value), - onMouseenter: t[0] ||= (e) => re.value = !0, - onMouseleave: t[1] ||= (e) => re.value = !1 - }, [H("span", { class: Q(Zy) }, q(ne.value), 1)], 44, Hy) + "data-mjr-version-channel": I.value, + title: Z(L)("tooltip.supportKofi"), + style: fr(pe.value), + onMouseenter: t[0] ||= (e) => ie.value = !0, + onMouseleave: t[1] ||= (e) => ie.value = !1 + }, [H("span", { class: X(Db) }, J(re.value), 1)], 44, vb) ]), H("div", { ref_key: "headerActionsRef", - ref: d, + ref: u, class: "mjr-am-header-actions" - }, [H("div", Uy, [ - J(n, { + }, [H("div", yb, [ + U(n, { ref_key: "tabAllRef", - ref: A, + ref: ee, type: "button", - class: Q(["mjr-tab", { "is-active": oe.value === "all" }]), + class: X(["mjr-tab", { "is-active": se.value === "all" }]), severity: "secondary", text: "", "data-scope": "all", - title: X(R)("tooltip.tab.all") + title: Z(L)("tooltip.tab.all") }, { - default: U(() => [nr(q(X(R)("tab.all")), 1)]), + default: G(() => [pr(J(Z(L)("tab.all")), 1)]), _: 1 }, 8, ["class", "title"]), - J(n, { + U(n, { ref_key: "tabInputsRef", ref: j, type: "button", - class: Q(["mjr-tab", { "is-active": oe.value === "input" }]), + class: X(["mjr-tab", { "is-active": se.value === "input" }]), severity: "secondary", text: "", "data-scope": "input", - title: X(R)("tooltip.tab.input") + title: Z(L)("tooltip.tab.input") }, { - default: U(() => [nr(q(X(R)("tab.input")), 1)]), + default: G(() => [pr(J(Z(L)("tab.input")), 1)]), _: 1 }, 8, ["class", "title"]), - J(n, { + U(n, { ref_key: "tabOutputsRef", ref: M, type: "button", - class: Q(["mjr-tab", { "is-active": oe.value === "output" }]), + class: X(["mjr-tab", { "is-active": se.value === "output" }]), severity: "secondary", text: "", "data-scope": "output", - title: X(R)("tooltip.tab.output") + title: Z(L)("tooltip.tab.output") }, { - default: U(() => [nr(q(X(R)("tab.output")), 1)]), + default: G(() => [pr(J(Z(L)("tab.output")), 1)]), _: 1 }, 8, ["class", "title"]), - J(n, { + U(n, { ref_key: "tabCustomRef", ref: N, type: "button", - class: Q(["mjr-tab", { "is-active": oe.value === "custom" }]), + class: X(["mjr-tab", { "is-active": se.value === "custom" }]), severity: "secondary", text: "", "data-scope": "custom", - title: X(R)("tooltip.tab.custom") + title: Z(L)("tooltip.tab.custom") }, { - default: U(() => [nr(q(X(R)("tab.custom")), 1)]), + default: G(() => [pr(J(Z(L)("tab.custom")), 1)]), _: 1 }, 8, ["class", "title"]), - J(n, { + U(n, { ref_key: "tabWorkflowRef", - ref: ee, + ref: te, type: "button", - class: Q(["mjr-tab", { "is-active": oe.value === "workflow" }]), + class: X(["mjr-tab", { "is-active": se.value === "workflow" }]), severity: "secondary", text: "", "data-scope": "workflow", - title: X(R)("tooltip.tab.workflow", "Browse saved workflows") + title: Z(L)("tooltip.tab.workflow", "Browse saved workflows") }, { - default: U(() => [nr(q(X(R)("tab.workflow", "Workflow")), 1)]), + default: G(() => [pr(J(Z(L)("tab.workflow", "Workflow")), 1)]), _: 1 }, 8, ["class", "title"]), - J(n, { + U(n, { ref_key: "tabSimilarRef", - ref: te, + ref: ne, type: "button", - class: Q(["mjr-tab", { "is-active": oe.value === "similar" }]), + class: X(["mjr-tab", { "is-active": se.value === "similar" }]), severity: "secondary", text: "", "data-scope": "similar", - style: xr({ display: se.value ? "" : "none" }), + style: fr({ display: ce.value ? "" : "none" }), title: de.value }, { - default: U(() => [nr(q(ue.value), 1)]), + default: G(() => [pr(J(ue.value), 1)]), _: 1 }, 8, [ "class", "style", "title" ]) - ]), H("div", Wy, [ - oe.value === "workflow" ? (K(), ir(n, { + ]), H("div", bb, [ + se.value === "workflow" ? (q(), Jn(n, { key: 0, ref_key: "saveWorkflowBtnRef", - ref: b, + ref: x, type: "button", class: "mjr-icon-btn mjr-save-workflow-btn", severity: "secondary", text: "", rounded: "", - title: X(R)("tooltip.saveCurrentWorkflow", "Save current workflow"), - "aria-label": X(R)("tooltip.saveCurrentWorkflow", "Save current workflow"), + title: Z(L)("tooltip.saveCurrentWorkflow", "Save current workflow"), + "aria-label": Z(L)("tooltip.saveCurrentWorkflow", "Save current workflow"), onClick: ve }, { - default: U(() => [...t[3] ||= [H("i", { + default: G(() => [...t[3] ||= [H("i", { class: "pi pi-save", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : W("", !0), - oe.value === "workflow" ? (K(), ir(n, { + se.value === "workflow" ? (q(), Jn(n, { key: 1, ref_key: "pickWorkflowRootBtnRef", - ref: x, + ref: S, type: "button", class: "mjr-icon-btn mjr-pick-workflow-root-btn", severity: "secondary", text: "", rounded: "", - title: X(R)("tooltip.pickWorkflowRoot", "Pick saved workflow root"), - "aria-label": X(R)("tooltip.pickWorkflowRoot", "Pick saved workflow root"), + title: Z(L)("tooltip.pickWorkflowRoot", "Pick saved workflow root"), + "aria-label": Z(L)("tooltip.pickWorkflowRoot", "Pick saved workflow root"), onClick: ye }, { - default: U(() => [...t[4] ||= [H("i", { + default: G(() => [...t[4] ||= [H("i", { class: "pi pi-folder-plus", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : W("", !0), - oe.value === "workflow" ? (K(), ir(n, { + se.value === "workflow" ? (q(), Jn(n, { key: 2, type: "button", class: "mjr-icon-btn mjr-import-workflow-btn", severity: "secondary", text: "", rounded: "", - title: X(R)("tooltip.importWorkflow", "Import workflow"), - "aria-label": X(R)("tooltip.importWorkflow", "Import workflow"), + title: Z(L)("tooltip.importWorkflow", "Import workflow"), + "aria-label": Z(L)("tooltip.importWorkflow", "Import workflow"), onClick: be }, { - default: U(() => [...t[5] ||= [H("i", { + default: G(() => [...t[5] ||= [H("i", { class: "pi pi-upload", "aria-hidden": "true" }, null, -1)]]), @@ -20893,47 +21409,47 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, 8, ["title", "aria-label"])) : W("", !0), H("input", { ref_key: "importWorkflowInputRef", - ref: S, + ref: C, type: "file", accept: ".json,application/json", multiple: "", style: { display: "none" }, onChange: Se }, null, 544), - H("div", Gy, [J(n, { + H("div", xb, [U(n, { ref_key: "customMenuBtnRef", - ref: f, + ref: d, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", - title: X(R)("tooltip.browserFolders"), - "aria-label": X(R)("tooltip.browserFolders") + title: Z(L)("tooltip.browserFolders"), + "aria-label": Z(L)("tooltip.browserFolders") }, { - default: U(() => [...t[6] ||= [H("i", { + default: G(() => [...t[6] ||= [H("i", { class: "pi pi-folder-open", "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), J(Oy, { + }, 8, ["title", "aria-label"]), U(ib, { ref_key: "customPopoverRef", - ref: O + ref: k }, null, 512)]), - J(n, { + U(n, { ref_key: "mfvBtnRef", - ref: _, + ref: v, type: "button", - class: Q(["mjr-icon-btn", { "mjr-mfv-btn-active": ie.value }]), + class: X(["mjr-icon-btn", { "mjr-mfv-btn-active": ae.value }]), severity: "secondary", text: "", rounded: "", title: he.value, "aria-label": he.value, - onClick: ke + onClick: Ae }, { - default: U(() => [H("i", { - class: Q(ge.value), + default: G(() => [H("i", { + class: X(ge.value), "aria-hidden": "true" }, null, 2)]), _: 1 @@ -20942,18 +21458,18 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "title", "aria-label" ]), - H("div", Ky, [J(n, { + H("div", Sb, [U(n, { ref_key: "messageBtnRef", - ref: v, + ref: y, type: "button", class: "mjr-icon-btn mjr-message-btn", severity: "secondary", text: "", rounded: "", - title: X(R)("tooltip.openMessages", "Messages and updates"), - "aria-label": X(R)("tooltip.openMessages", "Messages and updates") + title: Z(L)("tooltip.openMessages", "Messages and updates"), + "aria-label": Z(L)("tooltip.openMessages", "Messages and updates") }, { - default: U(() => [...t[7] ||= [H("i", { + default: G(() => [...t[7] ||= [H("i", { class: "pi pi-info-circle", "aria-hidden": "true" }, null, -1), H("span", { @@ -20962,13 +21478,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), J(Ry, { + }, 8, ["title", "aria-label"]), U(mb, { ref_key: "messagePopoverRef", - ref: k + ref: A }, null, 512)]), - J(n, { + U(n, { ref_key: "settingsBtnRef", - ref: y, + ref: b, type: "button", class: "mjr-icon-btn mjr-settings-shortcut-btn", severity: "secondary", @@ -20976,39 +21492,39 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite rounded: "", title: _e.value, "aria-label": _e.value, - onClick: Ae + onClick: je }, { - default: U(() => [...t[8] ||= [H("i", { + default: G(() => [...t[8] ||= [H("i", { class: "pi pi-cog", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]) - ])], 512)])], 512), J(R_, { + ])], 512)])], 512), U(mv, { ref_key: "searchBarRef", - ref: C + ref: w }, { - "filter-anchor": U(() => [H("div", qy, [J(n, { + "filter-anchor": G(() => [H("div", Cb, [U(n, { ref_key: "filterBtnRef", - ref: p, + ref: f, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", - title: X(R)("label.filters"), - "aria-label": X(R)("label.filters") + title: Z(L)("label.filters"), + "aria-label": Z(L)("label.filters") }, { - default: U(() => [...t[9] ||= [H("i", { + default: G(() => [...t[9] ||= [H("i", { class: "pi pi-filter", "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), J(Iv, { + }, 8, ["title", "aria-label"]), U(fy, { ref_key: "filterPopoverRef", - ref: T + ref: E }, null, 512)])]), - "sort-anchor": U(() => [H("div", Jy, [J(n, { + "sort-anchor": G(() => [H("div", wb, [U(n, { ref_key: "sortBtnRef", ref: m, type: "button", @@ -21016,19 +21532,19 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", text: "", rounded: "", - title: X(R)("label.sort"), - "aria-label": X(R)("label.sort") + title: Z(L)("label.sort"), + "aria-label": Z(L)("label.sort") }, { - default: U(() => [H("i", { - class: Q(ae.value), + default: G(() => [H("i", { + class: X(oe.value), "aria-hidden": "true" }, null, 2)]), _: 1 - }, 8, ["title", "aria-label"]), J(V_, { + }, 8, ["title", "aria-label"]), U(_v, { ref_key: "sortPopoverRef", - ref: w + ref: T }, null, 512)])]), - "collections-anchor": U(() => [H("div", Yy, [J(n, { + "collections-anchor": G(() => [H("div", Tb, [U(n, { ref_key: "collectionsBtnRef", ref: h, type: "button", @@ -21036,19 +21552,19 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", text: "", rounded: "", - title: X(R)("label.collections"), - "aria-label": X(R)("label.collections") + title: Z(L)("label.collections"), + "aria-label": Z(L)("label.collections") }, { - default: U(() => [...t[10] ||= [H("i", { + default: G(() => [...t[10] ||= [H("i", { class: "pi pi-bookmark", "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), J(_y, { + }, 8, ["title", "aria-label"]), U(qy, { ref_key: "collectionsPopoverRef", - ref: E + ref: D }, null, 512)])]), - "pinned-folders-anchor": U(() => [H("div", Xy, [J(n, { + "pinned-folders-anchor": G(() => [H("div", Eb, [U(n, { ref_key: "pinnedFoldersBtnRef", ref: g, type: "button", @@ -21056,42 +21572,42 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", text: "", rounded: "", - title: X(R)("tooltip.pinnedFolders"), - "aria-label": X(R)("tooltip.pinnedFolders") + title: Z(L)("tooltip.pinnedFolders"), + "aria-label": Z(L)("tooltip.pinnedFolders") }, { - default: U(() => [...t[11] ||= [H("i", { + default: G(() => [...t[11] ||= [H("i", { class: "pi pi-folder", "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), J(Cy, { + }, 8, ["title", "aria-label"]), U($y, { ref_key: "pinnedFoldersPopoverRef", - ref: D + ref: O }, null, 512)])]), _: 1 }, 512)], 64); }; } -}), eb = (e) => { +}), Ab = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, tb = (e) => { +}, jb = (e) => { let t = String(e || ""); - return R(t === "name_asc" ? "sort.nameAZ" : t === "name_desc" ? "sort.nameZA" : t === "mtime_asc" ? "sort.oldest" : "sort.newest"); -}, nb = (e) => { + return L(t === "name_asc" ? "sort.nameAZ" : t === "name_desc" ? "sort.nameZA" : t === "mtime_asc" ? "sort.oldest" : "sort.newest"); +}, Mb = (e) => { let t = String(e || "").toLowerCase(); - return t === "similar" ? R("scope.similar", "Similar") : t === "custom" ? R("scope.customBrowser") : t === "workflow" ? R("scope.workflow", "Workflow") : R(t === "all" ? "tab.all" : t === "input" || t === "inputs" ? "scope.input" : "scope.output"); + return t === "similar" ? L("scope.similar", "Similar") : t === "custom" ? L("scope.customBrowser") : t === "workflow" ? L("scope.workflow", "Workflow") : L(t === "all" ? "tab.all" : t === "input" || t === "inputs" ? "scope.input" : "scope.output"); }; -function rb({ label: e, value: t, onClear: n } = {}) { +function Nb({ label: e, value: t, onClear: n } = {}) { let r = document.createElement("div"); r.className = "mjr-context-pill"; let i = document.createElement("span"); if (i.className = "mjr-context-pill-text", i.textContent = t != null && String(t).length ? `${e}: ${String(t)}` : String(e || ""), r.appendChild(i), typeof n == "function") { let t = document.createElement("button"); - t.type = "button", t.className = "mjr-context-pill-x", t.title = R("tooltip.clearFilter", { label: e || R("label.filters") }), t.setAttribute("aria-label", R("tooltip.clearFilter", { label: e || R("label.filters") })), t.textContent = "x", t.addEventListener("click", (e) => { + t.type = "button", t.className = "mjr-context-pill-x", t.title = L("tooltip.clearFilter", { label: e || L("label.filters") }), t.setAttribute("aria-label", L("tooltip.clearFilter", { label: e || L("label.filters") })), t.textContent = "x", t.addEventListener("click", (e) => { try { e.preventDefault(), e.stopPropagation(); } catch (e) { @@ -21106,93 +21622,93 @@ function rb({ label: e, value: t, onClear: n } = {}) { } return r; } -function ib() { +function Pb() { let e = document.createElement("div"); return e.className = "mjr-am-context-pills", { wrap: e, update: ({ state: t, rawQuery: n = "", actions: r = null } = {}) => { - let i = r && typeof r == "object" ? r : {}, a = eb(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(eb(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || eb(t?.workflowType || "").trim() || eb(t?.workflowId || "").trim() || eb(t?.workflowModelFilter || "").trim() || eb(t?.workflowRunsOnFilter || "").trim() || eb(t?.dateRangeFilter || "").trim() || eb(t?.dateExactFilter || "").trim()), c = eb(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = eb(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = eb(t?.similarSourceAssetId || "").trim(); + let i = r && typeof r == "object" ? r : {}, a = Ab(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(Ab(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || Ab(t?.workflowType || "").trim() || Ab(t?.workflowId || "").trim() || Ab(t?.workflowModelFilter || "").trim() || Ab(t?.workflowRunsOnFilter || "").trim() || Ab(t?.dateRangeFilter || "").trim() || Ab(t?.dateExactFilter || "").trim()), c = Ab(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = Ab(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = Ab(t?.similarSourceAssetId || "").trim(); if (o || s || c || l || p || d || e.childElementCount) { try { e.replaceChildren(); } catch (e) { console.debug?.(e); } - if (!f && l && e.appendChild(rb({ - label: R("label.collections"), - value: eb(t?.collectionName || t?.collectionId || "").trim(), + if (!f && l && e.appendChild(Nb({ + label: L("label.collections"), + value: Ab(t?.collectionName || t?.collectionId || "").trim(), onClear: () => i?.clearCollection?.() - })), d && e.appendChild(rb({ - label: R("search.findSimilar", "Find Similar"), - value: m ? R("search.similarReference", "Reference #{id}", { id: m }) : R("scope.similar", "Similar"), + })), d && e.appendChild(Nb({ + label: L("search.findSimilar", "Find Similar"), + value: m ? L("search.similarReference", "Reference #{id}", { id: m }) : L("scope.similar", "Similar"), onClear: () => i?.clearSimilarScope?.() - })), p && e.appendChild(rb({ - label: R("label.scope"), - value: nb(u || "output"), + })), p && e.appendChild(Nb({ + label: L("label.scope"), + value: Mb(u || "output"), onClear: () => d ? i?.clearSimilarScope?.() : i?.clearScope?.() - })), o && e.appendChild(rb({ - label: R("label.query"), + })), o && e.appendChild(Nb({ + label: L("label.query"), value: a, onClear: () => i?.clearQuery?.() - })), eb(t?.kindFilter || "").trim() && e.appendChild(rb({ - label: R("label.type"), - value: eb(t?.kindFilter || "").trim(), + })), Ab(t?.kindFilter || "").trim() && e.appendChild(Nb({ + label: L("label.type"), + value: Ab(t?.kindFilter || "").trim(), onClear: () => i?.clearKind?.() - })), Number(t?.minRating || 0) > 0 && e.appendChild(rb({ - label: R("label.rating"), + })), Number(t?.minRating || 0) > 0 && e.appendChild(Nb({ + label: L("label.rating"), value: `>= ${Number(t?.minRating || 0)}`, onClear: () => i?.clearMinRating?.() - })), t?.workflowOnly && e.appendChild(rb({ - label: R("label.workflow"), - value: R("label.only"), + })), t?.workflowOnly && e.appendChild(Nb({ + label: L("label.workflow"), + value: L("label.only"), onClear: () => i?.clearWorkflowOnly?.() - })), eb(t?.workflowType || "").trim() && e.appendChild(rb({ - label: R("label.workflowType"), - value: eb(t?.workflowType || "").trim(), + })), Ab(t?.workflowType || "").trim() && e.appendChild(Nb({ + label: L("label.workflowType"), + value: Ab(t?.workflowType || "").trim(), onClear: () => i?.clearWorkflowType?.() - })), eb(t?.workflowId || "").trim()) { - let n = eb(t?.workflowId || "").trim(); - e.appendChild(rb({ - label: R("label.sameWorkflow", "Generated with Same Workflow"), + })), Ab(t?.workflowId || "").trim()) { + let n = Ab(t?.workflowId || "").trim(); + e.appendChild(Nb({ + label: L("label.sameWorkflow", "Generated with Same Workflow"), value: n.length > 18 ? `${n.slice(0, 8)}...${n.slice(-6)}` : n, onClear: () => i?.clearWorkflowId?.() })); } - if (eb(t?.workflowModelFilter || "").trim() && e.appendChild(rb({ - label: R("label.workflowModelFamily", "Model family"), - value: eb(t?.workflowModelFilter || "").trim(), + if (Ab(t?.workflowModelFilter || "").trim() && e.appendChild(Nb({ + label: L("label.workflowModelFamily", "Model family"), + value: Ab(t?.workflowModelFilter || "").trim(), onClear: () => i?.clearWorkflowModel?.() - })), eb(t?.workflowRunsOnFilter || "").trim() && e.appendChild(rb({ - label: R("label.workflowRunsOn", "Runs on"), - value: eb(t?.workflowRunsOnFilter || "").trim(), + })), Ab(t?.workflowRunsOnFilter || "").trim() && e.appendChild(Nb({ + label: L("label.workflowRunsOn", "Runs on"), + value: Ab(t?.workflowRunsOnFilter || "").trim(), onClear: () => i?.clearWorkflowRunsOn?.() })), (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0) { let n = Number(t?.minSizeMB || 0) || 0, r = Number(t?.maxSizeMB || 0) || 0, a = n > 0 && r > 0 ? `${n}-${r} MB` : n > 0 ? `>= ${n} MB` : `<= ${r} MB`; - e.appendChild(rb({ - label: R("sidebar.size"), + e.appendChild(Nb({ + label: L("sidebar.size"), value: a, onClear: () => i?.clearSize?.() })); } if ((Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0) { let n = String(t?.resolutionCompare || "gte") === "lte", r = Number(n ? t?.maxWidth : t?.minWidth || 0) || 0, a = Number(n ? t?.maxHeight : t?.minHeight || 0) || 0; - e.appendChild(rb({ - label: R("label.resolution"), + e.appendChild(Nb({ + label: L("label.resolution"), value: `${n ? "<=" : ">="} ${r || 0}x${a || 0} px`, onClear: () => i?.clearResolution?.() })); } - eb(t?.dateRangeFilter || "").trim() && e.appendChild(rb({ - label: R("sidebar.date"), - value: eb(t?.dateRangeFilter || "").trim(), + Ab(t?.dateRangeFilter || "").trim() && e.appendChild(Nb({ + label: L("sidebar.date"), + value: Ab(t?.dateRangeFilter || "").trim(), onClear: () => i?.clearDateRange?.() - })), eb(t?.dateExactFilter || "").trim() && e.appendChild(rb({ - label: R("label.day"), - value: eb(t?.dateExactFilter || "").trim(), + })), Ab(t?.dateExactFilter || "").trim() && e.appendChild(Nb({ + label: L("label.day"), + value: Ab(t?.dateExactFilter || "").trim(), onClear: () => i?.clearDateExact?.() - })), c && e.appendChild(rb({ - label: R("label.sort"), - value: tb(t?.sort), + })), c && e.appendChild(Nb({ + label: L("label.sort"), + value: jb(t?.sort), onClear: () => i?.clearSort?.() })); } @@ -21200,17 +21716,17 @@ function ib() { }; } // ui/vue/components/panel/summaryBarState.ts -var ab = (e, t = "") => R(e, t, void 0), ob = (e) => { +var Fb = (e, t = "") => L(e, t, void 0), Ib = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, sb = (e) => { +}, Lb = (e) => { let t = String(e || "").toLowerCase(); - return t === "similar" ? ab("scope.similar", "Similar") : t === "workflow" ? ab("scope.workflow", "Workflow") : ab(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); + return t === "similar" ? Fb("scope.similar", "Similar") : t === "workflow" ? Fb("scope.workflow", "Workflow") : Fb(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); }; -function cb(e) { +function Rb(e) { try { let t = e?._mjrGetRenderedCards; if (typeof t == "function") { @@ -21222,7 +21738,7 @@ function cb(e) { } return []; } -function lb(e) { +function zb(e) { try { let t = String(e?.dataset?.mjrSelectedAssetIds || "").trim(); if (t) { @@ -21239,8 +21755,8 @@ function lb(e) { } return 0; } -function ub({ state: e, gridContainer: t, context: n = null } = {}) { - let r = cb(t), i = (() => { +function Bb({ state: e, gridContainer: t, context: n = null } = {}) { + let r = Rb(t), i = (() => { try { let e = 0; for (let t of r) String(t?._mjrAsset?.kind || "").toLowerCase() === "folder" && (e += 1); @@ -21261,12 +21777,12 @@ function ub({ state: e, gridContainer: t, context: n = null } = {}) { } catch (e) { console.debug?.(e); } - return lb(t); - })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? ab("summary.folders") : ab("summary.assets")}: ${u}`]; - o > 0 && d.push(`${ab("summary.selected")}: ${o}`), d.push(sb(l)); + return zb(t); + })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? Fb("summary.folders") : Fb("summary.assets")}: ${u}`]; + o > 0 && d.push(`${Fb("summary.selected")}: ${o}`), d.push(Lb(l)); try { let e = Number(t?.dataset?.mjrHiddenPngSiblings || 0) || 0; - String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${ab("summary.hidden")}: ${e}`); + String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${Fb("summary.hidden")}: ${e}`); } catch (e) { console.debug?.(e); } @@ -21276,38 +21792,38 @@ function ub({ state: e, gridContainer: t, context: n = null } = {}) { total: s, activeScope: l, summaryText: d.filter(Boolean).join(" | "), - duplicateText: h ? `${ab("summary.duplicates")}: ${p} | ${ab("summary.similar")}: ${m}` : "", + duplicateText: h ? `${Fb("summary.duplicates")}: ${p} | ${Fb("summary.similar")}: ${m}` : "", showDuplicates: h, - rawQuery: ob(n?.rawQuery || "").trim() + rawQuery: Ib(n?.rawQuery || "").trim() }; } // ui/vue/components/panel/SummaryBarSection.vue?vue&type=script&setup=true&lang.ts -var db = { +var Vb = { key: 2, class: "mjr-folder-breadcrumb-separator" -}, fb = { +}, Hb = { key: 0, class: "mjr-folder-breadcrumb-separator" -}, pb = { class: "mjr-am-summary-left" }, mb = { class: "mjr-am-summary-text" }, hb = { class: "mjr-am-summary-right" }, gb = ["aria-label"], _b = /* @__PURE__ */ dr({ +}, Ub = { class: "mjr-am-summary-left" }, Wb = { class: "mjr-am-summary-text" }, Gb = { class: "mjr-am-summary-right" }, Kb = ["aria-label"], qb = /* @__PURE__ */ tr({ __name: "SummaryBarSection", setup(e, { expose: t }) { - let n = dh(), r = Z(null), i = Z(null), a = Z(null), o = Z(""), s = Z(""), c = Z(!1), l = Z(!1), u = Z(null), d = Z(null), f = Z([]), p = ib(), m = G(() => String(n.kindFilter || "").trim().toLowerCase()), h = G(() => { - let e = R("label.type", "Type"); + let n = Vh(), r = Q(null), i = Q(null), a = Q(null), o = Q(""), s = Q(""), c = Q(!1), l = Q(!1), u = Q(null), d = Q(null), f = Q([]), p = Pb(), m = K(() => String(n.kindFilter || "").trim().toLowerCase()), h = K(() => { + let e = L("label.type", "Type"); return [ { kind: "image", icon: "pi pi-image", - title: `${e}: ${R("filter.images", "Images")}` + title: `${e}: ${L("filter.images", "Images")}` }, { kind: "video", icon: "pi pi-video", - title: `${e}: ${R("filter.videos", "Videos")}` + title: `${e}: ${L("filter.videos", "Videos")}` }, { kind: "audio", icon: "pi pi-volume-up", - title: `${e}: ${R("filter.audio", "Audio")}` + title: `${e}: ${L("filter.audio", "Audio")}` }, { kind: "model3d", @@ -21338,7 +21854,7 @@ var db = { t && (n.kindFilter = v(t) ? "" : t, y()); } function x({ state: e, gridContainer: t, context: r = null, actions: i = null } = {}) { - let a = ub({ + let a = Bb({ state: e, gridContainer: t, context: r @@ -21376,7 +21892,7 @@ var db = { console.debug?.(e); } } - return Ar(() => { + return Zn(() => { try { a.value?.appendChild?.(p.wrap); } catch (e) { @@ -21388,14 +21904,14 @@ var db = { folderBreadcrumb: i, setFolderBreadcrumb: S }), (e, t) => { - let n = ar("MButton"); - return K(), Y(V, null, [H("div", { + let n = Qn("MButton"); + return q(), Y(V, null, [H("div", { ref_key: "folderBreadcrumb", ref: i, - class: Q(["mjr-folder-breadcrumb", { "is-visible": l.value }]), + class: X(["mjr-folder-breadcrumb", { "is-visible": l.value }]), "aria-label": "Folder breadcrumb" }, [ - u.value ? (K(), ir(n, { + u.value ? (q(), Jn(n, { key: 0, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21404,10 +21920,10 @@ var db = { disabled: u.value.disabled, onClick: t[0] ||= (e) => C(u.value) }, { - default: U(() => [nr(q(u.value.label), 1)]), + default: G(() => [pr(J(u.value.label), 1)]), _: 1 }, 8, ["disabled"])) : W("", !0), - d.value ? (K(), ir(n, { + d.value ? (q(), Jn(n, { key: 1, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21416,19 +21932,19 @@ var db = { disabled: d.value.disabled, onClick: t[1] ||= (e) => C(d.value) }, { - default: U(() => [nr(q(d.value.label), 1)]), + default: G(() => [pr(J(d.value.label), 1)]), _: 1 }, 8, ["disabled"])) : W("", !0), - u.value || d.value ? (K(), Y("span", db, " | ")) : W("", !0), - (K(!0), Y(V, null, hr(f.value, (e, t) => (K(), Y(V, { key: `${e.target}:${t}` }, [t > 0 ? (K(), Y("span", fb, "/")) : W("", !0), J(n, { + u.value || d.value ? (q(), Y("span", Vb, " | ")) : W("", !0), + (q(!0), Y(V, null, $n(f.value, (e, t) => (q(), Y(V, { key: `${e.target}:${t}` }, [t > 0 ? (q(), Y("span", Hb, "/")) : W("", !0), U(n, { type: "button", - class: Q(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), + class: X(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), severity: "secondary", text: "", disabled: e.current, onClick: (t) => C(e) }, { - default: U(() => [nr(q(e.label), 1)]), + default: G(() => [pr(J(e.label), 1)]), _: 2 }, 1032, [ "class", @@ -21440,15 +21956,15 @@ var db = { ref: r, class: "mjr-am-summary", "aria-live": "polite" - }, [H("div", pb, [H("div", mb, q(o.value), 1)]), H("div", hb, [ + }, [H("div", Ub, [H("div", Wb, J(o.value), 1)]), H("div", Gb, [ H("div", { class: "mjr-media-shortcuts", - "aria-label": X(R)("label.type", "Type"), + "aria-label": Z(L)("label.type", "Type"), role: "group" - }, [(K(!0), Y(V, null, hr(h.value, (e) => (K(), ir(n, { + }, [(q(!0), Y(V, null, $n(h.value, (e) => (q(), Jn(n, { key: e.kind, type: "button", - class: Q(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), + class: X(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), severity: "secondary", text: "", rounded: "", @@ -21457,8 +21973,8 @@ var db = { "aria-pressed": String(v(e.kind)), onClick: (t) => b(e.kind) }, { - default: U(() => [H("i", { - class: Q(e.icon), + default: G(() => [H("i", { + class: X(e.icon), "aria-hidden": "true" }, null, 2)]), _: 2 @@ -21468,8 +21984,8 @@ var db = { "aria-pressed", "class", "onClick" - ]))), 128))], 8, gb), - c.value ? (K(), ir(n, { + ]))), 128))], 8, Kb), + c.value ? (q(), Jn(n, { key: 0, type: "button", class: "mjr-am-dup-alert", @@ -21478,7 +21994,7 @@ var db = { title: s.value, onClick: _ }, { - default: U(() => [nr(q(s.value), 1)]), + default: G(() => [pr(J(s.value), 1)]), _: 1 }, 8, ["title"])) : W("", !0), H("div", { @@ -21490,11 +22006,11 @@ var db = { } }); // ui/vue/composables/useGridContextMenu.ts -function vb(e, t) { +function Jb(e, t) { let n = null; function r(e) { if (e && !e._mjrGridContextMenuBound) try { - n = Ra({ + n = so({ gridContainer: e, getState: t }); @@ -21508,16 +22024,16 @@ function vb(e, t) { } catch {} n = null; } - cr(e, (e, t) => { + or(e, (e, t) => { t && i(), e && r(e); - }, { immediate: !0 }), rr(i); + }, { immediate: !0 }), ir(i); } // ui/vue/composables/useGridKeyboard.ts -function yb(e) { +function Yb(e) { if (!e) return () => {}; let t = e; try { - let n = Ii({ + let n = ea({ gridContainer: e, getState: () => t._mjrGetGridState?.() || {}, getSelectedAssets: () => t._mjrGetSelectedAssets?.() || [], @@ -21535,7 +22051,7 @@ function yb(e) { } catch (e) { console.debug?.("[useGridKeyboard] rect lookup failed", e); } - Ia(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { + oo(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { t._mjrOnKeyboardAssetChanged?.(n); }); } @@ -21552,7 +22068,7 @@ function yb(e) { return console.debug?.("[useGridKeyboard] bind failed", e), () => {}; } } -function bb(e) { +function Xb(e) { let t = null, n = () => { try { t?.(); @@ -21561,13 +22077,13 @@ function bb(e) { } t = null; }; - cr(e, (e, r) => { - r && n(), e && (t = yb(e)); - }, { immediate: !0 }), rr(n); + or(e, (e, r) => { + r && n(), e && (t = Yb(e)); + }, { immediate: !0 }), ir(n); } // ui/vue/components/grid/assetsGridHostState.ts -function xb() {} -function Sb() { +function Zb() {} +function Qb() { return new Promise((e) => { try { if (typeof requestAnimationFrame == "function") { @@ -21580,7 +22096,7 @@ function Sb() { e(); }); } -function Cb(e, ...t) { +function $b(e, ...t) { try { return typeof e == "function" ? e(...t) : void 0; } catch (e) { @@ -21588,21 +22104,21 @@ function Cb(e, ...t) { return; } } -function wb(e = {}) { +function ex(e = {}) { let t = Array.isArray(e.selectedIds) ? e.selectedIds.map(String).filter(Boolean) : []; return { ids: t, activeId: String(e.activeId || t[0] || "").trim() }; } -function Tb(e, t = {}, n = null) { +function tx(e, t = {}, n = null) { return { count: Number(t.count ?? t.shown ?? e?.dataset?.mjrShown ?? n?.lastGridCount ?? 0) || 0, total: Number(t.total ?? e?.dataset?.mjrTotal ?? n?.lastGridTotal ?? 0) || 0 }; } -function Eb(e, t = fh()) { - if (!e || !t) return xb; +function nx(e, t = Hh()) { + if (!e || !t) return Zb; let n = 0, r = () => { if (!n) try { n = requestAnimationFrame(() => { @@ -21628,8 +22144,8 @@ function Eb(e, t = fh()) { } }; } -function Db(e, { panelStore: t = fh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { - if (!e) return xb; +function rx(e, { panelStore: t = Hh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { + if (!e) return Zb; let i = 0, a = () => { if (i) try { cancelAnimationFrame(i); @@ -21638,24 +22154,24 @@ function Db(e, { panelStore: t = fh(), onContextChanged: n = null, markUserInter } try { i = requestAnimationFrame(() => { - i = 0, Cb(n); + i = 0, $b(n); }); } catch (e) { - console.debug?.(e), i = 0, Cb(n); + console.debug?.(e), i = 0, $b(n); } }, o = (r) => { let i = r?.detail || {}; if (t) { - let { count: n, total: r } = Tb(e, i, t); + let { count: n, total: r } = tx(e, i, t); t.lastGridCount = n, t.lastGridTotal = r; } - Cb(n); + $b(n); }, s = (e) => { - if (Cb(r), t) { - let { ids: n, activeId: r } = wb(e?.detail || {}); + if ($b(r), t) { + let { ids: n, activeId: r } = ex(e?.detail || {}); t.selectedAssetIds = n, t.activeAssetId = r; } - Cb(n); + $b(n); }; e.addEventListener("mjr:grid-stats", o), e.addEventListener("mjr:selection-changed", s); try { @@ -21703,14 +22219,14 @@ function Db(e, { panelStore: t = fh(), onContextChanged: n = null, markUserInter } }; } -async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = fh(), onRestoreSidebar: i = null } = {}) { +async function ix({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = Hh(), onRestoreSidebar: i = null } = {}) { if (!t || !n || !r) return; try { await e; } catch (e) { console.debug?.(e); } - await Sb(); + await Qb(); let a = Number(r.scrollTop || 0) || 0; if (a > 0) try { t.scrollTop = a; @@ -21727,7 +22243,7 @@ async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan if (s) { let e = () => { try { - typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : Bl(n, s)?.scrollIntoView?.({ + typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : lu(n, s)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -21738,13 +22254,13 @@ async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan e(), setTimeout(e, 160); } } - r.sidebarOpen && s && Cb(i); + r.sidebarOpen && s && $b(i); } // ui/vue/components/grid/AssetsGrid.vue -var kb = /* @__PURE__ */ dr({ +var ax = /* @__PURE__ */ tr({ __name: "AssetsGrid", setup(e, { expose: t }) { - let n = Z(null), r = Z(null), i = Z(null), a = dh(), o = G(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; + let n = Q(null), r = Q(null), i = Q(null), a = Vh(), o = K(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; function d() { try { l?.setVisibility?.(); @@ -21755,7 +22271,7 @@ var kb = /* @__PURE__ */ dr({ function f() { try { let e = o.value; - e && tr(e); + e && pt(e); } catch (e) { console.debug?.(e); } @@ -21838,7 +22354,7 @@ var kb = /* @__PURE__ */ dr({ } }; } - or("mjr-grid-container-ref", o), vb(o, () => a), bb(o); + Xn("mjr-grid-container-ref", o), Jb(o, () => a), Xb(o); function m() { return o.value || null; } @@ -21850,23 +22366,23 @@ var kb = /* @__PURE__ */ dr({ } catch (e) { console.debug?.(e); } - c = Db(t, { + c = rx(t, { panelStore: a, ...e }); } } - return Ar(() => { - s = Eb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); + return Zn(() => { + s = nx(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); try { window.addEventListener("mjr:keepalive-attached", f), document.addEventListener("visibilitychange", d); } catch (e) { console.debug?.(e); } d(); - }), pr(() => { + }), ar(() => { try { - Zn(m()); + _t(m()); } catch (e) { console.debug?.(e); } @@ -21899,14 +22415,14 @@ var kb = /* @__PURE__ */ dr({ } catch (e) { console.debug?.(e); } - }), cr(o, (e, t) => { + }), or(o, (e, t) => { try { - t && t !== e && Zn(t); + t && t !== e && _t(t); } catch (e) { console.debug?.(e); } try { - e && tr(e); + e && pt(e); } catch (e) { console.debug?.(e); } @@ -21934,7 +22450,7 @@ var kb = /* @__PURE__ */ dr({ }; }, restoreGridUiState(e, t = {}) { - return Ob({ + return ix({ initialLoadPromise: e, gridWrapper: r.value, gridContainer: m(), @@ -21950,7 +22466,7 @@ var kb = /* @__PURE__ */ dr({ } catch (e) { console.debug?.(e); } - return l = Kg({ + return l = S_({ gridContainer: t, gridWrapper: r.value, ...e @@ -21986,7 +22502,7 @@ var kb = /* @__PURE__ */ dr({ disposeGrid(...e) { return i.value?.dispose?.(...e); } - }), (e, t) => (K(), Y("div", { + }), (e, t) => (q(), Y("div", { ref_key: "browseSectionRef", ref: n, class: "mjr-am-browse", @@ -22005,13 +22521,13 @@ var kb = /* @__PURE__ */ dr({ overflow: "auto", position: "relative" } - }, [J($u, { + }, [U(kd, { ref_key: "gridHostRef", ref: i, "scroll-element": r.value }, null, 8, ["scroll-element"])], 512)], 512)); } -}), Ab = { +}), ox = { class: "mjr-sidebar-header", style: { display: "flex", @@ -22022,15 +22538,15 @@ var kb = /* @__PURE__ */ dr({ "flex-shrink": "0", background: "var(--mjr-surface-2,#2e2e2e)" } -}, jb = ["title"], Mb = /* @__PURE__ */ dr({ +}, sx = ["title"], cx = /* @__PURE__ */ tr({ __name: "SidebarHeaderSection", props: { asset: {} }, emits: ["close"], setup(e, { emit: t }) { let n = t; return (t, r) => { - let i = ar("MButton"); - return K(), Y("div", Ab, [H("div", { + let i = Qn("MButton"); + return q(), Y("div", ox, [H("div", { class: "mjr-sidebar-filename", title: e.asset.filename, style: { @@ -22043,7 +22559,7 @@ var kb = /* @__PURE__ */ dr({ "min-width": "0", "padding-right": "8px" } - }, q(e.asset.filename), 9, jb), J(i, { + }, J(e.asset.filename), 9, sx), U(i, { type: "button", class: "mjr-sidebar-close", severity: "secondary", @@ -22067,35 +22583,138 @@ var kb = /* @__PURE__ */ dr({ onMouseenter: r[1] ||= (e) => (e.currentTarget.style.background = "rgba(255,255,255,0.1)") && (e.currentTarget.style.borderColor = "rgba(255,255,255,0.2)"), onMouseleave: r[2] ||= (e) => (e.currentTarget.style.background = "none") && (e.currentTarget.style.borderColor = "transparent") }, { - default: U(() => [...r[3] ||= [nr("x", -1)]]), + default: G(() => [...r[3] ||= [pr("x", -1)]]), _: 1 })]); }; } }); // ui/components/sidebar/utils/format.ts -function Nb(e) { +function lx(e) { if (!e) return "Unknown"; let t = e / 1024; if (t < 1024) return `${t.toFixed(1)} KB`; let n = t / 1024; return n < 1024 ? `${n.toFixed(1)} MB` : `${(n / 1024).toFixed(2)} GB`; } -function Pb(e) { +function ux(e) { if (!e) return ""; let t = /* @__PURE__ */ new Date(Number(e) * 1e3); if (Number.isNaN(t.getTime())) return ""; let n = (e) => String(e).padStart(2, "0"); return `${t.getFullYear()}-${n(t.getMonth() + 1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`; } +// ui/components/VideoControls.ts +function dx(e, t) { + let n = []; + try { + e.controls = !1, e.loop = !0, e.muted = !0, e.playsInline = !0, e.autoplay = !0; + } catch (e) { + console.debug?.(e); + } + let r = document.createElement("div"); + r.className = "mjr-video-controls mjr-video-controls--preview"; + try { + r.setAttribute("role", "group"), r.setAttribute("aria-label", L("video.previewControls", "Video preview controls")); + } catch (e) { + console.debug?.(e); + } + let i = document.createElement("button"); + i.type = "button", i.className = "mjr-video-preview-btn", i.title = L("video.playPause", "Play/Pause"); + try { + i.setAttribute("aria-label", L("video.playPause", "Play/Pause")); + } catch (e) { + console.debug?.(e); + } + let a = document.createElement("span"); + a.className = "pi pi-play"; + try { + a.setAttribute("aria-hidden", "true"); + } catch (e) { + console.debug?.(e); + } + i.appendChild(a), r.appendChild(i); + let o = () => { + try { + let t = !!e?.paused; + a.className = `pi ${t ? "pi-play" : "pi-pause"}`; + } catch (e) { + console.debug?.(e); + } + }, s = () => { + try { + let t = e.play?.(); + t && typeof t.catch == "function" && t.catch(() => {}); + } catch (e) { + console.debug?.(e); + } + }, c = (t) => { + try { + t?.stopPropagation?.(); + } catch (e) { + console.debug?.(e); + } + try { + e.paused ? s() : e.pause?.(); + } catch (e) { + console.debug?.(e); + } + o(); + }; + try { + t.appendChild(r); + } catch (e) { + console.debug?.(e); + } + try { + s(); + } catch (e) { + console.debug?.(e); + } + n.push(kt(e, "loadedmetadata", () => s(), { passive: !0 })), n.push(kt(e, "canplay", () => s(), { passive: !0 })), n.push(kt(i, "click", c)), n.push(kt(e, "play", o, { passive: !0 })), n.push(kt(e, "pause", o, { passive: !0 })), n.push(kt(e, "ended", () => s(), { passive: !0 })); + try { + o(); + } catch (e) { + console.debug?.(e); + } + return { + controlsEl: r, + destroy: () => { + try { + for (let e of n) Ot(() => e?.()); + } catch (e) { + console.debug?.(e); + } + try { + r.remove?.(); + } catch (e) { + console.debug?.(e); + } + } + }; +} +function fx(e, t = {}) { + try { + let n = t?.hostEl || e?.parentElement; + return !e || !n ? { + controlsEl: null, + destroy: At + } : dx(e, n); + } catch (e) { + return console.debug?.(e), { + controlsEl: null, + destroy: At + }; + } +} // ui/vue/components/panel/sidebar/SidebarPreviewSection.vue?vue&type=script&setup=true&lang.ts -var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["src"], zb = { +var px = { class: "mjr-sidebar-preview" }, mx = ["src"], hx = ["src"], gx = ["src"], _x = { key: 3, style: { color: "rgba(255, 255, 255, 0.4)", "font-size": "14px" } -}, Bb = { +}, vx = { class: "mjr-sidebar-preview-meta", style: { "margin-top": "10px", @@ -22109,7 +22728,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "padding-bottom": "12px", "border-bottom": "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))" } -}, Vb = /* @__PURE__ */ dr({ +}, yx = /* @__PURE__ */ tr({ __name: "SidebarPreviewSection", props: { asset: {}, @@ -22119,15 +22738,15 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } }, setup(e) { - let t = e, n = Z(null), r = null, i = G(() => ot(t.asset) || ""), a = G(() => { + let t = e, n = Q(null), r = null, i = K(() => ae(t.asset) || ""), a = K(() => { let e = String(t.asset?.filename || ""), n = e.lastIndexOf("."); return n === -1 ? "" : e.slice(n + 1).toUpperCase(); - }), o = G(() => { + }), o = K(() => { let e = []; a.value && e.push(a.value), t.asset?.kind && e.push(String(t.asset.kind).toLowerCase()); - let n = Nb(t.asset?.size); + let n = lx(t.asset?.size); n && e.push(n); - let r = Pb(t.asset?.mtime); + let r = ux(t.asset?.mtime); return r && e.push(r), e.join(" | "); }); function s() { @@ -22152,7 +22771,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr if (e && i) { c(i); try { - r = Vt(i, { + r = fx(i, { variant: "preview", hostEl: e }); @@ -22161,17 +22780,17 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } } - return cr(() => [t.asset, t.showPreviewThumb], () => { + return or(() => [t.asset, t.showPreviewThumb], () => { s(); - }, { flush: "post" }), cr(i, () => { + }, { flush: "post" }), or(i, () => { setTimeout(() => { l(); }, 0); - }), Ar(() => { + }), Zn(() => { l(); - }), pr(() => { + }), ar(() => { s(); - }), (t, r) => (K(), Y("div", Fb, [e.showPreviewThumb ? (K(), Y("div", { + }), (t, r) => (q(), Y("div", px, [e.showPreviewThumb ? (q(), Y("div", { key: 0, ref_key: "previewContainerRef", ref: n, @@ -22186,7 +22805,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "justify-content": "center", position: "relative" } - }, [e.asset.kind === "image" ? (K(), Y("img", { + }, [e.asset.kind === "image" ? (q(), Y("img", { key: 0, src: i.value, style: { @@ -22194,7 +22813,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Ib)) : e.asset.kind === "video" ? (K(), Y("video", { + }, null, 8, mx)) : e.asset.kind === "video" ? (q(), Y("video", { key: 1, src: i.value, muted: !0, @@ -22207,7 +22826,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Lb)) : e.asset.kind === "audio" ? (K(), Y("audio", { + }, null, 8, hx)) : e.asset.kind === "audio" ? (q(), Y("audio", { key: 2, src: i.value, controls: "", @@ -22216,9 +22835,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr width: "92%", "max-width": "560px" } - }, null, 8, Rb)) : (K(), Y("div", zb, q(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : W("", !0), H("div", Bb, q(o.value), 1)])); + }, null, 8, gx)) : (q(), Y("div", _x, J(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : W("", !0), H("div", vx, J(o.value), 1)])); } -}), Hb = { +}), bx = { class: "mjr-sidebar-section", style: { background: "rgba(255, 255, 255, 0.03)", @@ -22226,22 +22845,22 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "border-radius": "8px", padding: "10px" } -}, Ub = { style: { +}, xx = { style: { "font-size": "12px", "font-weight": "700", color: "#26a69a", "margin-bottom": "8px", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Wb = { style: { +} }, Sx = { style: { display: "flex", "flex-direction": "column", gap: "6px" -} }, Gb = { style: { +} }, Cx = { style: { "font-size": "12px", opacity: "0.68", "min-width": "92px" -} }, Kb = ["title"], qb = /* @__PURE__ */ dr({ +} }, wx = ["title"], Tx = /* @__PURE__ */ tr({ __name: "SidebarFolderSection", props: { asset: {} }, setup(e) { @@ -22259,42 +22878,42 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr for (; r >= 1024 && i < n.length - 1;) r /= 1024, i += 1; return `${r.toFixed(+(i > 0))} ${n[i]}`; } - let r = G(() => { + let r = K(() => { let e = t.asset || {}, r = e.folder_info || e.folderInfo || {}, i = String(r.path || e.filepath || e.subfolder || ""), a = String(r.name || e.filename || "").trim(), o = Number(r.files ?? 0), s = Number(r.folders ?? 0), c = Number(r.size ?? 0), l = Number(r.mtime ?? e.mtime ?? 0), u = Number(r.ctime ?? 0), d = !!r.truncated, f = [ { - label: R("sidebar.folder.name", "Name"), + label: L("sidebar.folder.name", "Name"), value: a || "-" }, { - label: R("sidebar.folder.path", "Path"), + label: L("sidebar.folder.path", "Path"), value: i || "-" }, { - label: R("sidebar.folder.folders", "Folders"), + label: L("sidebar.folder.folders", "Folders"), value: Number.isFinite(s) ? String(s) : "-" }, { - label: R("sidebar.folder.files", "Files"), + label: L("sidebar.folder.files", "Files"), value: Number.isFinite(o) ? String(o) : "-" }, { - label: R("sidebar.size", "Size"), + label: L("sidebar.size", "Size"), value: n(c) } ]; return u > 0 && f.push({ - label: R("sidebar.folder.created", "Created"), - value: `${Bn(u) || "-"} ${Pn(u) || ""}`.trim() + label: L("sidebar.folder.created", "Created"), + value: `${Cn(u) || "-"} ${Bn(u) || ""}`.trim() }), l > 0 && f.push({ - label: R("sidebar.folder.modified", "Modified"), - value: `${Bn(l) || "-"} ${Pn(l) || ""}`.trim() + label: L("sidebar.folder.modified", "Modified"), + value: `${Cn(l) || "-"} ${Bn(l) || ""}`.trim() }), d && f.push({ - label: R("sidebar.folder.note", "Note"), - value: R("sidebar.folder.scanTruncated", "Scan was truncated for performance"), + label: L("sidebar.folder.note", "Note"), + value: L("sidebar.folder.scanTruncated", "Scan was truncated for performance"), valueStyle: "color:#FFB74D;font-weight:600;" }), f; }); - return (e, t) => (K(), Y("div", Hb, [H("div", Ub, q(X(R)("sidebar.folder.details", "Folder Details")), 1), H("div", Wb, [(K(!0), Y(V, null, hr(r.value, (e) => (K(), Y("div", { + return (e, t) => (q(), Y("div", bx, [H("div", xx, J(Z(L)("sidebar.folder.details", "Folder Details")), 1), H("div", Sx, [(q(!0), Y(V, null, $n(r.value, (e) => (q(), Y("div", { key: e.label, style: { display: "flex", @@ -22302,250 +22921,59 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "align-items": "flex-start", "justify-content": "space-between" } - }, [H("div", Gb, q(e.label), 1), H("div", { - style: xr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), + }, [H("div", Cx, J(e.label), 1), H("div", { + style: fr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") - }, q(e.value), 13, Kb)]))), 128))])])); + }, J(e.value), 13, wx)]))), 128))])])); } -}), Jb = [ - "aria-busy", - "aria-disabled", - "aria-label", - "aria-valuenow", - "tabindex" -], Yb = /* @__PURE__ */ dr({ - __name: "RatingEditor", - props: { - asset: {}, - modelValue: {}, - disabled: { type: Boolean }, - size: {} - }, - emits: ["update:modelValue", "rating-change"], - setup(e, { emit: t }) { - function n(e) { - return Math.max(0, Math.min(5, Number(e) || 0)); - } - let r = e, i = t, a = n(r.asset?.rating ?? r.modelValue), o = Z(a), s = Z(0), c = Z(!1), l = a, u = a, d = null, f = G(() => s.value > 0 ? s.value : o.value), p = (e) => e <= f.value ? "#FFD45A" : "#555", m = (e) => e <= f.value ? "scale(1.1)" : "scale(1)", h = G(() => { - let e = r.size; - return typeof e == "number" ? `${Math.max(8, e)}px` : String(e || "").trim() || "16px"; - }), g = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), _ = (e) => new Promise((t) => setTimeout(t, e)); - function v(e) { - if (c.value) return; - let t = n(e); - l = t, u = t, t !== o.value && (o.value = t); - } - function b(e = null) { - o.value = l, u = l, i("update:modelValue", l), e && I(e, "error"); - } - async function x() { - if (c.value) return; - c.value = !0; - let e = Date.now(); - try { - let t = 0; - for (; t < 10;) { - if (Date.now() - e > 3e4) { - b(R("toast.ratingUpdateFailed", "Rating update failed")); - break; - } - t > 0 && await _(g(t)), t += 1; - let a = n(u), s = typeof AbortController < "u" ? new AbortController() : null; - d = s; - let c = null; - try { - c = await y(r.asset, a, s ? { signal: s.signal } : {}); - } catch (e) { - console.error("Failed to update rating:", e); - } - if (!c?.ok) { - if (c?.code === "ABORTED" && u !== a) continue; - b(c?.error || R("toast.ratingUpdateFailed", "Rating update failed")); - break; - } - try { - let e = c?.data?.asset_id ?? null; - e != null && !Ve(r.asset.id) && (r.asset.id = e); - } catch (e) { - console.debug?.(e); - } - l = a, o.value = a; - try { - r.asset.rating = a; - } catch (e) { - console.debug?.(e); - } - if (i("update:modelValue", a), i("rating-change", { - assetId: r.asset?.id, - rating: a - }), Rt(ct, { - assetId: r.asset?.id == null ? "" : String(r.asset.id), - rating: a - }), u === a) { - I(R("toast.ratingSetN", { n: a }), "success", 1e3); - break; - } - } - t >= 10 && b(R("toast.ratingUpdateFailed", "Rating update failed")); - } finally { - d = null, c.value = !1; - } - } - function S(e) { - if (r.disabled) return; - let t = n(e); - u = t, o.value = t, s.value = 0, i("update:modelValue", t); - try { - d?.abort?.(); - } catch (e) { - console.debug?.(e); - } - x(); - } - function C(e) { - S(e); - } - function w(e) { - r.disabled || (s.value = e); - } - function T() { - s.value = 0; - } - function E(e) { - if (r.disabled) return; - let t = null; - switch (e.key) { - case "ArrowRight": - case "ArrowUp": - e.preventDefault(), t = Math.min(5, o.value + 1); - break; - case "ArrowLeft": - case "ArrowDown": - e.preventDefault(), t = Math.max(0, o.value - 1); - break; - case "Home": - e.preventDefault(), t = 0; - break; - case "End": - e.preventDefault(), t = 5; - break; - default: e.key >= "0" && e.key <= "5" && (e.preventDefault(), t = parseInt(e.key, 10)); - } - t !== null && t !== o.value && S(t); - } - return pr(() => { - try { - d?.abort?.(); - } catch (e) { - console.debug?.(e); - } - }), cr(() => r.modelValue, (e) => { - v(e); - }), cr(() => r.asset?.rating, (e) => { - v(e); - }), (t, n) => { - let r = ar("MButton"); - return K(), Y("div", { - class: "mjr-rating-editor", - style: xr({ - display: "inline-flex", - gap: "2px", - pointerEvents: e.disabled ? "none" : "auto", - opacity: e.disabled ? .6 : 1 - }), - "aria-busy": c.value, - "aria-disabled": e.disabled, - role: "slider", - "aria-label": X(R)("rating.label", "Rating"), - "aria-valuemin": 0, - "aria-valuemax": 5, - "aria-valuenow": o.value, - tabindex: e.disabled ? -1 : 0, - onKeydown: E - }, [(K(), Y(V, null, hr(5, (t) => J(r, { - key: t, - type: "button", - class: "mjr-rating-star", - severity: "secondary", - text: "", - rounded: "", - style: xr({ - color: p(t), - transform: m(t), - fontSize: h.value, - background: "none", - border: "none", - cursor: e.disabled ? "default" : "pointer", - padding: "0", - transition: "all 0.15s ease" - }), - "aria-label": X(R)("rating.setN", { n: t }), - "aria-pressed": t <= o.value, - disabled: e.disabled, - onClick: (e) => C(t), - onMouseenter: (e) => w(t), - onMouseleave: T - }, { - default: U(() => [...n[0] ||= [nr(" ★ ", -1)]]), - _: 1 - }, 8, [ - "style", - "aria-label", - "aria-pressed", - "disabled", - "onClick", - "onMouseenter" - ])), 64))], 44, Jb); - }; - } -}), Xb = ["aria-label"], Zb = { class: "mjr-context-menu-title" }, Qb = { class: "mjr-context-menu-item-left" }, $b = { +}), Ex = ["aria-label"], Dx = { class: "mjr-context-menu-title" }, Ox = { class: "mjr-context-menu-item-left" }, kx = { key: 0, class: "mjr-context-menu-note" -}, ex = { +}, Ax = { key: 1, class: "mjr-context-menu-note is-error" -}, tx = { +}, jx = { key: 2, class: "mjr-context-menu-note" -}, nx = { class: "mjr-context-menu-item-left" }, rx = { +}, Mx = { class: "mjr-context-menu-item-left" }, Nx = { key: 0, class: "mjr-context-menu-hint" -}, ix = /* @__PURE__ */ dr({ +}, Px = /* @__PURE__ */ tr({ __name: "AddToCollectionMenu", setup(e) { - let t = Z(null), n = Z(!1), r = Z([]), i = Z(""), a = 0, o = null, s = G(() => ({ + let t = Q(null), n = Q(!1), r = Q([]), i = Q(""), a = 0, o = null, s = K(() => ({ position: "fixed", - left: `${Math.round(Number(qt.x) || 0)}px`, - top: `${Math.round(Number(qt.y) || 0)}px`, + left: `${Math.round(Number(Vi.x) || 0)}px`, + top: `${Math.round(Number(Vi.y) || 0)}px`, display: "block", zIndex: "10004" - })), c = G(() => qt.assets.length || 0), u = G(() => R("ctx.addToCollection", "Add to collection") + (c.value > 1 ? ` (${c.value})` : "")); - function d({ collectionName: e, selectedCount: t, addRes: n }) { - let r = Number(n?.data?.added ?? 0) || 0, i = Number(n?.data?.skipped_existing ?? 0) || 0, a = Number(n?.data?.skipped_duplicate ?? 0) || 0, o = String(e || "").trim() || R("label.collection", "collection"), s = R("msg.collectionAdd.added", "Added {added} item(s) to \"{name}\".", { + })), c = K(() => Vi.assets.length || 0), l = K(() => L("ctx.addToCollection", "Add to collection") + (c.value > 1 ? ` (${c.value})` : "")); + function u({ collectionName: e, selectedCount: t, addRes: n }) { + let r = Number(n?.data?.added ?? 0) || 0, i = Number(n?.data?.skipped_existing ?? 0) || 0, a = Number(n?.data?.skipped_duplicate ?? 0) || 0, o = String(e || "").trim() || L("label.collection", "collection"), s = L("msg.collectionAdd.added", "Added {added} item(s) to \"{name}\".", { added: r, name: o }); - return i > 0 && (s += `\n\n${R("msg.collectionAdd.skippedExisting", "Skipped {count} item(s): already present in the collection.", { count: i })}`), a > 0 && (s += `\n\n${R("msg.collectionAdd.skippedDuplicate", "Ignored {count} duplicate(s) in selection.", { count: a })}`), r === 0 && i > 0 && t > 0 && (s = R("msg.collectionAdd.noneAddedExisting", "No new items added to \"{name}\" (all exist).", { name: o })), s; + return i > 0 && (s += `\n\n${L("msg.collectionAdd.skippedExisting", "Skipped {count} item(s): already present in the collection.", { count: i })}`), a > 0 && (s += `\n\n${L("msg.collectionAdd.skippedDuplicate", "Ignored {count} duplicate(s) in selection.", { count: a })}`), r === 0 && i > 0 && t > 0 && (s = L("msg.collectionAdd.noneAddedExisting", "No new items added to \"{name}\" (all exist).", { name: o })), s; } - function f() { + function d() { let e = t.value; - if (!qt.open || !e) return; - let n = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(qt.x) || 0, o = Number(qt.y) || 0; - a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), qt.x = a, qt.y = o; + if (!Vi.open || !e) return; + let n = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(Vi.x) || 0, o = Number(Vi.y) || 0; + a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), Vi.x = a, Vi.y = o; } - async function p() { + async function f() { let e = ++a; n.value = !0, i.value = ""; try { - let t = await ge(); + let t = await Ee(); if (e !== a) return; r.value = Array.isArray(t?.data) ? t.data : []; } catch (t) { if (console.error("[AddToCollectionMenu.vue] listCollections failed:", t), e !== a) return; - r.value = [], i.value = R("toast.failedLoadCollections", "Failed to load collections."); + r.value = [], i.value = L("toast.failedLoadCollections", "Failed to load collections."); } finally { if (e === a) { - n.value = !1, await lr(), f(); + n.value = !1, await qn(), d(); try { t.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); } catch (e) { @@ -22554,340 +22982,124 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } } - async function m(e, t) { - let n = Array.isArray(qt.assets) ? qt.assets : []; - Nt(); - let r = await b(e, n); - r?.ok ? I(d({ + async function p(e, t) { + let n = Array.isArray(Vi.assets) ? Vi.assets : []; + Wi(); + let r = await S(e, n); + r?.ok ? F(u({ collectionName: t, selectedCount: n.length, addRes: r - }), "success", 4e3) : I(r?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); + }), "success", 4e3) : F(r?.error || L("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); } - async function h() { - let e = Array.isArray(qt.assets) ? qt.assets : []; - Nt(); - let t = await Et(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "My collection")); + async function m() { + let e = Array.isArray(Vi.assets) ? Vi.assets : []; + Wi(); + let t = await wt(L("dialog.createCollection", "Create collection"), L("dialog.collectionPlaceholder", "My collection")); if (!t) return; - let n = await l(t); + let n = await v(t); if (!n?.ok) { - I(n?.error || R("toast.failedCreateCollectionDot", "Failed to create collection."), "error"); + F(n?.error || L("toast.failedCreateCollectionDot", "Failed to create collection."), "error"); return; } - let r = n.data?.id, i = await b(r, e); - i?.ok ? I(d({ + let r = n.data?.id, i = await S(r, e); + i?.ok ? F(u({ collectionName: n.data?.name || t, selectedCount: e.length, addRes: i - }), "success", 4e3) : I(i?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); + }), "success", 4e3) : F(i?.error || L("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); + } + function h(e) { + t.value?.contains?.(e?.target) || Wi(); } function g(e) { - t.value?.contains?.(e?.target) || Nt(); + e?.key === "Escape" && Wi(); } - function _(e) { - e?.key === "Escape" && Nt(); + function _() { + Wi(); } - function v() { - Nt(); - } - return cr(() => qt.open, async (e) => { - e && (r.value = [], await p()); - }), Ar(() => { + return or(() => Vi.open, async (e) => { + e && (r.value = [], await f()); + }), Zn(() => { o = new AbortController(); let e = { capture: !0, passive: !0, signal: o.signal }; - window.addEventListener("pointerdown", g, e), window.addEventListener("keydown", _, { + window.addEventListener("pointerdown", h, e), window.addEventListener("keydown", g, { capture: !0, signal: o.signal - }), window.addEventListener("scroll", v, e), window.addEventListener("wheel", v, e), window.addEventListener("resize", v, { + }), window.addEventListener("scroll", _, e), window.addEventListener("wheel", _, e), window.addEventListener("resize", _, { passive: !0, signal: o.signal - }), window.addEventListener("mjr-close-all-menus", v, { signal: o.signal }); - }), rr(() => { + }), window.addEventListener("mjr-close-all-menus", _, { signal: o.signal }); + }), ir(() => { try { o?.abort(); } catch (e) { console.debug?.(e); } - o = null, Nt(); + o = null, Wi(); }), (e, a) => { - let o = ar("MButton"); - return K(), ir(Dr, { to: "body" }, [X(qt).open ? (K(), Y("div", { + let o = Qn("MButton"); + return q(), Jn(yr, { to: "body" }, [Z(Vi).open ? (q(), Y("div", { key: 0, ref_key: "menuRef", ref: t, class: "mjr-add-to-collection-menu mjr-context-menu", - style: xr(s.value), + style: fr(s.value), role: "menu", - "aria-label": u.value + "aria-label": l.value }, [ - H("div", Zb, q(u.value), 1), - J(o, { + H("div", Dx, J(l.value), 1), + U(o, { type: "button", class: "mjr-context-menu-item", severity: "secondary", text: "", role: "menuitem", - onClick: h + onClick: m }, { - default: U(() => [H("span", Qb, [a[0] ||= H("i", { class: "pi pi-plus" }, null, -1), H("span", null, q(X(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), + default: G(() => [H("span", Ox, [a[0] ||= H("i", { class: "pi pi-plus" }, null, -1), H("span", null, J(Z(L)("dialog.createCollection", "Create collection")) + "...", 1)])]), _: 1 }), a[2] ||= H("div", { class: "mjr-context-menu-separator" }, null, -1), - n.value ? (K(), Y("div", $b, q(X(R)("msg.loadingCollections", "Loading collections...")), 1)) : i.value ? (K(), Y("div", ex, q(i.value), 1)) : r.value.length ? W("", !0) : (K(), Y("div", tx, q(X(R)("msg.noCollections", "No collections yet.")), 1)), - (K(!0), Y(V, null, hr(r.value, (e) => (K(), ir(o, { + n.value ? (q(), Y("div", kx, J(Z(L)("msg.loadingCollections", "Loading collections...")), 1)) : i.value ? (q(), Y("div", Ax, J(i.value), 1)) : r.value.length ? W("", !0) : (q(), Y("div", jx, J(Z(L)("msg.noCollections", "No collections yet.")), 1)), + (q(!0), Y(V, null, $n(r.value, (e) => (q(), Jn(o, { key: String(e?.id || ""), type: "button", class: "mjr-context-menu-item", severity: "secondary", text: "", role: "menuitem", - onClick: (t) => m(String(e?.id || ""), String(e?.name || e?.id || "")) + onClick: (t) => p(String(e?.id || ""), String(e?.name || e?.id || "")) }, { - default: U(() => [H("span", nx, [a[1] ||= H("i", { class: "pi pi-bookmark" }, null, -1), H("span", null, q(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (K(), Y("span", rx, q(Number(e?.count || 0)), 1)) : W("", !0)]), + default: G(() => [H("span", Mx, [a[1] ||= H("i", { class: "pi pi-bookmark" }, null, -1), H("span", null, J(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (q(), Y("span", Nx, J(Number(e?.count || 0)), 1)) : W("", !0)]), _: 2 }, 1032, ["onClick"]))), 128)) - ], 12, Xb)) : W("", !0)]); + ], 12, Ex)) : W("", !0)]); }; } -}), ax = ["aria-busy"], ox = { class: "mjr-bulk-tags-header" }, sx = ["aria-label"], cx = { - key: 0, - class: "mjr-tags-empty" -}, lx = ["title", "onClick"], ux = { class: "mjr-tags-input-wrap" }, dx = 50, fx = 100, px = 500, mx = 200, hx = /* @__PURE__ */ dr({ - __name: "BulkTagsEditor", - props: { assets: {} }, - setup(e, { expose: t }) { - let n = e, r = Z(null), i = Z(""), a = Z(!1), o = Z(!1), s = (e) => e?.$el || e || null, c = (e) => String(e ?? "").trim().toLowerCase(); - function l(e) { - let t = [], n = /* @__PURE__ */ new Set(); - for (let r of Array.isArray(e) ? e : []) { - let e = String(r ?? "").trim(); - if (!e) continue; - let i = c(e); - i && !n.has(i) && (n.add(i), t.push(e)); - } - return t; - } - function u(e) { - return String(e?.kind || e?.type || "").trim().toLowerCase() === "workflow"; - } - let f = G(() => Array.isArray(n.assets) ? n.assets.filter((e) => e && typeof e == "object") : []), p = (e) => !u(e) && Number(e?.id) > 0, m = G(() => f.value.filter((e) => p(e))), h = G(() => f.value.filter((e) => u(e)).length), g = G(() => f.value.filter((e) => !p(e) && !u(e)).length), _ = G(() => h.value + g.value), v = G(() => m.value.length), y = Z(/* @__PURE__ */ new Map()), b = G(() => { - let e = /* @__PURE__ */ new Map(); - for (let t of y.value.values()) for (let n of t) { - let t = c(n); - if (!t) continue; - let r = e.get(t); - r ? r.count += 1 : e.set(t, { - tag: n, - count: 1 - }); - } - return Array.from(e.values()).sort((e, t) => e.tag.localeCompare(t.tag)); - }); - t({ coverageEntries: b }); - function x(e) { - y.value = new Map(e); - } - function S() { - let e = /* @__PURE__ */ new Map(); - for (let t of m.value) Array.isArray(t?.tags) && e.set(String(t.id), l(t.tags)); - return e; - } - async function C() { - o.value = !0; - let e = 0; - try { - let t = S(), n = m.value.map((e) => Number(e.id)); - for (let r = 0; r < n.length; r += mx) { - let i = n.slice(r, r + mx); - try { - let n = await N(i); - if (!n?.ok) { - e += i.length; - continue; - } - for (let e of n.data || []) e?.id != null && t.set(String(e.id), l(e?.tags)); - } catch (t) { - e += i.length, console.debug?.(t); - } - } - x(t); - } finally { - o.value = !1; - } - e > 0 && I(R("toast.bulkTagsHydrationIncomplete", "Couldn't load tags for {n} cards; counts may be incomplete", { n: e }), "warning", 3500); - try { - await lr(), s(r.value)?.focus(); - } catch (e) { - console.debug?.(e); - } - } - Ar(() => { - C(); - }); - function w(e, t) { - let n = []; - for (let r = 0; r < e.length; r += t) n.push(e.slice(r, r + t)); - return n; - } - function T() { - return h.value > 0 && g.value > 0 ? R("toast.bulkTagsSkippedMixed", ", {n} skipped ({workflow} workflow, {invalid} no id)", { - n: _.value, - workflow: h.value, - invalid: g.value - }) : h.value > 0 ? R("toast.bulkTagsSkippedWorkflow", ", {n} skipped (workflow)", { n: h.value }) : R("toast.bulkTagsSkippedInvalidId", ", {n} skipped (no id)", { n: g.value }); - } - function E() { - return h.value > 0 && g.value > 0 ? R("toast.bulkTagsSkippedOnlyMixed", "{n} asset(s) skipped ({workflow} workflow, {invalid} no id)", { - n: _.value, - workflow: h.value, - invalid: g.value - }) : h.value > 0 ? R("toast.bulkTagsSkippedOnlyWorkflow", "{n} workflow asset(s) skipped", { n: h.value }) : R("toast.bulkTagsSkippedOnlyInvalidId", "{n} asset(s) without id skipped", { n: g.value }); - } - async function D(e, t) { - if (a.value || o.value) return; - let n = m.value.map((e) => Number(e.id)); - if (!n.length) return; - let r = w(n, px); - r.length > 1 && I(R("toast.bulkTagsProgress", "Updating tags on {n} assets...", { n: n.length }), "info", 2500), a.value = !0; - let i = 0, s = 0, c = ""; - try { - for (let n of r) { - let r = await d(n, { - add: e, - remove: t - }); - if (!r?.ok) { - s += n.length, c = String(r?.error || ""); - continue; - } - let a = r.data || {}; - s += Array.isArray(a.failed) ? a.failed.length : 0; - let o = a.tags || {}, u = new Map(y.value); - for (let [e, t] of Object.entries(o)) u.set(String(e), l(t)); - for (let e of Array.isArray(a.updated_ids) ? a.updated_ids : []) { - i += 1; - let t = String(e), n = u.get(t) || []; - Rt(nt, { - assetId: t, - tags: n - }, { warnPrefix: "[BulkTagsEditor]" }); - let r = m.value.find((e) => String(e?.id || "") === t); - r && (r.tags = [...n]); - } - x(u); - } - } finally { - a.value = !1; - } - if (i > 0) { - let e = R("toast.bulkTagsUpdated", "Tags updated on {n} asset(s)", { n: i }); - s > 0 && (e += R("toast.bulkTagsUpdatedWithFailed", ", {n} failed", { n: s })), _.value > 0 && (e += T()), I(e, s > 0 ? "warning" : "success", 2500); - } else s > 0 ? I(c || R("toast.bulkTagsFailed", "Bulk tag update failed"), "error") : _.value > 0 && I(E(), "info", 2500); - } - function O(e) { - let t = String(e ?? "").trim(); - if (!t || t.length > fx) return null; - for (let e = 0; e < t.length; e += 1) { - let n = t.charCodeAt(e); - if (n <= 31 || n === 127) return null; - } - return t; - } - function k(e) { - let t = b.value.find((t) => c(t.tag) === c(e)); - return t && t.count >= v.value ? !1 : !t && b.value.length >= dx ? (I(R("toast.maxTagsReached", "Maximum number of tags reached"), "warning"), !1) : (D([e], []), !0); - } - function A(e) { - D([], [String(e)]); - } - function j(e) { - a.value || o.value || e.count >= v.value || D([e.tag], []); - } - function M(e) { - if (e.key !== "Enter") return; - e.preventDefault(); - let t = i.value.trim(); - if (!t) return; - let n = O(t); - n ? k(n) && (i.value = "") : I(R("toast.bulkTagsInvalidTag", "Tag not added (empty, too long, or invalid characters)"), "warning"); - } - return (e, t) => { - let n = ar("MButton"), s = ar("MInputText"); - return K(), Y("div", { - class: Q(["mjr-tags-editor mjr-bulk-tags-editor", { "is-disabled": a.value || o.value }]), - "aria-busy": a.value || o.value - }, [ - H("div", ox, q(X(R)("tags.bulkTitle", "Tags across {n} assets", { n: v.value })), 1), - H("div", { - class: "mjr-tags-display", - role: "list", - "aria-label": X(R)("tags.label", "Tags") - }, [b.value.length === 0 ? (K(), Y("span", cx, q(X(R)("msg.noTagsYet", "No tags yet...")), 1)) : (K(!0), Y(V, { key: 1 }, hr(b.value, (e) => (K(), Y("div", { - key: e.tag, - class: Q(["mjr-tag-chip", { "is-partial": e.count < v.value }]), - role: "listitem", - title: e.count < v.value ? X(R)("tags.bulkAddMissing", "Add to all assets") : "", - onClick: (t) => j(e) - }, [nr(q(e.tag) + " (" + q(e.count) + "/" + q(v.value) + ") ", 1), J(n, { - type: "button", - class: "mjr-tag-chip-remove", - severity: "secondary", - text: "", - rounded: "", - "aria-label": X(R)("tags.remove", "Remove tag"), - disabled: a.value || o.value, - onClick: mr((t) => A(e.tag), ["stop"]) - }, { - default: U(() => [...t[1] ||= [nr(" x ", -1)]]), - _: 1 - }, 8, [ - "aria-label", - "disabled", - "onClick" - ])], 10, lx))), 128))], 8, sx), - H("div", ux, [J(s, { - ref_key: "inputRef", - ref: r, - modelValue: i.value, - "onUpdate:modelValue": t[0] ||= (e) => i.value = e, - type: "text", - class: "mjr-tag-input", - placeholder: X(R)("tags.bulkAddPlaceholder", "Add tag to all..."), - disabled: a.value || o.value, - "aria-label": X(R)("tags.addLabel", "Add tag"), - onKeydown: M - }, null, 8, [ - "modelValue", - "placeholder", - "disabled", - "aria-label" - ])]) - ], 10, ax); - }; - } -}), gx = { +}), Fx = { key: 0, class: "mjr-context-menu-separator" -}, _x = { class: "mjr-context-menu-item-left" }, vx = { class: "mjr-context-menu-item-right" }, yx = { +}, Ix = { class: "mjr-context-menu-item-left" }, Lx = { class: "mjr-context-menu-item-right" }, Rx = { key: 0, class: "mjr-context-menu-hint" -}, bx = { +}, zx = { key: 1, class: "mjr-context-menu-submenu-arrow" -}, xx = { +}, Bx = { key: 0, class: "mjr-context-menu-separator" -}, Sx = { class: "mjr-context-menu-item-left" }, Cx = { +}, Vx = { class: "mjr-context-menu-item-left" }, Hx = { key: 0, class: "mjr-context-menu-hint" -}, wx = /* @__PURE__ */ dr({ +}, Ux = /* @__PURE__ */ tr({ __name: "GridContextMenu", setup(e) { - let t = Z(null), n = Z(null), r = Z(null), i = null, a = null, o = G(() => l(_n.main, 10031)), s = G(() => l(_n.submenu, 10032)), c = G(() => l(_n.tags, 10033)); + let t = Q(null), n = Q(null), r = Q(null), i = null, a = null, o = K(() => l(en.main, 10031)), s = K(() => l(en.submenu, 10032)), c = K(() => l(en.tags, 10033)); function l(e, t) { return { position: "fixed", @@ -22902,7 +23114,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function d() { u(), i = setTimeout(() => { - an(); + dn(); }, 180); } function f(e, t) { @@ -22911,7 +23123,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), e.x = a, e.y = o; } async function p(e, t) { - await lr(), f(e, t?.value || null); + await qn(), f(e, t?.value || null); } function m(e) { try { @@ -22922,14 +23134,14 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function h(e, t) { if (!Array.isArray(e?.submenu) || !e.submenu.length) { - an(); + dn(); return; } u(); let n = (t?.currentTarget)?.getBoundingClientRect?.(); - cn({ - x: Math.round((n?.right || _n.main.x || 0) + 6), - y: Math.round((n?.top || _n.main.y || 0) - 4), + fn({ + x: Math.round((n?.right || en.main.x || 0) + 6), + y: Math.round((n?.top || en.main.y || 0) - 4), items: e.submenu, title: e.label || "" }); @@ -22942,12 +23154,12 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } catch (e) { console.error("[GridContextMenu.vue] Action failed:", e); } finally { - e.closeOnSelect === !1 ? n === "submenu" && an() : vn(); + e.closeOnSelect === !1 ? n === "submenu" && dn() : ln(); } } } function _(e, t) { - Array.isArray(e?.submenu) && e.submenu.length ? h(e, t) : an(); + Array.isArray(e?.submenu) && e.submenu.length ? h(e, t) : dn(); } function v(e) { Array.isArray(e?.submenu) && e.submenu.length && d(); @@ -22960,37 +23172,37 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function x(e) { let i = e?.target; - t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || vn(); + t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || ln(); } function S(e) { - e?.key === "Escape" && vn(); + e?.key === "Escape" && ln(); } function C() { - vn(); + ln(); } function w(e) { let t = e?.detail; - String(t?.source || "") !== "grid" && vn(); + String(t?.source || "") !== "grid" && ln(); } function T(e) { - let t = _n.tags.asset; + let t = en.tags.asset; t && (t.tags = Array.isArray(e) ? [...e] : []); } function E(e) { let t = Array.isArray(e?.tags) ? e.tags : []; try { - _n.tags.onChanged?.(t); + en.tags.onChanged?.(t); } catch (e) { console.debug?.(e); } } - return cr(() => _n.main.open, async (e) => { - e && (await p(_n.main, t), m(t)); - }), cr(() => _n.submenu.open, async (e) => { - e && (await p(_n.submenu, n), m(n)); - }), cr(() => _n.tags.open, async (e) => { - e && await p(_n.tags, r); - }), Ar(() => { + return or(() => en.main.open, async (e) => { + e && (await p(en.main, t), m(t)); + }), or(() => en.submenu.open, async (e) => { + e && (await p(en.submenu, n), m(n)); + }), or(() => en.tags.open, async (e) => { + e && await p(en.tags, r); + }), Zn(() => { a = new AbortController(); let e = { capture: !0, @@ -23004,29 +23216,29 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr passive: !0, signal: a.signal }), window.addEventListener("mjr-close-all-menus", w, { signal: a.signal }); - }), rr(() => { + }), ir(() => { u(); try { a?.abort(); } catch (e) { console.debug?.(e); } - a = null, vn(); + a = null, ln(); }), (e, i) => { - let a = ar("MButton"); - return K(), ir(Dr, { to: "body" }, [ - X(_n).main.open ? (K(), Y("div", { + let a = Qn("MButton"); + return q(), Jn(yr, { to: "body" }, [ + Z(en).main.open ? (q(), Y("div", { key: 0, ref_key: "mainMenuRef", ref: t, class: "mjr-grid-context-menu mjr-context-menu", - style: xr(o.value), + style: fr(o.value), role: "menu", "aria-label": "Grid context menu" - }, [(K(!0), Y(V, null, hr(X(_n).main.items, (e) => (K(), Y(V, { key: e.id }, [e.type === "separator" ? (K(), Y("div", gx)) : (K(), ir(a, { + }, [(q(!0), Y(V, null, $n(Z(en).main.items, (e) => (q(), Y(V, { key: e.id }, [e.type === "separator" ? (q(), Y("div", Fx)) : (q(), Jn(a, { key: 1, type: "button", - class: Q(["mjr-context-menu-item", { + class: X(["mjr-context-menu-item", { "is-disabled": e.disabled, "has-submenu": Array.isArray(e.submenu) && e.submenu.length, "is-tone-graph-map": e.tone === "graph-map", @@ -23043,10 +23255,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr onMouseenter: (t) => _(e, t), onMouseleave: (t) => v(e) }, { - default: U(() => [H("span", _x, [e.iconClass ? (K(), Y("i", { + default: G(() => [H("span", Ix, [e.iconClass ? (q(), Y("i", { key: 0, - class: Q(e.iconClass) - }, null, 2)) : W("", !0), H("span", null, q(e.label), 1)]), H("span", vx, [e.rightHint ? (K(), Y("span", yx, q(e.rightHint), 1)) : W("", !0), Array.isArray(e.submenu) && e.submenu.length ? (K(), Y("span", bx, " > ")) : W("", !0)])]), + class: X(e.iconClass) + }, null, 2)) : W("", !0), H("span", null, J(e.label), 1)]), H("span", Lx, [e.rightHint ? (q(), Y("span", Rx, J(e.rightHint), 1)) : W("", !0), Array.isArray(e.submenu) && e.submenu.length ? (q(), Y("span", zx, " > ")) : W("", !0)])]), _: 2 }, 1032, [ "class", @@ -23056,20 +23268,20 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "onMouseenter", "onMouseleave" ]))], 64))), 128))], 4)) : W("", !0), - X(_n).submenu.open ? (K(), Y("div", { + Z(en).submenu.open ? (q(), Y("div", { key: 1, ref_key: "submenuRef", ref: n, class: "mjr-grid-rating-submenu mjr-context-menu", - style: xr(s.value), + style: fr(s.value), role: "menu", "aria-label": "Grid context submenu", onMouseenter: y, onMouseleave: b - }, [(K(!0), Y(V, null, hr(X(_n).submenu.items, (e) => (K(), Y(V, { key: e.id }, [e.type === "separator" ? (K(), Y("div", xx)) : (K(), ir(a, { + }, [(q(!0), Y(V, null, $n(Z(en).submenu.items, (e) => (q(), Y(V, { key: e.id }, [e.type === "separator" ? (q(), Y("div", Bx)) : (q(), Jn(a, { key: 1, type: "button", - class: Q(["mjr-context-menu-item", { + class: X(["mjr-context-menu-item", { "is-disabled": e.disabled, "is-tone-graph-map": e.tone === "graph-map", "is-tone-rename": e.tone === "rename", @@ -23083,10 +23295,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr tabindex: e.disabled ? -1 : 0, onClick: (t) => g(e, t, "submenu") }, { - default: U(() => [H("span", Sx, [e.iconClass ? (K(), Y("i", { + default: G(() => [H("span", Vx, [e.iconClass ? (q(), Y("i", { key: 0, - class: Q(e.iconClass) - }, null, 2)) : W("", !0), H("span", null, q(e.label), 1)]), e.rightHint ? (K(), Y("span", Cx, q(e.rightHint), 1)) : W("", !0)]), + class: X(e.iconClass) + }, null, 2)) : W("", !0), H("span", null, J(e.label), 1)]), e.rightHint ? (q(), Y("span", Hx, J(e.rightHint), 1)) : W("", !0)]), _: 2 }, 1032, [ "class", @@ -23094,126 +23306,120 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "tabindex", "onClick" ]))], 64))), 128))], 36)) : W("", !0), - X(_n).tags.open && X(_n).tags.assets ? (K(), Y("div", { + Z(en).tags.open && Z(en).tags.asset ? (q(), Y("div", { key: 2, ref_key: "tagsPopoverRef", ref: r, class: "mjr-grid-popover", - style: xr(c.value) - }, [J(hx, { assets: X(_n).tags.assets }, null, 8, ["assets"])], 4)) : X(_n).tags.open && X(_n).tags.asset ? (K(), Y("div", { - key: 3, - ref_key: "tagsPopoverRef", - ref: r, - class: "mjr-grid-popover", - style: xr(c.value) - }, [J(Nr, { - asset: X(_n).tags.asset, - "model-value": X(_n).tags.asset?.tags || [], + style: fr(c.value) + }, [U(zn, { + asset: Z(en).tags.asset, + "model-value": Z(en).tags.asset?.tags || [], "onUpdate:modelValue": T, onTagsChange: E }, null, 8, ["asset", "model-value"])], 4)) : W("", !0) ]); }; } -}), Tx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Ex = { class: "mjr-workflow-picker-header" }, Dx = { class: "mjr-workflow-picker-title" }, Ox = { class: "mjr-workflow-picker-subtitle" }, kx = { class: "mjr-workflow-info-form" }, Ax = { class: "is-wide" }, jx = { class: "mjr-workflow-picker-footer" }, Mx = /* @__PURE__ */ dr({ +}), Wx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Gx = { class: "mjr-workflow-picker-header" }, Kx = { class: "mjr-workflow-picker-title" }, qx = { class: "mjr-workflow-picker-subtitle" }, Jx = { class: "mjr-workflow-info-form" }, Yx = { class: "is-wide" }, Xx = { class: "mjr-workflow-picker-footer" }, Zx = /* @__PURE__ */ tr({ __name: "WorkflowInfoDialog", setup(e) { - let t = Cr({ + let t = hr({ task: "", model_family: "", provider: "", runs_on: "", notes: "" - }), n = G(() => Ri.workflow || null), r = G(() => String(n.value?.display_name || n.value?.filename || "Workflow")); - cr(() => Ri.open, (e) => { + }), n = K(() => ca.workflow || null), r = K(() => String(n.value?.display_name || n.value?.filename || "Workflow")); + or(() => ca.open, (e) => { if (!e) return; let r = n.value || {}; t.task = String(r.user_task || r.task || ""), t.model_family = String(r.user_model_family || r.model_family || ""), t.provider = String(r.user_provider || r.provider || ""), t.runs_on = String(r.user_runs_on || r.runs_on || ""), t.notes = String(r.notes || ""); }); - function i() { - Bi(); + function a() { + ua(); } - async function a() { + async function o() { let e = String(n.value?.filepath || "").trim(); if (!e) { - I(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); + F(L("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let r = await h({ + let r = await i({ filepath: e, ...t }, { timeoutMs: 2e4 }); - r?.ok ? (I(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-info" } })), i()) : I(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + r?.ok ? (F(L("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-info" } })), a()) : F(r?.error || L("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } - return (e, n) => (K(), ir(Dr, { to: "body" }, [X(Ri).open ? (K(), Y("div", { + return (e, n) => (q(), Jn(yr, { to: "body" }, [Z(ca).open ? (q(), Y("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: mr(i, ["self"]) - }, [H("section", Tx, [ - H("header", Ex, [H("div", null, [H("div", Dx, q(X(R)("ctx.editWorkflowInfo", "Edit infos")), 1), H("div", Ox, q(r.value), 1)]), H("button", { + onClick: rr(a, ["self"]) + }, [H("section", Wx, [ + H("header", Gx, [H("div", null, [H("div", Kx, J(Z(L)("ctx.editWorkflowInfo", "Edit infos")), 1), H("div", qx, J(r.value), 1)]), H("button", { type: "button", class: "mjr-workflow-picker-close", - onClick: i + onClick: a }, [...n[5] ||= [H("i", { class: "pi pi-times" }, null, -1)]])]), - H("div", kx, [ - H("label", null, [n[6] ||= H("span", null, "Task", -1), _r(H("input", { + H("div", Jx, [ + H("label", null, [n[6] ||= H("span", null, "Task", -1), Kn(H("input", { "onUpdate:modelValue": n[0] ||= (e) => t.task = e, type: "text", placeholder: "I2V, I2I, T2V, Image Edit..." - }, null, 512), [[kr, t.task]])]), - H("label", null, [n[7] ||= H("span", null, "Model family", -1), _r(H("input", { + }, null, 512), [[xr, t.task]])]), + H("label", null, [n[7] ||= H("span", null, "Model family", -1), Kn(H("input", { "onUpdate:modelValue": n[1] ||= (e) => t.model_family = e, type: "text", placeholder: "Flux, Qwen, Wan..." - }, null, 512), [[kr, t.model_family]])]), - H("label", null, [n[8] ||= H("span", null, "Provider", -1), _r(H("input", { + }, null, 512), [[xr, t.model_family]])]), + H("label", null, [n[8] ||= H("span", null, "Provider", -1), Kn(H("input", { "onUpdate:modelValue": n[2] ||= (e) => t.provider = e, type: "text", placeholder: "Google, ByteDance, local..." - }, null, 512), [[kr, t.provider]])]), - H("label", null, [n[10] ||= H("span", null, "Runs on", -1), _r(H("select", { "onUpdate:modelValue": n[3] ||= (e) => t.runs_on = e }, [...n[9] ||= [ + }, null, 512), [[xr, t.provider]])]), + H("label", null, [n[10] ||= H("span", null, "Runs on", -1), Kn(H("select", { "onUpdate:modelValue": n[3] ||= (e) => t.runs_on = e }, [...n[9] ||= [ H("option", { value: "" }, "Auto", -1), H("option", { value: "local" }, "local", -1), H("option", { value: "api" }, "api", -1), H("option", { value: "cloud" }, "cloud", -1) - ]], 512), [[Er, t.runs_on]])]), - H("label", Ax, [n[11] ||= H("span", null, "Notes", -1), _r(H("textarea", { + ]], 512), [[vr, t.runs_on]])]), + H("label", Yx, [n[11] ||= H("span", null, "Notes", -1), Kn(H("textarea", { "onUpdate:modelValue": n[4] ||= (e) => t.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" - }, null, 512), [[kr, t.notes]])]) + }, null, 512), [[xr, t.notes]])]) ]), - H("footer", jx, [H("button", { + H("footer", Xx, [H("button", { type: "button", class: "mjr-workflow-picker-secondary", - onClick: i - }, q(X(R)("btn.cancel", "Cancel")), 1), H("button", { + onClick: a + }, J(Z(L)("btn.cancel", "Cancel")), 1), H("button", { type: "button", class: "mjr-workflow-picker-primary", - onClick: a - }, q(X(R)("btn.apply", "Apply")), 1)]) + onClick: o + }, J(Z(L)("btn.apply", "Apply")), 1)]) ])])) : W("", !0)])); } -}), Nx = { class: "mjr-workflow-picker-header" }, Px = { class: "mjr-workflow-picker-title" }, Fx = { +}), Qx = { class: "mjr-workflow-picker-header" }, $x = { class: "mjr-workflow-picker-title" }, eS = { key: 0, class: "mjr-workflow-picker-source" -}, Ix = { class: "mjr-workflow-picker-toolbar" }, Lx = { class: "mjr-workflow-picker-search" }, Rx = ["placeholder"], zx = { value: "" }, Bx = ["value"], Vx = { value: "" }, Hx = ["value"], Ux = { value: "" }, Wx = ["value"], Gx = { class: "mjr-workflow-picker-body" }, Kx = { +}, tS = { class: "mjr-workflow-picker-toolbar" }, nS = { class: "mjr-workflow-picker-search" }, rS = ["placeholder"], iS = { value: "" }, aS = ["value"], oS = { value: "" }, sS = ["value"], cS = { value: "" }, lS = ["value"], uS = { class: "mjr-workflow-picker-body" }, dS = { key: 0, class: "mjr-workflow-picker-empty" -}, qx = { +}, fS = { key: 1, class: "mjr-workflow-picker-empty is-error" -}, Jx = { +}, pS = { key: 2, class: "mjr-workflow-picker-empty" -}, Yx = ["onClick"], Xx = { class: "mjr-workflow-picker-thumb" }, Zx = ["src", "alt"], Qx = { +}, mS = ["onClick"], hS = { class: "mjr-workflow-picker-thumb" }, gS = ["src", "alt"], _S = { key: 1, class: "pi pi-sitemap" -}, $x = { class: "mjr-workflow-picker-card-info" }, eS = ["disabled"], tS = { class: "mjr-workflow-picker-card-info" }, nS = { class: "mjr-workflow-picker-footer" }, rS = ["disabled"], iS = 120, aS = /* @__PURE__ */ dr({ +}, vS = { class: "mjr-workflow-picker-card-info" }, yS = ["disabled"], bS = { class: "mjr-workflow-picker-card-info" }, xS = { class: "mjr-workflow-picker-footer" }, SS = ["disabled"], CS = 120, wS = /* @__PURE__ */ tr({ __name: "WorkflowPickerDialog", setup(e) { - let t = Z(""), n = Z(!1), r = Z(!1), i = Z(""), a = Z([]), s = Z(""), c = Z(0), l = Z(!1), u = 0, d = G(() => Cn.sourceAsset || null), f = G(() => Cn.workflow || null), p = G(() => String(Cn.mode || "") === "asset"), m = G(() => String(d.value?.filename || d.value?.display_name || f.value?.display_name || f.value?.filename || d.value?.filepath || f.value?.filepath || "")), h = G(() => x("task")), g = G(() => x("model_family")), _ = G(() => x("runs_on")), v = Z(""), y = Z(""), b = Z(""); - function x(e) { + let t = Q(""), n = Q(!1), r = Q(!1), i = Q(""), a = Q([]), o = Q(""), s = Q(0), c = Q(!1), l = 0, u = K(() => Mn.sourceAsset || null), d = K(() => Mn.workflow || null), f = K(() => String(Mn.mode || "") === "asset"), p = K(() => String(u.value?.filename || u.value?.display_name || d.value?.display_name || d.value?.filename || u.value?.filepath || d.value?.filepath || "")), m = K(() => b("task")), h = K(() => b("model_family")), g = K(() => b("runs_on")), _ = Q(""), v = Q(""), y = Q(""); + function b(e) { let t = /* @__PURE__ */ new Set(); for (let n of a.value || []) { let r = String(n?.[e] || "").trim(); @@ -23221,9 +23427,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } return Array.from(t).sort((e, t) => e.localeCompare(t)); } - let S = G(() => { + let x = K(() => { let e = t.value.trim().toLowerCase(); - return (a.value || []).filter((t) => !p.value && (v.value && String(t?.task || "") !== v.value || y.value && String(t?.model_family || "") !== y.value || b.value && String(t?.runs_on || "") !== b.value) ? !1 : !e || [ + return (a.value || []).filter((t) => !f.value && (_.value && String(t?.task || "") !== _.value || v.value && String(t?.model_family || "") !== v.value || y.value && String(t?.runs_on || "") !== y.value) ? !1 : !e || [ t?.display_name, t?.filename, t?.description, @@ -23234,181 +23440,181 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr t?.kind, t?.filepath ].join(" ").toLowerCase().includes(e)); - }), C = G(() => (a.value || []).find((e) => String(e?.filepath || "") === s.value) || null); - function w(e) { + }), S = K(() => (a.value || []).find((e) => String(e?.filepath || "") === o.value) || null); + function C(e) { return String(e?.display_name || e?.name || e?.filename || "Workflow"); } - function T(e) { - return p.value ? [e?.kind, e?.mtime ? (/* @__PURE__ */ new Date(Number(e.mtime) * 1e3)).toLocaleString() : ""].map((e) => String(e || "").trim()).filter(Boolean).join(" / ") : [ + function w(e) { + return f.value ? [e?.kind, e?.mtime ? (/* @__PURE__ */ new Date(Number(e.mtime) * 1e3)).toLocaleString() : ""].map((e) => String(e || "").trim()).filter(Boolean).join(" / ") : [ e?.task, e?.model_family, e?.runs_on, e?.subfolder ].map((e) => String(e || "").trim()).filter(Boolean).join(" / "); } - function E(e) { + function T(e) { return String(e?.thumbnail_url || e?.animated_thumbnail_url || e?.thumb_url || e?.preview_url || e?.graph_map_thumbnail_url || "").trim(); } - async function D({ reset: e = !1 } = {}) { - let t = ++u; - e && (c.value = 0, l.value = !1); - let d = e ? 0 : c.value; + async function E({ reset: e = !1 } = {}) { + let t = ++l; + e && (s.value = 0, c.value = !1); + let u = e ? 0 : s.value; e ? n.value = !0 : r.value = !0, i.value = ""; try { - if (p.value) { - a.value = Array.isArray(Cn.items) ? Cn.items.filter((e) => String(e?.filepath || "").trim()) : [], !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); + if (f.value) { + a.value = Array.isArray(Mn.items) ? Mn.items.filter((e) => String(e?.filepath || "").trim()) : [], !o.value && a.value[0]?.filepath && (o.value = String(a.value[0].filepath)); return; } - let n = await o({ + let n = await le({ q: "*", - limit: iS, - offset: d, + limit: CS, + offset: u, sort: "mtime" }, { timeoutMs: 2e4 }); - if (t !== u) return; + if (t !== l) return; if (!n?.ok) { i.value = String(n?.error || "Failed to load workflows"), e && (a.value = []); return; } let r = (Array.isArray(n?.data?.assets) ? n.data.assets : Array.isArray(n?.data) ? n.data : []).filter((e) => String(e?.filepath || "").trim()); - a.value = e ? r : [...a.value, ...r], c.value = d + r.length, l.value = r.length >= iS, !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); + a.value = e ? r : [...a.value, ...r], s.value = u + r.length, c.value = r.length >= CS, !o.value && a.value[0]?.filepath && (o.value = String(a.value[0].filepath)); } catch (e) { - t === u && (i.value = String(e?.message || e || "Failed to load workflows"), a.value = []); + t === l && (i.value = String(e?.message || e || "Failed to load workflows"), a.value = []); } finally { - t === u && (n.value = !1, r.value = !1); + t === l && (n.value = !1, r.value = !1); } } - async function O() { - return D({ reset: !0 }); + async function D() { + return E({ reset: !0 }); } - async function k() { - if (!(n.value || r.value || !l.value)) return D({ reset: !1 }); + async function O() { + if (!(n.value || r.value || !c.value)) return E({ reset: !1 }); + } + function k() { + S.value && wn(S.value); } function A() { - C.value && Fn(C.value); + wn(null); } - function j() { - Fn(null); + function ee(e) { + e.key === "Escape" && (e.preventDefault(), A()); } - function M(e) { - e.key === "Escape" && (e.preventDefault(), j()); - } - return cr(() => Cn.open, (e) => { + return or(() => Mn.open, (e) => { if (e) { - s.value = "", c.value = 0, l.value = !1, t.value = "", v.value = "", y.value = "", b.value = "", O(); + o.value = "", s.value = 0, c.value = !1, t.value = "", _.value = "", v.value = "", y.value = "", D(); try { - window.addEventListener("keydown", M); + window.addEventListener("keydown", ee); } catch {} } else try { - window.removeEventListener("keydown", M); + window.removeEventListener("keydown", ee); } catch {} - }), pr(() => { + }), ar(() => { try { - window.removeEventListener("keydown", M); + window.removeEventListener("keydown", ee); } catch {} - }), (e, a) => (K(), ir(Dr, { to: "body" }, [X(Cn).open ? (K(), Y("div", { + }), (e, a) => (q(), Jn(yr, { to: "body" }, [Z(Mn).open ? (q(), Y("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onMousedown: mr(j, ["self"]) + onMousedown: rr(A, ["self"]) }, [H("section", { - class: Q(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), + class: X(["mjr-workflow-picker-dialog", { "is-asset-mode": f.value }]), role: "dialog", "aria-modal": "true" }, [ - H("header", Nx, [H("div", Px, [a[4] ||= H("i", { class: "pi pi-sitemap" }, null, -1), H("span", null, q(X(Cn).title), 1)]), H("button", { + H("header", Qx, [H("div", $x, [a[4] ||= H("i", { class: "pi pi-sitemap" }, null, -1), H("span", null, J(Z(Mn).title), 1)]), H("button", { class: "mjr-workflow-picker-icon-btn", type: "button", - onClick: j + onClick: A }, [...a[5] ||= [H("i", { class: "pi pi-times" }, null, -1)]])]), - m.value ? (K(), Y("div", Fx, [H("span", null, q(p.value ? X(R)("tab.workflow", "Workflow") : X(R)("dialog.workflowThumbnailSource", "Source")), 1), H("strong", null, q(m.value), 1)])) : W("", !0), - H("div", Ix, [ - H("label", Lx, [a[6] ||= H("i", { class: "pi pi-search" }, null, -1), _r(H("input", { + p.value ? (q(), Y("div", eS, [H("span", null, J(f.value ? Z(L)("tab.workflow", "Workflow") : Z(L)("dialog.workflowThumbnailSource", "Source")), 1), H("strong", null, J(p.value), 1)])) : W("", !0), + H("div", tS, [ + H("label", nS, [a[6] ||= H("i", { class: "pi pi-search" }, null, -1), Kn(H("input", { "onUpdate:modelValue": a[0] ||= (e) => t.value = e, type: "search", - placeholder: X(R)("search.workflows", "Search workflows...") - }, null, 8, Rx), [[kr, t.value]])]), - p.value ? W("", !0) : _r((K(), Y("select", { + placeholder: Z(L)("search.workflows", "Search workflows...") + }, null, 8, rS), [[xr, t.value]])]), + f.value ? W("", !0) : Kn((q(), Y("select", { key: 0, - "onUpdate:modelValue": a[1] ||= (e) => v.value = e - }, [H("option", zx, q(X(R)("filter.task", "Task")), 1), (K(!0), Y(V, null, hr(h.value, (e) => (K(), Y("option", { + "onUpdate:modelValue": a[1] ||= (e) => _.value = e + }, [H("option", iS, J(Z(L)("filter.task", "Task")), 1), (q(!0), Y(V, null, $n(m.value, (e) => (q(), Y("option", { key: e, value: e - }, q(e), 9, Bx))), 128))], 512)), [[Er, v.value]]), - p.value ? W("", !0) : _r((K(), Y("select", { + }, J(e), 9, aS))), 128))], 512)), [[vr, _.value]]), + f.value ? W("", !0) : Kn((q(), Y("select", { key: 1, - "onUpdate:modelValue": a[2] ||= (e) => y.value = e - }, [H("option", Vx, q(X(R)("filter.model", "Model")), 1), (K(!0), Y(V, null, hr(g.value, (e) => (K(), Y("option", { + "onUpdate:modelValue": a[2] ||= (e) => v.value = e + }, [H("option", oS, J(Z(L)("filter.model", "Model")), 1), (q(!0), Y(V, null, $n(h.value, (e) => (q(), Y("option", { key: e, value: e - }, q(e), 9, Hx))), 128))], 512)), [[Er, y.value]]), - p.value ? W("", !0) : _r((K(), Y("select", { + }, J(e), 9, sS))), 128))], 512)), [[vr, v.value]]), + f.value ? W("", !0) : Kn((q(), Y("select", { key: 2, - "onUpdate:modelValue": a[3] ||= (e) => b.value = e - }, [H("option", Ux, q(X(R)("filter.runsOn", "Runs on")), 1), (K(!0), Y(V, null, hr(_.value, (e) => (K(), Y("option", { + "onUpdate:modelValue": a[3] ||= (e) => y.value = e + }, [H("option", cS, J(Z(L)("filter.runsOn", "Runs on")), 1), (q(!0), Y(V, null, $n(g.value, (e) => (q(), Y("option", { key: e, value: e - }, q(e), 9, Wx))), 128))], 512)), [[Er, b.value]]) + }, J(e), 9, lS))), 128))], 512)), [[vr, y.value]]) ]), - H("div", Gx, [n.value ? (K(), Y("div", Kx, q(X(R)("status.loading", "Loading...")), 1)) : i.value ? (K(), Y("div", qx, q(i.value), 1)) : S.value.length ? (K(), Y(V, { key: 3 }, [(K(!0), Y(V, null, hr(S.value, (e) => (K(), Y("button", { + H("div", uS, [n.value ? (q(), Y("div", dS, J(Z(L)("status.loading", "Loading...")), 1)) : i.value ? (q(), Y("div", fS, J(i.value), 1)) : x.value.length ? (q(), Y(V, { key: 3 }, [(q(!0), Y(V, null, $n(x.value, (e) => (q(), Y("button", { key: e.filepath, type: "button", - class: Q(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), - onClick: (t) => s.value = String(e.filepath || ""), - onDblclick: A - }, [H("div", Xx, [E(e) ? (K(), Y("img", { + class: X(["mjr-workflow-picker-card", { "is-selected": o.value === String(e.filepath || "") }]), + onClick: (t) => o.value = String(e.filepath || ""), + onDblclick: k + }, [H("div", hS, [T(e) ? (q(), Y("img", { key: 0, - src: E(e), - alt: w(e), + src: T(e), + alt: C(e), loading: "lazy" - }, null, 8, Zx)) : (K(), Y("i", Qx))]), H("div", $x, [ - H("strong", null, q(w(e)), 1), - H("span", null, q(T(e)), 1), - H("small", null, q(e.filename), 1) - ])], 42, Yx))), 128)), !p.value && l.value ? (K(), Y("button", { + }, null, 8, gS)) : (q(), Y("i", _S))]), H("div", vS, [ + H("strong", null, J(C(e)), 1), + H("span", null, J(w(e)), 1), + H("small", null, J(e.filename), 1) + ])], 42, mS))), 128)), !f.value && c.value ? (q(), Y("button", { key: 0, type: "button", class: "mjr-workflow-picker-card mjr-workflow-picker-load-more", disabled: r.value, - onClick: k - }, [a[7] ||= H("div", { class: "mjr-workflow-picker-thumb" }, [H("i", { class: "pi pi-angle-down" })], -1), H("div", tS, [ - H("strong", null, q(r.value ? X(R)("status.loading", "Loading...") : X(R)("action.loadMore", "Load more")), 1), - H("span", null, q(X(R)("tab.workflow", "Workflow")), 1), - H("small", null, q(c.value) + " loaded", 1) - ])], 8, eS)) : W("", !0)], 64)) : (K(), Y("div", Jx, q(X(R)("toast.noWorkflowsFound", "No workflows found.")), 1))]), - H("footer", nS, [H("button", { + onClick: O + }, [a[7] ||= H("div", { class: "mjr-workflow-picker-thumb" }, [H("i", { class: "pi pi-angle-down" })], -1), H("div", bS, [ + H("strong", null, J(r.value ? Z(L)("status.loading", "Loading...") : Z(L)("action.loadMore", "Load more")), 1), + H("span", null, J(Z(L)("tab.workflow", "Workflow")), 1), + H("small", null, J(s.value) + " loaded", 1) + ])], 8, yS)) : W("", !0)], 64)) : (q(), Y("div", pS, J(Z(L)("toast.noWorkflowsFound", "No workflows found.")), 1))]), + H("footer", xS, [H("button", { type: "button", class: "mjr-workflow-picker-btn", - onClick: j - }, q(X(R)("action.cancel", "Cancel")), 1), H("button", { + onClick: A + }, J(Z(L)("action.cancel", "Cancel")), 1), H("button", { type: "button", class: "mjr-workflow-picker-btn is-primary", - disabled: !C.value, - onClick: A - }, q(X(R)("action.apply", "Apply")), 9, rS)]) + disabled: !S.value, + onClick: k + }, J(Z(L)("action.apply", "Apply")), 9, SS)]) ], 2)], 32)) : W("", !0)])); } -}), oS = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, sS = { class: "mjr-workflow-picker-header" }, cS = { class: "mjr-workflow-picker-title" }, lS = { class: "mjr-workflow-picker-subtitle" }, uS = { class: "mjr-workflow-info-form" }, dS = { class: "is-wide" }, fS = { class: "is-wide" }, pS = { class: "mjr-workflow-picker-footer" }, mS = /* @__PURE__ */ dr({ +}), TS = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, ES = { class: "mjr-workflow-picker-header" }, DS = { class: "mjr-workflow-picker-title" }, OS = { class: "mjr-workflow-picker-subtitle" }, kS = { class: "mjr-workflow-info-form" }, AS = { class: "is-wide" }, jS = { class: "is-wide" }, MS = { class: "mjr-workflow-picker-footer" }, NS = /* @__PURE__ */ tr({ __name: "WorkflowSaveInfoDialog", setup(e) { - let t = Cr({ + let t = hr({ name: "", task: "", model_family: "", provider: "", runs_on: "", notes: "" - }), n = G(() => x_.initial || {}), r = G(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = G(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); - cr(() => x_.open, (e) => { + }), n = K(() => Z_.initial || {}), r = K(() => L("dialog.saveWorkflowWithInfo", "Save workflow")), i = K(() => L("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); + or(() => Z_.open, (e) => { if (!e) return; let r = n.value || {}; t.name = String(r.name || r.workflow?.name || r.workflow?.title || "workflow").trim(), t.task = String(r.task || ""), t.model_family = String(r.model_family || ""), t.provider = String(r.provider || ""), t.runs_on = String(r.runs_on || ""), t.notes = String(r.notes || ""); }); function a() { - C_(null); + $_(null); } function o() { let e = String(t.name || "").trim(); - e && C_({ + e && $_({ name: e, task: String(t.task || "").trim(), model_family: String(t.model_family || "").trim(), @@ -23418,47 +23624,47 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }); } return (e, n) => { - let s = ar("MButton"), c = ar("MInputText"), l = ar("MSelect"), u = ar("MTextarea"); - return K(), ir(Dr, { to: "body" }, [X(x_).open ? (K(), Y("div", { + let s = Qn("MButton"), c = Qn("MInputText"), l = Qn("MSelect"), u = Qn("MTextarea"); + return q(), Jn(yr, { to: "body" }, [Z(Z_).open ? (q(), Y("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: mr(a, ["self"]) - }, [H("section", oS, [ - H("header", sS, [H("div", null, [H("div", cS, q(r.value), 1), H("div", lS, q(i.value), 1)]), J(s, { + onClick: rr(a, ["self"]) + }, [H("section", TS, [ + H("header", ES, [H("div", null, [H("div", DS, J(r.value), 1), H("div", OS, J(i.value), 1)]), U(s, { type: "button", class: "mjr-workflow-picker-close", onClick: a }, { - default: U(() => [...n[6] ||= [H("i", { class: "pi pi-times" }, null, -1)]]), + default: G(() => [...n[6] ||= [H("i", { class: "pi pi-times" }, null, -1)]]), _: 1 })]), - H("div", uS, [ - H("label", dS, [H("span", null, q(X(R)("dialog.workflowSaveName", "Workflow name")), 1), J(c, { + H("div", kS, [ + H("label", AS, [H("span", null, J(Z(L)("dialog.workflowSaveName", "Workflow name")), 1), U(c, { modelValue: t.name, "onUpdate:modelValue": n[0] ||= (e) => t.name = e, type: "text", placeholder: "workflow", - onKeydown: Or(mr(o, ["prevent"]), ["enter"]) + onKeydown: br(rr(o, ["prevent"]), ["enter"]) }, null, 8, ["modelValue", "onKeydown"])]), - H("label", null, [n[7] ||= H("span", null, "Task", -1), J(c, { + H("label", null, [n[7] ||= H("span", null, "Task", -1), U(c, { modelValue: t.task, "onUpdate:modelValue": n[1] ||= (e) => t.task = e, type: "text", placeholder: "Auto" }, null, 8, ["modelValue"])]), - H("label", null, [n[8] ||= H("span", null, "Model family", -1), J(c, { + H("label", null, [n[8] ||= H("span", null, "Model family", -1), U(c, { modelValue: t.model_family, "onUpdate:modelValue": n[2] ||= (e) => t.model_family = e, type: "text", placeholder: "Auto" }, null, 8, ["modelValue"])]), - H("label", null, [n[9] ||= H("span", null, "Provider", -1), J(c, { + H("label", null, [n[9] ||= H("span", null, "Provider", -1), U(c, { modelValue: t.provider, "onUpdate:modelValue": n[3] ||= (e) => t.provider = e, type: "text", placeholder: "Auto" }, null, 8, ["modelValue"])]), - H("label", null, [n[10] ||= H("span", null, "Runs on", -1), J(l, { + H("label", null, [n[10] ||= H("span", null, "Runs on", -1), U(l, { modelValue: t.runs_on, "onUpdate:modelValue": n[4] ||= (e) => t.runs_on = e, options: [ @@ -23483,49 +23689,49 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "option-value": "value", placeholder: "Auto" }, null, 8, ["modelValue"])]), - H("label", fS, [n[11] ||= H("span", null, "Notes", -1), J(u, { + H("label", jS, [n[11] ||= H("span", null, "Notes", -1), U(u, { modelValue: t.notes, "onUpdate:modelValue": n[5] ||= (e) => t.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" }, null, 8, ["modelValue"])]) ]), - H("footer", pS, [J(s, { + H("footer", MS, [U(s, { type: "button", class: "mjr-workflow-picker-secondary", onClick: a }, { - default: U(() => [nr(q(X(R)("btn.cancel", "Cancel")), 1)]), + default: G(() => [pr(J(Z(L)("btn.cancel", "Cancel")), 1)]), _: 1 - }), J(s, { + }), U(s, { type: "button", class: "mjr-workflow-picker-primary", disabled: !String(t.name || "").trim(), onClick: o }, { - default: U(() => [nr(q(X(R)("btn.save", "Save")), 1)]), + default: G(() => [pr(J(Z(L)("btn.save", "Save")), 1)]), _: 1 }, 8, ["disabled"])]) ])])) : W("", !0)]); }; } -}), hS = /* @__PURE__ */ dr({ +}), PS = /* @__PURE__ */ tr({ __name: "ContextMenuPortal", setup(e) { - let t = Z(""), n = G(() => yn(t.value)); - return Ar(() => { - t.value = Qt(); - }), rr(() => { - sn(t.value), t.value = ""; - }), (e, t) => n.value ? (K(), Y(V, { key: 0 }, [ - J(wx), - J(ix), - J(aS), - J(Mx), - J(mS) + let t = Q(""), n = K(() => rn(t.value)); + return Zn(() => { + t.value = cn(); + }), ir(() => { + Xt(t.value), t.value = ""; + }), (e, t) => n.value ? (q(), Y(V, { key: 0 }, [ + U(Ux), + U(Px), + U(wS), + U(Zx), + U(NS) ], 64)) : W("", !0); } -}), gS = { +}), FS = { class: "mjr-sidebar-content", style: { flex: "1", @@ -23535,29 +23741,29 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "flex-direction": "column", gap: "16px" } -}, _S = { +}, IS = { class: "mjr-sidebar-rating-tags", style: { display: "flex", "flex-direction": "column", gap: "10px" } -}, vS = { style: { +}, LS = { style: { display: "flex", "align-items": "center", gap: "8px" -} }, yS = { style: { +} }, RS = { style: { "font-size": "0.8em", opacity: "0.6", "min-width": "44px" -} }, bS = { style: { +} }, zS = { style: { display: "flex", "flex-direction": "column", gap: "4px" -} }, xS = { style: { +} }, BS = { style: { "font-size": "0.8em", opacity: "0.6" -} }, SS = /* @__PURE__ */ dr({ +} }, VS = /* @__PURE__ */ tr({ __name: "AssetSidebarContent", props: { asset: {}, @@ -23566,78 +23772,78 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, emits: ["close"], setup(e, { emit: t }) { - let n = e, r = t, i = G(() => String(n.asset?.kind || "").toLowerCase() === "folder"), a = G(() => { + let n = e, r = t, i = K(() => String(n.asset?.kind || "").toLowerCase() === "folder"), a = K(() => { let e = String(n.asset?.kind || "").toLowerCase(), t = String(n.asset?.source || n.asset?.scope || "").toLowerCase(), r = String(n.asset?.filepath || n.asset?.path || "").toLowerCase(); return e === "workflow" || t === "workflow" || r.endsWith(".json"); - }), o = G(() => Number(n.asset?.rating) || 0), s = G(() => n.asset?.tags || []), c = G(() => { + }), o = K(() => Number(n.asset?.rating) || 0), s = K(() => n.asset?.tags || []), c = K(() => { try { - return !!(Xt()?.sidebar?.showPreviewThumb ?? !0); + return !!(Mt()?.sidebar?.showPreviewThumb ?? !0); } catch { return !0; } }); function l() { if (n.sidebar) try { - eh(n.sidebar); + Ah(n.sidebar); } catch (e) { console.debug?.(e); } else r("close"); } - let u = Z(!1), d = G(() => String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim()); + let u = Q(!1), d = K(() => String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim()); async function f() { if (!u.value && d.value) { u.value = !0; try { - I(R("toast.collectingFiles", "Collecting files..."), "info", 2500); - let e = await T(d.value); + F(L("toast.collectingFiles", "Collecting files..."), "info", 2500); + let e = await De(d.value); if (!e?.ok) { - I(e?.error || R("toast.collectFilesFailed", "Collect files failed"), "error"); + F(e?.error || L("toast.collectFilesFailed", "Collect files failed"), "error"); return; } - let t = e?.data || {}, n = Array.isArray(t.missing) ? t.missing.length : 0, r = t.fallback_used ? R("toast.collectFallbackDir", "output folder (source folder not writable)") : R("toast.collectSameDir", "asset folder"), i = R("toast.collectedFiles", "Collected {name} in {where}", { + let t = e?.data || {}, n = Array.isArray(t.missing) ? t.missing.length : 0, r = t.fallback_used ? L("toast.collectFallbackDir", "output folder (source folder not writable)") : L("toast.collectSameDir", "asset folder"), i = L("toast.collectedFiles", "Collected {name} in {where}", { name: String(t.zip_name || "zip"), where: r }); - n > 0 && (i += ` \u2014 ${n} ${R("toast.collectMissingInputs", "input(s) missing")}`), I(i, n > 0 ? "warning" : "success", 6e3); + n > 0 && (i += ` \u2014 ${n} ${L("toast.collectMissingInputs", "input(s) missing")}`), F(i, n > 0 ? "warning" : "success", 6e3); } catch (e) { - console.debug?.(e), I(R("toast.collectFilesFailed", "Collect files failed"), "error"); + console.debug?.(e), F(L("toast.collectFilesFailed", "Collect files failed"), "error"); } finally { u.value = !1; } } } return (t, n) => { - let r = ar("MButton"); - return K(), Y(V, null, [ - J(Mb, { + let r = Qn("MButton"); + return q(), Y(V, null, [ + U(cx, { asset: e.asset, onClose: l }, null, 8, ["asset"]), - H("div", gS, [i.value ? (K(), ir(qb, { + H("div", FS, [i.value ? (q(), Jn(Tx, { key: 0, asset: e.asset - }, null, 8, ["asset"])) : (K(), Y(V, { key: 1 }, [a.value ? W("", !0) : (K(), Y(V, { key: 0 }, [ - J(Vb, { + }, null, 8, ["asset"])) : (q(), Y(V, { key: 1 }, [a.value ? W("", !0) : (q(), Y(V, { key: 0 }, [ + U(yx, { asset: e.asset, "show-preview-thumb": c.value }, null, 8, ["asset", "show-preview-thumb"]), - H("div", _S, [H("div", vS, [H("span", yS, q(X(R)("sidebar.rating", "Rating")), 1), J(Yb, { + H("div", IS, [H("div", LS, [H("span", RS, J(Z(L)("sidebar.rating", "Rating")), 1), U(Nn, { asset: e.asset, "model-value": o.value, size: 60 - }, null, 8, ["asset", "model-value"])]), H("div", bS, [H("span", xS, q(X(R)("sidebar.tags", "Tags")), 1), J(Nr, { + }, null, 8, ["asset", "model-value"])]), H("div", zS, [H("span", BS, J(Z(L)("sidebar.tags", "Tags")), 1), U(zn, { asset: e.asset, "model-value": s.value }, null, 8, ["asset", "model-value"])])]), - J(jn, { asset: e.asset }, null, 8, ["asset"]), - d.value ? (K(), ir(r, { + U(xn, { asset: e.asset }, null, 8, ["asset"]), + d.value ? (q(), Jn(r, { key: 0, type: "button", class: "mjr-btn mjr-sidebar-collect-btn", severity: "secondary", disabled: u.value, - title: X(R)("sidebar.collectFilesTooltip", "Create a ZIP next to this asset with the workflow JSON, its media inputs and a manifest"), + title: Z(L)("sidebar.collectFilesTooltip", "Create a ZIP next to this asset with the workflow JSON, its media inputs and a manifest"), style: { display: "flex", "align-items": "center", @@ -23647,16 +23853,16 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, onClick: f }, { - default: U(() => [H("i", { class: Q(u.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), H("span", null, q(u.value ? X(R)("sidebar.collectingFiles", "Collecting...") : X(R)("sidebar.collectFiles", "Collect files")), 1)]), + default: G(() => [H("i", { class: X(u.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), H("span", null, J(u.value ? Z(L)("sidebar.collectingFiles", "Collecting...") : Z(L)("sidebar.collectFiles", "Collect files")), 1)]), _: 1 }, 8, ["disabled", "title"])) : W("", !0), - J(In, { asset: e.asset }, null, 8, ["asset"]) - ], 64)), J(Vn, { asset: e.asset }, null, 8, ["asset"])], 64))]), - J(hS) + U(On, { asset: e.asset }, null, 8, ["asset"]) + ], 64)), U(Ln, { asset: e.asset }, null, 8, ["asset"])], 64))]), + U(PS) ], 64); }; } -}), CS = { +}), HS = { key: 1, class: "mjr-sidebar-placeholder", style: { @@ -23669,11 +23875,11 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "font-size": "0.85em", "text-align": "center" } -}, wS = /* @__PURE__ */ dr({ +}, US = /* @__PURE__ */ tr({ __name: "SidebarSection", setup(e, { expose: t }) { - let n = Z(null), { activeAsset: r, onUpdateCallback: i } = Hm(); - return Ar(() => { + let n = Q(null), { activeAsset: r, onUpdateCallback: i } = vh(); + return Zn(() => { let e = n.value; if (!e) return; e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none", e._requestSeq = 0, e._currentAsset = null, e._currentFullAsset = null, e._ratingTagsSection = null; @@ -23683,7 +23889,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, a = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Number(r.rating); if (t(a) && Number.isFinite(o)) { - Gm({ rating: o }, i.value); + xh({ rating: o }, i.value); try { e._currentAsset && (e._currentAsset.rating = o), e._currentFullAsset && (e._currentFullAsset.rating = o); } catch (e) { @@ -23693,7 +23899,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, o = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Array.isArray(r.tags) ? r.tags : null; if (t(a) && o) { - Gm({ tags: o }, i.value); + xh({ tags: o }, i.value); try { e._currentAsset && (e._currentAsset.tags = o), e._currentFullAsset && (e._currentFullAsset.tags = o); } catch (e) { @@ -23715,16 +23921,16 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, e._dispose = e.dispose; let l = c ? { signal: c.signal } : void 0; try { - window.addEventListener(ct, a, l), window.addEventListener(nt, o, l); + window.addEventListener(Ft, a, l), window.addEventListener(Pt, o, l); } catch (e) { console.debug?.(e); try { - window.addEventListener(ct, a), window.addEventListener(nt, o), s.push(() => window.removeEventListener(ct, a)), s.push(() => window.removeEventListener(nt, o)); + window.addEventListener(Ft, a), window.addEventListener(Pt, o), s.push(() => window.removeEventListener(Ft, a)), s.push(() => window.removeEventListener(Pt, o)); } catch (e) { console.debug?.(e); } } - }), rr(() => { + }), ir(() => { try { n.value?.dispose?.(); } catch {} @@ -23733,7 +23939,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } catch {} }), t({ get sidebar() { return n.value; - } }), (e, t) => (K(), Y("div", { + } }), (e, t) => (q(), Y("div", { ref_key: "sidebarEl", ref: n, class: "mjr-inline-sidebar", @@ -23745,27 +23951,27 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr transition: "width 140ms ease,max-width 140ms ease,flex-basis 140ms ease,border-color 140ms ease", contain: "layout paint style" } - }, [X(r) ? (K(), ir(SS, { + }, [Z(r) ? (q(), Jn(VS, { key: 0, - asset: X(r), - "on-update": X(i), + asset: Z(r), + "on-update": Z(i), sidebar: n.value }, null, 8, [ "asset", "on-update", "sidebar" - ])) : (K(), Y("div", CS, q(X(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); + ])) : (q(), Y("div", HS, J(Z(L)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); } -}), TS = /* @__PURE__ */ dr({ +}), WS = /* @__PURE__ */ tr({ __name: "App", setup(e) { - let t = Z(null), n = Z(null), r = Z(null), i = Z(null), a = Z(null), o = Z(null), s = null; - return Ar(async () => { + let t = Q(null), n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = null; + return Zn(async () => { if (!t.value) return; let e = {}; n.value && (e.statusSection = n.value.statusSection, e.statusDot = n.value.statusDot, e.statusText = n.value.statusText, e.capabilitiesSection = n.value.capabilitiesSection), r.value && (e.headerSection = r.value), i.value && (e.summaryBar = i.value.summaryBar, e.updateSummaryBar = i.value.updateSummaryBar, e.folderBreadcrumb = i.value.folderBreadcrumb, e.folderBreadcrumbController = i.value), a.value && (e.browseSection = a.value.browseSection, e.gridWrapper = a.value.gridWrapper, e.gridContainer = a.value.gridContainer, e.onGridContainerReady = (...e) => a.value?.onGridContainerReady?.(...e), e.bindGridHostState = (...e) => a.value?.bindGridHostState?.(...e), e.restoreGridUiState = (...e) => a.value?.restoreGridUiState?.(...e), e.initAssetsQueryController = (...e) => a.value?.initAssetsQueryController?.(...e), e.loadAssets = (e, t = "*", n = {}) => a.value?.loadAssets?.(t, n), e.loadAssetsFromList = (e, t = [], n = {}) => a.value?.loadAssetsFromList?.(t, n), e.prepareGridForScopeSwitch = (e) => a.value?.prepareGridForScopeSwitch?.(), e.refreshGrid = (e) => a.value?.refreshGrid?.(), e.captureAnchor = (e) => a.value?.captureAnchor?.(), e.restoreAnchor = (e, t) => a.value?.restoreAnchor?.(t), e.hydrateGridFromSnapshot = (e, t = {}, n = {}) => a.value?.hydrateGridFromSnapshot?.(t, n), e.upsertAsset = (e, t) => a.value?.upsertAsset?.(t), e.removeAssets = (e, t = [], n = {}) => a.value?.removeAssets?.(t, n), e.disposeGrid = (e) => a.value?.disposeGrid?.()), o.value && (e.sidebar = o.value.sidebar); try { - s = await v_(t.value, { + s = await J_(t.value, { useComfyThemeUI: !0, external: e }); @@ -23773,35 +23979,35 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr console.warn("[Majoor] App.vue: mountAssetsManagerPanelRuntime failed", e); } try { - dh().validatePersistedCustomRoot?.(); + Vh().validatePersistedCustomRoot?.(); } catch {} - }), rr(() => { + }), ir(() => { try { s?.dispose?.(); } catch {} s = null; - }), (e, s) => (K(), Y(V, null, [ - J(b_, { + }), (e, s) => (q(), Y(V, null, [ + U(X_, { ref_key: "statusSectionRef", ref: n }, null, 512), - J($y, { + U(kb, { ref_key: "headerSectionRef", ref: r }, null, 512), - J(_b, { + U(qb, { ref_key: "summaryBarSectionRef", ref: i }, null, 512), - J(kb, { + U(ax, { ref_key: "assetsGridRef", ref: a }, null, 512), - J(wS, { + U(US, { ref_key: "sidebarSectionRef", ref: o }, null, 512), - J(hS), + U(PS), H("div", { ref_key: "containerRef", ref: t, @@ -23815,10 +24021,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, null, 512) ], 64)); } -}), ES = /* @__PURE__ */ dr({ +}), GS = /* @__PURE__ */ tr({ __name: "GeneratedFeedApp", setup(e) { - let t = Z(null), n = null; + let t = Q(null), n = null; function r(e) { if (!e) return; let t = [ @@ -23835,18 +24041,18 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } } - return Ar(() => { + return Zn(() => { if (t.value) try { - r(t.value), n = Xd(t.value); + r(t.value), n = Of(t.value); } catch (e) { console.warn("[Majoor] GeneratedFeedApp.vue: createGeneratedFeedHost failed", e); } - }), rr(() => { + }), ir(() => { try { - Zd(n); + kf(n); } catch {} n = null; - }), (e, n) => (K(), Y(V, null, [J(hS), H("div", { + }), (e, n) => (q(), Y(V, null, [U(PS), H("div", { ref_key: "containerRef", ref: t, class: "mjr-vue-feed-root", @@ -23861,38 +24067,43 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } }, null, 512)], 64)); } -}), DS = "data-mjr-topbar-mfv-host", OS = "data-mjr-topbar-mfv-button", kS = "data-mjr-topbar-mfv-slot", AS = "label.floatingViewer", jS = "Viewer", MS = "V", NS = "viewer.mfvTopbarButton", PS = null, FS = null, IS = null, LS = null, RS = null, zS = null, BS = null, VS = null, HS = !1, US = null, WS = !1, GS = !1; -function KS(e) { +}), KS = "data-mjr-topbar-mfv-host", qS = "data-mjr-topbar-mfv-button", JS = "data-mjr-topbar-mfv-slot", YS = "label.floatingViewer", XS = "Viewer", ZS = "V", QS = "viewer.mfvTopbarButton", $S = null, eC = null, tC = null, nC = null, rC = null, iC = null, aC = null, oC = null, sC = !1, cC = null, lC = !1, uC = !1; +function dC(e) { if (!e) { - !RS && typeof MutationObserver < "u" && (RS = new MutationObserver(() => { - qS() && (RS?.disconnect?.(), RS = null, sC()); - }), RS.observe(document.body, { + !rC && typeof MutationObserver < "u" && (rC = new MutationObserver(() => { + fC() && (rC?.disconnect?.(), rC = null, DC()); + }), rC.observe(document.body, { childList: !0, subtree: !0 })); return; } try { - RS?.disconnect?.(); + rC?.disconnect?.(); } catch {} - if (RS = null, FS !== e) { + if (rC = null, eC !== e) { try { - PS?.disconnect?.(); + $S?.disconnect?.(); } catch {} - PS = new MutationObserver(() => sC()), PS.observe(e, { childList: !0 }), FS = e; + $S = new MutationObserver(() => { + hC(e) || DC(); + }), $S.observe(e, { + childList: !0, + subtree: !0 + }), eC = e; } let t = e.parentElement; - if (t && LS !== t) { + if (t && nC !== t) { try { - IS?.disconnect?.(); + tC?.disconnect?.(); } catch {} - IS = new MutationObserver(() => sC()), IS.observe(t, { childList: !0 }), LS = t; + tC = new MutationObserver(() => DC()), tC.observe(t, { childList: !0 }), nC = t; } } -function qS() { +function fC() { return typeof document > "u" ? null : document.querySelector(".actionbar-container"); } -function JS(e = qS()) { +function pC(e = fC()) { if (typeof document > "u") return; let t = document.documentElement?.style; if (!t) return; @@ -23903,195 +24114,203 @@ function JS(e = qS()) { let n = e.getBoundingClientRect(), r = Math.max(60, Math.ceil(n.bottom + 12)); t.setProperty("--mjr-mfv-top-offset", `${r}px`); } -function YS(e) { +function mC(e) { return e && e.querySelector(".queue-button-group") || null; } -function XS(e) { +function hC(e) { + try { + let t = e?.querySelector?.(`[${JS}]`), n = mC(e); + return !t || !n ? !1 : t.parentElement === n.parentElement && t.previousElementSibling === n && !!t.querySelector(`[${KS}]`); + } catch { + return !1; + } +} +function gC(e) { if (!e) return null; - let t = e.querySelector(`[${kS}]`); - t || (t = document.createElement("div"), t.setAttribute(kS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); - let n = YS(e), r = n?.parentElement || e; + let t = e.querySelector(`[${JS}]`); + t || (t = document.createElement("div"), t.setAttribute(JS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); + let n = mC(e), r = n?.parentElement || e; return t.parentElement === r ? n && r && t.previousElementSibling !== n ? r.insertBefore(t, n.nextSibling) : !n && t !== r.lastElementChild && r.appendChild(t) : n && r ? r.insertBefore(t, n.nextSibling) : r.appendChild(t), t; } -function ZS(e = "pi pi-eye") { +function _C(e = "pi pi-eye") { let t = document.createElement("i"); return t.className = e, t.setAttribute("aria-hidden", "true"), t; } -function QS(e = "Viewer") { +function vC(e = "Viewer") { let t = document.createElement("span"); return t.className = "mjr-topbar-mfv-label", t.textContent = e, t; } -function $S(e) { +function yC(e) { if (!e) return; - let t = WS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); - zt(e, t, MS, { ariaLabel: t }), e.setAttribute("aria-pressed", WS ? "true" : "false"), e.classList.toggle("primary", WS), e.classList.toggle("mjr-topbar-mfv-active", WS), e.replaceChildren(ZS(WS ? "pi pi-eye-slash" : "pi pi-eye"), QS(R(AS, jS))); + let t = lC ? L("tooltip.closeMFV", "Close Floating Viewer") : L("tooltip.openMFV", "Open Floating Viewer"); + Vt(e, t, ZS, { ariaLabel: t }), e.setAttribute("aria-pressed", lC ? "true" : "false"), e.classList.toggle("primary", lC), e.classList.toggle("mjr-topbar-mfv-active", lC), e.replaceChildren(_C(lC ? "pi pi-eye-slash" : "pi pi-eye"), vC(L(YS, XS))); } -function eC() { +function bC() { try { window.dispatchEvent(new Event(B.MFV_TOGGLE)); } catch (e) { console.debug?.("[Majoor] top bar MFV launch failed", e); } - sC(); + DC(); } -function tC() { +function xC() { let e = document.createElement("button"); - return e.type = "button", e.setAttribute(OS, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", eC), $S(e), e; + return e.type = "button", e.setAttribute(qS, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", bC), yC(e), e; } -function nC() { +function SC() { let e = document.createElement("div"); - return e.setAttribute(DS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(tC()), e; + return e.setAttribute(KS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(xC()), e; } -function rC() { - if (typeof document > "u" || GS) return; +function CC() { + if (typeof document > "u" || uC) return; let e = !!document.querySelector(".mjr-mfv.is-visible"); - WS !== e && (WS = e); + lC !== e && (lC = e); } -function iC() { - return z.MFV_TOPBAR_BUTTON !== !1; +function wC() { + return R.MFV_TOPBAR_BUTTON !== !1; } -function aC() { +function TC() { try { - document.querySelector(`[${DS}]`)?.remove?.(), document.querySelector(`[${kS}]`)?.remove?.(); + document.querySelector(`[${KS}]`)?.remove?.(), document.querySelector(`[${JS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } } -function oC() { - let e = qS(); - if (!e) return JS(null), null; - if (!iC()) return aC(), JS(e), null; - KS(e), rC(); - let t = XS(e); - if (!t) return JS(e), null; - let n = t.querySelector(`[${DS}]`); - return n ||= nC(), n.parentElement !== t && t.replaceChildren(n), JS(e), $S(n.querySelector(`[${OS}]`)), t; +function EC() { + let e = fC(); + if (!e) return pC(null), null; + if (!wC()) return TC(), pC(e), null; + dC(e), CC(); + let t = gC(e); + if (!t) return pC(e), null; + let n = t.querySelector(`[${KS}]`); + return n ||= SC(), n.parentElement !== t && t.replaceChildren(n), pC(e), yC(n.querySelector(`[${qS}]`)), t; } -function sC() { - HS || (HS = !0, US = window.setTimeout(() => { - HS = !1, US = null, oC(); +function DC() { + sC || (sC = !0, cC = window.setTimeout(() => { + sC = !1, cC = null, EC(); }, 32)); } -function cC() { - return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (sC(), zS || (zS = (e) => { - WS = !!e?.detail?.visible, GS = !0, sC(); - }, window.addEventListener(B.MFV_VISIBILITY_CHANGED, zS)), BS || (BS = () => sC(), window.addEventListener("resize", BS)), VS || (VS = (e) => { +function OC() { + return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (DC(), iC || (iC = (e) => { + lC = !!e?.detail?.visible, uC = !0, DC(); + }, window.addEventListener(B.MFV_VISIBILITY_CHANGED, iC)), aC || (aC = () => DC(), window.addEventListener("resize", aC)), oC || (oC = (e) => { let t = e?.detail?.key; - (t === NS || t === "storage") && sC(); - }, window.addEventListener("mjr-settings-changed", VS)), KS(qS()), !0); + (t === QS || t === "storage") && DC(); + }, window.addEventListener("mjr-settings-changed", oC)), dC(fC()), !0); } -function lC() { +function kC() { try { - PS?.disconnect?.(); + $S?.disconnect?.(); } catch (e) { console.debug?.(e); } - PS = null, FS = null; + $S = null, eC = null; try { - IS?.disconnect?.(); + tC?.disconnect?.(); } catch (e) { console.debug?.(e); } - IS = null, LS = null; + tC = null, nC = null; try { - RS?.disconnect?.(); + rC?.disconnect?.(); } catch (e) { console.debug?.(e); } - RS = null; + rC = null; try { - US && window.clearTimeout(US); + cC && window.clearTimeout(cC); } catch (e) { console.debug?.(e); } - US = null, zS && typeof window < "u" && window.removeEventListener(B.MFV_VISIBILITY_CHANGED, zS), zS = null, BS && typeof window < "u" && window.removeEventListener("resize", BS), BS = null, VS && typeof window < "u" && window.removeEventListener("mjr-settings-changed", VS), VS = null, HS = !1, WS = !1, GS = !1; + cC = null, iC && typeof window < "u" && window.removeEventListener(B.MFV_VISIBILITY_CHANGED, iC), iC = null, aC && typeof window < "u" && window.removeEventListener("resize", aC), aC = null, oC && typeof window < "u" && window.removeEventListener("mjr-settings-changed", oC), oC = null, sC = !1, lC = !1, uC = !1; try { - document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${DS}]`)?.remove?.(), document.querySelector(`[${kS}]`)?.remove?.(); + document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${KS}]`)?.remove?.(), document.querySelector(`[${JS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } } // ui/features/runtime/entryUiRegistration.ts -var uC = "mjr-global-runtime-root", dC = "_mjrGlobalRuntimeVueApp", fC = "_mjrSidebarVueApp", pC = "_mjrFeedVueApp", mC = "majoor-generated-feed", hC = null; -function gC() { +var AC = "mjr-global-runtime-root", jC = "_mjrGlobalRuntimeVueApp", MC = "_mjrSidebarVueApp", NC = "_mjrFeedVueApp", PC = "majoor-generated-feed", FC = null; +function IC() { if (typeof document > "u" || !document?.body) return null; - let e = document.getElementById(uC); - return e || (e = document.createElement("div"), e.id = uC, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); + let e = document.getElementById(AC); + return e || (e = document.createElement("div"), e.id = AC, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); } -function _C() { +function LC() { try { - let e = gC(); + let e = IC(); if (!e) return !1; - let t = !!On(e, Lp, dC); - return cC(), t; + let t = !!Bt(e, mm, jC); + return OC(), t; } catch { return !1; } } -function vC() { +function RC() { try { - lC(); - let e = document.getElementById(uC); + kC(); + let e = document.getElementById(AC); if (!e) return; - Rn(e, dC), e.remove?.(); + Kt(e, jC), e.remove?.(); } catch {} } -function yC(e, t) { - let n = Ke(e, t); - if (Bf(), !n) try { +function zC(e, t) { + let n = We(e, t); + if (_p(), !n) try { window.dispatchEvent(new Event(B.OPEN_ASSETS_MANAGER)); } catch (e) { console.debug?.(e); } return n; } -function bC() { +function BC() { try { window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { reason: "command" } })); } catch (e) { console.debug?.(e); } } -function xC(e) { - let t = $e(e, mC); +function VC(e) { + let t = Fe(e, PC); if (!t) try { - Pd(); + df(); } catch (e) { console.debug?.(e); } return t; } -async function SC() { +async function HC() { try { - let e = await pe(lt.BROWSE_FOLDER, {}); + let e = await me(p.BROWSE_FOLDER, {}); if (e?.ok) return String(e?.data?.path || "").trim(); let t = String(e?.code || "").trim(); - t && t !== "CANCELLED" && I(e?.error || R("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); + t && t !== "CANCELLED" && F(e?.error || L("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); } catch (e) { - console.debug?.(e), I(R("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); + console.debug?.(e), F(L("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); } return ""; } -async function CC(e, { settingId: t, settingsPathKey: n, save: r, successMessage: i, restartRequired: a = !1 }) { - let o = await SC(); +async function UC(e, { settingId: t, settingsPathKey: n, save: r, successMessage: i, restartRequired: a = !1 }) { + let o = await HC(); if (!o) return !1; let s = await r(o); - if (!s?.ok) return I(s?.error || R("toast.settingsPathSaveFailed", "Failed to save path"), "error"), !1; + if (!s?.ok) return F(s?.error || L("toast.settingsPathSaveFailed", "Failed to save path"), "error"), !1; try { - let r = Xt(); - r.paths = r.paths || {}, r.paths[n] = o, Dn(r), Re(e, t, o), window.dispatchEvent(new CustomEvent(B.SETTINGS_CHANGED, { detail: { + let r = Mt(); + r.paths = r.paths || {}, r.paths[n] = o, bt(r), A(e, t, o), window.dispatchEvent(new CustomEvent(B.SETTINGS_CHANGED, { detail: { key: `paths.${n}`, value: o } })); } catch (e) { console.debug?.(e); } - return I(a ? `${i} ${R("toast.restartComfyUiToApply", "Restart ComfyUI to apply.")}` : i, "success", 2800), !0; + return F(a ? `${i} ${L("toast.restartComfyUiToApply", "Restart ComfyUI to apply.")}` : i, "success", 2800), !0; } -function wC(e) { - return qC(e).find(KC) || null; +function WC(e) { + return pw(e).find(fw) || null; } -function TC(e) { +function GC(e) { let t = String(e?.id ?? e?.nodeId ?? e?.node_id ?? "").trim(); if (!t) return null; let n = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); @@ -24103,7 +24322,7 @@ function TC(e) { title: String(e?.title || e?.properties?.title || e?.properties?.name || n || "").trim() }; } -async function EC(e) { +async function KC(e) { if (!e) return []; try { let t = (await import("./chunks/NodeStreamController-CIKDDXJT.js")).extractNodeFileData?.(e), n = String(t?.filename || "").trim(); @@ -24117,7 +24336,7 @@ async function EC(e) { return console.debug?.(e), []; } } -function DC(e) { +function qC(e) { try { if (typeof window > "u") return; window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.pendingNodeContext = e, window.dispatchEvent(new CustomEvent(B.OPEN_NODE_CONTEXT, { detail: e })); @@ -24125,18 +24344,18 @@ function DC(e) { console.debug?.(e); } } -async function OC(e, t, n) { - yC(e, t); - let r = TC(n) || {}, i = await EC(n); +async function JC(e, t, n) { + zC(e, t); + let r = GC(n) || {}, i = await KC(n); i.length && (r.files = i); let a = String(n?.comfyClass || n?.type || "").toLowerCase(); - return i.length && /load|upload/.test(a) && (delete r.source_node_id, delete r.sourceNodeId), !r.source_node_id && !i.length ? (I(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (DC(r), !0); + return i.length && /load|upload/.test(a) && (delete r.source_node_id, delete r.sourceNodeId), !r.source_node_id && !i.length ? (F(L("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (qC(r), !0); } -async function kC(e) { +async function YC(e) { try { - let t = await EC(e); + let t = await KC(e); if (t.length) { - let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-BzaQii21.js").then((e) => e.n); + let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-B_I-SRbd.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 @@ -24152,30 +24371,30 @@ async function kC(e) { } return !1; } -function AC(e, t) { - let n = hC; - return n ? (OC(e, t, n), !0) : (I(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); +function XC(e, t) { + let n = FC; + return n ? (JC(e, t, n), !0) : (F(L("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); } -function jC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function ZC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [ { id: "mjr.openAssetsManager", - label: R("manager.title", "Assets Manager"), - tooltip: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - title: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - description: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), + label: L("manager.title", "Assets Manager"), + tooltip: L("tooltip.openAssetsManager", "Open Majoor Assets Manager"), + title: L("tooltip.openAssetsManager", "Open Majoor Assets Manager"), + description: L("tooltip.openAssetsManager", "Open Majoor Assets Manager"), icon: "pi pi-folder-open", - function: () => yC(e, t) + function: () => zC(e, t) }, { id: "mjr.scanAssets", - label: R("command.scanAssets", "Scan assets"), + label: L("command.scanAssets", "Scan assets"), icon: "pi pi-refresh", function: () => n() }, { id: "mjr.toggleFloatingViewer", - label: R("command.toggleFloatingViewer", "Toggle floating viewer"), + label: L("command.toggleFloatingViewer", "Toggle floating viewer"), icon: "pi pi-images", function: () => { try { @@ -24187,16 +24406,16 @@ function jC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { id: "mjr.refreshAssetsGrid", - label: R("command.refreshAssetsGrid", "Refresh assets grid"), + label: L("command.refreshAssetsGrid", "Refresh assets grid"), icon: "pi pi-sync", - function: () => bC() + function: () => BC() }, { id: "mjr.openFloatingViewer", - label: R("command.openFloatingViewer", "Open floating viewer"), - tooltip: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), - title: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), - description: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), + label: L("command.openFloatingViewer", "Open floating viewer"), + tooltip: L("tooltip.openFloatingViewer", "Open Majoor floating viewer"), + title: L("tooltip.openFloatingViewer", "Open Majoor floating viewer"), + description: L("tooltip.openFloatingViewer", "Open Majoor floating viewer"), icon: "pi pi-window-maximize", function: () => { try { @@ -24208,71 +24427,71 @@ function jC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { id: "mjr.openGeneratedFeed", - label: R("command.openGeneratedFeed", "Open generated feed"), - tooltip: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), - title: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), - description: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), + label: L("command.openGeneratedFeed", "Open generated feed"), + tooltip: L("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), + title: L("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), + description: L("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), icon: "pi pi-list", - function: () => xC(e) + function: () => VC(e) }, { id: "mjr.openSettings", - label: R("command.openSettings", "Open Majoor settings"), + label: L("command.openSettings", "Open Majoor settings"), icon: "pi pi-cog", - function: () => Yn(e) + function: () => Ut(e) }, { id: "mjr.pickOutputDirectory", - label: R("command.pickOutputDirectory", "Pick output directory"), - tooltip: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), - title: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), - description: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), + label: L("command.pickOutputDirectory", "Pick output directory"), + tooltip: L("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), + title: L("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), + description: L("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), icon: "pi pi-folder", - function: () => CC(e, { + function: () => UC(e, { settingId: "Majoor.Paths.OutputDirectory", settingsPathKey: "outputDirectory", - save: g, - successMessage: R("toast.outputDirectorySaved", "Output directory saved.") + save: M, + successMessage: L("toast.outputDirectorySaved", "Output directory saved.") }) }, { id: "mjr.pickIndexDirectory", - label: R("command.pickIndexDirectory", "Pick index directory"), - tooltip: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), - title: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), - description: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), + label: L("command.pickIndexDirectory", "Pick index directory"), + tooltip: L("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), + title: L("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), + description: L("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), icon: "pi pi-database", - function: () => CC(e, { + function: () => UC(e, { settingId: "Majoor.Paths.IndexDirectory", settingsPathKey: "indexDirectory", - save: a, - successMessage: R("toast.indexDirectorySaved", "Index directory saved."), + save: ue, + successMessage: L("toast.indexDirectorySaved", "Index directory saved."), restartRequired: !0 }) }, { id: "mjr.openNodeContext", - label: R("command.openNodeContext", "Show assets from selected node"), - tooltip: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), - title: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), - description: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), + label: L("command.openNodeContext", "Show assets from selected node"), + tooltip: L("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), + title: L("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), + description: L("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), icon: "pi pi-sitemap", - function: () => AC(e, t) + function: () => XC(e, t) }, { id: "mjr.openNodeInFloatingViewer", - label: R("command.openNodeInFloatingViewer", "Open node media in floating viewer"), - tooltip: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), - title: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), - description: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), + label: L("command.openNodeInFloatingViewer", "Open node media in floating viewer"), + tooltip: L("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), + title: L("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), + description: L("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), icon: "pi pi-window-maximize", function: () => { - kC(hC); + YC(FC); } } ]; } -function MC() { +function QC() { return [{ combo: { alt: !0, @@ -24289,7 +24508,7 @@ function MC() { commandId: "mjr.toggleFloatingViewer" }]; } -function NC() { +function $C() { return [{ path: ["Extensions", "Majoor Assets Manager"], commands: [ @@ -24304,16 +24523,16 @@ function NC() { ] }]; } -function PC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function ew(e, { sidebarTabId: t, triggerStartupScan: n }) { return [null, { content: "Majoor Assets Manager", submenu: { options: [ { - content: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - callback: () => yC(e, t) + content: L("tooltip.openAssetsManager", "Open Majoor Assets Manager"), + callback: () => zC(e, t) }, { - content: R("command.openFloatingViewer", "Open floating viewer"), + content: L("command.openFloatingViewer", "Open floating viewer"), callback: () => { try { window.dispatchEvent(new Event(B.MFV_OPEN)); @@ -24323,26 +24542,26 @@ function PC(e, { sidebarTabId: t, triggerStartupScan: n }) { } }, { - content: R("command.openGeneratedFeed", "Open generated feed"), - callback: () => xC(e) + content: L("command.openGeneratedFeed", "Open generated feed"), + callback: () => VC(e) }, null, { - content: R("command.refreshAssetsGrid", "Refresh assets grid"), - callback: () => bC() + content: L("command.refreshAssetsGrid", "Refresh assets grid"), + callback: () => BC() }, { - content: R("command.scanAssets", "Scan assets"), + content: L("command.scanAssets", "Scan assets"), callback: () => n() }, { - content: R("command.openSettings", "Open Majoor settings"), - callback: () => Yn(e) + content: L("command.openSettings", "Open Majoor settings"), + callback: () => Ut(e) } ] } }]; } -function FC() { +function tw() { return [ { label: "Majoor Assets Manager", @@ -24359,23 +24578,29 @@ function FC() { } ]; } -function IC(e, t) { - for (let n of jC(e, t)) Le(e, n); +function nw(e, t) { + for (let n of ZC(e, t)) x(e, n); } -function LC(e) { - for (let t of MC()) He(e, t); +function rw(e) { + for (let t of QC()) T(e, t); } -function RC(e, { sidebarTabId: t }) { - return Rf({ sidebarTabId: t }), Ue(e, { +function iw(e, { sidebarTabId: t }) { + hp({ sidebarTabId: t }); + try { + Mt()?.integration?.hideNativeAssetsTab && Dt(!0); + } catch (e) { + console.debug?.(e); + } + return f(e, { id: t, icon: "pi pi-folder", - title: R("manager.title"), - label: R("manager.sidebarLabel"), - tooltip: R("tooltip.sidebarTab"), + title: L("manager.title"), + label: L("manager.sidebarLabel"), + tooltip: L("tooltip.sidebarTab"), type: "custom", render(e) { - Bf(), oi({ idleOnly: !0 }).catch(() => null), On(e, TS, fC), setTimeout(() => { - let e = Uf(); + _p(), Xr({ idleOnly: !0 }).catch(() => null), Bt(e, WS, MC), setTimeout(() => { + let e = bp(); if (e) try { window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { reason: "pending-generated-assets", @@ -24389,77 +24614,80 @@ function RC(e, { sidebarTabId: t }) { destroy(e) {} }); } -function zC() { +function aw() { try { - Rn(null, fC); + Ct(); } catch {} - BC = !1; try { - document.getElementById(VC)?.remove?.(); + Kt(null, MC); + } catch {} + ow = !1; + try { + document.getElementById(sw)?.remove?.(); } catch {} } -var BC = !1, VC = "mjr-sidebar-prewarm-host"; -function HC() { - if (BC || typeof document > "u" || !document?.body || En(fC)) return !1; - BC = !0; +var ow = !1, sw = "mjr-sidebar-prewarm-host"; +function cw() { + if (ow || typeof document > "u" || !document?.body || Rt(MC)) return !1; + ow = !0; try { - let e = document.getElementById(VC); - return e || (e = document.createElement("div"), e.id = VC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), On(e, TS, fC, { attachIfExists: !1 }), !0; + let e = document.getElementById(sw); + return e || (e = document.createElement("div"), e.id = sw, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), Bt(e, WS, MC, { attachIfExists: !1 }), !0; } catch (e) { - return console.debug?.(e), BC = !1, !1; + return console.debug?.(e), ow = !1, !1; } } -function UC() { +function lw() { return { - id: mC, - title: R("bottomFeed.title", "Generated Feed"), + id: PC, + title: L("bottomFeed.title", "Generated Feed"), icon: "pi pi-images", type: "custom", render(e) { - On(e, ES, pC); + Bt(e, GS, NC); }, destroy(e) {} }; } -function WC() { - return [UC()]; +function uw() { + return [lw()]; } -function GC() { +function dw() { try { - Rn(null, pC); + Kt(null, NC); } catch {} } -function KC(e) { +function fw(e) { let t = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); return t ? /save|load|preview/i.test(t) : !1; } -function qC(e) { +function pw(e) { return e ? Array.isArray(e) ? e.filter(Boolean) : e instanceof Set ? Array.from(e).filter(Boolean) : e instanceof Map ? Array.from(e.values()).filter(Boolean) : Array.isArray(e?.items) ? e.items.filter(Boolean) : Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : [e] : []; } -function JC(e) { - return hC = wC(e), hC ? [ +function mw(e) { + return FC = WC(e), FC ? [ "mjr.openNodeContext", "mjr.openAssetsManager", "mjr.openNodeInFloatingViewer" ] : []; } -function YC(e, t) { +function hw(e, t) { return { content: e, callback: t }; } -function XC(e, t, { sidebarTabId: n }) { - return KC(e) ? [ - YC("View in Assets Manager", () => { - OC(t, n, e); +function gw(e, t, { sidebarTabId: n }) { + return fw(e) ? [ + hw("View in Assets Manager", () => { + JC(t, n, e); }), - YC("Open in Floating Viewer", () => { - kC(e); + hw("Open in Floating Viewer", () => { + YC(e); }), - YC("Index Output", () => { + hw("Index Output", () => { try { - bC(), I(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); + BC(), F(L("toast.rescanningFile", "Rescanning file..."), "info", 1800); } catch (e) { console.debug?.(e); } @@ -24467,15 +24695,15 @@ function XC(e, t, { sidebarTabId: n }) { ] : []; } // ui/features/runtime/entryRuntimeLifecycle.ts -var ZC = "__MJR_ENTRY_RUNTIME__"; -function QC(e, t) { +var _w = "__MJR_ENTRY_RUNTIME__"; +function vw(e, t) { if (e) try { - e._mjrAssetUpdateReloadTimer &&= (clearTimeout(e._mjrAssetUpdateReloadTimer), null), e._mjrExecutedHandler && e.removeEventListener("executed", e._mjrExecutedHandler), e._mjrAssetAddedHandler && e.removeEventListener("mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler && e.removeEventListener("mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler && e.removeEventListener(B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(B.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrScanProgressHandler && e.removeEventListener(B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(B.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrExecutionStartHandler && e.removeEventListener("execution_start", e._mjrExecutionStartHandler), e._mjrExecutionEndHandler && (e.removeEventListener("execution_success", e._mjrExecutionEndHandler), e.removeEventListener("execution_error", e._mjrExecutionEndHandler), e.removeEventListener("execution_interrupted", e._mjrExecutionEndHandler)), e._mjrStacksUpdatedHandler && e.removeEventListener("mjr.stacks.updated", e._mjrStacksUpdatedHandler), e._mjrEnrichmentStatusHandler && e.removeEventListener(B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(B.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); + e._mjrAssetUpdateReloadTimer &&= (clearTimeout(e._mjrAssetUpdateReloadTimer), null), e._mjrExecutedHandler && e.removeEventListener("executed", e._mjrExecutedHandler), e._mjrAssetAddedHandler && e.removeEventListener("mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler && e.removeEventListener("mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler && e.removeEventListener(B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(B.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrAssetsRemovedHandler && e.removeEventListener(B.ASSETS_REMOVED, e._mjrAssetsRemovedHandler), e._mjrScanProgressHandler && e.removeEventListener(B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(B.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrExecutionStartHandler && e.removeEventListener("execution_start", e._mjrExecutionStartHandler), e._mjrExecutionEndHandler && (e.removeEventListener("execution_success", e._mjrExecutionEndHandler), e.removeEventListener("execution_error", e._mjrExecutionEndHandler), e.removeEventListener("execution_interrupted", e._mjrExecutionEndHandler)), e._mjrStacksUpdatedHandler && e.removeEventListener("mjr.stacks.updated", e._mjrStacksUpdatedHandler), e._mjrEnrichmentStatusHandler && e.removeEventListener(B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(B.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); } catch (e) { t?.(e, "entry.removeApiHandlers"); } } -function $C(e, t) { +function yw(e, t) { try { let t = e?.assetsDeletedHandler; t && typeof window < "u" && window.removeEventListener(B.ASSETS_DELETED, t); @@ -24483,8 +24711,13 @@ function $C(e, t) { t?.(e, "entry.removeRuntimeWindowHandlers"); } } -function ew(e, { reportError: t } = {}) { +function bw(e, { reportError: t } = {}) { if (e && typeof e == "object") { + try { + l(); + } catch (e) { + console.debug?.(e); + } try { let t = Array.isArray(e._listenerCleanupFns) ? e._listenerCleanupFns : []; for (let e of t) try { @@ -24508,13 +24741,13 @@ function ew(e, { reportError: t } = {}) { console.warn("[MJR teardown]", e); } try { - QC(e.api || null, t), $C(e, t); + vw(e.api || null, t), yw(e, t); } catch (e) { console.warn("[MJR teardown]", e); } } } -function tw(e, t, n, r, i = void 0) { +function xw(e, t, n, r, i = void 0) { if (!e || !t?.addEventListener || typeof r != "function") return null; let a = i && typeof i == "object" ? { ...i } : i; if (typeof AbortController < "u") try { @@ -24534,11 +24767,11 @@ function tw(e, t, n, r, i = void 0) { } }), null; } -function nw({ cleanupEntryRuntimeFn: e = ew, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { +function Sw({ cleanupEntryRuntimeFn: e = bw, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { try { if (typeof window < "u") { try { - let t = window[ZC]; + let t = window[_w]; e(t, { reportError: c }); } catch (e) { console.warn("[MJR teardown]", e); @@ -24578,7 +24811,7 @@ function nw({ cleanupEntryRuntimeFn: e = ew, teardownLiveStreamTracker: t, teard } catch (e) { console.warn("[MJR teardown]", e); } - window[ZC] = { + window[_w] = { api: null, assetsDeletedHandler: null, _cleanupControllers: [], @@ -24590,42 +24823,42 @@ function nw({ cleanupEntryRuntimeFn: e = ew, teardownLiveStreamTracker: t, teard } } // ui/entry.ts -var rw = null, iw = null, aw = null; -function ow() { - return aw ||= import("./chunks/floatingViewerManager-BzaQii21.js").then((e) => e.n), aw; +var Cw = null, ww = null, Tw = null; +function Ew() { + return Tw ||= import("./chunks/floatingViewerManager-B_I-SRbd.js").then((e) => e.n), Tw; } -function sw() { - aw && aw.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); +function Dw() { + Tw && Tw.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); } -var cw = "majoor-assets", lw = "__MJR_EXECUTION_RUNTIME__", uw = "Majoor.AssetsManager", dw = { +var Ow = "majoor-assets", kw = "__MJR_EXECUTION_RUNTIME__", Aw = "Majoor.AssetsManager", jw = { active: null, promptId: "" -}, fw = null, pw = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, mw = /^[0-9a-f]{20,}$/i; -function hw(...e) { +}, Mw = null, Nw = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Pw = /^[0-9a-f]{20,}$/i; +function Fw(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function gw(e) { +function Iw(e) { let t = String(e || "").trim(); - return pw.test(t) || mw.test(t); + return Nw.test(t) || Pw.test(t); } -function _w(e) { - return hw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); +function Lw(e) { + return Fw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); } -function vw(e) { +function Rw(e) { if (!e || typeof e != "object") return []; if (Array.isArray(e.nodes)) return e.nodes.filter(Boolean); if (Array.isArray(e._nodes)) return e._nodes.filter(Boolean); let t = e._nodes_by_id ?? e.nodes_by_id ?? null; return t instanceof Map ? Array.from(t.values()).filter(Boolean) : t && typeof t == "object" ? Object.values(t).filter(Boolean) : []; } -function yw(e) { - return vw(e).length > 0; +function zw(e) { + return Rw(e).length > 0; } -function bw(e) { +function Bw(e) { return !e || typeof e != "object" ? !1 : [ e.subgraph, e._subgraph, @@ -24636,13 +24869,13 @@ function bw(e) { e.subgraph_instance?.graph, e.inner_graph, e.subgraph_graph - ].some(yw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : gw(e.type) && !!_w(e); + ].some(zw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : Iw(e.type) && !!Lw(e); } -function xw(e, t) { - let n = String(e?.type || t || "").trim(), r = _w(e); - return gw(n) ? r || "Subgraph" : n || r || "Node"; +function Vw(e, t) { + let n = String(e?.type || t || "").trim(), r = Lw(e); + return Iw(n) ? r || "Subgraph" : n || r || "Node"; } -function Sw() { +function Hw() { try { return typeof window > "u" ? { active_prompt_id: null, @@ -24651,87 +24884,87 @@ function Sw() { progress_value: null, progress_max: null, cached_nodes: [] - } : (window[lw] && typeof window[lw] == "object" || (window[lw] = { + } : (window[kw] && typeof window[kw] == "object" || (window[kw] = { active_prompt_id: null, queue_remaining: null, progress_node: null, progress_value: null, progress_max: null, cached_nodes: [] - }), window[lw]); + }), window[kw]); } catch (e) { return console.debug?.(e), {}; } } -function Cw(e = {}) { +function Uw(e = {}) { try { - let t = Sw(); + let t = Hw(); Object.assign(t, e || {}), window.dispatchEvent(new CustomEvent(B.RUNTIME_STATUS, { detail: { ...t } })); } catch (e) { console.debug?.(e); } } -async function ww({ active: e, promptId: t = "" } = {}) { +async function Ww({ active: e, promptId: t = "" } = {}) { let n = !!e, r = String(t || "").trim(); - if (dw.active !== n || dw.promptId !== r) { - dw = { + if (jw.active !== n || jw.promptId !== r) { + jw = { active: n, promptId: r }; try { - await pe(lt.RUNTIME_EXECUTION, { + await me(p.RUNTIME_EXECUTION, { active: n, prompt_id: r || void 0, - cooldown_ms: Number(z.EXECUTION_IDLE_GRACE_MS) || 6e3 + cooldown_ms: Number(R.EXECUTION_IDLE_GRACE_MS) || 6e3 }); } catch (e) { - ie(e, "entry.execution_state_sync"); + ct(e, "entry.execution_state_sync"); } } } -function Tw() { +function Gw() { try { - return !!String(Sw()?.active_prompt_id || "").trim(); + return !!String(Hw()?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), !1; } } -function Ew(e = 1200) { +function Kw(e = 1200) { try { - fw && clearTimeout(fw); + Mw && clearTimeout(Mw); } catch (e) { console.debug?.(e); } - fw = setTimeout(() => { - if (fw = null, Tw()) { - Ew(e); + Mw = setTimeout(() => { + if (Mw = null, Gw()) { + Kw(e); return; } - let t = Qn(); - t && gi(t); + let t = ht(); + t && oi(t); }, Math.max(250, Number(e) || 0)); } -function Dw(e) { - import("./chunks/LiveStreamTracker-B56NDtCP.js").then((t) => { - rw = t; +function qw(e) { + import("./chunks/LiveStreamTracker-C_DbXPzd.js").then((t) => { + Cw = t; try { t.initLiveStreamTracker(e); } catch (e) { console.warn("[MJR setup] initLiveStreamTracker failed:", e); } }).catch((e) => console.warn("[MJR setup] LiveStreamTracker load failed:", e)), import("./chunks/NodeStreamController-CIKDDXJT.js").then((t) => { - iw = t; + ww = t; try { t.initNodeStream({ app: e, onOutput: (e) => { - ow().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); + Ew().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); }, onStatus: (t, n) => { try { - let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = bw(r), a = _w(r), o = i ? "Subgraph" : xw(r, n); - ow().then((e) => { - e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || xw(r, n) : a); + let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = Bw(r), a = Lw(r), o = i ? "Subgraph" : Vw(r, n); + Ew().then((e) => { + e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || Vw(r, n) : a); }).catch((e) => console.debug?.("[NodeStream] MFV status failed", e)); } catch (e) { console.debug?.("[NodeStream] onStatus failed", e); @@ -24743,16 +24976,16 @@ function Dw(e) { } }).catch((e) => console.warn("[MJR setup] NodeStream load failed:", e)); } -async function Ow(e, t) { - let n = await Me({ +async function Jw(e, t) { + let n = await c({ app: e, timeoutMs: 4e3 - }) || We(e); - if (Ge(n || null), !n) { + }) || u(e); + if (ne(n || null), !n) { console.warn("Majoor API not available, real-time updates disabled"); return; } - Gn({ + It({ api: n, app: e }).catch((e) => console.debug?.("[Majoor] MFV progress tracking init failed", e)); @@ -24762,78 +24995,78 @@ async function Ow(e, t) { } catch (e) { console.debug?.(e); } - QC(r?.api || null, ie), n !== r?.api && QC(n, ie), $C(r, ie), await np({ + vw(r?.api || null, ct), n !== r?.api && vw(n, ct), yw(r, ct), await Np({ api: n, runtime: r, executionRuntime: t, - appRef: Pr, - liveStreamModule: rw, - ensureExecutionRuntime: Sw, - emitRuntimeStatus: Cw, - getActiveGridContainer: Qn, - pushGeneratedAsset: Yd, - upsertAsset: wi, - upsertAssetNow: Ti, - removeAssetsFromGrid: Ci, - getEnrichmentState: Lt, - setEnrichmentState: Ct, - comfyToast: I, - t: R, - reportError: ie, - registerCleanableListener: tw, - syncExecutionBackendState: ww + appRef: wr, + liveStreamModule: Cw, + ensureExecutionRuntime: Hw, + emitRuntimeStatus: Uw, + getActiveGridContainer: ht, + pushGeneratedAsset: Df, + upsertAsset: mi, + upsertAssetNow: hi, + removeAssetsFromGrid: pi, + getEnrichmentState: yn, + setEnrichmentState: vn, + comfyToast: F, + t: L, + reportError: ct, + registerCleanableListener: xw, + syncExecutionBackendState: Ww }); } -var kw = vf({ - post: pe, - ENDPOINTS: lt, - reportError: ie, - extractOutputFiles: yf, - ensureExecutionRuntime: Sw, - emitRuntimeStatus: Cw, - refreshGeneratedFeedHosts: Pd, - getActiveGridContainer: Qn -}), Aw = { - name: uw, - settings: xn(Pr), - commands: jC(Pr, { - sidebarTabId: cw, - triggerStartupScan: ii +var Yw = Yf({ + post: me, + ENDPOINTS: p, + reportError: ct, + extractOutputFiles: Xf, + ensureExecutionRuntime: Hw, + emitRuntimeStatus: Uw, + refreshGeneratedFeedHosts: df, + getActiveGridContainer: ht +}), Xw = { + name: Aw, + settings: xt(wr), + commands: ZC(wr, { + sidebarTabId: Ow, + triggerStartupScan: Jr }), - keybindings: MC(), - menuCommands: NC(), - aboutPageBadges: FC(), - bottomPanelTabs: WC(), + keybindings: QC(), + menuCommands: $C(), + aboutPageBadges: tw(), + bottomPanelTabs: uw(), async setup() { - nw({ - cleanupEntryRuntimeFn: ew, - teardownLiveStreamTracker: (e) => rw?.teardownLiveStreamTracker(e), - teardownNodeStream: (e) => iw?.teardownNodeStream(e), - teardownFloatingViewerManager: sw, - teardownGeneratedFeed: GC, - teardownAssetsSidebar: zC, - teardownGlobalRuntime: vC, - teardownTopBarMfvButton: lC, - reportError: ie - }), op(), Be(Pr); - let e = await Ze({ timeoutMs: 12e3 }) || Pr; - Be(e), Fp(e); + Sw({ + cleanupEntryRuntimeFn: bw, + teardownLiveStreamTracker: (e) => Cw?.teardownLiveStreamTracker(e), + teardownNodeStream: (e) => ww?.teardownNodeStream(e), + teardownFloatingViewerManager: Dw, + teardownGeneratedFeed: dw, + teardownAssetsSidebar: aw, + teardownGlobalRuntime: RC, + teardownTopBarMfvButton: kC, + reportError: ct + }), Lp(), re(wr); + let e = await h({ timeoutMs: 12e3 }) || wr; + re(e), fm(e); try { typeof window < "u" && (window.__MJR_RUNTIME_APP__ = e); } catch (e) { console.debug?.(e); } - ci(), ui({ enabled: !0 }), _C(), Dw(e), bn(e, () => { - let e = Qn(); - e && (z.DEFER_GRID_FETCH_DURING_EXECUTION && Tw() ? Ew() : gi(e)); - }), IC(e, { - sidebarTabId: cw, - triggerStartupScan: ii - }), LC(e), Ow(e, kw).catch((e) => ie(e, "entry.api_setup")), RC(e, { sidebarTabId: cw }) ? Te("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); + Qr(), ei({ enabled: !0 }), LC(), qw(e), Nt(e, () => { + let e = ht(); + e && (R.DEFER_GRID_FETCH_DURING_EXECUTION && Gw() ? Kw() : oi(e)); + }), nw(e, { + sidebarTabId: Ow, + triggerStartupScan: Jr + }), rw(e), Jw(e, Yw).catch((e) => ct(e, "entry.api_setup")), iw(e, { sidebarTabId: Ow }) ? ft("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); try { let e = typeof window < "u" ? window.requestIdleCallback : null, t = () => { try { - HC(); + cw(); } catch (e) { console.debug?.(e); } @@ -24842,30 +25075,30 @@ var kw = vf({ } catch (e) { console.debug?.(e); } - rp({ resolveNodeStreamModule: async () => (iw ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), iw) }); + Pp({ resolveNodeStreamModule: async () => (ww ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), ww) }); }, onNodeOutputsUpdated(e) { try { - kw.handleNodeOutputsUpdated(e); + Yw.handleNodeOutputsUpdated(e); } catch (e) { console.debug?.("[Majoor] onNodeOutputsUpdated error", e); } }, getNodeMenuItems(e) { - return XC(e, Pr, { sidebarTabId: cw }); + return gw(e, wr, { sidebarTabId: Ow }); }, getCanvasMenuItems(e) { - return PC(Pr, { - sidebarTabId: cw, - triggerStartupScan: ii + return ew(wr, { + sidebarTabId: Ow, + triggerStartupScan: Jr }); }, getSelectionToolboxCommands(e) { - return JC(e); + return mw(e); } }; try { - Pr.registerExtension(Aw); + wr.registerExtension(Xw); } catch (e) { - console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), Aw.setup().catch((e) => ie(e, "entry.setup_after_duplicate_registration")); + console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), Xw.setup().catch((e) => ct(e, "entry.setup_after_duplicate_registration")); } diff --git a/docs/API_REFERENCE.md b/docs/API_REFERENCE.md index b58214af..630059fc 100644 --- a/docs/API_REFERENCE.md +++ b/docs/API_REFERENCE.md @@ -12,6 +12,7 @@ - **Current API**: `/mjr/am/*` (unversioned, stable) - **Version Alias**: `/mjr/am/v1/*` → redirects to `/mjr/am/*` (308 Permanent Redirect) - **Legacy Alias**: `/majoor/version` → redirects to `/mjr/am/version` +- **OpenAPI compat (read-only)**: `/mjr/am/compat/assets/*` mirrors the shape of ComfyUI core `/api/assets/*` (`GET /mjr/am/compat/assets`, `/{id}`, `/{id}/content`, `/{id}/tags`, `/tags/refine`, `/seed/status`, `HEAD /hash/{hash}`). The former `/api/v2/assets/*` paths are deprecated and only served when `MJR_AM_LEGACY_API_V2_ASSETS=1`. ### Authentication Most endpoints require authentication when ComfyUI auth is enabled: diff --git a/docs/COMFYUI_INTEGRATION_AUDIT.md b/docs/COMFYUI_INTEGRATION_AUDIT.md new file mode 100644 index 00000000..22729559 --- /dev/null +++ b/docs/COMFYUI_INTEGRATION_AUDIT.md @@ -0,0 +1,248 @@ +# Audit d'intégration ComfyUI — novembre 2026 + +Audit du code backend (aiohttp / PromptServer / nœuds V3) et frontend (extension +Vue/TS) de Majoor Assets Manager v2.5.3, face aux versions récentes de ComfyUI +(core avec API Assets/Jobs, frontend 1.5x–1.60, sous-graphes, nœuds V3). + +Objectif : faire évoluer l'extension **sans conflit** avec le core et avec les +autres custom nodes, et s'appuyer sur les API officielles plutôt que sur des +internes. + +## 1. État des lieux + +Tous les contrôles existants passent sur la branche : + +| Contrôle | Résultat | +| --- | --- | +| `tsc -p tsconfig.json` | OK | +| `vitest run` | 157 fichiers, 858 tests OK | +| `pytest` | 1931 OK, 2 ignorés (torch absent) | +| `ruff` | 5 erreurs d'ordre d'imports → corrigées | + +L'architecture d'intégration est déjà saine : + +- **Frontend** : une couche unique `ui/app/hostAdapter.ts` → `comfyApiBridge.ts` + (ADR 0007) isole toutes les API ComfyUI ; commandes, raccourcis, menus + (`menuCommands`, `getCanvasMenuItems`, `getNodeMenuItems`, + `getSelectionToolboxCommands`), onglets latéral/bas et toasts passent par + l'API déclarative d'extension. Les ID de nœuds de sous-graphes (`"12:5"`) sont + résolus par `graphTraversal.findGraphNodeById`. Les écouteurs + `execution_start/success/error/interrupted` sont tous enregistrés et retirés. +- **Backend** : `adapters/comfy_core.py` sonde les capacités du core (assets, + jobs, user manager, websocket) sans import dur ; toutes les routes sont sous + `/mjr/am/*` ; les middlewares ne s'appliquent qu'aux chemins Majoor (y compris + le miroir `/api/mjr/am/*` ajouté par `server.py`). +- **Nœuds** : schéma V3 (`comfy_api.latest`, `comfy_entrypoint`) avec + dégradation à zéro nœud si une dépendance optionnelle manque. + +## 2. Problèmes trouvés et corrigés dans cette branche + +### 2.1 `graphToPrompt()` appelé de façon synchrone (frontend) +`serializeCurrentHostWorkflow()` (utilisé par le bouton d'en-tête du panneau) +appelait `app.graphToPrompt()` et lisait `.workflow` directement. Depuis le +frontend 1.x, `graphToPrompt` est **asynchrone** (`Promise<{output, workflow}>`, +confirmé dans `comfyui-frontend-types@1.60`). Conséquences : sérialisation +complète des widgets lancée pour rien à chaque appel, résultat ignoré, rejet de +promesse potentiellement non géré. + +Correctif : on sérialise d'abord le **graphe racine** (`getHostRootGraph`), ce +qui évite aussi d'exporter seulement le sous-graphe ouvert ; `graphToPrompt` ne +reste qu'en repli pour les anciens hôtes synchrones, et une promesse retournée +est neutralisée proprement. Tests ajoutés dans +`ui/tests/host_adapter_contract.vitest.ts`. + +### 2.2 État « modifié » du workflow +`isHostWorkflowDirty()` ne lisait que des drapeaux historiques. Il interroge +désormais d'abord `app.extensionManager.workflow.activeWorkflow.isModified`, +le signal officiel du store de workflows, puis retombe sur les anciens. + +### 2.3 Types officiels du frontend absents +`@comfyorg/comfyui-frontend-types@1.57.3` a été publié **sans `index.d.ts`** +(seulement `package.json` + `LICENSE` ; idem 1.56.0). Avec `skipLibCheck`, le +type `OfficialComfyApp` réexporté par `ui/types/comfyui-frontend.d.ts` +devenait silencieusement inutilisable. Mise à jour vers `^1.60.0` (contient +bien les déclarations) ; `tsc` reste vert. + +### 2.4 Clés de requête aiohttp +aiohttp ≥ 3.13 émet `NotAppKeyWarning` pour `request["mjr_user_id"]`, +`request["mjr_stats"]`, etc. Nouveau module `mjr_am_backend/request_keys.py` : +utilise `web.RequestKey` quand il existe, sinon la clé texte historique (ComfyUI +n'exige que `aiohttp>=3.11`). Tous les lecteurs/écrivains passent par ces +constantes, ce qui évite aussi toute collision avec les clés d'autres +extensions sur l'objet requête partagé. + +### 2.5 Lint +Imports non triés dans 5 fichiers (`ruff --fix`) qui faisaient échouer +`npm run quality:py`. + +## 3. Risques de conflit — état + +| # | Risque | Statut | +| --- | --- | --- | +| R1 | `/api/v2/assets/*` occupait l'espace de noms du core (`/api/...`) et pouvait être masqué sans erreur. | **Corrigé** : surface déplacée vers `/mjr/am/compat/assets/*` ; l'ancien chemin n'est enregistré que si `MJR_AM_LEGACY_API_V2_ASSETS=1` (déprécié, avertissement au démarrage). | +| R2 | `api.queuePrompt` était enveloppé pour suivre les prompts ; l'ordre d'enveloppement avec d'autres extensions n'est pas garanti. | **Corrigé** : plus aucune interception. Sur `execution_start` (websocket), le prompt est lu via l'API Jobs du core (`api.getJobDetail` → `GET /api/jobs/{id}`, champ `workflow.prompt`), puis `/queue` et `/history/{id}` pour les anciens cores. `wrapHostQueuePrompt` a été retiré. | +| R3 | Middlewares insérés en tête de `app.middlewares` (filtrés sur les chemins Majoor ; échec rattrapé si l'app est figée). | Inchangé, sans risque : surveiller l'étape `security_middlewares` dans `/mjr/am/health`. | +| R4 | Doublon fonctionnel avec l'onglet « Assets » natif. | **Corrigé (opt-in)** : réglage `Majoor.Integration.HideNativeAssetsTab` (désactivé par défaut) qui masque l'onglet natif via `getSidebarTabs`/`unregisterSidebarTab` et le restaure à l'identique quand on le désactive. | +| R5 | `requires-python <3.14` bloquait Python 3.14. | **Corrigé** : `>=3.10, <3.15` ; suite complète validée sous 3.14 (1931 tests OK) ; 3.14 ajouté à la matrice CI et à `tox`. | +| R6 | `@comfyorg/litegraph` séparé alors que le frontend exporte ses types. | Ouvert (faible). | +| R7 | `import { app } from "../../scripts/app.js"` (shim encore supporté). | Ouvert (faible). | +| R8 | 913 erreurs de typage dans `tsconfig.test.json`. | **Corrigé** : 0 erreur ; ajouté à la CI (`python-tests.yml`). Un vrai bug de test trouvé au passage (clé `stubs` dupliquée dans `asset_card_inner.vitest.ts`). | + +## 3 bis. Audit du système de notifications + +| Constat | Avant | Après | +| --- | --- | --- | +| API utilisée | `extensionManager.toast.add()` uniquement, **dépréciée** par ComfyUI (`ToastManager` 1.60). | API typée `success/error/info/warning/loading(title, {description, duration, action, closable, id})` ; `add()` seulement en repli pour les anciens frontends. | +| Détection | `getExtensionToastApi` exigeait `toast.add` : le jour où ComfyUI le retire, **tous les toasts Majoor disparaissent en silence**. | Accepte l'API typée ou `add()`. Test dédié. | +| Opérations longues (restauration/réinitialisation de la base, backfill vectoriel) | Chaque étape (`started`, `running`, …) **empilait un nouveau toast**. | Un seul toast `loading`, mis à jour en place via le même `ToastId`, puis remplacé par le résultat final (succès ou erreur). | +| Toasts persistants | `life` omis. | Durée maximale sûre (2³¹−1 ms) au lieu de `Infinity`, qui serait ramené à 0 par `setTimeout` et fermerait le toast immédiatement. | +| Liens d'action (`actionUrl`) | Ignorés dans le toast. | Bouton d'action natif, limité aux liens `http(s)` et aux chemins relatifs du même site (`javascript:` refusé). | +| Contournements | `genInfoOverridePicker.ts` appelait `toast.add()` directement ; `comfyAlert` utilisait `addAlert`/`add`. | Tout passe par `comfyToast` ou l'API typée. | +| Code mort | Repli `app.ui.toast` (API inexistante dans le frontend actuel), `_dismissAllFallbackErrorToasts` vide, CSS `.mjr-toast*` des anciens toasts DOM. | Supprimés. | +| Démontage | Les toasts en cours restaient affichés. | `dismissTrackedToasts()` à l'arrêt de l'extension. | +| Centre de messages (cloche) | S'ouvrait tout seul lors d'une réinitialisation ou d'un backfill. | Conservé comme **historique consultable** (notes de version, journal, raccourcis), car ComfyUI n'offre pas de boîte de réception aux extensions ; il ne s'ouvre plus de lui-même. | + +## 3 ter. Nouveaux assets, suppressions et scans (comparaison avec ComfyUI core) + +Comment fait le core (`app/assets`, `comfy_execution/asset_enrichment.py`) : +- il enregistre les sorties **au moment où `executed` est émis**, y compris pour les exécutions servies depuis le cache, sans attendre de scan disque ; +- un fichier disparu est marqué `is_missing` et **récupéré** s'il revient avec le même hash ; un état illisible est « instable » et ne supprime rien ; +- les scans de fond sont mis en pause pendant une génération et signalés par les événements `assets.seed.*`. + +| Constat Majoor | Gravité | Correctif | +| --- | --- | --- | +| Triggers `assets_fts` (FTS5 à contenu externe) écrits avec `UPDATE`/`DELETE` : **chaque renommage ou déplacement échouait** (« database disk image is malformed »). Le watcher retombait sur supprimer + réindexer, d'où un nouvel id et la **perte des notes, tags et collections**, plus une fausse « récupération de base corrompue ». | Critique | Triggers avec la commande FTS5 `'delete'`, mise à jour limitée à `filename, subfolder` ; réparation automatique des bases existantes au démarrage, avec reconstruction de l'index (`'rebuild'`). | +| `on_prompt_end` est appelé **avant** `PromptQueue.task_done()` (`main.py` du core) : l'ingestion post-génération pouvait lire un historique vide et n'indexer rien. Le frontend ne couvre que le client qui a lancé le prompt (`executed` n'est envoyé qu'à lui). | Haute | Attente de l'entrée d'historique (backoff 0,05 à 3,2 s, environ 6 s au maximum). | +| Prune de scan : une erreur de `stat` (partage réseau, permission) comptait comme « fichier supprimé », et les données utilisateur étaient effacées. | Haute | Existence à trois états (présent / absent / inconnu) ; racine illisible = aucun prune. | +| Suppressions et déplacements détectés par le watcher ou le prune : aucun événement, cartes périmées dans la grille. | Moyenne | `mjr-assets-removed` (ids) et `mjr-asset-updated` (nouveau chemin) ; le frontend réutilise le retrait en place des suppressions faites depuis l'interface. | +| Scan de fond terminé : aucun rafraîchissement de grille ni notification ; compteur `pruned` gonflé par les cascades. | Moyenne | `mjr-scan-complete` porte `origin` et `needs_refresh` ; un seul rechargement si nécessaire ; un toast natif « N nouveaux, M retirés » pour un scan de dossier ; silence pour les indexations par génération, déjà couvertes par les cartes en direct et le badge. | + +Vérifié sans changement : +- le badge de la barre latérale et le flux de génération dédupliquent chaque asset ; +- l'indexation vectorielle automatique est dédupliquée ; +- le rechargement après `mjr-core-execution-assets-ready` sert à finaliser les piles d'exécution et il est différé quand la grille est cachée. + +Pistes restantes : +- marquage « manquant » réversible façon core, plutôt qu'une suppression définitive, pour récupérer un fichier qui revient ; cela demande une migration de schéma ; +- retirer aussi du flux de génération les éléments supprimés hors de l'interface ; +- un seul événement par nouvel asset au lieu de `mjr-asset-added` plus `mjr.asset.indexed` (chacun doublé par l'enveloppe `mjr.event`). + +## 3 quater. Piles de doublons : gel de ComfyUI et piles « corrompues » + +**Symptôme.** Un clic sur le badge de doublons (icône de copie suivie d'un nombre) gèle tout l'onglet ComfyUI ; certaines piles empilent des images qui n'ont rien à voir entre elles. + +**Cause du gel : une boucle de rendu Vue infinie.** +1. Le template de `VirtualAssetGridHost.vue` lit `asset._mjrDupStack` et `asset._mjrDupCount`, et passe `:ref="getCardRef(asset)"`, qui crée une nouvelle fonction à chaque rendu. Vue rappelle donc les refs à chaque rendu (`null`, puis l'élément). +2. `bindCardRef` appelait `syncRenderedDuplicateCards`, qui remettait `_mjrDupStack` à `false` sur tous les membres puis à `true` sur une carte principale, et assignait un nouveau tableau `_mjrDupMembers`. +3. En parallèle, le `computed` `displayAssets` faisait l'inverse, avec une autre carte principale (`bucket[0]` contre `selectStackRepresentative`). +4. Chaque écriture relançait le rendu du parent, donc les refs, donc de nouvelles écritures. En production, Vue n'a pas de limite de récursion : l'onglet tourne à l'infini. + +La vue « doublons » déclenchait la boucle à coup sûr : elle affiche N cartes de même nom, aussitôt re-regroupées. Un test le reproduit : **31 rendus en 5 passages** avec l'ancien code, contre zéro rendu supplémentaire après correctif. + +**Cause de la « corruption ».** Quatre définitions du doublon coexistaient : +- `AssetCardRenderer` et `displayAssets` : même nom dans le même source / racine / sous-dossier ; +- `useVirtualGrid.dedupeAssetsByKey` et `syncRenderedDuplicateCards` : **nom seul, tous dossiers confondus**. + +Ces deux derniers retiraient de `state.assets` des fichiers distincts d'autres dossiers et les rangeaient sous une mauvaise carte. Celle-ci recevait au passage le temps de génération d'une autre image (`preserveRepresentativeGenerationTime`). + +**Correctif** +- `buildDisplayAssets` est la seule source de vérité. Ses écritures sont gardées (assignation seulement si la valeur brute change, tableau des membres conservé tant que la composition ne change pas), avec une option `collapseDuplicates`. +- `syncRenderedDuplicateCards` ne touche plus l'état réactif. +- Une seule fonction de ref par carte (`getCardRef`). +- `dedupeAssetsByKey` ne retire plus que les vrais doublons (même id ou même clé). +- `AssetCardRenderer.appendAssets` ne retire plus de copies : il ne fait que compter. +- La vue « doublons » (scope `similar`) liste toutes les copies, avec des membres copiés sans cycle (`toDuplicateGroupMembers`). + +**À suivre.** Une pile « même dossier, même nom » correspond à plusieurs lignes en base pour un même fichier. C'est possible avec des index créés par d'anciennes versions, par exemple des variantes de casse sous Windows : les insertions actuelles normalisent le chemin. Une fusion de ces lignes, qui conserverait notes, tags et collections, reste à faire comme opération de maintenance explicite. + +## 3 quinquies. Recherche, fichiers JSON, sidecars et viewers + +### Recherche (FTS5) +Testée sur un vrai index avec des noms piégeux. + +| Requête | Avant | Après | +| --- | --- | --- | +| `at-7` (frappe en cours), `(2)`, `AND`, `NEAR`, `NOT x`, `x` | erreur « Invalid search query syntax » | résultats | +| `"` seul (début d'une phrase) | erreur | tout afficher | +| `портрет`, `猫の写真` | caractères supprimés, donc erreur | recherche dans l'écriture d'origine | + +Cause : `_sanitize_fts_query` retirait les mots-outils, les jetons d'un caractère et les opérateurs, puis tous les caractères non ASCII. Quand il ne restait rien, SQLite recevait un `MATCH ''` invalide. + +Correctif : +- jetons `\w+` dans toutes les écritures ; +- repli sur les termes bruts quand le filtrage vide tout ; +- requête sans caractère de mot traitée comme « tout afficher » ; +- retrait des accents limité au latin, comme `unicode61`. + +Les mots réservés en minuscules sont des mots ordinaires pour FTS5, ses opérateurs n'existant qu'en majuscules. + +### Sidecars JSON +- Avant : uniquement pour la 3D (`.json`). +- Maintenant : pour toutes les images, vidéos et fichiers audio (module `features/metadata/sidecar.py`). On cherche `..json`, puis `.json`. Le fichier peut contenir un workflow UI, un prompt API ou un wrapper `{workflow, prompt}` (valeurs éventuellement sous forme de chaîne JSON), plus `parameters`, `geninfo` et `generation_time_ms`. Taille maximale 10 Mo, BOM accepté. +- Les métadonnées intégrées au fichier restent prioritaires. +- Un JSON sans rapport (des réglages, par exemple) n'est pas pris pour un sidecar. + +Limite connue : un sidecar ajouté **après** l'indexation n'est pris en compte qu'au prochain scan forcé, car la date de modification du média ne change pas. + +### Reconnaissance des JSON de workflows (onglet Workflow) +Vérifié sur un vrai dossier : +- les instantanés `.history//.json` apparaissaient comme workflows ; +- un `settings.json` quelconque apparaissait comme workflow ; +- un workflow avec BOM disparaissait ; +- un prompt API s'affichait avec 0 nœud puis s'ouvrait sur un canvas vide. + +Correctif : +- parcours qui ignore les dossiers et fichiers cachés ; +- `workflow_json_format()` (`ui`, `api` ou rien), qui accepte aussi un workflow vide et les wrappers ; +- lecture en `utf-8-sig` ; +- les JSON invalides sortent de l'index ; +- ouverture côté frontend par `app.loadApiJson` pour le format API ; +- `loadGraphData`, devenu asynchrone, n'a plus de rejet non géré. + +### Viewers +- **Viewer principal** : les médias sont correctement libérés (`destroyMediaProcessorsIn` : pause, retrait de `src`, `load()`), et les écouteurs globaux sont retirés. +- **Viewer flottant** : il ne faisait que mettre en pause avant `replaceChildren()` et `dispose()`. Une `